Skip to content
Snippets Groups Projects
agrif_oce_update.F90 79.9 KiB
Newer Older
Guillaume Samson's avatar
Guillaume Samson committed
         !
         za1 = 1._wp / REAL(Agrif_rhot(), wp)
         DO jj=j1,j2
            DO ji=i1,i2
               zcor=tabres(ji,jj) - ub2_b(ji,jj)
               ! Update time integrated fluxes also in case of multiply nested grids:
               ub2_i_b(ji,jj) = ub2_i_b(ji,jj) + za1 * zcor 
               ! Update corrective fluxes:
               IF (.NOT.(lk_agrif_fstep.AND.(l_1st_euler))) un_bf(ji,jj)  = un_bf(ji,jj) + zcor
               ! Update half step back fluxes:
               ub2_b(ji,jj) = tabres(ji,jj)
            END DO
         END DO
      ENDIF
      !
   END SUBROUTINE updateub2b

   SUBROUTINE reflux_sshu( tabres, i1, i2, j1, j2, before, nb, ndir )
      !!---------------------------------------------
      !!          *** ROUTINE reflux_sshu ***
      !!---------------------------------------------
      INTEGER, INTENT(in) :: i1, i2, j1, j2
      REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) :: tabres
      LOGICAL, INTENT(in) :: before
      INTEGER, INTENT(in) :: nb, ndir
      !!
      LOGICAL :: western_side, eastern_side 
      INTEGER :: ji, jj
Guillaume Samson's avatar
Guillaume Samson committed
      !!---------------------------------------------
      !
      IF (before) THEN
         DO jj=j1,j2
            DO ji=i1,i2
               tabres(ji,jj) = ub2_i_b(ji,jj) * e2u_frac(ji,jj)
Guillaume Samson's avatar
Guillaume Samson committed
            END DO
         END DO
      ELSE
         !
         western_side  = (nb == 1).AND.(ndir == 1)
         eastern_side  = (nb == 1).AND.(ndir == 2)
         !
         IF (western_side) THEN
            DO jj=j1,j2
               zcor = rn_Dt * r1_e1e2t(i1  ,jj) * e2u(i1,jj) * (ub2_b(i1,jj)-tabres(i1,jj)) 
               ssh(i1  ,jj,Kmm_a) = ssh(i1  ,jj,Kmm_a) + zcor
               IF (.NOT.(lk_agrif_fstep.AND.(l_1st_euler))) ssh(i1  ,jj,Kbb_a) = ssh(i1  ,jj,Kbb_a) + rn_atfp * zcor
            END DO
         ENDIF
         IF (eastern_side) THEN
            DO jj=j1,j2
               zcor = - rn_Dt * r1_e1e2t(i2+1,jj) * e2u(i2,jj) * (ub2_b(i2,jj)-tabres(i2,jj))
               ssh(i2+1,jj,Kmm_a) = ssh(i2+1,jj,Kmm_a) + zcor
               IF (.NOT.(lk_agrif_fstep.AND.(l_1st_euler))) ssh(i2+1,jj,Kbb_a) = ssh(i2+1,jj,Kbb_a) + rn_atfp * zcor
            END DO
         ENDIF
         !
      ENDIF
      !
   END SUBROUTINE reflux_sshu

   SUBROUTINE updatevb2b( tabres, i1, i2, j1, j2, before )
      !!----------------------------------------------------------------------
      !!                      *** ROUTINE updatevb2b ***
      !!----------------------------------------------------------------------
      INTEGER                         , INTENT(in   ) ::   i1, i2, j1, j2
      REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) ::   tabres
      LOGICAL                         , INTENT(in   ) ::   before
      !!
      INTEGER :: ji, jj
Guillaume Samson's avatar
Guillaume Samson committed
      !!---------------------------------------------
      !
      IF( before ) THEN
         DO jj=j1,j2
            DO ji=i1,i2
               tabres(ji,jj) = vb2_i_b(ji,jj) * e1v_frac(ji,jj) 
Guillaume Samson's avatar
Guillaume Samson committed
            END DO
         END DO
      ELSE
         !
         za1 = 1._wp / REAL(Agrif_rhot(), wp)
         DO jj=j1,j2
            DO ji=i1,i2
               zcor=tabres(ji,jj) - vb2_b(ji,jj)
               ! Update time integrated fluxes also in case of multiply nested grids:
               vb2_i_b(ji,jj) = vb2_i_b(ji,jj) + za1 * zcor 
               ! Update corrective fluxes:
               IF (.NOT.(lk_agrif_fstep.AND.(l_1st_euler)))  vn_bf(ji,jj)  = vn_bf(ji,jj) + zcor
               ! Update half step back fluxes:
               vb2_b(ji,jj) = tabres(ji,jj)
            END DO
         END DO
      ENDIF
      !
   END SUBROUTINE updatevb2b

   SUBROUTINE reflux_sshv( tabres, i1, i2, j1, j2, before, nb, ndir )
      !!---------------------------------------------
      !!          *** ROUTINE reflux_sshv ***
      !!---------------------------------------------
      INTEGER, INTENT(in) :: i1, i2, j1, j2
      REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) :: tabres
      LOGICAL, INTENT(in) :: before
      INTEGER, INTENT(in) :: nb, ndir
      !!
      LOGICAL :: southern_side, northern_side 
      INTEGER :: ji, jj
Guillaume Samson's avatar
Guillaume Samson committed
      !!---------------------------------------------
      !
      IF (before) THEN
         DO jj=j1,j2
            DO ji=i1,i2
               tabres(ji,jj) = vb2_i_b(ji,jj) * e1v_frac(ji,jj) 
