53 real(RP),
intent(out) :: Ustar
54 real(RP),
intent(out) :: Tstar
55 real(RP),
intent(out) :: Qstar
56 real(RP),
intent(out) :: Uabs
57 real(RP),
intent(out) :: FracU10
58 real(RP),
intent(out) :: FracT2
59 real(RP),
intent(out) :: FracQ2
61 real(RP),
intent(in) :: T1
62 real(RP),
intent(in) :: T0
63 real(RP),
intent(in) :: P1
64 real(RP),
intent(in) :: P0
65 real(RP),
intent(in) :: Q1
66 real(RP),
intent(in) :: Q0
67 real(RP),
intent(in) :: U1
68 real(RP),
intent(in) :: V1
69 real(RP),
intent(in) :: Z1
70 real(RP),
intent(in) :: PBL
71 real(RP),
intent(in) :: Z0M
72 real(RP),
intent(in) :: Z0H
73 real(RP),
intent(in) :: Z0E
88 private :: bulkflux_u95
89 private :: bulkflux_b91w01
90 private :: fm_unstable
91 private :: fh_unstable
99 character(len=H_SHORT),
private :: bulkflux_type =
'B91W01' 101 integer,
private :: bulkflux_itr_sa_max = 5
102 integer,
private :: bulkflux_itr_nr_max = 10
104 real(RP),
private :: bulkflux_err_min = 1.0e-3_rp
106 real(RP),
private :: bulkflux_wscf
109 real(RP),
private :: bulkflux_uabs_min = 1.0e-2_rp
110 real(RP),
private :: bulkflux_wstar_min = 1.0e-4_rp
121 real(RP),
intent(in) :: dx
123 namelist / param_bulkflux / &
125 bulkflux_itr_sa_max, &
126 bulkflux_itr_nr_max, &
136 if(
io_l )
write(
io_fid_log,*)
'++++++ Module[BULKFLUX] / Categ[COUPLER] / Origin[SCALElib]' 140 bulkflux_wscf = 1.2_rp * min(dx*1.e-3_rp, 1.0_rp)
148 if(
io_l )
write(
io_fid_log,*)
'*** Not found namelist. Default used.' 149 elseif( ierr > 0 )
then 150 write(*,*)
'xxx Not appropriate names in namelist PARAM_BULKFLUX. Check!' 156 if(
io_l )
write(
io_fid_log,*)
'*** Scheme for surface bulk flux : ', trim(bulkflux_type)
157 select case(bulkflux_type)
162 if(
io_l )
write(
io_fid_log,*)
'*** => Beljaars (1991) and Wilson (2001)' 165 write(*,*)
'xxx Unsupported BULKFLUX_type. STOP' 175 subroutine bulkflux_u95( &
205 real(RP),
parameter :: tprn = 0.74_rp
206 real(RP),
parameter :: lfb = 9.4_rp
207 real(RP),
parameter :: lfbp = 4.7_rp
208 real(RP),
parameter :: lfdm = 7.4_rp
209 real(RP),
parameter :: lfdh = 5.3_rp
212 real(RP),
intent(out) :: ustar
213 real(RP),
intent(out) :: tstar
214 real(RP),
intent(out) :: qstar
215 real(RP),
intent(out) :: uabs
216 real(RP),
intent(out) :: fracu10
217 real(RP),
intent(out) :: fract2
218 real(RP),
intent(out) :: fracq2
220 real(RP),
intent(in) :: t1
221 real(RP),
intent(in) :: t0
222 real(RP),
intent(in) :: p1
223 real(RP),
intent(in) :: p0
224 real(RP),
intent(in) :: q1
225 real(RP),
intent(in) :: q0
226 real(RP),
intent(in) :: u1
227 real(RP),
intent(in) :: v1
228 real(RP),
intent(in) :: z1
229 real(RP),
intent(in) :: pbl
230 real(RP),
intent(in) :: z0m
231 real(RP),
intent(in) :: z0h
232 real(RP),
intent(in) :: z0e
235 real(RP) :: rib0, rib
236 real(RP) :: c0z1, c010, c002
237 real(RP) :: cmz1, chz1, cqz1, fmz1, fhz1, t0thz1, q0qez1
238 real(RP) :: cm10, fm10
239 real(RP) :: cm02, ch02, cq02, fm02, fh02, t0th02, q0qe02
241 real(RP) :: logz1z0m, log10z0m, log02z0m
242 real(RP) :: logz0mz0e
243 real(RP) :: logz0mz0h
246 logz1z0m = log( z1 / z0m )
247 log10z0m = log( 10.0_rp / z0m )
248 log02z0m = log( 2.0_rp / z0m )
250 logz0mz0e = max( log( z0m/z0e ), 1.0_rp )
251 logz0mz0h = max( log( z0m/z0h ), 1.0_rp )
253 uabs = max( sqrt( u1**2 + v1**2 ), bulkflux_uabs_min )
254 th1 = t1 * ( pre00 / p1 )**( rdry / cpdry )
255 th0 = t0 * ( pre00 / p0 )**( rdry / cpdry )
258 rib0 = grav * z1 * ( th1 - th0 ) / ( th1 * uabs**2 )
260 c0z1 = ( karman / logz1z0m )**2
261 c010 = ( karman / log10z0m )**2
262 c002 = ( karman / log02z0m )**2
266 if( rib0 > 0.0_rp )
then 268 fmz1 = 1.0_rp / ( 1.0_rp + lfbp * rib )**2
269 fhz1 = 1.0_rp / ( 1.0_rp + lfbp * rib )**2
270 fm10 = 1.0_rp / ( 1.0_rp + lfbp * rib )**2
271 fm02 = 1.0_rp / ( 1.0_rp + lfbp * rib )**2
272 fh02 = 1.0_rp / ( 1.0_rp + lfbp * rib )**2
275 fmz1 = 1.0_rp - lfb * rib / ( 1.0_rp + lfb * lfdm * c0z1 * sqrt( z1 / z0m ) * sqrt( abs( rib ) ) )
276 fhz1 = 1.0_rp - lfb * rib / ( 1.0_rp + lfb * lfdh * c0z1 * sqrt( z1 / z0m ) * sqrt( abs( rib ) ) )
277 fm10 = 1.0_rp - lfb * rib / ( 1.0_rp + lfb * lfdm * c010 * sqrt( 10.0_rp / z0m ) * sqrt( abs( rib ) ) )
278 fm02 = 1.0_rp - lfb * rib / ( 1.0_rp + lfb * lfdm * c002 * sqrt( 2.0_rp / z0m ) * sqrt( abs( rib ) ) )
279 fh02 = 1.0_rp - lfb * rib / ( 1.0_rp + lfb * lfdh * c002 * sqrt( 2.0_rp / z0m ) * sqrt( abs( rib ) ) )
282 t0thz1 = 1.0_rp / ( 1.0_rp + logz0mz0h / logz1z0m / sqrt( fmz1 ) * fhz1 )
283 q0qez1 = 1.0_rp / ( 1.0_rp + logz0mz0e / logz1z0m / sqrt( fmz1 ) * fhz1 )
284 t0th02 = 1.0_rp / ( 1.0_rp + logz0mz0h / log02z0m / sqrt( fm02 ) * fh02 )
285 q0qe02 = 1.0_rp / ( 1.0_rp + logz0mz0e / log02z0m / sqrt( fm02 ) * fh02 )
289 if( rib0 > 0.0_rp )
then 291 fmz1 = 1.0_rp / ( 1.0_rp + lfbp * rib )**2
292 fhz1 = 1.0_rp / ( 1.0_rp + lfbp * rib )**2
293 fm10 = 1.0_rp / ( 1.0_rp + lfbp * rib )**2
294 fm02 = 1.0_rp / ( 1.0_rp + lfbp * rib )**2
295 fh02 = 1.0_rp / ( 1.0_rp + lfbp * rib )**2
298 fmz1 = 1.0_rp - lfb * rib / ( 1.0_rp + lfb * lfdm * c0z1 * sqrt( z1 / z0m ) * sqrt( abs( rib ) ) )
299 fhz1 = 1.0_rp - lfb * rib / ( 1.0_rp + lfb * lfdh * c0z1 * sqrt( z1 / z0m ) * sqrt( abs( rib ) ) )
300 fm10 = 1.0_rp - lfb * rib / ( 1.0_rp + lfb * lfdm * c010 * sqrt( 10.0_rp / z0m ) * sqrt( abs( rib ) ) )
301 fm02 = 1.0_rp - lfb * rib / ( 1.0_rp + lfb * lfdm * c002 * sqrt( 2.0_rp / z0m ) * sqrt( abs( rib ) ) )
302 fh02 = 1.0_rp - lfb * rib / ( 1.0_rp + lfb * lfdh * c002 * sqrt( 2.0_rp / z0m ) * sqrt( abs( rib ) ) )
305 t0thz1 = 1.0_rp / ( 1.0_rp + logz0mz0h / logz1z0m / sqrt( fmz1 ) * fhz1 )
306 q0qez1 = 1.0_rp / ( 1.0_rp + logz0mz0e / logz1z0m / sqrt( fmz1 ) * fhz1 )
307 t0th02 = 1.0_rp / ( 1.0_rp + logz0mz0h / log02z0m / sqrt( fm02 ) * fh02 )
308 q0qe02 = 1.0_rp / ( 1.0_rp + logz0mz0e / log02z0m / sqrt( fm02 ) * fh02 )
311 chz1 = c0z1 * fhz1 * t0thz1 / tprn
312 cqz1 = c0z1 * fhz1 * q0qez1 / tprn
315 ch02 = c002 * fh02 * t0th02 / tprn
316 cq02 = c002 * fh02 * q0qe02 / tprn
318 ustar = sqrt( cmz1 ) * uabs
319 tstar = chz1 * uabs / ustar * ( th1 - th0 )
320 qstar = cqz1 * uabs / ustar * ( q1 - q0 )
322 fracu10 = sqrt( cmz1 / cm10 )
323 fract2 = chz1 / ch02 * sqrt( cm02 / cmz1 )
324 fracq2 = cqz1 / cq02 * sqrt( cm02 / cmz1 )
327 end subroutine bulkflux_u95
339 subroutine bulkflux_b91w01( &
371 real(DP),
parameter :: dil = 1.0e-6_dp
374 real(RP),
intent(out) :: ustar
375 real(RP),
intent(out) :: tstar
376 real(RP),
intent(out) :: qstar
377 real(RP),
intent(out) :: uabs
378 real(RP),
intent(out) :: fracu10
379 real(RP),
intent(out) :: fract2
380 real(RP),
intent(out) :: fracq2
382 real(RP),
intent(in) :: t1
383 real(RP),
intent(in) :: t0
384 real(RP),
intent(in) :: p1
385 real(RP),
intent(in) :: p0
386 real(RP),
intent(in) :: q1
387 real(RP),
intent(in) :: q0
388 real(RP),
intent(in) :: u1
389 real(RP),
intent(in) :: v1
390 real(RP),
intent(in) :: z1
391 real(RP),
intent(in) :: pbl
392 real(RP),
intent(in) :: z0m
393 real(RP),
intent(in) :: z0h
394 real(RP),
intent(in) :: z0e
404 real(DP) :: wstar, dwstar
406 real(DP) :: uabsus, uabss, uabsc
407 real(DP) :: duabsus, duabss
409 real(DP) :: ustarus, ustars, ustarc
410 real(DP) :: tstarus, tstars, tstarc
411 real(DP) :: qstarus, qstars, qstarc
413 real(DP) :: dustarus, dustars, dustarc
414 real(DP) :: dtstarus, dtstars, dtstarc
415 real(DP) :: dqstarus, dqstars, dqstarc
417 real(DP) :: fracu10us, fracu10s, fracu10c
418 real(DP) :: fract2us, fract2s, fract2c
419 real(DP) :: fracq2us, fracq2s, fracq2c
421 real(DP) :: th1, th0, thm
422 real(DP) :: tv1, tv0, tvm
426 real(DP) :: bflx, dbflx
428 real(DP) :: dp_z1, dp_z0m, dp_z0h, dp_z0e
429 real(DP) :: log_z1ovz0m, log_z1ovz0h, log_z1ovz0e
430 real(DP) :: log_10ovz0m, log_02ovz0h, log_02ovz0e
434 dp_z1 =
real( z1, kind=
dp )
435 dp_z0m =
real( z0m, kind=
dp )
436 dp_z0h =
real( z0h, kind=
dp )
437 dp_z0e =
real( z0e, kind=
dp )
439 uabsc = max( sqrt( u1**2 + v1**2 ), bulkflux_uabs_min )
441 th1 = t1 * ( pre00 / p1 )**( rdry / cpdry )
442 th0 = t0 * ( pre00 / p0 )**( rdry / cpdry )
443 thm = ( th1 + th0 ) * 0.5_rp
444 qm = ( q1 + q0 ) * 0.5_rp
445 tv1 = th1 * ( 1.0_dp + epstvap * q1 )
446 tv0 = th0 * ( 1.0_dp + epstvap * q0 )
447 tvm = ( tv1 + tv0 ) * 0.5_rp
450 log_z1ovz0m = log( dp_z1 / dp_z0m )
451 log_z1ovz0h = log( dp_z1 / dp_z0h )
452 log_z1ovz0e = log( dp_z1 / dp_z0e )
454 log_10ovz0m = log( 10.0_dp / dp_z0m )
455 log_02ovz0h = log( 2.0_dp / dp_z0h )
456 log_02ovz0e = log( 2.0_dp / dp_z0e )
459 rib0 = grav * dp_z1 * ( tv1 - tv0 ) / ( tvm * uabsc**2 )
462 il = rib0 / dp_z1 * log_z1ovz0m**2 / log_z1ovz0h
465 wstar = bulkflux_wstar_min
466 dwstar = bulkflux_wstar_min
469 do n = 1, bulkflux_itr_sa_max
471 uabsus = max( sqrt( u1**2 + v1**2 + (bulkflux_wscf*wstar)**2 ),
real( BULKFLUX_Uabs_min, kind=DP ) )
472 ustarus = karman / ( log_z1ovz0m - fm_unstable(dp_z1,il) + fm_unstable(dp_z0m,il) ) * uabsus
473 tstarus = karman / ( log_z1ovz0h - fh_unstable(dp_z1,il) + fh_unstable(dp_z0h,il) ) * ( th1 - th0 )
474 qstarus = karman / ( log_z1ovz0e - fh_unstable(dp_z1,il) + fh_unstable(dp_z0e,il) ) * ( q1 - q0 )
477 uabss = max( sqrt( u1**2 + v1**2 ), bulkflux_uabs_min )
478 ustars = karman / ( log_z1ovz0m - fm_stable(dp_z1,il) + fm_stable(dp_z0m,il) ) * uabss
479 tstars = karman / ( log_z1ovz0h - fh_stable(dp_z1,il) + fh_stable(dp_z0h,il) ) * ( th1 - th0 )
480 qstars = karman / ( log_z1ovz0e - fh_stable(dp_z1,il) + fh_stable(dp_z0e,il) ) * ( q1 - q0 )
482 sw = 0.5_dp - sign( 0.5_dp, il )
484 ustarc = ( sw ) * ustarus + ( 1.0_dp-sw ) * ustars
485 tstarc = ( sw ) * tstarus + ( 1.0_dp-sw ) * tstars
486 qstarc = ( sw ) * qstarus + ( 1.0_dp-sw ) * qstars
489 bflx = - ustarc * tstarc * ( 1.0_rp + epstvap * qm ) - epstvap * ustarc * qstarc * thm
492 tmp = pbl * grav / t1 * bflx
493 sw = 0.5_dp + sign( 0.5_dp, tmp )
495 wstar = ( tmp * sw )**( 1.0_dp / 3.0_dp )
498 sw = 0.5_dp + sign( 0.5_dp, abs( ustarc ) - eps )
500 ustarc = ( sw ) * ustarc + ( 1.0_dp-sw ) * eps
503 il = - karman * grav * bflx / ( ustarc**3 * thm )
507 do n = 1, bulkflux_itr_nr_max
509 uabsus = max( sqrt( u1**2 + v1**2 + (bulkflux_wscf*wstar)**2 ),
real( BULKFLUX_Uabs_min, kind=DP ) )
510 ustarus = karman / ( log_z1ovz0m - fm_unstable(dp_z1,il) + fm_unstable(dp_z0m,il) ) * uabsus
511 tstarus = karman / ( log_z1ovz0h - fh_unstable(dp_z1,il) + fh_unstable(dp_z0h,il) ) * ( th1 - th0 )
512 qstarus = karman / ( log_z1ovz0e - fh_unstable(dp_z1,il) + fh_unstable(dp_z0e,il) ) * ( q1 - q0 )
515 uabss = max( sqrt( u1**2 + v1**2 ), bulkflux_uabs_min )
516 ustars = karman / ( log_z1ovz0m - fm_stable(dp_z1,il) + fm_stable(dp_z0m,il) ) * uabss
517 tstars = karman / ( log_z1ovz0h - fh_stable(dp_z1,il) + fh_stable(dp_z0h,il) ) * ( th1 - th0 )
518 qstars = karman / ( log_z1ovz0e - fh_stable(dp_z1,il) + fh_stable(dp_z0e,il) ) * ( q1 - q0 )
520 sw = 0.5_dp - sign( 0.5_dp, il )
522 ustarc = ( sw ) * ustarus + ( 1.0_dp-sw ) * ustars
523 tstarc = ( sw ) * tstarus + ( 1.0_dp-sw ) * tstars
524 qstarc = ( sw ) * qstarus + ( 1.0_dp-sw ) * qstars
527 bflx = - ustarc * tstarc * ( 1.0_rp + epstvap * qm ) - epstvap * ustarc * qstarc * thm
530 tmp = pbl * grav / t1 * bflx
531 sw = 0.5_dp + sign( 0.5_dp, tmp )
533 wstar = ( tmp * sw )**( 1.0_dp / 3.0_dp )
536 sw = 0.5_dp + sign( 0.5_dp, abs( ustarc ) - eps )
538 ustarc = ( sw ) * ustarc + ( 1.0_dp-sw ) * eps
541 res = il + karman * grav * bflx / ( ustarc**3 * thm )
544 duabsus = max( sqrt( u1**2 + v1**2 + (bulkflux_wscf*dwstar)**2 ),
real( BULKFLUX_Uabs_min, kind=DP ) )
545 dustarus = karman / ( log_z1ovz0m - fm_unstable(dp_z1,il+dil) + fm_unstable(dp_z0m,il+dil) ) * duabsus
546 dtstarus = karman / ( log_z1ovz0h - fh_unstable(dp_z1,il+dil) + fh_unstable(dp_z0h,il+dil) ) * ( th1 - th0 )
547 dqstarus = karman / ( log_z1ovz0e - fh_unstable(dp_z1,il+dil) + fh_unstable(dp_z0e,il+dil) ) * ( q1 - q0 )
550 duabss = max( sqrt( u1**2 + v1**2 ), bulkflux_uabs_min )
551 dustars = karman / ( log_z1ovz0m - fm_stable(dp_z1,il+dil) + fm_stable(dp_z0m,il+dil) ) * duabss
552 dtstars = karman / ( log_z1ovz0h - fh_stable(dp_z1,il+dil) + fh_stable(dp_z0h,il+dil) ) * ( th1 - th0 )
553 dqstars = karman / ( log_z1ovz0e - fh_stable(dp_z1,il+dil) + fh_stable(dp_z0e,il+dil) ) * ( q1 - q0 )
555 sw = 0.5_dp - sign( 0.5_dp, il+dil )
557 dustarc = ( sw ) * dustarus + ( 1.0_dp-sw ) * dustars
558 dtstarc = ( sw ) * dtstarus + ( 1.0_dp-sw ) * dtstars
559 dqstarc = ( sw ) * dqstarus + ( 1.0_dp-sw ) * dqstars
562 dbflx = - dustarc * dtstarc * ( 1.0_rp + epstvap * qm ) - epstvap * dustarc * dqstarc * thm
565 tmp = pbl * grav / t1 * dbflx
566 sw = 0.5_dp + sign( 0.5_dp, tmp )
568 dwstar = ( tmp * sw )**( 1.0_dp / 3.0_dp )
571 sw = 0.5_dp + sign( 0.5_dp, abs( dustarc ) - eps )
573 dustarc = ( sw ) * dustarc + ( 1.0_dp-sw ) * eps
576 dres = 1.0_dp + karman * grav / ( thm * dil ) * ( dbflx / dustarc**3 - bflx / ustarc**3 )
579 if( abs( dres ) < eps )
exit 582 if( abs( res/dres ) < bulkflux_err_min )
exit 585 if( il * ( il - res / dres ) < 0.0_rp )
exit 592 if( .NOT. abs( res/dres ) < bulkflux_err_min )
then 594 uabsus = max( sqrt( u1**2 + v1**2 + (bulkflux_wscf*wstar)**2 ),
real( BULKFLUX_Uabs_min, kind=DP ) )
595 ustarus = karman / ( log_z1ovz0m - fm_unstable(dp_z1,il) + fm_unstable(dp_z0m,il) ) * uabsus
596 tstarus = karman / ( log_z1ovz0h - fh_unstable(dp_z1,il) + fh_unstable(dp_z0h,il) ) * ( th1 - th0 )
597 qstarus = karman / ( log_z1ovz0e - fh_unstable(dp_z1,il) + fh_unstable(dp_z0e,il) ) * ( q1 - q0 )
600 uabss = max( sqrt( u1**2 + v1**2 ), bulkflux_uabs_min )
601 ustars = karman / ( log_z1ovz0m - fm_stable(dp_z1,il) + fm_stable(dp_z0m,il) ) * uabss
602 tstars = karman / ( log_z1ovz0h - fh_stable(dp_z1,il) + fh_stable(dp_z0h,il) ) * ( th1 - th0 )
603 qstars = karman / ( log_z1ovz0e - fh_stable(dp_z1,il) + fh_stable(dp_z0e,il) ) * ( q1 - q0 )
605 sw = 0.5_dp - sign( 0.5_dp, il )
607 ustarc = ( sw ) * ustarus + ( 1.0_dp-sw ) * ustars
608 tstarc = ( sw ) * tstarus + ( 1.0_dp-sw ) * tstars
609 qstarc = ( sw ) * qstarus + ( 1.0_dp-sw ) * qstars
612 bflx = - ustarc * tstarc * ( 1.0_rp + epstvap * qm ) - epstvap * ustarc * qstarc * thm
615 tmp = pbl * grav / t1 * bflx
616 sw = 0.5_dp + sign( 0.5_dp, tmp )
618 wstar = ( tmp * sw )**( 1.0_dp / 3.0_dp )
621 sw = 0.5_dp + sign( 0.5_dp, abs( ustarc ) - eps )
623 ustarc = ( sw ) * ustarc + ( 1.0_dp-sw ) * eps
626 il = - karman * grav * bflx / ( ustarc**3 * thm )
632 uabsus = max( sqrt( u1**2 + v1**2 + (bulkflux_wscf*wstar)**2 ),
real( BULKFLUX_Uabs_min, kind=DP ) )
633 ustarus = karman / ( log_z1ovz0m - fm_unstable(dp_z1,il) + fm_unstable(dp_z0m,il) ) * uabsus
634 tstarus = karman / ( log_z1ovz0h - fh_unstable(dp_z1,il) + fh_unstable(dp_z0h,il) ) * ( th1 - th0 )
635 qstarus = karman / ( log_z1ovz0e - fh_unstable(dp_z1,il) + fh_unstable(dp_z0e,il) ) * ( q1 - q0 )
637 fracu10us = ( log_10ovz0m - fm_unstable(10.0_dp,il) + fm_unstable(dp_z0m,il) ) &
638 / ( log_z1ovz0m - fm_unstable( dp_z1,il) + fm_unstable(dp_z0m,il) )
639 fract2us = ( log_02ovz0h - fm_unstable( 2.0_dp,il) + fm_unstable(dp_z0h,il) ) &
640 / ( log_z1ovz0h - fm_unstable( dp_z1,il) + fm_unstable(dp_z0h,il) )
641 fracq2us = ( log_02ovz0e - fm_unstable( 2.0_dp,il) + fm_unstable(dp_z0e,il) ) &
642 / ( log_z1ovz0e - fm_unstable( dp_z1,il) + fm_unstable(dp_z0e,il) )
645 uabss = max( sqrt( u1**2 + v1**2 ), bulkflux_uabs_min )
646 ustars = karman / ( log_z1ovz0m - fm_stable(dp_z1,il) + fm_stable(dp_z0m,il) ) * uabss
647 tstars = karman / ( log_z1ovz0h - fh_stable(dp_z1,il) + fh_stable(dp_z0h,il) ) * ( th1 - th0 )
648 qstars = karman / ( log_z1ovz0e - fh_stable(dp_z1,il) + fh_stable(dp_z0e,il) ) * ( q1 - q0 )
650 fracu10s = ( log_10ovz0m - fm_stable(10.0_dp,il) + fm_stable(dp_z0m,il) ) &
651 / ( log_z1ovz0m - fm_stable( dp_z1,il) + fm_stable(dp_z0m,il) )
652 fract2s = ( log_02ovz0h - fm_stable( 2.0_dp,il) + fm_stable(dp_z0h,il) ) &
653 / ( log_z1ovz0h - fm_stable( dp_z1,il) + fm_stable(dp_z0h,il) )
654 fracq2s = ( log_02ovz0e - fm_stable( 2.0_dp,il) + fm_stable(dp_z0e,il) ) &
655 / ( log_z1ovz0e - fm_stable( dp_z1,il) + fm_stable(dp_z0e,il) )
657 sw = 0.5_dp - sign( 0.5_dp, il )
659 ustarc = ( sw ) * ustarus + ( 1.0_dp-sw ) * ustars
660 tstarc = ( sw ) * tstarus + ( 1.0_dp-sw ) * tstars
661 qstarc = ( sw ) * qstarus + ( 1.0_dp-sw ) * qstars
662 uabsc = ( sw ) * uabsus + ( 1.0_dp-sw ) * uabss
663 fracu10c = ( sw ) * fracu10us + ( 1.0_dp-sw ) * fracu10s
664 fract2c = ( sw ) * fract2us + ( 1.0_dp-sw ) * fract2s
665 fracq2c = ( sw ) * fracq2us + ( 1.0_dp-sw ) * fracq2s
668 ustar =
real( ustarc, kind=
rp )
669 tstar =
real( tstarc, kind=
rp )
670 qstar =
real( qstarc, kind=
rp )
671 uabs =
real( uabsc, kind=
rp )
672 fracu10 =
real( fracu10c, kind=
rp )
673 fract2 =
real( fract2c, kind=
rp )
674 fracq2 =
real( fracq2c, kind=
rp )
677 end subroutine bulkflux_b91w01
681 function fm_unstable( Z, IL )
687 real(DP),
intent(in) :: z
688 real(DP),
intent(in) :: il
691 real(DP) :: fm_unstable
698 r = min( z * il, 0.0_dp )
701 fm_unstable = 3.0_dp * log( ( 1.0_dp + sqrt( 1.0_dp + 3.6_dp * (-r)**(2.0_dp/3.0_dp) ) ) * 0.5_dp )
711 end function fm_unstable
715 function fh_unstable( Z, IL )
719 real(DP),
intent(in) :: z
720 real(DP),
intent(in) :: il
723 real(DP) :: fh_unstable
726 real(DP),
parameter :: pt = 0.95_dp
732 r = min( z * il, 0.0_dp )
735 fh_unstable = 3.0_dp * log( ( 1.0_dp + sqrt( 1.0_dp + 7.9_dp * (-r)**(2.0_dp/3.0_dp) ) ) * 0.5_dp )
736 fh_unstable = pt * fh_unstable + ( 1.0_dp - pt ) * log( z )
745 end function fh_unstable
749 function fm_stable( Z, IL )
753 real(DP),
intent(in) :: z
754 real(DP),
intent(in) :: il
757 real(DP) :: fm_stable
760 real(DP),
parameter :: a = 1.0_dp
761 real(DP),
parameter :: b = 0.667_dp
762 real(DP),
parameter :: c = 5.0_dp
763 real(DP),
parameter :: d = 0.35_dp
769 r = max( z * il, 0.0_dp )
772 #if defined(PGI) || defined(SX) 773 fm_stable = - a*r - b*( r - c/d )*exp( -min( d*r, 1.e+3_rp ) ) - b*c/d
775 fm_stable = - a*r - b*( r - c/d )*exp( -d*r ) - b*c/d
779 end function fm_stable
783 function fh_stable( Z, IL )
787 real(DP),
intent(in) :: z
788 real(DP),
intent(in) :: il
791 real(DP) :: fh_stable
794 real(DP),
parameter :: a = 1.0_dp
795 real(DP),
parameter :: b = 0.667_dp
796 real(DP),
parameter :: c = 5.0_dp
797 real(DP),
parameter :: d = 0.35_dp
803 r = max( z * il, 0.0_dp )
806 #if defined(PGI) || defined(SX) 807 fh_stable = 1.0_dp - ( 1.0_dp + 2.0_dp/3.0_dp * a*r )**1.5_dp - b*( r - c/d )*exp( -min( d*r, 1.e+3_rp ) ) - b*c/d
809 fh_stable = 1.0_dp - ( 1.0_dp + 2.0_dp/3.0_dp * a*r )**1.5_dp - b*( r - c/d )*exp( -d*r ) - b*c/d
813 end function fh_stable
real(rp), public const_cpdry
specific heat (dry air,constant pressure) [J/kg/K]
subroutine, public prc_mpistop
Abort MPI.
logical, public io_l
output log or not? (this process)
real(rp), parameter, public const_karman
von Karman constant
real(rp), public const_rdry
specific gas constant (dry air) [J/kg/K]
logical, public io_nml
output log or not? (for namelist, this process)
real(rp), public const_pre00
pressure reference [Pa]
procedure(bc), pointer, public bulkflux
real(rp), public const_grav
standard acceleration of gravity [m/s2]
real(rp), public const_epstvap
1 / epsilon - 1
real(rp), public const_eps
small number
integer, public io_fid_conf
Config file ID.
subroutine, public bulkflux_setup(dx)
integer, public io_fid_log
Log file ID.
integer, parameter, public rp
integer, parameter, public dp
integer, public io_fid_nml
Log file ID (only for output namelist)