50 real(RP),
intent(out) :: ustar
51 real(RP),
intent(out) :: tstar
52 real(RP),
intent(out) :: qstar
53 real(RP),
intent(out) :: uabs
55 real(RP),
intent(in) :: t1
56 real(RP),
intent(in) :: t0
57 real(RP),
intent(in) :: p1
58 real(RP),
intent(in) :: p0
59 real(RP),
intent(in) :: q1
60 real(RP),
intent(in) :: q0
61 real(RP),
intent(in) :: u1
62 real(RP),
intent(in) :: v1
63 real(RP),
intent(in) :: z1
64 real(RP),
intent(in) :: pbl
65 real(RP),
intent(in) :: z0m
66 real(RP),
intent(in) :: z0h
67 real(RP),
intent(in) :: z0e
82 private :: bulkflux_u95
83 private :: bulkflux_b91w01
84 private :: fm_unstable
85 private :: fh_unstable
93 character(len=H_SHORT),
private :: bulkflux_type =
'B91W01' 95 integer,
private :: bulkflux_itr_max = 100
97 real(RP),
private :: bulkflux_res_min = 1.0e+0_rp
98 real(RP),
private :: bulkflux_err_min = 1.0e-2_rp
100 real(RP),
private :: bulkflux_wscf = 1.2_rp
103 real(RP),
private :: bulkflux_uabs_min = 1.0e-2_rp
104 real(RP),
private :: bulkflux_rib_min = 1.0e-4_rp
105 real(RP),
private :: bulkflux_wstar_min = 1.0e-4_rp
117 namelist / param_bulkflux / &
131 if(
io_l )
write(
io_fid_log,*)
'++++++ Module[BULKFLUX] / Categ[COUPLER] / Origin[SCALElib]' 138 if(
io_l )
write(
io_fid_log,*)
'*** Not found namelist. Default used.' 139 elseif( ierr > 0 )
then 140 write(*,*)
'xxx Not appropriate names in namelist PARAM_BULKFLUX. Check!' 145 select case( bulkflux_type )
147 if(
io_l )
write(
io_fid_log,*)
'*** Scheme for surface bulk flux : Uno et al.(1995)' 150 if(
io_l )
write(
io_fid_log,*)
'*** Scheme for surface bulk flux : Beljaars (1991) and Wilson (2001)' 153 write(*,*)
' xxx Unsupported TYPE. STOP' 163 subroutine bulkflux_u95( &
190 real(RP),
parameter :: tPrn = 0.74_rp
191 real(RP),
parameter :: LFb = 9.4_rp
192 real(RP),
parameter :: LFbp = 4.7_rp
193 real(RP),
parameter :: LFdm = 7.4_rp
194 real(RP),
parameter :: LFdh = 5.3_rp
197 real(RP),
intent(out) :: Ustar
198 real(RP),
intent(out) :: Tstar
199 real(RP),
intent(out) :: Qstar
200 real(RP),
intent(out) :: Uabs
202 real(RP),
intent(in) :: T1
203 real(RP),
intent(in) :: T0
204 real(RP),
intent(in) :: P1
205 real(RP),
intent(in) :: P0
206 real(RP),
intent(in) :: Q1
207 real(RP),
intent(in) :: Q0
208 real(RP),
intent(in) :: U1
209 real(RP),
intent(in) :: V1
210 real(RP),
intent(in) :: Z1
211 real(RP),
intent(in) :: PBL
212 real(RP),
intent(in) :: Z0M
213 real(RP),
intent(in) :: Z0H
214 real(RP),
intent(in) :: Z0E
217 real(RP) :: RiB0, RiB
219 real(RP) :: fm, fh, t0th, q0qe
222 real(RP) :: logZ0MZ0E
223 real(RP) :: logZ0MZ0H
226 logz1z0m =
log( z1/z0m )
227 logz0mz0e = max(
log( z0m/z0e ), 1.0_rp )
228 logz0mz0h = max(
log( z0m/z0h ), 1.0_rp )
230 uabs = max( sqrt( u1**2 + v1**2 ), bulkflux_uabs_min )
231 th1 = t1 * ( pre00 / p1 )**( rdry / cpdry )
232 th0 = t0 * ( pre00 / p0 )**( rdry / cpdry )
234 rib0 = grav * z1 * ( th1 - th0 ) / ( th1 * uabs**2 )
235 if( abs( rib0 ) < bulkflux_rib_min )
then 236 rib0 = sign( bulkflux_rib_min, rib0 )
239 c0 = ( karman / logz1z0m )**2
242 if( rib0 > 0.0_rp )
then 244 fm = 1.0_rp / ( 1.0_rp + lfbp * rib )**2
248 fm = 1.0_rp - lfb * rib / ( 1.0_rp + lfb * lfdm * c0 * sqrt( z1/z0m ) * sqrt( abs( rib ) ) )
249 fh = 1.0_rp - lfb * rib / ( 1.0_rp + lfb * lfdh * c0 * sqrt( z1/z0m ) * sqrt( abs( rib ) ) )
252 t0th = 1.0_rp / ( 1.0_rp + logz0mz0h / logz1z0m / sqrt( fm ) * fh )
253 q0qe = 1.0_rp / ( 1.0_rp + logz0mz0e / logz1z0m / sqrt( fm ) * fh )
256 if( rib0 > 0.0_rp )
then 258 fm = 1.0_rp / ( 1.0_rp + lfbp * rib )**2
262 fm = 1.0_rp - lfb * rib / ( 1.0_rp + lfb * lfdm * c0 * sqrt( z1/z0m ) * sqrt( abs( rib ) ) )
263 fh = 1.0_rp - lfb * rib / ( 1.0_rp + lfb * lfdh * c0 * sqrt( z1/z0m ) * sqrt( abs( rib ) ) )
266 t0th = 1.0_rp / ( 1.0_rp + logz0mz0h / logz1z0m / sqrt( fm ) * fh )
267 q0qe = 1.0_rp / ( 1.0_rp + logz0mz0e / logz1z0m / sqrt( fm ) * fh )
269 ustar = sqrt( c0 * fm ) * uabs
270 tstar = c0 * fh * t0th / tprn * uabs / ustar * ( th1 - th0 )
271 qstar = c0 * fh * q0qe / tprn * uabs / ustar * ( q1 - q0 )
274 end subroutine bulkflux_u95
284 subroutine bulkflux_b91w01( &
312 real(DP),
parameter :: dL = 1.0e-6_dp
314 real(DP),
parameter :: Pt = 0.95_dp
317 real(RP),
intent(out) :: Ustar
318 real(RP),
intent(out) :: Tstar
319 real(RP),
intent(out) :: Qstar
320 real(RP),
intent(out) :: Uabs
322 real(RP),
intent(in) :: T1
323 real(RP),
intent(in) :: T0
324 real(RP),
intent(in) :: P1
325 real(RP),
intent(in) :: P0
326 real(RP),
intent(in) :: Q1
327 real(RP),
intent(in) :: Q0
328 real(RP),
intent(in) :: U1
329 real(RP),
intent(in) :: V1
330 real(RP),
intent(in) :: Z1
331 real(RP),
intent(in) :: PBL
332 real(RP),
intent(in) :: Z0M
333 real(RP),
intent(in) :: Z0H
334 real(RP),
intent(in) :: Z0E
344 real(DP) :: Wstar, dWstar
346 real(DP) :: UabsUS, UabsS, UabsC
347 real(DP) :: dUabsUS, dUabsS
349 real(DP) :: UstarUS, UstarS, UstarC
350 real(DP) :: TstarUS, TstarS, TstarC
351 real(DP) :: QstarUS, QstarS, QstarC
353 real(DP) :: dUstarUS, dUstarS, dUstarC
354 real(DP) :: dTstarUS, dTstarS, dTstarC
355 real(DP) :: dQstarUS, dQstarS, dQstarC
360 real(DP) :: DP_Z1, DP_Z0M, DP_Z0H, DP_Z0E
361 real(DP) :: log_Z1ovZ0M, log_Z1ovZ0H, log_Z1ovZ0E
365 dp_z1 =
real( z1, kind=
dp )
366 dp_z0m =
real( z0m, kind=
dp )
367 dp_z0h =
real( z0h, kind=
dp )
368 dp_z0e =
real( z0e, kind=
dp )
370 uabsc = max( sqrt( u1**2 + v1**2 ), bulkflux_uabs_min )
371 th1 = t1 * ( pre00 / p1 )**( rdry / cpdry )
372 th0 = t0 * ( pre00 / p0 )**( rdry / cpdry )
375 log_z1ovz0m =
log( dp_z1 / dp_z0m )
376 log_z1ovz0h =
log( dp_z1 / dp_z0h )
377 log_z1ovz0e =
log( dp_z1 / dp_z0e )
380 rib0 = grav * dp_z1 * ( th1 - th0 ) / ( th1 * uabsc**2 )
381 if( abs( rib0 ) < bulkflux_rib_min )
then 382 rib0 = sign( bulkflux_rib_min, rib0 )
386 l = dp_z1 / rib0 * log_z1ovz0h / log_z1ovz0m**2
389 wstar = bulkflux_wstar_min
390 dwstar = bulkflux_wstar_min
392 do n = 1, bulkflux_itr_max
394 uabsus = max( sqrt( u1**2 + v1**2 + (bulkflux_wscf*wstar)**2 ), bulkflux_uabs_min )
395 ustarus = karman / ( log_z1ovz0m - fm_unstable(dp_z1,l) + fm_unstable(dp_z0m,l) ) * uabsus
396 tstarus = karman / ( log_z1ovz0h - fh_unstable(dp_z1,l) + fh_unstable(dp_z0h,l) ) / pt * ( th1 - th0 )
397 qstarus = karman / ( log_z1ovz0e - fh_unstable(dp_z1,l) + fh_unstable(dp_z0e,l) ) / pt * ( q1 - q0 )
400 uabss = max( sqrt( u1**2 + v1**2 ), bulkflux_uabs_min )
401 ustars = karman / ( log_z1ovz0m - fm_stable(dp_z1,l) + fm_stable(dp_z0m,l) ) * uabss
402 tstars = karman / ( log_z1ovz0h - fh_stable(dp_z1,l) + fh_stable(dp_z0h,l) ) / pt * ( th1 - th0 )
403 qstars = karman / ( log_z1ovz0e - fh_stable(dp_z1,l) + fh_stable(dp_z0e,l) ) / pt * ( q1 - q0 )
405 sw = 0.5_dp - sign( 0.5_dp, l )
407 uabsc = ( sw ) * uabsus + ( 1.0_dp-sw ) * uabss
408 ustarc = ( sw ) * ustarus + ( 1.0_dp-sw ) * ustars
409 tstarc = ( sw ) * tstarus + ( 1.0_dp-sw ) * tstars
410 qstarc = ( sw ) * qstarus + ( 1.0_dp-sw ) * qstars
413 sw = 0.5_dp + sign( 0.5_dp, abs(tstarc) - eps )
414 tstarc = ( sw ) * tstarc + ( 1.0_dp-sw ) * eps
417 tmp = -pbl * grav / t1 * ustarc * tstarc
418 sw = 0.5_dp + sign( 0.5_dp, tmp )
419 wstar = ( tmp * sw )**( 1.0_dp / 3.0_dp )
422 res = l - ustarc**2 * t1 / ( karman * grav * tstarc )
425 duabsus = max( sqrt( u1**2 + v1**2 + (bulkflux_wscf*dwstar)**2 ), bulkflux_uabs_min )
426 dustarus = karman / ( log_z1ovz0m - fm_unstable(dp_z1,l+dl) + fm_unstable(dp_z0m,l+dl) ) * duabsus
427 dtstarus = karman / ( log_z1ovz0h - fh_unstable(dp_z1,l+dl) + fh_unstable(dp_z0h,l+dl) ) / pt * ( th1 - th0 )
428 dqstarus = karman / ( log_z1ovz0e - fh_unstable(dp_z1,l+dl) + fh_unstable(dp_z0e,l+dl) ) / pt * ( q1 - q0 )
430 duabss = max( sqrt( u1**2 + v1**2 ), bulkflux_uabs_min )
431 dustars = karman / ( log_z1ovz0m - fm_stable(dp_z1,l+dl) + fm_stable(dp_z0m,l+dl) ) * duabss
432 dtstars = karman / ( log_z1ovz0h - fh_stable(dp_z1,l+dl) + fh_stable(dp_z0h,l+dl) ) / pt * ( th1 - th0 )
433 dqstars = karman / ( log_z1ovz0e - fh_stable(dp_z1,l+dl) + fh_stable(dp_z0e,l+dl) ) / pt * ( q1 - q0 )
435 sw = 0.5_dp - sign( 0.5_dp, l+dl )
437 dustarc = ( sw ) * dustarus + ( 1.0_dp-sw ) * dustars
438 dtstarc = ( sw ) * dtstarus + ( 1.0_dp-sw ) * dtstars
439 dqstarc = ( sw ) * dqstarus + ( 1.0_dp-sw ) * dqstars
442 sw = 0.5_dp + sign( 0.5_dp, abs(dtstarc) - eps )
443 dtstarc = ( sw ) * dtstarc + ( 1.0_dp-sw ) * eps
446 tmp = -pbl * grav / t1 * dustarc * dtstarc
447 sw = 0.5_dp + sign( 0.5_dp, tmp )
448 dwstar = ( tmp * sw )**( 1.0_dp / 3.0_dp )
451 dres = 1.0_dp - t1 / ( karman * grav * dl ) * ( dustarc**2 / dtstarc - ustarc**2 / tstarc )
454 if( abs( res ) < bulkflux_res_min .OR. &
455 abs( res/dres ) < bulkflux_err_min )
then 460 if( abs( dres ) < eps )
then 470 ustar =
real( ustarc, kind=
rp )
471 tstar =
real( tstarc, kind=
rp )
472 qstar =
real( qstarc, kind=
rp )
473 uabs =
real( uabsc, kind=
rp )
475 if( n > bulkflux_itr_max )
then 476 if(
io_l )
write(
io_fid_log,
'(A)' )
'Warning: reach maximum iteration in the function of BULKFLUX_B91W01.' 478 if(
io_l )
write(
io_fid_log,
'(A,I32)' )
'DEBUG --- LOOP number [no unit] :', n
479 if(
io_l )
write(
io_fid_log,
'(A,F32.16)')
'DEBUG --- Residual [m] :', res
480 if(
io_l )
write(
io_fid_log,
'(A,F32.16)')
'DEBUG --- delta Residual [m] :', dres
482 if(
io_l )
write(
io_fid_log,
'(A,F32.16)')
'DEBUG --- air tempearature [K] :', t1
483 if(
io_l )
write(
io_fid_log,
'(A,F32.16)')
'DEBUG --- surface temperature [K] :', t0
484 if(
io_l )
write(
io_fid_log,
'(A,F32.16)')
'DEBUG --- pressure [Pa] :', p1
485 if(
io_l )
write(
io_fid_log,
'(A,F32.16)')
'DEBUG --- surface pressure [Pa] :', p0
486 if(
io_l )
write(
io_fid_log,
'(A,F32.16)')
'DEBUG --- water vapor mass ratio [kg/kg] :', q1
487 if(
io_l )
write(
io_fid_log,
'(A,F32.16)')
'DEBUG --- surface water vapor mass ratio [kg/kg] :', q0
488 if(
io_l )
write(
io_fid_log,
'(A,F32.16)')
'DEBUG --- zonal wind [m/s] :', u1
489 if(
io_l )
write(
io_fid_log,
'(A,F32.16)')
'DEBUG --- meridional wind [m/s] :', v1
490 if(
io_l )
write(
io_fid_log,
'(A,F32.16)')
'DEBUG --- cell center height [m] :', z1
491 if(
io_l )
write(
io_fid_log,
'(A,F32.16)')
'DEBUG --- atmospheric mixing layer height [m] :', pbl
492 if(
io_l )
write(
io_fid_log,
'(A,F32.16)')
'DEBUG --- roughness length of momentum [m] :', z0m
493 if(
io_l )
write(
io_fid_log,
'(A,F32.16)')
'DEBUG --- roughness length of heat [m] :', z0h
494 if(
io_l )
write(
io_fid_log,
'(A,F32.16)')
'DEBUG --- roughness length of moisture [m] :', z0e
496 if(
io_l )
write(
io_fid_log,
'(A,F32.16)')
'DEBUG --- friction velocity [m] :', ustar
497 if(
io_l )
write(
io_fid_log,
'(A,F32.16)')
'DEBUG --- friction potential temperature [K] :', tstar
498 if(
io_l )
write(
io_fid_log,
'(A,F32.16)')
'DEBUG --- friction water vapor mass ratio [kg/kg] :', qstar
500 if(
io_l )
write(
io_fid_log,
'(A,F32.16)')
'DEBUG --- Obukhov length [m] :', l
501 if(
io_l )
write(
io_fid_log,
'(A,F32.16)')
'DEBUG --- bulk Richardson number [no unit] :', rib0
502 if(
io_l )
write(
io_fid_log,
'(A,F32.16)')
'DEBUG --- free convection velocity scale [m/s] :', wstar
506 end subroutine bulkflux_b91w01
510 function fm_unstable( Z, L )
516 real(DP),
intent(in) :: z
517 real(DP),
intent(in) :: L
520 real(DP) :: fm_unstable
527 r = min( z/l, 0.0_dp )
530 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 )
540 end function fm_unstable
544 function fh_unstable( Z, L )
548 real(DP),
intent(in) :: Z
549 real(DP),
intent(in) :: L
552 real(DP) :: fh_unstable
558 r = min( z/l, 0.0_dp )
561 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 )
570 end function fh_unstable
574 function fm_stable( Z, L )
578 real(DP),
intent(in) :: Z
579 real(DP),
intent(in) :: L
582 real(DP) :: fm_stable
585 real(DP),
parameter :: a = 1.0_dp
586 real(DP),
parameter :: b = 0.667_dp
587 real(DP),
parameter :: c = 5.0_dp
588 real(DP),
parameter :: d = 0.35_dp
594 r = max( z/l, 0.0_dp )
597 fm_stable = - a*r - b*( r - c/d )*exp( -d*r ) - b*c/d
600 end function fm_stable
604 function fh_stable( Z, L )
608 real(DP),
intent(in) :: Z
609 real(DP),
intent(in) :: L
612 real(DP) :: fh_stable
615 real(DP),
parameter :: a = 1.0_dp
616 real(DP),
parameter :: b = 0.667_dp
617 real(DP),
parameter :: c = 5.0_dp
618 real(DP),
parameter :: d = 0.35_dp
624 r = max( z/l, 0.0_dp )
627 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
630 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]
subroutine, public bulkflux_setup
integer, parameter, public dp
real(rp), public const_pre00
pressure reference [Pa]
procedure(bc), pointer, public bulkflux
real(rp), public const_grav
standard acceleration of gravity [m/s2]
subroutine, public log(type, message)
real(rp), public const_eps
small number
logical, public io_lnml
output log or not? (for namelist, this process)
integer, public io_fid_conf
Config file ID.
integer, public io_fid_log
Log file ID.
integer, parameter, public rp