17 implicit none ;
private 19 #include <MOM_memory.h> 34 type(time_type),
pointer :: time
37 real,
pointer :: pfu_bc(:,:,:) => null()
38 real,
pointer :: pfv_bc(:,:,:) => null()
40 integer :: id_pfu_bc = -1, id_pfv_bc = -1, id_e_tidal = -1
59 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)),
intent(in) :: h
61 real,
dimension(SZIB_(G),SZJ_(G),SZK_(G)),
intent(out) :: PFu
63 real,
dimension(SZI_(G),SZJB_(G),SZK_(G)),
intent(out) :: PFv
66 real,
dimension(:,:),
optional,
pointer :: p_atm
68 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)),
optional,
intent(out) :: pbce
71 real,
dimension(SZI_(G),SZJ_(G)),
optional,
intent(out) :: eta
73 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)) :: &
77 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)+1) :: p
81 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)),
target :: &
87 real,
dimension(SZI_(G)) :: Rho_cv_BL
90 real,
dimension(SZI_(G),SZJ_(G)) :: &
100 real :: p_ref(szi_(g))
102 real :: rho_in_situ(szi_(g))
103 real :: PFu_bc, PFv_bc
118 real :: alpha_Lay(szk_(g))
119 real :: dalpha_int(szk_(g)+1)
121 integer :: is, ie, js, je, Isq, Ieq, Jsq, Jeq, nz, nkmb
123 is = g%isc ; ie = g%iec ; js = g%jsc ; je = g%jec ; nz = g%ke
124 nkmb=gv%nk_rho_varies
125 isq = g%IscB ; ieq = g%IecB ; jsq = g%JscB ; jeq = g%JecB
128 if (
present(p_atm))
then ;
if (
associated(p_atm)) use_p_atm = .true. ;
endif 129 is_split = .false. ;
if (
present(pbce)) is_split = .true.
130 use_eos =
associated(tv%eqn_of_state)
132 if (.not.
associated(cs))
call mom_error(fatal, &
133 "MOM_PressureForce_Mont: Module must be initialized before it is used.")
136 "PressureForce_Mont_nonBouss: The Montgomery form of the pressure force "//&
137 "can no longer be used with a compressible EOS. Use #define ANALYTIC_FV_PGF.")
140 i_gearth = 1.0 / gv%g_Earth
141 dp_neglect = gv%H_to_Pa * gv%H_subroundoff
144 do k=1,nz ; alpha_lay(k) = 1.0 / gv%Rlay(k) ;
enddo 146 do k=2,nz ; dalpha_int(k) = alpha_lay(k-1) - alpha_lay(k) ;
enddo 152 do j=jsq,jeq+1 ;
do i=isq,ieq+1 ; p(i,j,1) = p_atm(i,j) ;
enddo ;
enddo 155 do j=jsq,jeq+1 ;
do i=isq,ieq+1 ; p(i,j,1) = 0.0 ;
enddo ;
enddo 158 do j=jsq,jeq+1 ;
do k=1,nz ;
do i=isq,ieq+1
159 p(i,j,k+1) = p(i,j,k) + gv%H_to_Pa * h(i,j,k)
160 enddo ;
enddo ;
enddo 163 if (
present(eta))
then 164 pa_to_h = 1.0 / gv%H_to_Pa
167 do j=jsq,jeq+1 ;
do i=isq,ieq+1
168 eta(i,j) = (p(i,j,nz+1) - p_atm(i,j))*pa_to_h
172 do j=jsq,jeq+1 ;
do i=isq,ieq+1
173 eta(i,j) = p(i,j,nz+1)*pa_to_h
184 do j=jsq,jeq+1 ;
do i=isq,ieq+1
185 ssh(i,j) = -g%bathyT(i,j)
190 call int_specific_vol_dp(tv%T(:,:,k), tv%S(:,:,k), p(:,:,k), p(:,:,k+1), &
191 0.0, g%HI, tv%eqn_of_state, dz_geo(:,:,k), halo_size=1)
194 do j=jsq,jeq+1 ;
do k=1,nz;
do i=isq,ieq+1
195 ssh(i,j) = ssh(i,j) + i_gearth * dz_geo(i,j,k)
196 enddo ;
enddo ;
enddo 199 do j=jsq,jeq+1 ;
do k=1,nz ;
do i=isq,ieq+1
200 ssh(i,j) = ssh(i,j) + gv%H_to_kg_m2*h(i,j,k)*alpha_lay(k)
201 enddo ;
enddo ;
enddo 207 do j=jsq,jeq+1 ;
do i=isq,ieq+1
208 geopot_bot(i,j) = -gv%g_Earth*(e_tidal(i,j) + g%bathyT(i,j))
212 do j=jsq,jeq+1 ;
do i=isq,ieq+1
213 geopot_bot(i,j) = -gv%g_Earth*g%bathyT(i,j)
225 tv_tmp%T => t_tmp ; tv_tmp%S => s_tmp
226 tv_tmp%eqn_of_state => tv%eqn_of_state
227 do i=isq,ieq+1 ; p_ref(i) = tv%P_Ref ;
enddo 231 do k=1,nkmb ;
do i=isq,ieq+1
232 tv_tmp%T(i,j,k) = tv%T(i,j,k) ; tv_tmp%S(i,j,k) = tv%S(i,j,k)
235 rho_cv_bl(:), isq, ieq-isq+2, tv%eqn_of_state)
236 do k=nkmb+1,nz ;
do i=isq,ieq+1
237 if (gv%Rlay(k) < rho_cv_bl(i))
then 238 tv_tmp%T(i,j,k) = tv%T(i,j,nkmb) ; tv_tmp%S(i,j,k) = tv%S(i,j,nkmb)
240 tv_tmp%T(i,j,k) = tv%T(i,j,k) ; tv_tmp%S(i,j,k) = tv%S(i,j,k)
245 tv_tmp%T => tv%T ; tv_tmp%S => tv%S
246 tv_tmp%eqn_of_state => tv%eqn_of_state
247 do i=isq,ieq+1 ; p_ref(i) = 0 ;
enddo 251 do k=1,nz ;
do j=jsq,jeq+1
253 rho_in_situ,isq,ieq-isq+2,tv%eqn_of_state)
254 do i=isq,ieq+1 ; alpha_star(i,j,k) = 1.0 / rho_in_situ(i) ;
enddo 262 m(i,j,nz) = geopot_bot(i,j) + p(i,j,nz+1) * alpha_star(i,j,nz)
264 do k=nz-1,1,-1 ;
do i=isq,ieq+1
265 m(i,j,k) = m(i,j,k+1) + p(i,j,k+1) * (alpha_star(i,j,k) - alpha_star(i,j,k+1))
273 m(i,j,nz) = geopot_bot(i,j) + p(i,j,nz+1) * alpha_lay(nz)
275 do k=nz-1,1,-1 ;
do i=isq,ieq+1
276 m(i,j,k) = m(i,j,k+1) + p(i,j,k+1) * dalpha_int(k+1)
281 if (cs%GFS_scale < 1.0)
then 284 do j=jsq,jeq+1 ;
do i=isq,ieq+1
285 dm(i,j) = (cs%GFS_scale - 1.0) * m(i,j,1)
288 do k=1,nz ;
do j=jsq,jeq+1 ;
do i=isq,ieq+1
289 m(i,j,k) = m(i,j,k) + dm(i,j)
290 enddo ;
enddo ;
enddo 310 if (
present(pbce))
then 322 do j=jsq,jeq+1 ;
do i=isq,ieq+1
323 dp_star(i,j) = (p(i,j,k+1) - p(i,j,k)) + dp_neglect
325 do j=js,je ;
do i=isq,ieq
327 pfu_bc = (alpha_star(i+1,j,k) - alpha_star(i,j,k)) * (g%IdxCu(i,j) * &
328 ((dp_star(i,j) * dp_star(i+1,j) + (p(i,j,k) * dp_star(i+1,j) + &
329 p(i+1,j,k) * dp_star(i,j))) / (dp_star(i,j) + dp_star(i+1,j))))
330 pfu(i,j,k) = -(m(i+1,j,k) - m(i,j,k)) * g%IdxCu(i,j) + pfu_bc
331 if (
ASSOCIATED(cs%PFu_bc)) cs%PFu_bc(i,j,k) = pfu_bc
333 do j=jsq,jeq ;
do i=is,ie
334 pfv_bc = (alpha_star(i,j+1,k) - alpha_star(i,j,k)) * (g%IdyCv(i,j) * &
335 ((dp_star(i,j) * dp_star(i,j+1) + (p(i,j,k) * dp_star(i,j+1) + &
336 p(i,j+1,k) * dp_star(i,j))) / (dp_star(i,j) + dp_star(i,j+1))))
337 pfv(i,j,k) = -(m(i,j+1,k) - m(i,j,k)) * g%IdyCv(i,j) + pfv_bc
338 if (
ASSOCIATED(cs%PFv_bc)) cs%PFv_bc(i,j,k) = pfv_bc
344 do j=js,je ;
do i=isq,ieq
345 pfu(i,j,k) = -(m(i+1,j,k) - m(i,j,k)) * g%IdxCu(i,j)
347 do j=jsq,jeq ;
do i=is,ie
348 pfv(i,j,k) = -(m(i,j+1,k) - m(i,j,k)) * g%IdyCv(i,j)
353 if (cs%id_PFu_bc>0)
call post_data(cs%id_PFu_bc, cs%PFu_bc, cs%diag)
354 if (cs%id_PFv_bc>0)
call post_data(cs%id_PFv_bc, cs%PFv_bc, cs%diag)
355 if (cs%id_e_tidal>0)
call post_data(cs%id_e_tidal, e_tidal, cs%diag)
370 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)),
intent(in) :: h
372 real,
dimension(SZIB_(G),SZJ_(G),SZK_(G)),
intent(out) :: PFu
374 real,
dimension(SZI_(G),SZJB_(G),SZK_(G)),
intent(out) :: PFv
377 real,
dimension(:,:),
optional,
pointer :: p_atm
379 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)),
optional,
intent(out) :: pbce
382 real,
dimension(SZI_(G),SZJ_(G)),
optional,
intent(out) :: eta
384 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)) :: &
388 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)+1) :: e
392 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)),
target :: &
398 real :: Rho_cv_BL(szi_(g))
400 real :: h_star(szi_(g),szj_(g))
402 real :: e_tidal(szi_(g),szj_(g))
405 real :: p_ref(szi_(g))
409 real :: PFu_bc, PFv_bc
421 integer :: is, ie, js, je, Isq, Ieq, Jsq, Jeq, nz, nkmb
424 is = g%isc ; ie = g%iec ; js = g%jsc ; je = g%jec ; nz = g%ke
425 nkmb=gv%nk_rho_varies
426 isq = g%IscB ; ieq = g%IecB ; jsq = g%JscB ; jeq = g%JecB
429 if (
present(p_atm))
then ;
if (
associated(p_atm)) use_p_atm = .true. ;
endif 430 is_split = .false. ;
if (
present(pbce)) is_split = .true.
431 use_eos =
associated(tv%eqn_of_state)
433 if (.not.
associated(cs))
call mom_error(fatal, &
434 "MOM_PressureForce_Mont: Module must be initialized before it is used.")
437 "PressureForce_Mont_Bouss: The Montgomery form of the pressure force "//&
438 "can no longer be used with a compressible EOS. Use #define ANALYTIC_FV_PGF.")
441 h_neglect = gv%H_subroundoff * gv%H_to_m
443 g_rho0 = gv%g_Earth/gv%Rho0
452 do i=isq,ieq+1 ; e(i,j,1) = -1.0*g%bathyT(i,j) ;
enddo 453 do k=1,nz ;
do i=isq,ieq+1
454 e(i,j,1) = e(i,j,1) + h(i,j,k)*gv%H_to_m
464 do j=jsq,jeq+1 ;
do i=isq,ieq+1
465 e(i,j,nz+1) = -1.0*g%bathyT(i,j) - e_tidal(i,j)
469 do j=jsq,jeq+1 ;
do i=isq,ieq+1
470 e(i,j,nz+1) = -1.0*g%bathyT(i,j)
474 do j=jsq,jeq+1 ;
do k=nz,1,-1 ;
do i=isq,ieq+1
475 e(i,j,k) = e(i,j,k+1) + h(i,j,k)*gv%H_to_m
476 enddo ;
enddo ;
enddo 488 tv_tmp%T => t_tmp ; tv_tmp%S => s_tmp
489 tv_tmp%eqn_of_state => tv%eqn_of_state
491 do i=isq,ieq+1 ; p_ref(i) = tv%P_Ref ;
enddo 495 do k=1,nkmb ;
do i=isq,ieq+1
496 tv_tmp%T(i,j,k) = tv%T(i,j,k) ; tv_tmp%S(i,j,k) = tv%S(i,j,k)
499 rho_cv_bl(:), isq, ieq-isq+2, tv%eqn_of_state)
501 do k=nkmb+1,nz ;
do i=isq,ieq+1
502 if (gv%Rlay(k) < rho_cv_bl(i))
then 503 tv_tmp%T(i,j,k) = tv%T(i,j,nkmb) ; tv_tmp%S(i,j,k) = tv%S(i,j,nkmb)
505 tv_tmp%T(i,j,k) = tv%T(i,j,k) ; tv_tmp%S(i,j,k) = tv%S(i,j,k)
510 tv_tmp%T => tv%T ; tv_tmp%S => tv%S
511 tv_tmp%eqn_of_state => tv%eqn_of_state
512 do i=isq,ieq+1 ; p_ref(i) = 0.0 ;
enddo 518 do k=1,nz+1 ;
do j=jsq,jeq+1
519 call calculate_density(tv_tmp%T(:,j,k), tv_tmp%S(:,j,k), p_ref, rho_star(:,j,k), &
520 isq,ieq-isq+2,tv%eqn_of_state)
521 do i=isq,ieq+1 ; rho_star(i,j,k) = g_rho0*rho_star(i,j,k) ;
enddo 531 m(i,j,1) = cs%GFS_scale * (rho_star(i,j,1) * e(i,j,1))
532 if (use_p_atm) m(i,j,1) = m(i,j,1) + p_atm(i,j) * i_rho0
534 do k=2,nz ;
do i=isq,ieq+1
535 m(i,j,k) = m(i,j,k-1) + (rho_star(i,j,k) - rho_star(i,j,k-1)) * e(i,j,k)
542 m(i,j,1) = gv%g_prime(1) * e(i,j,1)
543 if (use_p_atm) m(i,j,1) = m(i,j,1) + p_atm(i,j) * i_rho0
545 do k=2,nz ;
do i=isq,ieq+1
546 m(i,j,k) = m(i,j,k-1) + gv%g_prime(k) * e(i,j,k)
551 if (
present(pbce))
then 552 call set_pbce_bouss(e, tv_tmp, g, gv, gv%g_Earth, cs%Rho0, cs%GFS_scale, pbce, &
563 do j=jsq,jeq+1 ;
do i=isq,ieq+1
564 h_star(i,j) = (e(i,j,k) - e(i,j,k+1)) + h_neglect
566 do j=js,je ;
do i=isq,ieq
567 pfu_bc = -1.0*(rho_star(i+1,j,k) - rho_star(i,j,k)) * (g%IdxCu(i,j) * &
568 ((h_star(i,j) * h_star(i+1,j) - (e(i,j,k) * h_star(i+1,j) + &
569 e(i+1,j,k) * h_star(i,j))) / (h_star(i,j) + h_star(i+1,j))))
570 pfu(i,j,k) = -(m(i+1,j,k) - m(i,j,k)) * g%IdxCu(i,j) + pfu_bc
571 if (
ASSOCIATED(cs%PFu_bc)) cs%PFu_bc(i,j,k) = pfu_bc
573 do j=jsq,jeq ;
do i=is,ie
574 pfv_bc = -1.0*(rho_star(i,j+1,k) - rho_star(i,j,k)) * (g%IdyCv(i,j) * &
575 ((h_star(i,j) * h_star(i,j+1) - (e(i,j,k) * h_star(i,j+1) + &
576 e(i,j+1,k) * h_star(i,j))) / (h_star(i,j) + h_star(i,j+1))))
577 pfv(i,j,k) = -(m(i,j+1,k) - m(i,j,k)) * g%IdyCv(i,j) + pfv_bc
578 if (
ASSOCIATED(cs%PFv_bc)) cs%PFv_bc(i,j,k) = pfv_bc
584 do j=js,je ;
do i=isq,ieq
585 pfu(i,j,k) = -(m(i+1,j,k) - m(i,j,k)) * g%IdxCu(i,j)
587 do j=jsq,jeq ;
do i=is,ie
588 pfv(i,j,k) = -(m(i,j+1,k) - m(i,j,k)) * g%IdyCv(i,j)
593 if (
present(eta))
then 599 do j=jsq,jeq+1 ;
do i=isq,ieq+1
600 eta(i,j) = e(i,j,1)*gv%m_to_H + e_tidal(i,j)*gv%m_to_H
604 do j=jsq,jeq+1 ;
do i=isq,ieq+1
605 eta(i,j) = e(i,j,1)*gv%m_to_H
610 if (cs%id_PFu_bc>0)
call post_data(cs%id_PFu_bc, cs%PFu_bc, cs%diag)
611 if (cs%id_PFv_bc>0)
call post_data(cs%id_PFv_bc, cs%PFv_bc, cs%diag)
612 if (cs%id_e_tidal>0)
call post_data(cs%id_e_tidal, e_tidal, cs%diag)
618 subroutine set_pbce_bouss(e, tv, G, GV, g_Earth, Rho0, GFS_scale, pbce, rho_star)
621 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)+1),
intent(in) :: e
623 real,
intent(in) :: g_Earth
624 real,
intent(in) :: Rho0
625 real,
intent(in) :: GFS_scale
628 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)),
intent(out) :: pbce
630 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)),
optional,
intent(in) :: rho_star
633 real :: Ihtot(szi_(g))
635 real :: press(szi_(g))
636 real :: T_int(szi_(g))
637 real :: S_int(szi_(g))
638 real :: dR_dT(szi_(g))
639 real :: dR_dS(szi_(g))
640 real :: rho_in_situ(szi_(g))
647 integer :: Isq, Ieq, Jsq, Jeq, nz, i, j, k
649 isq = g%IscB ; ieq = g%IecB ; jsq = g%JscB ; jeq = g%JecB ; nz = g%ke
651 rho0xg = rho0*g_earth
652 g_rho0 = g_earth/rho0
653 use_eos =
associated(tv%eqn_of_state)
654 h_neglect = gv%H_subroundoff*gv%H_to_m
657 if (
present(rho_star))
then 663 ihtot(i) = 1.0 / (((e(i,j,1)-e(i,j,nz+1)) + h_neglect) * gv%m_to_H)
664 pbce(i,j,1) = gfs_scale * rho_star(i,j,1) * gv%H_to_m
666 do k=2,nz ;
do i=isq,ieq+1
667 pbce(i,j,k) = pbce(i,j,k-1) + (rho_star(i,j,k)-rho_star(i,j,k-1)) * &
668 ((e(i,j,k) - e(i,j,nz+1)) * ihtot(i))
677 ihtot(i) = 1.0 / (((e(i,j,1)-e(i,j,nz+1)) + h_neglect) * gv%m_to_H)
678 press(i) = -rho0xg*e(i,j,1)
681 isq, ieq-isq+2, tv%eqn_of_state)
683 pbce(i,j,1) = g_rho0*(gfs_scale * rho_in_situ(i)) * gv%H_to_m
687 press(i) = -rho0xg*e(i,j,k)
688 t_int(i) = 0.5*(tv%T(i,j,k-1)+tv%T(i,j,k))
689 s_int(i) = 0.5*(tv%S(i,j,k-1)+tv%S(i,j,k))
691 call calculate_density_derivs(t_int, s_int, press, dr_dt, dr_ds, &
692 isq, ieq-isq+2, tv%eqn_of_state)
694 pbce(i,j,k) = pbce(i,j,k-1) + g_rho0 * &
695 ((e(i,j,k) - e(i,j,nz+1)) * ihtot(i)) * &
696 (dr_dt(i)*(tv%T(i,j,k)-tv%T(i,j,k-1)) + &
697 dr_ds(i)*(tv%S(i,j,k)-tv%S(i,j,k-1)))
706 ihtot(i) = 1.0 / (((e(i,j,1)-e(i,j,nz+1)) + h_neglect) * gv%m_to_H)
707 pbce(i,j,1) = gv%g_prime(1) * gv%H_to_m
709 do k=2,nz ;
do i=isq,ieq+1
710 pbce(i,j,k) = pbce(i,j,k-1) + &
711 gv%g_prime(k) * ((e(i,j,k) - e(i,j,nz+1)) * ihtot(i))
723 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)+1),
intent(in) :: p
725 real,
intent(in) :: g_Earth
726 real,
intent(in) :: GFS_scale
729 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)),
intent(out) :: pbce
731 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)),
optional,
intent(in) :: alpha_star
734 real,
dimension(SZI_(G),SZJ_(G)) :: &
738 real :: T_int(szi_(g))
739 real :: S_int(szi_(g))
740 real :: dR_dT(szi_(g))
741 real :: dR_dS(szi_(g))
742 real :: rho_in_situ(szi_(g))
743 real :: alpha_Lay(szk_(g))
744 real :: dalpha_int(szk_(g)+1)
752 integer :: Isq, Ieq, Jsq, Jeq, nz, i, j, k
754 isq = g%IscB ; ieq = g%IecB ; jsq = g%JscB ; jeq = g%JecB ; nz = g%ke
756 use_eos =
associated(tv%eqn_of_state)
758 dp_dh = g_earth * gv%H_to_kg_m2
759 dp_neglect = dp_dh * gv%H_subroundoff
761 do k=1,nz ; alpha_lay(k) = 1.0 / gv%Rlay(k) ;
enddo 762 do k=2,nz ; dalpha_int(k) = alpha_lay(k-1) - alpha_lay(k) ;
enddo 765 if (
present(alpha_star))
then 770 c_htot(i,j) = dp_dh / ((p(i,j,nz+1)-p(i,j,1)) + dp_neglect)
771 pbce(i,j,nz) = dp_dh * alpha_star(i,j,nz)
773 do k=nz-1,1,-1 ;
do i=isq,ieq+1
774 pbce(i,j,k) = pbce(i,j,k+1) + ((p(i,j,k+1)-p(i,j,1)) * c_htot(i,j)) * &
775 (alpha_star(i,j,k) - alpha_star(i,j,k+1))
784 rho_in_situ, isq, ieq-isq+2, tv%eqn_of_state)
786 c_htot(i,j) = dp_dh / ((p(i,j,nz+1)-p(i,j,1)) + dp_neglect)
787 pbce(i,j,nz) = dp_dh / rho_in_situ(i)
791 t_int(i) = 0.5*(tv%T(i,j,k)+tv%T(i,j,k+1))
792 s_int(i) = 0.5*(tv%S(i,j,k)+tv%S(i,j,k+1))
795 isq, ieq-isq+2, tv%eqn_of_state)
796 call calculate_density_derivs(t_int, s_int, p(:,j,k+1), dr_dt, dr_ds, &
797 isq, ieq-isq+2, tv%eqn_of_state)
799 pbce(i,j,k) = pbce(i,j,k+1) + ((p(i,j,k+1)-p(i,j,1))*c_htot(i,j)) * &
800 ((dr_dt(i)*(tv%T(i,j,k+1)-tv%T(i,j,k)) + &
801 dr_ds(i)*(tv%S(i,j,k+1)-tv%S(i,j,k))) / rho_in_situ(i)**2)
811 c_htot(i,j) = dp_dh / ((p(i,j,nz+1)-p(i,j,1)) + dp_neglect)
812 pbce(i,j,nz) = dp_dh * alpha_lay(nz)
814 do k=nz-1,1,-1 ;
do i=isq,ieq+1
815 pbce(i,j,k) = pbce(i,j,k+1) + ((p(i,j,k+1)-p(i,j,1))*c_htot(i,j)) * &
821 if (gfs_scale < 1.0)
then 825 do j=jsq,jeq+1 ;
do i=isq,ieq+1
826 dpbce(i,j) = (gfs_scale - 1.0) * pbce(i,j,1)
829 do k=1,nz ;
do j=jsq,jeq+1 ;
do i=isq,ieq+1
830 pbce(i,j,k) = pbce(i,j,k) + dpbce(i,j)
831 enddo ;
enddo ;
enddo 839 type(time_type),
target,
intent(in) :: Time
843 type(
diag_ctrl),
target,
intent(inout) :: diag
847 logical :: use_temperature, use_EOS
849 #include "version_variable.h" 850 character(len=40) :: mdl
852 if (
associated(cs))
then 853 call mom_error(warning,
"PressureForce_init called with an associated "// &
854 "control structure.")
856 else ;
allocate(cs) ;
endif 858 cs%diag => diag ; cs%Time => time
859 if (
present(tides_csp))
then 860 if (
associated(tides_csp)) cs%tides_CSp => tides_csp
863 mdl =
"MOM_PressureForce_Mont" 865 call get_param(param_file, mdl,
"RHO_0", cs%Rho0, &
866 "The mean ocean density used with BOUSSINESQ true to \n"//&
867 "calculate accelerations and the mass for conservation \n"//&
868 "properties, or with BOUSSINSEQ false to convert some \n"//&
869 "parameters from vertical units of m to kg m-2.", &
870 units=
"kg m-3", default=1035.0)
871 call get_param(param_file, mdl,
"TIDES", cs%tides, &
872 "If true, apply tidal momentum forcing.", default=.false.)
873 call get_param(param_file, mdl,
"USE_EOS", use_eos, default=.true., &
877 cs%id_PFu_bc = register_diag_field(
'ocean_model',
'PFu_bc', diag%axesCuL, time, &
878 'Density Gradient Zonal Pressure Force Accel.',
"meter second-2")
879 cs%id_PFv_bc = register_diag_field(
'ocean_model',
'PFv_bc', diag%axesCvL, time, &
880 'Density Gradient Meridional Pressure Force Accel.',
"meter second-2")
881 if (cs%id_PFu_bc > 0)
then 882 call safe_alloc_ptr(cs%PFu_bc,g%IsdB,g%IedB,g%jsd,g%jed,g%ke)
883 cs%PFu_bc(:,:,:) = 0.0
885 if (cs%id_PFv_bc > 0)
then 886 call safe_alloc_ptr(cs%PFv_bc,g%isd,g%ied,g%JsdB,g%JedB,g%ke)
887 cs%PFv_bc(:,:,:) = 0.0
892 cs%id_e_tidal = register_diag_field(
'ocean_model',
'e_tidal', diag%axesT1, &
893 time,
'Tidal Forcing Astronomical and SAL Height Anomaly',
'meter')
897 if (gv%g_prime(1) /= gv%g_Earth) cs%GFS_scale = gv%g_prime(1) / gv%g_Earth
899 call log_param(param_file, mdl,
"GFS / G_EARTH", cs%GFS_scale)
906 if (
associated(cs))
deallocate(cs)
subroutine, public pressureforce_mont_bouss(h, tv, PFu, PFv, G, GV, CS, p_atm, pbce, eta)
Boussinesq Montgomery-potential form of pressure gradient.
subroutine, public calc_tidal_forcing(Time, eta, eta_tidal, G, CS, deta_tidal_deta)
This subroutine calculates the geopotential anomalies that drive the tides, including self-attraction...
logical function, public query_compressible(EOS)
Returns true if the equation of state is compressible (i.e. has pressure dependence) ...
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...
subroutine, public pressureforce_mont_init(Time, G, GV, param_file, diag, CS, tides_CSp)
Initialize the Montgomery-potential form of PGF control structure.
Ocean grid type. See mom_grid for details.
subroutine, public pressureforce_mont_end(CS)
Deallocates the Montgomery-potential form of PGF control structure.
Calculates density of sea water from T, S and P.
Provides the ocean grid type.
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 the Montgomery potential form of pressure gradient.
logical function, public is_root_pe()
subroutine, public set_pbce_bouss(e, tv, G, GV, g_Earth, Rho0, GFS_scale, pbce, rho_star)
Determines the partial derivative of the acceleration due to pressure forces with the free surface he...
subroutine, public pressureforce_mont_nonbouss(h, tv, PFu, PFv, G, GV, CS, p_atm, pbce, eta)
Non-Boussinesq Montgomery-potential form of pressure gradient.
subroutine, public set_pbce_nonbouss(p, tv, G, GV, g_Earth, GFS_scale, pbce, alpha_star)
Determines the partial derivative of the acceleration due to pressure forces with the column mass...
subroutine, public mom_mesg(message, verb, all_print)
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 ...
Control structure for the Montgomery potential form of pressure gradient.
subroutine, public mom_error(level, message, all_print)