Friday, June 6, 2025

Compare the mixing ratio of two air parcels

Sometimes it is useful to know whether land air is more or less humid than air from the sea. Here is my Delphi code that allows comparison via the mixing ratio (humidity ratio). 
procedure TForm1.Button1Click(Sender: TObject);
label 1;

var
T1,T2,RH1,RH2,P1,P2,HR1,HR2,psat1,Psat2,Pv1,Pv2,Pa1,Pa2,ma1,ma2,
mv1,mv2,HR1c,HR2c,Tk1,Tk2,D1,D2:extended;

errors1:boolean;
calcstr1,calcstr2,calcstr3,calcstr4,calcstr5,calcstr6,
calcstr7:string[30];

begin
errors1:=false;
form1.hide;
form1.show;
form1.memo1.SelectAll;
form1.memo1.clearselection;
try
T1:=strtofloat(form1.edit1.text);
RH1:=strtofloat(form1.edit2.text);
P1:=strtofloat(form1.edit3.text);
T2:=strtofloat(form1.edit4.text);
RH2:=strtofloat(form1.edit5.text);
P2:=strtofloat(form1.edit6.text);
except errors1:=true;
end;
if (errors1=true) or
 (t1<0.01) or (T1>80) or (rh1<1) or (rh1>100) or (P1<30) or (p1>140)
  or (T2<0.01) or (T2>80) or (P2<30) or (P2>140)
 then begin
 form1.memo1.lines.add('Check Entries');
 goto 1
 end;

Psat1:=0.61121*exp((18.678-(T1/234.5))*(T1/(257.14+T1)));
Pv1:=Psat1*(Rh1/100);
Pa1:=P1-Pv1;
HR1:=0.62185*Pv1/Pa1;
Tk1:=T1+273.15;
ma1:=Pa1*1/(0.287*Tk1);
mv1:=Pv1*1/(0.4615*Tk1);
HR1c:=mv1/ma1;
D1:=(ma1+mv1)/1;
Psat2:=0.61121*exp((18.678-(T2/234.5))*(T2/(257.14+T2)));
Pv2:=Psat2*(Rh2/100);
Pa2:=P2-Pv2;
HR2:=0.62185*Pv2/Pa2;
Tk2:=T2+273.15;
ma2:=Pa2*1/(0.287*Tk2);
mv2:=Pv2*1/(0.4615*Tk2);
HR2c:=mv2/ma2;
D2:=(ma2+mv2)/1;
str(HR1:15:5,calcstr1);
 form1.memo1.lines.add('Humidity ratio HR1 = '+calcstr1+' kg/kg');
str(HR2:15:5,calcstr2);
 form1.memo1.lines.add('Humidity ratio HR2 = '+calcstr2+' kg/kg');
 str(D1:15:3,calcstr3);
 form1.memo1.lines.add('Density D1 = '+calcstr3+' kg per cubic m');
str(D2:15:3,calcstr4);
 form1.memo1.lines.add('Density D2 = '+calcstr4+' kg per cubic m');
 str(HR1c:15:5,calcstr5);
 form1.memo1.lines.add('Check Humidity ratio HR1 = '+calcstr5+' kg/kg');
str(HR2c:15:5,calcstr6);
 form1.memo1.lines.add('Check Humidity ratio HR2 = '+calcstr6+' kg/kg');
 1: end;

Tuesday, May 20, 2025

Evaporative cooling of air

procedure EvapCool;
var
iocode:integer;
ch:char;
Tap1,Tap2,HR1,HR2,T1,T2,RHwb,Twb,Pwb,effc,Pv1,Pv2,Psat1,Psat2,
RH1,RH2,Pa1,Pa2,Tk1,Tk2,P,V,Tw,A1,B1,C1,A2,B2,C2,RHwb1,mwe,mwen,
mwed,ma1,mv1,ma2,mv2,Ad1,Bd1,Cd1,Ad2,Bd2,Cd2,Psatd1,Psatd2,LCL1,
LCL2,eff,D1,d2,mv11,ma11,mv21,ma21,VPD1,VPD2,
Td1,Td2,VPDr,ew,fw,gw,hw,iw,Enth1,Enth2:extended;

