ibpsa / modelica-ibpsa

Modelica library for building and district energy systems developed within IBPSA Project 1
https://ibpsa.github.io/project1
142 stars 84 forks source link

Enthalpy of evaporation of water #474

Closed Mathadon closed 8 years ago

Mathadon commented 8 years ago

In Annex60.Utilities.Psychrometrics.Constants we currently have

constant Modelica.SIunits.SpecificEnthalpy h_fg = 2501014.5
    "Enthalpy of evaporator of water";

which seems to be inconsistent with the often quoted enthalpy of evaporation of 2260 kJ/kg. Is this correct?

Edit: h_fg = 2501 kJ/kg is the enthalpy of evaporation at 100 degrees C. The specific enthalpy of saturated steam is 2257 kJ/kg. This is based on http://www.engineeringtoolbox.com/steam-vapor-enthalpy-d_160.html . So I think the value of h_fg is correct? However, the example below then still gives different results. Is there possibly an error in the implementation of Annex60.Utilities.Psychrometrics.TWetBul_TDryBulPhi?

Mathadon commented 8 years ago

When changing the value for h_fg then Annex60.Utilities.Psychrometrics.Examples.TWetBul_TDryBulPhi produces results that are more in line with computations for the wet bulb temperature that I found on line: http://www.srh.noaa.gov/epz/?n=wxcalc_rh https://www.easycalculation.com/weather/dewpoint-wetbulb-calculator.php

for T=283.15 and RH=50% I find wet bulb temperatures:

however, an error still seems to remain?

mwetter commented 8 years ago

@Mathadon Recknagel, Sprenger, Schramek, 2006, lists specific enthalpy of vaporization as

2501.6 kJ/kg at 0 degC
2256.9 kJ/kg at 100 degC

As we use reference_T = 273.15, it makes sense to use the value of 2501014.5 which is at 0 degC. This is also consistent with what the MSL uses in Modelica.Media.Air.MoistAir.

Mathadon commented 8 years ago

Okay! I'm still unsure about the deviating results however. I re-derived the energy balance equation in Annex60.Utilities.Psychrometrics.TWetBul_TDryBulPhi

where I found

TWetBul * ((1-XiDryBul) * Annex60.Utilities.Psychrometrics.Constants.cpAir +
              (1-XiDryBul)*XiSat/(1-XiSat) * Annex60.Utilities.Psychrometrics.Constants.cpSte +
              (XiDryBul-(1-XiDryBul)*XiSat/(1-XiSat)) * Annex60.Utilities.Psychrometrics.Constants.cpWatLiq)
    =
    TDryBul * ((1-XiDryBul) * Annex60.Utilities.Psychrometrics.Constants.cpAir +
              XiDryBul * Annex60.Utilities.Psychrometrics.Constants.cpSte)  +
    (XiDryBul-(1-XiDryBul)*XiSat/(1-XiSat)) * Annex60.Utilities.Psychrometrics.Constants.h_fg;

instead of

    TWetBul = (TDryBul * ((1-XiDryBul) *
               Buildings.Utilities.Psychrometrics.Constants.cpAir + XiDryBul *
               Buildings.Utilities.Psychrometrics.Constants.cpSte) + (XiDryBul-XiSat) *
               Buildings.Utilities.Psychrometrics.Constants.h_fg)/
            ( (1-XiSat)*Buildings.Utilities.Psychrometrics.Constants.cpAir + XiSat *
            Buildings.Utilities.Psychrometrics.Constants.cpSte);

the difference is that I added a term with Annex60.Utilities.Psychrometrics.Constants.cpWatLiq and I 'rescaled' XiSat into (1-XiDryBul)*XiSat/(1-XiSat). I think this is necessary since the Modelica convention is that Xi equals that water mass fraction compared to the total amount of mass.

The reasoning for the rescaling is as follows: Consider a 'wet bulb channel' around a wet bulb temperature sensor where moist air enters, which is then saturated and then leaves the channel. The amount of air entering the 'wet bulb channel' equals

m_air_dry_in = (1-XiDryBul)*m_in_tot.

Since the amount of dry air entering the channel equals the amount of dry air leaving the channel, we have

m_air_dry_in=(1-XiDryBul)*m_in_tot=m_air_dry_out = m_out_tot*(1-XiSat)

or

m_out_tot = (1-XiDryBul)/(1-XiSat)*m_in_tot

the amount of water leaving the channel is then

XiSat*m_out_tot = XiSat*(1-XiDryBul)/(1-XiSat)*m_in_tot

The reasoning for the term with cpWatLiq is that when making the energy balance, we should equate all enthalpy streams entering the system with the enthalpy streams leaving the system. The sensible heat of the water stream is one of these streams and it seems to be missing?

This results in quite a different result for Annex60.Utilities.Psychrometrics.Examples.TWetBul_TDryBulPhi, but it still seems wrong when comparing with the on line calculators: screen shot 2016-05-24 at 10 45 38

the question is of course if the online calculators are correct.. Do you have a solid source that provides numerical values we can compare with? A reference for the current implementation would also be nice, then I can have a look at it.

Mathadon commented 8 years ago

I found a mistake in my code. I forgot to take into account that we have a reference temperature of 273.15 K, so the code should be:

    (TWetBul-273.15) * ((1-XiDryBul) * Annex60.Utilities.Psychrometrics.Constants.cpAir +
              (1-XiDryBul)*XiSat/(1-XiSat) * Annex60.Utilities.Psychrometrics.Constants.cpSte +
              (XiDryBul-(1-XiDryBul)*XiSat/(1-XiSat)) * Annex60.Utilities.Psychrometrics.Constants.cpWatLiq)
    =
    (TDryBul-273.15) * ((1-XiDryBul) * Annex60.Utilities.Psychrometrics.Constants.cpAir +
              XiDryBul * Annex60.Utilities.Psychrometrics.Constants.cpSte)  +
    (XiDryBul-(1-XiDryBul)*XiSat/(1-XiSat)) * Annex60.Utilities.Psychrometrics.Constants.h_fg;

the wet bulb temperature for Tdry = 10 C and 50% RH is now 278.686, which is not equal to 278.85.

However, based on the data in source (https://books.google.be/books?id=gniJE5lK0YAC&pg=PA233&lpg=PA233&dq=wet+bulb+dry+bulb+temperature+table&source=bl&ots=Bj2tyGoTUX&sig=Nhktcz_ydwD1Cd_f-GDY6jnVpLE&hl=nl&sa=X&ved=0ahUKEwjpz4Sd0fLMAhXLKsAKHUX9Awk4ChDoAQhQMAc#v=onepage&q=wet%20bulb%20dry%20bulb%20temperature%20table&f=false) I do get correct results for triplets (Tdry, Twet, RH): (29.4C, 21.1C, 48%) and (23.3C, 16.5C, 50%) from examples 17.1 and 17.2. So the new implementation seems to be correct whereas the on line calculators seem to be off.

I'll make a pull request for the new implementation and update the unit tests and documentation.