Guillaume Samson's avatar
Guillaume Samson committed
            END DO
         END DO
      ELSE
         !
         southern_side = (nb == 2).AND.(ndir == 1)
         northern_side = (nb == 2).AND.(ndir == 2)
         !
         IF (southern_side) THEN
            DO ji=i1,i2
               zcor = rn_Dt * r1_e1e2t(ji,j1  ) * e1v(ji,j1  ) * (vb2_b(ji,j1)-tabres(ji,j1))
               ssh(ji,j1  ,Kmm_a) = ssh(ji,j1  ,Kmm_a) + zcor
               IF (.NOT.(lk_agrif_fstep.AND.(l_1st_euler))) ssh(ji,j1  ,Kbb_a) = ssh(ji,j1,Kbb_a) + rn_atfp * zcor
            END DO
         ENDIF
         IF (northern_side) THEN               
            DO ji=i1,i2
               zcor = - rn_Dt * r1_e1e2t(ji,j2+1) * e1v(ji,j2  ) * (vb2_b(ji,j2)-tabres(ji,j2))
               ssh(ji,j2+1,Kmm_a) = ssh(ji,j2+1,Kmm_a) + zcor
               IF (.NOT.(lk_agrif_fstep.AND.(l_1st_euler))) ssh(ji,j2+1,Kbb_a) = ssh(ji,j2+1,Kbb_a) + rn_atfp * zcor
            END DO
         ENDIF
         ! 
      ENDIF
      !
   END SUBROUTINE reflux_sshv


   SUBROUTINE updateEN( ptab, i1, i2, j1, j2, k1, k2, before )
      !!----------------------------------------------------------------------
      !!                      *** ROUTINE updateen ***
      !!----------------------------------------------------------------------
      INTEGER                               , INTENT(in   ) ::   i1, i2, j1, j2, k1, k2
      REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) ::   ptab
      LOGICAL                               , INTENT(in   ) ::   before
      !!----------------------------------------------------------------------
      !
      IF( before ) THEN
         ptab (i1:i2,j1:j2,k1:k2) = en(i1:i2,j1:j2,k1:k2)
      ELSE
         en(i1:i2,j1:j2,k1:k2) = ptab (i1:i2,j1:j2,k1:k2) 
      ENDIF
      !
   END SUBROUTINE updateEN


   SUBROUTINE updateAVT( ptab, i1, i2, j1, j2, k1, k2, before )
      !!----------------------------------------------------------------------
      !!                      *** ROUTINE updateavt ***
      !!----------------------------------------------------------------------
      INTEGER                               , INTENT(in   ) ::   i1, i2, j1, j2, k1, k2
      REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) ::   ptab
      LOGICAL                               , INTENT(in   ) ::   before
      !!----------------------------------------------------------------------
      !
      IF( before ) THEN   ;   ptab (i1:i2,j1:j2,k1:k2) = avt_k(i1:i2,j1:j2,k1:k2)
      ELSE                ;   avt_k(i1:i2,j1:j2,k1:k2) = ptab (i1:i2,j1:j2,k1:k2) 
      ENDIF
      !
   END SUBROUTINE updateAVT


   SUBROUTINE updateAVM( ptab, i1, i2, j1, j2, k1, k2, before )
      !!---------------------------------------------
      !!           *** ROUTINE updateavm ***
      !!----------------------------------------------------------------------
      INTEGER                               , INTENT(in   ) ::   i1, i2, j1, j2, k1, k2
      REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) ::   ptab
      LOGICAL                               , INTENT(in   ) ::   before
      !!----------------------------------------------------------------------
      !
      IF( before ) THEN   ;   ptab (i1:i2,j1:j2,k1:k2) = avm_k(i1:i2,j1:j2,k1:k2)
      ELSE                ;   avm_k(i1:i2,j1:j2,k1:k2) = ptab (i1:i2,j1:j2,k1:k2) 
      ENDIF
      !
   END SUBROUTINE updateAVM

#if ! defined key_qco   &&   ! defined key_linssh
   SUBROUTINE update_e3t(tabres, i1, i2, j1, j2, k1, k2, before )
Guillaume Samson's avatar
Guillaume Samson committed
      !!---------------------------------------------
Guillaume Samson's avatar
Guillaume Samson committed
      !!---------------------------------------------
      REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) :: tabres 
      INTEGER                               , INTENT(in   ) :: i1, i2, j1, j2, k1, k2
      LOGICAL                               , INTENT(in   ) :: before
Guillaume Samson's avatar
Guillaume Samson committed
      !
Guillaume Samson's avatar
Guillaume Samson committed
      REAL(wp) :: zcoef
      REAL(wp), DIMENSION(i1:i2,j1:j2,1:jpk) :: tabres_child
Guillaume Samson's avatar
Guillaume Samson committed
      !!---------------------------------------------
      !
      IF ( before ) THEN
         tabres(i1:i2,j1:j2,k2) = 0._wp
         IF ( .NOT.l_vremap ) THEN 
            DO jk = k1, k2-1 
               tabres(i1:i2,j1:j2,jk) = e1e2t_frac(i1:i2,j1:j2)          & 
                                      &      * e3t(i1:i2,j1:j2,jk,Kmm_a) & 
                                      &    * tmask(i1:i2,j1:j2,jk) 
            END DO
         ENDIF
      ELSE 
Guillaume Samson's avatar
Guillaume Samson committed
         !
         IF ( .NOT.l_vremap ) THEN ! Update e3t from parent thicknesses
            tabres_child(i1:i2,j1:j2,1:jpk) =  e3t_0(i1:i2,j1:j2,1:jpk)
            WHERE( tmask(i1:i2,j1:j2,k1:k2) /= 0._wp ) 
               tabres_child(i1:i2,j1:j2,k1:k2) = tabres(i1:i2,j1:j2,k1:k2)
            ENDWHERE
         ELSE                      ! Update e3t from ssh
            DO jk = 1, jpkm1
               tabres_child(i1:i2,j1:j2,jk) = e3t_0(i1:i2,j1:j2,jk) &  
                * (1._wp + ssh(i1:i2,j1:j2,Kmm_a)*r1_ht_0(i1:i2,j1:j2))
Guillaume Samson's avatar
Guillaume Samson committed
            END DO
Guillaume Samson's avatar
Guillaume Samson committed
         !
         ! 1) Updates at BEFORE time step:
         ! -------------------------------
         !
         ! Save "old" scale factor (prior update) for subsequent asselin correction
         ! of prognostic variables
         e3t(i1:i2,j1:j2,1:jpkm1,Krhs_a) = e3t(i1:i2,j1:j2,1:jpkm1,Kmm_a)

         IF (.NOT.(lk_agrif_fstep.AND.(l_1st_euler) )) THEN
            DO jk = 1, jpkm1
               DO jj=j1,j2
                  DO ji=i1,i2
                     e3t(ji,jj,jk,Kbb_a) =  e3t(ji,jj,jk,Kbb_a) &
                           & + rn_atfp * ( tabres_child(ji,jj,jk) - e3t(ji,jj,jk,Kmm_a) )
Guillaume Samson's avatar
Guillaume Samson committed
                  END DO
               END DO
            END DO
            !
            e3w  (i1:i2,j1:j2,1,Kbb_a) = e3w_0(i1:i2,j1:j2,1) + e3t(i1:i2,j1:j2,1,Kbb_a) - e3t_0(i1:i2,j1:j2,1)
            gdepw(i1:i2,j1:j2,1,Kbb_a) = 0.0_wp
            gdept(i1:i2,j1:j2,1,Kbb_a) = 0.5_wp * e3w(i1:i2,j1:j2,1,Kbb_a)
            !
