21subroutine mo_drag_1d_ &
22 (pt, pt0, z, z0, zt, zq, speed, drag_m, drag_t, drag_q, &
23 u_star, b_star, avail)
25real(kind=fms_mo_kind_),
intent(in) ,
dimension(:) :: pt, pt0, z, z0, zt, zq, speed
26real(kind=fms_mo_kind_),
intent(inout),
dimension(:) :: drag_m, drag_t, drag_q, u_star, b_star
27logical,
intent(in),
optional,
dimension(:) :: avail
29logical :: lavail, avail_dummy(1)
32integer,
parameter :: max_iter = 20
33integer,
parameter :: lkind = fms_mo_kind_
34real(kind=fms_mo_kind_),
parameter :: error = 1.0e-04_lkind, &
35 zeta_min = 1.0e-06_lkind, &
40if(.not.module_is_initialized)
call error_mesg(
'mo_drag_1d in monin_obukhov_mod', &
41 'monin_obukhov_init has not been called', fatal)
45if(
present(avail)) lavail = .true.
49 if (count(avail) .eq. 0)
return
50 call monin_obukhov_drag_1d(real(grav, fms_mo_kind_), real(vonkarm, fms_mo_kind_), &
51 & error, zeta_min, max_iter, real(small, fms_mo_kind_), neutral, stable_option, &
52 & new_mo_option, real(rich_crit, fms_mo_kind_), real(zeta_trans, fms_mo_kind_), &
53 & real(drag_min_heat, fms_mo_kind_), real(drag_min_moist, fms_mo_kind_), &
54 & real(drag_min_mom, fms_mo_kind_), n, pt, pt0, z, z0, zt, &
55 & zq, speed, drag_m, drag_t, drag_q, u_star, b_star, lavail, avail, ier)
57call monin_obukhov_drag_1d(real(grav, fms_mo_kind_), real(vonkarm, fms_mo_kind_), &
58 & error, zeta_min, max_iter, real(small, fms_mo_kind_), neutral, stable_option, &
59 & new_mo_option, real(rich_crit, fms_mo_kind_), real(zeta_trans, fms_mo_kind_), &
60 & real(drag_min_heat, fms_mo_kind_), real(drag_min_moist, fms_mo_kind_), &
61 & real(drag_min_mom, fms_mo_kind_), n, pt, pt0, z, z0, zt, zq, speed, drag_m, drag_t, &
62 & drag_q, u_star, b_star, lavail, avail_dummy, ier)
65end subroutine mo_drag_1d_
70subroutine mo_profile_1d_(zref, zref_t, z, z0, zt, zq, u_star, b_star, q_star, &
71 del_m, del_t, del_q, avail)
73real(kind=fms_mo_kind_),
intent(in) :: zref, zref_t
74real(kind=fms_mo_kind_),
intent(in) ,
dimension(:) :: z, z0, zt, zq, u_star, b_star, q_star
75real(kind=fms_mo_kind_),
intent(out),
dimension(:) :: del_m, del_t, del_q
76logical,
intent(in) ,
optional,
dimension(:) :: avail
78logical :: dummy_avail(1)
83if(.not.module_is_initialized)
call error_mesg(
'mo_profile_1d in monin_obukhov_mod', &
84 'monin_obukhov_init has not been called', fatal)
87if(
present(avail))
then
89 if (count(avail) .eq. 0)
return
91 call monin_obukhov_profile_1d(real(vonkarm, fms_mo_kind_), &
92 & neutral, stable_option, new_mo_option, real(rich_crit, fms_mo_kind_), &
93 & real(zeta_trans, fms_mo_kind_), n, zref, zref_t, z, z0, zt, zq, u_star, &
94 & b_star, q_star, del_m, del_t, del_q, .true., avail, ier)
98 call monin_obukhov_profile_1d(real(vonkarm, fms_mo_kind_), &
99 & neutral, stable_option, new_mo_option, real(rich_crit, fms_mo_kind_), &
100 & real(zeta_trans, fms_mo_kind_), n, zref, zref_t, z, z0, zt, zq, u_star, &
101 & b_star, q_star, del_m, del_t, del_q, .false., dummy_avail, ier)
105end subroutine mo_profile_1d_
109subroutine stable_mix_3d_(rich, mix)
111real(kind=fms_mo_kind_),
intent(in) ,
dimension(:,:,:) :: rich
112real(kind=fms_mo_kind_),
intent(out),
dimension(:,:,:) :: mix
122 call stable_mix(rich(:, i, j), mix(:, i, j))
126end subroutine stable_mix_3d_
130subroutine mo_diff_2d_n_(z, u_star, b_star, k_m, k_h)
132real(kind=fms_mo_kind_),
intent(in),
dimension(:,:,:) :: z
133real(kind=fms_mo_kind_),
intent(in),
dimension(:,:) :: u_star, b_star
134real(kind=fms_mo_kind_),
intent(out),
dimension(:,:,:) :: k_m, k_h
136integer :: ni, nj, nk, ier
137integer,
parameter :: lkind = fms_mo_kind_
138real(kind=fms_mo_kind_),
parameter :: ustar_min = 1.0e-10_lkind
140if(.not.module_is_initialized)
call error_mesg(
'mo_diff_2d_n in monin_obukhov_mod', &
141 'monin_obukhov_init has not been called', fatal)
143ni =
size(z, 1); nj =
size(z, 2); nk =
size(z, 3)
144call monin_obukhov_diff(real(vonkarm, fms_mo_kind_), ustar_min, neutral, &
145 & stable_option, new_mo_option, real(rich_crit, fms_mo_kind_), &
146 & real(zeta_trans, fms_mo_kind_), ni, nj, nk, z, u_star, b_star, &
149end subroutine mo_diff_2d_n_
155subroutine solve_zeta_(rich, z, z0, zt, zq, f_m, f_t, f_q, mask)
157real(kind=fms_mo_kind_),
intent(in) ,
dimension(:) :: rich, z, z0, zt, zq
158logical,
intent(in) ,
dimension(:) :: mask
159real(kind=fms_mo_kind_),
intent(out),
dimension(:) :: f_m, f_t, f_q
161integer,
parameter :: lkind = fms_mo_kind_
162real(kind=fms_mo_kind_),
parameter :: error = 1.0e-04_lkind
163real(kind=fms_mo_kind_),
parameter :: zeta_min = 1.0e-06_lkind
164integer,
parameter :: max_iter = 20
166real(kind=fms_mo_kind_) :: max_cor
169real(kind=fms_mo_kind_),
dimension(size(rich(:))) :: &
170 d_rich, rich_1, correction, corr, z_z0, z_zt, z_zq, &
171 ln_z_z0, ln_z_zt, ln_z_zq, zeta, &
172 phi_m, phi_m_0, phi_t, phi_t_0, rzeta, &
173 zeta_0, zeta_t, zeta_q, df_m, df_t
175logical,
dimension(size(rich(:))) :: mask_1
190 zeta = rich*ln_z_z0*ln_z_z0/ln_z_zt
195where (mask_1 .and. rich >= 0.0_lkind)
196 zeta = zeta/(1.0_lkind - rich/real(rich_crit, fms_mo_kind_))
199iter_loop:
do iter = 1, max_iter
201 where (mask_1 .and. abs(zeta).lt.zeta_min)
210 rzeta = 1.0_lkind/zeta
220 call mo_derivative_m(phi_m , zeta , mask_1)
221 call mo_derivative_m(phi_m_0, zeta_0, mask_1)
222 call mo_derivative_t(phi_t , zeta , mask_1)
223 call mo_derivative_t(phi_t_0, zeta_t, mask_1)
225 call mo_integral_m(f_m, zeta, zeta_0, ln_z_z0, mask_1)
226 call mo_integral_tq(f_t, f_q, zeta, zeta_t, zeta_q, ln_z_zt, ln_z_zq, mask_1)
229 df_m = (phi_m - phi_m_0)*rzeta
230 df_t = (phi_t - phi_t_0)*rzeta
231 rich_1 = zeta*f_t/(f_m*f_m)
232 d_rich = rich_1*( rzeta + df_t/f_t - 2.0_lkind *df_m/f_m)
233 correction = (rich - rich_1)/d_rich
234 corr = min(abs(correction),abs(correction/zeta))
239 max_cor = maxval(corr)
241 if(max_cor > error)
then
242 mask_1 = mask_1 .and. (corr > error)
245 zeta = zeta + correction
254call error_mesg (
'solve_zeta in monin_obukhov_mod', &
255 'surface drag iteration did not converge', fatal)
257end subroutine solve_zeta_
261subroutine mo_derivative_m_(phi_m, zeta, mask)
265real(kind=fms_mo_kind_),
intent(out),
dimension(:) :: phi_m
266real(kind=fms_mo_kind_),
intent(in),
dimension(:) :: zeta
267logical,
intent(in),
dimension(:) :: mask
269logical,
dimension(size(zeta(:))) :: stable, unstable
270real(kind=fms_mo_kind_),
dimension(size(zeta(:))) :: x
271integer,
parameter :: lkind = fms_mo_kind_
273stable = mask .and. zeta >= 0.0_lkind
274unstable = mask .and. zeta < 0.0_lkind
277 x = (1.0_lkind - 16.0_lkind*zeta )**(-0.5_lkind)
281if(stable_option == 1)
then
284 phi_m = 1.0_lkind + zeta*(5.0_lkind + real(b_stab, fms_mo_kind_) &
285 *zeta)/(1.0_lkind + zeta)
288else if(stable_option == 2)
then
290 where (stable .and. zeta < real(zeta_trans,fms_mo_kind_))
291 phi_m = 1.0_lkind + 5.0_lkind*zeta
293 where (stable .and. zeta >= real(zeta_trans,fms_mo_kind_))
294 phi_m = real(lambda, fms_mo_kind_) + real(b_stab, fms_mo_kind_)*zeta
300end subroutine mo_derivative_m_
304subroutine mo_derivative_t_(phi_t, zeta, mask)
308real(kind=fms_mo_kind_),
intent(out),
dimension(:) :: phi_t
309real(kind=fms_mo_kind_),
intent(in),
dimension(:) :: zeta
310logical ,
intent(in),
dimension(:) :: mask
312logical,
dimension(size(zeta(:))) :: stable, unstable
313integer,
parameter :: lkind = fms_mo_kind_
315stable = mask .and. zeta >= 0.0_lkind
316unstable = mask .and. zeta < 0.0_lkind
319 phi_t = (1.0_lkind - 16.0_lkind*zeta)**(-0.5_lkind)
322if(stable_option == 1)
then
325 phi_t = 1.0_lkind + zeta * (5.0_lkind + real(b_stab, fms_mo_kind_)&
326 * zeta)/(1.0_lkind + zeta)
329else if(stable_option == 2)
then
331 where (stable .and. zeta < real(zeta_trans,fms_mo_kind_))
332 phi_t = 1.0_lkind + 5.0_lkind*zeta
334 where (stable .and. zeta >= real(zeta_trans,fms_mo_kind_))
335 phi_t = real(lambda, fms_mo_kind_) + real(b_stab, fms_mo_kind_)*zeta
341end subroutine mo_derivative_t_
345subroutine mo_integral_tq_ (psi_t, psi_q, zeta, zeta_t, zeta_q, &
346 ln_z_zt, ln_z_zq, mask)
350real(kind=fms_mo_kind_),
intent(out),
dimension(:) :: psi_t, psi_q
351real(kind=fms_mo_kind_),
intent(in),
dimension(:) :: zeta, zeta_t, zeta_q, ln_z_zt, ln_z_zq
352logical ,
intent(in),
dimension(:) :: mask
354real(kind=fms_mo_kind_),
dimension(size(zeta(:))) :: x, x_t, x_q
356logical,
dimension(size(zeta(:))) :: stable, unstable, &
357 weakly_stable, strongly_stable
358integer,
parameter :: lkind = fms_mo_kind_
360stable = mask .and. zeta >= 0.0_lkind
361unstable = mask .and. zeta < 0.0_lkind
365 x = sqrt(1.0_lkind - 16.0_lkind*zeta)
366 x_t = sqrt(1.0_lkind - 16.0_lkind*zeta_t)
367 x_q = sqrt(1.0_lkind - 16.0_lkind*zeta_q)
369 psi_t = ln_z_zt - 2.0_lkind*log( (1.0_lkind + x)/(1.0_lkind + x_t) )
370 psi_q = ln_z_zq - 2.0_lkind*log( (1.0_lkind + x)/(1.0_lkind + x_q) )
374if( stable_option == 1)
then
378 psi_t = ln_z_zt + (5.0_lkind - real(b_stab, fms_mo_kind_)) &
379 *log((1.0_lkind + zeta)/(1.0_lkind + zeta_t)) &
380 + real(b_stab, fms_mo_kind_)*(zeta - zeta_t)
381 psi_q = ln_z_zq + (5.0_lkind - real(b_stab, fms_mo_kind_)) &
382 *log((1.0_lkind + zeta)/(1.0_lkind + zeta_q)) &
383 + real(b_stab, fms_mo_kind_)*(zeta - zeta_q)
387else if (stable_option == 2)
then
389 weakly_stable = stable .and. zeta <= real(zeta_trans,fms_mo_kind_)
390 strongly_stable = stable .and. zeta > real(zeta_trans,fms_mo_kind_)
392 where (weakly_stable)
393 psi_t = ln_z_zt + 5.0_lkind*(zeta - zeta_t)
394 psi_q = ln_z_zq + 5.0_lkind*(zeta - zeta_q)
397 where(strongly_stable)
398 x = (real(lambda, fms_mo_kind_) - 1.0_lkind)*log(zeta/real(zeta_trans, fms_mo_kind_)) + &
399 real(b_stab, FMS_MO_KIND_)*(zeta -
real(zeta_trans, FMS_MO_KIND_))
402 where (strongly_stable .and. zeta_t <= real(zeta_trans,fms_mo_kind_))
403 psi_t = ln_z_zt + x + 5.0_lkind * (real(zeta_trans, fms_mo_kind_) - zeta_t)
406 where (strongly_stable .and. zeta_t > real(zeta_trans,fms_mo_kind_))
407 psi_t = real(lambda, fms_mo_kind_)* ln_z_zt &
408 + real(b_stab, fms_mo_kind_)*(zeta - zeta_t)
411 where (strongly_stable .and. zeta_q <= real(zeta_trans,fms_mo_kind_))
412 psi_q = ln_z_zq + x + 5.0_lkind &
413 *(real(zeta_trans, fms_mo_kind_) - zeta_q)
416 where (strongly_stable .and. zeta_q > real(zeta_trans,fms_mo_kind_))
417 psi_q = real(lambda, fms_mo_kind_)*ln_z_zq + real(b_stab, fms_mo_kind_) &
424end subroutine mo_integral_tq_
428subroutine mo_integral_m_ (psi_m, zeta, zeta_0, ln_z_z0, mask)
432real(kind=fms_mo_kind_),
intent(out),
dimension(:) :: psi_m
433real(kind=fms_mo_kind_),
intent(in),
dimension(:) :: zeta, zeta_0, ln_z_z0
434logical,
intent(in),
dimension(:) :: mask
436real(kind=fms_mo_kind_),
dimension(size(zeta(:))) :: x, x_0, x1, x1_0, num, denom, y
438logical,
dimension(size(zeta(:))) :: stable, unstable, &
439 weakly_stable, strongly_stable
440integer,
parameter :: lkind = fms_mo_kind_
442stable = mask .and. zeta >= 0.0_lkind
443unstable = mask .and. zeta < 0.0_lkind
447 x = sqrt(1.0_lkind - 16.0_lkind*zeta)
448 x_0 = sqrt(1.0_lkind - 16.0_lkind*zeta_0)
454 x1_0 = 1.0_lkind + x_0
456 num = x1*x1*(1.0_lkind + x*x)
457 denom = x1_0*x1_0*(1.0_lkind + x_0*x_0)
458 y = atan(x) - atan(x_0)
459 psi_m = ln_z_z0 - log(num/denom) + 2.0_lkind*y
463if( stable_option == 1)
then
466 psi_m = ln_z_z0 + (5.0_lkind - real(b_stab, fms_mo_kind_)) &
467 *log((1.0_lkind + zeta)/(1.0_lkind + zeta_0)) &
468 + real(b_stab, fms_mo_kind_)*(zeta - zeta_0)
471else if (stable_option == 2)
then
473 weakly_stable = stable .and. zeta <= real(zeta_trans,fms_mo_kind_)
474 strongly_stable = stable .and. zeta > real(zeta_trans,fms_mo_kind_)
476 where (weakly_stable)
477 psi_m = ln_z_z0 + 5.0_lkind*(zeta - zeta_0)
480 where(strongly_stable)
481 x = (real(lambda, fms_mo_kind_) - 1.0_lkind)*log(zeta/real(zeta_trans, fms_mo_kind_)) + &
482 real(b_stab, FMS_MO_KIND_)*(zeta -
real(zeta_trans, FMS_MO_KIND_))
485 where (strongly_stable .and. zeta_0 <= real(zeta_trans,fms_mo_kind_))
486 psi_m = ln_z_z0 + x + 5.0_lkind &
487 *(real(zeta_trans, fms_mo_kind_) - zeta_0)
489 where (strongly_stable .and. zeta_0 > real(zeta_trans,fms_mo_kind_))
490 psi_m = real(lambda, fms_mo_kind_)*ln_z_z0 + real(b_stab, fms_mo_kind_) &
497end subroutine mo_integral_m_
507subroutine mo_drag_2d_ &
508 (pt, pt0, z, z0, zt, zq, speed, drag_m, drag_t, drag_q, u_star, b_star)
510real(kind=fms_mo_kind_),
intent(in) ,
dimension(:,:) :: z, speed, pt, pt0, z0, zt, zq
511real(kind=fms_mo_kind_),
intent(out) ,
dimension(:,:) :: drag_m, drag_t, drag_q
512real(kind=fms_mo_kind_),
intent(inout),
dimension(:,:) :: u_star, b_star
517 call mo_drag (pt(:,j), pt0(:,j), z(:,j), z0(:,j), zt(:,j), zq(:,j), &
518 speed(:,j), drag_m(:,j), drag_t(:,j), drag_q(:,j), &
519 u_star(:,j), b_star(:,j))
524end subroutine mo_drag_2d_
527subroutine mo_drag_0d_ &
528 (pt, pt0, z, z0, zt, zq, speed, drag_m, drag_t, drag_q, u_star, b_star)
530real(kind=fms_mo_kind_),
intent(in) :: z, speed, pt, pt0, z0, zt, zq
531real(kind=fms_mo_kind_),
intent(out) :: drag_m, drag_t, drag_q, u_star, b_star
533real(kind=fms_mo_kind_),
dimension(1) :: pt_1, pt0_1, z_1, z0_1, zt_1, zq_1, speed_1, &
534 drag_m_1, drag_t_1, drag_q_1, u_star_1, b_star_1
544call mo_drag (pt_1, pt0_1, z_1, z0_1, zt_1, zq_1, speed_1, &
545 drag_m_1, drag_t_1, drag_q_1, u_star_1, b_star_1)
554end subroutine mo_drag_0d_
557subroutine mo_profile_2d_(zref, zref_t, z, z0, zt, zq, u_star, b_star, q_star, &
560real(kind=fms_mo_kind_),
intent(in) :: zref, zref_t
561real(kind=fms_mo_kind_),
intent(in) ,
dimension(:,:) :: z, z0, zt, zq, u_star, b_star, q_star
562real(kind=fms_mo_kind_),
intent(out),
dimension(:,:) :: del_m, del_h, del_q
567 call mo_profile (zref, zref_t, z(:,j), z0(:,j), zt(:,j), &
568 zq(:,j), u_star(:,j), b_star(:,j), q_star(:,j), &
569 del_m(:,j), del_h(:,j), del_q(:,j))
573end subroutine mo_profile_2d_
577subroutine mo_profile_0d_(zref, zref_t, z, z0, zt, zq, u_star, b_star, q_star, &
580real(kind=fms_mo_kind_),
intent(in) :: zref, zref_t
581real(kind=fms_mo_kind_),
intent(in) :: z, z0, zt, zq, u_star, b_star, q_star
582real(kind=fms_mo_kind_),
intent(out) :: del_m, del_h, del_q
584real(kind=fms_mo_kind_),
dimension(1) :: z_1, z0_1, zt_1, zq_1, u_star_1, b_star_1, q_star_1, &
585 del_m_1, del_h_1, del_q_1
595call mo_profile (zref, zref_t, z_1, z0_1, zt_1, zq_1, &
596 u_star_1, b_star_1, q_star_1, &
597 del_m_1, del_h_1, del_q_1)
605end subroutine mo_profile_0d_
609subroutine mo_profile_1d_n_(zref, z, z0, zt, zq, u_star, b_star, q_star, &
610 del_m, del_t, del_q, avail)
612real(kind=fms_mo_kind_),
intent(in),
dimension(:) :: zref
613real(kind=fms_mo_kind_),
intent(in) ,
dimension(:) :: z, z0, zt, zq, u_star, b_star, q_star
614real(kind=fms_mo_kind_),
intent(out),
dimension(:,:) :: del_m, del_t, del_q
615logical,
intent(in) ,
optional,
dimension(:) :: avail
619do k = 1,
size(zref(:))
620 if(
present(avail))
then
621 call mo_profile (zref(k), zref(k), z, z0, zt, zq, &
622 u_star, b_star, q_star, del_m(:,k), del_t(:,k), del_q(:,k), avail)
624 call mo_profile (zref(k), zref(k), z, z0, zt, zq, &
625 u_star, b_star, q_star, del_m(:,k), del_t(:,k), del_q(:,k))
630end subroutine mo_profile_1d_n_
634subroutine mo_profile_0d_n_(zref, z, z0, zt, zq, u_star, b_star, q_star, &
637real(kind=fms_mo_kind_),
intent(in),
dimension(:) :: zref
638real(kind=fms_mo_kind_),
intent(in) :: z, z0, zt, zq, u_star, b_star, q_star
639real(kind=fms_mo_kind_),
intent(out),
dimension(:) :: del_m, del_t, del_q
643do k = 1,
size(zref(:))
644 call mo_profile (zref(k), zref(k), z, z0, zt, zq, &
645 u_star, b_star, q_star, del_m(k), del_t(k), del_q(k))
649end subroutine mo_profile_0d_n_
653subroutine mo_profile_2d_n_(zref, z, z0, zt, zq, u_star, b_star, q_star, &
656real(kind=fms_mo_kind_),
intent(in),
dimension(:) :: zref
657real(kind=fms_mo_kind_),
intent(in),
dimension(:,:) :: z, z0, zt, zq, u_star, b_star, q_star
658real(kind=fms_mo_kind_),
intent(out),
dimension(:,:,:) :: del_m, del_t, del_q
662do k = 1,
size(zref(:))
663 call mo_profile (zref(k), zref(k), z, z0, zt, zq, &
664 u_star, b_star, q_star, del_m(:,:,k), del_t(:,:,k), del_q(:,:,k))
668end subroutine mo_profile_2d_n_
672subroutine mo_diff_2d_1_(z, u_star, b_star, k_m, k_h)
674real(kind=fms_mo_kind_),
intent(in),
dimension(:,:) :: z, u_star, b_star
675real(kind=fms_mo_kind_),
intent(out),
dimension(:,:) :: k_m, k_h
677real(kind=fms_mo_kind_),
dimension(size(z,1),size(z,2),1) :: z_n, k_m_n, k_h_n
681call mo_diff(z_n, u_star, b_star, k_m_n, k_h_n)
687end subroutine mo_diff_2d_1_
692subroutine mo_diff_1d_1_(z, u_star, b_star, k_m, k_h)
694real(kind=fms_mo_kind_),
intent(in),
dimension(:) :: z, u_star, b_star
695real(kind=fms_mo_kind_),
intent(out),
dimension(:) :: k_m, k_h
697real(kind=fms_mo_kind_),
dimension(size(z),1,1) :: z_n, k_m_n, k_h_n
698real(kind=fms_mo_kind_),
dimension(size(z),1) :: u_star_n, b_star_n
701u_star_n(:,1) = u_star
702b_star_n(:,1) = b_star
704call mo_diff(z_n, u_star_n, b_star_n, k_m_n, k_h_n)
710end subroutine mo_diff_1d_1_
714subroutine mo_diff_1d_n_(z, u_star, b_star, k_m, k_h)
716real(kind=fms_mo_kind_),
intent(in),
dimension(:,:) :: z
717real(kind=fms_mo_kind_),
intent(in),
dimension(:) :: u_star, b_star
718real(kind=fms_mo_kind_),
intent(out),
dimension(:,:) :: k_m, k_h
720real(kind=fms_mo_kind_),
dimension(size(z,1),1) :: u_star2, b_star2
721real(kind=fms_mo_kind_),
dimension(size(z,1),1, size(z,2)) :: z2, k_m2, k_h2
731call mo_diff(z2, u_star2, b_star2, k_m2, k_h2)
734 k_m(:,n) = k_m2(:,1,n)
735 k_h(:,n) = k_h2(:,1,n)
739end subroutine mo_diff_1d_n_
743subroutine mo_diff_0d_1_(z, u_star, b_star, k_m, k_h)
745real(kind=fms_mo_kind_),
intent(in) :: z, u_star, b_star
746real(kind=fms_mo_kind_),
intent(out) :: k_m, k_h
748integer :: ni, nj, nk, ier
749integer,
parameter :: lkind = fms_mo_kind_
750real(kind=fms_mo_kind_),
parameter :: ustar_min = 1.0e-10_lkind
751real(kind=fms_mo_kind_),
dimension(1,1,1) :: z_a, k_m_a, k_h_a
752real(kind=fms_mo_kind_),
dimension(1,1) :: u_star_a, b_star_a
754if(.not.module_is_initialized)
call error_mesg(
'mo_diff_0d_1 in monin_obukhov_mod', &
755 'monin_obukhov_init has not been called', fatal)
757ni = 1; nj = 1; nk = 1
759u_star_a(1,1) = u_star
760b_star_a(1,1) = b_star
761call monin_obukhov_diff(real(vonkarm, fms_mo_kind_), ustar_min, neutral, &
762 & stable_option, new_mo_option, real(rich_crit, fms_mo_kind_), &
763 & real(zeta_trans, fms_mo_kind_), ni, nj, nk, z_a, u_star_a, &
764 & b_star_a, k_m_a, k_h_a, ier)
768end subroutine mo_diff_0d_1_
772subroutine mo_diff_0d_n_(z, u_star, b_star, k_m, k_h)
774real(kind=fms_mo_kind_),
intent(in),
dimension(:) :: z
775real(kind=fms_mo_kind_),
intent(in) :: u_star, b_star
776real(kind=fms_mo_kind_),
intent(out),
dimension(:) :: k_m, k_h
778integer :: ni, nj, nk, ier
779integer,
parameter :: lkind = fms_mo_kind_
780real(kind=fms_mo_kind_),
parameter :: ustar_min = 1.0e-10_lkind
781real(kind=fms_mo_kind_),
dimension(1,1,size(z)) :: z_a, k_m_a, k_h_a
782real(kind=fms_mo_kind_),
dimension(1,1) :: u_star_a, b_star_a
784if(.not.module_is_initialized)
call error_mesg(
'mo_diff_0d_n in monin_obukhov_mod', &
785 'monin_obukhov_init has not been called', fatal)
787ni = 1; nj = 1; nk =
size(z(:))
789u_star_a(1,1) = u_star
790b_star_a(1,1) = b_star
791call monin_obukhov_diff(real(vonkarm, fms_mo_kind_), ustar_min, neutral, &
792 & stable_option, new_mo_option, real(rich_crit, fms_mo_kind_), &
793 & real(zeta_trans, fms_mo_kind_), ni, nj, nk, z_a, u_star_a, &
794 & b_star_a, k_m_a, k_h_a, ier)
797end subroutine mo_diff_0d_n_
801subroutine stable_mix_2d_(rich, mix)
803real(kind=fms_mo_kind_),
intent(in) ,
dimension(:,:) :: rich
804real(kind=fms_mo_kind_),
intent(out),
dimension(:,:) :: mix
811 call stable_mix(rich(:, i), mix(:, i))
814end subroutine stable_mix_2d_
819subroutine stable_mix_1d_(rich, mix)
821real(kind=fms_mo_kind_),
intent(in) ,
dimension(:) :: rich
822real(kind=fms_mo_kind_),
intent(out),
dimension(:) :: mix
826if (.not.module_is_initialized)
call error_mesg(
'stable_mix in monin_obukhov_mod', &
827 'monin_obukhov_init has not been called', fatal)
831call monin_obukhov_stable_mix(stable_option, real(rich_crit,fms_mo_kind_), &
832 & real(zeta_trans,fms_mo_kind_), n, rich, mix, ierr)
834end subroutine stable_mix_1d_
838subroutine stable_mix_0d_(rich, mix)
840real(kind=fms_mo_kind_),
intent(in) :: rich
841real(kind=fms_mo_kind_),
intent(out) :: mix
842real(kind=fms_mo_kind_),
dimension(1) :: mix_1d
844call stable_mix([rich], mix_1d)
848end subroutine stable_mix_0d_