Subroutine for calculating (internal) vertical diffusivities/viscosities.
60 type(ocean_grid_type),
intent(in) :: G
61 type(verticalGrid_type),
intent(in) :: GV
62 type(unit_scale_type),
intent(in) :: US
63 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)),
intent(in) :: u_H
64 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)),
intent(in) :: v_H
66 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)),
intent(in) :: h
67 type(thermo_var_ptrs),
intent(in) :: tv
68 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)+1),
intent(out) :: kd
70 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)+1),
intent(out) :: kv
72 type(CVMix_shear_cs),
pointer :: CS
75 integer :: i, j, k, kk, km1
84 real,
dimension(2*(G%ke)) :: pres_1d
85 real,
dimension(2*(G%ke)) :: temp_1d
86 real,
dimension(2*(G%ke)) :: salt_1d
87 real,
dimension(2*(G%ke)) :: rho_1d
88 real,
dimension(G%ke+1) :: Ri_Grad
89 real,
dimension(G%ke+1) :: Kvisc
90 real,
dimension(G%ke+1) :: Kdiff
94 gorho = us%L_to_Z**2 * gv%g_Earth / gv%Rho0
95 epsln = 1.e-10 * gv%m_to_H
101 if (g%mask2dT(i,j)==0.) cycle
104 pref = 0. ;
if (
associated(tv%p_surf)) pref = tv%p_surf(i,j)
114 temp_1d(kk+1) = tv%T(i,j,k)
115 temp_1d(kk+2) = tv%T(i,j,km1)
116 salt_1d(kk+1) = tv%S(i,j,k)
117 salt_1d(kk+2) = tv%S(i,j,km1)
121 pref = pref + (gv%g_Earth * gv%H_to_RZ) * h(i,j,k)
126 call calculate_density(temp_1d, salt_1d, pres_1d, rho_1d, tv%eqn_of_state)
132 du = u_h(i,j,k) - u_h(i,j,km1)
133 dv = v_h(i,j,k) - v_h(i,j,km1)
134 drho = gorho * (rho_1d(kk+1) - rho_1d(kk+2))
135 dz = (0.5*(h(i,j,km1) + h(i,j,k))+gv%H_subroundoff)*gv%H_to_Z
137 s2 = us%L_to_Z**2*(du*du+dv*dv)/(dz*dz)
138 ri_grad(k) = max(0., n2) / max(s2, 1.e-10*us%T_to_s**2)
141 if (cs%id_N2 > 0) cs%N2(i,j,k) = n2
142 if (cs%id_S2 > 0) cs%S2(i,j,k) = s2
146 ri_grad(g%ke+1) = ri_grad(g%ke)
148 if (cs%id_ri_grad > 0) cs%ri_grad(i,j,:) = ri_grad(:)
150 if (cs%smooth_ri)
then
153 if (h(i,j,k) <= epsln) ri_grad(k) = ri_grad(k-1)
156 ri_grad(g%ke+1) = ri_grad(g%ke)
159 dummy = 0.25 * ri_grad(2)
160 ri_grad(g%ke+1) = ri_grad(g%ke)
162 ri_grad(k) = dummy + 0.5 * ri_grad(k) + 0.25 * ri_grad(k+1)
163 dummy = 0.25 * ri_grad(k)
166 if (cs%id_ri_grad_smooth > 0) cs%ri_grad_smooth(i,j,:) = ri_grad(:)
170 kvisc(k) = us%Z2_T_to_m2_s * kv(i,j,k)
171 kdiff(k) = us%Z2_T_to_m2_s * kd(i,j,k)
175 call cvmix_coeffs_shear(mdiff_out=kvisc(:), &
176 tdiff_out=kdiff(:), &
181 kv(i,j,k) = us%m2_s_to_Z2_T * kvisc(k)
182 kd(i,j,k) = us%m2_s_to_Z2_T * kdiff(k)
188 if (cs%id_kd > 0)
call post_data(cs%id_kd, kd, cs%diag)
189 if (cs%id_kv > 0)
call post_data(cs%id_kv, kv, cs%diag)
190 if (cs%id_N2 > 0)
call post_data(cs%id_N2, cs%N2, cs%diag)
191 if (cs%id_S2 > 0)
call post_data(cs%id_S2, cs%S2, cs%diag)
192 if (cs%id_ri_grad > 0)
call post_data(cs%id_ri_grad, cs%ri_grad, cs%diag)
193 if (cs%id_ri_grad_smooth > 0)
call post_data(cs%id_ri_grad_smooth ,cs%ri_grad_smooth, cs%diag)