11 implicit none ;
private 13 #include <MOM_memory.h> 20 slope_x, slope_y, N2_u, N2_v, halo)
23 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)),
intent(in) :: h
24 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)+1),
intent(in) :: e
26 real,
intent(in) :: dt_kappa_smooth
27 real,
dimension(SZIB_(G),SZJ_(G),SZK_(G)+1),
intent(inout) :: slope_x
28 real,
dimension(SZI_(G),SZJB_(G),SZK_(G)+1),
intent(inout) :: slope_y
29 real,
dimension(SZIB_(G),SZJ_(G),SZK_(G)+1),
intent(inout) :: N2_u
30 real,
dimension(SZI_(G),SZJB_(G),SZK_(G)+1),
intent(inout) :: N2_v
31 optional :: n2_u, n2_v
32 integer,
optional,
intent(in) :: halo
34 real,
dimension(SZI_(G), SZJ_(G), SZK_(G)) :: &
41 real,
dimension(SZI_(G), SZJ_(G), SZK_(G)+1) :: &
43 real,
dimension(SZIB_(G)) :: &
46 real,
dimension(SZI_(G)) :: &
49 real,
dimension(SZIB_(G)) :: &
52 real,
dimension(SZI_(G)) :: &
60 real :: hg2A, hg2B, hg2L, hg2R
61 real :: haA, haB, haL, haR
63 real :: wtA, wtB, wtL, wtR
64 real :: drdx, drdy, drdz
77 real :: G_Rho0, N2, dzN2, H_x(szib_(g)), H_y(szi_(g))
79 logical :: present_N2_u, present_N2_v
80 integer :: is, ie, js, je, nz, IsdB
83 if (
present(halo))
then 84 is = g%isc-halo ; ie = g%iec+halo ; js = g%jsc-halo ; je = g%jec+halo
86 is = g%isc ; ie = g%iec ; js = g%jsc ; je = g%jec
88 nz = g%ke ; isdb = g%IsdB
90 h_neglect = gv%H_subroundoff ; h_neglect2 = h_neglect**2
91 dz_neglect = gv%H_subroundoff*gv%H_to_m
93 use_eos =
associated(tv%eqn_of_state)
95 present_n2_u =
PRESENT(n2_u)
96 present_n2_v =
PRESENT(n2_v)
97 g_rho0 = gv%g_Earth / gv%Rho0
98 if (present_n2_u)
then 99 do j=js,je ;
do i=is-1,ie
104 if (present_n2_v)
then 105 do j=js-1,je ;
do i=is,ie
112 if (
present(halo))
then 113 call vert_fill_ts(h, tv%T, tv%S, dt_kappa_smooth, 1.0, t, s, g, gv, halo+1)
115 call vert_fill_ts(h, tv%T, tv%S, dt_kappa_smooth, 1.0, t, s, g, gv, 1)
122 do j=js-1,je+1 ;
do i=is-1,ie+1
124 pres(i,j,2) = pres(i,j,1) + gv%H_to_Pa*h(i,j,1)
128 do k=2,nz ;
do i=is-1,ie+1
129 pres(i,j,k+1) = pres(i,j,k) + gv%H_to_Pa*h(i,j,k)
141 do j=js,je ;
do k=nz,2,-1
142 if (.not.(use_eos))
then 143 drdia = 0.0 ; drdib = 0.0
144 drdkl = gv%Rlay(k)-gv%Rlay(k-1) ; drdkr = gv%Rlay(k)-gv%Rlay(k-1)
150 pres_u(i) = 0.5*(pres(i,j,k) + pres(i+1,j,k))
151 t_u(i) = 0.25*((t(i,j,k) + t(i+1,j,k)) + (t(i,j,k-1) + t(i+1,j,k-1)))
152 s_u(i) = 0.25*((s(i,j,k) + s(i+1,j,k)) + (s(i,j,k-1) + s(i+1,j,k-1)))
155 drho_ds_u, (is-isdb+1)-1, ie-is+2, tv%eqn_of_state)
161 drdia = drho_dt_u(i) * (t(i+1,j,k-1)-t(i,j,k-1)) + &
162 drho_ds_u(i) * (s(i+1,j,k-1)-s(i,j,k-1))
163 drdib = drho_dt_u(i) * (t(i+1,j,k)-t(i,j,k)) + &
164 drho_ds_u(i) * (s(i+1,j,k)-s(i,j,k))
167 drdkl = (drho_dt_u(i) * (t(i,j,k)-t(i,j,k-1)) + &
168 drho_ds_u(i) * (s(i,j,k)-s(i,j,k-1)))
169 drdkr = (drho_dt_u(i) * (t(i+1,j,k)-t(i+1,j,k-1)) + &
170 drho_ds_u(i) * (s(i+1,j,k)-s(i+1,j,k-1)))
175 hg2a = h(i,j,k-1)*h(i+1,j,k-1) + h_neglect2
176 hg2b = h(i,j,k)*h(i+1,j,k) + h_neglect2
177 hg2l = h(i,j,k-1)*h(i,j,k) + h_neglect2
178 hg2r = h(i+1,j,k-1)*h(i+1,j,k) + h_neglect2
179 haa = 0.5*(h(i,j,k-1) + h(i+1,j,k-1))
180 hab = 0.5*(h(i,j,k) + h(i+1,j,k)) + h_neglect
181 hal = 0.5*(h(i,j,k-1) + h(i,j,k)) + h_neglect
182 har = 0.5*(h(i+1,j,k-1) + h(i+1,j,k)) + h_neglect
183 if (gv%Boussinesq)
then 184 dzal = hal * gv%H_to_m ; dzar = har * gv%H_to_m
186 dzal = 0.5*(e(i,j,k-1) - e(i,j,k+1)) + dz_neglect
187 dzar = 0.5*(e(i+1,j,k-1) - e(i+1,j,k+1)) + dz_neglect
191 wta = hg2a*hab ; wtb = hg2b*haa
192 wtl = hg2l*(har*dzar) ; wtr = hg2r*(hal*dzal)
194 drdz = (wtl * drdkl + wtr * drdkr) / (dzal*wtl + dzar*wtr)
199 drdx = ((wta * drdia + wtb * drdib) / (wta + wtb) - &
200 drdz * (e(i,j,k)-e(i+1,j,k))) * g%IdxCu(i,j)
204 mag_grad2 = drdx**2 + drdz**2
205 if (mag_grad2 > 0.0)
then 206 slope_x(i,j,k) = drdx / sqrt(mag_grad2)
211 if (present_n2_u) n2_u(i,j,k) = g_rho0 * drdz * g%mask2dCu(i,j)
214 slope_x(i,j,k) = ((e(i,j,k)-e(i+1,j,k))*g%IdxCu(i,j)) * gv%m_to_H
228 do j=js-1,je ;
do k=nz,2,-1
229 if (.not.(use_eos))
then 230 drdja = 0.0 ; drdjb = 0.0
231 drdkl = gv%Rlay(k)-gv%Rlay(k-1) ; drdkr = gv%Rlay(k)-gv%Rlay(k-1)
236 pres_v(i) = 0.5*(pres(i,j,k) + pres(i,j+1,k))
237 t_v(i) = 0.25*((t(i,j,k) + t(i,j+1,k)) + (t(i,j,k-1) + t(i,j+1,k-1)))
238 s_v(i) = 0.25*((s(i,j,k) + s(i,j+1,k)) + (s(i,j,k-1) + s(i,j+1,k-1)))
241 drho_ds_v, is, ie-is+1, tv%eqn_of_state)
246 drdja = drho_dt_v(i) * (t(i,j+1,k-1)-t(i,j,k-1)) + &
247 drho_ds_v(i) * (s(i,j+1,k-1)-s(i,j,k-1))
248 drdjb = drho_dt_v(i) * (t(i,j+1,k)-t(i,j,k)) + &
249 drho_ds_v(i) * (s(i,j+1,k)-s(i,j,k))
252 drdkl = (drho_dt_v(i) * (t(i,j,k)-t(i,j,k-1)) + &
253 drho_ds_v(i) * (s(i,j,k)-s(i,j,k-1)))
254 drdkr = (drho_dt_v(i) * (t(i,j+1,k)-t(i,j+1,k-1)) + &
255 drho_ds_v(i) * (s(i,j+1,k)-s(i,j+1,k-1)))
259 hg2a = h(i,j,k-1)*h(i,j+1,k-1) + h_neglect2
260 hg2b = h(i,j,k)*h(i,j+1,k) + h_neglect2
261 hg2l = h(i,j,k-1)*h(i,j,k) + h_neglect2
262 hg2r = h(i,j+1,k-1)*h(i,j+1,k) + h_neglect2
263 haa = 0.5*(h(i,j,k-1) + h(i,j+1,k-1)) + h_neglect
264 hab = 0.5*(h(i,j,k) + h(i,j+1,k)) + h_neglect
265 hal = 0.5*(h(i,j,k-1) + h(i,j,k)) + h_neglect
266 har = 0.5*(h(i,j+1,k-1) + h(i,j+1,k)) + h_neglect
267 if (gv%Boussinesq)
then 268 dzal = hal * gv%H_to_m ; dzar = har * gv%H_to_m
270 dzal = 0.5*(e(i,j,k-1) - e(i,j,k+1)) + dz_neglect
271 dzar = 0.5*(e(i,j+1,k-1) - e(i,j+1,k+1)) + dz_neglect
275 wta = hg2a*hab ; wtb = hg2b*haa
276 wtl = hg2l*(har*dzar) ; wtr = hg2r*(hal*dzal)
278 drdz = (wtl * drdkl + wtr * drdkr) / (dzal*wtl + dzar*wtr)
283 drdy = ((wta * drdja + wtb * drdjb) / (wta + wtb) - &
284 drdz * (e(i,j,k)-e(i,j+1,k))) * g%IdyCv(i,j)
288 mag_grad2 = drdy**2 + drdz**2
289 if (mag_grad2 > 0.0)
then 290 slope_y(i,j,k) = drdy / sqrt(mag_grad2)
295 if (present_n2_v) n2_v(i,j,k) = g_rho0 * drdz * g%mask2dCv(i,j)
298 slope_y(i,j,k) = ((e(i,j,k)-e(i,j+1,k))*g%IdyCv(i,j)) * gv%m_to_H
306 subroutine vert_fill_ts(h, T_in, S_in, kappa, dt, T_f, S_f, G, GV, halo_here)
309 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)),
intent(in) :: h
310 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)),
intent(in) :: T_in
311 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)),
intent(in) :: S_in
312 real,
intent(in) :: kappa
313 real,
intent(in) :: dt
314 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)),
intent(out) :: T_f
315 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)),
intent(out) :: S_f
316 integer,
optional,
intent(in) :: halo_here
332 real :: ent(szi_(g),szk_(g)+1)
334 real :: b1(szi_(g)), d1(szi_(g))
335 real :: c1(szi_(g),szk_(g))
340 integer :: i, j, k, is, ie, js, je, nz, halo
342 halo=0 ;
if (
present(halo_here)) halo = max(halo_here,0)
344 is = g%isc-halo ; ie = g%iec+halo ; js = g%jsc-halo ; je = g%jec+halo
347 kap_dt_x2 = (2.0*kappa*dt)*gv%m_to_H**2
348 h_neglect = gv%H_subroundoff
350 if (kap_dt_x2 <= 0.0)
then 352 do k=1,nz ;
do j=js,je ;
do i=is,ie
353 t_f(i,j,k) = t_in(i,j,k) ; s_f(i,j,k) = s_in(i,j,k)
354 enddo ;
enddo ;
enddo 360 ent(i,2) = kap_dt_x2 / ((h(i,j,1)+h(i,j,2)) + h_neglect)
361 b1(i) = 1.0 / (h(i,j,1)+ent(i,2))
362 d1(i) = b1(i) * h(i,j,1)
363 t_f(i,j,1) = (b1(i)*h(i,j,1))*t_in(i,j,1)
364 s_f(i,j,1) = (b1(i)*h(i,j,1))*s_in(i,j,1)
366 do k=2,nz-1 ;
do i=is,ie
367 ent(i,k+1) = kap_dt_x2 / ((h(i,j,k)+h(i,j,k+1)) + h_neglect)
368 c1(i,k) = ent(i,k) * b1(i)
369 b1(i) = 1.0 / ((h(i,j,k) + d1(i)*ent(i,k)) + ent(i,k+1))
370 d1(i) = b1(i) * (h(i,j,k) + d1(i)*ent(i,k))
371 t_f(i,j,k) = b1(i) * (h(i,j,k)*t_in(i,j,k) + ent(i,k)*t_f(i,j,k-1))
372 s_f(i,j,k) = b1(i) * (h(i,j,k)*s_in(i,j,k) + ent(i,k)*s_f(i,j,k-1))
375 c1(i,nz) = ent(i,nz) * b1(i)
376 b1(i) = 1.0 / (h(i,j,nz) + d1(i)*ent(i,nz) + h_neglect)
377 t_f(i,j,nz) = b1(i) * (h(i,j,nz)*t_in(i,j,nz) + ent(i,nz)*t_f(i,j,nz-1))
378 s_f(i,j,nz) = b1(i) * (h(i,j,nz)*s_in(i,j,nz) + ent(i,nz)*s_f(i,j,nz-1))
380 do k=nz-1,1,-1 ;
do i=is,ie
381 t_f(i,j,k) = t_f(i,j,k) + c1(i,k+1)*t_f(i,j,k+1)
382 s_f(i,j,k) = s_f(i,j,k) + c1(i,k+1)*s_f(i,j,k+1)
subroutine, public int_specific_vol_dp(T, S, p_t, p_b, alpha_ref, HI, EOS, dza, intp_dza, intx_dza, inty_dza, halo_size)
Calls the appropriate subroutine to alculate analytical and nearly-analytical integrals in pressure a...
Ocean grid type. See mom_grid for details.
Provides the ocean grid type.
subroutine, public calc_isoneutral_slopes(G, GV, h, e, tv, dt_kappa_smooth, slope_x, slope_y, N2_u, N2_v, halo)
subroutine vert_fill_ts(h, T_in, S_in, kappa, dt, T_f, S_f, G, GV, halo_here)
subroutine, public calculate_density_derivs(T, S, pressure, drho_dT, drho_dS, start, npts, EOS)
Calls the appropriate subroutine to calculate density derivatives for 1-D array inputs.
Provides subroutines for quantities specific to the equation of state.
The thermo_var_ptrs structure contains pointers to an assortment of thermodynamic fields that may be ...
Calculations of isoneutral slopes and stratification.