12 #include "inc_openmp.h" 47 real(RP),
intent(out) :: z0m_t(
ia,
ja)
48 real(RP),
intent(out) :: z0h_t(
ia,
ja)
49 real(RP),
intent(out) :: z0e_t(
ia,
ja)
51 real(RP),
intent(in) :: z0m(
ia,
ja)
52 real(RP),
intent(in) :: z0h(
ia,
ja)
53 real(RP),
intent(in) :: z0e(
ia,
ja)
54 real(RP),
intent(in) :: ua (
ia,
ja)
55 real(RP),
intent(in) :: va (
ia,
ja)
56 real(RP),
intent(in) :: z1 (
ia,
ja)
57 real(DP),
intent(in) :: dt
72 private :: roughness_const_setup
73 private :: roughness_const
74 private :: roughness_miller92_setup
75 private :: roughness_moon07_setup
76 private :: roughness_miller92
77 private :: roughness_moon07
83 character(len=H_SHORT),
private :: roughness_type =
'MOON07' 85 real(RP),
private :: roughness_visck = 1.5e-5_rp
86 real(RP),
private :: roughness_ustar_min = 1.0e-3_rp
87 real(RP),
private :: roughness_z0m_min = 1.0e-5_rp
88 real(RP),
private :: roughness_z0h_min = 1.0e-5_rp
89 real(RP),
private :: roughness_z0e_min = 1.0e-5_rp
91 real(RP),
private :: roughness_miller92_cm0 = 1.0e-3_rp
92 real(RP),
private :: roughness_miller92_z0mi = 0.0e-0_rp
93 real(RP),
private :: roughness_miller92_z0mr = 1.8e-2_rp
94 real(RP),
private :: roughness_miller92_z0ms = 1.1e-1_rp
95 real(RP),
private :: roughness_miller92_z0hi = 1.4e-5_rp
96 real(RP),
private :: roughness_miller92_z0hr = 0.0e-0_rp
97 real(RP),
private :: roughness_miller92_z0hs = 4.0e-1_rp
98 real(RP),
private :: roughness_miller92_z0ei = 1.3e-4_rp
99 real(RP),
private :: roughness_miller92_z0er = 0.0e-0_rp
100 real(RP),
private :: roughness_miller92_z0es = 6.2e-1_rp
102 integer,
private :: roughness_moon07_itelim = 10
112 namelist / param_roughness / &
115 roughness_ustar_min, &
124 if(
io_l )
write(
io_fid_log,*)
'++++++ Module[ROUGHNESS] / Categ[COUPLER] / Origin[SCALElib]' 130 if(
io_l )
write(
io_fid_log,*)
'*** Not found namelist. Default used.' 131 elseif( ierr > 0 )
then 132 write(*,*)
'xxx Not appropriate names in namelist PARAM_ROUGHNESS. Check!' 137 select case( roughness_type )
140 call roughness_miller92_setup
143 call roughness_moon07_setup
146 call roughness_const_setup
148 write(*,*)
'xxx invalid sea roughness length scheme (', trim(roughness_type),
'). CHECK!' 156 subroutine roughness_miller92_setup
161 namelist / param_roughness_miller92 / &
162 roughness_miller92_cm0, &
163 roughness_miller92_z0mi, &
164 roughness_miller92_z0mr, &
165 roughness_miller92_z0ms, &
166 roughness_miller92_z0hi, &
167 roughness_miller92_z0hr, &
168 roughness_miller92_z0hs, &
169 roughness_miller92_z0ei, &
170 roughness_miller92_z0er, &
171 roughness_miller92_z0es
176 if(
io_l )
write(
io_fid_log,*)
'*** Scheme for ocean roughness length : Miller (1992)' 180 read(
io_fid_conf,nml=param_roughness_miller92,iostat=ierr)
182 if(
io_l )
write(
io_fid_log,*)
'*** Not found namelist. Default used.' 183 elseif( ierr > 0 )
then 184 write(*,*)
'xxx Not appropriate names in namelist PARAM_ROUGHNESS_MILLER92. Check!' 190 end subroutine roughness_miller92_setup
193 subroutine roughness_moon07_setup
198 namelist / param_roughness_moon07 / &
199 roughness_moon07_itelim
204 if(
io_l )
write(
io_fid_log,*)
'*** Scheme for ocean roughness length : Moon et al. (2007)' 208 read(
io_fid_conf,nml=param_roughness_moon07,iostat=ierr)
210 if(
io_l )
write(
io_fid_log,*)
'*** Not found namelist. Default used.' 211 elseif( ierr > 0 )
then 212 write(*,*)
'xxx Not appropriate names in namelist PARAM_ROUGHNESS_MOON07. Check!' 218 end subroutine roughness_moon07_setup
221 subroutine roughness_const_setup
225 if(
io_l )
write(
io_fid_log,*)
'*** Scheme for ocean roughness length : constant' 228 end subroutine roughness_const_setup
231 subroutine roughness_miller92( &
247 real(RP),
intent(out) :: Z0M_t(
ia,
ja)
248 real(RP),
intent(out) :: Z0H_t(
ia,
ja)
249 real(RP),
intent(out) :: Z0E_t(
ia,
ja)
251 real(RP),
intent(in) :: Z0M(
ia,
ja)
252 real(RP),
intent(in) :: Z0H(
ia,
ja)
253 real(RP),
intent(in) :: Z0E(
ia,
ja)
254 real(RP),
intent(in) :: UA (
ia,
ja)
255 real(RP),
intent(in) :: VA (
ia,
ja)
256 real(RP),
intent(in) :: Z1 (
ia,
ja)
257 real(DP),
intent(in) :: dt
260 real(RP) :: Z0M1(
ia,
ja)
261 real(RP) :: Z0H1(
ia,
ja)
262 real(RP) :: Z0E1(
ia,
ja)
264 real(RP) :: Uabs, Ustar
272 uabs = sqrt( ua(i,j)**2 + va(i,j)**2 )
273 ustar = max( sqrt( roughness_miller92_cm0 ) * uabs, roughness_ustar_min )
275 z0m1(i,j) = max( roughness_miller92_z0mi &
276 + roughness_miller92_z0mr / grav * ustar * ustar &
277 + roughness_miller92_z0ms * roughness_visck / ustar, &
279 z0h1(i,j) = max( roughness_miller92_z0hi &
280 + roughness_miller92_z0hr / grav * ustar * ustar &
281 + roughness_miller92_z0hs * roughness_visck / ustar, &
283 z0e1(i,j) = max( roughness_miller92_z0ei &
284 + roughness_miller92_z0er / grav * ustar * ustar &
285 + roughness_miller92_z0es * roughness_visck / ustar, &
289 z0m_t(i,j) = ( z0m1(i,j) - z0m(i,j) ) / dt
290 z0h_t(i,j) = ( z0h1(i,j) - z0h(i,j) ) / dt
291 z0e_t(i,j) = ( z0e1(i,j) - z0e(i,j) ) / dt
297 end subroutine roughness_miller92
303 subroutine roughness_moon07( &
320 real(RP),
intent(out) :: Z0M_t(
ia,
ja)
321 real(RP),
intent(out) :: Z0H_t(
ia,
ja)
322 real(RP),
intent(out) :: Z0E_t(
ia,
ja)
324 real(RP),
intent(in) :: Z0M(
ia,
ja)
325 real(RP),
intent(in) :: Z0H(
ia,
ja)
326 real(RP),
intent(in) :: Z0E(
ia,
ja)
327 real(RP),
intent(in) :: UA (
ia,
ja)
328 real(RP),
intent(in) :: VA (
ia,
ja)
329 real(RP),
intent(in) :: Z1 (
ia,
ja)
330 real(DP),
intent(in) :: dt
333 real(RP) :: Z0M1(
ia,
ja)
334 real(RP) :: Z0H1(
ia,
ja)
335 real(RP) :: Z0E1(
ia,
ja)
337 real(RP) :: Ustar(
ia,
ja)
338 real(RP) :: Uabs (
ia,
ja)
347 z0m1(i,j) = max( z0m(i,j), roughness_z0m_min )
348 uabs(i,j) = sqrt( ua(i,j)**2 + va(i,j)**2 )
352 do ite = 1, roughness_moon07_itelim
355 ustar(i,j) = max( karman * uabs(i,j) /
log( z1(i,j)/z0m1(i,j) ), roughness_ustar_min )
356 u10m = ustar(i,j) / karman *
log( 10.0_rp/z0m1(i,j) )
358 if ( u10m <= 12.5_rp )
then 359 z0m1(i,j) = max( 0.0185_rp * ustar(i,j)**2 / grav, roughness_z0m_min )
361 z0m1(i,j) = 1.0e-3_rp * ( 0.085_rp * ( -0.56_rp*ustar(i,j)**2 &
362 + 20.255_rp*ustar(i,j) &
363 + 2.458_rp ) - 0.58_rp )
373 z0h1(i,j) = min( 5.5e-5_rp / ( z0m1(i,j) * ustar(i,j) / roughness_visck )**0.6_rp, 1.1e-4_rp )
374 z0e1(i,j) = z0h1(i,j)
381 z0m1(i,j) = max( z0m1(i,j), roughness_z0m_min )
382 z0h1(i,j) = max( z0h1(i,j), roughness_z0h_min )
383 z0e1(i,j) = max( z0e1(i,j), roughness_z0e_min )
386 z0m_t(i,j) = ( z0m1(i,j) - z0m(i,j) ) / dt
387 z0h_t(i,j) = ( z0h1(i,j) - z0h(i,j) ) / dt
388 z0e_t(i,j) = ( z0e1(i,j) - z0e(i,j) ) / dt
393 end subroutine roughness_moon07
396 subroutine roughness_const( &
410 real(RP),
intent(out) :: Z0M_t(
ia,
ja)
411 real(RP),
intent(out) :: Z0H_t(
ia,
ja)
412 real(RP),
intent(out) :: Z0E_t(
ia,
ja)
414 real(RP),
intent(in) :: Z0M(
ia,
ja)
415 real(RP),
intent(in) :: Z0H(
ia,
ja)
416 real(RP),
intent(in) :: Z0E(
ia,
ja)
417 real(RP),
intent(in) :: UA (
ia,
ja)
418 real(RP),
intent(in) :: VA (
ia,
ja)
419 real(RP),
intent(in) :: Z1 (
ia,
ja)
420 real(DP),
intent(in) :: dt
427 end subroutine roughness_const
integer, public is
start point of inner domain: x, local
integer, public je
end point of inner domain: y, local
subroutine, public prc_mpistop
Abort MPI.
logical, public io_l
output log or not? (this process)
subroutine, public roughness_setup
real(rp), parameter, public const_karman
von Karman constant
integer, public ia
of x whole cells (local, with HALO)
real(rp), public const_grav
standard acceleration of gravity [m/s2]
integer, public js
start point of inner domain: y, local
procedure(rl), pointer, public roughness
subroutine, public log(type, message)
integer, public ie
end point of inner domain: x, local
logical, public io_lnml
output log or not? (for namelist, this process)
module Surface roughness length
integer, public io_fid_conf
Config file ID.
integer, public io_fid_log
Log file ID.
integer, public ja
of y whole cells (local, with HALO)