begin
repeat
clrscr;
repeat
write('Enter initial T1 in deg C    ');
{$I-}
readln(T1);
{$I+}
iocode:=ioresult;
until (iocode=0) and (T1>0) and (T1<100);
repeat
write('Enter relative humidity RH1%    ');
{$I-}
readln(RH1);
{$I+}
iocode:=ioresult;
until (iocode=0) and (RH1>0) and (RH1<=100);
repeat
write('Enter atmospheric pressure P in kPa    ');
{$I-}
readln(P);
{$I+}
iocode:=ioresult;
until (iocode=0) and (P>50) and (P<=130);
repeat
write('Enter volume of air V in cubic m   ');
{$I-}
readln(V);
{$I+}
iocode:=ioresult;
until (iocode=0) and (V>0);
repeat
write('Enter efficiency of evaporative cooling   ');
{$I-}
readln(eff);
{$I+}
iocode:=ioresult;
until (iocode=0) and (eff>0) and (eff<100);

Pwb:=P/101.325;
RHwb1:=RH1;
RH1:=RH1/100;
Tk1:=T1+273.15;
Psat1:=0.61121*exp((18.678-T1/234.5)*(T1/(257.14+T1)));
Pv1:=Psat1*RH1;
Pa1:=P-Pv1;
ma1:=Pa1*V/(0.287*Tk1);
mv1:=Pv1*V/(0.4615*Tk1);
D1:=(ma1+mv1)/V;
HR1:=mv1/ma1;
Twb:=T1;
repeat
Twb:=Twb-0.001;
ew:=17.502*Twb;
fw:=240.97+Twb;
gw:=ew/fw;
hw:=66.8745*(1+0.00115*Twb);
iw:=6.112*exp(17.502*T1/(240.97+T1));
RHwb:=(611.2*exp(gw)-hw*Pwb*(T1-Twb))/iw;
until (RHwb<=RHwb1);
T2:=T1-(eff/100)*(T1-Twb);
mwen:=ma1*1.006*(T1-T2)+1.88*mv1*(T1-T2);
mwed:=2501.3+1.88*T2;
mwe:=mwen/mwed;
HR2:=(mwe+mv1)/ma1;
Psat2:=0.61121*exp((18.678-T2/234.5)*(T2/(257.14+T2)));
RH2:=HR2*P/((0.62185+HR2)*Psat2);
Pv2:=RH2*Psat2;
Tk2:=T2+273.15;
Pv2:=Psat2*RH2;
Pa2:=P-Pv2;
ma2:=Pa2*V/(0.287*Tk2);
mv2:=Pv2*V/(0.4615*Tk2);
D2:=(mv2+ma2)/V;
ad2:=9.81*(1-D1/D2);
Enth1:=ma1*1.006*T1+mv1*(2501.3+1.88*T1);
Enth2:=ma1*1.006*T2+(mv1+mwe)*(2501.3+1.88*T2);


writeln;
writeln('RESULTS:');
writeln('HR1 = ',HR1:13:5,' kg vapour/kg dry air');
writeln('HR2 = ',HR2:13:5,' kg vapour/kg dry air');
writeln('ma1 = ',ma1:15:5,' kg');
writeln('mv1 = ',mv1:15:5,' kg');
writeln('Initial wet bulb Twb = ',Twb:15:3,' deg C');
writeln('Mass of water evaporated mwe = ',mwe:15:4,' kg');
writeln('Mass of water evaporated = ',mwe/1000:15:6,' tonnes');
writeln('Air cooled to ',T2:15:4,' deg C');
writeln('Final RH = ',RH2*100:15:2,'%');
writeln('Initial density D1 = ',D1:15:4,' kg per cubic m');
writeln('Final density D2 = ',D2:15:4,' kg per cubic m');
writeln('Enth1 = ',enth1:15:3,' kJ, Enth2 = ',enth2:15:3,' kJ');


write('Another Y/N?');
repeat
ch:=readkey
until (ch in ['Y','N','y','n']);
until (ch in ['N','n']);
end;

Tuesday, April 29, 2025

Percentage of oxygen in air

procedure PercO;
var
iocode:integer;
ch,chm:char;
t1,rh1,rh2,pv1,pa1,mv1,ma1,psat1,
a1,b1,c1,tk1,p1,PO2,Perco2:extended;

