New URL for NEMO forge!   http://forge.nemo-ocean.eu

Since March 2022 along with NEMO 4.2 release, the code development moved to a self-hosted GitLab.
This present forge is now archived and remained online for history.
Changeset 8882 for branches/2017/dev_CNRS_2017/NEMOGCM/NEMO/NST_SRC – NEMO

Ignore:
Timestamp:
2017-12-01T18:44:09+01:00 (6 years ago)
Author:
flavoni
Message:

dev_CNRS_2017 branch: merged dev_r7881_ENHANCE09_RK3 with trunk r8864

Location:
branches/2017/dev_CNRS_2017/NEMOGCM/NEMO/NST_SRC
Files:
2 deleted
11 edited

Legend:

Unmodified
Added
Removed
  • branches/2017/dev_CNRS_2017/NEMOGCM/NEMO/NST_SRC/agrif_ice.F90

    r7646 r8882  
    77   !!            3.6  ! 2016-05  (C. Rousset)   Add LIM3 compatibility 
    88   !!---------------------------------------------------------------------- 
    9 #if defined key_agrif && defined key_lim2 
     9#if defined key_agrif && defined key_lim3 
    1010   !!---------------------------------------------------------------------- 
    1111   !!   'key_agrif'                                              AGRIF zoom 
    12    !!---------------------------------------------------------------------- 
    13    USE par_oce      ! ocean parameters 
    14     
    15    IMPLICIT NONE 
    16    PRIVATE  
    17  
    18    PUBLIC agrif_ice_alloc ! routine called by nemo_init in nemogcm.F90 
    19  
    20    INTEGER, PUBLIC :: u_ice_id, v_ice_id, adv_ice_id 
    21    REAL(wp), PUBLIC :: lim_nbstep = 0.    ! child time position in sea-ice model 
    22 #if defined key_lim2_vp 
    23    REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:)     :: u_ice_nst, v_ice_nst    
    24 #else 
    25    REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:,:)   :: u_ice_oe, u_ice_sn     !: boundaries arrays 
    26    REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:,:)   :: v_ice_oe, v_ice_sn     !:  "          "  
    27 #endif 
    28    REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:,:,:) :: adv_ice_oe, adv_ice_sn !:  "          " 
    29  
    30    !!---------------------------------------------------------------------- 
    31    !! NEMO/NST 3.3.4 , NEMO Consortium (2012) 
    32    !! $Id$ 
    33    !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt) 
    34    !!---------------------------------------------------------------------- 
    35  
    36 CONTAINS  
    37  
    38    INTEGER FUNCTION agrif_ice_alloc() 
    39       !!---------------------------------------------------------------------- 
    40       !!                ***  FUNCTION agrif_ice_alloc  *** 
    41       !!---------------------------------------------------------------------- 
    42 #if defined key_lim2_vp 
    43       ALLOCATE( u_ice_nst(jpi,jpj), v_ice_nst(jpi,jpj) ,   & 
    44 #else 
    45       ALLOCATE( u_ice_oe(4,jpj,2) , v_ice_oe(4,jpj,2) ,    & 
    46          &      u_ice_sn(jpi,4,2) , v_ice_sn(jpi,4,2) ,    & 
    47 #endif 
    48          &      adv_ice_oe (4,jpj,7,2) , adv_ice_sn (jpi,4,7,2) ,   & 
    49          &      STAT = agrif_ice_alloc) 
    50  
    51 #if ! defined key_lim2_vp 
    52       u_ice_oe(:,:,:) =  0.e0 
    53       v_ice_oe(:,:,:) =  0.e0 
    54       u_ice_sn(:,:,:) =  0.e0 
    55       v_ice_sn(:,:,:) =  0.e0 
    56 #endif 
    57       adv_ice_oe (:,:,:,:) = 0.e0  
    58       adv_ice_sn (:,:,:,:) = 0.e0  
    59       ! 
    60    END FUNCTION agrif_ice_alloc 
    61  
    62 #elif defined key_agrif && defined key_lim3 
    63    !!---------------------------------------------------------------------- 
    64    !!   'key_agrif'                                              AGRIF zoom 
     12   !!   'key_lim3'                                       LIM3 sea-ice model 
    6513   !!----------------------------------------------------------------------    
    6614   IMPLICIT NONE 
     
    7119 
    7220   !!---------------------------------------------------------------------- 
    73    !! NEMO/NST 3.6 , NEMO Consortium (2016) 
     21   !! NEMO/NST 4.0 , NEMO Consortium (2017) 
    7422   !! $Id$ 
    7523   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt) 
  • branches/2017/dev_CNRS_2017/NEMOGCM/NEMO/NST_SRC/agrif_lim3_interp.F90

    r7761 r8882  
    2828   PRIVATE 
    2929 
    30    PUBLIC agrif_interp_lim3 
     30   PUBLIC   agrif_interp_lim3   ! called by agrif_user.F90 
    3131 
    3232   !!---------------------------------------------------------------------- 
     
    4646      !!  computing factor for time interpolation 
    4747      !!----------------------------------------------------------------------- 
    48       CHARACTER(len=1), INTENT( in )           :: cd_type 
    49       INTEGER         , INTENT( in ), OPTIONAL :: kiter, kitermax 
    50       !! 
    51       REAL(wp) :: zbeta 
    52       !!----------------------------------------------------------------------- 
    53       ! 
    54       IF( Agrif_Root() )  RETURN 
    55       ! 
    56       SELECT CASE(cd_type) 
     48      CHARACTER(len=1), INTENT(in   )           ::  cd_type 
     49      INTEGER         , INTENT(in   ), OPTIONAL ::  kiter, kitermax 
     50      !! 
     51      REAL(wp) ::   zbeta   ! local scalar 
     52      !!----------------------------------------------------------------------- 
     53      ! 
     54      IF( Agrif_Root() .OR. nn_ice==0 )  RETURN   ! clem2017: do not interpolate if inside Parent domain or if child domain does not have ice 
     55      ! 
     56      SELECT CASE( cd_type ) 
    5757      CASE('U','V') 
    5858         IF( PRESENT( kiter ) ) THEN  ! interpolation at the child sub-time step (only for ice rheology) 
     
    6666      END SELECT 
    6767      ! 
    68       Agrif_SpecialValue=-9999. 
     68      Agrif_SpecialValue    = -9999. 
    6969      Agrif_UseSpecialValue = .TRUE. 
    70       SELECT CASE(cd_type) 
    71       CASE('U') 
    72          CALL Agrif_Bc_variable( u_ice_id  , procname=interp_u_ice  , calledweight=zbeta ) 
    73       CASE('V') 
    74          CALL Agrif_Bc_variable( v_ice_id  , procname=interp_v_ice  , calledweight=zbeta ) 
    75       CASE('T') 
    76          CALL Agrif_Bc_variable( tra_ice_id, procname=interp_tra_ice, calledweight=zbeta ) 
     70      SELECT CASE( cd_type ) 
     71      CASE('U')   ;   CALL Agrif_Bc_variable( u_ice_id  , procname=interp_u_ice  , calledweight=zbeta ) 
     72      CASE('V')   ;   CALL Agrif_Bc_variable( v_ice_id  , procname=interp_v_ice  , calledweight=zbeta ) 
     73      CASE('T')   ;   CALL Agrif_Bc_variable( tra_ice_id, procname=interp_tra_ice, calledweight=zbeta ) 
    7774      END SELECT 
    78       Agrif_SpecialValue=0. 
     75      Agrif_SpecialValue    = 0._wp 
    7976      Agrif_UseSpecialValue = .FALSE. 
    8077      ! 
    8178   END SUBROUTINE agrif_interp_lim3 
    8279 
    83    !!------------------ 
    84    !! Local subroutines 
    85    !!------------------ 
     80 
    8681   SUBROUTINE interp_u_ice( ptab, i1, i2, j1, j2, before ) 
    8782      !!----------------------------------------------------------------------- 
     
    8984      !! 
    9085      !! i1 i2 j1 j2 are the index of the boundaries parent(when before) and child (when after) 
    91       !! To solve issues when parent grid is "land" masked but not all the corresponding child grid points, 
    92       !! put -9999 WHERE the parent grid is masked. The child solution will be found in the 9(?) points around 
    93       !!----------------------------------------------------------------------- 
    94       INTEGER , INTENT(in) :: i1, i2, j1, j2 
    95       REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) :: ptab 
    96       LOGICAL , INTENT(in) :: before 
    97       !! 
    98       REAL(wp) :: zrhoy 
     86      !! To solve issues when parent grid is "land" masked but not all the corresponding child  
     87      !! grid points, put Agrif_SpecialValue WHERE the parent grid is masked.  
     88      !! The child solution will be found in the 9(?) points around 
     89      !!----------------------------------------------------------------------- 
     90      INTEGER                         , INTENT(in   ) ::   i1, i2, j1, j2 
     91      REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) ::   ptab 
     92      LOGICAL                         , INTENT(in   ) ::   before 
     93      !! 
     94      REAL(wp) ::   zrhoy   ! local scalar 
    9995      !!----------------------------------------------------------------------- 
    10096      ! 
    10197      IF( before ) THEN  ! parent grid 
    10298         ptab(:,:) = e2u(i1:i2,j1:j2) * u_ice_b(i1:i2,j1:j2) 
    103          WHERE( umask(i1:i2,j1:j2,1) == 0. )  ptab(:,:) = -9999. 
     99         WHERE( umask(i1:i2,j1:j2,1) == 0. )   ptab(i1:i2,j1:j2) = Agrif_SpecialValue 
    104100      ELSE               ! child grid 
    105101         zrhoy = Agrif_Rhoy() 
    106          u_ice(i1:i2,j1:j2) = ptab(:,:) / ( e2u(i1:i2,j1:j2) * zrhoy ) * umask(i1:i2,j1:j2,1) 
     102         u_ice(i1:i2,j1:j2) = ptab(i1:i2,j1:j2) / ( e2u(i1:i2,j1:j2) * zrhoy ) * umask(i1:i2,j1:j2,1) 
    107103      ENDIF 
    108104      ! 
     
    115111      !! 
    116112      !! i1 i2 j1 j2 are the index of the boundaries parent(when before) and child (when after) 
    117       !! To solve issues when parent grid is "land" masked but not all the corresponding child grid points, 
    118       !! put -9999 WHERE the parent grid is masked. The child solution will be found in the 9(?) points around 
     113      !! To solve issues when parent grid is "land" masked but not all the corresponding child  
     114      !! grid points, put Agrif_SpecialValue WHERE the parent grid is masked.  
     115      !! The child solution will be found in the 9(?) points around 
    119116      !!-----------------------------------------------------------------------       
    120       INTEGER , INTENT(in) :: i1, i2, j1, j2 
    121       REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) :: ptab 
    122       LOGICAL , INTENT(in) :: before 
    123       !! 
    124       REAL(wp) :: zrhox 
     117      INTEGER                         , INTENT(in   ) ::  i1, i2, j1, j2 
     118      REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) ::   ptab 
     119      LOGICAL                         , INTENT(in   ) ::  before 
     120      !! 
     121      REAL(wp) ::   zrhox   ! local scalar 
    125122      !!----------------------------------------------------------------------- 
    126123      ! 
    127124      IF( before ) THEN  ! parent grid 
    128125         ptab(:,:) = e1v(i1:i2,j1:j2) * v_ice_b(i1:i2,j1:j2) 
    129          WHERE( vmask(i1:i2,j1:j2,1) == 0. )  ptab(:,:) = -9999. 
     126         WHERE( vmask(i1:i2,j1:j2,1) == 0. )   ptab(i1:i2,j1:j2) = Agrif_SpecialValue 
    130127      ELSE               ! child grid 
    131128         zrhox = Agrif_Rhox() 
    132          v_ice(i1:i2,j1:j2) = ptab(:,:) / ( e1v(i1:i2,j1:j2) * zrhox ) * vmask(i1:i2,j1:j2,1) 
     129         v_ice(i1:i2,j1:j2) = ptab(i1:i2,j1:j2) / ( e1v(i1:i2,j1:j2) * zrhox ) * vmask(i1:i2,j1:j2,1) 
    133130      ENDIF 
    134131      ! 
     
    141138      !! 
    142139      !! i1 i2 j1 j2 are the index of the boundaries parent(when before) and child (when after) 
    143       !! To solve issues when parent grid is "land" masked but not all the corresponding child grid points, 
    144       !! put -9999 WHERE the parent grid is masked. The child solution will be found in the 9(?) points around 
    145       !!----------------------------------------------------------------------- 
    146       REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) :: ptab 
    147       INTEGER , INTENT(in) :: i1, i2, j1, j2, k1, k2 
    148       LOGICAL , INTENT(in) :: before 
    149       INTEGER , INTENT(in) :: nb, ndir 
    150       !! 
    151       REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: ztab 
     140      !! To solve issues when parent grid is "land" masked but not all the corresponding child  
     141      !! grid points, put Agrif_SpecialValue WHERE the parent grid is masked.  
     142      !! The child solution will be found in the 9(?) points around 
     143      !!----------------------------------------------------------------------- 
     144      REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) ::   ptab 
     145      INTEGER                               , INTENT(in   ) ::   i1, i2, j1, j2, k1, k2 
     146      LOGICAL                               , INTENT(in   ) ::   before 
     147      INTEGER                               , INTENT(in   ) ::   nb, ndir 
     148      !! 
    152149      INTEGER  ::   ji, jj, jk, jl, jm 
    153150      INTEGER  ::   imin, imax, jmin, jmax 
     151      LOGICAL  ::   western_side, eastern_side, northern_side, southern_side 
    154152      REAL(wp) ::   zrhox, z1, z2, z3, z4, z5, z6, z7 
    155       LOGICAL  ::   western_side, eastern_side, northern_side, southern_side 
    156  
    157       !!----------------------------------------------------------------------- 
    158       ! tracers are not multiplied by grid cell here => before: * e12t ; after: * r1_e12t / rhox / rhoy 
     153      REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::   ztab 
     154      !!----------------------------------------------------------------------- 
     155      ! tracers are not multiplied by grid cell here => before: * e1e2t ; after: * r1_e1e2t / rhox / rhoy 
    159156      ! and it is ok since we conserve tracers (same as in the ocean). 
    160       ALLOCATE( ztab(SIZE(a_i_b,1),SIZE(a_i_b,2),SIZE(ptab,3)) ) 
     157      ALLOCATE( ztab(SIZE(a_i,1),SIZE(a_i,2),SIZE(ptab,3)) ) 
    161158      
    162159      IF( before ) THEN  ! parent grid 
    163160         jm = 1 
    164161         DO jl = 1, jpl 
    165             ptab(i1:i2,j1:j2,jm) = a_i_b  (i1:i2,j1:j2,jl) ; jm = jm + 1 
    166             ptab(i1:i2,j1:j2,jm) = v_i_b  (i1:i2,j1:j2,jl) ; jm = jm + 1 
    167             ptab(i1:i2,j1:j2,jm) = v_s_b  (i1:i2,j1:j2,jl) ; jm = jm + 1 
    168             ptab(i1:i2,j1:j2,jm) = smv_i_b(i1:i2,j1:j2,jl) ; jm = jm + 1 
    169             ptab(i1:i2,j1:j2,jm) = oa_i_b (i1:i2,j1:j2,jl) ; jm = jm + 1 
     162            ptab(i1:i2,j1:j2,jm  ) = a_i_b (i1:i2,j1:j2,jl) 
     163            ptab(i1:i2,j1:j2,jm+1) = v_i_b (i1:i2,j1:j2,jl) 
     164            ptab(i1:i2,j1:j2,jm+2) = v_s_b (i1:i2,j1:j2,jl) 
     165            ptab(i1:i2,j1:j2,jm+3) = sv_i_b(i1:i2,j1:j2,jl) 
     166            ptab(i1:i2,j1:j2,jm+4) = oa_i_b(i1:i2,j1:j2,jl) 
     167            jm = jm + 5 
    170168            DO jk = 1, nlay_s 
    171                ptab(i1:i2,j1:j2,jm) = e_s_b(i1:i2,j1:j2,jk,jl) ; jm = jm + 1 
    172             ENDDO 
     169               ptab(i1:i2,j1:j2,jm) = e_s_b(i1:i2,j1:j2,jk,jl)   ;  jm = jm + 1 
     170            END DO 
    173171            DO jk = 1, nlay_i 
    174                ptab(i1:i2,j1:j2,jm) = e_i_b(i1:i2,j1:j2,jk,jl) ; jm = jm + 1 
    175             ENDDO 
    176          ENDDO 
     172               ptab(i1:i2,j1:j2,jm) = e_i_b(i1:i2,j1:j2,jk,jl)   ;  jm = jm + 1 
     173            END DO 
     174         END DO 
    177175          
    178176         DO jk = k1, k2 
    179             WHERE( tmask(i1:i2,j1:j2,1) == 0. )  ptab(i1:i2,j1:j2,jk) = -9999. 
    180          ENDDO 
     177            WHERE( tmask(i1:i2,j1:j2,1) == 0._wp )   ptab(i1:i2,j1:j2,jk) = Agrif_SpecialValue 
     178         END DO 
     179         ! 
     180      ELSE               ! child grid 
     181         ! 
     182         IF( nbghostcells > 1 ) THEN   ! ==> The easiest interpolation is used 
     183            ! 
     184            jm = 1 
     185            DO jl = 1, jpl 
     186               ! 
     187               DO jj = j1, j2 
     188                  DO ji = i1, i2 
     189                     a_i (ji,jj,jl) = ptab(ji,jj,jm  ) * tmask(ji,jj,1) 
     190                     v_i (ji,jj,jl) = ptab(ji,jj,jm+1) * tmask(ji,jj,1) 
     191                     v_s (ji,jj,jl) = ptab(ji,jj,jm+2) * tmask(ji,jj,1) 
     192                     sv_i(ji,jj,jl) = ptab(ji,jj,jm+3) * tmask(ji,jj,1) 
     193                     oa_i(ji,jj,jl) = ptab(ji,jj,jm+4) * tmask(ji,jj,1) 
     194                  END DO 
     195               END DO 
     196               jm = jm + 5 
     197               ! 
     198               DO jk = 1, nlay_s 
     199                  e_s(i1:i2,j1:j2,jk,jl) = ptab(:,:,jm) * tmask(i1:i2,j1:j2,1) 
     200                  jm = jm + 1 
     201               END DO 
     202               ! 
     203               DO jk = 1, nlay_i 
     204                  e_i(i1:i2,j1:j2,jk,jl) = ptab(:,:,jm) * tmask(i1:i2,j1:j2,1) 
     205                  jm = jm + 1 
     206               END DO 
     207               ! 
     208            END DO 
     209            ! 
     210         ELSE                          ! ==> complex interpolation (only one ghost cell available) 
     211            !! Use a more complex interpolation since we mix solutions over a couple of grid points 
     212            !! it is advised to use it for fields modified by high order schemes (e.g. advection UM5...) 
     213            !! clem: for some reason (I don't know why), the following lines do not work  
     214            !!       with mpp (or in realistic configurations?). It makes the model crash 
     215            !        I think there is an issue with Agrif_SpecialValue here (not taken into account properly) 
     216            ! record ztab 
     217            jm = 1 
     218            DO jl = 1, jpl 
     219               ztab(:,:,jm  ) = a_i  (:,:,jl) 
     220               ztab(:,:,jm+1) = v_i  (:,:,jl) 
     221               ztab(:,:,jm+2) = v_s  (:,:,jl) 
     222               ztab(:,:,jm+3) = sv_i(:,:,jl) 
     223               ztab(:,:,jm+4) = oa_i(:,:,jl) 
     224               jm = jm + 5 
     225               DO jk = 1, nlay_s 
     226                  ztab(:,:,jm) = e_s(:,:,jk,jl) 
     227                  jm = jm + 1 
     228               END DO 
     229               DO jk = 1, nlay_i 
     230                  ztab(:,:,jm) = e_i(:,:,jk,jl) 
     231                  jm = jm + 1 
     232               END DO 
     233               ! 
     234            END DO 
     235            ! 
     236            ! borders of the domain 
     237            western_side  = (nb == 1).AND.(ndir == 1)  ;  eastern_side  = (nb == 1).AND.(ndir == 2) 
     238            southern_side = (nb == 2).AND.(ndir == 1)  ;  northern_side = (nb == 2).AND.(ndir == 2) 
     239            ! 
     240            ! spatial smoothing 
     241            zrhox = Agrif_Rhox() 
     242            z1 =      ( zrhox - 1. ) * 0.5  
     243            z3 =      ( zrhox - 1. ) / ( zrhox + 1. ) 
     244            z6 = 2. * ( zrhox - 1. ) / ( zrhox + 1. ) 
     245            z7 =    - ( zrhox - 1. ) / ( zrhox + 3. ) 
     246            z2 = 1. - z1 
     247            z4 = 1. - z3 
     248            z5 = 1. - z6 - z7 
     249            ! 
     250            ! Remove corners 
     251            imin = i1  ;  imax = i2  ;  jmin = j1  ;  jmax = j2 
     252            IF( (nbondj == -1) .OR. (nbondj == 2) )   jmin = 3 
     253            IF( (nbondj == +1) .OR. (nbondj == 2) )   jmax = nlcj-2 
     254            IF( (nbondi == -1) .OR. (nbondi == 2) )   imin = 3 
     255            IF( (nbondi == +1) .OR. (nbondi == 2) )   imax = nlci-2 
     256 
     257            ! smoothed fields 
     258            IF( eastern_side ) THEN 
     259               ztab(nlci,j1:j2,:) = z1 * ptab(nlci,j1:j2,:) + z2 * ptab(nlci-1,j1:j2,:) 
     260               DO jj = jmin, jmax 
     261                  rswitch = 0. 
     262                  IF( u_ice(nlci-2,jj) > 0._wp ) rswitch = 1. 
     263                  ztab(nlci-1,jj,:) = ( 1. - umask(nlci-2,jj,1) ) * ztab(nlci,jj,:)  & 
     264                     &                +      umask(nlci-2,jj,1)   *  & 
     265                     &                ( ( 1. - rswitch ) * ( z4 * ztab(nlci,jj,:)   + z3 * ztab(nlci-2,jj,:) )  & 
     266                     &                  +      rswitch   * ( z6 * ztab(nlci-2,jj,:) + z5 * ztab(nlci,jj,:) + z7 * ztab(nlci-3,jj,:) ) ) 
     267                  ztab(nlci-1,jj,:) = ztab(nlci-1,jj,:) * tmask(nlci-1,jj,1) 
     268               END DO 
     269            ENDIF 
     270            !  
     271            IF( northern_side ) THEN 
     272               ztab(i1:i2,nlcj,:) = z1 * ptab(i1:i2,nlcj,:) + z2 * ptab(i1:i2,nlcj-1,:) 
     273               DO ji = imin, imax 
     274                  rswitch = 0. 
     275                  IF( v_ice(ji,nlcj-2) > 0._wp ) rswitch = 1. 
     276                  ztab(ji,nlcj-1,:) = ( 1. - vmask(ji,nlcj-2,1) ) * ztab(ji,nlcj,:)  & 
     277                     &                +      vmask(ji,nlcj-2,1)   *  & 
     278                     &                ( ( 1. - rswitch ) * ( z4 * ztab(ji,nlcj,:)   + z3 * ztab(ji,nlcj-2,:) ) & 
     279                     &                  +      rswitch   * ( z6 * ztab(ji,nlcj-2,:) + z5 * ztab(ji,nlcj,:) + z7 * ztab(ji,nlcj-3,:) ) ) 
     280                  ztab(ji,nlcj-1,:) = ztab(ji,nlcj-1,:) * tmask(ji,nlcj-1,1) 
     281               END DO 
     282            END IF 
     283            ! 
     284            IF( western_side) THEN 
     285               ztab(1,j1:j2,:) = z1 * ptab(1,j1:j2,:) + z2 * ptab(2,j1:j2,:) 
     286               DO jj = jmin, jmax 
     287                  rswitch = 0. 
     288                  IF( u_ice(2,jj) < 0._wp ) rswitch = 1. 
     289                  ztab(2,jj,:) = ( 1. - umask(2,jj,1) ) * ztab(1,jj,:)  & 
     290                     &           +      umask(2,jj,1)   *   & 
     291                     &           ( ( 1. - rswitch ) * ( z4 * ztab(1,jj,:) + z3 * ztab(3,jj,:) ) & 
     292                     &             +      rswitch   * ( z6 * ztab(3,jj,:) + z5 * ztab(1,jj,:) + z7 * ztab(4,jj,:) ) ) 
     293                  ztab(2,jj,:) = ztab(2,jj,:) * tmask(2,jj,1) 
     294               END DO 
     295            ENDIF 
     296            ! 
     297            IF( southern_side ) THEN 
     298               ztab(i1:i2,1,:) = z1 * ptab(i1:i2,1,:) + z2 * ptab(i1:i2,2,:) 
     299               DO ji = imin, imax 
     300                  rswitch = 0. 
     301                  IF( v_ice(ji,2) < 0._wp ) rswitch = 1. 
     302                  ztab(ji,2,:) = ( 1. - vmask(ji,2,1) ) * ztab(ji,1,:)  & 
     303                     &           +      vmask(ji,2,1)   *  & 
     304                     &           ( ( 1. - rswitch ) * ( z4 * ztab(ji,1,:) + z3 * ztab(ji,3,:) ) & 
     305                     &             +      rswitch   * ( z6 * ztab(ji,3,:) + z5 * ztab(ji,1,:) + z7 * ztab(ji,4,:) ) ) 
     306                  ztab(ji,2,:) = ztab(ji,2,:) * tmask(ji,2,1) 
     307               END DO 
     308            END IF 
     309            ! 
     310            ! Treatment of corners 
     311            IF( (eastern_side) .AND. ((nbondj == -1).OR.(nbondj == 2)) )  ztab(nlci-1,2,:)      = ptab(nlci-1,2,:)      ! East south 
     312            IF( (eastern_side) .AND. ((nbondj ==  1).OR.(nbondj == 2)) )  ztab(nlci-1,nlcj-1,:) = ptab(nlci-1,nlcj-1,:) ! East north 
     313            IF( (western_side) .AND. ((nbondj == -1).OR.(nbondj == 2)) )  ztab(2,2,:)           = ptab(2,2,:)           ! West south 
     314            IF( (western_side) .AND. ((nbondj ==  1).OR.(nbondj == 2)) )  ztab(2,nlcj-1,:)      = ptab(2,nlcj-1,:)      ! West north 
     315             
     316            ! retrieve ice tracers 
     317            jm = 1 
     318            DO jl = 1, jpl 
     319               ! 
     320               DO jj = j1, j2 
     321                  DO ji = i1, i2 
     322                     a_i (ji,jj,jl) = ztab(ji,jj,jm  ) * tmask(ji,jj,1) 
     323                     v_i (ji,jj,jl) = ztab(ji,jj,jm+1) * tmask(ji,jj,1) 
     324                     v_s (ji,jj,jl) = ztab(ji,jj,jm+2) * tmask(ji,jj,1) 
     325                     sv_i(ji,jj,jl) = ztab(ji,jj,jm+3) * tmask(ji,jj,1) 
     326                     oa_i (ji,jj,jl) = ztab(ji,jj,jm+4) * tmask(ji,jj,1) 
     327                  END DO 
     328               END DO 
     329               jm = jm + 5 
     330               ! 
     331               DO jk = 1, nlay_s 
     332                  e_s(i1:i2,j1:j2,jk,jl) = ztab(i1:i2,j1:j2,jm) * tmask(i1:i2,j1:j2,1) 
     333                  jm = jm + 1 
     334               END DO 
     335               ! 
     336               DO jk = 1, nlay_i 
     337                  e_i(i1:i2,j1:j2,jk,jl) = ztab(i1:i2,j1:j2,jm) * tmask(i1:i2,j1:j2,1) 
     338                  jm = jm + 1 
     339               END DO 
     340               ! 
     341            END DO 
     342           
     343         ENDIF  ! nbghostcells=1 
    181344          
    182       ELSE               ! child grid 
    183 !! ==> The easiest interpolation is the following commented lines 
    184          jm = 1 
    185          DO jl = 1, jpl 
    186             a_i  (i1:i2,j1:j2,jl) = ptab(i1:i2,j1:j2,jm) * tmask(i1:i2,j1:j2,1) ; jm = jm + 1 
    187             v_i  (i1:i2,j1:j2,jl) = ptab(i1:i2,j1:j2,jm) * tmask(i1:i2,j1:j2,1) ; jm = jm + 1 
    188             v_s  (i1:i2,j1:j2,jl) = ptab(i1:i2,j1:j2,jm) * tmask(i1:i2,j1:j2,1) ; jm = jm + 1 
    189             smv_i(i1:i2,j1:j2,jl) = ptab(i1:i2,j1:j2,jm) * tmask(i1:i2,j1:j2,1) ; jm = jm + 1 
    190             oa_i (i1:i2,j1:j2,jl) = ptab(i1:i2,j1:j2,jm) * tmask(i1:i2,j1:j2,1) ; jm = jm + 1 
    191             DO jk = 1, nlay_s 
    192                e_s(i1:i2,j1:j2,jk,jl) = ptab(i1:i2,j1:j2,jm) * tmask(i1:i2,j1:j2,1) ; jm = jm + 1 
    193             ENDDO 
    194             DO jk = 1, nlay_i 
    195                e_i(i1:i2,j1:j2,jk,jl) = ptab(i1:i2,j1:j2,jm) * tmask(i1:i2,j1:j2,1) ; jm = jm + 1 
    196             ENDDO 
    197          ENDDO 
    198  
    199 !! ==> this is a more complex interpolation since we mix solutions over a couple of grid points 
    200 !!     it is advised to use it for fields modified by high order schemes (e.g. advection UM5...) 
    201 !!        clem: for some reason (I don't know why), the following lines do not work  
    202 !!              with mpp (or in realistic configurations?). It makes the model crash 
    203 !         ! record ztab 
    204 !         jm = 1 
    205 !         DO jl = 1, jpl 
    206 !            ztab(:,:,jm) = a_i  (:,:,jl) ; jm = jm + 1 
    207 !            ztab(:,:,jm) = v_i  (:,:,jl) ; jm = jm + 1 
    208 !            ztab(:,:,jm) = v_s  (:,:,jl) ; jm = jm + 1 
    209 !            ztab(:,:,jm) = smv_i(:,:,jl) ; jm = jm + 1 
    210 !            ztab(:,:,jm) = oa_i (:,:,jl) ; jm = jm + 1 
    211 !            DO jk = 1, nlay_s 
    212 !               ztab(:,:,jm) = e_s(:,:,jk,jl) ; jm = jm + 1 
    213 !            ENDDO 
    214 !            DO jk = 1, nlay_i 
    215 !               ztab(:,:,jm) = e_i(:,:,jk,jl) ; jm = jm + 1 
    216 !            ENDDO 
    217 !         ENDDO 
    218 !         ! 
    219 !         ! borders of the domain 
    220 !         western_side  = (nb == 1).AND.(ndir == 1)  ;  eastern_side  = (nb == 1).AND.(ndir == 2) 
    221 !         southern_side = (nb == 2).AND.(ndir == 1)  ;  northern_side = (nb == 2).AND.(ndir == 2) 
    222 !         ! 
    223 !         ! spatial smoothing 
    224 !         zrhox = Agrif_Rhox() 
    225 !         z1 =      ( zrhox - 1. ) * 0.5  
    226 !         z3 =      ( zrhox - 1. ) / ( zrhox + 1. ) 
    227 !         z6 = 2. * ( zrhox - 1. ) / ( zrhox + 1. ) 
    228 !         z7 =    - ( zrhox - 1. ) / ( zrhox + 3. ) 
    229 !         z2 = 1. - z1 
    230 !         z4 = 1. - z3 
    231 !         z5 = 1. - z6 - z7 
    232 !         ! 
    233 !         ! Remove corners 
    234 !         imin = i1  ;  imax = i2  ;  jmin = j1  ;  jmax = j2 
    235 !         IF( (nbondj == -1) .OR. (nbondj == 2) )   jmin = 3 
    236 !         IF( (nbondj == +1) .OR. (nbondj == 2) )   jmax = nlcj-2 
    237 !         IF( (nbondi == -1) .OR. (nbondi == 2) )   imin = 3 
    238 !         IF( (nbondi == +1) .OR. (nbondi == 2) )   imax = nlci-2 
    239 ! 
    240 !         ! smoothed fields 
    241 !         IF( eastern_side ) THEN 
    242 !            ztab(nlci,j1:j2,:) = z1 * ptab(nlci,j1:j2,:) + z2 * ptab(nlci-1,j1:j2,:) 
    243 !            DO jj = jmin, jmax 
    244 !               rswitch = 0. 
    245 !               IF( u_ice(nlci-2,jj) > 0._wp ) rswitch = 1. 
    246 !               ztab(nlci-1,jj,:) = ( 1. - umask(nlci-2,jj,1) ) * ztab(nlci,jj,:)  & 
    247 !                  &                +      umask(nlci-2,jj,1)   *  & 
    248 !                  &                ( ( 1. - rswitch ) * ( z4 * ztab(nlci,jj,:)   + z3 * ztab(nlci-2,jj,:) )  & 
    249 !                  &                  +      rswitch   * ( z6 * ztab(nlci-2,jj,:) + z5 * ztab(nlci,jj,:) + z7 * ztab(nlci-3,jj,:) ) ) 
    250 !               ztab(nlci-1,jj,:) = ztab(nlci-1,jj,:) * tmask(nlci-1,jj,1) 
    251 !            END DO 
    252 !         ENDIF 
    253 !         !  
    254 !         IF( northern_side ) THEN 
    255 !            ztab(i1:i2,nlcj,:) = z1 * ptab(i1:i2,nlcj,:) + z2 * ptab(i1:i2,nlcj-1,:) 
    256 !            DO ji = imin, imax 
    257 !               rswitch = 0. 
    258 !               IF( v_ice(ji,nlcj-2) > 0._wp ) rswitch = 1. 
    259 !               ztab(ji,nlcj-1,:) = ( 1. - vmask(ji,nlcj-2,1) ) * ztab(ji,nlcj,:)  & 
    260 !                  &                +      vmask(ji,nlcj-2,1)   *  & 
    261 !                  &                ( ( 1. - rswitch ) * ( z4 * ztab(ji,nlcj,:)   + z3 * ztab(ji,nlcj-2,:) ) & 
    262 !                  &                  +      rswitch   * ( z6 * ztab(ji,nlcj-2,:) + z5 * ztab(ji,nlcj,:) + z7 * ztab(ji,nlcj-3,:) ) ) 
    263 !               ztab(ji,nlcj-1,:) = ztab(ji,nlcj-1,:) * tmask(ji,nlcj-1,1) 
    264 !            END DO 
    265 !         END IF 
    266 !         ! 
    267 !         IF( western_side) THEN 
    268 !            ztab(1,j1:j2,:) = z1 * ptab(1,j1:j2,:) + z2 * ptab(2,j1:j2,:) 
    269 !            DO jj = jmin, jmax 
    270 !               rswitch = 0. 
    271 !               IF( u_ice(2,jj) < 0._wp ) rswitch = 1. 
    272 !               ztab(2,jj,:) = ( 1. - umask(2,jj,1) ) * ztab(1,jj,:)  & 
    273 !                  &           +      umask(2,jj,1)   *   & 
    274 !                  &           ( ( 1. - rswitch ) * ( z4 * ztab(1,jj,:) + z3 * ztab(3,jj,:) ) & 
    275 !                  &             +      rswitch   * ( z6 * ztab(3,jj,:) + z5 * ztab(1,jj,:) + z7 * ztab(4,jj,:) ) ) 
    276 !               ztab(2,jj,:) = ztab(2,jj,:) * tmask(2,jj,1) 
    277 !            END DO 
    278 !         ENDIF 
    279 !         ! 
    280 !         IF( southern_side ) THEN 
    281 !            ztab(i1:i2,1,:) = z1 * ptab(i1:i2,1,:) + z2 * ptab(i1:i2,2,:) 
    282 !            DO ji = imin, imax 
    283 !               rswitch = 0. 
    284 !               IF( v_ice(ji,2) < 0._wp ) rswitch = 1. 
    285 !               ztab(ji,2,:) = ( 1. - vmask(ji,2,1) ) * ztab(ji,1,:)  & 
    286 !                  &           +      vmask(ji,2,1)   *  & 
    287 !                  &           ( ( 1. - rswitch ) * ( z4 * ztab(ji,1,:) + z3 * ztab(ji,3,:) ) & 
    288 !                  &             +      rswitch   * ( z6 * ztab(ji,3,:) + z5 * ztab(ji,1,:) + z7 * ztab(ji,4,:) ) ) 
    289 !               ztab(ji,2,:) = ztab(ji,2,:) * tmask(ji,2,1) 
    290 !            END DO 
    291 !         END IF 
    292 !         ! 
    293 !         ! Treatment of corners 
    294 !         IF( (eastern_side) .AND. ((nbondj == -1).OR.(nbondj == 2)) )  ztab(nlci-1,2,:)      = ptab(nlci-1,2,:)      ! East south 
    295 !         IF( (eastern_side) .AND. ((nbondj ==  1).OR.(nbondj == 2)) )  ztab(nlci-1,nlcj-1,:) = ptab(nlci-1,nlcj-1,:) ! East north 
    296 !         IF( (western_side) .AND. ((nbondj == -1).OR.(nbondj == 2)) )  ztab(2,2,:)           = ptab(2,2,:)           ! West south 
    297 !         IF( (western_side) .AND. ((nbondj ==  1).OR.(nbondj == 2)) )  ztab(2,nlcj-1,:)      = ptab(2,nlcj-1,:)      ! West north 
    298 ! 
    299 !         ! retrieve ice tracers 
    300 !         jm = 1 
    301 !         DO jl = 1, jpl 
    302 !            a_i  (i1:i2,j1:j2,jl) = ztab(i1:i2,j1:j2,jm) ; jm = jm + 1 
    303 !            v_i  (i1:i2,j1:j2,jl) = ztab(i1:i2,j1:j2,jm) ; jm = jm + 1 
    304 !            v_s  (i1:i2,j1:j2,jl) = ztab(i1:i2,j1:j2,jm) ; jm = jm + 1 
    305 !            smv_i(i1:i2,j1:j2,jl) = ztab(i1:i2,j1:j2,jm) ; jm = jm + 1 
    306 !            oa_i (i1:i2,j1:j2,jl) = ztab(i1:i2,j1:j2,jm) ; jm = jm + 1 
    307 !            DO jk = 1, nlay_s 
    308 !               e_s(i1:i2,j1:j2,jk,jl) = ztab(i1:i2,j1:j2,jm) ; jm = jm + 1 
    309 !            ENDDO 
    310 !            DO jk = 1, nlay_i 
    311 !               e_i(i1:i2,j1:j2,jk,jl) = ztab(i1:i2,j1:j2,jm) ; jm = jm + 1 
    312 !            ENDDO 
    313 !         ENDDO 
    314         
    315345         ! integrated values 
    316346         vt_i (i1:i2,j1:j2) = SUM( v_i(i1:i2,j1:j2,:), dim=3 ) 
     
    319349         et_s(i1:i2,j1:j2)  = SUM( SUM( e_s(i1:i2,j1:j2,:,:), dim=4 ), dim=3 ) 
    320350         et_i(i1:i2,j1:j2)  = SUM( SUM( e_i(i1:i2,j1:j2,:,:), dim=4 ), dim=3 ) 
    321  
     351         ! 
    322352      ENDIF 
    323353       
     
    327357 
    328358#else 
     359   !!---------------------------------------------------------------------- 
     360   !!   Empty module                                             no sea-ice 
     361   !!---------------------------------------------------------------------- 
    329362CONTAINS 
    330363   SUBROUTINE agrif_lim3_interp_empty 
    331       !!--------------------------------------------- 
    332       !!   *** ROUTINE agrif_lim3_interp_empty *** 
    333       !!--------------------------------------------- 
    334364      WRITE(*,*)  'agrif_lim3_interp : You should not have seen this print! error?' 
    335365   END SUBROUTINE agrif_lim3_interp_empty 
    336366#endif 
     367 
     368   !!====================================================================== 
    337369END MODULE agrif_lim3_interp 
  • branches/2017/dev_CNRS_2017/NEMOGCM/NEMO/NST_SRC/agrif_lim3_update.F90

    r7761 r8882  
    3131   PRIVATE 
    3232 
    33    PUBLIC agrif_update_lim3 
    34  
    35    !!---------------------------------------------------------------------- 
    36    !! NEMO/NST 3.6 , LOCEAN-IPSL (2016) 
     33   PUBLIC   agrif_update_lim3   ! called by agrif_user.F90 
     34 
     35   !!---------------------------------------------------------------------- 
     36   !! NEMO/NST 4.0 , LOCEAN-IPSL (2017) 
    3737   !! $Id: agrif_lim3_update.F90 6204 2016-01-04 13:47:06Z cetlod $ 
    3838   !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) 
    3939   !!---------------------------------------------------------------------- 
    40  
    4140CONTAINS 
    4241 
     
    4948      !!---------------------------------------------------------------------- 
    5049      INTEGER, INTENT(in) :: kt 
    51       !! 
    5250      !!---------------------------------------------------------------------- 
    5351      ! 
     
    5654      IF( ( MOD( (kt-nit000)/nn_fsbc + 1, Agrif_irhot() * Agrif_Parent(nn_fsbc) / nn_fsbc ) /=0 ) .AND. (kt /= 0) ) RETURN ! do not update if nb of child time steps differ from time refinement 
    5755                                                                                                                           ! i.e. update only at the parent time step 
     56      IF( nn_ice == 0 ) RETURN   ! clem2017: do not update if child domain does not have ice 
     57      ! 
     58      Agrif_SpecialValueFineGrid    = -9999. 
    5859      Agrif_UseSpecialValueInUpdate = .TRUE. 
    59       Agrif_SpecialValueFineGrid = -9999. 
    6060# if defined TWO_WAY 
    6161      IF( MOD(nbcline,nbclineupdate) == 0) THEN ! update the whole basin at each nbclineupdate (=nn_cln_update) baroclinic parent time steps 
     
    7070      ENDIF 
    7171# endif 
     72      Agrif_SpecialValueFineGrid    = 0. 
    7273      Agrif_UseSpecialValueInUpdate = .FALSE. 
    7374      ! 
     
    7576 
    7677 
    77    !!------------------ 
    78    !! Local subroutines 
    79    !!------------------ 
    8078   SUBROUTINE update_tra_ice( ptab, i1, i2, j1, j2, k1, k2, before ) 
    8179      !!----------------------------------------------------------------------- 
     
    8482      !!              the properties per mass on the coarse grid 
    8583      !!----------------------------------------------------------------------- 
    86       INTEGER , INTENT(in) :: i1, i2, j1, j2, k1, k2 
    87       REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) :: ptab 
    88       LOGICAL , INTENT(in) :: before 
    89       !! 
    90       INTEGER  :: jk, jl, jm 
     84      INTEGER                               , INTENT(in   ) ::  i1, i2, j1, j2, k1, k2 
     85      REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) ::   ptab 
     86      LOGICAL                               , INTENT(in   ) ::  before 
     87      !! 
     88      INTEGER  :: ji, jj, jk, jl, jm 
    9189      !!----------------------------------------------------------------------- 
    9290      ! it is ok not to multiply by e1*e2 since we conserve tracers here (same as in the ocean). 
     
    9492         jm = 1 
    9593         DO jl = 1, jpl 
    96             ptab(:,:,jm) = a_i  (i1:i2,j1:j2,jl) ; jm = jm + 1 
    97             ptab(:,:,jm) = v_i  (i1:i2,j1:j2,jl) ; jm = jm + 1 
    98             ptab(:,:,jm) = v_s  (i1:i2,j1:j2,jl) ; jm = jm + 1 
    99             ptab(:,:,jm) = smv_i(i1:i2,j1:j2,jl) ; jm = jm + 1 
    100             ptab(:,:,jm) = oa_i (i1:i2,j1:j2,jl) ; jm = jm + 1 
     94            ptab(i1:i2,j1:j2,jm  ) = a_i (i1:i2,j1:j2,jl) 
     95            ptab(i1:i2,j1:j2,jm+1) = v_i (i1:i2,j1:j2,jl) 
     96            ptab(i1:i2,j1:j2,jm+2) = v_s (i1:i2,j1:j2,jl) 
     97            ptab(i1:i2,j1:j2,jm+3) = sv_i(i1:i2,j1:j2,jl) 
     98            ptab(i1:i2,j1:j2,jm+4) = oa_i (i1:i2,j1:j2,jl) 
     99            jm = jm + 5 
    101100            DO jk = 1, nlay_s 
    102                ptab(:,:,jm) = e_s(i1:i2,j1:j2,jk,jl) ; jm = jm + 1 
    103             ENDDO 
     101               ptab(i1:i2,j1:j2,jm) = e_s(i1:i2,j1:j2,jk,jl)   ;  jm = jm + 1 
     102            END DO 
    104103            DO jk = 1, nlay_i 
    105                ptab(:,:,jm) = e_i(i1:i2,j1:j2,jk,jl) ; jm = jm + 1 
    106             ENDDO 
    107          ENDDO 
    108  
     104               ptab(i1:i2,j1:j2,jm) = e_i(i1:i2,j1:j2,jk,jl)   ;  jm = jm + 1 
     105            END DO 
     106         END DO 
     107         ! 
    109108         DO jk = k1, k2 
    110             WHERE( tmask(i1:i2,j1:j2,1) == 0. )  ptab(:,:,jk) = -9999. 
    111          ENDDO 
    112                    
     109            WHERE( tmask(i1:i2,j1:j2,1) == 0. )   ptab(i1:i2,j1:j2,jk) = Agrif_SpecialValueFineGrid  
     110         END DO 
     111         ! 
    113112      ELSE 
     113         ! 
    114114         jm = 1 
    115115         DO jl = 1, jpl 
    116             a_i  (i1:i2,j1:j2,jl) = ptab(:,:,jm) * tmask(i1:i2,j1:j2,1) ; jm = jm + 1 
    117             v_i  (i1:i2,j1:j2,jl) = ptab(:,:,jm) * tmask(i1:i2,j1:j2,1) ; jm = jm + 1 
    118             v_s  (i1:i2,j1:j2,jl) = ptab(:,:,jm) * tmask(i1:i2,j1:j2,1) ; jm = jm + 1 
    119             smv_i(i1:i2,j1:j2,jl) = ptab(:,:,jm) * tmask(i1:i2,j1:j2,1) ; jm = jm + 1 
    120             oa_i (i1:i2,j1:j2,jl) = ptab(:,:,jm) * tmask(i1:i2,j1:j2,1) ; jm = jm + 1 
     116            ! 
     117            DO jj = j1, j2 
     118               DO ji = i1, i2 
     119                  IF( ptab(ji,jj,jm) /= Agrif_SpecialValueFineGrid ) THEN 
     120                     a_i (ji,jj,jl) = ptab(ji,jj,jm  ) * tmask(ji,jj,1) 
     121                     v_i (ji,jj,jl) = ptab(ji,jj,jm+1) * tmask(ji,jj,1) 
     122                     v_s (ji,jj,jl) = ptab(ji,jj,jm+2) * tmask(ji,jj,1) 
     123                     sv_i(ji,jj,jl) = ptab(ji,jj,jm+3) * tmask(ji,jj,1) 
     124                     oa_i(ji,jj,jl) = ptab(ji,jj,jm+4) * tmask(ji,jj,1) 
     125                  ENDIF 
     126               END DO 
     127            END DO 
     128            jm = jm + 5 
     129            ! 
    121130            DO jk = 1, nlay_s 
    122                e_s(i1:i2,j1:j2,jk,jl) = ptab(:,:,jm) * tmask(i1:i2,j1:j2,1) ; jm = jm + 1 
    123             ENDDO 
     131               WHERE( ptab(i1:i2,j1:j2,jm) /= Agrif_SpecialValueFineGrid ) 
     132                  e_s(i1:i2,j1:j2,jk,jl) = ptab(i1:i2,j1:j2,jm) * tmask(i1:i2,j1:j2,1) 
     133               ENDWHERE 
     134               jm = jm + 1 
     135            END DO 
     136            ! 
    124137            DO jk = 1, nlay_i 
    125                e_i(i1:i2,j1:j2,jk,jl) = ptab(:,:,jm) * tmask(i1:i2,j1:j2,1) ; jm = jm + 1 
    126             ENDDO 
    127          ENDDO 
    128  
     138               WHERE( ptab(i1:i2,j1:j2,jm) /= Agrif_SpecialValueFineGrid ) 
     139                  e_i(i1:i2,j1:j2,jk,jl) = ptab(i1:i2,j1:j2,jm) * tmask(i1:i2,j1:j2,1) 
     140               ENDWHERE 
     141               jm = jm + 1 
     142            END DO 
     143            ! 
     144         END DO 
     145         ! 
    129146         ! integrated values 
    130          vt_i (i1:i2,j1:j2) = SUM( v_i(i1:i2,j1:j2,:), dim=3 ) 
    131          vt_s (i1:i2,j1:j2) = SUM( v_s(i1:i2,j1:j2,:), dim=3 ) 
    132          at_i (i1:i2,j1:j2) = SUM( a_i(i1:i2,j1:j2,:), dim=3 ) 
     147         vt_i (i1:i2,j1:j2) = SUM(      v_i(i1:i2,j1:j2,:)           , dim=3 ) 
     148         vt_s (i1:i2,j1:j2) = SUM(      v_s(i1:i2,j1:j2,:)           , dim=3 ) 
     149         at_i (i1:i2,j1:j2) = SUM(      a_i(i1:i2,j1:j2,:)           , dim=3 ) 
    133150         et_s(i1:i2,j1:j2)  = SUM( SUM( e_s(i1:i2,j1:j2,:,:), dim=4 ), dim=3 ) 
    134151         et_i(i1:i2,j1:j2)  = SUM( SUM( e_i(i1:i2,j1:j2,:,:), dim=4 ), dim=3 ) 
     
    144161      !! ** Method  : Update the fluxes and recover the properties (C-grid) 
    145162      !!----------------------------------------------------------------------- 
    146       INTEGER , INTENT(in) :: i1, i2, j1, j2 
    147       REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) :: ptab 
    148       LOGICAL , INTENT(in) :: before 
    149       !! 
    150       REAL(wp) :: zrhoy 
     163      INTEGER                         , INTENT(in   ) ::  i1, i2, j1, j2 
     164      REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) ::   ptab 
     165      LOGICAL                         , INTENT(in   ) ::  before 
     166      !! 
     167      REAL(wp) ::   zrhoy   ! local scalar 
    151168      !!----------------------------------------------------------------------- 
    152169      ! 
     
    154171         zrhoy = Agrif_Rhoy() 
    155172         ptab(:,:) = e2u(i1:i2,j1:j2) * u_ice(i1:i2,j1:j2) * zrhoy 
    156          WHERE( umask(i1:i2,j1:j2,1) == 0. )  ptab(:,:) = -9999. 
     173         WHERE( umask(i1:i2,j1:j2,1) == 0._wp )   ptab(:,:) = Agrif_SpecialValueFineGrid 
    157174      ELSE 
    158          u_ice(i1:i2,j1:j2) = ptab(:,:) / e2u(i1:i2,j1:j2) * umask(i1:i2,j1:j2,1) 
     175         WHERE( ptab(i1:i2,j1:j2) /= Agrif_SpecialValueFineGrid ) 
     176            u_ice(i1:i2,j1:j2) = ptab(i1:i2,j1:j2) / e2u(i1:i2,j1:j2) * umask(i1:i2,j1:j2,1) 
     177         ENDWHERE 
    159178      ENDIF 
    160179      !  
     
    167186      !! ** Method  : Update the fluxes and recover the properties (C-grid) 
    168187      !!----------------------------------------------------------------------- 
    169       INTEGER , INTENT(in) :: i1,i2,j1,j2 
    170       REAL(wp), DIMENSION(i1:i2,j1:j2),  INTENT(inout) :: ptab 
    171       LOGICAL , INTENT(in) :: before 
    172       !! 
    173       REAL(wp) :: zrhox 
     188      INTEGER                         , INTENT(in   ) ::   i1, i2, j1, j2 
     189      REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) ::  ptab 
     190      LOGICAL                         , INTENT(in   ) ::  before 
     191      !! 
     192      REAL(wp) ::   zrhox   ! local scalar 
    174193      !!----------------------------------------------------------------------- 
    175194      ! 
     
    177196         zrhox = Agrif_Rhox() 
    178197         ptab(:,:) = e1v(i1:i2,j1:j2) * v_ice(i1:i2,j1:j2) * zrhox 
    179          WHERE( vmask(i1:i2,j1:j2,1) == 0. )  ptab(:,:) = -9999. 
     198         WHERE( vmask(i1:i2,j1:j2,1) == 0._wp )   ptab(:,:) = Agrif_SpecialValueFineGrid 
    180199      ELSE 
    181          v_ice(i1:i2,j1:j2) = ptab(:,:) / e1v(i1:i2,j1:j2) * vmask(i1:i2,j1:j2,1) 
     200         WHERE( ptab(i1:i2,j1:j2) /= Agrif_SpecialValueFineGrid ) 
     201            v_ice(i1:i2,j1:j2) = ptab(i1:i2,j1:j2) / e1v(i1:i2,j1:j2) * vmask(i1:i2,j1:j2,1) 
     202         ENDWHERE 
    182203      ENDIF 
    183204      ! 
     
    185206 
    186207#else 
     208   !!---------------------------------------------------------------------- 
     209   !!   Empty module                                             no sea-ice 
     210   !!---------------------------------------------------------------------- 
    187211CONTAINS 
    188212   SUBROUTINE agrif_lim3_update_empty 
    189       !!--------------------------------------------- 
    190       !!   *** ROUTINE agrif_lim3_update_empty *** 
    191       !!--------------------------------------------- 
    192213      WRITE(*,*)  'agrif_lim3_update : You should not have seen this print! error?' 
    193214   END SUBROUTINE agrif_lim3_update_empty 
    194215#endif 
     216 
     217   !!====================================================================== 
    195218END MODULE agrif_lim3_update 
  • branches/2017/dev_CNRS_2017/NEMOGCM/NEMO/NST_SRC/agrif_oce.F90

    r5656 r8882  
    4444   LOGICAL , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: tabspongedone_u 
    4545   LOGICAL , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: tabspongedone_v 
    46    REAL(wp), PUBLIC, ALLOCATABLE, SAVE,  DIMENSION(:,:) :: fsaht_spu, fsaht_spv !: sponge diffusivities 
    47    REAL(wp), PUBLIC, ALLOCATABLE, SAVE,  DIMENSION(:,:) :: fsahm_spt, fsahm_spf !: sponge viscosities 
     46   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: fsaht_spu, fsaht_spv !: sponge diffusivities 
     47   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: fsahm_spt, fsahm_spf !: sponge viscosities 
    4848 
    49    ! Barotropic arrays used to store open boundary data during 
    50    ! time-splitting loop: 
    51    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:) ::  ubdy_w, vbdy_w, hbdy_w 
    52    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:) ::  ubdy_e, vbdy_e, hbdy_e 
    53    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:) ::  ubdy_n, vbdy_n, hbdy_n 
    54    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:) ::  ubdy_s, vbdy_s, hbdy_s 
     49   ! Barotropic arrays used to store open boundary data during time-splitting loop: 
     50   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::  ubdy_w, vbdy_w, hbdy_w 
     51   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::  ubdy_e, vbdy_e, hbdy_e 
     52   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::  ubdy_n, vbdy_n, hbdy_n 
     53   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::  ubdy_s, vbdy_s, hbdy_s 
    5554 
    56    INTEGER :: tsn_id                                                  ! AGRIF profile for tracers interpolation and update 
    57    INTEGER :: un_interp_id, vn_interp_id                              ! AGRIF profiles for interpolations 
    58    INTEGER :: un_update_id, vn_update_id                              ! AGRIF profiles for udpates 
    59    INTEGER :: tsn_sponge_id, un_sponge_id, vn_sponge_id               ! AGRIF profiles for sponge layers 
     55 
     56   INTEGER, PUBLIC :: tsn_id                                                  ! AGRIF profile for tracers interpolation and update 
     57   INTEGER, PUBLIC :: un_interp_id, vn_interp_id                              ! AGRIF profiles for interpolations 
     58   INTEGER, PUBLIC :: un_update_id, vn_update_id                              ! AGRIF profiles for udpates 
     59   INTEGER, PUBLIC :: tsn_sponge_id, un_sponge_id, vn_sponge_id               ! AGRIF profiles for sponge layers 
    6060# if defined key_top 
    61    INTEGER :: trn_id, trn_sponge_id 
     61   INTEGER, PUBLIC :: trn_id, trn_sponge_id 
    6262# endif   
    63    INTEGER :: unb_id, vnb_id, ub2b_interp_id, vb2b_interp_id 
    64    INTEGER :: ub2b_update_id, vb2b_update_id 
    65    INTEGER :: e3t_id, e1u_id, e2v_id, sshn_id 
    66    INTEGER :: scales_t_id 
    67 # if defined key_zdftke 
    68    INTEGER :: avt_id, avm_id, en_id 
    69 # endif   
    70    INTEGER :: umsk_id, vmsk_id 
    71    INTEGER :: kindic_agr 
    72  
     63   INTEGER, PUBLIC :: unb_id, vnb_id, ub2b_interp_id, vb2b_interp_id 
     64   INTEGER, PUBLIC :: ub2b_update_id, vb2b_update_id 
     65   INTEGER, PUBLIC :: e3t_id, e1u_id, e2v_id, sshn_id 
     66   INTEGER, PUBLIC :: scales_t_id 
     67   INTEGER, PUBLIC :: avt_id, avm_id, en_id                ! TKE related identificators 
     68   INTEGER, PUBLIC :: umsk_id, vmsk_id 
     69   INTEGER, PUBLIC :: kindic_agr 
     70    
    7371   !!---------------------------------------------------------------------- 
    74    !! NEMO/NST 3.3.1 , NEMO Consortium (2011) 
     72   !! NEMO/NST 4.0 , NEMO Consortium (2017) 
    7573   !! $Id$ 
    7674   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt) 
  • branches/2017/dev_CNRS_2017/NEMOGCM/NEMO/NST_SRC/agrif_opa_interp.F90

    r7646 r8882  
    22   !!====================================================================== 
    33   !!                   ***  MODULE  agrif_opa_interp  *** 
    4    !! AGRIF: interpolation package 
     4   !! AGRIF: interpolation package for the ocean dynamics (OPA) 
    55   !!====================================================================== 
    6    !! History :  2.0  !  2002-06  (XXX)  Original cade 
    7    !!             -   !  2005-11  (XXX)  
     6   !! History :  2.0  !  2002-06  (L. Debreu)  Original cade 
    87   !!            3.2  !  2009-04  (R. Benshila)  
    98   !!            3.6  !  2014-09  (R. Benshila)  
     
    1514   !!   Agrif_tra     : 
    1615   !!   Agrif_dyn     :  
     16   !!   Agrif_ssh     : 
     17   !!   Agrif_dyn_ts  : 
     18   !!   Agrif_dta_ts  : 
     19   !!   Agrif_ssh_ts  : 
     20   !!   Agrif_avm     :  
    1721   !!   interpu       : 
    1822   !!   interpv       : 
     
    2832   USE agrif_opa_sponge 
    2933   USE lib_mpp 
    30    USE wrk_nemo 
    3134  
    3235   IMPLICIT NONE 
     
    3437 
    3538   PUBLIC   Agrif_tra, Agrif_dyn, Agrif_ssh, Agrif_dyn_ts, Agrif_ssh_ts, Agrif_dta_ts 
    36    PUBLIC   interpun, interpvn 
    37    PUBLIC   interptsn,  interpsshn 
    38    PUBLIC   interpunb, interpvnb, interpub2b, interpvb2b 
     39   PUBLIC   interpun , interpvn 
     40   PUBLIC   interptsn, interpsshn 
     41   PUBLIC   interpunb, interpvnb , interpub2b, interpvb2b 
    3942   PUBLIC   interpe3t, interpumsk, interpvmsk 
    40 # if defined key_zdftke 
    41    PUBLIC   Agrif_tke, interpavm 
    42 # endif 
     43   PUBLIC   Agrif_avm, interpavm 
    4344 
    4445   INTEGER ::   bdy_tinterp = 0 
     
    4647#  include "vectopt_loop_substitute.h90" 
    4748   !!---------------------------------------------------------------------- 
    48    !! NEMO/NST 3.7 , NEMO Consortium (2015) 
     49   !! NEMO/NST 4.0 , NEMO Consortium (2017) 
    4950   !! $Id$ 
    5051   !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) 
     
    7778      INTEGER ::   ji, jj, jk       ! dummy loop indices 
    7879      INTEGER ::   j1, j2, i1, i2 
    79       REAL(wp), POINTER, DIMENSION(:,:) ::   zub, zvb 
     80      REAL(wp), DIMENSION(jpi,jpj) ::   zub, zvb 
    8081      !!----------------------------------------------------------------------   
    8182      ! 
    8283      IF( Agrif_Root() )   RETURN 
    83       ! 
    84       CALL wrk_alloc( jpi,jpj,   zub, zvb ) 
    8584      ! 
    8685      Agrif_SpecialValue    = 0._wp 
     
    105104         ! --------- 
    106105         IF( .NOT.ln_dynspg_ts ) THEN  ! Store transport 
    107             ua_b(2,:) = 0._wp 
     106            ua_b(2:1+nbghostcells,:) = 0._wp 
    108107            DO jk = 1, jpkm1 
    109108               DO jj = 1, jpj 
    110                   ua_b(2,jj) = ua_b(2,jj) + e3u_a(2,jj,jk) * ua(2,jj,jk) 
     109                  ua_b(2:1+nbghostcells,jj) = ua_b(2:1+nbghostcells,jj) + e3u_a(2:1+nbghostcells,jj,jk) * ua(2:1+nbghostcells,jj,jk) 
    111110               END DO 
    112111            END DO 
    113112            DO jj = 1, jpj 
    114                ua_b(2,jj) = ua_b(2,jj) * r1_hu_a(2,jj)             
    115             END DO 
    116          ENDIF 
    117          ! 
    118          DO jk=1,jpkm1                 ! Smooth 
    119             DO jj=j1,j2 
    120                ua(2,jj,jk) = 0.25_wp*(ua(1,jj,jk)+2._wp*ua(2,jj,jk)+ua(3,jj,jk)) 
    121                ua(2,jj,jk) = ua(2,jj,jk) * umask(2,jj,jk) 
    122             END DO 
    123          END DO 
    124          ! 
    125          zub(2,:) = 0._wp              ! Correct transport 
    126          DO jk = 1, jpkm1 
    127             DO jj = 1, jpj 
    128                zub(2,jj) = zub(2,jj) + e3u_a(2,jj,jk) * ua(2,jj,jk) 
    129             END DO 
    130          END DO 
    131          DO jj=1,jpj 
    132             zub(2,jj) = zub(2,jj) * r1_hu_a(2,jj) 
    133          END DO 
    134  
    135          DO jk=1,jpkm1 
    136             DO jj=1,jpj 
    137                ua(2,jj,jk) = (ua(2,jj,jk)+ua_b(2,jj)-zub(2,jj))*umask(2,jj,jk) 
    138             END DO 
    139          END DO 
    140  
    141          ! Set tangential velocities to time splitting estimate 
    142          !----------------------------------------------------- 
    143          IF( ln_dynspg_ts ) THEN 
    144             zvb(2,:) = 0._wp 
     113               ua_b(2:1+nbghostcells,jj) = ua_b(2:1+nbghostcells,jj) * r1_hu_a(2:1+nbghostcells,jj) 
     114            END DO 
     115         ENDIF 
     116         ! 
     117         ! Smoothing if only 1 ghostcell 
     118         ! ----------------------------- 
     119         IF( nbghostcells == 1 ) THEN 
     120            DO jk=1,jpkm1                 ! Smooth 
     121               DO jj=j1,j2 
     122                  ua(2,jj,jk) = 0.25_wp*(ua(1,jj,jk)+2._wp*ua(2,jj,jk)+ua(3,jj,jk)) 
     123                  ua(2,jj,jk) = ua(2,jj,jk) * umask(2,jj,jk) 
     124               END DO 
     125            END DO 
     126            ! 
     127            zub(2,:) = 0._wp              ! Correct transport 
    145128            DO jk = 1, jpkm1 
    146129               DO jj = 1, jpj 
    147                   zvb(2,jj) = zvb(2,jj) + e3v_a(2,jj,jk) * va(2,jj,jk) 
    148                END DO 
    149             END DO 
    150             DO jj = 1, jpj 
    151                zvb(2,jj) = zvb(2,jj) * r1_hv_a(2,jj) 
    152             END DO 
     130                  zub(2,jj) = zub(2,jj) + e3u_a(2,jj,jk) * ua(2,jj,jk) 
     131               END DO 
     132            END DO 
     133            DO jj=1,jpj 
     134               zub(2,jj) = zub(2,jj) * r1_hu_a(2,jj) 
     135            END DO 
     136             
    153137            DO jk = 1, jpkm1 
    154138               DO jj = 1, jpj 
    155                   va(2,jj,jk) = (va(2,jj,jk)+va_b(2,jj)-zvb(2,jj)) * vmask(2,jj,jk) 
    156                END DO 
    157             END DO 
     139                  ua(2,jj,jk) = (ua(2,jj,jk)+ua_b(2,jj)-zub(2,jj))*umask(2,jj,jk) 
     140               END DO 
     141            END DO 
     142             
     143            IF( ln_dynspg_ts ) THEN       ! Set tangential velocities to time splitting estimate 
     144               zvb(2,:) = 0._wp 
     145               DO jk = 1, jpkm1 
     146                  DO jj = 1, jpj 
     147                     zvb(2,jj) = zvb(2,jj) + e3v_a(2,jj,jk) * va(2,jj,jk) 
     148                  END DO 
     149               END DO 
     150               DO jj = 1, jpj 
     151                  zvb(2,jj) = zvb(2,jj) * r1_hv_a(2,jj) 
     152               END DO 
     153               DO jk = 1, jpkm1 
     154                  DO jj = 1, jpj 
     155                     va(2,jj,jk) = (va(2,jj,jk)+va_b(2,jj)-zvb(2,jj)) * vmask(2,jj,jk) 
     156                  END DO 
     157               END DO 
     158            ENDIF 
     159            ! 
    158160         ENDIF 
    159161         ! 
    160162         ! Mask domain edges: 
    161163         !------------------- 
    162          DO jk = 1, jpkm1 
    163             DO jj = 1, jpj 
    164                ua(1,jj,jk) = 0._wp 
    165                va(1,jj,jk) = 0._wp 
    166             END DO 
    167          END DO          
    168          ! 
    169       ENDIF 
    170  
     164!         DO jk = 1, jpkm1 
     165!            DO jj = 1, jpj 
     166!               ua(1,jj,jk) = 0._wp 
     167!               va(1,jj,jk) = 0._wp 
     168!            END DO 
     169!         END DO 
     170         ! 
     171      ENDIF 
     172 
     173      ! --- East --- ! 
    171174      IF( nbondi == 1 .OR. nbondi == 2 ) THEN 
    172175 
    173          ! Smoothing 
    174          ! --------- 
    175176         IF( .NOT.ln_dynspg_ts ) THEN  ! Store transport 
    176             ua_b(nlci-2,:) = 0._wp 
     177            ua_b(nlci-nbghostcells-1:nlci-2,:) = 0._wp 
    177178            DO jk=1,jpkm1 
    178179               DO jj=1,jpj 
    179                   ua_b(nlci-2,jj) = ua_b(nlci-2,jj) + e3u_a(nlci-2,jj,jk) * ua(nlci-2,jj,jk) 
     180                  ua_b(nlci-nbghostcells-1:nlci-2,jj) = ua_b(nlci-nbghostcells-1:nlci-2,jj) + e3u_a(nlci-nbghostcells-1:nlci-2,jj,jk)  & 
     181                     &                                                                         * ua(nlci-nbghostcells-1:nlci-2,jj,jk) 
    180182               END DO 
    181183            END DO 
    182184            DO jj=1,jpj 
    183                ua_b(nlci-2,jj) = ua_b(nlci-2,jj) * r1_hu_a(nlci-2,jj)             
    184             END DO 
    185          ENDIF 
    186  
    187          DO jk = 1, jpkm1              ! Smooth 
    188             DO jj = j1, j2 
    189                ua(nlci-2,jj,jk) = 0.25_wp * umask(nlci-2,jj,jk)      & 
    190                   &             * ( ua(nlci-3,jj,jk) + 2._wp*ua(nlci-2,jj,jk) + ua(nlci-1,jj,jk) ) 
    191             END DO 
    192          END DO 
    193  
    194          zub(nlci-2,:) = 0._wp        ! Correct transport 
    195          DO jk = 1, jpkm1 
    196             DO jj = 1, jpj 
    197                zub(nlci-2,jj) = zub(nlci-2,jj) + e3u_a(nlci-2,jj,jk) * ua(nlci-2,jj,jk) 
    198             END DO 
    199          END DO 
    200          DO jj = 1, jpj 
    201             zub(nlci-2,jj) = zub(nlci-2,jj) * r1_hu_a(nlci-2,jj) 
    202          END DO 
    203  
    204          DO jk = 1, jpkm1 
    205             DO jj = 1, jpj 
    206                ua(nlci-2,jj,jk) = ( ua(nlci-2,jj,jk) + ua_b(nlci-2,jj) - zub(nlci-2,jj) ) * umask(nlci-2,jj,jk) 
    207             END DO 
    208          END DO 
    209          ! 
    210          ! Set tangential velocities to time splitting estimate 
    211          !----------------------------------------------------- 
    212          IF( ln_dynspg_ts ) THEN 
    213             zvb(nlci-1,:) = 0._wp 
     185               ua_b(nlci-nbghostcells-1:nlci-2,jj) = ua_b(nlci-nbghostcells-1:nlci-2,jj) * r1_hu_a(nlci-nbghostcells-1:nlci-2,jj)  
     186            END DO 
     187         ENDIF 
     188         ! 
     189         ! Smoothing if only 1 ghostcell 
     190         ! ----------------------------- 
     191         IF( nbghostcells == 1 ) THEN 
     192            DO jk = 1, jpkm1              ! Smooth 
     193               DO jj = j1, j2 
     194                  ua(nlci-2,jj,jk) = 0.25_wp * umask(nlci-2,jj,jk)      & 
     195                     &             * ( ua(nlci-3,jj,jk) + 2._wp*ua(nlci-2,jj,jk) + ua(nlci-1,jj,jk) ) 
     196               END DO 
     197            END DO 
     198             
     199            zub(nlci-2,:) = 0._wp        ! Correct transport 
    214200            DO jk = 1, jpkm1 
    215201               DO jj = 1, jpj 
    216                   zvb(nlci-1,jj) = zvb(nlci-1,jj) + e3v_a(nlci-1,jj,jk) * va(nlci-1,jj,jk) 
    217                END DO 
    218             END DO 
    219             DO jj=1,jpj 
    220                zvb(nlci-1,jj) = zvb(nlci-1,jj) * r1_hv_a(nlci-1,jj) 
    221             END DO 
     202                  zub(nlci-2,jj) = zub(nlci-2,jj) + e3u_a(nlci-2,jj,jk) * ua(nlci-2,jj,jk) 
     203               END DO 
     204            END DO 
     205            DO jj = 1, jpj 
     206               zub(nlci-2,jj) = zub(nlci-2,jj) * r1_hu_a(nlci-2,jj) 
     207            END DO 
     208             
    222209            DO jk = 1, jpkm1 
    223210               DO jj = 1, jpj 
    224                   va(nlci-1,jj,jk) = ( va(nlci-1,jj,jk) + va_b(nlci-1,jj) - zvb(nlci-1,jj) ) * vmask(nlci-1,jj,jk) 
    225                END DO 
    226             END DO 
     211                  ua(nlci-2,jj,jk) = ( ua(nlci-2,jj,jk) + ua_b(nlci-2,jj) - zub(nlci-2,jj) ) * umask(nlci-2,jj,jk) 
     212               END DO 
     213            END DO 
     214            ! 
     215            IF( ln_dynspg_ts ) THEN       ! Set tangential velocities to time splitting estimate 
     216               zvb(nlci-1,:) = 0._wp 
     217               DO jk = 1, jpkm1 
     218                  DO jj = 1, jpj 
     219                     zvb(nlci-1,jj) = zvb(nlci-1,jj) + e3v_a(nlci-1,jj,jk) * va(nlci-1,jj,jk) 
     220                  END DO 
     221               END DO 
     222               DO jj=1,jpj 
     223                  zvb(nlci-1,jj) = zvb(nlci-1,jj) * r1_hv_a(nlci-1,jj) 
     224               END DO 
     225               DO jk = 1, jpkm1 
     226                  DO jj = 1, jpj 
     227                     va(nlci-1,jj,jk) = ( va(nlci-1,jj,jk) + va_b(nlci-1,jj) - zvb(nlci-1,jj) ) * vmask(nlci-1,jj,jk) 
     228                  END DO 
     229               END DO 
     230            ENDIF 
     231            ! 
    227232         ENDIF 
    228233         ! 
    229234         ! Mask domain edges: 
    230235         !------------------- 
    231          DO jk = 1, jpkm1 
    232             DO jj = 1, jpj 
    233                ua(nlci-1,jj,jk) = 0._wp 
    234                va(nlci  ,jj,jk) = 0._wp 
    235             END DO 
    236          END DO  
    237          ! 
    238       ENDIF 
    239  
     236!         DO jk = 1, jpkm1 
     237!            DO jj = 1, jpj 
     238!               ua(nlci-1,jj,jk) = 0._wp 
     239!               va(nlci  ,jj,jk) = 0._wp 
     240!            END DO 
     241!         END DO 
     242         ! 
     243      ENDIF 
     244 
     245      ! --- South --- ! 
    240246      IF( nbondj == -1 .OR. nbondj == 2 ) THEN 
    241247 
    242          ! Smoothing 
    243          ! --------- 
    244248         IF( .NOT.ln_dynspg_ts ) THEN  ! Store transport 
    245             va_b(:,2) = 0._wp 
     249            va_b(:,2:nbghostcells+1) = 0._wp 
    246250            DO jk = 1, jpkm1 
    247251               DO ji = 1, jpi 
    248                   va_b(ji,2) = va_b(ji,2) + e3v_a(ji,2,jk) * va(ji,2,jk) 
     252                  va_b(ji,2:nbghostcells+1) = va_b(ji,2:nbghostcells+1) + e3v_a(ji,2:nbghostcells+1,jk) * va(ji,2:nbghostcells+1,jk) 
    249253               END DO 
    250254            END DO 
    251255            DO ji=1,jpi 
    252                va_b(ji,2) = va_b(ji,2) * r1_hv_a(ji,2)             
    253             END DO 
    254          ENDIF 
    255          ! 
    256          DO jk = 1, jpkm1              ! Smooth 
    257             DO ji = i1, i2 
    258                va(ji,2,jk) = 0.25_wp * vmask(ji,2,jk)    & 
    259                   &        * ( va(ji,1,jk) + 2._wp*va(ji,2,jk) + va(ji,3,jk) ) 
    260             END DO 
    261          END DO 
    262          ! 
    263          zvb(:,2) = 0._wp              ! Correct transport 
    264          DO jk=1,jpkm1 
    265             DO ji=1,jpi 
    266                zvb(ji,2) = zvb(ji,2) + e3v_a(ji,2,jk) * va(ji,2,jk) * vmask(ji,2,jk) 
    267             END DO 
    268          END DO 
    269          DO ji = 1, jpi 
    270             zvb(ji,2) = zvb(ji,2) * r1_hv_a(ji,2) 
    271          END DO 
    272          DO jk = 1, jpkm1 
     256               va_b(ji,2:nbghostcells+1) = va_b(ji,2:nbghostcells+1) * r1_hv_a(ji,2:nbghostcells+1) 
     257            END DO 
     258         ENDIF 
     259         ! 
     260         ! Smoothing if only 1 ghostcell 
     261         ! ----------------------------- 
     262         IF( nbghostcells == 1 ) THEN 
     263            DO jk = 1, jpkm1              ! Smooth 
     264               DO ji = i1, i2 
     265                  va(ji,2,jk) = 0.25_wp * vmask(ji,2,jk)    & 
     266                     &        * ( va(ji,1,jk) + 2._wp*va(ji,2,jk) + va(ji,3,jk) ) 
     267               END DO 
     268            END DO 
     269            ! 
     270            zvb(:,2) = 0._wp              ! Correct transport 
     271            DO jk=1,jpkm1 
     272               DO ji=1,jpi 
     273                  zvb(ji,2) = zvb(ji,2) + e3v_a(ji,2,jk) * va(ji,2,jk) * vmask(ji,2,jk) 
     274               END DO 
     275            END DO 
    273276            DO ji = 1, jpi 
    274                va(ji,2,jk) = ( va(ji,2,jk) + va_b(ji,2) - zvb(ji,2) ) * vmask(ji,2,jk) 
    275             END DO 
    276          END DO 
    277  
    278          ! Set tangential velocities to time splitting estimate 
    279          !----------------------------------------------------- 
    280          IF( ln_dynspg_ts ) THEN 
    281             zub(:,2) = 0._wp 
     277               zvb(ji,2) = zvb(ji,2) * r1_hv_a(ji,2) 
     278            END DO 
    282279            DO jk = 1, jpkm1 
    283280               DO ji = 1, jpi 
    284                   zub(ji,2) = zub(ji,2) + e3u_a(ji,2,jk) * ua(ji,2,jk) * umask(ji,2,jk) 
    285                END DO 
    286             END DO 
    287             DO ji = 1, jpi 
    288                zub(ji,2) = zub(ji,2) * r1_hu_a(ji,2) 
    289             END DO 
    290  
     281                  va(ji,2,jk) = ( va(ji,2,jk) + va_b(ji,2) - zvb(ji,2) ) * vmask(ji,2,jk) 
     282               END DO 
     283            END DO 
     284             
     285            IF( ln_dynspg_ts ) THEN       ! Set tangential velocities to time splitting estimate 
     286               zub(:,2) = 0._wp 
     287               DO jk = 1, jpkm1 
     288                  DO ji = 1, jpi 
     289                     zub(ji,2) = zub(ji,2) + e3u_a(ji,2,jk) * ua(ji,2,jk) * umask(ji,2,jk) 
     290                  END DO 
     291               END DO 
     292               DO ji = 1, jpi 
     293                  zub(ji,2) = zub(ji,2) * r1_hu_a(ji,2) 
     294               END DO 
     295                
     296               DO jk = 1, jpkm1 
     297                  DO ji = 1, jpi 
     298                     ua(ji,2,jk) = ( ua(ji,2,jk) + ua_b(ji,2) - zub(ji,2) ) * umask(ji,2,jk) 
     299                  END DO 
     300               END DO 
     301            ENDIF 
     302            ! 
     303         ENDIF 
     304         ! 
     305         ! Mask domain edges: 
     306         !------------------- 
     307!         DO jk = 1, jpkm1 
     308!            DO ji = 1, jpi 
     309!               ua(ji,1,jk) = 0._wp 
     310!               va(ji,1,jk) = 0._wp 
     311!            END DO 
     312!         END DO 
     313         ! 
     314      ENDIF 
     315 
     316      ! --- North --- ! 
     317      IF( nbondj == 1 .OR. nbondj == 2 ) THEN 
     318         ! 
     319         IF( .NOT.ln_dynspg_ts ) THEN  ! Store transport 
     320            va_b(:,nlcj-nbghostcells-1:nlcj-2) = 0._wp 
    291321            DO jk = 1, jpkm1 
    292322               DO ji = 1, jpi 
    293                   ua(ji,2,jk) = ( ua(ji,2,jk) + ua_b(ji,2) - zub(ji,2) ) * umask(ji,2,jk) 
    294                END DO 
    295             END DO 
    296          ENDIF 
    297  
     323                  va_b(ji,nlcj-nbghostcells-1:nlcj-2) = va_b(ji,nlcj-nbghostcells-1:nlcj-2) + e3v_a(ji,nlcj-nbghostcells-1:nlcj-2,jk)  & 
     324                     &                                                                         * va(ji,nlcj-nbghostcells-1:nlcj-2,jk) 
     325               END DO 
     326            END DO 
     327            DO ji = 1, jpi 
     328               va_b(ji,nlcj-nbghostcells-1:nlcj-2) = va_b(ji,nlcj-nbghostcells-1:nlcj-2) * r1_hv_a(ji,nlcj-nbghostcells-1:nlcj-2) 
     329            END DO 
     330         ENDIF 
     331         ! 
     332         ! Smoothing if only 1 ghostcell 
     333         ! ----------------------------- 
     334         IF( nbghostcells == 1 ) THEN 
     335            DO jk = 1, jpkm1              ! Smooth 
     336               DO ji = i1, i2 
     337                  va(ji,nlcj-2,jk) = 0.25_wp * vmask(ji,nlcj-2,jk)   & 
     338                     &             * ( va(ji,nlcj-3,jk) + 2._wp * va(ji,nlcj-2,jk) + va(ji,nlcj-1,jk) ) 
     339               END DO 
     340            END DO 
     341            ! 
     342            zvb(:,nlcj-2) = 0._wp         ! Correct transport 
     343            DO jk = 1, jpkm1 
     344               DO ji = 1, jpi 
     345                  zvb(ji,nlcj-2) = zvb(ji,nlcj-2) + e3v_a(ji,nlcj-2,jk) * va(ji,nlcj-2,jk) * vmask(ji,nlcj-2,jk) 
     346               END DO 
     347            END DO 
     348            DO ji = 1, jpi 
     349               zvb(ji,nlcj-2) = zvb(ji,nlcj-2) * r1_hv_a(ji,nlcj-2) 
     350            END DO 
     351            DO jk = 1, jpkm1 
     352               DO ji = 1, jpi 
     353                  va(ji,nlcj-2,jk) = ( va(ji,nlcj-2,jk) + va_b(ji,nlcj-2) - zvb(ji,nlcj-2) ) * vmask(ji,nlcj-2,jk) 
     354               END DO 
     355            END DO 
     356            ! 
     357            IF( ln_dynspg_ts ) THEN       ! Set tangential velocities to time splitting estimate 
     358               zub(:,nlcj-1) = 0._wp 
     359               DO jk = 1, jpkm1 
     360                  DO ji = 1, jpi 
     361                     zub(ji,nlcj-1) = zub(ji,nlcj-1) + e3u_a(ji,nlcj-1,jk) * ua(ji,nlcj-1,jk) * umask(ji,nlcj-1,jk) 
     362                  END DO 
     363               END DO 
     364               DO ji = 1, jpi 
     365                  zub(ji,nlcj-1) = zub(ji,nlcj-1) * r1_hu_a(ji,nlcj-1) 
     366               END DO 
     367               ! 
     368               DO jk = 1, jpkm1 
     369                  DO ji = 1, jpi 
     370                     ua(ji,nlcj-1,jk) = ( ua(ji,nlcj-1,jk) + ua_b(ji,nlcj-1) - zub(ji,nlcj-1) ) * umask(ji,nlcj-1,jk) 
     371                  END DO 
     372               END DO 
     373            ENDIF 
     374            ! 
     375         ENDIF 
     376         ! 
    298377         ! Mask domain edges: 
    299378         !------------------- 
    300          DO jk = 1, jpkm1 
    301             DO ji = 1, jpi 
    302                ua(ji,1,jk) = 0._wp 
    303                va(ji,1,jk) = 0._wp 
    304             END DO 
    305          END DO  
    306  
    307       ENDIF 
    308  
    309       IF( nbondj == 1 .OR. nbondj == 2 ) THEN 
    310          ! 
    311          ! Smoothing 
    312          ! --------- 
    313          IF( .NOT.ln_dynspg_ts ) THEN  ! Store transport 
    314             va_b(:,nlcj-2) = 0._wp 
    315             DO jk = 1, jpkm1 
    316                DO ji = 1, jpi 
    317                   va_b(ji,nlcj-2) = va_b(ji,nlcj-2) + e3v_a(ji,nlcj-2,jk) * va(ji,nlcj-2,jk) 
    318                END DO 
    319             END DO 
    320             DO ji = 1, jpi 
    321                va_b(ji,nlcj-2) = va_b(ji,nlcj-2) * r1_hv_a(ji,nlcj-2)             
    322             END DO 
    323          ENDIF 
    324          ! 
    325          DO jk = 1, jpkm1              ! Smooth 
    326             DO ji = i1, i2 
    327                va(ji,nlcj-2,jk) = 0.25_wp * vmask(ji,nlcj-2,jk)   & 
    328                   &             * ( va(ji,nlcj-3,jk) + 2._wp * va(ji,nlcj-2,jk) + va(ji,nlcj-1,jk) ) 
    329             END DO 
    330          END DO 
    331          ! 
    332          zvb(:,nlcj-2) = 0._wp         ! Correct transport 
    333          DO jk = 1, jpkm1 
    334             DO ji = 1, jpi 
    335                zvb(ji,nlcj-2) = zvb(ji,nlcj-2) + e3v_a(ji,nlcj-2,jk) * va(ji,nlcj-2,jk) * vmask(ji,nlcj-2,jk) 
    336             END DO 
    337          END DO 
    338          DO ji = 1, jpi 
    339             zvb(ji,nlcj-2) = zvb(ji,nlcj-2) * r1_hv_a(ji,nlcj-2) 
    340          END DO 
    341          DO jk = 1, jpkm1 
    342             DO ji = 1, jpi 
    343                va(ji,nlcj-2,jk) = ( va(ji,nlcj-2,jk) + va_b(ji,nlcj-2) - zvb(ji,nlcj-2) ) * vmask(ji,nlcj-2,jk) 
    344             END DO 
    345          END DO 
    346          ! 
    347          ! Set tangential velocities to time splitting estimate 
    348          !----------------------------------------------------- 
    349          IF( ln_dynspg_ts ) THEN 
    350             zub(:,nlcj-1) = 0._wp 
    351             DO jk = 1, jpkm1 
    352                DO ji = 1, jpi 
    353                   zub(ji,nlcj-1) = zub(ji,nlcj-1) + e3u_a(ji,nlcj-1,jk) * ua(ji,nlcj-1,jk) * umask(ji,nlcj-1,jk) 
    354                END DO 
    355             END DO 
    356             DO ji = 1, jpi 
    357                zub(ji,nlcj-1) = zub(ji,nlcj-1) * r1_hu_a(ji,nlcj-1) 
    358             END DO 
    359             ! 
    360             DO jk = 1, jpkm1 
    361                DO ji = 1, jpi 
    362                   ua(ji,nlcj-1,jk) = ( ua(ji,nlcj-1,jk) + ua_b(ji,nlcj-1) - zub(ji,nlcj-1) ) * umask(ji,nlcj-1,jk) 
    363                END DO 
    364             END DO 
    365          ENDIF 
    366          ! 
    367          ! Mask domain edges: 
    368          !------------------- 
    369          DO jk = 1, jpkm1 
    370             DO ji = 1, jpi 
    371                ua(ji,nlcj  ,jk) = 0._wp 
    372                va(ji,nlcj-1,jk) = 0._wp 
    373             END DO 
    374          END DO  
    375          ! 
    376       ENDIF 
    377       ! 
    378       CALL wrk_dealloc( jpi,jpj,   zub, zvb ) 
     379!         DO jk = 1, jpkm1 
     380!            DO ji = 1, jpi 
     381!               ua(ji,nlcj  ,jk) = 0._wp 
     382!               va(ji,nlcj-1,jk) = 0._wp 
     383!            END DO 
     384!         END DO 
     385         ! 
     386      ENDIF 
    379387      ! 
    380388   END SUBROUTINE Agrif_dyn 
     
    385393      !!                  ***  ROUTINE Agrif_dyn_ts  *** 
    386394      !!----------------------------------------------------------------------   
    387       !!  
    388395      INTEGER, INTENT(in) ::   jn 
    389396      !! 
     
    392399      ! 
    393400      IF( Agrif_Root() )   RETURN 
    394       ! 
     401      !! clem ghost 
    395402      IF((nbondi == -1).OR.(nbondi == 2)) THEN 
    396403         DO jj=1,jpj 
    397             va_e(2,jj) = vbdy_w(jj) * hvr_e(2,jj) 
     404            va_e(2:nbghostcells+1,jj) = vbdy_w(jj) * hvr_e(2:nbghostcells+1,jj) 
    398405            ! Specified fluxes: 
    399             ua_e(2,jj) = ubdy_w(jj) * hur_e(2,jj) 
    400             ! Characteristics method: 
     406            ua_e(2:nbghostcells+1,jj) = ubdy_w(jj) * hur_e(2:nbghostcells+1,jj) 
     407            ! Characteristics method (only if ghostcells=1): 
    401408            !alt            ua_e(2,jj) = 0.5_wp * ( ubdy_w(jj) * hur_e(2,jj) + ua_e(3,jj) & 
    402409            !alt                       &           - sqrt(grav * hur_e(2,jj)) * (sshn_e(3,jj) - hbdy_w(jj)) ) 
     
    406413      IF((nbondi == 1).OR.(nbondi == 2)) THEN 
    407414         DO jj=1,jpj 
    408             va_e(nlci-1,jj) = vbdy_e(jj) * hvr_e(nlci-1,jj) 
     415            va_e(nlci-nbghostcells:nlci-1,jj)   = vbdy_e(jj) * hvr_e(nlci-nbghostcells:nlci-1,jj) 
    409416            ! Specified fluxes: 
    410             ua_e(nlci-2,jj) = ubdy_e(jj) * hur_e(nlci-2,jj) 
    411             ! Characteristics method: 
     417            ua_e(nlci-nbghostcells-1:nlci-2,jj) = ubdy_e(jj) * hur_e(nlci-nbghostcells-1:nlci-2,jj) 
     418            ! Characteristics method (only if ghostcells=1): 
    412419            !alt            ua_e(nlci-2,jj) = 0.5_wp * ( ubdy_e(jj) * hur_e(nlci-2,jj) + ua_e(nlci-3,jj) & 
    413420            !alt                            &           + sqrt(grav * hur_e(nlci-2,jj)) * (sshn_e(nlci-2,jj) - hbdy_e(jj)) ) 
     
    417424      IF((nbondj == -1).OR.(nbondj == 2)) THEN 
    418425         DO ji=1,jpi 
    419             ua_e(ji,2) = ubdy_s(ji) * hur_e(ji,2) 
     426            ua_e(ji,2:nbghostcells+1) = ubdy_s(ji) * hur_e(ji,2:nbghostcells+1) 
    420427            ! Specified fluxes: 
    421             va_e(ji,2) = vbdy_s(ji) * hvr_e(ji,2) 
    422             ! Characteristics method: 
     428            va_e(ji,2:nbghostcells+1) = vbdy_s(ji) * hvr_e(ji,2:nbghostcells+1) 
     429            ! Characteristics method (only if ghostcells=1): 
    423430            !alt            va_e(ji,2) = 0.5_wp * ( vbdy_s(ji) * hvr_e(ji,2) + va_e(ji,3) & 
    424431            !alt                       &           - sqrt(grav * hvr_e(ji,2)) * (sshn_e(ji,3) - hbdy_s(ji)) ) 
     
    428435      IF((nbondj == 1).OR.(nbondj == 2)) THEN 
    429436         DO ji=1,jpi 
    430             ua_e(ji,nlcj-1) = ubdy_n(ji) * hur_e(ji,nlcj-1) 
     437            ua_e(ji,nlcj-nbghostcells:nlcj-1)   = ubdy_n(ji) * hur_e(ji,nlcj-nbghostcells:nlcj-1) 
    431438            ! Specified fluxes: 
    432             va_e(ji,nlcj-2) = vbdy_n(ji) * hvr_e(ji,nlcj-2) 
    433             ! Characteristics method: 
     439            va_e(ji,nlcj-nbghostcells-1:nlcj-2) = vbdy_n(ji) * hvr_e(ji,nlcj-nbghostcells-1:nlcj-2) 
     440            ! Characteristics method (only if ghostcells=1): 
    434441            !alt            va_e(ji,nlcj-2) = 0.5_wp * ( vbdy_n(ji) * hvr_e(ji,nlcj-2)  + va_e(ji,nlcj-3) & 
    435442            !alt                            &           + sqrt(grav * hvr_e(ji,nlcj-2)) * (sshn_e(ji,nlcj-2) - hbdy_n(ji)) ) 
     
    444451      !!                  ***  ROUTINE Agrif_dta_ts  *** 
    445452      !!----------------------------------------------------------------------   
    446       !!  
    447453      INTEGER, INTENT(in) ::   kt 
    448454      !! 
     
    476482      ! 
    477483      IF( ll_int_cons ) THEN  ! Conservative interpolation 
    478          ! orders matters here !!!!!! 
     484         ! order matters here !!!!!! 
    479485         CALL Agrif_Bc_variable( ub2b_interp_id, calledweight=1._wp, procname=interpub2b ) ! Time integrated 
    480486         CALL Agrif_Bc_variable( vb2b_interp_id, calledweight=1._wp, procname=interpvb2b ) 
     
    504510      !!----------------------------------------------------------------------   
    505511      INTEGER, INTENT(in) ::   kt 
    506       !! 
     512      ! 
     513      INTEGER  :: ji, jj, indx 
    507514      !!----------------------------------------------------------------------   
    508515      ! 
    509516      IF( Agrif_Root() )   RETURN 
    510       ! 
     517      !! clem ghost 
     518      ! --- West --- ! 
    511519      IF((nbondi == -1).OR.(nbondi == 2)) THEN 
    512          ssha(2,:)=ssha(3,:) 
    513          sshn(2,:)=sshn(3,:) 
    514       ENDIF 
    515       ! 
     520         indx = 1+nbghostcells 
     521         DO jj = 1, jpj 
     522            DO ji = 2, indx 
     523               ssha(ji,jj)=ssha(indx+1,jj) 
     524               sshn(ji,jj)=sshn(indx+1,jj) 
     525            ENDDO 
     526         ENDDO 
     527      ENDIF 
     528      ! 
     529      ! --- East --- ! 
    516530      IF((nbondi == 1).OR.(nbondi == 2)) THEN 
    517          ssha(nlci-1,:)=ssha(nlci-2,:) 
    518          sshn(nlci-1,:)=sshn(nlci-2,:) 
    519       ENDIF 
    520       ! 
     531         indx = nlci-nbghostcells 
     532         DO jj = 1, jpj 
     533            DO ji = indx, nlci-1 
     534               ssha(ji,jj)=ssha(indx-1,jj) 
     535               sshn(ji,jj)=sshn(indx-1,jj) 
     536            ENDDO 
     537         ENDDO 
     538      ENDIF 
     539      ! 
     540      ! --- South --- ! 
    521541      IF((nbondj == -1).OR.(nbondj == 2)) THEN 
    522          ssha(:,2)=ssha(:,3) 
    523          sshn(:,2)=sshn(:,3) 
    524       ENDIF 
    525       ! 
     542         indx = 1+nbghostcells 
     543         DO jj = 2, indx 
     544            DO ji = 1, jpi 
     545               ssha(ji,jj)=ssha(ji,indx+1) 
     546               sshn(ji,jj)=sshn(ji,indx+1) 
     547            ENDDO 
     548         ENDDO 
     549      ENDIF 
     550      ! 
     551      ! --- North --- ! 
    526552      IF((nbondj == 1).OR.(nbondj == 2)) THEN 
    527          ssha(:,nlcj-1)=ssha(:,nlcj-2) 
    528          sshn(:,nlcj-1)=sshn(:,nlcj-2) 
     553         indx = nlcj-nbghostcells 
     554         DO jj = indx, nlcj-1 
     555            DO ji = 1, jpi 
     556               ssha(ji,jj)=ssha(ji,indx-1) 
     557               sshn(ji,jj)=sshn(ji,indx-1) 
     558            ENDDO 
     559         ENDDO 
    529560      ENDIF 
    530561      ! 
     
    538569      INTEGER, INTENT(in) ::   jn 
    539570      !! 
    540       INTEGER :: ji,jj 
    541       !!----------------------------------------------------------------------   
    542       ! 
     571      INTEGER :: ji, jj 
     572      !!----------------------------------------------------------------------   
     573      !! clem ghost (starting at i,j=1 is important I think otherwise you introduce a grad(ssh)/=0 at point 2) 
    543574      IF((nbondi == -1).OR.(nbondi == 2)) THEN 
    544575         DO jj = 1, jpj 
    545             ssha_e(2,jj) = hbdy_w(jj) 
     576            ssha_e(2:nbghostcells+1,jj) = hbdy_w(jj) 
    546577         END DO 
    547578      ENDIF 
     
    549580      IF((nbondi == 1).OR.(nbondi == 2)) THEN 
    550581         DO jj = 1, jpj 
    551             ssha_e(nlci-1,jj) = hbdy_e(jj) 
     582            ssha_e(nlci-nbghostcells:nlci-1,jj) = hbdy_e(jj) 
    552583         END DO 
    553584      ENDIF 
     
    555586      IF((nbondj == -1).OR.(nbondj == 2)) THEN 
    556587         DO ji = 1, jpi 
    557             ssha_e(ji,2) = hbdy_s(ji) 
     588            ssha_e(ji,2:nbghostcells+1) = hbdy_s(ji) 
    558589         END DO 
    559590      ENDIF 
     
    561592      IF((nbondj == 1).OR.(nbondj == 2)) THEN 
    562593         DO ji = 1, jpi 
    563             ssha_e(ji,nlcj-1) = hbdy_n(ji) 
     594            ssha_e(ji,nlcj-nbghostcells:nlcj-1) = hbdy_n(ji) 
    564595         END DO 
    565596      ENDIF 
     
    567598   END SUBROUTINE Agrif_ssh_ts 
    568599 
    569 # if defined key_zdftke 
    570  
    571    SUBROUTINE Agrif_tke 
    572       !!---------------------------------------------------------------------- 
    573       !!                  ***  ROUTINE Agrif_tke  *** 
     600 
     601   SUBROUTINE Agrif_avm 
     602      !!---------------------------------------------------------------------- 
     603      !!                  ***  ROUTINE Agrif_avm  *** 
    574604      !!----------------------------------------------------------------------   
    575605      REAL(wp) ::   zalpha 
    576606      !!----------------------------------------------------------------------   
    577607      ! 
    578       zalpha = REAL( Agrif_NbStepint() + Agrif_IRhot() - 1, wp ) / REAL( Agrif_IRhot(), wp ) 
    579       IF( zalpha > 1. )   zalpha = 1. 
    580       ! 
    581       Agrif_SpecialValue    = 0.e0 
     608      zalpha = 1._wp   ! proper time interpolation impossible  ==> use last available value from parent  
     609      ! 
     610      Agrif_SpecialValue    = 0._wp 
    582611      Agrif_UseSpecialValue = .TRUE. 
    583612      ! 
    584       CALL Agrif_Bc_variable(avm_id ,calledweight=zalpha, procname=interpavm)        
     613      CALL Agrif_Bc_variable( avm_id, calledweight=zalpha, procname=interpavm )        
    585614      ! 
    586615      Agrif_UseSpecialValue = .FALSE. 
    587616      ! 
    588    END SUBROUTINE Agrif_tke 
     617   END SUBROUTINE Agrif_avm 
    589618    
    590 # endif 
    591619 
    592620   SUBROUTINE interptsn( ptab, i1, i2, j1, j2, k1, k2, n1, n2, before, nb, ndir ) 
    593621      !!---------------------------------------------------------------------- 
    594       !!   *** ROUTINE interptsn *** 
     622      !!                  *** ROUTINE interptsn *** 
    595623      !!---------------------------------------------------------------------- 
    596624      REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2,n1:n2), INTENT(inout) ::   ptab 
     
    601629      INTEGER  ::   ji, jj, jk, jn   ! dummy loop indices 
    602630      INTEGER  ::   imin, imax, jmin, jmax 
    603       REAL(wp) ::   zrhox , zalpha1, zalpha2, zalpha3 
    604       REAL(wp) ::   zalpha4, zalpha5, zalpha6, zalpha7 
     631      REAL(wp) ::   zrhox, z1, z2, z3, z4, z5, z6, z7 
    605632      LOGICAL  ::   western_side, eastern_side,northern_side,southern_side 
    606633      !!---------------------------------------------------------------------- 
    607634      ! 
    608       IF (before) THEN          
     635      IF( before ) THEN          
    609636         ptab(i1:i2,j1:j2,k1:k2,n1:n2) = tsn(i1:i2,j1:j2,k1:k2,n1:n2) 
    610637      ELSE 
    611638         ! 
    612          western_side  = (nb == 1).AND.(ndir == 1) 
    613          eastern_side  = (nb == 1).AND.(ndir == 2) 
    614          southern_side = (nb == 2).AND.(ndir == 1) 
    615          northern_side = (nb == 2).AND.(ndir == 2) 
    616          ! 
    617          zrhox = Agrif_Rhox() 
    618          !  
    619          zalpha1 = ( zrhox - 1. ) * 0.5 
    620          zalpha2 = 1. - zalpha1 
    621          !  
    622          zalpha3 = ( zrhox - 1. ) / ( zrhox + 1. ) 
    623          zalpha4 = 1. - zalpha3 
    624          !  
    625          zalpha6 = 2. * ( zrhox - 1. ) / ( zrhox + 1. ) 
    626          zalpha7 =    - ( zrhox - 1. ) / ( zrhox + 3. ) 
    627          zalpha5 = 1. - zalpha6 - zalpha7 
    628          ! 
    629          imin = i1 
    630          imax = i2 
    631          jmin = j1 
    632          jmax = j2 
    633          !  
    634          ! Remove CORNERS 
    635          IF((nbondj == -1).OR.(nbondj == 2)) jmin = 3 
    636          IF((nbondj == +1).OR.(nbondj == 2)) jmax = nlcj-2 
    637          IF((nbondi == -1).OR.(nbondi == 2)) imin = 3 
    638          IF((nbondi == +1).OR.(nbondi == 2)) imax = nlci-2         
    639          ! 
    640          IF( eastern_side ) THEN 
    641             DO jn = 1, jpts 
    642                tsa(nlci,j1:j2,k1:k2,jn) = zalpha1 * ptab(nlci,j1:j2,k1:k2,jn) + zalpha2 * ptab(nlci-1,j1:j2,k1:k2,jn) 
    643                DO jk = 1, jpkm1 
    644                   DO jj = jmin,jmax 
    645                      IF( umask(nlci-2,jj,jk) == 0._wp ) THEN 
    646                         tsa(nlci-1,jj,jk,jn) = tsa(nlci,jj,jk,jn) * tmask(nlci-1,jj,jk) 
    647                      ELSE 
    648                         tsa(nlci-1,jj,jk,jn)=(zalpha4*tsa(nlci,jj,jk,jn)+zalpha3*tsa(nlci-2,jj,jk,jn))*tmask(nlci-1,jj,jk) 
    649                         IF( un(nlci-2,jj,jk) > 0._wp ) THEN 
    650                            tsa(nlci-1,jj,jk,jn)=( zalpha6*tsa(nlci-2,jj,jk,jn)+zalpha5*tsa(nlci,jj,jk,jn) &  
    651                                  + zalpha7*tsa(nlci-3,jj,jk,jn) ) * tmask(nlci-1,jj,jk) 
     639         western_side  = (nb == 1).AND.(ndir == 1)   ;   eastern_side  = (nb == 1).AND.(ndir == 2) 
     640         southern_side = (nb == 2).AND.(ndir == 1)   ;   northern_side = (nb == 2).AND.(ndir == 2) 
     641         ! 
     642         IF( nbghostcells > 1 ) THEN  ! no smoothing 
     643            tsa(i1:i2,j1:j2,k1:k2,n1:n2) = ptab(i1:i2,j1:j2,k1:k2,n1:n2) 
     644         ELSE                         ! smoothing 
     645            ! 
     646            zrhox = Agrif_Rhox() 
     647            z1 = ( zrhox - 1. ) * 0.5 
     648            z3 = ( zrhox - 1. ) / ( zrhox + 1. ) 
     649            z6 = 2. * ( zrhox - 1. ) / ( zrhox + 1. ) 
     650            z7 =    - ( zrhox - 1. ) / ( zrhox + 3. ) 
     651            ! 
     652            z2 = 1. - z1 
     653            z4 = 1. - z3 
     654            z5 = 1. - z6 - z7 
     655            ! 
     656            imin = i1 ; imax = i2 
     657            jmin = j1 ; jmax = j2 
     658            !  
     659            ! Remove CORNERS 
     660            IF((nbondj == -1).OR.(nbondj == 2)) jmin = 3 
     661            IF((nbondj == +1).OR.(nbondj == 2)) jmax = nlcj-2 
     662            IF((nbondi == -1).OR.(nbondi == 2)) imin = 3 
     663            IF((nbondi == +1).OR.(nbondi == 2)) imax = nlci-2         
     664            ! 
     665            IF( eastern_side ) THEN 
     666               DO jn = 1, jpts 
     667                  tsa(nlci,j1:j2,k1:k2,jn) = z1 * ptab(nlci,j1:j2,k1:k2,jn) + z2 * ptab(nlci-1,j1:j2,k1:k2,jn) 
     668                  DO jk = 1, jpkm1 
     669                     DO jj = jmin,jmax 
     670                        IF( umask(nlci-2,jj,jk) == 0._wp ) THEN 
     671                           tsa(nlci-1,jj,jk,jn) = tsa(nlci,jj,jk,jn) * tmask(nlci-1,jj,jk) 
     672                        ELSE 
     673                           tsa(nlci-1,jj,jk,jn)=(z4*tsa(nlci,jj,jk,jn)+z3*tsa(nlci-2,jj,jk,jn))*tmask(nlci-1,jj,jk) 
     674                           IF( un(nlci-2,jj,jk) > 0._wp ) THEN 
     675                              tsa(nlci-1,jj,jk,jn)=( z6*tsa(nlci-2,jj,jk,jn)+z5*tsa(nlci,jj,jk,jn) &  
     676                                                   + z7*tsa(nlci-3,jj,jk,jn) ) * tmask(nlci-1,jj,jk) 
     677                           ENDIF 
    652678                        ENDIF 
    653                      ENDIF 
     679                     END DO 
    654680                  END DO 
    655                END DO 
    656                tsa(nlci,j1:j2,k1:k2,jn) = 0._wp 
    657             END DO 
    658          ENDIF 
    659          !  
    660          IF( northern_side ) THEN             
    661             DO jn = 1, jpts 
    662                tsa(i1:i2,nlcj,k1:k2,jn) = zalpha1 * ptab(i1:i2,nlcj,k1:k2,jn) + zalpha2 * ptab(i1:i2,nlcj-1,k1:k2,jn) 
    663                DO jk = 1, jpkm1 
    664                   DO ji = imin,imax 
    665                      IF( vmask(ji,nlcj-2,jk) == 0._wp ) THEN 
    666                         tsa(ji,nlcj-1,jk,jn) = tsa(ji,nlcj,jk,jn) * tmask(ji,nlcj-1,jk) 
    667                      ELSE 
    668                         tsa(ji,nlcj-1,jk,jn)=(zalpha4*tsa(ji,nlcj,jk,jn)+zalpha3*tsa(ji,nlcj-2,jk,jn))*tmask(ji,nlcj-1,jk)         
    669                         IF (vn(ji,nlcj-2,jk) > 0._wp ) THEN 
    670                            tsa(ji,nlcj-1,jk,jn)=( zalpha6*tsa(ji,nlcj-2,jk,jn)+zalpha5*tsa(ji,nlcj,jk,jn)  & 
    671                                  + zalpha7*tsa(ji,nlcj-3,jk,jn) ) * tmask(ji,nlcj-1,jk) 
     681                  tsa(nlci,j1:j2,k1:k2,jn) = 0._wp 
     682               END DO 
     683            ENDIF 
     684            !  
     685            IF( northern_side ) THEN             
     686               DO jn = 1, jpts 
     687                  tsa(i1:i2,nlcj,k1:k2,jn) = z1 * ptab(i1:i2,nlcj,k1:k2,jn) + z2 * ptab(i1:i2,nlcj-1,k1:k2,jn) 
     688                  DO jk = 1, jpkm1 
     689                     DO ji = imin,imax 
     690                        IF( vmask(ji,nlcj-2,jk) == 0._wp ) THEN 
     691                           tsa(ji,nlcj-1,jk,jn) = tsa(ji,nlcj,jk,jn) * tmask(ji,nlcj-1,jk) 
     692                        ELSE 
     693                           tsa(ji,nlcj-1,jk,jn)=(z4*tsa(ji,nlcj,jk,jn)+z3*tsa(ji,nlcj-2,jk,jn))*tmask(ji,nlcj-1,jk)         
     694                           IF (vn(ji,nlcj-2,jk) > 0._wp ) THEN 
     695                              tsa(ji,nlcj-1,jk,jn)=( z6*tsa(ji,nlcj-2,jk,jn)+z5*tsa(ji,nlcj,jk,jn)  & 
     696                                                   + z7*tsa(ji,nlcj-3,jk,jn) ) * tmask(ji,nlcj-1,jk) 
     697                           ENDIF 
    672698                        ENDIF 
    673                      ENDIF 
     699                     END DO 
    674700                  END DO 
    675                END DO 
    676                tsa(i1:i2,nlcj,k1:k2,jn) = 0._wp 
    677             END DO 
    678          ENDIF 
    679          ! 
    680          IF( western_side ) THEN             
    681             DO jn = 1, jpts 
    682                tsa(1,j1:j2,k1:k2,jn) = zalpha1 * ptab(1,j1:j2,k1:k2,jn) + zalpha2 * ptab(2,j1:j2,k1:k2,jn) 
    683                DO jk = 1, jpkm1 
    684                   DO jj = jmin,jmax 
    685                      IF( umask(2,jj,jk) == 0._wp ) THEN 
    686                         tsa(2,jj,jk,jn) = tsa(1,jj,jk,jn) * tmask(2,jj,jk) 
    687                      ELSE 
    688                         tsa(2,jj,jk,jn)=(zalpha4*tsa(1,jj,jk,jn)+zalpha3*tsa(3,jj,jk,jn))*tmask(2,jj,jk)         
    689                         IF( un(2,jj,jk) < 0._wp ) THEN 
    690                            tsa(2,jj,jk,jn)=(zalpha6*tsa(3,jj,jk,jn)+zalpha5*tsa(1,jj,jk,jn)+zalpha7*tsa(4,jj,jk,jn))*tmask(2,jj,jk) 
     701                  tsa(i1:i2,nlcj,k1:k2,jn) = 0._wp 
     702               END DO 
     703            ENDIF 
     704            ! 
     705            IF( western_side ) THEN             
     706               DO jn = 1, jpts 
     707                  tsa(1,j1:j2,k1:k2,jn) = z1 * ptab(1,j1:j2,k1:k2,jn) + z2 * ptab(2,j1:j2,k1:k2,jn) 
     708                  DO jk = 1, jpkm1 
     709                     DO jj = jmin,jmax 
     710                        IF( umask(2,jj,jk) == 0._wp ) THEN 
     711                           tsa(2,jj,jk,jn) = tsa(1,jj,jk,jn) * tmask(2,jj,jk) 
     712                        ELSE 
     713                           tsa(2,jj,jk,jn)=(z4*tsa(1,jj,jk,jn)+z3*tsa(3,jj,jk,jn))*tmask(2,jj,jk)         
     714                           IF( un(2,jj,jk) < 0._wp ) THEN 
     715                              tsa(2,jj,jk,jn)=(z6*tsa(3,jj,jk,jn)+z5*tsa(1,jj,jk,jn)+z7*tsa(4,jj,jk,jn))*tmask(2,jj,jk) 
     716                           ENDIF 
    691717                        ENDIF 
    692                      ENDIF 
     718                     END DO 
    693719                  END DO 
    694                END DO 
    695                tsa(1,j1:j2,k1:k2,jn) = 0._wp 
    696             END DO 
    697          ENDIF 
    698          ! 
    699          IF( southern_side ) THEN            
    700             DO jn = 1, jpts 
    701                tsa(i1:i2,1,k1:k2,jn) = zalpha1 * ptab(i1:i2,1,k1:k2,jn) + zalpha2 * ptab(i1:i2,2,k1:k2,jn) 
    702                DO jk = 1, jpk       
    703                   DO ji=imin,imax 
    704                      IF( vmask(ji,2,jk) == 0._wp ) THEN 
    705                         tsa(ji,2,jk,jn)=tsa(ji,1,jk,jn) * tmask(ji,2,jk) 
    706                      ELSE 
    707                         tsa(ji,2,jk,jn)=(zalpha4*tsa(ji,1,jk,jn)+zalpha3*tsa(ji,3,jk,jn))*tmask(ji,2,jk) 
    708                         IF( vn(ji,2,jk) < 0._wp ) THEN 
    709                            tsa(ji,2,jk,jn)=(zalpha6*tsa(ji,3,jk,jn)+zalpha5*tsa(ji,1,jk,jn)+zalpha7*tsa(ji,4,jk,jn))*tmask(ji,2,jk) 
     720                  tsa(1,j1:j2,k1:k2,jn) = 0._wp 
     721               END DO 
     722            ENDIF 
     723            ! 
     724            IF( southern_side ) THEN            
     725               DO jn = 1, jpts 
     726                  tsa(i1:i2,1,k1:k2,jn) = z1 * ptab(i1:i2,1,k1:k2,jn) + z2 * ptab(i1:i2,2,k1:k2,jn) 
     727                  DO jk = 1, jpk       
     728                     DO ji=imin,imax 
     729                        IF( vmask(ji,2,jk) == 0._wp ) THEN 
     730                           tsa(ji,2,jk,jn)=tsa(ji,1,jk,jn) * tmask(ji,2,jk) 
     731                        ELSE 
     732                           tsa(ji,2,jk,jn)=(z4*tsa(ji,1,jk,jn)+z3*tsa(ji,3,jk,jn))*tmask(ji,2,jk) 
     733                           IF( vn(ji,2,jk) < 0._wp ) THEN 
     734                              tsa(ji,2,jk,jn)=(z6*tsa(ji,3,jk,jn)+z5*tsa(ji,1,jk,jn)+z7*tsa(ji,4,jk,jn))*tmask(ji,2,jk) 
     735                           ENDIF 
    710736                        ENDIF 
    711                      ENDIF 
     737                     END DO 
    712738                  END DO 
    713                END DO 
    714                tsa(i1:i2,1,k1:k2,jn) = 0._wp 
    715             END DO 
    716          ENDIF 
    717          ! 
    718          ! Treatment of corners 
    719          !  
    720          ! East south 
    721          IF ((eastern_side).AND.((nbondj == -1).OR.(nbondj == 2))) THEN 
    722             tsa(nlci-1,2,:,:) = ptab(nlci-1,2,:,:) 
    723          ENDIF 
    724          ! East north 
    725          IF ((eastern_side).AND.((nbondj == 1).OR.(nbondj == 2))) THEN 
    726             tsa(nlci-1,nlcj-1,:,:) = ptab(nlci-1,nlcj-1,:,:) 
    727          ENDIF 
    728          ! West south 
    729          IF ((western_side).AND.((nbondj == -1).OR.(nbondj == 2))) THEN 
    730             tsa(2,2,:,:) = ptab(2,2,:,:) 
    731          ENDIF 
    732          ! West north 
    733          IF ((western_side).AND.((nbondj == 1).OR.(nbondj == 2))) THEN 
    734             tsa(2,nlcj-1,:,:) = ptab(2,nlcj-1,:,:) 
    735          ENDIF 
    736          ! 
     739                  tsa(i1:i2,1,k1:k2,jn) = 0._wp 
     740               END DO 
     741            ENDIF 
     742            ! 
     743            ! Treatment of corners 
     744            IF ((eastern_side).AND.((nbondj == -1).OR.(nbondj == 2)))   tsa(nlci-1,2,:,:) = ptab(nlci-1,2,:,:)            ! East south 
     745            IF ((eastern_side).AND.((nbondj ==  1).OR.(nbondj == 2)))   tsa(nlci-1,nlcj-1,:,:) = ptab(nlci-1,nlcj-1,:,:)  ! East north 
     746            IF ((western_side).AND.((nbondj == -1).OR.(nbondj == 2)))   tsa(2,2,:,:) = ptab(2,2,:,:)                      ! West south 
     747            IF ((western_side).AND.((nbondj ==  1).OR.(nbondj == 2)))   tsa(2,nlcj-1,:,:) = ptab(2,nlcj-1,:,:)            ! West north 
     748            ! 
     749         ENDIF 
    737750      ENDIF 
    738751      ! 
     
    759772         southern_side = (nb == 2).AND.(ndir == 1) 
    760773         northern_side = (nb == 2).AND.(ndir == 2) 
    761          IF(western_side)  hbdy_w(j1:j2) = ptab(i1,j1:j2) * tmask(i1,j1:j2,1) 
    762          IF(eastern_side)  hbdy_e(j1:j2) = ptab(i1,j1:j2) * tmask(i1,j1:j2,1) 
    763          IF(southern_side) hbdy_s(i1:i2) = ptab(i1:i2,j1) * tmask(i1:i2,j1,1) 
     774         !! clem ghost 
     775         IF(western_side)  hbdy_w(j1:j2) = ptab(i2,j1:j2) * tmask(i2,j1:j2,1) 
     776         IF(eastern_side)  hbdy_e(j1:j2) = ptab(i1,j1:j2) * tmask(i1,j1:j2,1) !clem previously i1 
     777         IF(southern_side) hbdy_s(i1:i2) = ptab(i1:i2,j2) * tmask(i1:i2,j2,1) !clem previously j1 
    764778         IF(northern_side) hbdy_n(i1:i2) = ptab(i1:i2,j1) * tmask(i1:i2,j1,1) 
    765779      ENDIF 
     
    770784   SUBROUTINE interpun( ptab, i1, i2, j1, j2, k1, k2, before ) 
    771785      !!---------------------------------------------------------------------- 
    772       !!   *** ROUTINE interpun *** 
     786      !!                  *** ROUTINE interpun *** 
    773787      !!---------------------------------------------------------------------- 
    774788      INTEGER                               , INTENT(in   ) ::   i1, i2, j1, j2, k1, k2 
     
    798812   SUBROUTINE interpvn( ptab, i1, i2, j1, j2, k1, k2, before ) 
    799813      !!---------------------------------------------------------------------- 
    800       !!   *** ROUTINE interpvn *** 
     814      !!                  *** ROUTINE interpvn *** 
    801815      !!---------------------------------------------------------------------- 
    802816      INTEGER                               , INTENT(in   ) ::   i1, i2, j1, j2, k1, k2 
     
    854868         ELSEIF( bdy_tinterp == 2 ) THEN 
    855869            ztcoeff = zrhot * (  zt1        * (       zt1 - 1._wp)**2._wp & 
    856                &               - zt0        * (       zt0 - 1._wp)**2._wp )  
    857  
     870               &               - zt0        * (       zt0 - 1._wp)**2._wp ) 
    858871         ELSE 
    859872            ztcoeff = 1 
    860873         ENDIF 
    861          !    
    862          IF(western_side) THEN 
    863             ubdy_w(j1:j2) = ubdy_w(j1:j2) + ztcoeff * ptab(i1,j1:j2)   
    864          ENDIF 
    865          IF(eastern_side) THEN 
    866             ubdy_e(j1:j2) = ubdy_e(j1:j2) + ztcoeff * ptab(i1,j1:j2)   
    867          ENDIF 
    868          IF(southern_side) THEN 
    869             ubdy_s(i1:i2) = ubdy_s(i1:i2) + ztcoeff * ptab(i1:i2,j1)  
    870          ENDIF 
    871          IF(northern_side) THEN 
    872             ubdy_n(i1:i2) = ubdy_n(i1:i2) + ztcoeff * ptab(i1:i2,j1)  
    873          ENDIF 
     874         !! clem ghost    
     875         IF(western_side)   ubdy_w(j1:j2) = ubdy_w(j1:j2) + ztcoeff * ptab(i2,j1:j2)   
     876         IF(eastern_side)   ubdy_e(j1:j2) = ubdy_e(j1:j2) + ztcoeff * ptab(i1,j1:j2) !clem previously i1   
     877         IF(southern_side)  ubdy_s(i1:i2) = ubdy_s(i1:i2) + ztcoeff * ptab(i1:i2,j2) !clem previously j1 
     878         IF(northern_side)  ubdy_n(i1:i2) = ubdy_n(i1:i2) + ztcoeff * ptab(i1:i2,j1)  
    874879         !             
    875880         IF( bdy_tinterp == 0 .OR. bdy_tinterp == 2) THEN 
    876             IF(western_side) THEN 
    877                ubdy_w(j1:j2) = ubdy_w(j1:j2) / (zrhoy*e2u(i1,j1:j2)) * umask(i1,j1:j2,1) 
    878             ENDIF 
    879             IF(eastern_side) THEN 
    880                ubdy_e(j1:j2) = ubdy_e(j1:j2) / (zrhoy*e2u(i1,j1:j2)) * umask(i1,j1:j2,1) 
    881             ENDIF 
    882             IF(southern_side) THEN 
    883                ubdy_s(i1:i2) = ubdy_s(i1:i2) / (zrhoy*e2u(i1:i2,j1)) * umask(i1:i2,j1,1) 
    884             ENDIF 
    885             IF(northern_side) THEN 
    886                ubdy_n(i1:i2) = ubdy_n(i1:i2) / (zrhoy*e2u(i1:i2,j1)) * umask(i1:i2,j1,1) 
    887             ENDIF 
     881            IF(western_side)   ubdy_w(j1:j2) = ubdy_w(j1:j2) / (zrhoy*e2u(i2,j1:j2)) * umask(i2,j1:j2,1) 
     882            IF(eastern_side)   ubdy_e(j1:j2) = ubdy_e(j1:j2) / (zrhoy*e2u(i1,j1:j2)) * umask(i1,j1:j2,1) 
     883            IF(southern_side)  ubdy_s(i1:i2) = ubdy_s(i1:i2) / (zrhoy*e2u(i1:i2,j2)) * umask(i1:i2,j2,1) 
     884            IF(northern_side)  ubdy_n(i1:i2) = ubdy_n(i1:i2) / (zrhoy*e2u(i1:i2,j1)) * umask(i1:i2,j1,1) 
    888885         ENDIF 
    889886      ENDIF 
     
    927924            ztcoeff = 1 
    928925         ENDIF 
    929          ! 
    930          IF(western_side) THEN 
    931             vbdy_w(j1:j2) = vbdy_w(j1:j2) + ztcoeff * ptab(i1,j1:j2)   
    932          ENDIF 
    933          IF(eastern_side) THEN 
    934             vbdy_e(j1:j2) = vbdy_e(j1:j2) + ztcoeff * ptab(i1,j1:j2)   
    935          ENDIF 
    936          IF(southern_side) THEN 
    937             vbdy_s(i1:i2) = vbdy_s(i1:i2) + ztcoeff * ptab(i1:i2,j1) 
    938          ENDIF 
    939          IF(northern_side) THEN 
    940             vbdy_n(i1:i2) = vbdy_n(i1:i2) + ztcoeff * ptab(i1:i2,j1)  
    941          ENDIF 
     926         !! clem ghost 
     927         IF(western_side)   vbdy_w(j1:j2) = vbdy_w(j1:j2) + ztcoeff * ptab(i2,j1:j2)   
     928         IF(eastern_side)   vbdy_e(j1:j2) = vbdy_e(j1:j2) + ztcoeff * ptab(i1,j1:j2) !clem previously i1   
     929         IF(southern_side)  vbdy_s(i1:i2) = vbdy_s(i1:i2) + ztcoeff * ptab(i1:i2,j2) !clem previously j1 
     930         IF(northern_side)  vbdy_n(i1:i2) = vbdy_n(i1:i2) + ztcoeff * ptab(i1:i2,j1)  
    942931         !             
    943932         IF( bdy_tinterp == 0 .OR. bdy_tinterp == 2) THEN 
    944             IF(western_side) THEN 
    945                vbdy_w(j1:j2) = vbdy_w(j1:j2) / (zrhox*e1v(i1,j1:j2))   & 
    946                      &                                  * vmask(i1,j1:j2,1) 
    947             ENDIF 
    948             IF(eastern_side) THEN 
    949                vbdy_e(j1:j2) = vbdy_e(j1:j2) / (zrhox*e1v(i1,j1:j2))   & 
    950                      &                                  * vmask(i1,j1:j2,1) 
    951             ENDIF 
    952             IF(southern_side) THEN 
    953                vbdy_s(i1:i2) = vbdy_s(i1:i2) / (zrhox*e1v(i1:i2,j1))   & 
    954                      &                                  * vmask(i1:i2,j1,1) 
    955             ENDIF 
    956             IF(northern_side) THEN 
    957                vbdy_n(i1:i2) = vbdy_n(i1:i2) / (zrhox*e1v(i1:i2,j1))   & 
    958                      &                                  * vmask(i1:i2,j1,1) 
    959             ENDIF 
     933            IF(western_side)   vbdy_w(j1:j2) = vbdy_w(j1:j2) / (zrhox*e1v(i2,j1:j2)) * vmask(i2,j1:j2,1) 
     934            IF(eastern_side)   vbdy_e(j1:j2) = vbdy_e(j1:j2) / (zrhox*e1v(i1,j1:j2)) * vmask(i1,j1:j2,1) 
     935            IF(southern_side)  vbdy_s(i1:i2) = vbdy_s(i1:i2) / (zrhox*e1v(i1:i2,j2)) * vmask(i1:i2,j2,1) 
     936            IF(northern_side)  vbdy_n(i1:i2) = vbdy_n(i1:i2) / (zrhox*e1v(i1:i2,j1)) * vmask(i1:i2,j1,1) 
    960937         ENDIF 
    961938      ENDIF 
     
    991968         zat = zrhot * (  zt1**2._wp * (-2._wp*zt1 + 3._wp)    & 
    992969            &           - zt0**2._wp * (-2._wp*zt0 + 3._wp)    )  
    993          !  
    994          IF(western_side ) ubdy_w(j1:j2) = zat * ptab(i1,j1:j2)   
    995          IF(eastern_side ) ubdy_e(j1:j2) = zat * ptab(i1,j1:j2)  
    996          IF(southern_side) ubdy_s(i1:i2) = zat * ptab(i1:i2,j1)  
     970         !! clem ghost 
     971         IF(western_side ) ubdy_w(j1:j2) = zat * ptab(i2,j1:j2)   
     972         IF(eastern_side ) ubdy_e(j1:j2) = zat * ptab(i1,j1:j2) !clem previously i1  
     973         IF(southern_side) ubdy_s(i1:i2) = zat * ptab(i1:i2,j2) !clem previously j1 
    997974         IF(northern_side) ubdy_n(i1:i2) = zat * ptab(i1:i2,j1)  
    998975      ENDIF 
     
    10301007            &           - zt0**2._wp * (-2._wp*zt0 + 3._wp)    )  
    10311008         ! 
    1032          IF(western_side )   vbdy_w(j1:j2) = zat * ptab(i1,j1:j2)   
    1033          IF(eastern_side )   vbdy_e(j1:j2) = zat * ptab(i1,j1:j2)  
    1034          IF(southern_side)   vbdy_s(i1:i2) = zat * ptab(i1:i2,j1)  
     1009         IF(western_side )   vbdy_w(j1:j2) = zat * ptab(i2,j1:j2)   
     1010         IF(eastern_side )   vbdy_e(j1:j2) = zat * ptab(i1,j1:j2) !clem previously i1  
     1011         IF(southern_side)   vbdy_s(i1:i2) = zat * ptab(i1:i2,j2) !clem previously j1  
    10351012         IF(northern_side)   vbdy_n(i1:i2) = zat * ptab(i1:i2,j1)  
    10361013      ENDIF 
     
    10501027      INTEGER :: ji, jj, jk 
    10511028      LOGICAL :: western_side, eastern_side, northern_side, southern_side 
    1052       REAL(wp) :: ztmpmsk       
    10531029      !!----------------------------------------------------------------------   
    10541030      !     
     
    10601036         southern_side = (nb == 2).AND.(ndir == 1) 
    10611037         northern_side = (nb == 2).AND.(ndir == 2) 
    1062  
     1038         ! 
    10631039         DO jk = k1, k2 
    10641040            DO jj = j1, j2 
    10651041               DO ji = i1, i2 
    1066                   ! Get velocity mask at boundary edge points: 
    1067                   IF( western_side )   ztmpmsk = umask(ji    ,jj    ,1) 
    1068                   IF( eastern_side )   ztmpmsk = umask(nlci-2,jj    ,1) 
    1069                   IF( northern_side)   ztmpmsk = vmask(ji    ,nlcj-2,1) 
    1070                   IF( southern_side)   ztmpmsk = vmask(ji    ,2     ,1) 
    10711042                  ! 
    1072                   IF( ABS( ptab(ji,jj,jk) - tmask(ji,jj,jk) * e3t_0(ji,jj,jk) )*ztmpmsk > 1.D-2) THEN 
     1043                  IF( ABS( ptab(ji,jj,jk) - tmask(ji,jj,jk) * e3t_0(ji,jj,jk) ) > 1.D-2) THEN 
    10731044                     IF (western_side) THEN 
    10741045                        WRITE(numout,*) 'ERROR bathymetry merge at the western border ji,jj,jk ', ji+nimpp-1,jj+njmpp-1,jk 
     
    11751146   END SUBROUTINE interpvmsk 
    11761147 
    1177 # if defined key_zdftke 
    11781148 
    11791149   SUBROUTINE interpavm( ptab, i1, i2, j1, j2, k1, k2, before ) 
     
    11861156      !!----------------------------------------------------------------------   
    11871157      !       
    1188       IF( before ) THEN 
    1189          ptab (i1:i2,j1:j2,k1:k2) = avm_k(i1:i2,j1:j2,k1:k2) 
    1190       ELSE 
    1191          avm_k(i1:i2,j1:j2,k1:k2) = ptab (i1:i2,j1:j2,k1:k2) 
     1158      IF( before ) THEN   ;   ptab (i1:i2,j1:j2,k1:k2) = avm_k(i1:i2,j1:j2,k1:k2) 
     1159      ELSE                ;   avm_k(i1:i2,j1:j2,k1:k2) = ptab (i1:i2,j1:j2,k1:k2) 
    11921160      ENDIF 
    11931161      ! 
    11941162   END SUBROUTINE interpavm 
    1195  
    1196 # endif /* key_zdftke */ 
    11971163 
    11981164#else 
  • branches/2017/dev_CNRS_2017/NEMOGCM/NEMO/NST_SRC/agrif_opa_sponge.F90

    r7646 r8882  
    33MODULE agrif_opa_sponge 
    44   !!====================================================================== 
    5    !!                ***  MODULE agrif_opa_update  *** 
    6    !! AGRIF :    
     5   !!                   ***  MODULE  agrif_opa_interp  *** 
     6   !! AGRIF: sponge package for the ocean dynamics (OPA) 
    77   !!====================================================================== 
    8    !! History :   
     8   !! History :  2.0  !  2002-06  (XXX)  Original cade 
     9   !!             -   !  2005-11  (XXX)  
     10   !!            3.2  !  2009-04  (R. Benshila)  
     11   !!            3.6  !  2014-09  (R. Benshila)  
    912   !!---------------------------------------------------------------------- 
    1013#if defined key_agrif 
     14   !!---------------------------------------------------------------------- 
     15   !!   'key_agrif'                                              AGRIF zoom 
     16   !!---------------------------------------------------------------------- 
    1117   USE par_oce 
    1218   USE oce 
    1319   USE dom_oce 
     20   ! 
    1421   USE in_out_manager 
    1522   USE agrif_oce 
    16    USE wrk_nemo   
    1723   USE lbclnk          ! ocean lateral boundary conditions (or mpp link) 
    1824 
     
    2430 
    2531   !!---------------------------------------------------------------------- 
    26    !! NEMO/NST 3.7 , NEMO Consortium (2015) 
     32   !! NEMO/NST 4.0 , NEMO Consortium (2017) 
    2733   !! $Id$ 
    2834   !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) 
     
    3137 
    3238   SUBROUTINE Agrif_Sponge_Tra 
    33       !!--------------------------------------------- 
    34       !!   *** ROUTINE Agrif_Sponge_Tra *** 
    35       !!--------------------------------------------- 
    36       REAL(wp) :: timecoeff 
    37       !!--------------------------------------------- 
     39      !!---------------------------------------------------------------------- 
     40      !!                 *** ROUTINE Agrif_Sponge_Tra *** 
     41      !!---------------------------------------------------------------------- 
     42      REAL(wp) ::   zcoef   ! local scalar 
     43      !!---------------------------------------------------------------------- 
    3844      ! 
    3945#if defined SPONGE 
    40       timecoeff = REAL(Agrif_NbStepint(),wp)/Agrif_rhot() 
    41  
     46      zcoef = REAL( Agrif_NbStepint(), wp ) / Agrif_rhot() 
     47      ! 
    4248      CALL Agrif_Sponge 
    43       Agrif_SpecialValue=0. 
     49      Agrif_SpecialValue    = 0._wp 
    4450      Agrif_UseSpecialValue = .TRUE. 
    45       tabspongedone_tsn = .FALSE. 
    46  
    47       CALL Agrif_Bc_Variable(tsn_sponge_id,calledweight=timecoeff,procname=interptsn_sponge) 
    48  
     51      tabspongedone_tsn     = .FALSE. 
     52      ! 
     53      CALL Agrif_Bc_Variable( tsn_sponge_id, calledweight=zcoef, procname=interptsn_sponge ) 
     54      ! 
    4955      Agrif_UseSpecialValue = .FALSE. 
    5056#endif 
     
    5460 
    5561   SUBROUTINE Agrif_Sponge_dyn 
    56       !!--------------------------------------------- 
    57       !!   *** ROUTINE Agrif_Sponge_dyn *** 
    58       !!--------------------------------------------- 
    59       REAL(wp) :: timecoeff 
    60       !!--------------------------------------------- 
    61  
     62      !!---------------------------------------------------------------------- 
     63      !!                 *** ROUTINE Agrif_Sponge_dyn *** 
     64      !!---------------------------------------------------------------------- 
     65      REAL(wp) ::   zcoef   ! local scalar 
     66      !!---------------------------------------------------------------------- 
     67      ! 
    6268#if defined SPONGE 
    63       timecoeff = REAL(Agrif_NbStepint(),wp)/Agrif_rhot() 
    64  
    65       Agrif_SpecialValue=0. 
     69      zcoef = REAL( Agrif_NbStepint(), wp ) / Agrif_rhot() 
     70      ! 
     71      Agrif_SpecialValue    = 0._wp 
    6672      Agrif_UseSpecialValue = ln_spc_dyn 
    67  
     73      ! 
    6874      tabspongedone_u = .FALSE. 
    6975      tabspongedone_v = .FALSE.          
    70       CALL Agrif_Bc_Variable(un_sponge_id,calledweight=timecoeff,procname=interpun_sponge) 
    71  
     76      CALL Agrif_Bc_Variable( un_sponge_id, calledweight=zcoef, procname=interpun_sponge ) 
     77      ! 
    7278      tabspongedone_u = .FALSE. 
    7379      tabspongedone_v = .FALSE. 
    74       CALL Agrif_Bc_Variable(vn_sponge_id,calledweight=timecoeff,procname=interpvn_sponge) 
    75  
     80      CALL Agrif_Bc_Variable( vn_sponge_id, calledweight=zcoef, procname=interpvn_sponge ) 
     81      ! 
    7682      Agrif_UseSpecialValue = .FALSE. 
    7783#endif 
     
    8187 
    8288   SUBROUTINE Agrif_Sponge 
    83       !!--------------------------------------------- 
    84       !!   *** ROUTINE  Agrif_Sponge *** 
    85       !!--------------------------------------------- 
    86       INTEGER  :: ji,jj,jk 
    87       INTEGER  :: ispongearea, ilci, ilcj 
    88       LOGICAL  :: ll_spdone 
    89       REAL(wp) :: z1spongearea, zramp 
    90       REAL(wp), POINTER, DIMENSION(:,:) :: ztabramp 
    91  
     89      !!---------------------------------------------------------------------- 
     90      !!                 *** ROUTINE  Agrif_Sponge *** 
     91      !!---------------------------------------------------------------------- 
     92      INTEGER  ::   ji, jj, ind1, ind2 
     93      INTEGER  ::   ispongearea 
     94      REAL(wp) ::   z1_spongearea 
     95      REAL(wp), DIMENSION(jpi,jpj) :: ztabramp 
     96      !!---------------------------------------------------------------------- 
     97      ! 
    9298#if defined SPONGE || defined SPONGE_TOP 
    93       ll_spdone=.TRUE. 
    9499      IF (( .NOT. spongedoneT ).OR.( .NOT. spongedoneU )) THEN 
    95          ! Define ramp from boundaries towards domain interior 
    96          ! at T-points 
     100         ! Define ramp from boundaries towards domain interior at T-points 
    97101         ! Store it in ztabramp 
    98          ll_spdone=.FALSE. 
    99  
    100          CALL wrk_alloc( jpi, jpj, ztabramp ) 
    101102 
    102103         ispongearea  = 2 + nn_sponge_len * Agrif_irhox() 
    103          ilci = nlci - ispongearea 
    104          ilcj = nlcj - ispongearea  
    105          z1spongearea = 1._wp / REAL( ispongearea - 2 ) 
    106  
     104         z1_spongearea = 1._wp / REAL( ispongearea - 1 ) 
     105          
    107106         ztabramp(:,:) = 0._wp 
    108107 
     108         ! --- West --- ! 
    109109         IF( (nbondi == -1) .OR. (nbondi == 2) ) THEN 
     110            ind1 = 1+nbghostcells 
     111            ind2 = 1+nbghostcells + (ispongearea-1) 
    110112            DO jj = 1, jpj 
    111                IF ( umask(2,jj,1) == 1._wp ) THEN 
    112                  DO ji = 2, ispongearea                   
    113                     ztabramp(ji,jj) = ( ispongearea-ji ) * z1spongearea 
    114                  END DO 
    115                ENDIF 
     113               DO ji = ind1, ind2                   
     114                  ztabramp(ji,jj) = REAL( ind2 - ji ) * z1_spongearea * umask(ind1,jj,1) 
     115               END DO 
    116116            ENDDO 
    117117         ENDIF 
    118118 
     119         ! --- East --- ! 
    119120         IF( (nbondi == 1) .OR. (nbondi == 2) ) THEN 
     121            ind1 = nlci - (1+nbghostcells) - (ispongearea-1) 
     122            ind2 = nlci - (1+nbghostcells) 
    120123            DO jj = 1, jpj 
    121                IF ( umask(nlci-2,jj,1) == 1._wp ) THEN 
    122                   DO ji = ilci+1,nlci-1 
    123                      zramp = (ji - (ilci+1) ) * z1spongearea 
    124                      ztabramp(ji,jj) = MAX( ztabramp(ji,jj), zramp ) 
    125                   ENDDO 
    126                ENDIF 
     124               DO ji = ind1, ind2 
     125                  ztabramp(ji,jj) = MAX( ztabramp(ji,jj), REAL( ji - ind2 ) * z1_spongearea * umask(ind2-1,jj,1) ) 
     126               ENDDO 
    127127            ENDDO 
    128128         ENDIF 
    129129 
     130         ! --- South --- ! 
    130131         IF( (nbondj == -1) .OR. (nbondj == 2) ) THEN 
    131             DO ji = 1, jpi 
    132                IF ( vmask(ji,2,1) == 1._wp ) THEN 
    133                   DO jj = 2, ispongearea 
    134                      zramp = ( ispongearea-jj ) * z1spongearea 
    135                      ztabramp(ji,jj) = MAX( ztabramp(ji,jj), zramp ) 
    136                   END DO 
    137                ENDIF 
     132            ind1 = 1+nbghostcells 
     133            ind2 = 1+nbghostcells + (ispongearea-1) 
     134            DO jj = ind1, ind2 
     135               DO ji = 1, jpi 
     136                  ztabramp(ji,jj) = MAX( ztabramp(ji,jj), REAL( ind2 - jj ) * z1_spongearea * vmask(ji,ind1,1) ) 
     137               END DO 
    138138            ENDDO 
    139139         ENDIF 
    140140 
     141         ! --- North --- ! 
    141142         IF( (nbondj == 1) .OR. (nbondj == 2) ) THEN 
    142             DO ji = 1, jpi 
    143                IF ( vmask(ji,nlcj-2,1) == 1._wp ) THEN 
    144                   DO jj = ilcj+1,nlcj-1 
    145                      zramp = (jj - (ilcj+1) ) * z1spongearea 
    146                      ztabramp(ji,jj) = MAX( ztabramp(ji,jj), zramp ) 
    147                   END DO 
    148                ENDIF 
     143            ind1 = nlcj - (1+nbghostcells) - (ispongearea-1) 
     144            ind2 = nlcj - (1+nbghostcells) 
     145            DO jj = ind1, ind2 
     146               DO ji = 1, jpi 
     147                  ztabramp(ji,jj) = MAX( ztabramp(ji,jj), REAL( jj - ind2 ) * z1_spongearea * vmask(ji,ind2-1,1) ) 
     148               END DO 
    149149            ENDDO 
    150150         ENDIF 
     
    158158         DO jj = 2, jpjm1 
    159159            DO ji = 2, jpim1   ! vector opt. 
    160                fsaht_spu(ji,jj) = 0.5_wp * visc_tra * (ztabramp(ji,jj) + ztabramp(ji+1,jj  )) 
    161                fsaht_spv(ji,jj) = 0.5_wp * visc_tra * (ztabramp(ji,jj) + ztabramp(ji  ,jj+1)) 
    162             END DO 
    163          END DO 
    164  
     160               fsaht_spu(ji,jj) = 0.5_wp * visc_tra * ( ztabramp(ji,jj) + ztabramp(ji+1,jj  ) ) 
     161               fsaht_spv(ji,jj) = 0.5_wp * visc_tra * ( ztabramp(ji,jj) + ztabramp(ji  ,jj+1) ) 
     162            END DO 
     163         END DO 
    165164         CALL lbc_lnk( fsaht_spu, 'U', 1. )   ! Lateral boundary conditions 
    166165         CALL lbc_lnk( fsaht_spv, 'V', 1. ) 
     166          
    167167         spongedoneT = .TRUE. 
    168168      ENDIF 
     
    179179            END DO 
    180180         END DO 
    181  
    182181         CALL lbc_lnk( fsahm_spt, 'T', 1. )   ! Lateral boundary conditions 
    183182         CALL lbc_lnk( fsahm_spf, 'F', 1. ) 
     183          
    184184         spongedoneU = .TRUE. 
    185185      ENDIF 
    186186      ! 
    187       IF (.NOT.ll_spdone) CALL wrk_dealloc( jpi, jpj, ztabramp ) 
    188       ! 
    189187#endif 
    190188      ! 
     
    192190 
    193191 
    194    SUBROUTINE interptsn_sponge(tabres,i1,i2,j1,j2,k1,k2,n1,n2,before) 
    195       !!--------------------------------------------- 
    196       !!   *** ROUTINE interptsn_sponge *** 
    197       !!--------------------------------------------- 
    198       INTEGER, INTENT(in) :: i1,i2,j1,j2,k1,k2,n1,n2 
    199       REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2,n1:n2), INTENT(inout) :: tabres 
    200       LOGICAL, INTENT(in) :: before 
     192   SUBROUTINE interptsn_sponge( tabres, i1, i2, j1, j2, k1, k2, n1, n2, before ) 
     193      !!---------------------------------------------------------------------- 
     194      !!                 *** ROUTINE interptsn_sponge *** 
     195      !!---------------------------------------------------------------------- 
     196      INTEGER                                     , INTENT(in   ) ::   i1, i2, j1, j2, k1, k2, n1, n2 
     197      REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2,n1:n2), INTENT(inout) ::   tabres 
     198      LOGICAL                                     , INTENT(in   ) ::  before 
    201199      ! 
    202200      INTEGER  ::   ji, jj, jk, jn   ! dummy loop indices 
     
    205203      REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2) :: ztu, ztv 
    206204      REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2,n1:n2) ::tsbdiff 
     205      !!---------------------------------------------------------------------- 
    207206      ! 
    208207      IF( before ) THEN 
     
    241240                        zbtr = r1_e1e2t(ji,jj) / e3t_n(ji,jj,jk) 
    242241                        ! horizontal diffusive trends 
    243                         ztsa = zbtr * (  ztu(ji,jj,jk) - ztu(ji-1,jj,jk) + ztv(ji,jj,jk) - ztv(ji  ,jj-1,jk)  ) 
     242                        ztsa = zbtr * (  ztu(ji,jj,jk) - ztu(ji-1,jj,jk) + ztv(ji,jj,jk) - ztv(ji,jj-1,jk)  ) 
    244243                        ! add it to the general tracer trends 
    245244                        tsa(ji,jj,jk,jn) = tsa(ji,jj,jk,jn) + ztsa 
     
    258257 
    259258 
    260    SUBROUTINE interpun_sponge(tabres,i1,i2,j1,j2,k1,k2, before) 
    261       !!--------------------------------------------- 
    262       !!   *** ROUTINE interpun_sponge *** 
    263       !!---------------------------------------------     
    264       INTEGER, INTENT(in) :: i1,i2,j1,j2,k1,k2 
    265       REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) :: tabres 
    266       LOGICAL, INTENT(in) :: before 
    267  
    268       INTEGER :: ji,jj,jk 
    269  
     259   SUBROUTINE interpun_sponge( tabres, i1, i2, j1, j2, k1, k2, before ) 
     260      !!---------------------------------------------------------------------- 
     261      !!                 *** ROUTINE interpun_sponge *** 
     262      !!---------------------------------------------------------------------- 
     263      INTEGER                               , INTENT(in   ) ::   i1, i2, j1, j2, k1, k2 
     264      REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) ::   tabres 
     265      LOGICAL                               , INTENT(in   ) ::   before 
     266      !! 
     267      INTEGER :: ji, jj, jk 
    270268      ! sponge parameters  
     269      INTEGER :: jmax 
    271270      REAL(wp) :: ze2u, ze1v, zua, zva, zbtr 
    272271      REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2) :: ubdiff 
    273272      REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2) :: rotdiff, hdivdiff 
    274       INTEGER :: jmax 
    275       !!---------------------------------------------     
     273      !!---------------------------------------------------------------------- 
    276274      ! 
    277275      IF( before ) THEN 
    278276         tabres = un(i1:i2,j1:j2,:) 
    279277      ELSE 
    280          ubdiff(i1:i2,j1:j2,:) = (ub(i1:i2,j1:j2,:) - tabres(:,:,:))*umask(i1:i2,j1:j2,:) 
     278         ubdiff(i1:i2,j1:j2,:) = ( ub(i1:i2,j1:j2,:) - tabres(:,:,:) )*umask(i1:i2,j1:j2,:) 
    281279         ! 
    282280         DO jk = 1, jpkm1                                 ! Horizontal slab 
     
    297295               DO ji = i1,i2   ! vector opt. 
    298296                  zbtr = r1_e1e2f(ji,jj) * e3f_n(ji,jj,jk) * fsahm_spf(ji,jj) 
    299                   rotdiff(ji,jj,jk) = (-e1u(ji,jj+1) * ubdiff(ji,jj+1,jk) & 
    300                                        +e1u(ji,jj  ) * ubdiff(ji,jj  ,jk) &  
    301                                     & ) * fmask(ji,jj,jk) * zbtr  
     297                  rotdiff(ji,jj,jk) = ( -e1u(ji,jj+1) * ubdiff(ji,jj+1,jk)   & 
     298                                    &   +e1u(ji,jj  ) * ubdiff(ji,jj  ,jk) ) * fmask(ji,jj,jk) * zbtr  
    302299               END DO 
    303300            END DO 
     
    312309                     ze1v = hdivdiff(ji,jj,jk) 
    313310                     ! horizontal diffusive trends 
    314                      zua = - ( ze2u - rotdiff (ji,jj-1,jk)) / ( e2u(ji,jj) * e3u_n(ji,jj,jk) )   & 
    315                            + ( hdivdiff(ji+1,jj,jk) - ze1v  ) / e1u(ji,jj) 
     311                     zua = - ( ze2u - rotdiff (ji,jj-1,jk) ) / ( e2u(ji,jj) * e3u_n(ji,jj,jk) )   & 
     312                           + ( hdivdiff(ji+1,jj,jk) - ze1v ) * r1_e1u(ji,jj) 
    316313 
    317314                     ! add it to the general momentum trends 
     
    327324 
    328325         jmax = j2-1 
    329          IF ((nbondj == 1).OR.(nbondj == 2)) jmax = MIN(jmax,nlcj-3) 
     326         IF ((nbondj == 1).OR.(nbondj == 2)) jmax = MIN(jmax,nlcj-nbghostcells-2)   ! North 
    330327 
    331328         DO jj = j1+1, jmax 
     
    338335 
    339336                     ! horizontal diffusive trends 
    340                      zva = + ( ze2u - rotdiff (ji-1,jj,jk)) / ( e1v(ji,jj) * e3v_n(ji,jj,jk) )   & 
    341                            + ( hdivdiff(ji,jj+1,jk) - ze1v  ) / e2v(ji,jj) 
     337                     zva = + ( ze2u - rotdiff (ji-1,jj,jk) ) / ( e1v(ji,jj) * e3v_n(ji,jj,jk) )   & 
     338                           + ( hdivdiff(ji,jj+1,jk) - ze1v ) * r1_e2v(ji,jj) 
    342339 
    343340                     ! add it to the general momentum trends 
     
    356353 
    357354 
    358    SUBROUTINE interpvn_sponge(tabres,i1,i2,j1,j2,k1,k2, before,nb,ndir) 
    359       !!--------------------------------------------- 
    360       !!   *** ROUTINE interpvn_sponge *** 
    361       !!---------------------------------------------  
    362       INTEGER, INTENT(in) :: i1,i2,j1,j2,k1,k2 
    363       REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) :: tabres 
    364       LOGICAL, INTENT(in) :: before 
    365       INTEGER, INTENT(in) :: nb , ndir 
    366       ! 
    367       INTEGER  ::   ji, jj, jk 
    368       REAL(wp) ::   ze2u, ze1v, zua, zva, zbtr 
    369       REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2) :: vbdiff 
    370       REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2) :: rotdiff, hdivdiff 
    371       INTEGER :: imax 
    372       !!---------------------------------------------  
     355   SUBROUTINE interpvn_sponge( tabres, i1, i2, j1, j2, k1, k2, before, nb, ndir ) 
     356      !!---------------------------------------------------------------------- 
     357      !!                 *** ROUTINE interpvn_sponge *** 
     358      !!---------------------------------------------------------------------- 
     359      INTEGER                               , INTENT(in   ) ::   i1, i2, j1, j2, k1, k2 
     360      REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) ::   tabres 
     361      LOGICAL                               , INTENT(in   ) ::   before 
     362      INTEGER                               , INTENT(in   ) ::   nb , ndir 
     363      ! 
     364      INTEGER ::   ji, jj, jk 
     365      INTEGER ::   imax 
     366      REAL(wp)::   ze2u, ze1v, zua, zva, zbtr 
     367      REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2) ::   vbdiff, rotdiff, hdivdiff 
     368      !!---------------------------------------------------------------------- 
    373369 
    374370      IF( before ) THEN  
     
    376372      ELSE 
    377373         ! 
    378          vbdiff(i1:i2,j1:j2,:) = (vb(i1:i2,j1:j2,:) - tabres(:,:,:))*vmask(i1:i2,j1:j2,:) 
     374         vbdiff(i1:i2,j1:j2,:) = ( vb(i1:i2,j1:j2,:) - tabres(:,:,:) ) * vmask(i1:i2,j1:j2,:) 
    379375         ! 
    380376         DO jk = 1, jpkm1                                 ! Horizontal slab 
     
    403399         !                                                 
    404400 
    405          imax = i2-1 
    406          IF ((nbondi == 1).OR.(nbondi == 2))   imax = MIN(imax,nlci-3) 
     401         imax = i2 - 1 
     402         IF ((nbondi == 1).OR.(nbondi == 2))   imax = MIN(imax,nlci-nbghostcells-2)   ! East 
    407403 
    408404         DO jj = j1+1, j2 
     
    437433 
    438434#else 
     435   !!---------------------------------------------------------------------- 
     436   !!   Empty module                                          no AGRIF zoom 
     437   !!---------------------------------------------------------------------- 
    439438CONTAINS 
    440439   SUBROUTINE agrif_opa_sponge_empty 
    441       !!--------------------------------------------- 
    442       !!   *** ROUTINE agrif_OPA_sponge_empty *** 
    443       !!--------------------------------------------- 
    444440      WRITE(*,*)  'agrif_opa_sponge : You should not have seen this print! error?' 
    445441   END SUBROUTINE agrif_opa_sponge_empty 
  • branches/2017/dev_CNRS_2017/NEMOGCM/NEMO/NST_SRC/agrif_opa_update.F90

    r7646 r8882  
    33  
    44MODULE agrif_opa_update 
     5   !!====================================================================== 
     6   !!                   ***  MODULE  agrif_opa_interp  *** 
     7   !! AGRIF: update package for the ocean dynamics (OPA) 
     8   !!====================================================================== 
     9   !! History :  2.0  !  2002-06  (L. Debreu)  Original code 
     10   !!            3.2  !  2009-04  (R. Benshila)  
     11   !!            3.6  !  2014-09  (R. Benshila)  
     12   !!---------------------------------------------------------------------- 
    513#if defined key_agrif  
     14   !!---------------------------------------------------------------------- 
     15   !!   'key_agrif'                                              AGRIF zoom 
     16   !!---------------------------------------------------------------------- 
    617   USE par_oce 
    718   USE oce 
    819   USE dom_oce 
     20   USE zdf_oce        ! vertical physics: ocean variables  
    921   USE agrif_oce 
    10    USE in_out_manager  ! I/O manager 
    11    USE lib_mpp 
    12    USE wrk_nemo   
    13    USE zdf_oce        ! vertical physics: ocean variables  
     22   ! 
     23   USE in_out_manager ! I/O manager 
     24   USE lib_mpp        ! MPP library 
    1425 
    1526   IMPLICIT NONE 
    1627   PRIVATE 
    1728 
    18    PUBLIC Agrif_Update_Tra, Agrif_Update_Dyn,Update_Scales 
    19 # if defined key_zdftke 
    20    PUBLIC Agrif_Update_Tke 
    21 # endif 
     29   PUBLIC   Agrif_Update_Tra, Agrif_Update_Dyn, Update_Scales 
     30 
    2231   !!---------------------------------------------------------------------- 
    23    !! NEMO/NST 3.6 , NEMO Consortium (2010) 
     32   !! NEMO/NST 4.0 , NEMO Consortium (2017) 
    2433   !! $Id$ 
    2534   !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) 
     
    2837 
    2938   RECURSIVE SUBROUTINE Agrif_Update_Tra( ) 
    30       !!--------------------------------------------- 
    31       !!   *** ROUTINE Agrif_Update_Tra *** 
    32       !!--------------------------------------------- 
     39      !!---------------------------------------------------------------------- 
     40      !!                   *** ROUTINE Agrif_Update_Tra *** 
     41      !!---------------------------------------------------------------------- 
    3342      !  
    3443      IF (Agrif_Root()) RETURN 
     
    3847 
    3948      Agrif_UseSpecialValueInUpdate = .TRUE. 
    40       Agrif_SpecialValueFineGrid = 0. 
     49      Agrif_SpecialValueFineGrid    = 0._wp 
    4150      !  
    4251      IF (MOD(nbcline,nbclineupdate) == 0) THEN 
     
    6877 
    6978   RECURSIVE SUBROUTINE Agrif_Update_Dyn( ) 
    70       !!--------------------------------------------- 
    71       !!   *** ROUTINE Agrif_Update_Dyn *** 
    72       !!--------------------------------------------- 
     79      !!---------------------------------------------------------------------- 
     80      !!                   *** ROUTINE Agrif_Update_Dyn *** 
     81      !!---------------------------------------------------------------------- 
    7382      !  
    7483      IF (Agrif_Root()) RETURN 
     
    106115# endif 
    107116 
    108       IF ( ln_dynspg_ts.AND.ln_bt_fw ) THEN 
     117      IF ( ln_dynspg_ts .AND. ln_bt_fw ) THEN 
    109118         ! Update time integrated transports 
    110119         IF (mod(nbcline,nbclineupdate) == 0) THEN 
     
    149158   END SUBROUTINE Agrif_Update_Dyn 
    150159 
    151 # if defined key_zdftke 
    152  
    153    SUBROUTINE Agrif_Update_Tke( kt ) 
    154       !!--------------------------------------------- 
    155       !!   *** ROUTINE Agrif_Update_Tke *** 
    156       !!--------------------------------------------- 
    157       !! 
    158       INTEGER, INTENT(in) :: kt 
    159       !        
    160       IF( ( Agrif_NbStepint() .NE. 0 ) .AND. (kt /= 0) ) RETURN 
    161 #  if defined TWO_WAY 
    162  
    163       Agrif_UseSpecialValueInUpdate = .TRUE. 
    164       Agrif_SpecialValueFineGrid = 0. 
    165  
    166       CALL Agrif_Update_Variable( en_id, locupdate=(/0,0/), procname=updateEN  ) 
    167       CALL Agrif_Update_Variable(avt_id, locupdate=(/0,0/), procname=updateAVT ) 
    168       CALL Agrif_Update_Variable(avm_id, locupdate=(/0,0/), procname=updateAVM ) 
    169  
    170       Agrif_UseSpecialValueInUpdate = .FALSE. 
    171  
    172 #  endif 
    173        
    174    END SUBROUTINE Agrif_Update_Tke 
    175     
    176 # endif /* key_zdftke */ 
    177160 
    178161   SUBROUTINE updateTS( tabres, i1, i2, j1, j2, k1, k2, n1, n2, before ) 
    179       !!--------------------------------------------- 
     162      !!---------------------------------------------------------------------- 
    180163      !!           *** ROUTINE updateT *** 
    181       !!--------------------------------------------- 
    182       INTEGER, INTENT(in) :: i1,i2,j1,j2,k1,k2,n1,n2 
    183       REAL(wp),DIMENSION(i1:i2,j1:j2,k1:k2,n1:n2), INTENT(inout) :: tabres 
    184       LOGICAL, INTENT(in) :: before 
    185       !! 
    186       INTEGER :: ji,jj,jk,jn 
    187       !!--------------------------------------------- 
    188       ! 
    189       IF (before) THEN 
    190          DO jn = n1,n2 
    191             DO jk=k1,k2 
    192                DO jj=j1,j2 
    193                   DO ji=i1,i2 
     164      !!---------------------------------------------------------------------- 
     165      INTEGER                                    , INTENT(in   ) ::   i1, i2, j1, j2, k1, k2, n1, n2 
     166      REAL(wp),DIMENSION(i1:i2,j1:j2,k1:k2,n1:n2), INTENT(inout) ::   tabres 
     167      LOGICAL                                    , INTENT(in   ) ::  before 
     168      ! 
     169      INTEGER :: ji, jj, jk, jn 
     170      !!---------------------------------------------------------------------- 
     171      ! 
     172      IF( before ) THEN 
     173         DO jn = n1, n2 
     174            DO jk = k1, k2 
     175               DO jj = j1, j2 
     176                  DO ji = i1, i2 
    194177                     tabres(ji,jj,jk,jn) = tsn(ji,jj,jk,jn) 
    195178                  END DO 
     
    201184            ! Add asselin part 
    202185            DO jn = n1,n2 
    203                DO jk=k1,k2 
    204                   DO jj=j1,j2 
    205                      DO ji=i1,i2 
    206                         IF( tabres(ji,jj,jk,jn) .NE. 0. ) THEN 
     186               DO jk = k1, k2 
     187                  DO jj = j1, j2 
     188                     DO ji = i1, i2 
     189                        IF( tabres(ji,jj,jk,jn) /= 0._wp ) THEN 
    207190                           tsb(ji,jj,jk,jn) = tsb(ji,jj,jk,jn) &  
    208                                  & + atfp * ( tabres(ji,jj,jk,jn) & 
    209                                  &             - tsn(ji,jj,jk,jn) ) * tmask(ji,jj,jk) 
     191                              &             + atfp * ( tabres(ji,jj,jk,jn) - tsn(ji,jj,jk,jn) ) * tmask(ji,jj,jk) 
    210192                        ENDIF 
    211                      ENDDO 
    212                   ENDDO 
    213                ENDDO 
    214             ENDDO 
     193                     END DO 
     194                  END DO 
     195               END DO 
     196            END DO 
    215197         ENDIF 
    216198         DO jn = n1,n2 
     
    218200               DO jj=j1,j2 
    219201                  DO ji=i1,i2 
    220                      IF( tabres(ji,jj,jk,jn) .NE. 0. ) THEN  
     202                     IF( tabres(ji,jj,jk,jn) /= 0._wp ) THEN  
    221203                        tsn(ji,jj,jk,jn) = tabres(ji,jj,jk,jn) * tmask(ji,jj,jk) 
    222204                     END IF 
     
    238220      LOGICAL                               , INTENT(in   ) :: before 
    239221      ! 
    240       INTEGER  ::   ji, jj, jk 
    241       REAL(wp) ::   zrhoy 
     222      INTEGER ::   ji, jj, jk 
     223      REAL(wp)::   zrhoy 
    242224      !!--------------------------------------------- 
    243225      !  
     
    268250 
    269251   SUBROUTINE updatev( tabres, i1, i2, j1, j2, k1, k2, before ) 
    270       !!--------------------------------------------- 
    271       !!           *** ROUTINE updatev *** 
    272       !!--------------------------------------------- 
    273       INTEGER :: i1,i2,j1,j2,k1,k2 
    274       INTEGER :: ji,jj,jk 
    275       REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2) :: tabres 
    276       LOGICAL :: before 
     252      !!---------------------------------------------------------------------- 
     253      !!                      *** ROUTINE updatev *** 
     254      !!---------------------------------------------------------------------- 
     255      INTEGER                               , INTENT(in   ) :: i1, i2, j1, j2, k1, k2 
     256      REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) :: tabres 
     257      LOGICAL                               , INTENT(in   ) :: before 
    277258      !! 
    278       REAL(wp) :: zrhox 
    279       !!---------------------------------------------       
    280       ! 
    281       IF (before) THEN 
     259      INTEGER  ::   ji, jj, jk 
     260      REAL(wp) ::   zrhox 
     261      !!---------------------------------------------------------------------- 
     262      ! 
     263      IF( before ) THEN 
    282264         zrhox = Agrif_Rhox() 
    283          DO jk=k1,k2 
    284             DO jj=j1,j2 
    285                DO ji=i1,i2 
     265         DO jk = k1, k2 
     266            DO jj = j1, j2 
     267               DO ji = i1, i2 
    286268                  tabres(ji,jj,jk) = zrhox * e1v(ji,jj) * e3v_n(ji,jj,jk) * vn(ji,jj,jk) 
    287269               END DO 
     
    289271         END DO 
    290272      ELSE 
    291          DO jk=k1,k2 
    292             DO jj=j1,j2 
    293                DO ji=i1,i2 
     273         DO jk = k1, k2 
     274            DO jj = j1, j2 
     275               DO ji = i1, i2 
    294276                  tabres(ji,jj,jk) = tabres(ji,jj,jk) * r1_e1v(ji,jj) / e3v_n(ji,jj,jk) 
    295277                  ! 
    296                   IF (.NOT.(lk_agrif_fstep.AND.(neuler==0))) THEN ! Add asselin part 
     278                  IF( .NOT.(lk_agrif_fstep.AND.(neuler==0)) ) THEN ! Add asselin part 
    297279                     vb(ji,jj,jk) = vb(ji,jj,jk) &  
    298                            & + atfp * ( tabres(ji,jj,jk) - vn(ji,jj,jk) ) * vmask(ji,jj,jk) 
     280                        &        + atfp * ( tabres(ji,jj,jk) - vn(ji,jj,jk) ) * vmask(ji,jj,jk) 
    299281                  ENDIF 
    300282                  ! 
     
    309291 
    310292   SUBROUTINE updateu2d( tabres, i1, i2, j1, j2, before ) 
     293      !!---------------------------------------------------------------------- 
     294      !!                      *** ROUTINE updateu2d *** 
     295      !!---------------------------------------------------------------------- 
     296      INTEGER                         , INTENT(in   ) ::   i1, i2, j1, j2 
     297      REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) ::   tabres 
     298      LOGICAL                         , INTENT(in   ) ::   before 
     299      !!  
     300      INTEGER ::   ji, jj, jk 
     301      REAL(wp)::   zrhoy, zcorr 
    311302      !!--------------------------------------------- 
    312       !!          *** ROUTINE updateu2d *** 
    313       !!--------------------------------------------- 
    314       INTEGER, INTENT(in) :: i1, i2, j1, j2 
    315       REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) :: tabres 
    316       LOGICAL, INTENT(in) :: before 
    317       !!  
    318       INTEGER :: ji, jj, jk 
    319       REAL(wp) :: zrhoy 
    320       REAL(wp) :: zcorr 
    321       !!--------------------------------------------- 
    322       ! 
    323       IF (before) THEN 
     303      ! 
     304      IF( before ) THEN 
    324305         zrhoy = Agrif_Rhoy() 
    325306         DO jj=j1,j2 
     
    374355 
    375356   SUBROUTINE updatev2d( tabres, i1, i2, j1, j2, before ) 
    376       !!--------------------------------------------- 
    377       !!          *** ROUTINE updatev2d *** 
    378       !!--------------------------------------------- 
    379       INTEGER, INTENT(in) :: i1, i2, j1, j2 
    380       REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) :: tabres 
    381       LOGICAL, INTENT(in) :: before 
    382       !!  
     357      !!---------------------------------------------------------------------- 
     358      !!                   *** ROUTINE updatev2d *** 
     359      !!---------------------------------------------------------------------- 
     360      INTEGER                         , INTENT(in   ) ::  i1, i2, j1, j2 
     361      REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) ::   tabres 
     362      LOGICAL                         , INTENT(in   ) ::  before 
     363      !  
    383364      INTEGER :: ji, jj, jk 
    384       REAL(wp) :: zrhox 
    385       REAL(wp) :: zcorr 
    386       !!--------------------------------------------- 
    387       ! 
    388       IF (before) THEN 
     365      REAL(wp) :: zrhox, zcorr 
     366      !!---------------------------------------------------------------------- 
     367      ! 
     368      IF( before ) THEN 
    389369         zrhox = Agrif_Rhox() 
    390370         DO jj=j1,j2 
     
    439419 
    440420   SUBROUTINE updateSSH( tabres, i1, i2, j1, j2, before ) 
    441       !!--------------------------------------------- 
    442       !!          *** ROUTINE updateSSH *** 
    443       !!--------------------------------------------- 
    444       INTEGER, INTENT(in) :: i1, i2, j1, j2 
    445       REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) :: tabres 
    446       LOGICAL, INTENT(in) :: before 
     421      !!---------------------------------------------------------------------- 
     422      !!                   *** ROUTINE updateSSH *** 
     423      !!---------------------------------------------------------------------- 
     424      INTEGER                         , INTENT(in   ) ::  i1, i2, j1, j2 
     425      REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) ::   tabres 
     426      LOGICAL                         , INTENT(in   ) ::  before 
    447427      !! 
    448428      INTEGER :: ji, jj 
    449       !!--------------------------------------------- 
    450       !  
    451       IF (before) THEN 
     429      !!---------------------------------------------------------------------- 
     430      !  
     431      IF( before ) THEN 
    452432         DO jj=j1,j2 
    453433            DO ji=i1,i2 
     
    478458 
    479459   SUBROUTINE updateub2b( tabres, i1, i2, j1, j2, before ) 
    480       !!--------------------------------------------- 
    481       !!          *** ROUTINE updateub2b *** 
    482       !!--------------------------------------------- 
    483       INTEGER, INTENT(in) :: i1, i2, j1, j2 
    484       REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) :: tabres 
    485       LOGICAL, INTENT(in) :: before 
     460      !!---------------------------------------------------------------------- 
     461      !!                      *** ROUTINE updateub2b *** 
     462      !!---------------------------------------------------------------------- 
     463      INTEGER                            , INTENT(in) ::  i1, i2, j1, j2 
     464      REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) ::   tabres 
     465      LOGICAL                            , INTENT(in) ::  before 
    486466      !! 
    487       INTEGER :: ji, jj 
    488       REAL(wp) :: zrhoy 
    489       !!--------------------------------------------- 
     467      INTEGER ::   ji, jj 
     468      REAL(wp)::  zrhoy 
     469      !!---------------------------------------------------------------------- 
    490470      ! 
    491471      IF (before) THEN 
     
    509489 
    510490   SUBROUTINE updatevb2b( tabres, i1, i2, j1, j2, before ) 
    511       !!--------------------------------------------- 
    512       !!          *** ROUTINE updatevb2b *** 
    513       !!--------------------------------------------- 
    514       INTEGER, INTENT(in) :: i1, i2, j1, j2 
    515       REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) :: tabres 
    516       LOGICAL, INTENT(in) :: before 
     491      !!---------------------------------------------------------------------- 
     492      !!                      *** ROUTINE updatevb2b *** 
     493      !!---------------------------------------------------------------------- 
     494      INTEGER                         , INTENT(in   ) ::  i1, i2, j1, j2 
     495      REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) ::   tabres 
     496      LOGICAL                         , INTENT(in   ) ::  before 
    517497      !! 
    518       INTEGER :: ji, jj 
    519       REAL(wp) :: zrhox 
    520       !!--------------------------------------------- 
    521       ! 
    522       IF (before) THEN 
     498      INTEGER ::   ji, jj 
     499      REAL(wp)::  zrhox 
     500      !!---------------------------------------------------------------------- 
     501      ! 
     502      IF( before ) THEN 
    523503         zrhox = Agrif_Rhox() 
    524504         DO jj=j1,j2 
     
    540520 
    541521   SUBROUTINE update_scales( tabres, i1, i2, j1, j2, k1, k2, n1,n2, before ) 
    542       ! currently not used 
    543       !!--------------------------------------------- 
    544       !!           *** ROUTINE updateT *** 
    545       !!--------------------------------------------- 
    546       INTEGER, INTENT(in) :: i1,i2,j1,j2,k1,k2,n1,n2 
    547       REAL(wp),DIMENSION(i1:i2,j1:j2,k1:k2,n1:n2), INTENT(inout) :: tabres 
    548       LOGICAL, iNTENT(in) :: before 
    549       ! 
     522      ! 
     523      ! ====>>>>>>>>>>    currently not used 
     524      ! 
     525      !!---------------------------------------------------------------------- 
     526      !!                      *** ROUTINE updateT *** 
     527      !!---------------------------------------------------------------------- 
     528      INTEGER                                    , INTENT(in   ) ::   i1, i2, j1, j2, k1, k2, n1, n2 
     529      REAL(wp),DIMENSION(i1:i2,j1:j2,k1:k2,n1:n2), INTENT(inout) ::   tabres 
     530      LOGICAL                                    , INTENT(in   ) ::   before 
     531      !! 
    550532      INTEGER :: ji,jj,jk 
    551533      REAL(wp) :: ztemp 
    552       !!--------------------------------------------- 
     534      !!---------------------------------------------------------------------- 
    553535 
    554536      IF (before) THEN 
     
    587569   END SUBROUTINE update_scales 
    588570 
    589 # if defined key_zdftke 
    590571 
    591572   SUBROUTINE updateEN( ptab, i1, i2, j1, j2, k1, k2, before ) 
    592       !!--------------------------------------------- 
    593       !!           *** ROUTINE updateen *** 
    594       !!--------------------------------------------- 
    595       INTEGER, INTENT(in) :: i1, i2, j1, j2, k1, k2 
    596       REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) :: ptab 
    597       LOGICAL, INTENT(in) :: before 
    598       !!--------------------------------------------- 
    599       ! 
    600       IF (before) THEN 
     573      !!---------------------------------------------------------------------- 
     574      !!                      *** ROUTINE updateen *** 
     575      !!---------------------------------------------------------------------- 
     576      INTEGER                               , INTENT(in   ) ::  i1, i2, j1, j2, k1, k2 
     577      REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) ::   ptab 
     578      LOGICAL                               , INTENT(in   ) ::  before 
     579      !!---------------------------------------------------------------------- 
     580      ! 
     581      IF( before ) THEN 
    601582         ptab (i1:i2,j1:j2,k1:k2) = en(i1:i2,j1:j2,k1:k2) 
    602583      ELSE 
     
    608589 
    609590   SUBROUTINE updateAVT( ptab, i1, i2, j1, j2, k1, k2, before ) 
    610       !!--------------------------------------------- 
    611       !!           *** ROUTINE updateavt *** 
    612       !!--------------------------------------------- 
    613       INTEGER, INTENT(in) :: i1, i2, j1, j2, k1, k2 
    614       REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) :: ptab 
    615       LOGICAL, INTENT(in) :: before 
    616       !!--------------------------------------------- 
    617       ! 
    618       IF (before) THEN 
    619          ptab (i1:i2,j1:j2,k1:k2) = avt_k(i1:i2,j1:j2,k1:k2) 
    620       ELSE 
    621          avt_k(i1:i2,j1:j2,k1:k2) = ptab (i1:i2,j1:j2,k1:k2)  
     591      !!---------------------------------------------------------------------- 
     592      !!                      *** ROUTINE updateavt *** 
     593      !!---------------------------------------------------------------------- 
     594      INTEGER                               , INTENT(in   ) ::   i1, i2, j1, j2, k1, k2 
     595      REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) ::   ptab 
     596      LOGICAL                               , INTENT(in   ) ::   before 
     597      !!---------------------------------------------------------------------- 
     598      ! 
     599      IF( before ) THEN   ;   ptab (i1:i2,j1:j2,k1:k2) = avt_k(i1:i2,j1:j2,k1:k2) 
     600      ELSE                ;   avt_k(i1:i2,j1:j2,k1:k2) = ptab (i1:i2,j1:j2,k1:k2)  
    622601      ENDIF 
    623602      ! 
     
    628607      !!--------------------------------------------- 
    629608      !!           *** ROUTINE updateavm *** 
    630       !!--------------------------------------------- 
    631       INTEGER, INTENT(in) :: i1, i2, j1, j2, k1, k2 
    632       REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) :: ptab 
    633       LOGICAL, INTENT(in) :: before 
    634       !!--------------------------------------------- 
    635       ! 
    636       IF (before) THEN 
    637          ptab (i1:i2,j1:j2,k1:k2) = avm_k(i1:i2,j1:j2,k1:k2) 
    638       ELSE 
    639          avm_k(i1:i2,j1:j2,k1:k2) = ptab (i1:i2,j1:j2,k1:k2)  
     609      !!---------------------------------------------------------------------- 
     610      INTEGER                               , INTENT(in   ) ::   i1, i2, j1, j2, k1, k2 
     611      REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) ::   ptab 
     612      LOGICAL                               , INTENT(in   ) ::   before 
     613      !!---------------------------------------------------------------------- 
     614      ! 
     615      IF( before ) THEN   ;   ptab (i1:i2,j1:j2,k1:k2) = avm_k(i1:i2,j1:j2,k1:k2) 
     616      ELSE                ;   avm_k(i1:i2,j1:j2,k1:k2) = ptab (i1:i2,j1:j2,k1:k2)  
    640617      ENDIF 
    641618      ! 
    642619   END SUBROUTINE updateAVM 
    643620 
    644 # endif /* key_zdftke */  
    645  
    646621#else 
     622   !!---------------------------------------------------------------------- 
     623   !!   Empty module                                          no AGRIF zoom 
     624   !!---------------------------------------------------------------------- 
    647625CONTAINS 
    648626   SUBROUTINE agrif_opa_update_empty 
    649       !!--------------------------------------------- 
    650       !!   *** ROUTINE agrif_opa_update_empty *** 
    651       !!--------------------------------------------- 
    652627      WRITE(*,*)  'agrif_opa_update : You should not have seen this print! error?' 
    653628   END SUBROUTINE agrif_opa_update_empty 
    654629#endif 
     630 
     631   !!====================================================================== 
    655632END MODULE agrif_opa_update 
    656633 
  • branches/2017/dev_CNRS_2017/NEMOGCM/NEMO/NST_SRC/agrif_top_interp.F90

    r6140 r8882  
    11MODULE agrif_top_interp 
     2   !!====================================================================== 
     3   !!                   ***  MODULE  agrif_top_interp  *** 
     4   !! AGRIF: interpolation package for TOP 
     5   !!====================================================================== 
     6   !! History :  2.0  !  ???  
     7   !!---------------------------------------------------------------------- 
    28#if defined key_agrif && defined key_top 
     9   !!---------------------------------------------------------------------- 
     10   !!   'key_agrif'                                              AGRIF zoom 
     11   !!   'key_top'                                           on-line tracers 
     12   !!---------------------------------------------------------------------- 
    313   USE par_oce 
    414   USE oce 
     
    818   USE par_trc 
    919   USE trc 
    10    USE lib_mpp 
    11    USE wrk_nemo   
     20   ! 
     21   USE lib_mpp     ! MPP library 
    1222 
    1323   IMPLICIT NONE 
     
    1626   PUBLIC Agrif_trc, interptrn 
    1727 
    18 #  include "vectopt_loop_substitute.h90" 
    1928  !!---------------------------------------------------------------------- 
    20    !! NEMO/NST 3.6 , NEMO Consortium (2010) 
     29   !! NEMO/NST 4.0 , NEMO Consortium (2017) 
    2130   !! $Id$ 
    2231   !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) 
     
    2635   SUBROUTINE Agrif_trc 
    2736      !!---------------------------------------------------------------------- 
    28       !!                  ***  ROUTINE Agrif_trc  *** 
     37      !!                   ***  ROUTINE Agrif_trc  *** 
    2938      !!---------------------------------------------------------------------- 
    3039      ! 
    3140      IF( Agrif_Root() )   RETURN 
    32  
    33       Agrif_SpecialValue    = 0.e0 
     41      ! 
     42      Agrif_SpecialValue    = 0._wp 
    3443      Agrif_UseSpecialValue = .TRUE. 
    35  
     44      ! 
    3645      CALL Agrif_Bc_variable( trn_id, procname=interptrn ) 
    3746      Agrif_UseSpecialValue = .FALSE. 
     
    4049 
    4150 
    42    SUBROUTINE interptrn(ptab,i1,i2,j1,j2,k1,k2,n1,n2,before,nb,ndir) 
    43       !!--------------------------------------------- 
    44       !!   *** ROUTINE interptrn *** 
    45       !!--------------------------------------------- 
    46       REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2,n1:n2), INTENT(inout) :: ptab 
    47       INTEGER, INTENT(in) :: i1,i2,j1,j2,k1,k2,n1,n2 
    48       LOGICAL, INTENT(in) :: before 
    49       INTEGER, INTENT(in) :: nb , ndir 
     51   SUBROUTINE interptrn( ptab, i1, i2, j1, j2, k1, k2, n1, n2, before, nb, ndir ) 
     52      !!---------------------------------------------------------------------- 
     53      !!                   *** ROUTINE interptrn *** 
     54      !!---------------------------------------------------------------------- 
     55      REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2,n1:n2), INTENT(inout) ::   ptab 
     56      INTEGER                                     , INTENT(in   ) ::   i1, i2, j1, j2, k1, k2, n1, n2 
     57      LOGICAL                                     , INTENT(in   ) ::   before 
     58      INTEGER                                     , INTENT(in   ) ::   nb , ndir 
     59      !! 
     60      INTEGER ::   ji, jj, jk, jn   ! dummy loop indices 
     61      INTEGER ::   imin, imax, jmin, jmax 
     62      LOGICAL ::   ll_west, ll_east, ll_north, ll_south 
     63      REAL(wp) ::   zrhox, z1, z2, z3, z4, z5, z6, z7 
     64      !!---------------------------------------------------------------------- 
    5065      ! 
    51       INTEGER  ::   ji, jj, jk, jn   ! dummy loop indices 
    52       INTEGER :: imin, imax, jmin, jmax 
    53       REAL(wp) ::   zrhox , zalpha1, zalpha2, zalpha3 
    54       REAL(wp) ::   zalpha4, zalpha5, zalpha6, zalpha7 
    55       LOGICAL :: western_side, eastern_side,northern_side,southern_side 
    56  
    57       IF (before) THEN          
     66      IF( before ) THEN          
    5867         ptab(i1:i2,j1:j2,k1:k2,n1:n2) = trn(i1:i2,j1:j2,k1:k2,n1:n2) 
    5968      ELSE 
    6069         ! 
    61          western_side  = (nb == 1).AND.(ndir == 1) 
    62          eastern_side  = (nb == 1).AND.(ndir == 2) 
    63          southern_side = (nb == 2).AND.(ndir == 1) 
    64          northern_side = (nb == 2).AND.(ndir == 2) 
    65          ! 
    66          zrhox = Agrif_Rhox() 
    67          !  
    68          zalpha1 = ( zrhox - 1. ) * 0.5 
    69          zalpha2 = 1. - zalpha1 
    70          !  
    71          zalpha3 = ( zrhox - 1. ) / ( zrhox + 1. ) 
    72          zalpha4 = 1. - zalpha3 
    73          !  
    74          zalpha6 = 2. * ( zrhox - 1. ) / ( zrhox + 1. ) 
    75          zalpha7 =    - ( zrhox - 1. ) / ( zrhox + 3. ) 
    76          zalpha5 = 1. - zalpha6 - zalpha7 
    77          ! 
    78          imin = i1 
    79          imax = i2 
    80          jmin = j1 
    81          jmax = j2 
    82          !  
    83          ! Remove CORNERS 
    84          IF((nbondj == -1).OR.(nbondj == 2)) jmin = 3 
    85          IF((nbondj == +1).OR.(nbondj == 2)) jmax = nlcj-2 
    86          IF((nbondi == -1).OR.(nbondi == 2)) imin = 3 
    87          IF((nbondi == +1).OR.(nbondi == 2)) imax = nlci-2         
    88          ! 
    89          IF( eastern_side) THEN 
    90             DO jn = 1, jptra 
    91                tra(nlci,j1:j2,k1:k2,jn) = zalpha1 * ptab(nlci,j1:j2,k1:k2,jn) + zalpha2 * ptab(nlci-1,j1:j2,k1:k2,jn) 
    92                DO jk = 1, jpkm1 
    93                   DO jj = jmin,jmax 
    94                      IF( umask(nlci-2,jj,jk) == 0.e0 ) THEN 
    95                         tra(nlci-1,jj,jk,jn) = tra(nlci,jj,jk,jn) * tmask(nlci-1,jj,jk) 
    96                      ELSE 
    97                         tra(nlci-1,jj,jk,jn)=(zalpha4*tra(nlci,jj,jk,jn)+zalpha3*tra(nlci-2,jj,jk,jn))*tmask(nlci-1,jj,jk) 
    98                         IF( un(nlci-2,jj,jk) > 0.e0 ) THEN 
    99                            tra(nlci-1,jj,jk,jn)=( zalpha6*tra(nlci-2,jj,jk,jn)+zalpha5*tra(nlci,jj,jk,jn) &  
    100                                  + zalpha7*tra(nlci-3,jj,jk,jn) ) * tmask(nlci-1,jj,jk) 
     70         IF( nbghostcells > 1 ) THEN  ! no smoothing 
     71            tra(i1:i2,j1:j2,k1:k2,n1:n2) = ptab(i1:i2,j1:j2,k1:k2,n1:n2) 
     72         ELSE                         ! smoothing 
     73            ! 
     74            ll_west  = (nb == 1).AND.(ndir == 1)   ;   ll_east  = (nb == 1).AND.(ndir == 2) 
     75            ll_south = (nb == 2).AND.(ndir == 1)   ;   ll_north = (nb == 2).AND.(ndir == 2) 
     76            ! 
     77            zrhox = Agrif_Rhox() 
     78            z1 = ( zrhox - 1. ) * 0.5 
     79            z3 = ( zrhox - 1. ) / ( zrhox + 1. ) 
     80            z6 = 2. * ( zrhox - 1. ) / ( zrhox + 1. ) 
     81            z7 =    - ( zrhox - 1. ) / ( zrhox + 3. ) 
     82            ! 
     83            z2 = 1. - z1 
     84            z4 = 1. - z3 
     85            z5 = 1. - z6 - z7 
     86            ! 
     87            imin = i1   ;   imax = i2 
     88            jmin = j1   ;   jmax = j2 
     89            !  
     90            ! Remove CORNERS 
     91            IF((nbondj == -1).OR.(nbondj == 2))   jmin = 3 
     92            IF((nbondj == +1).OR.(nbondj == 2))   jmax = nlcj-2 
     93            IF((nbondi == -1).OR.(nbondi == 2))   imin = 3 
     94            IF((nbondi == +1).OR.(nbondi == 2))   imax = nlci-2         
     95            ! 
     96            IF( ll_east ) THEN       !== eastern side  ==! 
     97               DO jn = 1, jptra 
     98                  tra(nlci,j1:j2,k1:k2,jn) = z1 * ptab(nlci,j1:j2,k1:k2,jn) + z2 * ptab(nlci-1,j1:j2,k1:k2,jn) 
     99                  DO jk = 1, jpkm1 
     100                     DO jj = jmin,jmax 
     101                        IF( umask(nlci-2,jj,jk) == 0._wp ) THEN 
     102                           tra(nlci-1,jj,jk,jn) = tra(nlci,jj,jk,jn) * tmask(nlci-1,jj,jk) 
     103                        ELSE 
     104                           tra(nlci-1,jj,jk,jn) = ( z4*tra(nlci,jj,jk,jn)+z3*tra(nlci-2,jj,jk,jn) ) * tmask(nlci-1,jj,jk) 
     105                           IF( un(nlci-2,jj,jk) > 0._wp ) THEN 
     106                              tra(nlci-1,jj,jk,jn) = ( z6*tra(nlci-2,jj,jk,jn)+z5*tra(nlci,jj,jk,jn)   &  
     107                                 &                    +z7*tra(nlci-3,jj,jk,jn) ) * tmask(nlci-1,jj,jk) 
     108                           ENDIF 
    101109                        ENDIF 
    102                      ENDIF 
     110                     END DO 
     111                  END DO 
     112               ENDDO 
     113            ENDIF 
     114            !  
     115            IF( ll_north ) THEN        !==  northern side  ==! 
     116               DO jn = 1, jptra 
     117                  tra(i1:i2,nlcj,k1:k2,jn) = z1 * ptab(i1:i2,nlcj,k1:k2,jn) + z2 * ptab(i1:i2,nlcj-1,k1:k2,jn) 
     118                  DO jk = 1, jpkm1 
     119                     DO ji = imin, imax 
     120                        IF( vmask(ji,nlcj-2,jk) == 0._wp ) THEN 
     121                           tra(ji,nlcj-1,jk,jn) = tra(ji,nlcj,jk,jn) * tmask(ji,nlcj-1,jk) 
     122                        ELSE 
     123                           tra(ji,nlcj-1,jk,jn) = ( z4*tra(ji,nlcj,jk,jn)+z3*tra(ji,nlcj-2,jk,jn) ) * tmask(ji,nlcj-1,jk)         
     124                           IF (vn(ji,nlcj-2,jk) > 0._wp ) THEN 
     125                              tra(ji,nlcj-1,jk,jn) = ( z6*tra(ji,nlcj-2,jk,jn)+z5*tra(ji,nlcj,jk,jn)  & 
     126                                 &                    +z7*tra(ji,nlcj-3,jk,jn) ) * tmask(ji,nlcj-1,jk) 
     127                           ENDIF 
     128                        ENDIF 
     129                     END DO 
    103130                  END DO 
    104131               END DO 
    105             ENDDO 
    106          ENDIF 
    107          !  
    108          IF( northern_side ) THEN             
    109             DO jn = 1, jptra 
    110                tra(i1:i2,nlcj,k1:k2,jn) = zalpha1 * ptab(i1:i2,nlcj,k1:k2,jn) + zalpha2 * ptab(i1:i2,nlcj-1,k1:k2,jn) 
    111                DO jk = 1, jpkm1 
    112                   DO ji = imin,imax 
    113                      IF( vmask(ji,nlcj-2,jk) == 0.e0 ) THEN 
    114                         tra(ji,nlcj-1,jk,jn) = tra(ji,nlcj,jk,jn) * tmask(ji,nlcj-1,jk) 
    115                      ELSE 
    116                         tra(ji,nlcj-1,jk,jn)=(zalpha4*tra(ji,nlcj,jk,jn)+zalpha3*tra(ji,nlcj-2,jk,jn))*tmask(ji,nlcj-1,jk)         
    117                         IF (vn(ji,nlcj-2,jk) > 0.e0 ) THEN 
    118                            tra(ji,nlcj-1,jk,jn)=( zalpha6*tra(ji,nlcj-2,jk,jn)+zalpha5*tra(ji,nlcj,jk,jn)  & 
    119                                  + zalpha7*tra(ji,nlcj-3,jk,jn) ) * tmask(ji,nlcj-1,jk) 
     132            ENDIF 
     133            ! 
     134            IF( ll_west ) THEN         !==  western side  ==!           
     135               DO jn = 1, jptra 
     136                  tra(1,j1:j2,k1:k2,jn) = z1 * ptab(1,j1:j2,k1:k2,jn) + z2 * ptab(2,j1:j2,k1:k2,jn) 
     137                  DO jk = 1, jpkm1 
     138                     DO jj = jmin,jmax 
     139                        IF( umask(2,jj,jk) == 0._wp ) THEN 
     140                           tra(2,jj,jk,jn) = tra(1,jj,jk,jn) * tmask(2,jj,jk) 
     141                        ELSE 
     142                           tra(2,jj,jk,jn) = ( z4*tra(1,jj,jk,jn)+z3*tra(3,jj,jk,jn) ) * tmask(2,jj,jk)         
     143                           IF( un(2,jj,jk) < 0._wp ) THEN 
     144                              tra(2,jj,jk,jn) = ( z6*tra(3,jj,jk,jn)+z5*tra(1,jj,jk,jn)+z7*tra(4,jj,jk,jn) ) * tmask(2,jj,jk) 
     145                           ENDIF 
    120146                        ENDIF 
    121                      ENDIF 
     147                     END DO 
    122148                  END DO 
    123149               END DO 
    124             ENDDO 
    125          ENDIF 
    126          ! 
    127          IF( western_side) THEN             
    128             DO jn = 1, jptra 
    129                tra(1,j1:j2,k1:k2,jn) = zalpha1 * ptab(1,j1:j2,k1:k2,jn) + zalpha2 * ptab(2,j1:j2,k1:k2,jn) 
    130                DO jk = 1, jpkm1 
    131                   DO jj = jmin,jmax 
    132                      IF( umask(2,jj,jk) == 0.e0 ) THEN 
    133                         tra(2,jj,jk,jn) = tra(1,jj,jk,jn) * tmask(2,jj,jk) 
    134                      ELSE 
    135                         tra(2,jj,jk,jn)=(zalpha4*tra(1,jj,jk,jn)+zalpha3*tra(3,jj,jk,jn))*tmask(2,jj,jk)         
    136                         IF( un(2,jj,jk) < 0.e0 ) THEN 
    137                            tra(2,jj,jk,jn)=(zalpha6*tra(3,jj,jk,jn)+zalpha5*tra(1,jj,jk,jn)+zalpha7*tra(4,jj,jk,jn))*tmask(2,jj,jk) 
     150            ENDIF 
     151            ! 
     152            IF( ll_south ) THEN        !==  southern side  ==! 
     153               DO jn = 1, jptra 
     154                  tra(i1:i2,1,k1:k2,jn) = z1 * ptab(i1:i2,1,k1:k2,jn) + z2 * ptab(i1:i2,2,k1:k2,jn) 
     155                  DO jk = 1, jpk       
     156                     DO ji = imin, imax 
     157                        IF( vmask(ji,2,jk) == 0._wp ) THEN 
     158                           tra(ji,2,jk,jn) = tra(ji,1,jk,jn) * tmask(ji,2,jk) 
     159                        ELSE 
     160                           tra(ji,2,jk,jn) = ( z4*tra(ji,1,jk,jn)+z3*tra(ji,3,jk,jn) ) * tmask(ji,2,jk) 
     161                           IF( vn(ji,2,jk) < 0._wp ) THEN 
     162                              tra(ji,2,jk,jn) = ( z6*tra(ji,3,jk,jn)+z5*tra(ji,1,jk,jn)+z7*tra(ji,4,jk,jn) ) * tmask(ji,2,jk) 
     163                           ENDIF 
    138164                        ENDIF 
    139                      ENDIF 
     165                     END DO 
    140166                  END DO 
    141167               END DO 
    142             END DO 
     168            ENDIF 
     169            ! 
     170            ! Treatment of corners 
     171            IF( ll_east .AND.((nbondj == -1).OR.(nbondj == 2)) )   tra(nlci-1,   2  ,:,:) = ptab(nlci-1,   2  ,:,:)   ! East south 
     172            IF( ll_east .AND.((nbondj ==  1).OR.(nbondj == 2)) )   tra(nlci-1,nlcj-1,:,:) = ptab(nlci-1,nlcj-1,:,:)   ! East north 
     173            IF( ll_west .AND.((nbondj == -1).OR.(nbondj == 2)) )   tra(   2  ,   2  ,:,:) = ptab(   2  ,   2  ,:,:)   ! West south 
     174            IF( ll_west .AND.((nbondj ==  1).OR.(nbondj == 2)) )   tra(   2  ,nlcj-1,:,:) = ptab(   2  ,nlcj-1,:,:)   ! West north 
     175            ! 
    143176         ENDIF 
    144          ! 
    145          IF( southern_side ) THEN            
    146             DO jn = 1, jptra 
    147                tra(i1:i2,1,k1:k2,jn) = zalpha1 * ptab(i1:i2,1,k1:k2,jn) + zalpha2 * ptab(i1:i2,2,k1:k2,jn) 
    148                DO jk=1,jpk       
    149                   DO ji=imin,imax 
    150                      IF( vmask(ji,2,jk) == 0.e0 ) THEN 
    151                         tra(ji,2,jk,jn)=tra(ji,1,jk,jn) * tmask(ji,2,jk) 
    152                      ELSE 
    153                         tra(ji,2,jk,jn)=(zalpha4*tra(ji,1,jk,jn)+zalpha3*tra(ji,3,jk,jn))*tmask(ji,2,jk) 
    154                         IF( vn(ji,2,jk) < 0.e0 ) THEN 
    155                            tra(ji,2,jk,jn)=(zalpha6*tra(ji,3,jk,jn)+zalpha5*tra(ji,1,jk,jn)+zalpha7*tra(ji,4,jk,jn))*tmask(ji,2,jk) 
    156                         ENDIF 
    157                      ENDIF 
    158                   END DO 
    159                END DO 
    160             ENDDO 
    161          ENDIF 
    162          ! 
    163          ! Treatment of corners 
    164          !  
    165          ! East south 
    166          IF ((eastern_side).AND.((nbondj == -1).OR.(nbondj == 2))) THEN 
    167             tra(nlci-1,2,:,:) = ptab(nlci-1,2,:,:) 
    168          ENDIF 
    169          ! East north 
    170          IF ((eastern_side).AND.((nbondj == 1).OR.(nbondj == 2))) THEN 
    171             tra(nlci-1,nlcj-1,:,:) = ptab(nlci-1,nlcj-1,:,:) 
    172          ENDIF 
    173          ! West south 
    174          IF ((western_side).AND.((nbondj == -1).OR.(nbondj == 2))) THEN 
    175             tra(2,2,:,:) = ptab(2,2,:,:) 
    176          ENDIF 
    177          ! West north 
    178          IF ((western_side).AND.((nbondj == 1).OR.(nbondj == 2))) THEN 
    179             tra(2,nlcj-1,:,:) = ptab(2,nlcj-1,:,:) 
    180          ENDIF 
    181          ! 
    182177      ENDIF 
    183178      ! 
     
    185180 
    186181#else 
     182   !!---------------------------------------------------------------------- 
     183   !!   Empty module                                           no TOP AGRIF 
     184   !!---------------------------------------------------------------------- 
    187185CONTAINS 
    188186   SUBROUTINE Agrif_TOP_Interp_empty 
     
    193191   END SUBROUTINE Agrif_TOP_Interp_empty 
    194192#endif 
     193 
     194   !!====================================================================== 
    195195END MODULE agrif_top_interp 
  • branches/2017/dev_CNRS_2017/NEMOGCM/NEMO/NST_SRC/agrif_top_sponge.F90

    r6140 r8882  
    44   !!====================================================================== 
    55   !!                ***  MODULE agrif_top_sponge  *** 
    6    !! AGRIF :   define in memory AGRIF variables for sea-ice 
     6   !! AGRIF :   sponge layer pakage for passive tracers (TOP) 
    77   !!====================================================================== 
    88   !! History :  2.0  ! 2006-08  (R. Benshila, L. Debreu)  Original code 
    99   !!---------------------------------------------------------------------- 
    10  
     10#if defined key_agrif && defined key_top 
    1111   !!---------------------------------------------------------------------- 
    1212   !!   Agrif_Sponge_trc :  
    1313   !!   interptrn_sponge :   
    1414   !!---------------------------------------------------------------------- 
    15 #if defined key_agrif && defined key_top 
    1615   USE par_oce 
    1716   USE par_trc 
     
    2423   USE in_out_manager 
    2524   USE lib_mpp 
    26    USE wrk_nemo   
    2725 
    2826   IMPLICIT NONE 
     
    3230 
    3331   !!---------------------------------------------------------------------- 
    34    !! NEMO/NST 3.7 , NEMO Consortium (2015) 
     32   !! NEMO/NST 4.0 , NEMO Consortium (2017) 
    3533   !! $Id$ 
    3634   !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) 
     
    4240      !!                   *** ROUTINE Agrif_Sponge_Trc *** 
    4341      !!---------------------------------------------------------------------- 
    44       REAL(wp) ::   timecoeff 
     42      REAL(wp) ::   zcoef   ! local scalar 
    4543      !!---------------------------------------------------------------------- 
    4644      ! 
    4745#if defined SPONGE_TOP 
    48       timecoeff = REAL( Agrif_NbStepint(), wp ) / Agrif_rhot() 
     46      zcoef = REAL( Agrif_NbStepint(), wp ) / Agrif_rhot() 
    4947      CALL Agrif_sponge 
    5048      Agrif_SpecialValue    = 0._wp 
    5149      Agrif_UseSpecialValue = .TRUE. 
    5250      tabspongedone_trn     = .FALSE. 
    53       CALL Agrif_Bc_Variable( trn_sponge_id, calledweight=timecoeff, procname=interptrn_sponge ) 
     51      CALL Agrif_Bc_Variable( trn_sponge_id, calledweight=zcoef, procname=interptrn_sponge ) 
    5452      Agrif_UseSpecialValue = .FALSE. 
    5553#endif 
     
    107105 
    108106#else 
    109  
     107   !!---------------------------------------------------------------------- 
     108   !!   Empty module                                           no TOP AGRIF 
     109   !!---------------------------------------------------------------------- 
    110110CONTAINS 
    111111   SUBROUTINE agrif_top_sponge_empty 
  • branches/2017/dev_CNRS_2017/NEMOGCM/NEMO/NST_SRC/agrif_top_update.F90

    r6140 r8882  
    55   !!====================================================================== 
    66   !!                ***  MODULE agrif_top_update  *** 
    7    !! AGRIF :    
    8    !!---------------------------------------------------------------------- 
     7   !! AGRIF :   update package for passive tracers (TOP)  
     8   !!====================================================================== 
    99   !! History :   
    1010   !!---------------------------------------------------------------------- 
    11  
    1211#if defined key_agrif && defined key_top 
     12   !!---------------------------------------------------------------------- 
     13   !!   'key_agrif'                                              AGRIF zoom 
     14   !!   'key_TOP'                                           on-line tracers 
     15   !!---------------------------------------------------------------------- 
    1316   USE par_oce 
    1417   USE oce 
     18   USE dom_oce 
     19   USE agrif_oce 
    1520   USE par_trc 
    1621   USE trc 
    17    USE dom_oce 
    18    USE agrif_oce 
    19    USE wrk_nemo   
    2022 
    2123   IMPLICIT NONE 
     
    2729 
    2830   !!---------------------------------------------------------------------- 
    29    !! NEMO/NST 3.7 , NEMO Consortium (2015) 
     31   !! NEMO/NST 4.0 , NEMO Consortium (2017) 
    3032   !! $Id$ 
    3133   !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) 
     
    112114 
    113115#else 
     116   !!---------------------------------------------------------------------- 
     117   !!   Empty module                                           no TOP AGRIF 
     118   !!---------------------------------------------------------------------- 
    114119CONTAINS 
    115120   SUBROUTINE agrif_top_update_empty 
    116       !!--------------------------------------------- 
    117       !!   *** ROUTINE agrif_Top_update_empty *** 
    118       !!--------------------------------------------- 
    119121      WRITE(*,*)  'agrif_top_update : You should not have seen this print! error?' 
    120122   END SUBROUTINE agrif_top_update_empty 
  • branches/2017/dev_CNRS_2017/NEMOGCM/NEMO/NST_SRC/agrif_user.F90

    r7761 r8882  
    11#if defined key_agrif 
    22!!---------------------------------------------------------------------- 
    3 !! NEMO/NST 3.7 , NEMO Consortium (2016) 
     3!! NEMO/NST 4.0 , NEMO Consortium (2017) 
    44!! $Id$ 
    55!! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) 
     
    105105   USE agrif_opa_interp 
    106106   USE agrif_opa_sponge 
    107    !! 
     107   ! 
    108108   IMPLICIT NONE 
    109109   !!---------------------------------------------------------------------- 
     
    125125   USE par_oce        
    126126   USE oce 
    127    !! 
    128    IMPLICIT NONE 
     127   ! 
     128   IMPLICIT NONE 
     129   ! 
     130   INTEGER :: ind1, ind2, ind3 
    129131   !!---------------------------------------------------------------------- 
    130132 
    131133   ! 1. Declaration of the type of variable which have to be interpolated 
    132134   !--------------------------------------------------------------------- 
    133    CALL agrif_declare_variable((/1,2/),(/2,3/),(/'x','y'/),(/1,1/),(/nlci,nlcj/),e1u_id) 
    134    CALL agrif_declare_variable((/2,1/),(/3,2/),(/'x','y'/),(/1,1/),(/nlci,nlcj/),e2v_id) 
     135   ind1 =     nbghostcells 
     136   ind2 = 1 + nbghostcells 
     137   ind3 = 2 + nbghostcells 
     138   CALL agrif_declare_variable((/1,2/),(/ind2,ind3/),(/'x','y'/),(/1,1/),(/nlci,nlcj/),e1u_id) 
     139   CALL agrif_declare_variable((/2,1/),(/ind3,ind2/),(/'x','y'/),(/1,1/),(/nlci,nlcj/),e2v_id) 
    135140 
    136141   ! 2. Type of interpolation 
    137142   !------------------------- 
    138    CALL Agrif_Set_bcinterp(e1u_id,interp1=Agrif_linear,interp2=AGRIF_ppm) 
    139    CALL Agrif_Set_bcinterp(e2v_id,interp1=AGRIF_ppm,interp2=Agrif_linear) 
     143   CALL Agrif_Set_bcinterp( e1u_id, interp1=Agrif_linear, interp2=AGRIF_ppm    ) 
     144   CALL Agrif_Set_bcinterp( e2v_id, interp1=AGRIF_ppm   , interp2=Agrif_linear ) 
    140145 
    141146   ! 3. Location of interpolation 
    142147   !----------------------------- 
    143    CALL Agrif_Set_bc(e1u_id,(/0,0/)) 
    144    CALL Agrif_Set_bc(e2v_id,(/0,0/)) 
     148   CALL Agrif_Set_bc(e1u_id,(/0,ind1-1/)) 
     149   CALL Agrif_Set_bc(e2v_id,(/0,ind1-1/)) 
    145150 
    146151   ! 5. Update type 
    147152   !---------------  
    148    CALL Agrif_Set_Updatetype(e1u_id,update1 = Agrif_Update_Copy, update2=Agrif_Update_Average) 
    149    CALL Agrif_Set_Updatetype(e2v_id,update1 = Agrif_Update_Average, update2=Agrif_Update_Copy) 
     153   CALL Agrif_Set_Updatetype( e1u_id, update1=Agrif_Update_Copy   , update2=Agrif_Update_Average ) 
     154   CALL Agrif_Set_Updatetype( e2v_id, update1=Agrif_Update_Average, update2=Agrif_Update_Copy    ) 
    150155 
    151156! High order updates 
    152 !   CALL Agrif_Set_Updatetype(e1u_id,update1 = Agrif_Update_Average,            update2=Agrif_Update_Full_Weighting) 
    153 !   CALL Agrif_Set_Updatetype(e2v_id,update1 = Agrif_Update_Full_Weighting,     update2=Agrif_Update_Average) 
     157!   CALL Agrif_Set_Updatetype( e1u_id, update1=Agrif_Update_Average       , update2=Agrif_Update_Full_Weighting ) 
     158!   CALL Agrif_Set_Updatetype( e2v_id, update1=Agrif_Update_Full_Weighting, update2=Agrif_Update_Average        ) 
    154159    ! 
    155160END SUBROUTINE agrif_declare_var_dom 
     
    162167   !! ** Purpose ::   Declaration of variables to be interpolated 
    163168   !!---------------------------------------------------------------------- 
     169   USE agrif_opa_update 
     170   USE agrif_opa_interp 
     171   USE agrif_opa_sponge 
    164172   USE Agrif_Util 
    165173   USE oce  
    166174   USE dom_oce 
     175   USE zdf_oce 
    167176   USE nemogcm 
     177   ! 
    168178   USE lib_mpp 
    169179   USE in_out_manager 
    170    USE agrif_opa_update 
    171    USE agrif_opa_interp 
    172    USE agrif_opa_sponge 
    173    !! 
     180   ! 
    174181   IMPLICIT NONE 
    175182   ! 
     
    184191   ! 2. First interpolations of potentially non zero fields 
    185192   !------------------------------------------------------- 
    186    Agrif_SpecialValue=0. 
     193   Agrif_SpecialValue    = 0._wp 
    187194   Agrif_UseSpecialValue = .TRUE. 
    188195   CALL Agrif_Bc_variable(tsn_id,calledweight=1.,procname=interptsn) 
     
    319326   ENDIF 
    320327   ! 
    321 # if defined key_zdftke 
    322    CALL Agrif_Update_tke(0) 
    323 # endif 
    324    ! 
    325328   Agrif_UseSpecialValueInUpdate = .FALSE. 
    326329   nbcline = 0 
     
    337340   !!---------------------------------------------------------------------- 
    338341   USE agrif_util 
    339    USE par_oce       !   ONLY : jpts 
     342   USE agrif_oce 
     343   USE par_oce       ! ocean parameters 
     344   USE zdf_oce       ! vertical physics 
    340345   USE oce 
    341    USE agrif_oce 
    342    !! 
    343    IMPLICIT NONE 
     346   ! 
     347   IMPLICIT NONE 
     348   ! 
     349   INTEGER :: ind1, ind2, ind3 
    344350   !!---------------------------------------------------------------------- 
    345351 
    346352   ! 1. Declaration of the type of variable which have to be interpolated 
    347353   !--------------------------------------------------------------------- 
    348    CALL agrif_declare_variable((/2,2,0,0/),(/3,3,0,0/),(/'x','y','N','N'/),(/1,1,1,1/),(/nlci,nlcj,jpk,jpts/),tsn_id) 
    349    CALL agrif_declare_variable((/2,2,0,0/),(/3,3,0,0/),(/'x','y','N','N'/),(/1,1,1,1/),(/nlci,nlcj,jpk,jpts/),tsn_sponge_id) 
    350  
    351    CALL agrif_declare_variable((/1,2,0/),(/2,3,0/),(/'x','y','N'/),(/1,1,1/),(/nlci,nlcj,jpk/),un_interp_id) 
    352    CALL agrif_declare_variable((/2,1,0/),(/3,2,0/),(/'x','y','N'/),(/1,1,1/),(/nlci,nlcj,jpk/),vn_interp_id) 
    353    CALL agrif_declare_variable((/1,2,0/),(/2,3,0/),(/'x','y','N'/),(/1,1,1/),(/nlci,nlcj,jpk/),un_update_id) 
    354    CALL agrif_declare_variable((/2,1,0/),(/3,2,0/),(/'x','y','N'/),(/1,1,1/),(/nlci,nlcj,jpk/),vn_update_id) 
    355    CALL agrif_declare_variable((/1,2,0/),(/2,3,0/),(/'x','y','N'/),(/1,1,1/),(/nlci,nlcj,jpk/),un_sponge_id) 
    356    CALL agrif_declare_variable((/2,1,0/),(/3,2,0/),(/'x','y','N'/),(/1,1,1/),(/nlci,nlcj,jpk/),vn_sponge_id) 
    357  
    358    CALL agrif_declare_variable((/2,2,0/),(/3,3,0/),(/'x','y','N'/),(/1,1,1/),(/nlci,nlcj,jpk/),e3t_id) 
    359    CALL agrif_declare_variable((/1,2,0/),(/2,3,0/),(/'x','y','N'/),(/1,1,1/),(/nlci,nlcj,jpk/),umsk_id) 
    360    CALL agrif_declare_variable((/2,1,0/),(/3,2,0/),(/'x','y','N'/),(/1,1,1/),(/nlci,nlcj,jpk/),vmsk_id) 
    361  
    362    CALL agrif_declare_variable((/2,2,0,0/),(/3,3,0,0/),(/'x','y','N','N'/),(/1,1,1,1/),(/nlci,nlcj,jpk,3/),scales_t_id) 
    363  
    364    CALL agrif_declare_variable((/1,2/),(/2,3/),(/'x','y'/),(/1,1/),(/nlci,nlcj/),unb_id) 
    365    CALL agrif_declare_variable((/2,1/),(/3,2/),(/'x','y'/),(/1,1/),(/nlci,nlcj/),vnb_id) 
    366    CALL agrif_declare_variable((/1,2/),(/2,3/),(/'x','y'/),(/1,1/),(/nlci,nlcj/),ub2b_interp_id) 
    367    CALL agrif_declare_variable((/2,1/),(/3,2/),(/'x','y'/),(/1,1/),(/nlci,nlcj/),vb2b_interp_id) 
    368    CALL agrif_declare_variable((/1,2/),(/2,3/),(/'x','y'/),(/1,1/),(/nlci,nlcj/),ub2b_update_id) 
    369    CALL agrif_declare_variable((/2,1/),(/3,2/),(/'x','y'/),(/1,1/),(/nlci,nlcj/),vb2b_update_id) 
    370  
    371    CALL agrif_declare_variable((/2,2/),(/3,3/),(/'x','y'/),(/1,1/),(/nlci,nlcj/),sshn_id) 
    372  
    373 # if defined key_zdftke 
    374    CALL agrif_declare_variable((/2,2,0/),(/3,3,0/),(/'x','y','N'/),(/1,1,1/),(/jpi,jpj,jpk/), en_id) 
    375    CALL agrif_declare_variable((/2,2,0/),(/3,3,0/),(/'x','y','N'/),(/1,1,1/),(/jpi,jpj,jpk/),avt_id) 
    376    CALL agrif_declare_variable((/2,2,0/),(/3,3,0/),(/'x','y','N'/),(/1,1,1/),(/jpi,jpj,jpk/),avm_id) 
    377 # endif 
     354   ind1 =     nbghostcells 
     355   ind2 = 1 + nbghostcells 
     356   ind3 = 2 + nbghostcells 
     357   CALL agrif_declare_variable((/2,2,0,0/),(/ind3,ind3,0,0/),(/'x','y','N','N'/),(/1,1,1,1/),(/nlci,nlcj,jpk,jpts/),tsn_id) 
     358   CALL agrif_declare_variable((/2,2,0,0/),(/ind3,ind3,0,0/),(/'x','y','N','N'/),(/1,1,1,1/),(/nlci,nlcj,jpk,jpts/),tsn_sponge_id) 
     359 
     360   CALL agrif_declare_variable((/1,2,0/),(/ind2,ind3,0/),(/'x','y','N'/),(/1,1,1/),(/nlci,nlcj,jpk/),un_interp_id) 
     361   CALL agrif_declare_variable((/2,1,0/),(/ind3,ind2,0/),(/'x','y','N'/),(/1,1,1/),(/nlci,nlcj,jpk/),vn_interp_id) 
     362   CALL agrif_declare_variable((/1,2,0/),(/ind2,ind3,0/),(/'x','y','N'/),(/1,1,1/),(/nlci,nlcj,jpk/),un_update_id) 
     363   CALL agrif_declare_variable((/2,1,0/),(/ind3,ind2,0/),(/'x','y','N'/),(/1,1,1/),(/nlci,nlcj,jpk/),vn_update_id) 
     364   CALL agrif_declare_variable((/1,2,0/),(/ind2,ind3,0/),(/'x','y','N'/),(/1,1,1/),(/nlci,nlcj,jpk/),un_sponge_id) 
     365   CALL agrif_declare_variable((/2,1,0/),(/ind3,ind2,0/),(/'x','y','N'/),(/1,1,1/),(/nlci,nlcj,jpk/),vn_sponge_id) 
     366 
     367   CALL agrif_declare_variable((/2,2,0/),(/ind3,ind3,0/),(/'x','y','N'/),(/1,1,1/),(/nlci,nlcj,jpk/),e3t_id) 
     368   CALL agrif_declare_variable((/1,2,0/),(/ind2,ind3,0/),(/'x','y','N'/),(/1,1,1/),(/nlci,nlcj,jpk/),umsk_id) 
     369   CALL agrif_declare_variable((/2,1,0/),(/ind3,ind2,0/),(/'x','y','N'/),(/1,1,1/),(/nlci,nlcj,jpk/),vmsk_id) 
     370 
     371   CALL agrif_declare_variable((/2,2,0,0/),(/ind3,ind3,0,0/),(/'x','y','N','N'/),(/1,1,1,1/),(/nlci,nlcj,jpk,3/),scales_t_id) 
     372 
     373   CALL agrif_declare_variable((/1,2/),(/ind2,ind3/),(/'x','y'/),(/1,1/),(/nlci,nlcj/),unb_id) 
     374   CALL agrif_declare_variable((/2,1/),(/ind3,ind2/),(/'x','y'/),(/1,1/),(/nlci,nlcj/),vnb_id) 
     375   CALL agrif_declare_variable((/1,2/),(/ind2,ind3/),(/'x','y'/),(/1,1/),(/nlci,nlcj/),ub2b_interp_id) 
     376   CALL agrif_declare_variable((/2,1/),(/ind3,ind2/),(/'x','y'/),(/1,1/),(/nlci,nlcj/),vb2b_interp_id) 
     377   CALL agrif_declare_variable((/1,2/),(/ind2,ind3/),(/'x','y'/),(/1,1/),(/nlci,nlcj/),ub2b_update_id) 
     378   CALL agrif_declare_variable((/2,1/),(/ind3,ind2/),(/'x','y'/),(/1,1/),(/nlci,nlcj/),vb2b_update_id) 
     379 
     380   CALL agrif_declare_variable((/2,2/),(/ind3,ind3/),(/'x','y'/),(/1,1/),(/nlci,nlcj/),sshn_id) 
     381 
     382   IF( ln_zdftke ) THEN 
     383      CALL agrif_declare_variable((/2,2,0/),(/ind3,ind3,0/),(/'x','y','N'/),(/1,1,1/),(/jpi,jpj,jpk/), en_id) 
     384      CALL agrif_declare_variable((/2,2,0/),(/ind3,ind3,0/),(/'x','y','N'/),(/1,1,1/),(/jpi,jpj,jpk/),avt_id) 
     385      CALL agrif_declare_variable((/2,2,0/),(/ind3,ind3,0/),(/'x','y','N'/),(/1,1,1/),(/jpi,jpj,jpk/),avm_id) 
     386   ENDIF 
    378387 
    379388   ! 2. Type of interpolation 
     
    400409   CALL Agrif_Set_bcinterp(vmsk_id,interp=AGRIF_constant) 
    401410 
    402 # if defined key_zdftke 
    403    CALL Agrif_Set_bcinterp(avm_id ,interp=AGRIF_linear) 
    404 # endif 
    405  
     411   IF( ln_zdftke )   CALL Agrif_Set_bcinterp( avm_id, interp=AGRIF_linear ) 
    406412 
    407413   ! 3. Location of interpolation 
    408414   !----------------------------- 
    409    CALL Agrif_Set_bc(tsn_id,(/0,1/)) 
    410    CALL Agrif_Set_bc(un_interp_id,(/0,1/)) 
    411    CALL Agrif_Set_bc(vn_interp_id,(/0,1/)) 
    412  
    413 !   CALL Agrif_Set_bc(tsn_sponge_id,(/-3*Agrif_irhox(),0/)) 
    414 !   CALL Agrif_Set_bc(un_sponge_id,(/-2*Agrif_irhox()-1,0/)) 
    415 !   CALL Agrif_Set_bc(vn_sponge_id,(/-2*Agrif_irhox()-1,0/)) 
    416    CALL Agrif_Set_bc(tsn_sponge_id,(/-nn_sponge_len*Agrif_irhox()-1,0/)) 
    417    CALL Agrif_Set_bc(un_sponge_id ,(/-nn_sponge_len*Agrif_irhox()-1,0/)) 
    418    CALL Agrif_Set_bc(vn_sponge_id ,(/-nn_sponge_len*Agrif_irhox()-1,0/)) 
    419  
    420    CALL Agrif_Set_bc(sshn_id,(/0,0/)) 
    421    CALL Agrif_Set_bc(unb_id ,(/0,0/)) 
    422    CALL Agrif_Set_bc(vnb_id ,(/0,0/)) 
    423    CALL Agrif_Set_bc(ub2b_interp_id,(/0,0/)) 
    424    CALL Agrif_Set_bc(vb2b_interp_id,(/0,0/)) 
    425  
    426    CALL Agrif_Set_bc(e3t_id,(/-2*Agrif_irhox()-1,0/))   ! if west and rhox=3: column 2 to 9 
    427    CALL Agrif_Set_bc(umsk_id,(/0,0/)) 
    428    CALL Agrif_Set_bc(vmsk_id,(/0,0/)) 
    429  
    430 # if defined key_zdftke 
    431    CALL Agrif_Set_bc(avm_id ,(/0,1/)) 
    432 # endif 
     415   CALL Agrif_Set_bc(       tsn_id, (/0,ind1/) ) 
     416   CALL Agrif_Set_bc( un_interp_id, (/0,ind1/) ) 
     417   CALL Agrif_Set_bc( vn_interp_id, (/0,ind1/) ) 
     418 
     419   CALL Agrif_Set_bc( tsn_sponge_id, (/-nn_sponge_len*Agrif_irhox()-1,0/) )  ! if west and rhox=3 and sponge=2 and ghost=1: columns 2 to 9  
     420   CALL Agrif_Set_bc(  un_sponge_id, (/-nn_sponge_len*Agrif_irhox()-1,0/) ) 
     421   CALL Agrif_Set_bc(  vn_sponge_id, (/-nn_sponge_len*Agrif_irhox()-1,0/) ) 
     422 
     423   CALL Agrif_Set_bc(        sshn_id, (/0,ind1-1/) ) 
     424   CALL Agrif_Set_bc(         unb_id, (/0,ind1-1/) ) 
     425   CALL Agrif_Set_bc(         vnb_id, (/0,ind1-1/) ) 
     426   CALL Agrif_Set_bc( ub2b_interp_id, (/0,ind1-1/) ) 
     427   CALL Agrif_Set_bc( vb2b_interp_id, (/0,ind1-1/) ) 
     428 
     429   CALL Agrif_Set_bc(  e3t_id, (/-2*Agrif_irhox()-1,ind1-1/) )   ! if west and rhox=3 and ghost=1: column 2 to 9 
     430   CALL Agrif_Set_bc( umsk_id, (/0,ind1-1/)                  ) 
     431   CALL Agrif_Set_bc( vmsk_id, (/0,ind1-1/)                  ) 
     432 
     433   IF( ln_zdftke )   CALL Agrif_Set_bc( avm_id, (/0,ind1/) ) 
    433434 
    434435   ! 5. Update type 
     
    446447   CALL Agrif_Set_Updatetype(vb2b_update_id,update1 = Agrif_Update_Average, update2 = Agrif_Update_Copy) 
    447448 
    448 # if defined key_zdftke 
    449    CALL Agrif_Set_Updatetype( en_id, update = AGRIF_Update_Average) 
    450    CALL Agrif_Set_Updatetype(avt_id, update = AGRIF_Update_Average) 
    451    CALL Agrif_Set_Updatetype(avm_id, update = AGRIF_Update_Average) 
    452 # endif 
     449   IF( ln_zdftke) THEN 
     450      CALL Agrif_Set_Updatetype( en_id, update = AGRIF_Update_Average) 
     451      CALL Agrif_Set_Updatetype(avt_id, update = AGRIF_Update_Average) 
     452      CALL Agrif_Set_Updatetype(avm_id, update = AGRIF_Update_Average) 
     453   ENDIF 
    453454 
    454455! High order updates 
     
    463464   ! 
    464465END SUBROUTINE agrif_declare_var 
    465  
    466 #  if defined key_lim2 
    467 SUBROUTINE Agrif_InitValues_cont_lim2 
    468    !!---------------------------------------------------------------------- 
    469    !!                 *** ROUTINE Agrif_InitValues_cont_lim2 *** 
    470    !! 
    471    !! ** Purpose :: Initialisation of variables to be interpolated for LIM2 
    472    !!---------------------------------------------------------------------- 
    473    USE Agrif_Util 
    474    USE ice_2 
    475    USE agrif_ice 
    476    USE in_out_manager 
    477    USE agrif_lim2_update 
    478    USE agrif_lim2_interp 
    479    USE lib_mpp 
    480    !! 
    481    IMPLICIT NONE 
    482    !!---------------------------------------------------------------------- 
    483  
    484    ! 1. Declaration of the type of variable which have to be interpolated 
    485    !--------------------------------------------------------------------- 
    486    CALL agrif_declare_var_lim2 
    487  
    488    ! 2. First interpolations of potentially non zero fields 
    489    !------------------------------------------------------- 
    490    Agrif_SpecialValue=-9999. 
    491    Agrif_UseSpecialValue = .TRUE. 
    492    !     Call Agrif_Bc_variable(zadv ,adv_ice_id ,calledweight=1.,procname=interp_adv_ice ) 
    493    !     Call Agrif_Bc_variable(zvel ,u_ice_id   ,calledweight=1.,procname=interp_u_ice   ) 
    494    !     Call Agrif_Bc_variable(zvel ,v_ice_id   ,calledweight=1.,procname=interp_v_ice   ) 
    495    Agrif_SpecialValue=0. 
    496    Agrif_UseSpecialValue = .FALSE. 
    497  
    498    ! 3. Some controls 
    499    !----------------- 
    500  
    501 #   if ! defined key_lim2_vp 
    502    lim_nbstep = 1. 
    503    CALL agrif_rhg_lim2_load 
    504    CALL agrif_trp_lim2_load 
    505    lim_nbstep = 0. 
    506 #   endif 
    507    !RB mandatory but why ??? 
    508    !      IF( nbclineupdate /= nn_fsbc .AND. nn_ice == 2 )THEN 
    509    !         CALL ctl_warn ('With ice model on child grid, nbclineupdate is set to nn_fsbc') 
    510    !         nbclineupdate = nn_fsbc 
    511    !       ENDIF 
    512    CALL Agrif_Update_lim2(0) 
    513    ! 
    514 END SUBROUTINE Agrif_InitValues_cont_lim2 
    515  
    516  
    517 SUBROUTINE agrif_declare_var_lim2 
    518    !!---------------------------------------------------------------------- 
    519    !!                 *** ROUTINE agrif_declare_var_lim2 *** 
    520    !! 
    521    !! ** Purpose :: Declaration of variables to be interpolated for LIM2 
    522    !!---------------------------------------------------------------------- 
    523    USE agrif_util 
    524    USE ice_2 
    525    !! 
    526    IMPLICIT NONE 
    527    !!---------------------------------------------------------------------- 
    528  
    529    ! 1. Declaration of the type of variable which have to be interpolated 
    530    !--------------------------------------------------------------------- 
    531    CALL agrif_declare_variable((/2,2,0/),(/3,3,0/),(/'x','y','N'/),(/1,1,1/),(/jpi,jpj, 7/),adv_ice_id ) 
    532 #   if defined key_lim2_vp 
    533    CALL agrif_declare_variable((/1,1/),(/3,3/),(/'x','y'/),(/1,1/),(/jpi,jpj/),u_ice_id) 
    534    CALL agrif_declare_variable((/1,1/),(/3,3/),(/'x','y'/),(/1,1/),(/jpi,jpj/),v_ice_id) 
    535 #   else 
    536    CALL agrif_declare_variable((/1,2/),(/2,3/),(/'x','y'/),(/1,1/),(/jpi,jpj/),u_ice_id) 
    537    CALL agrif_declare_variable((/2,1/),(/3,2/),(/'x','y'/),(/1,1/),(/jpi,jpj/),v_ice_id) 
    538 #   endif 
    539  
    540    ! 2. Type of interpolation 
    541    !------------------------- 
    542    CALL Agrif_Set_bcinterp(adv_ice_id ,interp=AGRIF_linear) 
    543    CALL Agrif_Set_bcinterp(u_ice_id,interp1=Agrif_linear,interp2=AGRIF_ppm) 
    544    CALL Agrif_Set_bcinterp(v_ice_id,interp1=AGRIF_ppm,interp2=Agrif_linear) 
    545  
    546    ! 3. Location of interpolation 
    547    !----------------------------- 
    548    CALL Agrif_Set_bc(adv_ice_id ,(/0,1/)) 
    549    CALL Agrif_Set_bc(u_ice_id,(/0,1/)) 
    550    CALL Agrif_Set_bc(v_ice_id,(/0,1/)) 
    551  
    552    ! 5. Update type 
    553    !--------------- 
    554    CALL Agrif_Set_Updatetype(adv_ice_id , update = AGRIF_Update_Average) 
    555    CALL Agrif_Set_Updatetype(u_ice_id,update1 = Agrif_Update_Copy, update2 = Agrif_Update_Average) 
    556    CALL Agrif_Set_Updatetype(v_ice_id,update1 = Agrif_Update_Average, update2 = Agrif_Update_Copy) 
    557    !  
    558 END SUBROUTINE agrif_declare_var_lim2 
    559 #  endif 
    560466 
    561467#if defined key_lim3 
     
    623529   USE Agrif_Util 
    624530   USE ice 
    625  
    626    IMPLICIT NONE 
     531   USE par_oce, ONLY : nbghostcells 
     532   ! 
     533   IMPLICIT NONE 
     534   ! 
     535   INTEGER :: ind1, ind2, ind3 
    627536   !!---------------------------------------------------------------------- 
    628537   ! 
     
    634543   !                            2,2 = two ghost lines 
    635544   !------------------------------------------------------------------------------------- 
    636    CALL agrif_declare_variable((/2,2,0/),(/3,3,0/),(/'x','y','N'/),(/1,1,1/),(/nlci,nlcj,jpl*(5+nlay_s+nlay_i)/),tra_ice_id ) 
    637    CALL agrif_declare_variable((/1,2/)    ,(/2,3/),(/'x','y'/)    ,(/1,1/)  ,(/nlci,nlcj/)                      ,u_ice_id   ) 
    638    CALL agrif_declare_variable((/2,1/)    ,(/3,2/),(/'x','y'/)    ,(/1,1/)  ,(/nlci,nlcj/)                      ,v_ice_id   ) 
     545   ind1 =     nbghostcells 
     546   ind2 = 1 + nbghostcells 
     547   ind3 = 2 + nbghostcells 
     548   CALL agrif_declare_variable((/2,2,0/),(/ind3,ind3,0/),(/'x','y','N'/),(/1,1,1/),(/nlci,nlcj,jpl*(5+nlay_s+nlay_i)/),tra_ice_id ) 
     549   CALL agrif_declare_variable((/1,2/)  ,(/ind2,ind3/)  ,(/'x','y'/)    ,(/1,1/)  ,(/nlci,nlcj/)                      ,u_ice_id   ) 
     550   CALL agrif_declare_variable((/2,1/)  ,(/ind3,ind2/)  ,(/'x','y'/)    ,(/1,1/)  ,(/nlci,nlcj/)                      ,v_ice_id   ) 
    639551 
    640552   ! 2. Set interpolations (normal & tangent to the grid cell for velocities) 
     
    646558   ! 3. Set location of interpolations 
    647559   !---------------------------------- 
    648    CALL Agrif_Set_bc(tra_ice_id,(/0,1/)) 
    649    CALL Agrif_Set_bc(u_ice_id  ,(/0,1/)) 
    650    CALL Agrif_Set_bc(v_ice_id  ,(/0,1/)) 
     560   CALL Agrif_Set_bc(tra_ice_id,(/0,ind1/)) 
     561   CALL Agrif_Set_bc(u_ice_id  ,(/0,ind1/)) 
     562   CALL Agrif_Set_bc(v_ice_id  ,(/0,ind1/)) 
    651563 
    652564   ! 4. Set update type in case 2 ways (child=>parent) (normal & tangent to the grid cell for velocities) 
     
    777689   !! 
    778690   IMPLICIT NONE 
     691   ! 
     692   INTEGER :: ind1, ind2, ind3 
    779693   !!---------------------------------------------------------------------- 
    780694 
    781695   ! 1. Declaration of the type of variable which have to be interpolated 
    782696   !--------------------------------------------------------------------- 
    783    CALL agrif_declare_variable((/2,2,0,0/),(/3,3,0,0/),(/'x','y','N','N'/),(/1,1,1,1/),(/nlci,nlcj,jpk,jptra/),trn_id) 
    784    CALL agrif_declare_variable((/2,2,0,0/),(/3,3,0,0/),(/'x','y','N','N'/),(/1,1,1,1/),(/nlci,nlcj,jpk,jptra/),trn_sponge_id) 
     697   ind1 =     nbghostcells 
     698   ind2 = 1 + nbghostcells 
     699   ind3 = 2 + nbghostcells 
     700   CALL agrif_declare_variable((/2,2,0,0/),(/ind3,ind3,0,0/),(/'x','y','N','N'/),(/1,1,1,1/),(/nlci,nlcj,jpk,jptra/),trn_id) 
     701   CALL agrif_declare_variable((/2,2,0,0/),(/ind3,ind3,0,0/),(/'x','y','N','N'/),(/1,1,1,1/),(/nlci,nlcj,jpk,jptra/),trn_sponge_id) 
    785702 
    786703   ! 2. Type of interpolation 
     
    791708   ! 3. Location of interpolation 
    792709   !----------------------------- 
    793    CALL Agrif_Set_bc(trn_id,(/0,1/)) 
    794 !   CALL Agrif_Set_bc(trn_sponge_id,(/-3*Agrif_irhox(),0/)) 
     710   CALL Agrif_Set_bc(trn_id,(/0,ind1/)) 
    795711   CALL Agrif_Set_bc(trn_sponge_id,(/-nn_sponge_len*Agrif_irhox()-1,0/)) 
    796712 
     
    868784   ! 
    869785   IF( agrif_oce_alloc()  > 0 )   CALL ctl_warn('agrif agrif_oce_alloc: allocation of arrays failed') 
    870 # if defined key_lim2 
    871    IF( agrif_ice_alloc()  > 0 )   CALL ctl_stop('agrif agrif_ice_alloc: allocation of arrays failed') ! only for LIM2 (not LIM3) 
    872 # endif 
    873786   ! 
    874787END SUBROUTINE agrif_nemo_init 
Note: See TracChangeset for help on using the changeset viewer.