Skip to content
Snippets Groups Projects
agrif_oce_update.F90 54.2 KiB
Newer Older
Guillaume Samson's avatar
Guillaume Samson committed
#undef DECAL_FEEDBACK    /* SEPARATION of INTERFACES */
#undef DECAL_FEEDBACK_2D  /* SEPARATION of INTERFACES (Barotropic mode) */
#undef VOL_REFLUX         /* VOLUME REFLUXING*/
 
MODULE agrif_oce_update
   !!======================================================================
   !!                   ***  MODULE  agrif_oce_interp  ***
   !! AGRIF: update package for the ocean dynamics (OCE)
   !!======================================================================
   !! History :  2.0  !  2002-06  (L. Debreu)  Original code
   !!            3.2  !  2009-04  (R. Benshila) 
   !!            3.6  !  2014-09  (R. Benshila) 
   !!----------------------------------------------------------------------
#if defined key_agrif 
   !!----------------------------------------------------------------------
   !!   'key_agrif'                                              AGRIF zoom
   !!----------------------------------------------------------------------
   USE par_oce
   USE oce
   USE dom_oce
   USE zdf_oce        ! vertical physics: ocean variables 
   USE agrif_oce
   USE dom_oce
   !
   USE in_out_manager ! I/O manager
   USE lib_mpp        ! MPP library
   USE domvvl         ! Need interpolation routines 
   USE vremap         ! Vertical remapping
   USE lbclnk 
#if defined key_qco
   USE domqco
#endif
   IMPLICIT NONE
   PRIVATE

   PUBLIC   Agrif_Update_Tra, Agrif_Update_Dyn, Agrif_Update_vvl, Agrif_Update_ssh
   PUBLIC   Update_Scales, Agrif_Check_parent_bat

   !! * Substitutions
#  include "domzgr_substitute.h90"
   !!----------------------------------------------------------------------
   !! NEMO/NST 4.0 , NEMO Consortium (2018)
   !! $Id: agrif_oce_update.F90 15317 2021-10-01 16:09:36Z jchanut $
   !! Software governed by the CeCILL license (see ./LICENSE)
   !!----------------------------------------------------------------------
CONTAINS

   SUBROUTINE Agrif_Update_Tra( )
      !!----------------------------------------------------------------------
      !!                   *** ROUTINE Agrif_Update_Tra ***
      !!----------------------------------------------------------------------
      ! 
      IF (Agrif_Root()) RETURN
      !
      IF (lwp.AND.lk_agrif_debug) Write(*,*) 'Update tracers  from grid Number',Agrif_Fixed()

      l_vremap                      = ln_vert_remap
      Agrif_UseSpecialValueInUpdate = .NOT.l_vremap
      Agrif_SpecialValueFineGrid    = 0._wp
      ! 
# if ! defined DECAL_FEEDBACK
      CALL Agrif_Update_Variable(ts_update_id, procname=updateTS)
! near boundary update:
!      CALL Agrif_Update_Variable(ts_update_id,locupdate=(/0,2/), procname=updateTS)
# else
      CALL Agrif_Update_Variable(ts_update_id, locupdate=(/1,0/),procname=updateTS)
! near boundary update:
!      CALL Agrif_Update_Variable(ts_update_id,locupdate=(/1,2/), procname=updateTS)
# endif
      !
      Agrif_UseSpecialValueInUpdate = .FALSE.
      l_vremap                      = .FALSE.
      !
      !
   END SUBROUTINE Agrif_Update_Tra

   SUBROUTINE Agrif_Update_Dyn( )
      !!----------------------------------------------------------------------
      !!                   *** ROUTINE Agrif_Update_Dyn ***
      !!----------------------------------------------------------------------
      ! 
      IF (Agrif_Root()) RETURN
      !
      IF (lwp.AND.lk_agrif_debug) Write(*,*) 'Update momentum from grid Number',Agrif_Fixed()

      Agrif_UseSpecialValueInUpdate = .FALSE.
      Agrif_SpecialValueFineGrid    = 0._wp
      l_vremap                      = ln_vert_remap
      use_sign_north                = .TRUE.
      sign_north                    = -1._wp     
!
# if ! defined DECAL_FEEDBACK_2D
      CALL Agrif_Update_Variable(unb_update_id,locupdate1=(/  nn_shift_bar,-2/),locupdate2=(/  nn_shift_bar,-2/),procname = updateU2d)
      CALL Agrif_Update_Variable(vnb_update_id,locupdate1=(/  nn_shift_bar,-2/),locupdate2=(/  nn_shift_bar,-2/),procname = updateV2d)
# else
      CALL Agrif_Update_Variable(unb_update_id,locupdate1=(/  nn_shift_bar,-2/),locupdate2=(/1+nn_shift_bar,-2/),procname = updateU2d)
      CALL Agrif_Update_Variable(vnb_update_id,locupdate1=(/1+nn_shift_bar,-2/),locupdate2=(/  nn_shift_bar,-2/),procname = updateV2d)  
# endif
      ! 
      IF ( ln_dynspg_ts .AND. ln_bt_fw ) THEN
         ! Update time integrated transports
#  if ! defined DECAL_FEEDBACK_2D
         CALL Agrif_Update_Variable(ub2b_update_id,locupdate1=(/  nn_shift_bar,-2/),locupdate2=(/  nn_shift_bar,-2/),procname = updateub2b)
         CALL Agrif_Update_Variable(vb2b_update_id,locupdate1=(/  nn_shift_bar,-2/),locupdate2=(/  nn_shift_bar,-2/),procname = updatevb2b)
