Calculate new temperatures and salinities that have been subject to full convective mixing.
23 type(ocean_grid_type),
intent(in) :: G
24 type(verticalGrid_type),
intent(in) :: GV
25 type(unit_scale_type),
intent(in) :: US
26 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)), &
28 type(thermo_var_ptrs),
intent(in) :: tv
30 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)), &
32 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)), &
34 real,
dimension(:,:),
pointer :: p_surf
35 real,
intent(in) :: Kddt_smooth
37 real,
optional,
intent(in) :: Kddt_convect
39 integer,
optional,
intent(in) :: halo
42 real,
dimension(SZI_(G),SZK_(G)+1) :: &
48 real,
dimension(SZI_(G),SZK0_(G)) :: &
57 real,
dimension(SZI_(G),SZK_(G)+1) :: &
66 real,
dimension(SZI_(G),SZK_(G)+1) :: &
77 real,
dimension(SZI_(G),SZK_(G)+1) :: &
85 logical,
dimension(SZI_(G)) :: do_i
86 logical,
dimension(SZI_(G)) :: last_down
87 integer,
dimension(SZI_(G)) :: change_ct
89 integer :: changed_col
90 integer :: i, j, k, is, ie, js, je, nz, itt
92 if (
present(halo))
then 93 is = g%isc-halo ; ie = g%iec+halo ; js = g%jsc-halo ; je = g%jec+halo
95 is = g%isc ; ie = g%iec ; js = g%jsc ; je = g%jec
99 if (.not.
associated(tv%eqn_of_state))
return 101 h_neglect = gv%H_subroundoff
103 if (
present(kddt_convect)) kap_dt_x2 = 2.0*kddt_convect
104 mix_len = (1.0e20 * nz) * (g%max_depth * gv%Z_to_H)
105 h0 = 1.0e-16*sqrt(kddt_smooth) + h_neglect
108 mix(:,:) = 0.0 ; d_b(:,:) = 1.0
110 te_b(:,:) = 0.0 ; se_b(:,:) = 0.0
112 call smoothed_drdt_drds(h, tv, kddt_smooth, drho_dt, drho_ds, g, gv, us, j, p_surf, halo)
115 do_i(i) = (g%mask2dT(i,j) > 0.0)
118 last_down(i) = .true.
120 te_a(i,0) = 0.0 ; se_a(i,0) = 0.0
126 do i=is,ie ; change_ct(i) = 0 ;
enddo 129 do k=2,nz ;
do i=is,ie ;
if (do_i(i))
then 131 h_a = h(i,j,k-1) + h_neglect ; h_b = h(i,j,k) + h_neglect
132 if (mix(i,k) <= 0.0)
then 133 if (is_unstable(drho_dt(i,k), drho_ds(i,k), h_a, h_b, mix(i,k-1), mix(i,k+1), &
134 tv%T(i,j,k-1), tv%T(i,j,k), tv%S(i,j,k-1), tv%S(i,j,k), &
135 te_a(i,k-2), te_b(i,k+1), se_a(i,k-2), se_b(i,k+1), &
136 d_a(i,k-1), d_b(i,k+1)))
then 138 if (kap_dt_x2 > 0.0) mix(i,k) = kap_dt_x2 / ((h(i,j,k-1)+h(i,j,k)) + h0)
139 change_ct(i) = change_ct(i) + 1
143 b_a = 1.0 / ((h_a + d_a(i,k-1)*mix(i,k-1)) + mix(i,k))
144 if (mix(i,k) <= 0.0)
then 145 c_a(i,k) = 0.0 ; d_a(i,k) = 1.0
147 d_a(i,k) = b_a * (h_a + d_a(i,k-1)*mix(i,k-1))
148 c_a(i,k) = 1.0 ;
if (d_a(i,k) > epsilon(b_a)) c_a(i,k) = b_a * mix(i,k)
152 te_a(i,k-1) = b_a * (h_a*tv%T(i,j,k-1) + mix(i,k-1)*te_a(i,k-2))
153 se_a(i,k-1) = b_a * (h_a*tv%S(i,j,k-1) + mix(i,k-1)*se_a(i,k-2))
155 te_a(i,k-1) = b_a * (h_a*tv%T(i,j,k-1))
156 se_a(i,k-1) = b_a * (h_a*tv%S(i,j,k-1))
158 endif ;
enddo ;
enddo 162 do i=is,ie ;
if (do_i(i))
then 163 if (change_ct(i) == 0)
then 164 last_down(i) = .true. ; do_i(i) = .false.
166 changed_col = changed_col + 1 ; change_ct(i) = 0
169 if (changed_col == 0)
exit 172 do k=nz,2,-1 ;
do i=is,ie ;
if (do_i(i))
then 174 h_a = h(i,j,k-1) + h_neglect ; h_b = h(i,j,k) + h_neglect
175 if (mix(i,k) <= 0.0)
then 176 if (is_unstable(drho_dt(i,k), drho_ds(i,k), h_a, h_b, mix(i,k-1), mix(i,k+1), &
177 tv%T(i,j,k-1), tv%T(i,j,k), tv%S(i,j,k-1), tv%S(i,j,k), &
178 te_a(i,k-2), te_b(i,k+1), se_a(i,k-2), se_b(i,k+1), &
179 d_a(i,k-1), d_b(i,k+1)))
then 181 if (kap_dt_x2 > 0.0) mix(i,k) = kap_dt_x2 / ((h(i,j,k-1)+h(i,j,k)) + h0)
182 change_ct(i) = change_ct(i) + 1
186 b_b = 1.0 / ((h_b + d_b(i,k+1)*mix(i,k+1)) + mix(i,k))
187 if (mix(i,k) <= 0.0)
then 188 c_b(i,k) = 0.0 ; d_b(i,k) = 1.0
190 d_b(i,k) = b_b * (h_b + d_b(i,k+1)*mix(i,k+1))
191 c_b(i,k) = 1.0 ;
if (d_b(i,k) > epsilon(b_b)) c_b(i,k) = b_b * mix(i,k)
195 te_b(i,k) = b_b * (h_b*tv%T(i,j,k) + mix(i,k+1)*te_b(i,k+1))
196 se_b(i,k) = b_b * (h_b*tv%S(i,j,k) + mix(i,k+1)*se_b(i,k+1))
198 te_b(i,k) = b_b * (h_b*tv%T(i,j,k))
199 se_b(i,k) = b_b * (h_b*tv%S(i,j,k))
201 endif ;
enddo ;
enddo 205 do i=is,ie ;
if (do_i(i))
then 206 if (change_ct(i) == 0)
then 207 last_down(i) = .false. ; do_i(i) = .false.
209 changed_col = changed_col + 1 ; change_ct(i) = 0
212 if (changed_col == 0)
exit 217 do i=is,ie ; do_i(i) = ((g%mask2dT(i,j) > 0.0) .and. last_down(i)) ;
enddo 218 do i=is,ie ;
if (do_i(i))
then 219 h_a = h(i,j,nz) + h_neglect
220 b_a = 1.0 / (h_a + d_a(i,nz)*mix(i,nz))
221 t_adj(i,j,nz) = b_a * (h_a*tv%T(i,j,nz) + mix(i,nz)*te_a(i,nz-1))
222 s_adj(i,j,nz) = b_a * (h_a*tv%S(i,j,nz) + mix(i,nz)*se_a(i,nz-1))
224 do k=nz-1,1,-1 ;
do i=is,ie ;
if (do_i(i))
then 225 t_adj(i,j,k) = te_a(i,k) + c_a(i,k+1)*t_adj(i,j,k+1)
226 s_adj(i,j,k) = se_a(i,k) + c_a(i,k+1)*s_adj(i,j,k+1)
227 endif ;
enddo ;
enddo 229 do i=is,ie ;
if (do_i(i))
then 236 do_i(i) = ((g%mask2dT(i,j) > 0.0) .and. .not.last_down(i))
238 h_b = h(i,j,1) + h_neglect
239 b_b = 1.0 / (h_b + d_b(i,2)*mix(i,2))
240 t_adj(i,j,1) = b_b * (h_b*tv%T(i,j,1) + mix(i,2)*te_b(i,2))
241 s_adj(i,j,1) = b_b * (h_b*tv%S(i,j,1) + mix(i,2)*se_b(i,2))
242 elseif (g%mask2dT(i,j) <= 0.0)
then 243 t_adj(i,j,1) = tv%T(i,j,1) ; s_adj(i,j,1) = tv%S(i,j,1)
246 do k=2,nz ;
do i=is,ie
248 t_adj(i,j,k) = te_b(i,k) + c_b(i,k)*t_adj(i,j,k-1)
249 s_adj(i,j,k) = se_b(i,k) + c_b(i,k)*s_adj(i,j,k-1)
250 elseif (g%mask2dT(i,j) <= 0.0)
then 251 t_adj(i,j,k) = tv%T(i,j,k) ; s_adj(i,j,k) = tv%S(i,j,k)
255 do i=is,ie ;
if (do_i(i))
then