24 implicit none ;
private 26 #include <MOM_memory.h> 38 type(time_type),
pointer :: time
41 logical :: usemasswghtinterp
42 integer :: id_e_tidal = -1
50 subroutine pressureforce_afv(h, tv, PFu, PFv, G, GV, CS, ALE_CSp, p_atm, pbce, eta)
53 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)),
intent(in) :: h
55 real,
dimension(SZIB_(G),SZJ_(G),SZK_(G)),
intent(out) :: PFu
56 real,
dimension(SZI_(G),SZJB_(G),SZK_(G)),
intent(out) :: PFv
58 type(
ale_cs),
pointer :: ALE_CSp
59 real,
dimension(:,:),
optional,
pointer :: p_atm
61 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)),
optional,
intent(out) :: pbce
64 real,
dimension(SZI_(G),SZJ_(G)),
optional,
intent(out) :: eta
68 if (gv%Boussinesq)
then 69 call pressureforce_afv_bouss(h, tv, pfu, pfv, g, gv, cs, ale_csp, p_atm, pbce, eta)
89 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)),
intent(in) :: h
91 real,
dimension(SZIB_(G),SZJ_(G),SZK_(G)),
intent(out) :: PFu
92 real,
dimension(SZI_(G),SZJB_(G),SZK_(G)),
intent(out) :: PFv
94 real,
dimension(:,:),
optional,
pointer :: p_atm
96 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)),
optional,
intent(out) :: pbce
99 real,
dimension(SZI_(G),SZJ_(G)),
optional,
intent(out) :: eta
103 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)+1) :: p
104 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)),
target :: &
109 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)) :: &
114 real,
dimension(SZI_(G),SZJ_(G)) :: &
123 real,
dimension(SZDI_(G%Block(1)),SZDJ_(G%Block(1))) :: &
128 real,
dimension(SZI_(G)) :: Rho_cv_BL
130 real,
dimension(SZDIB_(G%Block(1)),SZDJ_(G%Block(1))) :: &
133 real,
dimension(SZIB_(G),SZJ_(G),SZK_(G)) :: &
135 real,
dimension(SZDI_(G%Block(1)),SZDJB_(G%Block(1))) :: &
138 real,
dimension(SZI_(G),SZJB_(G),SZK_(G)) :: &
140 real :: p_ref(szi_(g))
154 real :: rho_in_situ(szi_(g))
158 real,
parameter :: C1_6 = 1.0/6.0
159 integer :: is, ie, js, je, Isq, Ieq, Jsq, Jeq, nz, nkmb
160 integer :: is_bk, ie_bk, js_bk, je_bk, Isq_bk, Ieq_bk, Jsq_bk, Jeq_bk
161 integer :: i, j, k, n, ib, jb, ioff_bk, joff_bk
163 is = g%isc ; ie = g%iec ; js = g%jsc ; je = g%jec ; nz = g%ke
164 nkmb=gv%nk_rho_varies
165 isq = g%IscB ; ieq = g%IecB ; jsq = g%JscB ; jeq = g%JecB
168 if (
present(p_atm))
then ;
if (
associated(p_atm)) use_p_atm = .true. ;
endif 169 use_eos =
associated(tv%eqn_of_state)
171 if (.not.
associated(cs))
call mom_error(fatal, &
172 "MOM_PressureForce: Module must be initialized before it is used.")
174 dp_neglect = gv%H_to_Pa * gv%H_subroundoff
175 alpha_ref = 1.0/cs%Rho0
180 do j=jsq,jeq+1 ;
do i=isq,ieq+1
181 p(i,j,1) = p_atm(i,j)
185 do j=jsq,jeq+1 ;
do i=isq,ieq+1
190 do j=jsq,jeq+1 ;
do k=2,nz+1 ;
do i=isq,ieq+1
191 p(i,j,k) = p(i,j,k-1) + gv%H_to_Pa * h(i,j,k-1)
192 enddo ;
enddo ;
enddo 195 i_gearth = 1.0 / gv%g_Earth
203 tv_tmp%T => t_tmp ; tv_tmp%S => s_tmp
204 tv_tmp%eqn_of_state => tv%eqn_of_state
205 do i=isq,ieq+1 ; p_ref(i) = tv%P_Ref ;
enddo 209 do k=1,nkmb ;
do i=isq,ieq+1
210 tv_tmp%T(i,j,k) = tv%T(i,j,k) ; tv_tmp%S(i,j,k) = tv%S(i,j,k)
213 rho_cv_bl(:), isq, ieq-isq+2, tv%eqn_of_state)
214 do k=nkmb+1,nz ;
do i=isq,ieq+1
215 if (gv%Rlay(k) < rho_cv_bl(i))
then 216 tv_tmp%T(i,j,k) = tv%T(i,j,nkmb) ; tv_tmp%S(i,j,k) = tv%S(i,j,nkmb)
218 tv_tmp%T(i,j,k) = tv%T(i,j,k) ; tv_tmp%S(i,j,k) = tv%S(i,j,k)
223 tv_tmp%T => tv%T ; tv_tmp%S => tv%S
224 tv_tmp%eqn_of_state => tv%eqn_of_state
235 call int_specific_vol_dp(tv_tmp%T(:,:,k), tv_tmp%S(:,:,k), p(:,:,k), &
236 p(:,:,k+1), alpha_ref, g%HI, tv%eqn_of_state, &
237 dza(:,:,k), intp_dza(:,:,k), intx_dza(:,:,k), &
240 alpha_anom = 1.0/gv%Rlay(k) - alpha_ref
241 do j=jsq,jeq+1 ;
do i=isq,ieq+1
242 dp(i,j) = gv%H_to_Pa * h(i,j,k)
243 dza(i,j,k) = alpha_anom * dp(i,j)
244 intp_dza(i,j,k) = 0.5 * alpha_anom * dp(i,j)**2
246 do j=js,je ;
do i=isq,ieq
247 intx_dza(i,j,k) = 0.5 * alpha_anom * (dp(i,j)+dp(i+1,j))
249 do j=jsq,jeq ;
do i=is,ie
250 inty_dza(i,j,k) = 0.5 * alpha_anom * (dp(i,j)+dp(i,j+1))
266 za(i,j) = alpha_ref*p(i,j,nz+1) - gv%g_Earth*g%bathyT(i,j)
268 do k=nz,1,-1 ;
do i=isq,ieq+1
269 za(i,j) = za(i,j) + dza(i,j,k)
276 do j=jsq,jeq+1 ;
do i=isq,ieq+1
277 ssh(i,j) = (za(i,j) - alpha_ref*p(i,j,1)) * i_gearth
281 do j=jsq,jeq+1 ;
do i=isq,ieq+1
282 za(i,j) = za(i,j) - gv%g_Earth*e_tidal(i,j)
286 if (cs%GFS_scale < 1.0)
then 293 rho_in_situ, isq, ieq-isq+2, tv%eqn_of_state)
296 dm(i,j) = (cs%GFS_scale - 1.0) * &
297 (p(i,j,1)*(1.0/rho_in_situ(i) - alpha_ref) + za(i,j))
302 do j=jsq,jeq+1 ;
do i=isq,ieq+1
303 dm(i,j) = (cs%GFS_scale - 1.0) * &
304 (p(i,j,1)*(1.0/gv%Rlay(1) - alpha_ref) + za(i,j))
322 is_bk=g%block(n)%isc ; ie_bk=g%block(n)%iec
323 js_bk=g%block(n)%jsc ; je_bk=g%block(n)%jec
324 isq_bk=g%block(n)%IscB ; ieq_bk=g%block(n)%IecB
325 jsq_bk=g%block(n)%JscB ; jeq_bk=g%block(n)%JecB
326 ioff_bk = g%Block(n)%idg_offset - g%HI%idg_offset
327 joff_bk = g%Block(n)%jdg_offset - g%HI%jdg_offset
328 do jb=jsq_bk,jeq_bk+1 ;
do ib=isq_bk,ieq_bk+1
329 i = ib+ioff_bk ; j = jb+joff_bk
330 za_bk(ib,jb) = za(i,j)
332 do jb=js_bk,je_bk ;
do ib=isq_bk,ieq_bk
333 i = ib+ioff_bk ; j = jb+joff_bk
334 intx_za_bk(ib,jb) = 0.5*(za_bk(ib,jb) + za_bk(ib+1,jb))
336 do jb=jsq_bk,jeq_bk ;
do ib=is_bk,ie_bk
337 i = ib+ioff_bk ; j = jb+joff_bk
338 inty_za_bk(ib,jb) = 0.5*(za_bk(ib,jb) + za_bk(ib,jb+1))
343 do jb=jsq_bk,jeq_bk+1 ;
do ib=isq_bk,ieq_bk+1
344 i = ib+ioff_bk ; j = jb+joff_bk
345 dp_bk(ib,jb) = gv%H_to_Pa*h(i,j,k)
346 za_bk(ib,jb) = za_bk(ib,jb) - dza(i,j,k)
348 do jb=js_bk,je_bk ;
do ib=isq_bk,ieq_bk
349 i = ib+ioff_bk ; j = jb+joff_bk
350 intx_za_bk(ib,jb) = intx_za_bk(ib,jb) - intx_dza(i,j,k)
351 pfu(i,j,k) = (((za_bk(ib,jb)*dp_bk(ib,jb) + intp_dza(i,j,k)) - &
352 (za_bk(ib+1,jb)*dp_bk(ib+1,jb) + intp_dza(i+1,j,k))) + &
353 ((dp_bk(ib+1,jb) - dp_bk(ib,jb)) * intx_za_bk(ib,jb) - &
354 (p(i+1,j,k) - p(i,j,k)) * intx_dza(i,j,k))) * &
355 (2.0*g%IdxCu(i,j) / ((dp_bk(ib,jb) + dp_bk(ib+1,jb)) + &
358 do jb=jsq_bk,jeq_bk ;
do ib=is_bk,ie_bk
359 i = ib+ioff_bk ; j = jb+joff_bk
360 inty_za_bk(ib,jb) = inty_za_bk(ib,jb) - inty_dza(i,j,k)
361 pfv(i,j,k) = (((za_bk(ib,jb)*dp_bk(ib,jb) + intp_dza(i,j,k)) - &
362 (za_bk(ib,jb+1)*dp_bk(ib,jb+1) + intp_dza(i,j+1,k))) + &
363 ((dp_bk(ib,jb+1) - dp_bk(ib,jb)) * inty_za_bk(ib,jb) - &
364 (p(i,j+1,k) - p(i,j,k)) * inty_dza(i,j,k))) * &
365 (2.0*g%IdyCv(i,j) / ((dp_bk(ib,jb) + dp_bk(ib,jb+1)) + &
369 if (cs%GFS_scale < 1.0)
then 371 do j=js_bk+joff_bk,je_bk+joff_bk ;
do i=isq_bk+ioff_bk,ieq_bk+ioff_bk
372 pfu(i,j,k) = pfu(i,j,k) - (dm(i+1,j) - dm(i,j)) * g%IdxCu(i,j)
374 do j=jsq_bk+joff_bk,jeq_bk+joff_bk ;
do i=is_bk+ioff_bk,ie_bk+ioff_bk
375 pfv(i,j,k) = pfv(i,j,k) - (dm(i,j+1) - dm(i,j)) * g%IdyCv(i,j)
381 if (
present(pbce))
then 385 if (
present(eta))
then 386 pa_to_h = 1.0 / gv%H_to_Pa
389 do j=jsq,jeq+1 ;
do i=isq,ieq+1
390 eta(i,j) = (p(i,j,nz+1) - p_atm(i,j))*pa_to_h
394 do j=jsq,jeq+1 ;
do i=isq,ieq+1
395 eta(i,j) = p(i,j,nz+1)*pa_to_h
400 if (cs%id_e_tidal>0)
call post_data(cs%id_e_tidal, e_tidal, cs%diag)
413 subroutine pressureforce_afv_bouss(h, tv, PFu, PFv, G, GV, CS, ALE_CSp, p_atm, pbce, eta)
416 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)),
intent(in) :: h
418 real,
dimension(SZIB_(G),SZJ_(G),SZK_(G)),
intent(out) :: PFu
419 real,
dimension(SZI_(G),SZJB_(G),SZK_(G)),
intent(out) :: PFv
421 type(
ale_cs),
pointer :: ALE_CSp
422 real,
dimension(:,:),
optional,
pointer :: p_atm
424 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)),
optional,
intent(out) :: pbce
427 real,
dimension(SZI_(G),SZJ_(G)),
optional,
intent(out) :: eta
431 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)+1) :: e
432 real,
dimension(SZI_(G),SZJ_(G)) :: &
437 real,
dimension(SZI_(G)) :: &
440 real,
dimension(SZDI_(G%Block(1)),SZDJ_(G%Block(1))) :: &
448 real,
dimension(SZDIB_(G%Block(1)),SZDJ_(G%Block(1))) :: &
452 real,
dimension(SZDI_(G%Block(1)),SZDJB_(G%Block(1))) :: &
457 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)),
target :: &
462 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)) :: &
465 real :: rho_in_situ(szi_(g))
466 real :: p_ref(szi_(g))
480 real,
parameter :: C1_6 = 1.0/6.0
481 integer :: is, ie, js, je, Isq, Ieq, Jsq, Jeq, nz, nkmb
482 integer :: is_bk, ie_bk, js_bk, je_bk, Isq_bk, Ieq_bk, Jsq_bk, Jeq_bk
483 integer :: ioff_bk, joff_bk
484 integer :: i, j, k, n, ib, jb
487 is = g%isc ; ie = g%iec ; js = g%jsc ; je = g%jec ; nz = g%ke
488 nkmb=gv%nk_rho_varies
489 isq = g%IscB ; ieq = g%IecB ; jsq = g%JscB ; jeq = g%JecB
491 if (.not.
associated(cs))
call mom_error(fatal, &
492 "MOM_PressureForce: Module must be initialized before it is used.")
495 if (
present(p_atm))
then ;
if (
associated(p_atm)) use_p_atm = .true. ;
endif 496 use_eos =
associated(tv%eqn_of_state)
497 do i=isq,ieq+1 ; p0(i) = 0.0 ;
enddo 499 if (
associated(ale_csp)) use_ale = usepressurereconstruction(ale_csp) .and. use_eos
501 prscheme = pressurereconstructionscheme(ale_csp)
502 h_neglect = gv%H_subroundoff
504 g_rho0 = gv%g_Earth/gv%Rho0
515 e(i,j,1) = -1.0*g%bathyT(i,j)
517 do k=1,nz ;
do i=isq,ieq+1
518 e(i,j,1) = e(i,j,1) + h(i,j,k)*gv%H_to_m
528 do j=jsq,jeq+1 ;
do i=isq,ieq+1
529 e(i,j,nz+1) = -1.0*g%bathyT(i,j) - e_tidal(i,j)
533 do j=jsq,jeq+1 ;
do i=isq,ieq+1
534 e(i,j,nz+1) = -1.0*g%bathyT(i,j)
538 do j=jsq,jeq+1;
do k=nz,1,-1 ;
do i=isq,ieq+1
539 e(i,j,k) = e(i,j,k+1) + h(i,j,k)*gv%H_to_m
540 enddo ;
enddo ;
enddo 551 tv_tmp%T => t_tmp ; tv_tmp%S => s_tmp
552 tv_tmp%eqn_of_state => tv%eqn_of_state
554 do i=isq,ieq+1 ; p_ref(i) = tv%P_Ref ;
enddo 558 do k=1,nkmb ;
do i=isq,ieq+1
559 tv_tmp%T(i,j,k) = tv%T(i,j,k) ; tv_tmp%S(i,j,k) = tv%S(i,j,k)
562 rho_cv_bl(:), isq, ieq-isq+2, tv%eqn_of_state)
564 do k=nkmb+1,nz ;
do i=isq,ieq+1
565 if (gv%Rlay(k) < rho_cv_bl(i))
then 566 tv_tmp%T(i,j,k) = tv%T(i,j,nkmb) ; tv_tmp%S(i,j,k) = tv%S(i,j,nkmb)
568 tv_tmp%T(i,j,k) = tv%T(i,j,k) ; tv_tmp%S(i,j,k) = tv%S(i,j,k)
573 tv_tmp%T => tv%T ; tv_tmp%S => tv%S
574 tv_tmp%eqn_of_state => tv%eqn_of_state
581 if (cs%GFS_scale < 1.0)
then 588 rho_in_situ, isq, ieq-isq+2, tv%eqn_of_state)
591 rho_in_situ, isq, ieq-isq+2, tv%eqn_of_state)
594 dm(i,j) = (cs%GFS_scale - 1.0) * (g_rho0 * rho_in_situ(i)) * e(i,j,1)
599 do j=jsq,jeq+1 ;
do i=isq,ieq+1
600 dm(i,j) = (cs%GFS_scale - 1.0) * (g_rho0 * gv%Rlay(1)) * e(i,j,1)
614 call pressure_gradient_plm (ale_csp, s_t, s_b, t_t, t_b, g, gv, tv, h);
616 call pressure_gradient_ppm (ale_csp, s_t, s_b, t_t, t_b, g, gv, tv, h);
628 is_bk=g%Block(n)%isc ; ie_bk=g%Block(n)%iec
629 js_bk=g%Block(n)%jsc ; je_bk=g%Block(n)%jec
630 isq_bk=g%Block(n)%IscB ; ieq_bk=g%Block(n)%IecB
631 jsq_bk=g%Block(n)%JscB ; jeq_bk=g%Block(n)%JecB
632 ioff_bk = g%Block(n)%idg_offset - g%HI%idg_offset
633 joff_bk = g%Block(n)%jdg_offset - g%HI%jdg_offset
639 do jb=jsq_bk,jeq_bk+1 ;
do ib=isq_bk,ieq_bk+1
640 i = ib+ioff_bk ; j = jb+joff_bk
641 pa_bk(ib,jb) = (rho_ref*gv%g_Earth)*e(i,j,1) + p_atm(i,j)
644 do jb=jsq_bk,jeq_bk+1 ;
do ib=isq_bk,ieq_bk+1
645 i = ib+ioff_bk ; j = jb+joff_bk
646 pa_bk(ib,jb) = (rho_ref*gv%g_Earth)*e(i,j,1)
649 do jb=js_bk,je_bk ;
do ib=isq_bk,ieq_bk
650 intx_pa_bk(ib,jb) = 0.5*(pa_bk(ib,jb) + pa_bk(ib+1,jb))
652 do jb=jsq_bk,jeq_bk ;
do ib=is_bk,ie_bk
653 inty_pa_bk(ib,jb) = 0.5*(pa_bk(ib,jb) + pa_bk(ib,jb+1))
668 call int_density_dz_generic_plm ( t_t(:,:,k), t_b(:,:,k), &
669 s_t(:,:,k), s_b(:,:,k), e(:,:,k), e(:,:,k+1), &
670 rho_ref, cs%Rho0, gv%g_Earth, &
671 gv%H_subroundoff, g%bathyT, g%HI, g%Block(n), &
672 tv%eqn_of_state, dpa_bk, intz_dpa_bk, intx_dpa_bk, inty_dpa_bk, &
673 usemasswghtinterp = cs%useMassWghtInterp)
675 call int_density_dz_generic_ppm ( tv%T(:,:,k), t_t(:,:,k), t_b(:,:,k), &
676 tv%S(:,:,k), s_t(:,:,k), s_b(:,:,k), e(:,:,k), e(:,:,k+1), &
677 rho_ref, cs%Rho0, gv%g_Earth, &
678 g%HI, g%Block(n), tv%eqn_of_state, dpa_bk, intz_dpa_bk, &
679 intx_dpa_bk, inty_dpa_bk)
682 call int_density_dz(tv_tmp%T(:,:,k), tv_tmp%S(:,:,k), &
683 e(:,:,k), e(:,:,k+1), &
684 rho_ref, cs%Rho0, gv%g_Earth, g%HI, g%Block(n), tv%eqn_of_state, &
685 dpa_bk, intz_dpa_bk, intx_dpa_bk, inty_dpa_bk )
687 do jb=jsq_bk,jeq_bk+1 ;
do ib=isq_bk,ieq_bk+1
688 intz_dpa_bk(ib,jb) = intz_dpa_bk(ib,jb)*gv%m_to_H
691 do jb=jsq_bk,jeq_bk+1 ;
do ib=isq_bk,ieq_bk+1
692 i = ib+ioff_bk ; j = jb+joff_bk
693 dz_bk(ib,jb) = gv%g_Earth*gv%H_to_m*h(i,j,k)
694 dpa_bk(ib,jb) = (gv%Rlay(k) - rho_ref)*dz_bk(ib,jb)
695 intz_dpa_bk(ib,jb) = 0.5*(gv%Rlay(k) - rho_ref)*dz_bk(ib,jb)*h(i,j,k)
697 do jb=js_bk,je_bk ;
do ib=isq_bk,ieq_bk
698 intx_dpa_bk(ib,jb) = 0.5*(gv%Rlay(k) - rho_ref) * (dz_bk(ib,jb)+dz_bk(ib+1,jb))
700 do jb=jsq_bk,jeq_bk ;
do ib=is_bk,ie_bk
701 inty_dpa_bk(ib,jb) = 0.5*(gv%Rlay(k) - rho_ref) * (dz_bk(ib,jb)+dz_bk(ib,jb+1))
706 do jb=js_bk,je_bk ;
do ib=isq_bk,ieq_bk
707 i = ib+ioff_bk ; j = jb+joff_bk
708 pfu(i,j,k) = (((pa_bk(ib,jb)*h(i,j,k) + intz_dpa_bk(ib,jb)) - &
709 (pa_bk(ib+1,jb)*h(i+1,j,k) + intz_dpa_bk(ib+1,jb))) + &
710 ((h(i+1,j,k) - h(i,j,k)) * intx_pa_bk(ib,jb) - &
711 (e(i+1,j,k+1) - e(i,j,k+1)) * intx_dpa_bk(ib,jb) * gv%m_to_H)) * &
712 ((2.0*i_rho0*g%IdxCu(i,j)) / &
713 ((h(i,j,k) + h(i+1,j,k)) + h_neglect))
714 intx_pa_bk(ib,jb) = intx_pa_bk(ib,jb) + intx_dpa_bk(ib,jb)
717 do jb=jsq_bk,jeq_bk ;
do ib=is_bk,ie_bk
718 i = ib+ioff_bk ; j = jb+joff_bk
719 pfv(i,j,k) = (((pa_bk(ib,jb)*h(i,j,k) + intz_dpa_bk(ib,jb)) - &
720 (pa_bk(ib,jb+1)*h(i,j+1,k) + intz_dpa_bk(ib,jb+1))) + &
721 ((h(i,j+1,k) - h(i,j,k)) * inty_pa_bk(ib,jb) - &
722 (e(i,j+1,k+1) - e(i,j,k+1)) * inty_dpa_bk(ib,jb) * gv%m_to_H)) * &
723 ((2.0*i_rho0*g%IdyCv(i,j)) / &
724 ((h(i,j,k) + h(i,j+1,k)) + h_neglect))
725 inty_pa_bk(ib,jb) = inty_pa_bk(ib,jb) + inty_dpa_bk(ib,jb)
727 do jb=jsq_bk,jeq_bk+1 ;
do ib=isq_bk,ieq_bk+1
728 pa_bk(ib,jb) = pa_bk(ib,jb) + dpa_bk(ib,jb)
732 if (cs%GFS_scale < 1.0)
then 734 do j=js_bk+joff_bk,je_bk+joff_bk ;
do i=isq_bk+ioff_bk,ieq_bk+ioff_bk
735 pfu(i,j,k) = pfu(i,j,k) - (dm(i+1,j) - dm(i,j)) * g%IdxCu(i,j)
737 do j=jsq_bk+joff_bk,jeq_bk+joff_bk ;
do i=is_bk+ioff_bk,ie_bk+ioff_bk
738 pfv(i,j,k) = pfv(i,j,k) - (dm(i,j+1) - dm(i,j)) * g%IdyCv(i,j)
744 if (
present(pbce))
then 745 call set_pbce_bouss(e, tv_tmp, g, gv, gv%g_Earth, cs%Rho0, cs%GFS_scale, pbce)
748 if (
present(eta))
then 754 do j=jsq,jeq+1 ;
do i=isq,ieq+1
755 eta(i,j) = e(i,j,1)*gv%m_to_H + e_tidal(i,j)*gv%m_to_H
759 do j=jsq,jeq+1 ;
do i=isq,ieq+1
760 eta(i,j) = e(i,j,1)*gv%m_to_H
765 if (cs%id_e_tidal>0)
call post_data(cs%id_e_tidal, e_tidal, cs%diag)
771 type(time_type),
target,
intent(in) :: Time
775 type(
diag_ctrl),
target,
intent(inout) :: diag
779 #include "version_variable.h" 780 character(len=40) :: mdl
782 if (
associated(cs))
then 783 call mom_error(warning,
"PressureForce_init called with an associated "// &
784 "control structure.")
786 else ;
allocate(cs) ;
endif 788 cs%diag => diag ; cs%Time => time
789 if (
present(tides_csp))
then 790 if (
associated(tides_csp)) cs%tides_CSp => tides_csp
793 mdl =
"MOM_PressureForce_AFV" 795 call get_param(param_file, mdl,
"RHO_0", cs%Rho0, &
796 "The mean ocean density used with BOUSSINESQ true to \n"//&
797 "calculate accelerations and the mass for conservation \n"//&
798 "properties, or with BOUSSINSEQ false to convert some \n"//&
799 "parameters from vertical units of m to kg m-2.", &
800 units=
"kg m-3", default=1035.0)
801 call get_param(param_file, mdl,
"TIDES", cs%tides, &
802 "If true, apply tidal momentum forcing.", default=.false.)
803 call get_param(param_file, mdl,
"MASS_WEIGHT_IN_PRESSURE_GRADIENT", cs%useMassWghtInterp, &
804 "If true, use mass weighting when interpolation T/S for\n"//&
805 "top/bottom integrals in AFV pressure gradient calculation.", default=.false.)
808 cs%id_e_tidal = register_diag_field(
'ocean_model',
'e_tidal', diag%axesT1, &
809 time,
'Tidal Forcing Astronomical and SAL Height Anomaly',
'meter')
813 if (gv%g_prime(1) /= gv%g_Earth) cs%GFS_scale = gv%g_prime(1) / gv%g_Earth
815 call log_param(param_file, mdl,
"GFS / G_EARTH", cs%GFS_scale)
822 if (
associated(cs))
deallocate(cs)
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...
integer, parameter pressure_reconstruction_ppm
subroutine, public pressureforce_afv_end(CS)
Deallocates the finite volume pressure gradient control structure.
This module contains the main regridding routines. Regridding comprises two steps: (1) Interpolation ...
integer, parameter pressure_reconstruction_plm
logical function, public usepressurereconstruction(CS)
pressure reconstruction logical
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.
Calculates density of sea water from T, S and P.
Provides the ocean grid type.
subroutine, public pressureforce_afv_nonbouss(h, tv, PFu, PFv, G, GV, CS, p_atm, pbce, eta)
Non-Boussinesq analytically-integrated finite volume form of pressure gradient.
Analytically integrated finite volume pressure gradient.
subroutine, public int_density_dz_generic_ppm(T, T_t, T_b, S, S_t, S_b, z_t, z_b, rho_ref, rho_0, G_e, HII, HIO, EOS, dpa, intz_dpa, intx_dpa, inty_dpa)
subroutine, public pressure_gradient_ppm(CS, S_t, S_b, T_t, T_b, G, GV, tv, h)
Use ppm reconstruction for pressure gradient (determine edge values) By using a PPM (limited piecewis...
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.
subroutine, public pressureforce_afv_init(Time, G, GV, param_file, diag, CS, tides_CSp)
Initializes the finite volume pressure gradient control structure.
Finite volume pressure gradient control structure.
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...
integer function, public pressurereconstructionscheme(CS)
pressure reconstruction integer
subroutine, public int_density_dz_generic_plm_analytic(T_t, T_b, S_t, S_b, z_t, z_b, rho_ref, rho_0, G_e, HI, EOS, dpa, intz_dpa, intx_dpa, inty_dpa)
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...
Provides subroutines for quantities specific to the equation of state.
subroutine, public pressureforce_afv_bouss(h, tv, PFu, PFv, G, GV, CS, ALE_CSp, p_atm, pbce, eta)
Boussinesq analytically-integrated finite volume form of pressure gradient.
subroutine, public int_density_dz_generic_plm(T_t, T_b, S_t, S_b, z_t, z_b, rho_ref, rho_0, G_e, H_subroundoff, bathyT, HII, HIO, EOS, dpa, intz_dpa, intx_dpa, inty_dpa, useMassWghtInterp)
The thermo_var_ptrs structure contains pointers to an assortment of thermodynamic fields that may be ...
subroutine, public pressure_gradient_plm(CS, S_t, S_b, T_t, T_b, G, GV, tv, h)
Use plm reconstruction for pressure gradient (determine edge values) By using a PLM (limited piecewis...
subroutine, public pressureforce_afv(h, tv, PFu, PFv, G, GV, CS, ALE_CSp, p_atm, pbce, eta)
Thin interface between the model and the Boussinesq and non-Boussinesq pressure force routines...
subroutine, public mom_error(level, message, all_print)
subroutine, public int_density_dz(T, S, z_t, z_b, rho_ref, rho_0, G_e, HII, HIO, EOS, dpa, intz_dpa, intx_dpa, inty_dpa)
This subroutine calculates analytical and nearly-analytical integrals of pressure anomalies across la...