Guillaume Samson's avatar
Guillaume Samson committed
               DO jj = j1,j2
                  DO ji = i1,i2            
                     zcoef = (tmask(ji,jj,jk) - wmask(ji,jj,jk))
                     e3w(ji,jj,jk,Kbb_a)  = e3w_0(ji,jj,jk) + ( 1.0_wp - 0.5_wp * tmask(ji,jj,jk) ) *        & 
                     &                                        ( e3t(ji,jj,jk-1,Kbb_a) - e3t_0(ji,jj,jk-1) )  &
                     &                                  +            0.5_wp * tmask(ji,jj,jk)   *        &
                     &                                        ( e3t(ji,jj,jk  ,Kbb_a) - e3t_0(ji,jj,jk  ) )
                     gdepw(ji,jj,jk,Kbb_a) = gdepw(ji,jj,jk-1,Kbb_a) + e3t(ji,jj,jk-1,Kbb_a)
                     gdept(ji,jj,jk,Kbb_a) =      zcoef  * ( gdepw(ji,jj,jk  ,Kbb_a) + 0.5_wp * e3w(ji,jj,jk,Kbb_a))  &
                         &               + (1-zcoef) * ( gdept(ji,jj,jk-1,Kbb_a) +       e3w(ji,jj,jk,Kbb_a)) 
                  END DO
               END DO
            END DO
            !
         ENDIF        
         !
         ! 2) Updates at NOW time step:
         ! ----------------------------
         !
         ! Update vertical scale factor at T-points:
         e3t(i1:i2,j1:j2,1:jpkm1,Kmm_a) = tabres_child(i1:i2,j1:j2,1:jpkm1)
Guillaume Samson's avatar
Guillaume Samson committed
         !
         ! Update total depth:
         ht(i1:i2,j1:j2) = 0._wp
         DO jk = 1, jpkm1
            ht(i1:i2,j1:j2) = ht(i1:i2,j1:j2) + e3t(i1:i2,j1:j2,jk,Kmm_a) * tmask(i1:i2,j1:j2,jk)
         END DO
         !
         ! Update vertical scale factor at W-points and depths:
         e3w (i1:i2,j1:j2,1,Kmm_a) = e3w_0(i1:i2,j1:j2,1) + e3t(i1:i2,j1:j2,1,Kmm_a) - e3t_0(i1:i2,j1:j2,1)
         gdept(i1:i2,j1:j2,1,Kmm_a) = 0.5_wp * e3w(i1:i2,j1:j2,1,Kmm_a)
         gdepw(i1:i2,j1:j2,1,Kmm_a) = 0.0_wp
         gde3w(i1:i2,j1:j2,1) = gdept(i1:i2,j1:j2,1,Kmm_a) - (ht(i1:i2,j1:j2)-ht_0(i1:i2,j1:j2)) ! Last term in the rhs is ssh
         !
