MODULE dynhpg_jki !!====================================================================== !! *** MODULE dynhpg_jki *** !! Ocean dynamics: hydrostatic pressure gradient trend !!====================================================================== !! History : 9.0 ! 06-09 (G. Madec) From dynhpg module !!---------------------------------------------------------------------- !!---------------------------------------------------------------------- !! hpg_sco_jki : update the momentum trend with the horizontal !! gradient of the hydrostatic pressure (s-coordinate) !! hpg_zps_jki : update the momentum trend with the horizontal !! gradient of the hydrostatic pressure (partial step) !! hpg_zco_jki : update the momentum trend with the horizontal !! gradient of the hydrostatic pressure (z-coordinate) !!---------------------------------------------------------------------- USE oce ! ocean dynamics and tracers USE dom_oce ! ocean space and time domain USE phycst ! physical constants USE in_out_manager ! I/O manager USE lbclnk ! lateral boundary condition IMPLICIT NONE PRIVATE PUBLIC hpg_sco_jki ! routine called by step.F90 PUBLIC hpg_zps_jki ! routine called by step.F90 PUBLIC hpg_zco_jki ! routine called by step.F90 !! * Substitutions # include "domzgr_substitute.h90" # include "vectopt_loop_substitute.h90" !!---------------------------------------------------------------------- !! OPA 9.0 , LOCEAN-IPSL (2005) !! $Header$ !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) !!---------------------------------------------------------------------- CONTAINS SUBROUTINE hpg_sco_jki( kt ) !!--------------------------------------------------------------------- !! *** ROUTINE hpg_sco_jki *** !! !! ** Purpose : Compute the now momentum trend due to the horizontal !! gradient of the hydrostatic pressure. Add it to the general !! momentum trend. !! !! ** Method : The now hydrostatic pressure gradient at a given level !! jk is computed by taking the vertical integral of the in-situ !! density gradient along the model level from the suface to that !! level. s-coordinate case (ln_sco=T): a corrective term is !! added to the horizontal pressure gradient : !! zhpi = grav ..... + 1/e1u mi(rhd) di[ grav dep3w ] !! zhpj = grav ..... + 1/e2v mj(rhd) dj[ grav dep3w ] !! add it to the general momentum trend (ua,va). !! ua = ua - 1/e1u * zhpi !! va = va - 1/e2v * zhpj !! j-k-i loop (j-slab) ('key_mpp_omp') !! !! ** Action : - Update (ua,va) with the now hydrastatic pressure trend !! - Save the trend in (ztrdu,ztrdv) ('key_trddyn') !!---------------------------------------------------------------------- USE oce, ONLY : zhpi => ta ! use ta as 3D workspace USE oce, ONLY : zhpj => sa ! use sa as 3D workspace !! INTEGER, INTENT(in) :: kt ! ocean time-step index !! INTEGER :: ji, jj, jk ! dummy loop indices REAL(wp) :: zcoef0, zuap, zvap ! temporary scalars !!---------------------------------------------------------------------- IF( kt == nit000 ) THEN IF(lwp) WRITE(numout,*) IF(lwp) WRITE(numout,*) 'hpg_sco_jki : s-coordinate hydrostatic pressure gradient trend' IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~ OpenMP / NEC autotasking case (j-k-i loop)' ENDIF ! Local constant initialization zcoef0 = - grav * 0.5 zuap = 0.e0 zvap = 0.e0 ! ! =============== DO jj = 2, jpjm1 ! Vertical slab ! ! =============== DO ji = 2, jpim1 ! Surface value ! hydrostatic pressure gradient along s-surfaces zhpi(ji,jj,1) = zcoef0 / e1u(ji,jj) & * ( fse3w(ji+1,jj,1) * rhd(ji+1,jj,1) - fse3w(ji,jj,1) * rhd(ji,jj,1) ) zhpj(ji,jj,1) = zcoef0 / e2v(ji,jj) & * ( fse3w(ji,jj+1,1) * rhd(ji,jj+1,1) - fse3w(ji,jj,1) * rhd(ji,jj,1) ) ! s-coordinate pressure gradient correction zuap = -zcoef0 * ( rhd(ji+1,jj,1) + rhd(ji,jj,1) ) & * ( fsde3w(ji+1,jj,1) - fsde3w(ji,jj,1) ) / e1u(ji,jj) zvap = -zcoef0 * ( rhd(ji,jj+1,1) + rhd(ji,jj,1) ) & * ( fsde3w(ji,jj+1,1) - fsde3w(ji,jj,1) ) / e2v(ji,jj) ! add to the general momentum trend ua(ji,jj,1) = ua(ji,jj,1) + zhpi(ji,jj,1) + zuap va(ji,jj,1) = va(ji,jj,1) + zhpj(ji,jj,1) + zvap END DO ! DO jk = 2, jpkm1 ! interior value (2= ta ! use ta as 3D workspace USE oce, ONLY : zhpj => sa ! use sa as 3D workspace !! INTEGER, INTENT(in) :: kt ! ocean time-step index !! INTEGER :: ji, jj, jk ! dummy loop indices INTEGER :: iku, ikv ! temporary integers REAL(wp) :: zcoef0, zcoef1, zuap ! temporary scalars REAL(wp) :: zcoef2, zcoef3, zvap ! " " !!---------------------------------------------------------------------- IF( kt == nit000 ) THEN IF(lwp) WRITE(numout,*) IF(lwp) WRITE(numout,*) 'hpg_zps_jki : z-coord. partial steps hydrostatic pressure gradient trend' IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~ OpenMP / NEC autotasking case (j-k-i loop)' ENDIF ! Local constant initialization zcoef0 = - grav * 0.5 zuap = 0.e0 zvap = 0.e0 ! ! =============== DO jj = 2, jpjm1 ! Vertical slab ! ! =============== DO ji = 2, jpim1 ! Surface value zcoef1 = zcoef0 * fse3w(ji,jj,1) ! hydrostatic pressure gradient zhpi(ji,jj,1) = zcoef1 * ( rhd(ji+1,jj,1) - rhd(ji,jj,1) ) / e1u(ji,jj) zhpj(ji,jj,1) = zcoef1 * ( rhd(ji,jj+1,1) - rhd(ji,jj,1) ) / e2v(ji,jj) ! add to the general momentum trend ua(ji,jj,1) = ua(ji,jj,1) + zhpi(ji,jj,1) va(ji,jj,1) = va(ji,jj,1) + zhpj(ji,jj,1) END DO ! DO jk = 2, jpkm1 ! interior value (2= 2 ) THEN ! subtract old value ua(ji,jj,iku) = ua(ji,jj,iku) - zhpi(ji,jj,iku) ! compute the new one zhpi (ji,jj,iku) = zhpi(ji,jj,iku-1) & + zcoef2 * ( rhd(ji+1,jj,iku-1) - rhd(ji,jj,iku-1) + gru(ji,jj) ) / e1u(ji,jj) ! add the new one to the general momentum trend ua(ji,jj,iku) = ua(ji,jj,iku) + zhpi(ji,jj,iku) ENDIF ! on j-direction IF ( ikv > 2 ) THEN ! subtract old value va(ji,jj,ikv) = va(ji,jj,ikv) - zhpj(ji,jj,ikv) ! compute the new one zhpj (ji,jj,ikv) = zhpj(ji,jj,ikv-1) & + zcoef3 * ( rhd(ji,jj+1,ikv-1) - rhd(ji,jj,ikv-1) + grv(ji,jj) ) / e2v(ji,jj) ! add the new one to the general momentum trend va(ji,jj,ikv) = va(ji,jj,ikv) + zhpj(ji,jj,ikv) ENDIF END DO ! ! =============== END DO ! End of slab ! ! =============== END SUBROUTINE hpg_zps_jki SUBROUTINE hpg_zco_jki( kt ) !!--------------------------------------------------------------------- !! *** ROUTINE hpg_zco_jki *** !! !! ** Purpose : Compute the now momentum trend due to the horizontal !! gradient of the hydrostatic pressure. Add it to the general !! momentum trend. !! !! ** Method : The now hydrostatic pressure gradient at a given level !! jk is computed by taking the vertical integral of the in-situ !! density gradient along the model level from the suface to that !! level: zhpi = grav ..... !! zhpj = grav ..... !! add it to the general momentum trend (ua,va). !! ua = ua - 1/e1u * zhpi !! va = va - 1/e2v * zhpj !! j-k-i loop (j-slab) ('key_mpp_omp') !! !! ** Action : - Update (ua,va) with the now hydrastatic pressure trend !! - Save the trend in (ztrdu,ztrdv) ('key_trddyn') !!---------------------------------------------------------------------- USE oce, ONLY : zhpi => ta ! use ta as 3D workspace USE oce, ONLY : zhpj => sa ! use sa as 3D workspace !! INTEGER, INTENT(in) :: kt ! ocean time-step index !! INTEGER :: ji, jj, jk ! dummy loop indices REAL(wp) :: zcoef0, zcoef1, zuap, zvap ! temporary scalars !!---------------------------------------------------------------------- IF( kt == nit000 ) THEN IF(lwp) WRITE(numout,*) IF(lwp) WRITE(numout,*) 'hpg_zco_jki : z-coordinate hydrostatic pressure gradient trend' IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~ OpenMP / NEC auto-tasking (j-k-i loop)' ENDIF ! Local constant initialization zcoef0 = - grav * 0.5 zuap = 0.e0 zvap = 0.e0 ! ! =============== DO jj = 2, jpjm1 ! Vertical slab ! ! =============== DO ji = 2, jpim1 ! Surface value zcoef1 = zcoef0 * fse3w(ji,jj,1) ! hydrostatic pressure gradient zhpi(ji,jj,1) = zcoef1 * ( rhd(ji+1,jj,1) - rhd(ji,jj,1) ) / e1u(ji,jj) zhpj(ji,jj,1) = zcoef1 * ( rhd(ji,jj+1,1) - rhd(ji,jj,1) ) / e2v(ji,jj) ! add to the general momentum trend ua(ji,jj,1) = ua(ji,jj,1) + zhpi(ji,jj,1) va(ji,jj,1) = va(ji,jj,1) + zhpj(ji,jj,1) END DO ! DO jk = 2, jpkm1 ! interior value (2=