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.