File Coverage

blib/lib/Physics/Psychrometry.pm
Criterion Covered Total %
statement 64 65 98.4
branch 4 6 66.6
condition 2 3 66.6
subroutine 17 17 100.0
pod 12 14 85.7
total 99 105 94.2


line stmt bran cond sub pod time code
1             # Psychrometry.pm
2             # Calculate psychrometric measures in moist air
3             package Physics::Psychrometry;
4              
5 1     1   42744 use 5.008007;
  1         6  
  1         62  
6 1     1   8 use strict;
  1         3  
  1         45  
7 1     1   8 use warnings;
  1         7  
  1         1256  
8              
9             require Exporter;
10              
11             our @ISA = qw(Exporter);
12              
13             # Items to export into callers namespace by default. Note: do not export
14             # names by default without a very good reason. Use EXPORT_OK instead.
15             # Do not simply export all your public functions/methods/constants.
16              
17             # This allows declaration use Physics::Psychrometry ':all';
18             # If you do not need this, moving things directly into @EXPORT or @EXPORT_OK
19             # will save memory.
20             our %EXPORT_TAGS = ( 'all' => [ qw(
21            
22             ) ] );
23              
24             our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );
25              
26             our @EXPORT = qw(
27            
28             );
29              
30             our $VERSION = '1.2';
31              
32             # based on http://www.bae.uky.edu/gates/psych/PTM/dbrh2al.c
33             #The dry-bulb temperature (C) =? 24.6
34             #The relative humidity (%) =? 68
35             #The air pressure (kPa) =? 102
36             # e is 2.104209
37             #The dewpoint temperature (C) = 18.324036
38             #The wet-bulb temperature (C) = 20.326262
39             #The humidity ratio = 0.013101
40             #The enthalpy (kJ/kg) = 58.095979
41             #The vapor pressure (kPa) = 2.104209
42             #The degree of saturation (%) = 67.325951
43             #The saturated vapor pressure (kPa) = 3.094426
44             #The specific air volume (m3/kg) = 0.855627
45             #The density of moist air (kg/m^3) = 1.184046
46             #The saturated humidity ratio = 0.019460
47             #The specific humidity (ratio) = 0.012932
48             #The absolute humidity (kg/m3) = 0.015312
49              
50             my $C14 = 6.54;
51             my $C15 = 14.526;
52             my $C16 = 0.7389;
53             my $C17 = 0.09486;
54             my $C18 = 0.4569;
55              
56             sub dbdp2wb
57             {
58 1     1 1 632 my ($db, $dp, $p) = @_;
59              
60 1         2 my $i = 0;
61 1         5 my $e = t2es($dp);
62 1         4 my $w = e2w($e, $p);
63 1         14 my $wb1 = $dp;
64 1         2 my $wb2 = $db;
65 1         4 my $twb = $wb1 + ($wb2 - $wb1) / 2;
66 1   66     11 while ((($wb2 - $wb1) > 0.001) && ($i < 1000))
67             {
68 13         25 my $tw = dbwb2w($db, $twb, $p);
69 13 100       27 if($tw > $w)
70             { # /* overestimate the wetblb temperature */
71 7         6 $wb2 = $twb; # /* the wb should be between wb1,twb */
72 7         33 $twb = $wb1 + ($wb2 - $wb1) / 2;
73             }
74             else
75             { # /* underestimate the wb */
76 6         8 $wb1 = $twb;
77 6         26 $twb = $wb1 + ($wb2 - $wb1) / 2;
78             }
79             }
80 1         2 my $wb = $twb;
81 1         4 return $wb;
82             }
83              
84             sub dbw2h
85             {
86 1     1 1 519 my ($db, $w) = @_;
87 1         7 return 1.006 * $db + $w * (2501.0 + 1.805 * $db);
88             }
89              
90             sub e2w
91             {
92 16     16 1 581 my ($e, $p) = @_;
93            
94 16         33 return 0.62198 * $e / ($p - $e);
95             }
96              
97             sub dbwb2w
98             {
99 13     13 0 15 my ($db, $wb, $p) = @_;
100              
101            
102 13         66 my $estar = t2es($wb);
103 13         24 my $wstar = e2w($estar, $p);
104 13         23 my $t1 = (2501 - 2.381 * $wb) * $wstar -($db - $wb);
105 13         19 my $t2 = 2501 + 1.805 * $db - 4.186 * $wb;
106 13         20 return $t1 / $t2;
107             }
108              
109             sub dbrh2e
110             {
111 1     1 1 11 my ($db, $rh) = @_;
112              
113 1         6 return t2es($db) * $rh;
114             }
115              
116             sub rhws2ds
117             {
118 1     1 1 837 my ($rh, $ws) = @_;
119              
120 1         34 return $rh / (1 + (1 - $rh) * $ws / 0.62198);
121             }
122              
123             sub t2es
124             {
125 16     16 1 555 my ($t) = @_;
126              
127 16         19 $t += 273.15;
128 16 50       30 if($t > 273.15)
129             {
130 16         41 return exp(-5800.2206 / $t + 1.3914993 - .048640239 * $t + (.41764768e-4) * pow($t, 2.0) - (.14452093e-7) * pow($t, 3.0) + 6.5459673 * log($t)) / 1000.0;
131             }
132             else
133             {
134 0         0 return exp(-5674.5359 / $t + 6.3925247 - (.9677843e-2) * $t + (.62215701e-6) * pow($t, 2.0) + (.20747825e-8) * pow($t, 3.0) - (.9484024e-12) * pow($t, 4.0) + 4.1635019 * log($t)) / 1000.0;
135             }
136             }
137              
138             sub e2dp
139             {
140 1     1 1 1075 my ($e) = @_;
141              
142 1         4 my $af = log($e);
143 1         4 my $s1 = pow($af, 2.0);
144 1         4 my $s2 = pow($af, 3.0);
145 1         4 my $s3 = pow($e, 0.1984);
146 1         5 my $t1 = $C14 + $C15 * $af + $C16 * $s1 + $C17 * $s2 + $C18 * $s3;
147 1         3 my $t2 = 6.09 + 12.608 * $af + 0.4959 * $s1;
148 1 50       8 return $t1 > 0 ? $t1 : $t2;
149             }
150              
151             sub pow
152             {
153 35     35 0 40 my ($n, $p) = @_;
154              
155 35         171 return $n ** $p;
156             }
157              
158             sub dbw2v
159             {
160 1     1 1 537 my ($db, $w, $p) = @_;
161              
162 1         3 $db += 273.15;
163 1         6 return (287.055 * $db * ( 1 + 1.6078 * $w)) / ($p * 1000.0);
164             }
165              
166             sub wv2da
167             {
168 1     1 1 605 my ($w, $v) = @_;
169              
170 1         5 return (1 + $w) / $v;
171             }
172              
173             sub es2ws
174             {
175 1     1 1 542 my ($es, $p) = @_;
176              
177 1         3 return e2w($es, $p);
178             }
179              
180             sub w2q
181             {
182 1     1 1 534 my ($w) = @_;
183              
184 1         4 return $w / (1 + $w);
185             }
186              
187             sub wv2X
188             {
189 1     1 1 527 my ($w, $v) = @_;
190              
191 1         4 return $w / $v;
192             }
193              
194             1;
195             __END__