Guillaume Samson's avatar
Guillaume Samson committed
            DO jj = j1,j2
               DO ji = i1,i2            
               zcoef = (tmask(ji,jj,jk) - wmask(ji,jj,jk))
               e3w(ji,jj,jk,Kmm_a)  = e3w_0(ji,jj,jk) + ( 1.0_wp - 0.5_wp * tmask(ji,jj,jk) ) * ( e3t(ji,jj,jk-1,Kmm_a) - e3t_0(ji,jj,jk-1) )   &
               &                                  +            0.5_wp * tmask(ji,jj,jk)   * ( e3t(ji,jj,jk  ,Kmm_a) - e3t_0(ji,jj,jk  ) )
               gdepw(ji,jj,jk,Kmm_a) = gdepw(ji,jj,jk-1,Kmm_a) + e3t(ji,jj,jk-1,Kmm_a)
               gdept(ji,jj,jk,Kmm_a) =      zcoef  * ( gdepw(ji,jj,jk  ,Kmm_a) + 0.5_wp * e3w(ji,jj,jk,Kmm_a))  &
                   &               + (1-zcoef) * ( gdept(ji,jj,jk-1,Kmm_a) +       e3w(ji,jj,jk,Kmm_a)) 
               gde3w(ji,jj,jk) = gdept(ji,jj,jk,Kmm_a) - (ht(ji,jj)-ht_0(ji,jj)) ! Last term in the rhs is ssh
               END DO
            END DO
         END DO
         !
         IF  ((l_1st_euler).AND.(Agrif_Nb_Step()==0) ) THEN
            e3t (i1:i2,j1:j2,1:jpkm1,Kbb_a)  = e3t (i1:i2,j1:j2,1:jpkm1,Kmm_a)
            e3w (i1:i2,j1:j2,1:jpkm1,Kbb_a)  = e3w (i1:i2,j1:j2,1:jpkm1,Kmm_a)
            gdepw(i1:i2,j1:j2,1:jpkm1,Kbb_a) = gdepw(i1:i2,j1:j2,1:jpkm1,Kmm_a)
            gdept(i1:i2,j1:j2,1:jpkm1,Kbb_a) = gdept(i1:i2,j1:j2,1:jpkm1,Kmm_a)
         ENDIF
         !
      ENDIF
      !
   END SUBROUTINE update_e3t


   SUBROUTINE update_e3u(tabres, i1, i2, j1, j2, k1, k2, before )
      !!---------------------------------------------
      !!           *** ROUTINE update_e3u ***
      !!---------------------------------------------
      REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) :: tabres 
      INTEGER                               , INTENT(in   ) :: i1, i2, j1, j2, k1, k2
      LOGICAL                               , INTENT(in   ) :: before
      !
      INTEGER :: ji, jj, jk
      REAL(wp), DIMENSION(i1:i2,j1:j2,1:jpk) :: tabres_child
      !!---------------------------------------------
      !
      IF ( before ) THEN
         tabres(i1:i2,j1:j2,k2) = 0._wp
         IF ( .NOT.l_vremap ) THEN
            DO jk = k1, k2-1
               tabres(i1:i2,j1:j2,jk) = e2u_frac(i1:i2,j1:j2) * e3u(i1:i2,j1:j2,jk,Kmm_a) * umask(i1:i2,j1:j2,jk) 
            END DO
         ELSE
            ! Retrieve sea level at U-points:
            DO jk = k1, k2-1
               tabres(i1:i2,j1:j2,k2) =   tabres(i1:i2,j1:j2,k2) + & 
                                      & e2u_frac(i1:i2,j1:j2) * e3u(i1:i2,j1:j2,jk,Kmm_a) * umask(i1:i2,j1:j2,jk) 
            END DO
            tabres(i1:i2,j1:j2,k2) = tabres(i1:i2,j1:j2,k2) - hu_0(i1:i2,j1:j2)
         ENDIF   
      ELSE 
         !
         IF ( .NOT.l_vremap ) THEN ! Update e3u from parent thicknesses
            tabres_child(i1:i2,j1:j2,1:jpk) =  e3u_0(i1:i2,j1:j2,1:jpk)
            WHERE( umask(i1:i2,j1:j2,k1:k2) /= 0._wp ) 
               tabres_child(i1:i2,j1:j2,k1:k2) = tabres(i1:i2,j1:j2,k1:k2)
            ENDWHERE
         ELSE                      ! Update e3u from ssh stored in tabres(:,:,k2)
            DO jk = 1, jpkm1
               tabres_child(i1:i2,j1:j2,jk) = e3u_0(i1:i2,j1:j2,jk) &  
                * (1._wp + tabres(i1:i2,j1:j2,k2)*r1_hu_0(i1:i2,j1:j2))
            END DO
         ENDIF
         !
         ! 1) Updates at BEFORE time step:
         ! -------------------------------
         !
         ! Save "old" scale factor (prior update) for subsequent asselin correction
         ! of prognostic variables
         e3u(i1:i2,j1:j2,1:jpkm1,Krhs_a) = e3u(i1:i2,j1:j2,1:jpkm1,Kmm_a)

         IF (.NOT.(lk_agrif_fstep.AND.(l_1st_euler) )) THEN
            DO jk = 1, jpkm1
               DO jj = j1, j2
                  DO ji = i1, i2
                     e3u(ji,jj,jk,Kbb_a) =  e3u(ji,jj,jk,Kbb_a) &
                           & + rn_atfp * ( tabres_child(ji,jj,jk) - e3u(ji,jj,jk,Kmm_a) )
                  END DO
               END DO
            END DO
            !
            ! Update total depth:
            hu(i1:i2,j1:j2,Kbb_a) = 0._wp
            DO jk = 1, jpkm1
               hu(i1:i2,j1:j2,Kbb_a) = hu(i1:i2,j1:j2,Kbb_a) + e3u(i1:i2,j1:j2,jk,Kbb_a) * umask(i1:i2,j1:j2,jk)
            END DO
            r1_hu(i1:i2,j1:j2,Kbb_a) = ssumask(i1:i2,j1:j2) / ( hu(i1:i2,j1:j2,Kbb_a) + 1._wp - ssumask(i1:i2,j1:j2) )
            !
            e3uw  (i1:i2,j1:j2,1,Kbb_a) = e3uw_0(i1:i2,j1:j2,1) + e3u(i1:i2,j1:j2,1,Kbb_a) - e3u_0(i1:i2,j1:j2,1)
            DO jk = 2, jpkm1
               DO jj = j1,j2
                  DO ji = i1,i2            
                     e3uw(ji,jj,jk,Kbb_a)  = e3uw_0(ji,jj,jk) + ( 1.0_wp - 0.5_wp * umask(ji,jj,jk) ) *        & 
                     &                                        ( e3u(ji,jj,jk-1,Kbb_a) - e3u_0(ji,jj,jk-1) )    &
                     &                                        +            0.5_wp * umask(ji,jj,jk)   *        &
                     &                                        ( e3u(ji,jj,jk  ,Kbb_a) - e3u_0(ji,jj,jk  ) )
                  END DO
               END DO
            END DO
            !
         ENDIF        
         !
         ! 2) Updates at NOW time step:
         ! ----------------------------
         !
         ! Update vertical scale factor at U-points:
         e3u(i1:i2,j1:j2,1:jpkm1,Kmm_a) = tabres_child(i1:i2,j1:j2,1:jpkm1)
         !
         ! Update total depth:
         hu(i1:i2,j1:j2,Kmm_a) = 0._wp
         DO jk = 1, jpkm1
            hu(i1:i2,j1:j2,Kmm_a) = hu(i1:i2,j1:j2,Kmm_a) + e3u(i1:i2,j1:j2,jk,Kmm_a) * umask(i1:i2,j1:j2,jk)
         END DO
         r1_hu(i1:i2,j1:j2,Kmm_a) = ssumask(i1:i2,j1:j2) / ( hu(i1:i2,j1:j2,Kmm_a) + 1._wp - ssumask(i1:i2,j1:j2) )
         !
         ! Update vertical scale factor at W-points and depths:
         e3uw (i1:i2,j1:j2,1,Kmm_a) = e3uw_0(i1:i2,j1:j2,1) + e3u(i1:i2,j1:j2,1,Kmm_a) - e3u_0(i1:i2,j1:j2,1)
         DO jk = 2, jpkm1
            DO jj = j1,j2
               DO ji = i1,i2            
                  e3uw(ji,jj,jk,Kmm_a)  = e3uw_0(ji,jj,jk) + ( 1.0_wp - 0.5_wp * umask(ji,jj,jk) ) *       &  
                  &                                        ( e3u(ji,jj,jk-1,Kmm_a) - e3u_0(ji,jj,jk-1) )   &
                  &                                        +            0.5_wp * umask(ji,jj,jk)   *       &
                  &                                        ( e3u(ji,jj,jk  ,Kmm_a) - e3u_0(ji,jj,jk  ) )
               END DO
            END DO
         END DO
         !
         IF  ((l_1st_euler).AND.(Agrif_Nb_Step()==0) ) THEN
            e3u (i1:i2,j1:j2,1:jpkm1,Kbb_a)  = e3u (i1:i2,j1:j2,1:jpkm1,Kmm_a)
            e3uw(i1:i2,j1:j2,1:jpkm1,Kbb_a)  = e3uw(i1:i2,j1:j2,1:jpkm1,Kmm_a)
            hu   (i1:i2,j1:j2,Kbb_a)         = hu   (i1:i2,j1:j2,Kmm_a)
            r1_hu(i1:i2,j1:j2,Kbb_a)         = r1_hu(i1:i2,j1:j2,Kmm_a)
