Skip to content
Snippets Groups Projects
agrif_oce_interp.F90 81.5 KiB
Newer Older
Guillaume Samson's avatar
Guillaume Samson committed
MODULE agrif_oce_interp
   !!======================================================================
   !!                   ***  MODULE  agrif_oce_interp  ***
   !! AGRIF: interpolation package for the ocean dynamics (OCE)
   !!======================================================================
   !! History :  2.0  !  2002-06  (L. Debreu)  Original cade
   !!            3.2  !  2009-04  (R. Benshila) 
   !!            3.6  !  2014-09  (R. Benshila) 
   !!----------------------------------------------------------------------
#if defined key_agrif
   !!----------------------------------------------------------------------
   !!   'key_agrif'                                              AGRIF zoom
   !!----------------------------------------------------------------------
   !!   Agrif_tra     :
   !!   Agrif_dyn     : 
   !!   Agrif_ssh     :
   !!   Agrif_dyn_ts  :
   !!   Agrif_dta_ts  :
   !!   Agrif_ssh_ts  :
   !!   Agrif_avm     : 
   !!   interpu       :
   !!   interpv       :
   !!----------------------------------------------------------------------
   USE par_oce
   USE oce
   USE dom_oce      
   USE zdf_oce
   USE agrif_oce
   USE phycst
!!!   USE dynspg_ts, ONLY: un_adv, vn_adv
   !
   USE in_out_manager
   USE agrif_oce_sponge
   USE lib_mpp
   USE vremap
   USE lbclnk
 
   IMPLICIT NONE
   PRIVATE

   PUBLIC   Agrif_dyn, Agrif_ssh, Agrif_dyn_ts, Agrif_dyn_ts_flux, Agrif_ssh_ts, Agrif_dta_ts
   PUBLIC   Agrif_tra, Agrif_avm
   PUBLIC   interpun , interpvn
   PUBLIC   interptsn, interpsshn, interpavm
   PUBLIC   interpunb, interpvnb , interpub2b, interpvb2b
   PUBLIC   interpglamt, interpgphit
   PUBLIC   interpht0, interpmbkt, interpe3t0_vremap
   PUBLIC   interp_e1e2t_frac, interp_e2u_frac, interp_e1v_frac
Guillaume Samson's avatar
Guillaume Samson committed
   PUBLIC   agrif_istate_oce, agrif_istate_ssh   ! called by icestate.F90 and domvvl.F90
   PUBLIC   agrif_check_bat

   INTEGER ::   bdy_tinterp = 0

   !! * Substitutions
#  include "domzgr_substitute.h90"
   !! NEMO/NST 4.0 , NEMO Consortium (2018)
   !! $Id: agrif_oce_interp.F90 15119 2021-07-13 14:43:22Z jchanut $
Guillaume Samson's avatar
Guillaume Samson committed
   !! Software governed by the CeCILL license (see ./LICENSE)
   !!----------------------------------------------------------------------
CONTAINS

   SUBROUTINE Agrif_istate_oce( Kbb, Kmm, Kaa )
      !!----------------------------------------------------------------------
      !!                 *** ROUTINE agrif_istate_oce ***
      !!
      !!                 set initial t, s, u, v, ssh from parent
      !!----------------------------------------------------------------------
      !
      IMPLICIT NONE
      !
      INTEGER, INTENT(in)  :: Kbb, Kmm, Kaa
      INTEGER :: jn
      !!----------------------------------------------------------------------
      IF(lwp) WRITE(numout,*) ' '
      IF(lwp) WRITE(numout,*) 'Agrif_istate_oce : interp child initial state from parent'
      IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~~~~~'
      IF(lwp) WRITE(numout,*) ' '

      IF ( .NOT.Agrif_Parent(l_1st_euler) ) & 
         & CALL ctl_stop('AGRIF hot start requires to force Euler first step on parent')

      l_ini_child           = .TRUE.
      Agrif_SpecialValue    = 0.0_wp
      Agrif_UseSpecialValue = .TRUE.
Guillaume Samson's avatar
Guillaume Samson committed

      ts(:,:,:,:,Kbb) = 0.0_wp
      uu(:,:,:,Kbb)   = 0.0_wp
      vv(:,:,:,Kbb)   = 0.0_wp 
       
      Krhs_a = Kbb   ;   Kmm_a = Kbb

      CALL Agrif_Init_Variable(tsini_id, procname=interptsn)

      Agrif_UseSpecialValue = ln_spc_dyn
      use_sign_north = .TRUE.
      sign_north = -1._wp
      CALL Agrif_Init_Variable(uini_id , procname=interpun )
      CALL Agrif_Init_Variable(vini_id , procname=interpvn )
      use_sign_north = .FALSE.

      Agrif_UseSpecialValue = .FALSE.
      l_ini_child           = .FALSE.
