22 type(verticalgrid_type),
intent(in) :: gv
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
25 type(thermo_var_ptrs),
intent(in) :: tv
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)))
154 call calculate_density_derivs(t_u, s_u, pres_u, drho_dt_u, &
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)))
240 call calculate_density_derivs(t_v, s_v, pres_v, drho_dt_v, &
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
Ocean grid type. See mom_grid for details.