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