#  else
         CALL Agrif_Update_Variable(ub2b_update_id,locupdate1=(/  nn_shift_bar,-2/),locupdate2=(/1+nn_shift_bar,-2/),procname = updateub2b)
         CALL Agrif_Update_Variable(vb2b_update_id,locupdate1=(/1+nn_shift_bar,-2/),locupdate2=(/  nn_shift_bar,-2/),procname = updatevb2b)
#  endif
      END IF

# if ! defined DECAL_FEEDBACK
      CALL Agrif_Update_Variable(un_update_id,procname = updateU)
      CALL Agrif_Update_Variable(vn_update_id,procname = updateV)
! near boundary update:
!      CALL Agrif_Update_Variable(un_update_id,locupdate=(/0,1/),procname = updateU)
!      CALL Agrif_Update_Variable(vn_update_id,locupdate=(/0,1/),procname = updateV)
# else
      CALL Agrif_Update_Variable(un_update_id,locupdate1=(/0,-1/),locupdate2=(/1,-2/),procname = updateU)
      CALL Agrif_Update_Variable(vn_update_id,locupdate1=(/1,-2/),locupdate2=(/0,-1/),procname = updateV)
! near boundary update:
!      CALL Agrif_Update_Variable(un_update_id,locupdate1=(/0,1/),locupdate2=(/1,1/),procname = updateU)
!      CALL Agrif_Update_Variable(vn_update_id,locupdate1=(/1,1/),locupdate2=(/0,1/),procname = updateV)
# endif
      !
      use_sign_north = .FALSE.
      l_vremap = .FALSE.
      !
   END SUBROUTINE Agrif_Update_Dyn

   SUBROUTINE Agrif_Update_ssh( )
      !!---------------------------------------------
      !!   *** ROUTINE Agrif_Update_ssh ***
      !!---------------------------------------------
      ! 
      IF (Agrif_Root()) RETURN
      !
      l_vremap = ln_vert_remap
      Agrif_UseSpecialValueInUpdate = .NOT.l_vremap 
      Agrif_SpecialValueFineGrid = 0._wp
# if ! defined DECAL_FEEDBACK_2D
      CALL Agrif_Update_Variable(sshn_id,locupdate=(/  nn_shift_bar,-2/), procname = updateSSH) 
# else
      CALL Agrif_Update_Variable(sshn_id,locupdate=(/1+nn_shift_bar,-2/),procname = updateSSH)
# endif
      !
      Agrif_UseSpecialValueInUpdate = .FALSE.
      l_vremap = .FALSE.
      !
#  if defined VOL_REFLUX
      IF ( ln_dynspg_ts.AND.ln_bt_fw ) THEN 
         use_sign_north = .TRUE.
         sign_north = -1._wp
         ! Refluxing on ssh:
#  if defined DECAL_FEEDBACK_2D
         CALL Agrif_Update_Variable(ub2b_update_id,locupdate1=(/nn_shift_bar,nn_shift_bar/),locupdate2=(/1+nn_shift_bar,1+nn_shift_bar/),procname = reflux_sshu)
         CALL Agrif_Update_Variable(vb2b_update_id,locupdate1=(/1+nn_shift_bar,1+nn_shift_bar/),locupdate2=(/nn_shift_bar,nn_shift_bar/),procname = reflux_sshv)
#  else
         CALL Agrif_Update_Variable(ub2b_update_id,locupdate1=(/-1+nn_shift_bar,-1+nn_shift_bar/),locupdate2=(/nn_shift_bar, nn_shift_bar/),procname = reflux_sshu)
         CALL Agrif_Update_Variable(vb2b_update_id,locupdate1=(/ nn_shift_bar, nn_shift_bar/),locupdate2=(/-1+nn_shift_bar,-1+nn_shift_bar/),procname = reflux_sshv)
#  endif
         use_sign_north = .FALSE.
      END IF
#  endif
      !
   END SUBROUTINE Agrif_Update_ssh


   SUBROUTINE Agrif_Update_Tke( )
      !!---------------------------------------------
      !!   *** ROUTINE Agrif_Update_Tke ***
      !!---------------------------------------------
      !!
      ! 
      IF (Agrif_Root()) RETURN
      !       
      Agrif_UseSpecialValueInUpdate = .TRUE.
      Agrif_SpecialValueFineGrid = 0._wp

      CALL Agrif_Update_Variable( en_id, locupdate=(/0,0/), procname=updateEN  )
      CALL Agrif_Update_Variable(avt_id, locupdate=(/0,0/), procname=updateAVT )
      CALL Agrif_Update_Variable(avm_id, locupdate=(/0,0/), procname=updateAVM )

      Agrif_UseSpecialValueInUpdate = .FALSE.
      
   END SUBROUTINE Agrif_Update_Tke

   SUBROUTINE Agrif_Update_vvl( )
      !!---------------------------------------------
      !!   *** ROUTINE Agrif_Update_vvl ***
      !!---------------------------------------------
      !
      IF (Agrif_Root()) RETURN
      !
      IF (lwp.AND.lk_agrif_debug) Write(*,*) 'Update e3 from grid Number',Agrif_Fixed(), 'Step', Agrif_Nb_Step()
      !
#if defined key_qco
      CALL Agrif_ChildGrid_To_ParentGrid()
      CALL Agrif_Update_qco
      CALL Agrif_ParentGrid_To_ChildGrid()
#elif defined key_linssh
Loading
Loading full blame...