Guillaume Samson's avatar
Guillaume Samson committed
         ENDIF
         !
      ENDIF
      !
   END SUBROUTINE update_e3u


   SUBROUTINE update_e3v(tabres, i1, i2, j1, j2, k1, k2, before )
      !!---------------------------------------------
      !!           *** ROUTINE update_e3v ***
      !!---------------------------------------------
      REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) :: tabres 
      INTEGER                               , INTENT(in   ) :: i1, i2, j1, j2, k1, k2
      LOGICAL                               , INTENT(in   ) :: before
      !
      INTEGER :: ji, jj, jk
      REAL(wp), DIMENSION(i1:i2,j1:j2,1:jpk) :: tabres_child
      !!---------------------------------------------
      !
      IF ( before ) THEN
         tabres(i1:i2,j1:j2,k2) = 0._wp
         IF ( .NOT.l_vremap ) THEN
            DO jk = k1, k2-1
               tabres(i1:i2,j1:j2,jk) = e1v_frac(i1:i2,j1:j2) * e3v(i1:i2,j1:j2,jk,Kmm_a) * vmask(i1:i2,j1:j2,jk) 
            END DO
         ELSE
            ! Retrieve sea level at V-points:
            DO jk = k1, k2-1
               tabres(i1:i2,j1:j2,k2) =   tabres(i1:i2,j1:j2,k2) + & 
                                      & e1v_frac(i1:i2,j1:j2) * e3v(i1:i2,j1:j2,jk,Kmm_a) * vmask(i1:i2,j1:j2,jk) 
            END DO
            tabres(i1:i2,j1:j2,k2) = tabres(i1:i2,j1:j2,k2) - hv_0(i1:i2,j1:j2)
         ENDIF    
      ELSE 
         !
         IF ( .NOT.l_vremap ) THEN ! Update e3v from parent thicknesses
            tabres_child(i1:i2,j1:j2,1:jpk) =  e3v_0(i1:i2,j1:j2,1:jpk)
            WHERE( vmask(i1:i2,j1:j2,k1:k2) /= 0._wp ) 
               tabres_child(i1:i2,j1:j2,k1:k2) = tabres(i1:i2,j1:j2,k1:k2)
            ENDWHERE
         ELSE                      ! Update e3v from ssh stored in tabres(:,:,k2)
            DO jk = 1, jpkm1
               tabres_child(i1:i2,j1:j2,jk) = e3v_0(i1:i2,j1:j2,jk) &  
                * (1._wp + tabres(i1:i2,j1:j2,k2)*r1_hv_0(i1:i2,j1:j2))
            END DO
         ENDIF
         !
         ! 1) Updates at BEFORE time step:
         ! -------------------------------
         !
         ! Save "old" scale factor (prior update) for subsequent asselin correction
         ! of prognostic variables
         e3v(i1:i2,j1:j2,k1:k2,Krhs_a) = e3v(i1:i2,j1:j2,k1:k2,Kmm_a)

         IF (.NOT.(lk_agrif_fstep.AND.(l_1st_euler) )) THEN
            DO jk = 1, jpkm1
               DO jj = j1, j2
                  DO ji = i1, i2
                     e3v(ji,jj,jk,Kbb_a) =  e3v(ji,jj,jk,Kbb_a) &
                           & + rn_atfp * ( tabres_child(ji,jj,jk) - e3v(ji,jj,jk,Kmm_a) )
                  END DO
               END DO
            END DO
            !
            ! Update total depth:
            hv(i1:i2,j1:j2,Kbb_a) = 0._wp
            DO jk = 1, jpkm1
               hv(i1:i2,j1:j2,Kbb_a) = hv(i1:i2,j1:j2,Kbb_a) + e3v(i1:i2,j1:j2,jk,Kbb_a) * vmask(i1:i2,j1:j2,jk)
            END DO
            r1_hv(i1:i2,j1:j2,Kbb_a) = ssvmask(i1:i2,j1:j2) / ( hv(i1:i2,j1:j2,Kbb_a) + 1._wp - ssvmask(i1:i2,j1:j2) )
            !
            e3vw(i1:i2,j1:j2,1,Kbb_a) = e3vw_0(i1:i2,j1:j2,1) + e3v(i1:i2,j1:j2,1,Kbb_a) - e3v_0(i1:i2,j1:j2,1)
            DO jk = 2, jpkm1
               DO jj = j1,j2
                  DO ji = i1,i2            
                     e3vw(ji,jj,jk,Kbb_a)  = e3vw_0(ji,jj,jk) + ( 1.0_wp - 0.5_wp * vmask(ji,jj,jk) ) *        & 
                     &                                        ( e3v(ji,jj,jk-1,Kbb_a) - e3v_0(ji,jj,jk-1) )    &
                     &                                        +            0.5_wp * vmask(ji,jj,jk)   *        &
                     &                                        ( e3v(ji,jj,jk  ,Kbb_a) - e3v_0(ji,jj,jk  ) )
                  END DO
               END DO
            END DO
            !
         ENDIF        
         !
         ! 2) Updates at NOW time step:
         ! ----------------------------
         !
         ! Update vertical scale factor at U-points:
         e3v(i1:i2,j1:j2,1:jpkm1,Kmm_a) = tabres_child(i1:i2,j1:j2,1:jpkm1)
         !
         ! Update total depth:
         hv(i1:i2,j1:j2,Kmm_a) = 0._wp
         DO jk = 1, jpkm1
            hv(i1:i2,j1:j2,Kmm_a) = hv(i1:i2,j1:j2,Kmm_a) + e3v(i1:i2,j1:j2,jk,Kmm_a) * vmask(i1:i2,j1:j2,jk)
         END DO
         r1_hv(i1:i2,j1:j2,Kmm_a) = ssvmask(i1:i2,j1:j2) / ( hv(i1:i2,j1:j2,Kmm_a) + 1._wp - ssvmask(i1:i2,j1:j2) )
         !
         ! Update vertical scale factor at W-points and depths:
         e3vw (i1:i2,j1:j2,1,Kmm_a) = e3vw_0(i1:i2,j1:j2,1) + e3v(i1:i2,j1:j2,1,Kmm_a) - e3v_0(i1:i2,j1:j2,1)
         DO jk = 2, jpkm1
            DO jj = j1, j2
               DO ji = i1, i2            
                  e3vw(ji,jj,jk,Kmm_a)  = e3vw_0(ji,jj,jk) + ( 1.0_wp - 0.5_wp * vmask(ji,jj,jk) ) *       &  
                  &                                        ( e3v(ji,jj,jk-1,Kmm_a) - e3v_0(ji,jj,jk-1) )   &
                  &                                        +            0.5_wp * vmask(ji,jj,jk)   *       &
                  &                                        ( e3v(ji,jj,jk  ,Kmm_a) - e3v_0(ji,jj,jk  ) )
               END DO
            END DO
         END DO
         !
         IF  ((l_1st_euler).AND.(Agrif_Nb_Step()==0) ) THEN
            e3v  (i1:i2,j1:j2,1:jpkm1,Kbb_a)  = e3v  (i1:i2,j1:j2,1:jpkm1,Kmm_a)
            e3vw (i1:i2,j1:j2,1:jpkm1,Kbb_a)  = e3vw (i1:i2,j1:j2,1:jpkm1,Kmm_a)
            hv   (i1:i2,j1:j2,Kbb_a)          = hv   (i1:i2,j1:j2,Kmm_a)
            r1_hv(i1:i2,j1:j2,Kbb_a)          = r1_hv(i1:i2,j1:j2,Kmm_a)
         ENDIF
         !
      ENDIF
      !
   END SUBROUTINE update_e3v


   SUBROUTINE update_e3f(tabres, i1, i2, j1, j2, k1, k2, before )
      !!---------------------------------------------
      !!           *** ROUTINE update_e3f ***
      !!---------------------------------------------
      REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) :: tabres 
      INTEGER                               , INTENT(in   ) :: i1, i2, j1, j2, k1, k2
      LOGICAL                               , INTENT(in   ) :: before
      !
      INTEGER :: ji, jj, jk
      REAL(wp), DIMENSION(i1:i2,j1:j2,1:jpk) :: tabres_child
      !!---------------------------------------------
      !
      IF ( before ) THEN
         tabres(i1:i2,j1:j2,k2) = 0._wp
         IF ( .NOT.l_vremap ) THEN
            DO jk = k1, k2-1
               tabres(i1:i2,j1:j2,jk) = e3f(i1:i2,j1:j2,jk) * fe3mask(i1:i2,j1:j2,jk) 
            END DO
         ELSE
            ! Retrieve sea level at F-points:
            DO jk = k1, k2-1
               tabres(i1:i2,j1:j2,k2) = tabres(i1:i2,j1:j2,k2) + & 
                                      &    e3f(i1:i2,j1:j2,jk) * fe3mask(i1:i2,j1:j2,jk) 
            END DO
            tabres(i1:i2,j1:j2,k2) = tabres(i1:i2,j1:j2,k2) - hf_0(i1:i2,j1:j2)
         ENDIF 
      ELSE 
         !
         IF ( .NOT.l_vremap ) THEN ! Update e3f from parent thicknesses
            tabres_child(i1:i2,j1:j2,1:jpkm1) =  e3f_0(i1:i2,j1:j2,1:jpkm1)
            WHERE( fe3mask(i1:i2,j1:j2,k1:k2) /= 0._wp ) 
               tabres_child(i1:i2,j1:j2,k1:k2) = tabres(i1:i2,j1:j2,k1:k2)
            ENDWHERE
         ELSE                      ! Update e3f from ssh stored in tabres(:,:,k2)
            DO jk = 1, jpkm1
               tabres_child(i1:i2,j1:j2,jk) = e3f_0(i1:i2,j1:j2,jk) &  
                * (1._wp + tabres(i1:i2,j1:j2,k2)*r1_hf_0(i1:i2,j1:j2))
            END DO
         ENDIF
         !
         ! Update vertical scale factor at F-points:
         e3f(i1:i2,j1:j2,1:jpkm1) = tabres_child(i1:i2,j1:j2,1:jpkm1)
         !
      ENDIF
      !
   END SUBROUTINE update_e3f