Guillaume Samson's avatar
Guillaume Samson committed

      Krhs_a = Kaa   ;   Kmm_a = Kmm

      DO jn = 1, jpts
         ts(:,:,:,jn,Kbb) = ts(:,:,:,jn,Kbb) * tmask(:,:,:)
      END DO
      uu(:,:,:,Kbb) = uu(:,:,:,Kbb) * umask(:,:,:)     
      vv(:,:,:,Kbb) = vv(:,:,:,Kbb) * vmask(:,:,:) 

      CALL lbc_lnk( 'agrif_istate_oce', uu(:,:,:  ,Kbb), 'U', -1.0_wp , vv(:,:,:,Kbb), 'V', -1.0_wp )
      CALL lbc_lnk( 'agrif_istate_oce', ts(:,:,:,:,Kbb), 'T',  1.0_wp )

   END SUBROUTINE Agrif_istate_oce


   SUBROUTINE Agrif_istate_ssh( Kbb, Kmm, Kaa, ghosts_only )
Guillaume Samson's avatar
Guillaume Samson committed
      !!----------------------------------------------------------------------
      !!                 *** ROUTINE agrif_istate_ssh ***
      !!
      !!                    set initial ssh from parent
      !!----------------------------------------------------------------------
      !
      IMPLICIT NONE
      !
      INTEGER, INTENT(in)  :: Kbb, Kmm, Kaa 
      LOGICAL, INTENT(in), OPTIONAL :: ghosts_only
      LOGICAL :: l_do_all
Guillaume Samson's avatar
Guillaume Samson committed
      !!----------------------------------------------------------------------
      IF(lwp) WRITE(numout,*) ' '
      IF(lwp) WRITE(numout,*) 'Agrif_istate_ssh : interp child ssh from parent'
      IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~~~~~'
      IF(lwp) WRITE(numout,*) ' '

      IF ( .NOT.Agrif_Parent(l_1st_euler) ) & 
         & CALL ctl_stop('AGRIF hot start requires to force Euler first step on parent')

      l_do_all = .TRUE.
      IF (present(ghosts_only)) l_do_all = .FALSE.

Guillaume Samson's avatar
Guillaume Samson committed
      Krhs_a = Kbb   ;   Kmm_a = Kbb
      !
      Agrif_SpecialValue    = 0._wp
      Agrif_UseSpecialValue = .TRUE.
      l_ini_child           = .TRUE.
      !
      IF (l_do_all) THEN
         CALL Agrif_Init_Variable(sshini_id, procname=interpsshn)
      ELSE
         CALL Agrif_Bc_Variable(sshini_id, calledweight=1._wp, procname=interpsshn)
      ENDIF
Guillaume Samson's avatar
Guillaume Samson committed
      !
      Agrif_UseSpecialValue = .FALSE.
      l_ini_child           = .FALSE.
      !
      Krhs_a = Kaa   ;   Kmm_a = Kmm
      !
      CALL lbc_lnk( 'Agrif_istate_ssh', ssh(:,:,Kbb), 'T', 1._wp )
      !
      ssh(:,:,Kmm) = ssh(:,:,Kbb)
      ssh(:,:,Kaa) = 0._wp

   END SUBROUTINE Agrif_istate_ssh


   SUBROUTINE Agrif_tra
      !!----------------------------------------------------------------------
      !!                  ***  ROUTINE Agrif_tra  ***
      !!----------------------------------------------------------------------
      !
      IF( Agrif_Root() )   RETURN
      !
      Agrif_SpecialValue    = 0._wp
      Agrif_UseSpecialValue = l_spc_tra
Guillaume Samson's avatar
Guillaume Samson committed
      l_vremap 		    = ln_vert_remap
      !
      CALL Agrif_Bc_variable( ts_interp_id, procname=interptsn )
      !
      Agrif_UseSpecialValue = .FALSE.
      l_vremap              = .FALSE.
      !
   END SUBROUTINE Agrif_tra


   SUBROUTINE Agrif_dyn( kt )
      !!----------------------------------------------------------------------
      !!                  ***  ROUTINE Agrif_DYN  ***
      !!----------------------------------------------------------------------  
      INTEGER, INTENT(in) ::   kt
      !
      INTEGER  ::   ji, jj, jk       ! dummy loop indices
      INTEGER  ::   ibdy1, jbdy1, ibdy2, jbdy2
      REAL(wp) ::   zflag  
Guillaume Samson's avatar
Guillaume Samson committed
      REAL(wp), DIMENSION(jpi,jpj) ::   zub, zvb
      REAL(wp), DIMENSION(jpi,jpj) ::   zhub, zhvb
Guillaume Samson's avatar
Guillaume Samson committed
      !!----------------------------------------------------------------------  
Loading
Loading full blame...