LandscapeDNDC 1.37.0
Loading...
Searching...
No Matches
ld_meteo.h
1
11
12#ifndef LDNDC_SCIENTIFIC_METEO_H_
13#define LDNDC_SCIENTIFIC_METEO_H_
14
15#include "crabmeat-common.h"
16
17#include "math/cbm_math.h"
18#include "utils/cbm_utils.h"
19
20#include "constants/cbm_const.h"
21
22namespace ldndc { namespace meteo
23{
24 inline double CBM_API afgen(
25 const double ABSMIN,
26 const double MIN,
27 const double MAX,
28 const double value)
29 {
30 return std::max( ABSMIN, 1.0 - ( 1.0 / ( MAX - MIN)) * std::max( 0.0, value - MIN));
31 }
32
40 inline double CBM_API svp(
41 double t)
42 {
43 return exp( 54.8781919 - ( 6790.4985 / t) - ( 5.02808 * log( t)));
44 }
45
46 //FIXME polish us!
48 inline double CBM_API LAMBDA(
49 double tak,
50 double dtk)
51 {
52 return ( 3149000.0 - 2370.0 * tak) + (( tak < dtk) ? 334.0 : 0.0);
53 }
54
55
57 inline double CBM_API DESDT(
58 double t,
59 double fl18,
60 double rgc)
61 {
62 return ldndc::meteo::svp( t) * 100.0 * fl18 / ( rgc * t * t);
63 }
64
68 inline double CBM_API DES2DT(
69 double t,
70 double dtk)
71 {
72 //double tcel = t - dtk;
73 //double y = 2. * 1.675 + 6. * 0.01408 * tcel + 12. * 0.0005818 * tcel * tcel;
74 //return y;
75 return cbm::poly2( t - dtk, 2.0 * 1.675, 6.0 * 0.01408, 12.0 * 0.0005818);
76 }
77
78
79 inline double CBM_API Ft_pow(
80 double _base,
81 double _scale,
82 double _temperature)
83 {
84 return pow( _base, ( _temperature - _scale) / _scale);
85 }
86
87
88 inline double CBM_API Ft_oneill(
89 double _t_max,
90 double _t_opt,
91 double _exp,
92 double _temperature)
93 {
94 if ( cbm::flt_equal( _t_opt, _temperature /*d0==d1*/) || ( cbm::flt_equal_zero( _exp /*_exp==0*/)))
95 {
96 return 1.0;
97 }
98 if (( _t_max < _temperature) || cbm::flt_equal( _t_max, _temperature /*d0==0*/))
99 {
100 return 0.0;
101 }
102 if ( cbm::flt_equal( _t_max, _t_opt /*d1==0*/))
103 {
104 return std::numeric_limits< double >::infinity();
105 }
106
107 double d0( _t_max - _temperature);
108 double d1( _t_max - _t_opt);
109
110 return pow( d0 / d1, _exp) * exp( _exp * ( d1 - d0) / d1);
111 }
112
113
114 inline double CBM_API F_weibull(
115 double wfps,
116 double P1,
117 double P2,
118 double P3)
119 {
120 return ( 1.0 - ( P3 / ( 1.0 + exp((wfps - P1) * P2))));
121 }
122
123
124 inline double CBM_API F_surf(
125 double var,
126 double a,
127 double b)
128 {
129 return var / ( var + exp( a - b * var));
130 }
131
132
133 inline double CBM_API Ftemp(
134 double CT,
135 double HA,
136 double HD,
137 double DS,
138 double tempK)
139 {
140 return exp( CT - HA / ( cbm::RGAS * tempK)) / ( 1.0 + exp(( DS * tempK - HD) / ( cbm::RGAS * tempK)));
141 }
142
143
144 inline double CBM_API Three_Point_Effect(
145 double T,
146 double Topt,
147 double Thigh,
148 double Tlow)
149 {
150 if (( T > Tlow) && ( T < Thigh))
151 {
152 double l(Topt - Tlow);
153 double h(Thigh - Topt);
154
155 return ( (( T - Tlow) / l) * pow((( Thigh - T) / h), h / l));
156 }
157 else
158 {
159 return 0.0;
160 }
161 }
162
163
164 inline double CBM_API Ft_q10(
165 float T,
166 float Topt,
167 float Tmax,
168 float q10)
169 {
170 if (( T < 0.0) || ( T > Tmax))
171 {
172 return 0.0;
173 }
174 else
175 {
176 double wt( log( q10) * ( Tmax - Topt));
177 double f( 1.0 + pow(( 1.0 + 40.0 / wt), 0.5));
178 //double f( 1.0 + 40.0 / wt);
179 double xt( wt * wt * f * f / 400.0);
180 //double xt( sqrt( f));
181 // xt = wt * wt * ( 1.0 + xt + xt + f) / 400.0;
182 double vt(( Tmax - T) / ( Tmax - Topt));
183 return pow( vt, xt) * exp ( xt * ( 1.0 - vt));
184 }
185 }
186
187
188 inline double CBM_API relativeImpact(
189 double v,
190 double vSat)
191 {
192 if ( v > 0.5*vSat)
193 {
194 return 1.0 - 2.0 * cbm::sqr((v - vSat) / vSat);
195 }
196 else
197 {
198 return 2.0 * cbm::sqr( v / vSat);
199 }
200 }
201
209 double
210 CBM_API stefan_boltzmann(
211 double /* temperature (oC) */);
212
223 double CBM_API thornton97(
224 double,
225 double);
226
246 double CBM_API latitude_rad(
247 double,
248 unsigned int * = NULL,
249 unsigned int * = NULL,
250 unsigned int * = NULL);
251
256 double CBM_API latitude_rad2(
257 double);
258
268 double CBM_API sun_declination(
269 double,
270 unsigned int);
271
281 double CBM_API sun_declination2(
282 unsigned int,
283 unsigned int);
284
306 double CBM_API solar_elevation_sinus(
307 double,
308 unsigned int,
309 unsigned int = invalid_uint, unsigned int = invalid_uint);
310
321 double CBM_API eccentricity(
322 unsigned int, unsigned int);
323
336 double CBM_API daily_solar_radiation(
337 double,
338 unsigned int, unsigned int);
339
350 double CBM_API subdaily_solar_radiation_fraction(
351 double);
352
365 double CBM_API daily_solar_radiation_fraction(
366 double, double);
367
378 double CBM_API daylength(
379 double,
380 unsigned int);
381
392 double CBM_API daylength_period(
393 double,
394 unsigned int);
395
396
407 void CBM_API vps(
408 double, double *, double *_slope=NULL);
409
410
423 double CBM_API annual_average_temperature(
424 double, double);
425
426 double CBM_API longwave_radiation(
427 double _clouds,
428 double _temp,
429 double _vp);
430
431 double CBM_API radiation_emissivity_clear_sky(
432 double _vp /* vapour pressure */);
433
434 double CBM_API cloud_fraction_angstrom(
435 int _doy,
436 int _nd_doy,
437 double _lat,
438 double _rad_short_day);
439} /* namespace meteo */
440} /* namespace ldndc */
441
442
443#endif /* !LDNDC_SCIENTIFIC_METEO_H_ */
444
Spatially explicit groundwater model.
Definition airchemistryput.h:15