116 type(adapt_CS),
intent(in) :: CS
117 type(ocean_grid_type),
intent(in) :: G
118 type(verticalGrid_type),
intent(in) :: GV
119 type(unit_scale_type),
intent(in) :: US
120 type(thermo_var_ptrs),
intent(in) :: tv
122 integer,
intent(in) :: i
123 integer,
intent(in) :: j
124 real,
dimension(SZI_(G),SZJ_(G),SZK_(GV)+1),
intent(in) :: zInt
125 real,
dimension(SZI_(G),SZJ_(G),SZK_(GV)+1),
intent(in) :: tInt
126 real,
dimension(SZI_(G),SZJ_(G),SZK_(GV)+1),
intent(in) :: sInt
127 real,
dimension(SZI_(G),SZJ_(G),SZK_(GV)),
intent(in) :: h
128 real,
dimension(SZK_(GV)+1),
intent(inout) :: zNext
132 real :: h_up, b1, b_denom_1, d1, depth, nominal_z, stretching
134 real,
dimension(SZK_(GV)+1) :: alpha
135 real,
dimension(SZK_(GV)+1) :: beta
136 real,
dimension(SZK_(GV)+1) :: del2sigma
137 real,
dimension(SZK_(GV)+1) :: dh_d2s
138 real,
dimension(SZK_(GV)) :: kGrid, c1
144 znext(nz+1) = zint(i,j,nz+1)
147 depth = g%bathyT(i,j) * gv%Z_to_H
150 del2sigma(:) = 0.0 ; dh_d2s(:) = 0.0
157 if (g%mask2dT(i,j-1) > 0.)
then
158 call calculate_density_derivs( &
159 0.5 * (tint(i,j,2:nz) + tint(i,j-1,2:nz)), &
160 0.5 * (sint(i,j,2:nz) + sint(i,j-1,2:nz)), &
161 0.5 * (zint(i,j,2:nz) + zint(i,j-1,2:nz)) * (gv%H_to_RZ * gv%g_Earth), &
162 alpha, beta, tv%eqn_of_state, (/2,nz/) )
164 del2sigma(2:nz) = del2sigma(2:nz) + &
165 (alpha(2:nz) * (tint(i,j-1,2:nz) - tint(i,j,2:nz)) + &
166 beta(2:nz) * (sint(i,j-1,2:nz) - sint(i,j,2:nz)))
169 if (g%mask2dT(i,j+1) > 0.)
then
170 call calculate_density_derivs( &
171 0.5 * (tint(i,j,2:nz) + tint(i,j+1,2:nz)), &
172 0.5 * (sint(i,j,2:nz) + sint(i,j+1,2:nz)), &
173 0.5 * (zint(i,j,2:nz) + zint(i,j+1,2:nz)) * (gv%H_to_RZ * gv%g_Earth), &
174 alpha, beta, tv%eqn_of_state, (/2,nz/) )
176 del2sigma(2:nz) = del2sigma(2:nz) + &
177 (alpha(2:nz) * (tint(i,j+1,2:nz) - tint(i,j,2:nz)) + &
178 beta(2:nz) * (sint(i,j+1,2:nz) - sint(i,j,2:nz)))
181 if (g%mask2dT(i-1,j) > 0.)
then
182 call calculate_density_derivs( &
183 0.5 * (tint(i,j,2:nz) + tint(i-1,j,2:nz)), &
184 0.5 * (sint(i,j,2:nz) + sint(i-1,j,2:nz)), &
185 0.5 * (zint(i,j,2:nz) + zint(i-1,j,2:nz)) * (gv%H_to_RZ * gv%g_Earth), &
186 alpha, beta, tv%eqn_of_state, (/2,nz/) )
188 del2sigma(2:nz) = del2sigma(2:nz) + &
189 (alpha(2:nz) * (tint(i-1,j,2:nz) - tint(i,j,2:nz)) + &
190 beta(2:nz) * (sint(i-1,j,2:nz) - sint(i,j,2:nz)))
193 if (g%mask2dT(i+1,j) > 0.)
then
194 call calculate_density_derivs( &
195 0.5 * (tint(i,j,2:nz) + tint(i+1,j,2:nz)), &
196 0.5 * (sint(i,j,2:nz) + sint(i+1,j,2:nz)), &
197 0.5 * (zint(i,j,2:nz) + zint(i+1,j,2:nz)) * (gv%H_to_RZ * gv%g_Earth), &
198 alpha, beta, tv%eqn_of_state, (/2,nz/) )
200 del2sigma(2:nz) = del2sigma(2:nz) + &
201 (alpha(2:nz) * (tint(i+1,j,2:nz) - tint(i,j,2:nz)) + &
202 beta(2:nz) * (sint(i+1,j,2:nz) - sint(i,j,2:nz)))
211 call calculate_density_derivs(tint(i,j,:), sint(i,j,:), zint(i,j,:) * (gv%H_to_RZ * gv%g_Earth), &
212 alpha, beta, tv%eqn_of_state, (/1,nz+1/) )
215 dh_d2s(k) = del2sigma(k) * (0.5 * (h(i,j,k-1) + h(i,j,k))) / &
216 max(alpha(k) * (tv%T(i,j,k) - tv%T(i,j,k-1)) + &
217 beta(k) * (tv%S(i,j,k) - tv%S(i,j,k-1)), 1e-20*us%kg_m3_to_R)
222 h_up = merge(h(i,j,k), h(i,j,k-1), dh_d2s(k) > 0.)
223 dh_d2s(k) = 0.5 * cs%adaptAlpha * &
224 sign(min(abs(del2sigma(k)), 0.5 * h_up), dh_d2s(k))
227 znext(k) = zint(i,j,k) + dh_d2s(k)
238 drdz = 0.5 * (alpha(k) + alpha(k+1)) * (tint(i,j,k+1) - tint(i,j,k)) + &
239 0.5 * (beta(k) + beta(k+1)) * (sint(i,j,k+1) - sint(i,j,k))
241 drdz = drdz / (znext(k) - znext(k+1) + gv%H_subroundoff)
246 kgrid(k) = (cs%adaptTimeRatio * nz**2 * depth) * &
247 (cs%adaptZoomCoeff / (cs%adaptZoom + 0.5*(znext(k) + znext(k+1))) + &
248 (cs%adaptBuoyCoeff * drdz / cs%adaptDrho0) + &
249 max(1.0 - cs%adaptZoomCoeff - cs%adaptBuoyCoeff, 0.0) / depth)
259 b_denom_1 = 1. + d1 * kgrid(k-1)
261 b1 = 1.0 / (b_denom_1 + kgrid(k))
264 c1(k) = kgrid(k) * b1
269 znext(k) = b1 * (znext(k) + kgrid(k-1)*znext(k-1))
273 znext(k) = znext(k) + c1(k)*znext(k+1)
276 if (cs%adaptDoMin)
then
278 stretching = zint(i,j,nz+1) / depth
281 nominal_z = nominal_z + cs%coordinateResolution(k-1) * stretching
283 znext(k) = max(znext(k), nominal_z)
285 znext(k) = min(znext(k), zint(i,j,nz+1))