Guillaume Samson's avatar
Guillaume Samson committed
#endif

#if defined key_qco
   SUBROUTINE update_r3t(tabres, i1, i2, j1, j2, before )
      !!---------------------------------------------
      !!           *** ROUTINE update_r3t ***
      !!---------------------------------------------
      REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) :: tabres 
      INTEGER                         , INTENT(in   ) :: i1, i2, j1, j2
      LOGICAL                         , INTENT(in   ) :: before
      !
      !!---------------------------------------------
      IF ( before ) THEN 
         tabres(i1:i2,j1:j2) = e1e2t_frac(i1:i2,j1:j2)       & 
                             &    *   r3t(i1:i2,j1:j2,Kmm_a) & 
                             &    *  ht_0(i1:i2,j1:j2)       &
                             &    * tmask(i1:i2,j1:j2,1) 
      ELSE 
         !
         tabres(i1:i2,j1:j2) = tabres(i1:i2,j1:j2) * r1_ht_0(i1:i2,j1:j2)
         !
         ! 1) Update at BEFORE time step:
         ! ------------------------------
         ! Save "old" array (prior update) for subsequent asselin correction
         ! of prognostic variables
         r3t(i1:i2,j1:j2,Krhs_a) = r3t(i1:i2,j1:j2,Kmm_a)

         IF (.NOT.(lk_agrif_fstep.AND.(l_1st_euler) )) THEN
            r3t(i1:i2,j1:j2,Kbb_a) =  r3t(i1:i2,j1:j2,Kbb_a) &
                   & + rn_atfp * ( tabres(i1:i2,j1:j2) - r3t(i1:i2,j1:j2,Kmm_a) )
         ENDIF   
         !
         ! 2) Updates at NOW time step:
         ! ----------------------------
         r3t(i1:i2,j1:j2,Kmm_a) = tabres(i1:i2,j1:j2)
         !
         ! 3) Special case for euler startup only:
         ! ---------------------------------------
         IF  ( (l_1st_euler).AND.(Agrif_Nb_Step()==0) ) THEN
            r3t(i1:i2,j1:j2,Kbb_a)  = r3t(i1:i2,j1:j2,Kmm_a)
         ENDIF
         !
      ENDIF
   END SUBROUTINE update_r3t


   SUBROUTINE update_r3u(tabres, i1, i2, j1, j2, before )
      !!---------------------------------------------
      !!           *** ROUTINE update_r3u ***
      !!---------------------------------------------
      REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) :: tabres 
      INTEGER                         , INTENT(in   ) :: i1, i2, j1, j2
      LOGICAL                         , INTENT(in   ) :: before
      !
      !!---------------------------------------------
      IF ( before ) THEN 
         tabres(i1:i2,j1:j2) = e2u_frac(i1:i2,j1:j2)       & 
                             &  *   r3u(i1:i2,j1:j2,Kmm_a) & 
                             &  *  hu_0(i1:i2,j1:j2)       &
                             &  * umask(i1:i2,j1:j2,1) 
      ELSE 
         !
         tabres(i1:i2,j1:j2) = tabres(i1:i2,j1:j2) * r1_hu_0(i1:i2,j1:j2)
         !
         ! 1) Update at BEFORE time step:
         ! ------------------------------
         ! Save "old" array (prior update) for subsequent asselin correction
         ! of prognostic variables
         r3u(i1:i2,j1:j2,Krhs_a) = r3u(i1:i2,j1:j2,Kmm_a)

         IF (.NOT.(lk_agrif_fstep.AND.(l_1st_euler) )) THEN
            r3u(i1:i2,j1:j2,Kbb_a) =  r3u(i1:i2,j1:j2,Kbb_a) &
                   & + rn_atfp * ( tabres(i1:i2,j1:j2) - r3u(i1:i2,j1:j2,Kmm_a) )
         ENDIF   
         !
         ! 2) Updates at NOW time step:
         ! ----------------------------
         r3u(i1:i2,j1:j2,Kmm_a) = tabres(i1:i2,j1:j2)
         !
         ! 3) Special case for euler startup only:
         ! ---------------------------------------
         IF  ( (l_1st_euler).AND.(Agrif_Nb_Step()==0) ) THEN
            r3u(i1:i2,j1:j2,Kbb_a)  = r3u(i1:i2,j1:j2,Kmm_a)
         ENDIF
         !
      ENDIF
   END SUBROUTINE update_r3u


   SUBROUTINE update_r3v(tabres, i1, i2, j1, j2, before )
      !!---------------------------------------------
      !!           *** ROUTINE update_r3v ***
      !!---------------------------------------------
      REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) :: tabres 
      INTEGER                         , INTENT(in   ) :: i1, i2, j1, j2
      LOGICAL                         , INTENT(in   ) :: before
      !
      !!---------------------------------------------
      IF ( before ) THEN 
         tabres(i1:i2,j1:j2) = e1v_frac(i1:i2,j1:j2)       & 
                             &  *   r3v(i1:i2,j1:j2,Kmm_a) & 
                             &  *  hv_0(i1:i2,j1:j2)       &
                             &  * vmask(i1:i2,j1:j2,1) 
      ELSE 
         !
         tabres(i1:i2,j1:j2) = tabres(i1:i2,j1:j2) * r1_hv_0(i1:i2,j1:j2)
         !
         ! 1) Update at BEFORE time step:
         ! ------------------------------
         ! Save "old" array (prior update) for subsequent asselin correction
         ! of prognostic variables
         r3v(i1:i2,j1:j2,Krhs_a) = r3v(i1:i2,j1:j2,Kmm_a)

         IF (.NOT.(lk_agrif_fstep.AND.(l_1st_euler) )) THEN
            r3v(i1:i2,j1:j2,Kbb_a) =  r3v(i1:i2,j1:j2,Kbb_a) &
                   & + rn_atfp * ( tabres(i1:i2,j1:j2) - r3v(i1:i2,j1:j2,Kmm_a) )
         ENDIF   
         !
         ! 2) Updates at NOW time step:
         ! ----------------------------
         r3v(i1:i2,j1:j2,Kmm_a) = tabres(i1:i2,j1:j2)
         !
         ! 3) Special case for euler startup only:
         ! ---------------------------------------
         IF  ( (l_1st_euler).AND.(Agrif_Nb_Step()==0) ) THEN
            r3v(i1:i2,j1:j2,Kbb_a)  = r3v(i1:i2,j1:j2,Kmm_a)
         ENDIF
         !
      ENDIF
   END SUBROUTINE update_r3v


   SUBROUTINE update_r3f(tabres, i1, i2, j1, j2, before )
      !!---------------------------------------------
      !!           *** ROUTINE update_r3f ***
      !!---------------------------------------------
      REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) :: tabres 
      INTEGER                         , INTENT(in   ) :: i1, i2, j1, j2
      LOGICAL                         , INTENT(in   ) :: before
      !
      !!---------------------------------------------
      IF ( before ) THEN 
         tabres(i1:i2,j1:j2) =       r3f(i1:i2,j1:j2)   & 
                             & *    hf_0(i1:i2,j1:j2)   &
                             & * fe3mask(i1:i2,j1:j2,1) 
      ELSE 
         !
         r3f(i1:i2,j1:j2) = tabres(i1:i2,j1:j2) * r1_hf_0(i1:i2,j1:j2)
         !
      ENDIF
   END SUBROUTINE update_r3f