begin
repeat
clrscr;
repeat
write('Enter air temp T1 deg C    ');
{$I-}
readln(T1);
{$I+}
iocode:=ioresult;
until (iocode=0) and (T1>0) and (T1<100);
repeat
write('Enter relative humidity RH1%    ');
{$I-}
readln(RH1);
{$I+}
iocode:=ioresult;
until (iocode=0) and (RH1>0) and (RH1<=100);
repeat
write('Enter atmospheric pressure P1 in kPa    ');
{$I-}
readln(P1);
{$I+}
iocode:=ioresult;
until (iocode=0) and (P1>20) and (P1<=150);

Tk1:=T1+273.15;
A1:=18.678-T1/234.5;
B1:=T1/(257.14+T1);
C1:=A1*B1;
Psat1:=0.61121*exp(C1);
Pv1:=Psat1*(Rh1/100);
Pa1:=P1-Pv1;
PO2:=Pa1*(21/100);
ma1:=Pa1*1000/(0.287*Tk1);
mv1:=Pv1*1000/(0.4615*Tk1);
PercO2:=100*(PO2/P1);
writeln;
writeln('Percentage of oxygen in air by volume is: ',PercO2:12:3,'%');
writeln('Mass of water vapour per 1000 cubic m of air is:',mv1:12:3,' kg');
writeln('Mass of dry air per 1000 cubic m of air is: ',ma1:12:3,' kg');
writeln;
write('Another Y/N?');
repeat
ch:=readkey
until (ch in ['Y','N','y','n']);
until (ch in ['N','n']);
end;









Saturday, April 19, 2025

Air density after adding water vapour Turbo Pascal code

procedure RHnew;
var
iocode:integer;
ch,chm:char;
Dens1,dens2,hr1,hr2,t2,t1,rh1,rh2,pv1,pa1,pa2,mv1,mv2,ma1,psat1,psat2,
mf1,mf2,pv2,a1,b1,c1,tk1,tk2,p1,p2,mwa1,a2,b2,c2,v1,v2,ma2,
vpd1,vpd2,v2t,twb1,twb2,rhwb,ew,fw,gw,hw,iw,rhwb1,rhwb2,
pwb1,pwb2:extended;

begin
repeat
clrscr;
repeat
write('Enter air temp T1 deg C    ');
{$I-}
readln(T1);
{$I+}
iocode:=ioresult;
until (iocode=0) and (T1>0) and (T1<100);
repeat
write('Enter RH1 %    ');
{$I-}
readln(RH1);
{$I+}
iocode:=ioresult;
until (iocode=0) and (RH1>0) and (RH1<=100);
repeat
write('Enter atm P1 in kPa    ');
{$I-}
readln(P1);
{$I+}
iocode:=ioresult;
until (iocode=0) and (P1>20) and (P1<=150);
repeat
write('Enter V1 in cubic m     ');
{$I-}
readln(V1);
{$I+}
iocode:=ioresult;
until (iocode=0) and (V1>0);
repeat
write('Enter mass mwa1 of water added in kg     ');
{$I-}
readln(mwa1);
{$I+}
iocode:=ioresult;
until (iocode=0) and (mwa1>=0);
repeat
write('Enter T2 in deg C     ');
{$I-}
readln(T2);
{$I+}
iocode:=ioresult;
until (iocode=0) and (T2>0) and (T2<100);
repeat
write('Enter P2 in kPa     ');
{$I-}
readln(P2);
{$I+}
iocode:=ioresult;
until (iocode=0) and (P2>=20) and (P2<=150);

Tk1:=T1+273.15;
Tk2:=T2+273.15;
A1:=18.678-T1/234.5;
B1:=T1/(257.14+T1);
C1:=A1*B1;
Psat1:=0.61121*exp(C1);
Pv1:=Psat1*(Rh1/100);
Pa1:=P1-Pv1;
mf1:=Pv1/P1;
ma1:=Pa1*V1/(0.287*Tk1);
mv1:=Pv1*V1/(0.4615*Tk1);
VPD1:=Psat1-Pv1;
mv2:=mwa1+mv1;
HR1:=mv1/ma1;
HR2:=mv2/ma1;
A2:=18.678-T2/234.5;
B2:=T2/(257.14+T2);
C2:=A2*B2;
Psat2:=0.61121*exp(C2);
RH2:=HR2*P2/((0.62185+HR2)*Psat2);
Pv2:=Psat2*RH2;
Pa2:=P2-Pv2;
mf2:=Pv2/P2;
ma2:=ma1;
V2:=mv2*(0.4615*Tk2)/Pv2;
V2t:=ma2*(0.287*Tk2)/Pa2;
VPD2:=Psat2-Pv2;
Pwb1:=P1/101.325;
RHwb1:=RH1;
TWB1:=T1;
repeat
Twb1:=Twb1-0.001;
ew:=17.502*Twb1;
fw:=240.97+Twb1;
gw:=ew/fw;
hw:=66.8745*(1.0+0.00115*Twb1);
iw:=6.112*exp(17.502*T1/(240.97+T1));
RHwb:=(611.2*exp(gw)-hw*Pwb1*(T1-Twb1))/iw;
until (RHwb<=RHwb1);

Pwb2:=P2/101.325;
RHwb2:=RH2*100;
Twb2:=T2;
repeat
Twb2:=Twb2-0.001;
ew:=17.502*Twb2;
fw:=240.97+Twb2;
gw:=ew/fw;
hw:=66.8745*(1.0+0.00115*Twb2);
iw:=6.112*exp(17.502*T2/(240.97+T2));
RHwb:=(611.2*exp(gw)-hw*Pwb2*(T2-Twb2))/iw;
until (RHwb<=RHwb2);
dens1:=(ma1+mv1)/V1;
dens2:=(ma2+mv2)/V2;

writeln('ma1 = ',ma1:12:5,' kg');
writeln('mv1 = ',mv1:12:5,' kg');
writeln('mole fraction of water vapour mf1 = ',mf1:12:5,' ');
writeln('VPD1 = ',VPD1:12:5,' kPa');
writeln('mv2 = ',(mv1+mwa1):12:5,' kg');
writeln('mole fraction of water vapour mf2 = ',mf2:12:5,' ');
writeln('VPD2 = ',VPD2:12:5,' kPa');
writeln('RH2 = ',(RH2*100):12:3,'%');
writeln('V2 = ',(V2):15:4,' cubic m');
writeln('V2 test = ',(V2t):15:4,' cubic m');
writeln('Twb1 = ',Twb1:15:4,' deg C');
writeln('Twb2 = ',Twb2:15:4,' deg C');
writeln('Dens1 = ',dens1:15:4,' kg/cubic m,  Dens2 = ',dens2:15:4,' kg/cubic m');
writeln('');
write('Another? Y/N');
repeat
ch:=readkey
until (ch in ['Y','y','N','n']);
until (ch in ['N','n']);
end;

Air density after adding water vapour Delphi Code

procedure TForm1.Button1Click(Sender: TObject);
label 1;

var
hr1,hr2,t2,t1,rh1,rh2,pv1,pa1,pa2,mv1,mv2,ma1,psat1,psat2,
mf1,mf2,pv2,a1,b1,c1,tk1,tk2,p1,p2,mwa1,a2,b2,c2,v1,v2,ma2,
vpd1,vpd2,v2t,twb1,twb2,rhwb,ew,fw,gw,hw,iw,rhwb1,rhwb2,
pwb1,pwb2,dens1,dens2:extended;

errors1:boolean;
calcstr1,calcstr2,calcstr3,calcstr4,calcstr5,calcstr6,calcstr7,calcstr8,calcstr9,
calcstr10,calcstr11,calcstr12,calcstr13,calcstr14:string[30];

begin
errors1:=false;
form1.hide;
form1.show;
form1.memo1.SelectAll;
form1.memo1.clearselection;
try
T1:=strtofloat(form1.edit1.text);
RH1:=strtofloat(form1.edit2.text);
P1:=strtofloat(form1.edit3.text);
V1:=strtofloat(form1.edit4.text);
mwa1:=strtofloat(form1.edit5.text);
T2:=strtofloat(form1.edit6.text);
P2:=strtofloat(form1.edit7.text);
except errors1:=true;
end;
if (errors1=true) or
 (t1<0.01) or (T1>80) or (rh1<1) or (rh1>100) or (P1<30) or (p1>140) or (V1<=0)