#endif 

Guillaume Samson's avatar
Guillaume Samson committed
   SUBROUTINE Agrif_Check_parent_bat( )
      !!----------------------------------------------------------------------
      !!                   *** ROUTINE Agrif_Check_parent_bat ***
      !!----------------------------------------------------------------------
      ! 
      IF (( .NOT.ln_agrif_2way ).OR.(.NOT.ln_chk_bathy) & 
Guillaume Samson's avatar
Guillaume Samson committed
      !
      Agrif_UseSpecialValueInUpdate = .FALSE.
Guillaume Samson's avatar
Guillaume Samson committed
      !
      IF(lwp) WRITE(numout,*) ' '
      IF(lwp) WRITE(numout,*) 'AGRIF: Check parent volume at Level:', Agrif_Level()
      !
# if ! defined DECAL_FEEDBACK
      CALL Agrif_Update_Variable(e3t_id,procname = check_parent_e3t0)
      CALL Agrif_Update_Variable(e3u_id,procname = check_parent_e3u0)
      CALL Agrif_Update_Variable(e3v_id,procname = check_parent_e3v0)
Guillaume Samson's avatar
Guillaume Samson committed
# else
      CALL Agrif_Update_Variable(e3t0_interp_id,locupdate=(/1,0/),procname = check_parent_e3t0)
Guillaume Samson's avatar
Guillaume Samson committed
# endif
      !
Guillaume Samson's avatar
Guillaume Samson committed
      kindic_agr = Agrif_Parent(kindic_agr)
      CALL mpp_sum( 'Agrif_Check_parent_bat', kindic_agr )

      IF( kindic_agr /= 0 ) THEN
         CALL ctl_stop('==> Averaged Bathymetry does not match parent volume') 
      ELSE
         IF(lwp) WRITE(numout,*) '==> Averaged Bathymetry matches parent ' 
         IF(lwp) WRITE(numout,*) ''
      ENDIF
      !
   END SUBROUTINE Agrif_Check_parent_bat

  
   SUBROUTINE check_parent_e3t0(ptab, i1, i2, j1, j2, k1, k2, before )
Guillaume Samson's avatar
Guillaume Samson committed
      !!---------------------------------------------
      !!     *** ROUTINE check_parent__e3t0 ***
Guillaume Samson's avatar
Guillaume Samson committed
      !!---------------------------------------------
      REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2) :: ptab
      INTEGER, INTENT(in) :: i1, i2, j1, j2, k1, k2