or (mwa1<=0) or (T2<0.01) or (T2>80) or (P2<30) or (P2>140)
 then begin
 form1.memo1.lines.add('Check Entries');
 goto 1
 end;
 Tk1:=T1+273.15;
Tk2:=T2+273.15;
A1:=18.678-T1/234.5;
B1:=T1/(257.14+T1);
C1:=A1*B1;
Psat1:=0.61121*exp(C1);
Pv1:=Psat1*(Rh1/100);
Pa1:=P1-Pv1;
mf1:=Pv1/P1;
ma1:=Pa1*V1/(0.287*Tk1);
mv1:=Pv1*V1/(0.4615*Tk1);
VPD1:=Psat1-Pv1;
mv2:=mwa1+mv1;
HR1:=mv1/ma1;
HR2:=mv2/ma1;
A2:=18.678-T2/234.5;
B2:=T2/(257.14+T2);
C2:=A2*B2;
Psat2:=0.61121*exp(C2);
RH2:=HR2*P2/((0.62185+HR2)*Psat2);
Pv2:=Psat2*RH2;
Pa2:=P2-Pv2;
mf2:=Pv2/P2;
ma2:=ma1;
V2:=mv2*(0.4615*Tk2)/Pv2;
V2t:=ma2*(0.287*Tk2)/Pa2;
VPD2:=Psat2-Pv2;
Pwb1:=P1/101.325;
RHwb1:=RH1;
TWB1:=T1;
repeat
Twb1:=Twb1-0.001;
ew:=17.502*Twb1;
fw:=240.97+Twb1;
gw:=ew/fw;
hw:=66.8745*(1.0+0.00115*Twb1);
iw:=6.112*exp(17.502*T1/(240.97+T1));
RHwb:=(611.2*exp(gw)-hw*Pwb1*(T1-Twb1))/iw;
until (RHwb<=RHwb1);

Pwb2:=P2/101.325;
RHwb2:=RH2*100;
Twb2:=T2;
repeat
Twb2:=Twb2-0.001;
ew:=17.502*Twb2;
fw:=240.97+Twb2;
gw:=ew/fw;
hw:=66.8745*(1.0+0.00115*Twb2);
iw:=6.112*exp(17.502*T2/(240.97+T2));
RHwb:=(611.2*exp(gw)-hw*Pwb2*(T2-Twb2))/iw;
until (RHwb<=RHwb2);
dens1:=(ma1+mv1)/V1;
dens2:=(ma1+mv2)/V2;
str(ma1:15:3,calcstr1);
 form1.memo1.lines.add('ma1 is: '+calcstr1+' kg');
str(mv1:15:3,calcstr2);
 form1.memo1.lines.add('mv1 is: '+calcstr2+' kg');
str(mf1:15:3,calcstr3);
 form1.memo1.lines.add('mf1 is: '+calcstr3+' ');
str(VPD1:15:3,calcstr4);
 form1.memo1.lines.add('VPD1 is: '+calcstr4+' kPa');
str(mv2:15:3,calcstr5);
 form1.memo1.lines.add('mv2 is: '+calcstr5+' kg');
str(mf2:15:3,calcstr6);
 form1.memo1.lines.add('mf2 is: '+calcstr6+' ');
str(VPD2:15:3,calcstr7);
 form1.memo1.lines.add('VPD2 is: '+calcstr7+' kPa');
str((RH2*100):15:3,calcstr8);
 form1.memo1.lines.add('RH2 is: '+calcstr8+'%');
str(V2:15:3,calcstr9);
 form1.memo1.lines.add('V2 is: '+calcstr9+' cubic m');
str(V2t:15:3,calcstr10);
 form1.memo1.lines.add('V2t (check on line above) is: '+calcstr10+' cubic m');
str(Twb1:15:3,calcstr11);
 form1.memo1.lines.add('Wet bulb initial Twb1 is: '+calcstr11+' deg C');
str(Twb2:15:3,calcstr12);
 form1.memo1.lines.add('Wet bulb final Twb2 is: '+calcstr12+' deg C');
    str(dens1:15:3,calcstr13);
 form1.memo1.lines.add('Air density Dens1 is: '+calcstr13+' kg/cubic m');
 str(dens2:15:3,calcstr14);
 form1.memo1.lines.add('Air density Dens2 is: '+calcstr14+' kg/cubic m');


 1: end;