Guillaume Samson's avatar
Guillaume Samson committed
      LOGICAL, INTENT(in) :: before
      INTEGER :: ji, jj, jk
      REAL(wp), DIMENSION(i1:i2,j1:j2) ::   zh0   ! 2D workspace
      !
      !!---------------------------------------------
      !
      IF( before ) THEN
         DO jk=k1,k2-1
            ptab(i1:i2,j1:j2,jk) =  e3t_0(i1:i2,j1:j2,jk) * tmask(i1:i2,j1:j2,jk) &
                          &  * e1e2t_frac(i1:i2,j1:j2)
         END DO
      ELSE
         kindic_agr = 0
         !
         DO jj=j1,j2
            DO ji=i1,i2
               IF ( ssmask(ji,jj).NE.0._wp ) THEN
                  IF ( l_vremap ) THEN ! Check total depths:
                     zh0(ji,jj) = 0._wp
                     DO jk=k1,k2-1
                        zh0(ji,jj) = zh0(ji,jj) + ptab(ji,jj,jk)   
                     END DO  
                     IF (ABS(zh0(ji,jj)-ht_0(ji,jj)).GE.1.e-6) THEN 
                        kindic_agr = kindic_agr + 1 
                     ENDIF
                  ELSE                 ! Check individual cells volumes:
                     DO jk=k1,k2-1
                        IF  (ABS((ptab(ji,jj,jk)-e3t_0(ji,jj,jk))*tmask(ji,jj,jk)).GE.1.e-6)  THEN 
                           kindic_agr = kindic_agr + 1 
                        ENDIF
                     END DO
                  ENDIF
               ENDIF
            END DO
         END DO
         !
      ENDIF
      !
   END SUBROUTINE check_parent_e3t0


   SUBROUTINE check_parent_e3u0(ptab, i1, i2, j1, j2, k1, k2, before )
      !!---------------------------------------------
      !!     *** ROUTINE check_parent_e3u0 ***
      !!---------------------------------------------
      REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2) :: ptab
      INTEGER, INTENT(in) :: i1, i2, j1, j2, k1, k2
      LOGICAL, INTENT(in) :: before
      INTEGER :: ji, jj, jk, ikbot
Guillaume Samson's avatar
Guillaume Samson committed
      !
      !!---------------------------------------------
      !
      IF( before ) THEN
         DO jk=k1,k2-1
            ptab(i1:i2,j1:j2,jk) =  e3u_0(i1:i2,j1:j2,jk) * umask(i1:i2,j1:j2,jk) &
                          &  * e2u_frac(i1:i2,j1:j2)
         END DO
Guillaume Samson's avatar
Guillaume Samson committed
      ELSE
         kindic_agr = 0
         !
         DO jj=j1,j2
            DO ji=i1,i2
               IF ( ssumask(ji,jj).NE.0._wp ) THEN
                  IF ( l_vremap ) THEN ! Assume depths can differ: do not check
                  ELSE                 ! Check individual cells area:
                     DO jk=k1,k2-1
                       IF (ptab(ji,jj,jk)>1.e-6) ikbot = jk
                     ENDDO
                     DO jk=k1,k2-1
                        IF  (ABS((ptab(ji,jj,jk)-e3u_0(ji,jj,jk))*umask(ji,jj,jk)).GE.1.e-6)  THEN 
                           kindic_agr = kindic_agr + 1 
                           print *, 'erro u-pt', mig0(ji), mjg0(jj), jk, mbku(ji,jj), ikbot, ptab(ji,jj,jk), e3u_0(ji,jj,jk)
                        ENDIF
                     END DO
                  ENDIF
Guillaume Samson's avatar
Guillaume Samson committed
               ENDIF
            END DO
         END DO
         !
      ENDIF
      !
Guillaume Samson's avatar
Guillaume Samson committed

   SUBROUTINE check_parent_e3v0(ptab, i1, i2, j1, j2, k1, k2, before )
      !!---------------------------------------------
      !!     *** ROUTINE check_parent_e3v0 ***
      !!---------------------------------------------
      REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2) :: ptab
      INTEGER, INTENT(in) :: i1, i2, j1, j2, k1, k2
      LOGICAL, INTENT(in) :: before
      INTEGER :: ji, jj, jk
      !
      !!---------------------------------------------
      !
      IF( before ) THEN
         DO jk=k1,k2-1
            ptab(i1:i2,j1:j2,jk) =  e3v_0(i1:i2,j1:j2,jk) * vmask(i1:i2,j1:j2,jk) &
                          &  * e1v_frac(i1:i2,j1:j2)
         END DO
      ELSE
         kindic_agr = 0
         !
         DO jj=j1,j2
            DO ji=i1,i2
               IF ( ssvmask(ji,jj).NE.0._wp ) THEN
                  IF ( l_vremap ) THEN ! Assume depths can differ: do not check
                  ELSE                 ! Check individual cells volumes:
                     DO jk=k1,k2-1
                        IF  (ABS((ptab(ji,jj,jk)-e3v_0(ji,jj,jk))*vmask(ji,jj,jk)).GE.1.e-6)  THEN 
                           kindic_agr = kindic_agr + 1 
                           print *, 'erro v-pt', mig0(ji), mjg0(jj), mbkv(ji,jj), ptab(ji,jj,jk), e3v_0(ji,jj,jk)
                        ENDIF
                     END DO
                  ENDIF
               ENDIF
            END DO
         END DO
         !
      ENDIF
      !
   END SUBROUTINE check_parent_e3v0


   SUBROUTINE update_tmask_agrif( tabres, i1, i2, j1, j2, before )
      !!----------------------------------------------------------------------
      !!                   *** ROUTINE updatetmsk ***
      !!----------------------------------------------------------------------
      INTEGER                         , INTENT(in   ) ::   i1, i2, j1, j2
      REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) ::   tabres
      LOGICAL                         , INTENT(in   ) ::   before
      !!
      !!----------------------------------------------------------------------
      ! 
      IF( .NOT.before ) THEN
         tmask_agrif(i1:i2,j1:j2)  = 0._wp 
      ENDIF
      !
   END SUBROUTINE update_tmask_agrif

Guillaume Samson's avatar
Guillaume Samson committed
#else
   !!----------------------------------------------------------------------
   !!   Empty module                                          no AGRIF zoom
   !!----------------------------------------------------------------------
CONTAINS
   SUBROUTINE agrif_oce_update_empty
      WRITE(*,*)  'agrif_oce_update : You should not have seen this print! error?'
   END SUBROUTINE agrif_oce_update_empty
#endif

   !!======================================================================
END MODULE agrif_oce_update