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 6225 for branches/2014/dev_r4704_NOC5_MPP_BDY_UPDATE/NEMOGCM/NEMO/NST_SRC/agrif_opa_interp.F90 – NEMO

Ignore:
Timestamp:
2016-01-08T10:35:19+01:00 (8 years ago)
Author:
jamesharle
Message:

Update MPP_BDY_UPDATE branch to be consistent with head of trunk

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2014/dev_r4704_NOC5_MPP_BDY_UPDATE/NEMOGCM/NEMO/NST_SRC/agrif_opa_interp.F90

    r4486 r6225  
    77   !!             -   !  2005-11  (XXX)  
    88   !!            3.2  !  2009-04  (R. Benshila)  
     9   !!            3.6  !  2014-09  (R. Benshila)  
    910   !!---------------------------------------------------------------------- 
    1011#if defined key_agrif && ! defined key_offline 
     
    2122   USE oce 
    2223   USE dom_oce       
    23    USE sol_oce 
     24   USE zdf_oce 
    2425   USE agrif_oce 
    2526   USE phycst 
     27   ! 
    2628   USE in_out_manager 
    2729   USE agrif_opa_sponge 
    2830   USE lib_mpp 
    2931   USE wrk_nemo 
    30    USE dynspg_oce 
    31  
     32  
    3233   IMPLICIT NONE 
    3334   PRIVATE 
    3435 
    35    ! Barotropic arrays used to store open boundary data during 
    36    ! time-splitting loop: 
    37    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:) ::  ubdy_w, vbdy_w, hbdy_w 
    38    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:) ::  ubdy_e, vbdy_e, hbdy_e 
    39    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:) ::  ubdy_n, vbdy_n, hbdy_n 
    40    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:) ::  ubdy_s, vbdy_s, hbdy_s 
    41      
    4236   PUBLIC   Agrif_tra, Agrif_dyn, Agrif_ssh, Agrif_dyn_ts, Agrif_ssh_ts, Agrif_dta_ts 
    43    PUBLIC   interpu, interpv, interpunb, interpvnb, interpsshn 
    44  
    45 #  include "domzgr_substitute.h90"   
     37   PUBLIC   interpun, interpvn 
     38   PUBLIC   interptsn,  interpsshn 
     39   PUBLIC   interpunb, interpvnb, interpub2b, interpvb2b 
     40   PUBLIC   interpe3t, interpumsk, interpvmsk 
     41# if defined key_zdftke 
     42   PUBLIC   Agrif_tke, interpavm 
     43# endif 
     44 
     45   INTEGER ::   bdy_tinterp = 0 
     46 
    4647#  include "vectopt_loop_substitute.h90" 
    4748   !!---------------------------------------------------------------------- 
    48    !! NEMO/NST 3.3 , NEMO Consortium (2010) 
     49   !! NEMO/NST 3.7 , NEMO Consortium (2015) 
    4950   !! $Id$ 
    5051   !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) 
    5152   !!---------------------------------------------------------------------- 
    52  
    53    CONTAINS 
    54     
     53CONTAINS 
     54 
    5555   SUBROUTINE Agrif_tra 
    5656      !!---------------------------------------------------------------------- 
    57       !!                  ***  ROUTINE Agrif_Tra  *** 
    58       !!---------------------------------------------------------------------- 
    59       !! 
    60       INTEGER  ::   ji, jj, jk, jn   ! dummy loop indices 
    61       REAL(wp) ::   zrhox , alpha1, alpha2, alpha3 
    62       REAL(wp) ::   alpha4, alpha5, alpha6, alpha7 
    63       REAL(wp), POINTER, DIMENSION(:,:,:,:) :: ztsa 
     57      !!                  ***  ROUTINE Agrif_tra  *** 
    6458      !!---------------------------------------------------------------------- 
    6559      ! 
    6660      IF( Agrif_Root() )   RETURN 
    67  
    68       CALL wrk_alloc( jpi, jpj, jpk, jpts, ztsa )  
    69  
    70       Agrif_SpecialValue    = 0.e0 
     61      ! 
     62      Agrif_SpecialValue    = 0._wp 
    7163      Agrif_UseSpecialValue = .TRUE. 
    72       ztsa(:,:,:,:) = 0.e0 
    73  
    74       CALL Agrif_Bc_variable( ztsa, tsn_id, procname=interptsn ) 
     64      ! 
     65      CALL Agrif_Bc_variable( tsn_id, procname=interptsn ) 
     66      ! 
    7567      Agrif_UseSpecialValue = .FALSE. 
    76  
    77       zrhox = Agrif_Rhox() 
    78  
    79       alpha1 = ( zrhox - 1. ) * 0.5 
    80       alpha2 = 1. - alpha1 
    81  
    82       alpha3 = ( zrhox - 1. ) / ( zrhox + 1. ) 
    83       alpha4 = 1. - alpha3 
    84  
    85       alpha6 = 2. * ( zrhox - 1. ) / ( zrhox + 1. ) 
    86       alpha7 =    - ( zrhox - 1. ) / ( zrhox + 3. ) 
    87       alpha5 = 1. - alpha6 - alpha7 
    88  
    89       IF( nbondi == 1 .OR. nbondi == 2 ) THEN 
    90  
    91          DO jn = 1, jpts 
    92             tsa(nlci,:,:,jn) = alpha1 * ztsa(nlci,:,:,jn) + alpha2 * ztsa(nlci-1,:,:,jn) 
     68      ! 
     69   END SUBROUTINE Agrif_tra 
     70 
     71 
     72   SUBROUTINE Agrif_dyn( kt ) 
     73      !!---------------------------------------------------------------------- 
     74      !!                  ***  ROUTINE Agrif_DYN  *** 
     75      !!----------------------------------------------------------------------   
     76      INTEGER, INTENT(in) ::   kt 
     77      ! 
     78      INTEGER ::   ji, jj, jk       ! dummy loop indices 
     79      INTEGER ::   j1, j2, i1, i2 
     80      REAL(wp), POINTER, DIMENSION(:,:) ::   zub, zvb 
     81      !!----------------------------------------------------------------------   
     82      ! 
     83      IF( Agrif_Root() )   RETURN 
     84      ! 
     85      CALL wrk_alloc( jpi,jpj,   zub, zvb ) 
     86      ! 
     87      Agrif_SpecialValue    = 0._wp 
     88      Agrif_UseSpecialValue = ln_spc_dyn 
     89      ! 
     90      CALL Agrif_Bc_variable( un_interp_id, procname=interpun ) 
     91      CALL Agrif_Bc_variable( vn_interp_id, procname=interpvn ) 
     92      ! 
     93      Agrif_UseSpecialValue = .FALSE. 
     94      ! 
     95      ! prevent smoothing in ghost cells 
     96      i1 =  1   ;   i2 = jpi 
     97      j1 =  1   ;   j2 = jpj 
     98      IF( nbondj == -1 .OR. nbondj == 2 )   j1 = 3 
     99      IF( nbondj == +1 .OR. nbondj == 2 )   j2 = nlcj-2 
     100      IF( nbondi == -1 .OR. nbondi == 2 )   i1 = 3 
     101      IF( nbondi == +1 .OR. nbondi == 2 )   i2 = nlci-2 
     102 
     103      IF( nbondi == -1 .OR. nbondi == 2 ) THEN 
     104         ! 
     105         ! Smoothing 
     106         ! --------- 
     107         IF( .NOT.ln_dynspg_ts ) THEN  ! Store transport 
     108            ua_b(2,:) = 0._wp 
    93109            DO jk = 1, jpkm1 
    94110               DO jj = 1, jpj 
    95                   IF( umask(nlci-2,jj,jk) == 0.e0 ) THEN 
    96                      tsa(nlci-1,jj,jk,jn) = tsa(nlci,jj,jk,jn) * tmask(nlci-1,jj,jk) 
    97                   ELSE 
    98                      tsa(nlci-1,jj,jk,jn)=(alpha4*tsa(nlci,jj,jk,jn)+alpha3*tsa(nlci-2,jj,jk,jn))*tmask(nlci-1,jj,jk) 
    99                      IF( un(nlci-2,jj,jk) > 0.e0 ) THEN 
    100                         tsa(nlci-1,jj,jk,jn)=( alpha6*tsa(nlci-2,jj,jk,jn)+alpha5*tsa(nlci,jj,jk,jn)  & 
    101                            &                 + alpha7*tsa(nlci-3,jj,jk,jn) ) * tmask(nlci-1,jj,jk) 
    102                      ENDIF 
    103                   ENDIF 
    104                END DO 
    105             END DO 
    106          ENDDO 
    107       ENDIF 
    108  
    109       IF( nbondj == 1 .OR. nbondj == 2 ) THEN 
    110  
    111          DO jn = 1, jpts 
    112             tsa(:,nlcj,:,jn) = alpha1 * ztsa(:,nlcj,:,jn) + alpha2 * ztsa(:,nlcj-1,:,jn) 
     111                  ua_b(2,jj) = ua_b(2,jj) + e3u_a(2,jj,jk) * ua(2,jj,jk) 
     112               END DO 
     113            END DO 
     114            DO jj = 1, jpj 
     115               ua_b(2,jj) = ua_b(2,jj) * r1_hu_a(2,jj)             
     116            END DO 
     117         ENDIF 
     118         ! 
     119         DO jk=1,jpkm1                 ! Smooth 
     120            DO jj=j1,j2 
     121               ua(2,jj,jk) = 0.25_wp*(ua(1,jj,jk)+2._wp*ua(2,jj,jk)+ua(3,jj,jk)) 
     122               ua(2,jj,jk) = ua(2,jj,jk) * umask(2,jj,jk) 
     123            END DO 
     124         END DO 
     125         ! 
     126         zub(2,:) = 0._wp              ! Correct transport 
     127         DO jk = 1, jpkm1 
     128            DO jj = 1, jpj 
     129               zub(2,jj) = zub(2,jj) + e3u_a(2,jj,jk) * ua(2,jj,jk) 
     130            END DO 
     131         END DO 
     132         DO jj=1,jpj 
     133            zub(2,jj) = zub(2,jj) * r1_hu_a(2,jj) 
     134         END DO 
     135 
     136         DO jk=1,jpkm1 
     137            DO jj=1,jpj 
     138               ua(2,jj,jk) = (ua(2,jj,jk)+ua_b(2,jj)-zub(2,jj))*umask(2,jj,jk) 
     139            END DO 
     140         END DO 
     141 
     142         ! Set tangential velocities to time splitting estimate 
     143         !----------------------------------------------------- 
     144         IF( ln_dynspg_ts ) THEN 
     145            zvb(2,:) = 0._wp 
     146            DO jk = 1, jpkm1 
     147               DO jj = 1, jpj 
     148                  zvb(2,jj) = zvb(2,jj) + e3v_a(2,jj,jk) * va(2,jj,jk) 
     149               END DO 
     150            END DO 
     151            DO jj = 1, jpj 
     152               zvb(2,jj) = zvb(2,jj) * r1_hv_a(2,jj) 
     153            END DO 
     154            DO jk = 1, jpkm1 
     155               DO jj = 1, jpj 
     156                  va(2,jj,jk) = (va(2,jj,jk)+va_b(2,jj)-zvb(2,jj)) * vmask(2,jj,jk) 
     157               END DO 
     158            END DO 
     159         ENDIF 
     160         ! 
     161         ! Mask domain edges: 
     162         !------------------- 
     163         DO jk = 1, jpkm1 
     164            DO jj = 1, jpj 
     165               ua(1,jj,jk) = 0._wp 
     166               va(1,jj,jk) = 0._wp 
     167            END DO 
     168         END DO          
     169         ! 
     170      ENDIF 
     171 
     172      IF( nbondi == 1 .OR. nbondi == 2 ) THEN 
     173 
     174         ! Smoothing 
     175         ! --------- 
     176         IF( .NOT.ln_dynspg_ts ) THEN  ! Store transport 
     177            ua_b(nlci-2,:) = 0._wp 
     178            DO jk=1,jpkm1 
     179               DO jj=1,jpj 
     180                  ua_b(nlci-2,jj) = ua_b(nlci-2,jj) + e3u_a(nlci-2,jj,jk) * ua(nlci-2,jj,jk) 
     181               END DO 
     182            END DO 
     183            DO jj=1,jpj 
     184               ua_b(nlci-2,jj) = ua_b(nlci-2,jj) * r1_hu_a(nlci-2,jj)             
     185            END DO 
     186         ENDIF 
     187 
     188         DO jk = 1, jpkm1              ! Smooth 
     189            DO jj = j1, j2 
     190               ua(nlci-2,jj,jk) = 0.25_wp * umask(nlci-2,jj,jk)      & 
     191                  &             * ( ua(nlci-3,jj,jk) + 2._wp*ua(nlci-2,jj,jk) + ua(nlci-1,jj,jk) ) 
     192            END DO 
     193         END DO 
     194 
     195         zub(nlci-2,:) = 0._wp        ! Correct transport 
     196         DO jk = 1, jpkm1 
     197            DO jj = 1, jpj 
     198               zub(nlci-2,jj) = zub(nlci-2,jj) + e3u_a(nlci-2,jj,jk) * ua(nlci-2,jj,jk) 
     199            END DO 
     200         END DO 
     201         DO jj = 1, jpj 
     202            zub(nlci-2,jj) = zub(nlci-2,jj) * r1_hu_a(nlci-2,jj) 
     203         END DO 
     204 
     205         DO jk = 1, jpkm1 
     206            DO jj = 1, jpj 
     207               ua(nlci-2,jj,jk) = ( ua(nlci-2,jj,jk) + ua_b(nlci-2,jj) - zub(nlci-2,jj) ) * umask(nlci-2,jj,jk) 
     208            END DO 
     209         END DO 
     210         ! 
     211         ! Set tangential velocities to time splitting estimate 
     212         !----------------------------------------------------- 
     213         IF( ln_dynspg_ts ) THEN 
     214            zvb(nlci-1,:) = 0._wp 
     215            DO jk = 1, jpkm1 
     216               DO jj = 1, jpj 
     217                  zvb(nlci-1,jj) = zvb(nlci-1,jj) + e3v_a(nlci-1,jj,jk) * va(nlci-1,jj,jk) 
     218               END DO 
     219            END DO 
     220            DO jj=1,jpj 
     221               zvb(nlci-1,jj) = zvb(nlci-1,jj) * r1_hv_a(nlci-1,jj) 
     222            END DO 
     223            DO jk = 1, jpkm1 
     224               DO jj = 1, jpj 
     225                  va(nlci-1,jj,jk) = ( va(nlci-1,jj,jk) + va_b(nlci-1,jj) - zvb(nlci-1,jj) ) * vmask(nlci-1,jj,jk) 
     226               END DO 
     227            END DO 
     228         ENDIF 
     229         ! 
     230         ! Mask domain edges: 
     231         !------------------- 
     232         DO jk = 1, jpkm1 
     233            DO jj = 1, jpj 
     234               ua(nlci-1,jj,jk) = 0._wp 
     235               va(nlci  ,jj,jk) = 0._wp 
     236            END DO 
     237         END DO  
     238         ! 
     239      ENDIF 
     240 
     241      IF( nbondj == -1 .OR. nbondj == 2 ) THEN 
     242 
     243         ! Smoothing 
     244         ! --------- 
     245         IF( .NOT.ln_dynspg_ts ) THEN  ! Store transport 
     246            va_b(:,2) = 0._wp 
    113247            DO jk = 1, jpkm1 
    114248               DO ji = 1, jpi 
    115                   IF( vmask(ji,nlcj-2,jk) == 0.e0 ) THEN 
    116                      tsa(ji,nlcj-1,jk,jn) = tsa(ji,nlcj,jk,jn) * tmask(ji,nlcj-1,jk) 
    117                   ELSE 
    118                      tsa(ji,nlcj-1,jk,jn)=(alpha4*tsa(ji,nlcj,jk,jn)+alpha3*tsa(ji,nlcj-2,jk,jn))*tmask(ji,nlcj-1,jk)         
    119                      IF (vn(ji,nlcj-2,jk) > 0.e0 ) THEN 
    120                         tsa(ji,nlcj-1,jk,jn)=( alpha6*tsa(ji,nlcj-2,jk,jn)+alpha5*tsa(ji,nlcj,jk,jn)  & 
    121                            &                 + alpha7*tsa(ji,nlcj-3,jk,jn) ) * tmask(ji,nlcj-1,jk) 
    122                      ENDIF 
    123                   ENDIF 
    124                END DO 
    125             END DO 
    126          ENDDO  
    127       ENDIF 
    128  
    129       IF( nbondi == -1 .OR. nbondi == 2 ) THEN 
    130          DO jn = 1, jpts 
    131             tsa(1,:,:,jn) = alpha1 * ztsa(1,:,:,jn) + alpha2 * ztsa(2,:,:,jn) 
    132             DO jk = 1, jpkm1 
    133                DO jj = 1, jpj 
    134                   IF( umask(2,jj,jk) == 0.e0 ) THEN 
    135                      tsa(2,jj,jk,jn) = tsa(1,jj,jk,jn) * tmask(2,jj,jk) 
    136                   ELSE 
    137                      tsa(2,jj,jk,jn)=(alpha4*tsa(1,jj,jk,jn)+alpha3*tsa(3,jj,jk,jn))*tmask(2,jj,jk)         
    138                      IF( un(2,jj,jk) < 0.e0 ) THEN 
    139                         tsa(2,jj,jk,jn)=(alpha6*tsa(3,jj,jk,jn)+alpha5*tsa(1,jj,jk,jn)+alpha7*tsa(4,jj,jk,jn))*tmask(2,jj,jk) 
    140                      ENDIF 
    141                   ENDIF 
    142                END DO 
    143             END DO 
    144          END DO 
    145       ENDIF 
    146  
    147       IF( nbondj == -1 .OR. nbondj == 2 ) THEN 
    148          DO jn = 1, jpts 
    149             tsa(:,1,:,jn) = alpha1 * ztsa(:,1,:,jn) + alpha2 * ztsa(:,2,:,jn) 
    150             DO jk=1,jpk       
    151                DO ji=1,jpi 
    152                   IF( vmask(ji,2,jk) == 0.e0 ) THEN 
    153                      tsa(ji,2,jk,jn)=tsa(ji,1,jk,jn) * tmask(ji,2,jk) 
    154                   ELSE 
    155                      tsa(ji,2,jk,jn)=(alpha4*tsa(ji,1,jk,jn)+alpha3*tsa(ji,3,jk,jn))*tmask(ji,2,jk) 
    156                      IF( vn(ji,2,jk) < 0.e0 ) THEN 
    157                         tsa(ji,2,jk,jn)=(alpha6*tsa(ji,3,jk,jn)+alpha5*tsa(ji,1,jk,jn)+alpha7*tsa(ji,4,jk,jn))*tmask(ji,2,jk) 
    158                      ENDIF 
    159                   ENDIF 
    160                END DO 
    161             END DO 
    162          ENDDO 
    163       ENDIF 
    164       ! 
    165       CALL wrk_dealloc( jpi, jpj, jpk, jpts, ztsa )  
    166       ! 
    167    END SUBROUTINE Agrif_tra 
    168  
    169  
    170    SUBROUTINE Agrif_dyn( kt ) 
    171       !!---------------------------------------------------------------------- 
    172       !!                  ***  ROUTINE Agrif_DYN  *** 
    173       !!----------------------------------------------------------------------   
    174       !!  
    175       INTEGER, INTENT(in) ::   kt 
    176       !! 
    177       INTEGER :: ji,jj,jk 
    178       REAL(wp) :: timeref 
    179       REAL(wp) :: z2dt, znugdt 
    180       REAL(wp) :: zrhox, zrhoy 
    181       REAL(wp), POINTER, DIMENSION(:,:,:) :: zua, zva 
    182       REAL(wp), POINTER, DIMENSION(:,:) :: spgv1, spgu1, zua2d, zva2d 
    183       !!----------------------------------------------------------------------   
    184  
    185       IF( Agrif_Root() )   RETURN 
    186  
    187       CALL wrk_alloc( jpi, jpj, spgv1, spgu1, zua2d, zva2d ) 
    188       CALL wrk_alloc( jpi, jpj, jpk, zua, zva ) 
    189  
    190       zrhox = Agrif_Rhox() 
    191       zrhoy = Agrif_Rhoy() 
    192  
    193       timeref = 1. 
    194  
    195       ! time step: leap-frog 
    196       z2dt = 2. * rdt 
    197       ! time step: Euler if restart from rest 
    198       IF( neuler == 0 .AND. kt == nit000 ) z2dt = rdt 
    199       ! coefficients 
    200       znugdt =  grav * z2dt     
    201  
    202       Agrif_SpecialValue=0. 
    203       Agrif_UseSpecialValue = ln_spc_dyn 
    204  
    205       zua = 0. 
    206       zva = 0. 
    207       CALL Agrif_Bc_variable(zua,un_id,procname=interpu) 
    208       CALL Agrif_Bc_variable(zva,vn_id,procname=interpv) 
    209       zua2d = 0. 
    210       zva2d = 0. 
    211  
    212 #if defined key_dynspg_flt 
    213       Agrif_SpecialValue=0. 
    214       Agrif_UseSpecialValue = ln_spc_dyn 
    215       CALL Agrif_Bc_variable(zua2d,e1u_id,calledweight=1.,procname=interpu2d) 
    216       CALL Agrif_Bc_variable(zva2d,e2v_id,calledweight=1.,procname=interpv2d) 
    217 #endif 
    218       Agrif_UseSpecialValue = .FALSE. 
    219  
    220  
    221       IF((nbondi == -1).OR.(nbondi == 2)) THEN 
    222  
    223 #if defined key_dynspg_flt 
    224          DO jj=1,jpj 
    225             laplacu(2,jj) = timeref * (zua2d(2,jj)/(zrhoy*e2u(2,jj)))*umask(2,jj,1) 
    226          END DO 
    227 #endif 
    228  
    229          DO jk=1,jpkm1 
    230             DO jj=1,jpj 
    231                ua(1:2,jj,jk) = (zua(1:2,jj,jk)/(zrhoy*e2u(1:2,jj))) 
    232                ua(1:2,jj,jk) = ua(1:2,jj,jk) / fse3u_a(1:2,jj,jk) 
    233             END DO 
    234          END DO 
    235  
    236 #if defined key_dynspg_flt 
    237          DO jk=1,jpkm1 
    238             DO jj=1,jpj 
    239                ua(2,jj,jk) = (ua(2,jj,jk) - z2dt * znugdt * laplacu(2,jj))*umask(2,jj,jk) 
    240             END DO 
    241          END DO 
    242  
    243          spgu(2,:)=0. 
    244  
    245          DO jk=1,jpkm1 
    246             DO jj=1,jpj 
    247                spgu(2,jj)=spgu(2,jj)+fse3u_a(2,jj,jk)*ua(2,jj,jk) 
    248             END DO 
    249          END DO 
    250  
    251          DO jj=1,jpj 
    252             IF (umask(2,jj,1).NE.0.) THEN 
    253                spgu(2,jj)=spgu(2,jj)*hur_a(2,jj) 
    254             ENDIF 
    255          END DO 
    256 #else 
    257          spgu(2,:) = ua_b(2,:) 
    258 #endif 
    259  
    260          DO jk=1,jpkm1 
    261             DO jj=1,jpj 
    262                ua(2,jj,jk) = 0.25*(ua(1,jj,jk)+2.*ua(2,jj,jk)+ua(3,jj,jk)) 
    263                ua(2,jj,jk) = ua(2,jj,jk) * umask(2,jj,jk) 
    264             END DO 
    265          END DO 
    266  
    267          spgu1(2,:)=0. 
    268  
    269          DO jk=1,jpkm1 
    270             DO jj=1,jpj 
    271                spgu1(2,jj)=spgu1(2,jj)+fse3u_a(2,jj,jk)*ua(2,jj,jk) 
    272             END DO 
    273          END DO 
    274  
    275          DO jj=1,jpj 
    276             IF (umask(2,jj,1).NE.0.) THEN 
    277                spgu1(2,jj)=spgu1(2,jj)*hur_a(2,jj) 
    278             ENDIF 
    279          END DO 
    280  
    281          DO jk=1,jpkm1 
    282             DO jj=1,jpj 
    283                ua(2,jj,jk) = (ua(2,jj,jk)+spgu(2,jj)-spgu1(2,jj))*umask(2,jj,jk) 
    284             END DO 
    285          END DO 
    286  
    287          DO jk=1,jpkm1 
    288             DO jj=1,jpj 
    289                va(2,jj,jk) = (zva(2,jj,jk)/(zrhox*e1v(2,jj)))*vmask(2,jj,jk) 
    290                va(2,jj,jk) = va(2,jj,jk) / fse3v_a(2,jj,jk) 
    291             END DO 
    292          END DO 
    293  
    294 #if defined key_dynspg_ts 
    295          ! Set tangential velocities to time splitting estimate 
    296          spgv1(2,:)=0. 
    297          DO jk=1,jpkm1 
    298             DO jj=1,jpj 
    299                spgv1(2,jj)=spgv1(2,jj)+fse3v_a(2,jj,jk)*va(2,jj,jk) 
    300             END DO 
    301          END DO 
    302  
    303          DO jj=1,jpj 
    304             spgv1(2,jj)=spgv1(2,jj)*hvr_a(2,jj) 
    305          END DO 
    306  
    307          DO jk=1,jpkm1 
    308             DO jj=1,jpj 
    309                va(2,jj,jk) = (va(2,jj,jk)+va_b(2,jj)-spgv1(2,jj))*vmask(2,jj,jk) 
    310             END DO 
    311          END DO 
    312 #endif 
    313  
    314       ENDIF 
    315  
    316       IF((nbondi == 1).OR.(nbondi == 2)) THEN 
    317 #if defined key_dynspg_flt 
    318          DO jj=1,jpj 
    319             laplacu(nlci-2,jj) = timeref * (zua2d(nlci-2,jj)/(zrhoy*e2u(nlci-2,jj))) 
    320          END DO 
    321 #endif 
    322  
    323          DO jk=1,jpkm1 
    324             DO jj=1,jpj 
    325                ua(nlci-2:nlci-1,jj,jk) = (zua(nlci-2:nlci-1,jj,jk)/(zrhoy*e2u(nlci-2:nlci-1,jj))) 
    326                ua(nlci-2:nlci-1,jj,jk) = ua(nlci-2:nlci-1,jj,jk) / fse3u_a(nlci-2:nlci-1,jj,jk) 
    327             END DO 
    328          END DO 
    329  
    330 #if defined key_dynspg_flt 
    331          DO jk=1,jpkm1 
    332             DO jj=1,jpj 
    333                ua(nlci-2,jj,jk) = (ua(nlci-2,jj,jk)- z2dt * znugdt * laplacu(nlci-2,jj))*umask(nlci-2,jj,jk) 
    334             END DO 
    335          END DO 
    336  
    337  
    338          spgu(nlci-2,:)=0. 
    339  
    340          do jk=1,jpkm1 
    341             do jj=1,jpj 
    342                spgu(nlci-2,jj)=spgu(nlci-2,jj)+fse3u_a(nlci-2,jj,jk)*ua(nlci-2,jj,jk) 
    343             enddo 
    344          enddo 
    345  
    346          DO jj=1,jpj 
    347             IF (umask(nlci-2,jj,1).NE.0.) THEN 
    348                spgu(nlci-2,jj)=spgu(nlci-2,jj)*hur_a(nlci-2,jj) 
    349             ENDIF 
    350          END DO 
    351 #else 
    352          spgu(nlci-2,:) = ua_b(nlci-2,:) 
    353 #endif 
    354  
    355          DO jk=1,jpkm1 
    356             DO jj=1,jpj 
    357                ua(nlci-2,jj,jk) = 0.25*(ua(nlci-3,jj,jk)+2.*ua(nlci-2,jj,jk)+ua(nlci-1,jj,jk)) 
    358  
    359                ua(nlci-2,jj,jk) = ua(nlci-2,jj,jk) * umask(nlci-2,jj,jk) 
    360  
    361             END DO 
    362          END DO 
    363  
    364          spgu1(nlci-2,:)=0. 
    365  
    366          DO jk=1,jpkm1 
    367             DO jj=1,jpj 
    368                spgu1(nlci-2,jj)=spgu1(nlci-2,jj)+fse3u_a(nlci-2,jj,jk)*ua(nlci-2,jj,jk)*umask(nlci-2,jj,jk) 
    369             END DO 
    370          END DO 
    371  
    372          DO jj=1,jpj 
    373             IF (umask(nlci-2,jj,1).NE.0.) THEN 
    374                spgu1(nlci-2,jj)=spgu1(nlci-2,jj)*hur_a(nlci-2,jj) 
    375             ENDIF 
    376          END DO 
    377  
    378          DO jk=1,jpkm1 
    379             DO jj=1,jpj 
    380                ua(nlci-2,jj,jk) = (ua(nlci-2,jj,jk)+spgu(nlci-2,jj)-spgu1(nlci-2,jj))*umask(nlci-2,jj,jk) 
    381             END DO 
    382          END DO 
    383  
    384          DO jk=1,jpkm1 
    385             DO jj=1,jpj-1 
    386                va(nlci-1,jj,jk) = (zva(nlci-1,jj,jk)/(zrhox*e1v(nlci-1,jj)))*vmask(nlci-1,jj,jk) 
    387                va(nlci-1,jj,jk) = va(nlci-1,jj,jk) / fse3v_a(nlci-1,jj,jk) 
    388             END DO 
    389          END DO 
    390  
    391 #if defined key_dynspg_ts 
    392          ! Set tangential velocities to time splitting estimate 
    393          spgv1(nlci-1,:)=0._wp 
    394          DO jk=1,jpkm1 
    395             DO jj=1,jpj 
    396                spgv1(nlci-1,jj)=spgv1(nlci-1,jj)+fse3v_a(nlci-1,jj,jk)*va(nlci-1,jj,jk)*vmask(nlci-1,jj,jk) 
    397             END DO 
    398          END DO 
    399  
    400          DO jj=1,jpj 
    401             spgv1(nlci-1,jj)=spgv1(nlci-1,jj)*hvr_a(nlci-1,jj) 
    402          END DO 
    403  
    404          DO jk=1,jpkm1 
    405             DO jj=1,jpj 
    406                va(nlci-1,jj,jk) = (va(nlci-1,jj,jk)+va_b(nlci-1,jj)-spgv1(nlci-1,jj))*vmask(nlci-1,jj,jk) 
    407             END DO 
    408          END DO 
    409 #endif 
    410  
    411       ENDIF 
    412  
    413       IF((nbondj == -1).OR.(nbondj == 2)) THEN 
    414  
    415 #if defined key_dynspg_flt 
    416          DO ji=1,jpi 
    417             laplacv(ji,2) = timeref * (zva2d(ji,2)/(zrhox*e1v(ji,2))) 
    418          END DO 
    419 #endif 
    420  
     249                  va_b(ji,2) = va_b(ji,2) + e3v_a(ji,2,jk) * va(ji,2,jk) 
     250               END DO 
     251            END DO 
     252            DO ji=1,jpi 
     253               va_b(ji,2) = va_b(ji,2) * r1_hv_a(ji,2)             
     254            END DO 
     255         ENDIF 
     256         ! 
     257         DO jk = 1, jpkm1              ! Smooth 
     258            DO ji = i1, i2 
     259               va(ji,2,jk) = 0.25_wp * vmask(ji,2,jk)    & 
     260                  &        * ( va(ji,1,jk) + 2._wp*va(ji,2,jk) + va(ji,3,jk) ) 
     261            END DO 
     262         END DO 
     263         ! 
     264         zvb(:,2) = 0._wp              ! Correct transport 
    421265         DO jk=1,jpkm1 
    422266            DO ji=1,jpi 
    423                va(ji,1:2,jk) = (zva(ji,1:2,jk)/(zrhox*e1v(ji,1:2))) 
    424                va(ji,1:2,jk) = va(ji,1:2,jk) / fse3v_a(ji,1:2,jk) 
    425             END DO 
    426          END DO 
    427  
    428 #if defined key_dynspg_flt 
    429          DO jk=1,jpkm1 
    430             DO ji=1,jpi 
    431                va(ji,2,jk) = (va(ji,2,jk) - z2dt * znugdt * laplacv(ji,2))*vmask(ji,2,jk) 
    432             END DO 
    433          END DO 
    434  
    435          spgv(:,2)=0. 
    436  
    437          DO jk=1,jpkm1 
    438             DO ji=1,jpi 
    439                spgv(ji,2)=spgv(ji,2)+fse3v_a(ji,2,jk)*va(ji,2,jk) 
    440             END DO 
    441          END DO 
    442  
    443          DO ji=1,jpi 
    444             IF (vmask(ji,2,1).NE.0.) THEN 
    445                spgv(ji,2)=spgv(ji,2)*hvr_a(ji,2) 
    446             ENDIF 
    447          END DO 
    448 #else 
    449          spgv(:,2)=va_b(:,2) 
    450 #endif 
    451  
    452          DO jk=1,jpkm1 
    453             DO ji=1,jpi 
    454                va(ji,2,jk)=0.25*(va(ji,1,jk)+2.*va(ji,2,jk)+va(ji,3,jk)) 
    455                va(ji,2,jk)=va(ji,2,jk)*vmask(ji,2,jk) 
    456             END DO 
    457          END DO 
    458  
    459          spgv1(:,2)=0. 
    460  
    461          DO jk=1,jpkm1 
    462             DO ji=1,jpi 
    463                spgv1(ji,2)=spgv1(ji,2)+fse3v_a(ji,2,jk)*va(ji,2,jk)*vmask(ji,2,jk) 
    464             END DO 
    465          END DO 
    466  
    467          DO ji=1,jpi 
    468             IF (vmask(ji,2,1).NE.0.) THEN 
    469                spgv1(ji,2)=spgv1(ji,2)*hvr_a(ji,2) 
    470             ENDIF 
    471          END DO 
    472  
    473          DO jk=1,jpkm1 
    474             DO ji=1,jpi 
    475                va(ji,2,jk) = (va(ji,2,jk)+spgv(ji,2)-spgv1(ji,2))*vmask(ji,2,jk) 
    476             END DO 
    477          END DO 
    478  
    479          DO jk=1,jpkm1 
    480             DO ji=1,jpi 
    481                ua(ji,2,jk) = (zua(ji,2,jk)/(zrhoy*e2u(ji,2)))*umask(ji,2,jk)  
    482                ua(ji,2,jk) = ua(ji,2,jk) / fse3u_a(ji,2,jk) 
    483             END DO 
    484          END DO 
    485  
    486 #if defined key_dynspg_ts 
     267               zvb(ji,2) = zvb(ji,2) + e3v_a(ji,2,jk) * va(ji,2,jk) * vmask(ji,2,jk) 
     268            END DO 
     269         END DO 
     270         DO ji = 1, jpi 
     271            zvb(ji,2) = zvb(ji,2) * r1_hv_a(ji,2) 
     272         END DO 
     273         DO jk = 1, jpkm1 
     274            DO ji = 1, jpi 
     275               va(ji,2,jk) = ( va(ji,2,jk) + va_b(ji,2) - zvb(ji,2) ) * vmask(ji,2,jk) 
     276            END DO 
     277         END DO 
     278 
    487279         ! Set tangential velocities to time splitting estimate 
    488          spgu1(:,2)=0._wp 
    489          DO jk=1,jpkm1 
    490             DO ji=1,jpi 
    491                spgu1(ji,2)=spgu1(ji,2)+fse3u_a(ji,2,jk)*ua(ji,2,jk)*umask(ji,2,jk) 
    492             END DO 
    493          END DO 
    494  
    495          DO ji=1,jpi 
    496             spgu1(ji,2)=spgu1(ji,2)*hur_a(ji,2) 
    497          END DO 
    498  
    499          DO jk=1,jpkm1 
    500             DO ji=1,jpi 
    501                ua(ji,2,jk) = (ua(ji,2,jk)+ua_b(ji,2)-spgu1(ji,2))*umask(ji,2,jk) 
    502             END DO 
    503          END DO 
    504 #endif 
    505       ENDIF 
    506  
    507       IF((nbondj == 1).OR.(nbondj == 2)) THEN 
    508  
    509 #if defined key_dynspg_flt 
    510          DO ji=1,jpi 
    511             laplacv(ji,nlcj-2) = timeref * (zva2d(ji,nlcj-2)/(zrhox*e1v(ji,nlcj-2))) 
    512          END DO 
    513 #endif 
    514  
    515          DO jk=1,jpkm1 
    516             DO ji=1,jpi 
    517                va(ji,nlcj-2:nlcj-1,jk) = (zva(ji,nlcj-2:nlcj-1,jk)/(zrhox*e1v(ji,nlcj-2:nlcj-1))) 
    518                va(ji,nlcj-2:nlcj-1,jk) = va(ji,nlcj-2:nlcj-1,jk) / fse3v_a(ji,nlcj-2:nlcj-1,jk) 
    519             END DO 
    520          END DO 
    521  
    522 #if defined key_dynspg_flt 
    523          DO jk=1,jpkm1 
    524             DO ji=1,jpi 
    525                va(ji,nlcj-2,jk) = (va(ji,nlcj-2,jk)-z2dt * znugdt * laplacv(ji,nlcj-2))*vmask(ji,nlcj-2,jk) 
    526             END DO 
    527          END DO 
    528  
    529          spgv(:,nlcj-2)=0. 
    530  
    531          DO jk=1,jpkm1 
    532             DO ji=1,jpi 
    533                spgv(ji,nlcj-2)=spgv(ji,nlcj-2)+fse3v_a(ji,nlcj-2,jk)*va(ji,nlcj-2,jk) 
    534             END DO 
    535          END DO 
    536  
    537          DO ji=1,jpi 
    538             IF (vmask(ji,nlcj-2,1).NE.0.) THEN 
    539                spgv(ji,nlcj-2)=spgv(ji,nlcj-2)*hvr_a(ji,nlcj-2) 
    540             ENDIF 
    541          END DO 
    542 #else 
    543          spgv(:,nlcj-2)=va_b(:,nlcj-2) 
    544 #endif 
    545  
    546          DO jk=1,jpkm1 
    547             DO ji=1,jpi 
    548                va(ji,nlcj-2,jk)=0.25*(va(ji,nlcj-3,jk)+2.*va(ji,nlcj-2,jk)+va(ji,nlcj-1,jk)) 
    549                va(ji,nlcj-2,jk) = va(ji,nlcj-2,jk) * vmask(ji,nlcj-2,jk) 
    550             END DO 
    551          END DO 
    552  
    553          spgv1(:,nlcj-2)=0. 
    554  
    555          DO jk=1,jpkm1 
    556             DO ji=1,jpi 
    557                spgv1(ji,nlcj-2)=spgv1(ji,nlcj-2)+fse3v_a(ji,nlcj-2,jk)*va(ji,nlcj-2,jk) 
    558             END DO 
    559          END DO 
    560  
    561          DO ji=1,jpi 
    562             IF (vmask(ji,nlcj-2,1).NE.0.) THEN 
    563                spgv1(ji,nlcj-2)=spgv1(ji,nlcj-2)*hvr_a(ji,nlcj-2) 
    564             ENDIF 
    565          END DO 
    566  
    567          DO jk=1,jpkm1 
    568             DO ji=1,jpi 
    569                va(ji,nlcj-2,jk) = (va(ji,nlcj-2,jk)+spgv(ji,nlcj-2)-spgv1(ji,nlcj-2))*vmask(ji,nlcj-2,jk) 
    570             END DO 
    571          END DO 
    572  
    573          DO jk=1,jpkm1 
    574             DO ji=1,jpi 
    575                ua(ji,nlcj-1,jk) = (zua(ji,nlcj-1,jk)/(zrhoy*e2u(ji,nlcj-1)))*umask(ji,nlcj-1,jk) 
    576                ua(ji,nlcj-1,jk) = ua(ji,nlcj-1,jk) / fse3u_a(ji,nlcj-1,jk) 
    577             END DO 
    578          END DO 
    579  
    580 #if defined key_dynspg_ts 
     280         !----------------------------------------------------- 
     281         IF( ln_dynspg_ts ) THEN 
     282            zub(:,2) = 0._wp 
     283            DO jk = 1, jpkm1 
     284               DO ji = 1, jpi 
     285                  zub(ji,2) = zub(ji,2) + e3u_a(ji,2,jk) * ua(ji,2,jk) * umask(ji,2,jk) 
     286               END DO 
     287            END DO 
     288            DO ji = 1, jpi 
     289               zub(ji,2) = zub(ji,2) * r1_hu_a(ji,2) 
     290            END DO 
     291 
     292            DO jk = 1, jpkm1 
     293               DO ji = 1, jpi 
     294                  ua(ji,2,jk) = ( ua(ji,2,jk) + ua_b(ji,2) - zub(ji,2) ) * umask(ji,2,jk) 
     295               END DO 
     296            END DO 
     297         ENDIF 
     298 
     299         ! Mask domain edges: 
     300         !------------------- 
     301         DO jk = 1, jpkm1 
     302            DO ji = 1, jpi 
     303               ua(ji,1,jk) = 0._wp 
     304               va(ji,1,jk) = 0._wp 
     305            END DO 
     306         END DO  
     307 
     308      ENDIF 
     309 
     310      IF( nbondj == 1 .OR. nbondj == 2 ) THEN 
     311         ! 
     312         ! Smoothing 
     313         ! --------- 
     314         IF( .NOT.ln_dynspg_ts ) THEN  ! Store transport 
     315            va_b(:,nlcj-2) = 0._wp 
     316            DO jk = 1, jpkm1 
     317               DO ji = 1, jpi 
     318                  va_b(ji,nlcj-2) = va_b(ji,nlcj-2) + e3v_a(ji,nlcj-2,jk) * va(ji,nlcj-2,jk) 
     319               END DO 
     320            END DO 
     321            DO ji = 1, jpi 
     322               va_b(ji,nlcj-2) = va_b(ji,nlcj-2) * r1_hv_a(ji,nlcj-2)             
     323            END DO 
     324         ENDIF 
     325         ! 
     326         DO jk = 1, jpkm1              ! Smooth 
     327            DO ji = i1, i2 
     328               va(ji,nlcj-2,jk) = 0.25_wp * vmask(ji,nlcj-2,jk)   & 
     329                  &             * ( va(ji,nlcj-3,jk) + 2._wp * va(ji,nlcj-2,jk) + va(ji,nlcj-1,jk) ) 
     330            END DO 
     331         END DO 
     332         ! 
     333         zvb(:,nlcj-2) = 0._wp         ! Correct transport 
     334         DO jk = 1, jpkm1 
     335            DO ji = 1, jpi 
     336               zvb(ji,nlcj-2) = zvb(ji,nlcj-2) + e3v_a(ji,nlcj-2,jk) * va(ji,nlcj-2,jk) * vmask(ji,nlcj-2,jk) 
     337            END DO 
     338         END DO 
     339         DO ji = 1, jpi 
     340            zvb(ji,nlcj-2) = zvb(ji,nlcj-2) * r1_hv_a(ji,nlcj-2) 
     341         END DO 
     342         DO jk = 1, jpkm1 
     343            DO ji = 1, jpi 
     344               va(ji,nlcj-2,jk) = ( va(ji,nlcj-2,jk) + va_b(ji,nlcj-2) - zvb(ji,nlcj-2) ) * vmask(ji,nlcj-2,jk) 
     345            END DO 
     346         END DO 
     347         ! 
    581348         ! Set tangential velocities to time splitting estimate 
    582          spgu1(:,nlcj-1)=0._wp 
    583          DO jk=1,jpkm1 
    584             DO ji=1,jpi 
    585                spgu1(ji,nlcj-1)=spgu1(ji,nlcj-1)+fse3u_a(ji,nlcj-1,jk)*ua(ji,nlcj-1,jk) 
    586             END DO 
    587          END DO 
    588  
    589          DO ji=1,jpi 
    590             spgu1(ji,nlcj-1)=spgu1(ji,nlcj-1)*hur_a(ji,nlcj-1) 
    591          END DO 
    592  
    593          DO jk=1,jpkm1 
    594             DO ji=1,jpi 
    595                ua(ji,nlcj-1,jk) = (ua(ji,nlcj-1,jk)+ua_b(ji,nlcj-1)-spgu1(ji,nlcj-1))*umask(ji,nlcj-1,jk) 
    596             END DO 
    597          END DO 
    598 #endif 
    599  
    600       ENDIF 
    601       ! 
    602       CALL wrk_dealloc( jpi, jpj, spgv1, spgu1, zua2d, zva2d ) 
    603       CALL wrk_dealloc( jpi, jpj, jpk, zua, zva ) 
     349         !----------------------------------------------------- 
     350         IF( ln_dynspg_ts ) THEN 
     351            zub(:,nlcj-1) = 0._wp 
     352            DO jk = 1, jpkm1 
     353               DO ji = 1, jpi 
     354                  zub(ji,nlcj-1) = zub(ji,nlcj-1) + e3u_a(ji,nlcj-1,jk) * ua(ji,nlcj-1,jk) * umask(ji,nlcj-1,jk) 
     355               END DO 
     356            END DO 
     357            DO ji = 1, jpi 
     358               zub(ji,nlcj-1) = zub(ji,nlcj-1) * r1_hu_a(ji,nlcj-1) 
     359            END DO 
     360            ! 
     361            DO jk = 1, jpkm1 
     362               DO ji = 1, jpi 
     363                  ua(ji,nlcj-1,jk) = ( ua(ji,nlcj-1,jk) + ua_b(ji,nlcj-1) - zub(ji,nlcj-1) ) * umask(ji,nlcj-1,jk) 
     364               END DO 
     365            END DO 
     366         ENDIF 
     367         ! 
     368         ! Mask domain edges: 
     369         !------------------- 
     370         DO jk = 1, jpkm1 
     371            DO ji = 1, jpi 
     372               ua(ji,nlcj  ,jk) = 0._wp 
     373               va(ji,nlcj-1,jk) = 0._wp 
     374            END DO 
     375         END DO  
     376         ! 
     377      ENDIF 
     378      ! 
     379      CALL wrk_dealloc( jpi,jpj,   zub, zvb ) 
    604380      ! 
    605381   END SUBROUTINE Agrif_dyn 
     382 
    606383 
    607384   SUBROUTINE Agrif_dyn_ts( jn ) 
     
    614391      INTEGER :: ji, jj 
    615392      !!----------------------------------------------------------------------   
    616  
     393      ! 
    617394      IF( Agrif_Root() )   RETURN 
    618  
     395      ! 
    619396      IF((nbondi == -1).OR.(nbondi == 2)) THEN 
    620397         DO jj=1,jpj 
    621398            va_e(2,jj) = vbdy_w(jj) * hvr_e(2,jj) 
    622 ! Specified fluxes: 
     399            ! Specified fluxes: 
    623400            ua_e(2,jj) = ubdy_w(jj) * hur_e(2,jj) 
    624 ! Characteristics method: 
    625 !alt            ua_e(2,jj) = 0.5_wp * ( ubdy_w(jj) * hur_e(2,jj) + ua_e(3,jj) & 
    626 !alt                       &           - sqrt(grav * hur_e(2,jj)) * (sshn_e(3,jj) - hbdy_w(jj)) ) 
    627          END DO 
    628       ENDIF 
    629  
     401            ! Characteristics method: 
     402            !alt            ua_e(2,jj) = 0.5_wp * ( ubdy_w(jj) * hur_e(2,jj) + ua_e(3,jj) & 
     403            !alt                       &           - sqrt(grav * hur_e(2,jj)) * (sshn_e(3,jj) - hbdy_w(jj)) ) 
     404         END DO 
     405      ENDIF 
     406      ! 
    630407      IF((nbondi == 1).OR.(nbondi == 2)) THEN 
    631408         DO jj=1,jpj 
    632409            va_e(nlci-1,jj) = vbdy_e(jj) * hvr_e(nlci-1,jj) 
    633 ! Specified fluxes: 
     410            ! Specified fluxes: 
    634411            ua_e(nlci-2,jj) = ubdy_e(jj) * hur_e(nlci-2,jj) 
    635 ! Characteristics method: 
    636 !alt            ua_e(nlci-2,jj) = 0.5_wp * ( ubdy_e(jj) * hur_e(nlci-2,jj) + ua_e(nlci-3,jj) & 
    637 !alt                            &           + sqrt(grav * hur_e(nlci-2,jj)) * (sshn_e(nlci-2,jj) - hbdy_e(jj)) ) 
    638          END DO 
    639       ENDIF 
    640  
     412            ! Characteristics method: 
     413            !alt            ua_e(nlci-2,jj) = 0.5_wp * ( ubdy_e(jj) * hur_e(nlci-2,jj) + ua_e(nlci-3,jj) & 
     414            !alt                            &           + sqrt(grav * hur_e(nlci-2,jj)) * (sshn_e(nlci-2,jj) - hbdy_e(jj)) ) 
     415         END DO 
     416      ENDIF 
     417      ! 
    641418      IF((nbondj == -1).OR.(nbondj == 2)) THEN 
    642419         DO ji=1,jpi 
    643420            ua_e(ji,2) = ubdy_s(ji) * hur_e(ji,2) 
    644 ! Specified fluxes: 
     421            ! Specified fluxes: 
    645422            va_e(ji,2) = vbdy_s(ji) * hvr_e(ji,2) 
    646 ! Characteristics method: 
    647 !alt            va_e(ji,2) = 0.5_wp * ( vbdy_s(ji) * hvr_e(ji,2) + va_e(ji,3) & 
    648 !alt                       &           - sqrt(grav * hvr_e(ji,2)) * (sshn_e(ji,3) - hbdy_s(ji)) ) 
    649          END DO 
    650       ENDIF 
    651  
     423            ! Characteristics method: 
     424            !alt            va_e(ji,2) = 0.5_wp * ( vbdy_s(ji) * hvr_e(ji,2) + va_e(ji,3) & 
     425            !alt                       &           - sqrt(grav * hvr_e(ji,2)) * (sshn_e(ji,3) - hbdy_s(ji)) ) 
     426         END DO 
     427      ENDIF 
     428      ! 
    652429      IF((nbondj == 1).OR.(nbondj == 2)) THEN 
    653430         DO ji=1,jpi 
    654431            ua_e(ji,nlcj-1) = ubdy_n(ji) * hur_e(ji,nlcj-1) 
    655 ! Specified fluxes: 
     432            ! Specified fluxes: 
    656433            va_e(ji,nlcj-2) = vbdy_n(ji) * hvr_e(ji,nlcj-2) 
    657 ! Characteristics method: 
    658 !alt            va_e(ji,nlcj-2) = 0.5_wp * ( vbdy_n(ji) * hvr_e(ji,nlcj-2)  + va_e(ji,nlcj-3) & 
    659 !alt                            &           + sqrt(grav * hvr_e(ji,nlcj-2)) * (sshn_e(ji,nlcj-2) - hbdy_n(ji)) ) 
     434            ! Characteristics method: 
     435            !alt            va_e(ji,nlcj-2) = 0.5_wp * ( vbdy_n(ji) * hvr_e(ji,nlcj-2)  + va_e(ji,nlcj-3) & 
     436            !alt                            &           + sqrt(grav * hvr_e(ji,nlcj-2)) * (sshn_e(ji,nlcj-2) - hbdy_n(ji)) ) 
    660437         END DO 
    661438      ENDIF 
    662439      ! 
    663440   END SUBROUTINE Agrif_dyn_ts 
     441 
    664442 
    665443   SUBROUTINE Agrif_dta_ts( kt ) 
     
    672450      INTEGER :: ji, jj 
    673451      LOGICAL :: ll_int_cons 
    674       REAL(wp) :: zrhox, zrhoy, zrhot, zt 
    675       REAL(wp) :: zaa, zab, zat 
    676       REAL(wp) :: zt0, zt1 
    677       REAL(wp), POINTER, DIMENSION(:,:) :: zunb, zvnb, zsshn 
    678       REAL(wp), POINTER, DIMENSION(:,:) :: zuab, zvab, zubb, zvbb, zutn, zvtn 
    679       !!----------------------------------------------------------------------   
    680  
     452      REAL(wp) :: zrhot, zt 
     453      !!----------------------------------------------------------------------   
     454      ! 
    681455      IF( Agrif_Root() )   RETURN 
    682  
    683       ll_int_cons = ln_bt_fw ! Assume conservative temporal integration in 
    684                              ! the forward case only 
    685  
    686       zrhox = Agrif_Rhox() 
    687       zrhoy = Agrif_Rhoy() 
     456      ! 
     457      ll_int_cons = ln_bt_fw ! Assume conservative temporal integration in the forward case only 
     458      ! 
    688459      zrhot = Agrif_rhot() 
    689  
    690       IF ( kt==nit000 ) THEN ! Allocate boundary data arrays 
    691          ALLOCATE( ubdy_w(jpj), vbdy_w(jpj), hbdy_w(jpj)) 
    692          ALLOCATE( ubdy_e(jpj), vbdy_e(jpj), hbdy_e(jpj)) 
    693          ALLOCATE( ubdy_n(jpi), vbdy_n(jpi), hbdy_n(jpi)) 
    694          ALLOCATE( ubdy_s(jpi), vbdy_s(jpi), hbdy_s(jpi)) 
    695       ENDIF 
    696  
    697       CALL wrk_alloc( jpi, jpj, zunb, zvnb, zsshn ) 
    698  
     460      ! 
    699461      ! "Central" time index for interpolation: 
    700       IF (ln_bt_fw) THEN 
    701          zt = REAL(Agrif_NbStepint()+0.5_wp,wp) / zrhot 
     462      IF( ln_bt_fw ) THEN 
     463         zt = REAL( Agrif_NbStepint()+0.5_wp, wp ) / zrhot 
    702464      ELSE 
    703          zt = REAL(Agrif_NbStepint(),wp) / zrhot 
    704       ENDIF 
    705  
     465         zt = REAL( Agrif_NbStepint()       , wp ) / zrhot 
     466      ENDIF 
     467      ! 
    706468      ! Linear interpolation of sea level 
    707       Agrif_SpecialValue    = 0.e0 
     469      Agrif_SpecialValue    = 0._wp 
    708470      Agrif_UseSpecialValue = .TRUE. 
    709       CALL Agrif_Bc_variable(zsshn, sshn_id,calledweight=zt, procname=interpsshn ) 
     471      CALL Agrif_Bc_variable( sshn_id, calledweight=zt, procname=interpsshn ) 
    710472      Agrif_UseSpecialValue = .FALSE. 
    711  
     473      ! 
    712474      ! Interpolate barotropic fluxes 
    713475      Agrif_SpecialValue=0. 
    714476      Agrif_UseSpecialValue = ln_spc_dyn 
    715  
    716       IF (ll_int_cons) THEN ! Conservative interpolation 
    717          CALL wrk_alloc( jpi, jpj, zuab, zvab, zubb, zvbb, zutn, zvtn ) 
    718          zuab(:,:) = 0._wp ; zvab(:,:) = 0._wp 
    719          zubb(:,:) = 0._wp ; zvbb(:,:) = 0._wp 
    720          zutn(:,:) = 0._wp ; zvtn(:,:) = 0._wp 
    721          CALL Agrif_Bc_variable(zubb,unb_id ,calledweight=0._wp, procname=interpunb) ! Before 
    722          CALL Agrif_Bc_variable(zvbb,vnb_id ,calledweight=0._wp, procname=interpvnb) 
    723          CALL Agrif_Bc_variable(zuab,unb_id ,calledweight=1._wp, procname=interpunb) ! After 
    724          CALL Agrif_Bc_variable(zvab,vnb_id ,calledweight=1._wp, procname=interpvnb) 
    725          CALL Agrif_Bc_variable(zutn,ub2b_id,calledweight=1._wp, procname=interpub2b)! Time integrated 
    726          CALL Agrif_Bc_variable(zvtn,vb2b_id,calledweight=1._wp, procname=interpvb2b) 
    727           
     477      ! 
     478      IF( ll_int_cons ) THEN  ! Conservative interpolation 
     479         ! orders matters here !!!!!! 
     480         CALL Agrif_Bc_variable( ub2b_interp_id, calledweight=1._wp, procname=interpub2b ) ! Time integrated 
     481         CALL Agrif_Bc_variable( vb2b_interp_id, calledweight=1._wp, procname=interpvb2b ) 
     482         bdy_tinterp = 1 
     483         CALL Agrif_Bc_variable( unb_id        , calledweight=1._wp, procname=interpunb  ) ! After 
     484         CALL Agrif_Bc_variable( vnb_id        , calledweight=1._wp, procname=interpvnb  ) 
     485         bdy_tinterp = 2 
     486         CALL Agrif_Bc_variable( unb_id        , calledweight=0._wp, procname=interpunb  ) ! Before 
     487         CALL Agrif_Bc_variable( vnb_id        , calledweight=0._wp, procname=interpvnb  )          
     488      ELSE ! Linear interpolation 
     489         bdy_tinterp = 0 
     490         ubdy_w(:) = 0._wp   ;   vbdy_w(:) = 0._wp  
     491         ubdy_e(:) = 0._wp   ;   vbdy_e(:) = 0._wp  
     492         ubdy_n(:) = 0._wp   ;   vbdy_n(:) = 0._wp  
     493         ubdy_s(:) = 0._wp   ;   vbdy_s(:) = 0._wp 
     494         CALL Agrif_Bc_variable( unb_id, calledweight=zt, procname=interpunb ) 
     495         CALL Agrif_Bc_variable( vnb_id, calledweight=zt, procname=interpvnb ) 
     496      ENDIF 
     497      Agrif_UseSpecialValue = .FALSE. 
     498      !  
     499   END SUBROUTINE Agrif_dta_ts 
     500 
     501 
     502   SUBROUTINE Agrif_ssh( kt ) 
     503      !!---------------------------------------------------------------------- 
     504      !!                  ***  ROUTINE Agrif_DYN  *** 
     505      !!----------------------------------------------------------------------   
     506      INTEGER, INTENT(in) ::   kt 
     507      !! 
     508      !!----------------------------------------------------------------------   
     509      ! 
     510      IF( Agrif_Root() )   RETURN 
     511      ! 
     512      IF((nbondi == -1).OR.(nbondi == 2)) THEN 
     513         ssha(2,:)=ssha(3,:) 
     514         sshn(2,:)=sshn(3,:) 
     515      ENDIF 
     516      ! 
     517      IF((nbondi == 1).OR.(nbondi == 2)) THEN 
     518         ssha(nlci-1,:)=ssha(nlci-2,:) 
     519         sshn(nlci-1,:)=sshn(nlci-2,:) 
     520      ENDIF 
     521      ! 
     522      IF((nbondj == -1).OR.(nbondj == 2)) THEN 
     523         ssha(:,2)=ssha(:,3) 
     524         sshn(:,2)=sshn(:,3) 
     525      ENDIF 
     526      ! 
     527      IF((nbondj == 1).OR.(nbondj == 2)) THEN 
     528         ssha(:,nlcj-1)=ssha(:,nlcj-2) 
     529         sshn(:,nlcj-1)=sshn(:,nlcj-2) 
     530      ENDIF 
     531      ! 
     532   END SUBROUTINE Agrif_ssh 
     533 
     534 
     535   SUBROUTINE Agrif_ssh_ts( jn ) 
     536      !!---------------------------------------------------------------------- 
     537      !!                  ***  ROUTINE Agrif_ssh_ts  *** 
     538      !!----------------------------------------------------------------------   
     539      INTEGER, INTENT(in) ::   jn 
     540      !! 
     541      INTEGER :: ji,jj 
     542      !!----------------------------------------------------------------------   
     543      ! 
     544      IF((nbondi == -1).OR.(nbondi == 2)) THEN 
     545         DO jj = 1, jpj 
     546            ssha_e(2,jj) = hbdy_w(jj) 
     547         END DO 
     548      ENDIF 
     549      ! 
     550      IF((nbondi == 1).OR.(nbondi == 2)) THEN 
     551         DO jj = 1, jpj 
     552            ssha_e(nlci-1,jj) = hbdy_e(jj) 
     553         END DO 
     554      ENDIF 
     555      ! 
     556      IF((nbondj == -1).OR.(nbondj == 2)) THEN 
     557         DO ji = 1, jpi 
     558            ssha_e(ji,2) = hbdy_s(ji) 
     559         END DO 
     560      ENDIF 
     561      ! 
     562      IF((nbondj == 1).OR.(nbondj == 2)) THEN 
     563         DO ji = 1, jpi 
     564            ssha_e(ji,nlcj-1) = hbdy_n(ji) 
     565         END DO 
     566      ENDIF 
     567      ! 
     568   END SUBROUTINE Agrif_ssh_ts 
     569 
     570# if defined key_zdftke 
     571 
     572   SUBROUTINE Agrif_tke 
     573      !!---------------------------------------------------------------------- 
     574      !!                  ***  ROUTINE Agrif_tke  *** 
     575      !!----------------------------------------------------------------------   
     576      REAL(wp) ::   zalpha 
     577      !!----------------------------------------------------------------------   
     578      ! 
     579      zalpha = REAL( Agrif_NbStepint() + Agrif_IRhot() - 1, wp ) / REAL( Agrif_IRhot(), wp ) 
     580      IF( zalpha > 1. )   zalpha = 1. 
     581      ! 
     582      Agrif_SpecialValue    = 0.e0 
     583      Agrif_UseSpecialValue = .TRUE. 
     584      ! 
     585      CALL Agrif_Bc_variable(avm_id ,calledweight=zalpha, procname=interpavm)        
     586      ! 
     587      Agrif_UseSpecialValue = .FALSE. 
     588      ! 
     589   END SUBROUTINE Agrif_tke 
     590    
     591# endif 
     592 
     593   SUBROUTINE interptsn( ptab, i1, i2, j1, j2, k1, k2, n1, n2, before, nb, ndir ) 
     594      !!---------------------------------------------------------------------- 
     595      !!   *** ROUTINE interptsn *** 
     596      !!---------------------------------------------------------------------- 
     597      REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2,n1:n2), INTENT(inout) ::   ptab 
     598      INTEGER                                     , INTENT(in   ) ::   i1, i2, j1, j2, k1, k2, n1, n2 
     599      LOGICAL                                     , INTENT(in   ) ::   before 
     600      INTEGER                                     , INTENT(in   ) ::   nb , ndir 
     601      ! 
     602      INTEGER  ::   ji, jj, jk, jn   ! dummy loop indices 
     603      INTEGER  ::   imin, imax, jmin, jmax 
     604      REAL(wp) ::   zrhox , zalpha1, zalpha2, zalpha3 
     605      REAL(wp) ::   zalpha4, zalpha5, zalpha6, zalpha7 
     606      LOGICAL  ::   western_side, eastern_side,northern_side,southern_side 
     607      !!---------------------------------------------------------------------- 
     608      ! 
     609      IF (before) THEN          
     610         ptab(i1:i2,j1:j2,k1:k2,n1:n2) = tsn(i1:i2,j1:j2,k1:k2,n1:n2) 
     611      ELSE 
     612         ! 
     613         western_side  = (nb == 1).AND.(ndir == 1) 
     614         eastern_side  = (nb == 1).AND.(ndir == 2) 
     615         southern_side = (nb == 2).AND.(ndir == 1) 
     616         northern_side = (nb == 2).AND.(ndir == 2) 
     617         ! 
     618         zrhox = Agrif_Rhox() 
     619         !  
     620         zalpha1 = ( zrhox - 1. ) * 0.5 
     621         zalpha2 = 1. - zalpha1 
     622         !  
     623         zalpha3 = ( zrhox - 1. ) / ( zrhox + 1. ) 
     624         zalpha4 = 1. - zalpha3 
     625         !  
     626         zalpha6 = 2. * ( zrhox - 1. ) / ( zrhox + 1. ) 
     627         zalpha7 =    - ( zrhox - 1. ) / ( zrhox + 3. ) 
     628         zalpha5 = 1. - zalpha6 - zalpha7 
     629         ! 
     630         imin = i1 
     631         imax = i2 
     632         jmin = j1 
     633         jmax = j2 
     634         !  
     635         ! Remove CORNERS 
     636         IF((nbondj == -1).OR.(nbondj == 2)) jmin = 3 
     637         IF((nbondj == +1).OR.(nbondj == 2)) jmax = nlcj-2 
     638         IF((nbondi == -1).OR.(nbondi == 2)) imin = 3 
     639         IF((nbondi == +1).OR.(nbondi == 2)) imax = nlci-2         
     640         ! 
     641         IF( eastern_side ) THEN 
     642            DO jn = 1, jpts 
     643               tsa(nlci,j1:j2,k1:k2,jn) = zalpha1 * ptab(nlci,j1:j2,k1:k2,jn) + zalpha2 * ptab(nlci-1,j1:j2,k1:k2,jn) 
     644               DO jk = 1, jpkm1 
     645                  DO jj = jmin,jmax 
     646                     IF( umask(nlci-2,jj,jk) == 0._wp ) THEN 
     647                        tsa(nlci-1,jj,jk,jn) = tsa(nlci,jj,jk,jn) * tmask(nlci-1,jj,jk) 
     648                     ELSE 
     649                        tsa(nlci-1,jj,jk,jn)=(zalpha4*tsa(nlci,jj,jk,jn)+zalpha3*tsa(nlci-2,jj,jk,jn))*tmask(nlci-1,jj,jk) 
     650                        IF( un(nlci-2,jj,jk) > 0._wp ) THEN 
     651                           tsa(nlci-1,jj,jk,jn)=( zalpha6*tsa(nlci-2,jj,jk,jn)+zalpha5*tsa(nlci,jj,jk,jn) &  
     652                                 + zalpha7*tsa(nlci-3,jj,jk,jn) ) * tmask(nlci-1,jj,jk) 
     653                        ENDIF 
     654                     ENDIF 
     655                  END DO 
     656               END DO 
     657               tsa(nlci,j1:j2,k1:k2,jn) = 0._wp 
     658            END DO 
     659         ENDIF 
     660         !  
     661         IF( northern_side ) THEN             
     662            DO jn = 1, jpts 
     663               tsa(i1:i2,nlcj,k1:k2,jn) = zalpha1 * ptab(i1:i2,nlcj,k1:k2,jn) + zalpha2 * ptab(i1:i2,nlcj-1,k1:k2,jn) 
     664               DO jk = 1, jpkm1 
     665                  DO ji = imin,imax 
     666                     IF( vmask(ji,nlcj-2,jk) == 0._wp ) THEN 
     667                        tsa(ji,nlcj-1,jk,jn) = tsa(ji,nlcj,jk,jn) * tmask(ji,nlcj-1,jk) 
     668                     ELSE 
     669                        tsa(ji,nlcj-1,jk,jn)=(zalpha4*tsa(ji,nlcj,jk,jn)+zalpha3*tsa(ji,nlcj-2,jk,jn))*tmask(ji,nlcj-1,jk)         
     670                        IF (vn(ji,nlcj-2,jk) > 0._wp ) THEN 
     671                           tsa(ji,nlcj-1,jk,jn)=( zalpha6*tsa(ji,nlcj-2,jk,jn)+zalpha5*tsa(ji,nlcj,jk,jn)  & 
     672                                 + zalpha7*tsa(ji,nlcj-3,jk,jn) ) * tmask(ji,nlcj-1,jk) 
     673                        ENDIF 
     674                     ENDIF 
     675                  END DO 
     676               END DO 
     677               tsa(i1:i2,nlcj,k1:k2,jn) = 0._wp 
     678            END DO 
     679         ENDIF 
     680         ! 
     681         IF( western_side ) THEN             
     682            DO jn = 1, jpts 
     683               tsa(1,j1:j2,k1:k2,jn) = zalpha1 * ptab(1,j1:j2,k1:k2,jn) + zalpha2 * ptab(2,j1:j2,k1:k2,jn) 
     684               DO jk = 1, jpkm1 
     685                  DO jj = jmin,jmax 
     686                     IF( umask(2,jj,jk) == 0._wp ) THEN 
     687                        tsa(2,jj,jk,jn) = tsa(1,jj,jk,jn) * tmask(2,jj,jk) 
     688                     ELSE 
     689                        tsa(2,jj,jk,jn)=(zalpha4*tsa(1,jj,jk,jn)+zalpha3*tsa(3,jj,jk,jn))*tmask(2,jj,jk)         
     690                        IF( un(2,jj,jk) < 0._wp ) THEN 
     691                           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) 
     692                        ENDIF 
     693                     ENDIF 
     694                  END DO 
     695               END DO 
     696               tsa(1,j1:j2,k1:k2,jn) = 0._wp 
     697            END DO 
     698         ENDIF 
     699         ! 
     700         IF( southern_side ) THEN            
     701            DO jn = 1, jpts 
     702               tsa(i1:i2,1,k1:k2,jn) = zalpha1 * ptab(i1:i2,1,k1:k2,jn) + zalpha2 * ptab(i1:i2,2,k1:k2,jn) 
     703               DO jk = 1, jpk       
     704                  DO ji=imin,imax 
     705                     IF( vmask(ji,2,jk) == 0._wp ) THEN 
     706                        tsa(ji,2,jk,jn)=tsa(ji,1,jk,jn) * tmask(ji,2,jk) 
     707                     ELSE 
     708                        tsa(ji,2,jk,jn)=(zalpha4*tsa(ji,1,jk,jn)+zalpha3*tsa(ji,3,jk,jn))*tmask(ji,2,jk) 
     709                        IF( vn(ji,2,jk) < 0._wp ) THEN 
     710                           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) 
     711                        ENDIF 
     712                     ENDIF 
     713                  END DO 
     714               END DO 
     715               tsa(i1:i2,1,k1:k2,jn) = 0._wp 
     716            END DO 
     717         ENDIF 
     718         ! 
     719         ! Treatment of corners 
     720         !  
     721         ! East south 
     722         IF ((eastern_side).AND.((nbondj == -1).OR.(nbondj == 2))) THEN 
     723            tsa(nlci-1,2,:,:) = ptab(nlci-1,2,:,:) 
     724         ENDIF 
     725         ! East north 
     726         IF ((eastern_side).AND.((nbondj == 1).OR.(nbondj == 2))) THEN 
     727            tsa(nlci-1,nlcj-1,:,:) = ptab(nlci-1,nlcj-1,:,:) 
     728         ENDIF 
     729         ! West south 
     730         IF ((western_side).AND.((nbondj == -1).OR.(nbondj == 2))) THEN 
     731            tsa(2,2,:,:) = ptab(2,2,:,:) 
     732         ENDIF 
     733         ! West north 
     734         IF ((western_side).AND.((nbondj == 1).OR.(nbondj == 2))) THEN 
     735            tsa(2,nlcj-1,:,:) = ptab(2,nlcj-1,:,:) 
     736         ENDIF 
     737         ! 
     738      ENDIF 
     739      ! 
     740   END SUBROUTINE interptsn 
     741 
     742 
     743   SUBROUTINE interpsshn( ptab, i1, i2, j1, j2, before, nb, ndir ) 
     744      !!---------------------------------------------------------------------- 
     745      !!                  ***  ROUTINE interpsshn  *** 
     746      !!----------------------------------------------------------------------   
     747      INTEGER                         , INTENT(in   ) ::   i1, i2, j1, j2 
     748      REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) ::   ptab 
     749      LOGICAL                         , INTENT(in   ) ::   before 
     750      INTEGER                         , INTENT(in   ) ::   nb , ndir 
     751      ! 
     752      LOGICAL :: western_side, eastern_side,northern_side,southern_side 
     753      !!----------------------------------------------------------------------   
     754      ! 
     755      IF( before) THEN 
     756         ptab(i1:i2,j1:j2) = sshn(i1:i2,j1:j2) 
     757      ELSE 
     758         western_side  = (nb == 1).AND.(ndir == 1) 
     759         eastern_side  = (nb == 1).AND.(ndir == 2) 
     760         southern_side = (nb == 2).AND.(ndir == 1) 
     761         northern_side = (nb == 2).AND.(ndir == 2) 
     762         IF(western_side)  hbdy_w(j1:j2) = ptab(i1,j1:j2) * tmask(i1,j1:j2,1) 
     763         IF(eastern_side)  hbdy_e(j1:j2) = ptab(i1,j1:j2) * tmask(i1,j1:j2,1) 
     764         IF(southern_side) hbdy_s(i1:i2) = ptab(i1:i2,j1) * tmask(i1:i2,j1,1) 
     765         IF(northern_side) hbdy_n(i1:i2) = ptab(i1:i2,j1) * tmask(i1:i2,j1,1) 
     766      ENDIF 
     767      ! 
     768   END SUBROUTINE interpsshn 
     769 
     770 
     771   SUBROUTINE interpun( ptab, i1, i2, j1, j2, k1, k2, before ) 
     772      !!---------------------------------------------------------------------- 
     773      !!   *** ROUTINE interpun *** 
     774      !!---------------------------------------------------------------------- 
     775      INTEGER                               , INTENT(in   ) ::   i1, i2, j1, j2, k1, k2 
     776      REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) ::   ptab 
     777      LOGICAL                               , INTENT(in   ) ::   before 
     778      ! 
     779      INTEGER  ::   ji, jj, jk 
     780      REAL(wp) ::   zrhoy   
     781      !!---------------------------------------------------------------------- 
     782      ! 
     783      IF( before ) THEN  
     784         DO jk = k1, jpk 
     785            ptab(i1:i2,j1:j2,jk) = e2u(i1:i2,j1:j2) * e3u_n(i1:i2,j1:j2,jk) * un(i1:i2,j1:j2,jk) 
     786         END DO 
     787      ELSE 
     788         zrhoy = Agrif_Rhoy() 
     789         DO jk = 1, jpkm1 
     790            DO jj=j1,j2 
     791               ua(i1:i2,jj,jk) = ptab(i1:i2,jj,jk) / ( zrhoy * e2u(i1:i2,jj) * e3u_n(i1:i2,jj,jk) ) 
     792            END DO 
     793         END DO 
     794      ENDIF 
     795      !  
     796   END SUBROUTINE interpun 
     797 
     798 
     799   SUBROUTINE interpvn( ptab, i1, i2, j1, j2, k1, k2, before ) 
     800      !!---------------------------------------------------------------------- 
     801      !!   *** ROUTINE interpvn *** 
     802      !!---------------------------------------------------------------------- 
     803      INTEGER                               , INTENT(in   ) ::   i1, i2, j1, j2, k1, k2 
     804      REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) ::   ptab 
     805      LOGICAL                               , INTENT(in   ) ::   before 
     806      ! 
     807      INTEGER  ::   ji, jj, jk 
     808      REAL(wp) ::   zrhox   
     809      !!---------------------------------------------------------------------- 
     810      !       
     811      IF( before ) THEN       !interpv entre 1 et k2 et interpv2d en jpkp1 
     812         DO jk = k1, jpk 
     813            ptab(i1:i2,j1:j2,jk) = e1v(i1:i2,j1:j2) * e3v_n(i1:i2,j1:j2,jk) * vn(i1:i2,j1:j2,jk) 
     814         END DO 
     815      ELSE           
     816         zrhox= Agrif_Rhox() 
     817         DO jk = 1, jpkm1 
     818            va(i1:i2,j1:j2,jk) = ptab(i1:i2,j1:j2,jk) / ( zrhox * e1v(i1:i2,j1:j2) * e3v_n(i1:i2,j1:j2,jk) ) 
     819         END DO 
     820      ENDIF 
     821      !         
     822   END SUBROUTINE interpvn 
     823    
     824 
     825   SUBROUTINE interpunb( ptab, i1, i2, j1, j2, before, nb, ndir ) 
     826      !!---------------------------------------------------------------------- 
     827      !!                  ***  ROUTINE interpunb  *** 
     828      !!----------------------------------------------------------------------   
     829      INTEGER                         , INTENT(in   ) ::   i1, i2, j1, j2 
     830      REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) ::   ptab 
     831      LOGICAL                         , INTENT(in   ) ::   before 
     832      INTEGER                         , INTENT(in   ) ::   nb , ndir 
     833      ! 
     834      INTEGER  ::   ji, jj 
     835      REAL(wp) ::   zrhoy, zrhot, zt0, zt1, ztcoeff 
     836      LOGICAL  ::   western_side, eastern_side,northern_side,southern_side 
     837      !!----------------------------------------------------------------------   
     838      ! 
     839      IF( before ) THEN  
     840         ptab(i1:i2,j1:j2) = e2u(i1:i2,j1:j2) * hu_n(i1:i2,j1:j2) * un_b(i1:i2,j1:j2) 
     841      ELSE 
     842         western_side  = (nb == 1).AND.(ndir == 1) 
     843         eastern_side  = (nb == 1).AND.(ndir == 2) 
     844         southern_side = (nb == 2).AND.(ndir == 1) 
     845         northern_side = (nb == 2).AND.(ndir == 2) 
     846         zrhoy = Agrif_Rhoy() 
     847         zrhot = Agrif_rhot() 
     848         ! Time indexes bounds for integration 
     849         zt0 = REAL(Agrif_NbStepint()  , wp) / zrhot 
     850         zt1 = REAL(Agrif_NbStepint()+1, wp) / zrhot       
     851         ! Polynomial interpolation coefficients: 
     852         IF( bdy_tinterp == 1 ) THEN 
     853            ztcoeff = zrhot * (  zt1**2._wp * (       zt1 - 1._wp)        & 
     854               &               - zt0**2._wp * (       zt0 - 1._wp)        ) 
     855         ELSEIF( bdy_tinterp == 2 ) THEN 
     856            ztcoeff = zrhot * (  zt1        * (       zt1 - 1._wp)**2._wp & 
     857               &               - zt0        * (       zt0 - 1._wp)**2._wp )  
     858 
     859         ELSE 
     860            ztcoeff = 1 
     861         ENDIF 
     862         !    
     863         IF(western_side) THEN 
     864            ubdy_w(j1:j2) = ubdy_w(j1:j2) + ztcoeff * ptab(i1,j1:j2)   
     865         ENDIF 
     866         IF(eastern_side) THEN 
     867            ubdy_e(j1:j2) = ubdy_e(j1:j2) + ztcoeff * ptab(i1,j1:j2)   
     868         ENDIF 
     869         IF(southern_side) THEN 
     870            ubdy_s(i1:i2) = ubdy_s(i1:i2) + ztcoeff * ptab(i1:i2,j1)  
     871         ENDIF 
     872         IF(northern_side) THEN 
     873            ubdy_n(i1:i2) = ubdy_n(i1:i2) + ztcoeff * ptab(i1:i2,j1)  
     874         ENDIF 
     875         !             
     876         IF( bdy_tinterp == 0 .OR. bdy_tinterp == 2) THEN 
     877            IF(western_side) THEN 
     878               ubdy_w(j1:j2) = ubdy_w(j1:j2) / (zrhoy*e2u(i1,j1:j2)) * umask(i1,j1:j2,1) 
     879            ENDIF 
     880            IF(eastern_side) THEN 
     881               ubdy_e(j1:j2) = ubdy_e(j1:j2) / (zrhoy*e2u(i1,j1:j2)) * umask(i1,j1:j2,1) 
     882            ENDIF 
     883            IF(southern_side) THEN 
     884               ubdy_s(i1:i2) = ubdy_s(i1:i2) / (zrhoy*e2u(i1:i2,j1)) * umask(i1:i2,j1,1) 
     885            ENDIF 
     886            IF(northern_side) THEN 
     887               ubdy_n(i1:i2) = ubdy_n(i1:i2) / (zrhoy*e2u(i1:i2,j1)) * umask(i1:i2,j1,1) 
     888            ENDIF 
     889         ENDIF 
     890      ENDIF 
     891      !  
     892   END SUBROUTINE interpunb 
     893 
     894 
     895   SUBROUTINE interpvnb( ptab, i1, i2, j1, j2, before, nb, ndir ) 
     896      !!---------------------------------------------------------------------- 
     897      !!                  ***  ROUTINE interpvnb  *** 
     898      !!----------------------------------------------------------------------   
     899      INTEGER                         , INTENT(in   ) ::   i1, i2, j1, j2 
     900      REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) ::   ptab 
     901      LOGICAL                         , INTENT(in   ) ::   before 
     902      INTEGER                         , INTENT(in   ) ::   nb , ndir 
     903      ! 
     904      INTEGER  ::   ji,jj 
     905      REAL(wp) ::   zrhox, zrhot, zt0, zt1, ztcoeff    
     906      LOGICAL  ::   western_side, eastern_side,northern_side,southern_side 
     907      !!----------------------------------------------------------------------   
     908      !  
     909      IF( before ) THEN  
     910         ptab(i1:i2,j1:j2) = e1v(i1:i2,j1:j2) * hv_n(i1:i2,j1:j2) * vn_b(i1:i2,j1:j2) 
     911      ELSE 
     912         western_side  = (nb == 1).AND.(ndir == 1) 
     913         eastern_side  = (nb == 1).AND.(ndir == 2) 
     914         southern_side = (nb == 2).AND.(ndir == 1) 
     915         northern_side = (nb == 2).AND.(ndir == 2) 
     916         zrhox = Agrif_Rhox() 
     917         zrhot = Agrif_rhot() 
     918         ! Time indexes bounds for integration 
     919         zt0 = REAL(Agrif_NbStepint()  , wp) / zrhot 
     920         zt1 = REAL(Agrif_NbStepint()+1, wp) / zrhot       
     921         IF( bdy_tinterp == 1 ) THEN 
     922            ztcoeff = zrhot * (  zt1**2._wp * (       zt1 - 1._wp)        & 
     923               &               - zt0**2._wp * (       zt0 - 1._wp)        ) 
     924         ELSEIF( bdy_tinterp == 2 ) THEN 
     925            ztcoeff = zrhot * (  zt1        * (       zt1 - 1._wp)**2._wp & 
     926               &               - zt0        * (       zt0 - 1._wp)**2._wp )  
     927         ELSE 
     928            ztcoeff = 1 
     929         ENDIF 
     930         ! 
     931         IF(western_side) THEN 
     932            vbdy_w(j1:j2) = vbdy_w(j1:j2) + ztcoeff * ptab(i1,j1:j2)   
     933         ENDIF 
     934         IF(eastern_side) THEN 
     935            vbdy_e(j1:j2) = vbdy_e(j1:j2) + ztcoeff * ptab(i1,j1:j2)   
     936         ENDIF 
     937         IF(southern_side) THEN 
     938            vbdy_s(i1:i2) = vbdy_s(i1:i2) + ztcoeff * ptab(i1:i2,j1) 
     939         ENDIF 
     940         IF(northern_side) THEN 
     941            vbdy_n(i1:i2) = vbdy_n(i1:i2) + ztcoeff * ptab(i1:i2,j1)  
     942         ENDIF 
     943         !             
     944         IF( bdy_tinterp == 0 .OR. bdy_tinterp == 2) THEN 
     945            IF(western_side) THEN 
     946               vbdy_w(j1:j2) = vbdy_w(j1:j2) / (zrhox*e1v(i1,j1:j2))   & 
     947                     &                                  * vmask(i1,j1:j2,1) 
     948            ENDIF 
     949            IF(eastern_side) THEN 
     950               vbdy_e(j1:j2) = vbdy_e(j1:j2) / (zrhox*e1v(i1,j1:j2))   & 
     951                     &                                  * vmask(i1,j1:j2,1) 
     952            ENDIF 
     953            IF(southern_side) THEN 
     954               vbdy_s(i1:i2) = vbdy_s(i1:i2) / (zrhox*e1v(i1:i2,j1))   & 
     955                     &                                  * vmask(i1:i2,j1,1) 
     956            ENDIF 
     957            IF(northern_side) THEN 
     958               vbdy_n(i1:i2) = vbdy_n(i1:i2) / (zrhox*e1v(i1:i2,j1))   & 
     959                     &                                  * vmask(i1:i2,j1,1) 
     960            ENDIF 
     961         ENDIF 
     962      ENDIF 
     963      ! 
     964   END SUBROUTINE interpvnb 
     965 
     966 
     967   SUBROUTINE interpub2b( ptab, i1, i2, j1, j2, before, nb, ndir ) 
     968      !!---------------------------------------------------------------------- 
     969      !!                  ***  ROUTINE interpub2b  *** 
     970      !!----------------------------------------------------------------------   
     971      INTEGER                         , INTENT(in   ) ::   i1, i2, j1, j2 
     972      REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) ::   ptab 
     973      LOGICAL                         , INTENT(in   ) ::   before 
     974      INTEGER                         , INTENT(in   ) ::   nb , ndir 
     975      ! 
     976      INTEGER  ::   ji,jj 
     977      REAL(wp) ::   zrhot, zt0, zt1,zat 
     978      LOGICAL  ::   western_side, eastern_side,northern_side,southern_side 
     979      !!----------------------------------------------------------------------   
     980      IF( before ) THEN 
     981         ptab(i1:i2,j1:j2) = e2u(i1:i2,j1:j2) * ub2_b(i1:i2,j1:j2) 
     982      ELSE 
     983         western_side  = (nb == 1).AND.(ndir == 1) 
     984         eastern_side  = (nb == 1).AND.(ndir == 2) 
     985         southern_side = (nb == 2).AND.(ndir == 1) 
     986         northern_side = (nb == 2).AND.(ndir == 2) 
     987         zrhot = Agrif_rhot() 
    728988         ! Time indexes bounds for integration 
    729989         zt0 = REAL(Agrif_NbStepint()  , wp) / zrhot 
    730990         zt1 = REAL(Agrif_NbStepint()+1, wp) / zrhot 
    731  
    732991         ! Polynomial interpolation coefficients: 
    733          zaa = zrhot * (  zt1**2._wp * (       zt1 - 1._wp)        & 
    734                  &      - zt0**2._wp * (       zt0 - 1._wp)        ) 
    735          zab = zrhot * (  zt1        * (       zt1 - 1._wp)**2._wp & 
    736                  &      - zt0        * (       zt0 - 1._wp)**2._wp ) 
    737          zat = zrhot * (  zt1**2._wp * (-2._wp*zt1 + 3._wp)        & 
    738                  &      - zt0**2._wp * (-2._wp*zt0 + 3._wp)        )  
    739  
    740          ! Do time interpolation 
    741          IF((nbondi == -1).OR.(nbondi == 2)) THEN 
    742             DO jj=1,jpj 
    743                zunb(2,jj) = zaa * zuab(2,jj) + zab * zubb(2,jj) + zat * zutn(2,jj) 
    744                zvnb(2,jj) = zaa * zvab(2,jj) + zab * zvbb(2,jj) + zat * zvtn(2,jj) 
    745             END DO 
    746          ENDIF 
    747          IF((nbondi == 1).OR.(nbondi == 2)) THEN 
    748             DO jj=1,jpj 
    749                zunb(nlci-2,jj) = zaa * zuab(nlci-2,jj) + zab * zubb(nlci-2,jj) + zat * zutn(nlci-2,jj) 
    750                zvnb(nlci-1,jj) = zaa * zvab(nlci-1,jj) + zab * zvbb(nlci-1,jj) + zat * zvtn(nlci-1,jj) 
    751             END DO 
    752          ENDIF 
    753          IF((nbondj == -1).OR.(nbondj == 2)) THEN 
    754             DO ji=1,jpi 
    755                zunb(ji,2) = zaa * zuab(ji,2) + zab * zubb(ji,2) + zat * zutn(ji,2) 
    756                zvnb(ji,2) = zaa * zvab(ji,2) + zab * zvbb(ji,2) + zat * zvtn(ji,2) 
    757             END DO 
    758          ENDIF 
    759          IF((nbondj == 1).OR.(nbondj == 2)) THEN 
    760             DO ji=1,jpi 
    761                zunb(ji,nlcj-1) = zaa * zuab(ji,nlcj-1) + zab * zubb(ji,nlcj-1) + zat * zutn(ji,nlcj-1) 
    762                zvnb(ji,nlcj-2) = zaa * zvab(ji,nlcj-2) + zab * zvbb(ji,nlcj-2) + zat * zvtn(ji,nlcj-2) 
    763             END DO 
    764          ENDIF 
    765          CALL wrk_dealloc( jpi, jpj, zuab, zvab, zubb, zvbb, zutn, zvtn ) 
    766  
    767       ELSE ! Linear interpolation 
    768          zunb(:,:) = 0._wp ; zvnb(:,:) = 0._wp 
    769          CALL Agrif_Bc_variable(zunb,unb_id,calledweight=zt, procname=interpunb) 
    770          CALL Agrif_Bc_variable(zvnb,vnb_id,calledweight=zt, procname=interpvnb) 
    771       ENDIF 
    772       Agrif_UseSpecialValue = .FALSE. 
    773  
    774       ! Fill boundary data arrays: 
    775       IF((nbondi == -1).OR.(nbondi == 2)) THEN 
    776          DO jj=1,jpj 
    777                ubdy_w(jj) = (zunb(2,jj)/(zrhoy*e2u(2,jj))) * umask(2,jj,1) 
    778                vbdy_w(jj) = (zvnb(2,jj)/(zrhox*e1v(2,jj))) * vmask(2,jj,1) 
    779                hbdy_w(jj) = zsshn(2,jj) * tmask(2,jj,1) 
    780          END DO 
    781       ENDIF 
    782  
    783       IF((nbondi == 1).OR.(nbondi == 2)) THEN 
    784          DO jj=1,jpj 
    785                ubdy_e(jj) = zunb(nlci-2,jj)/(zrhoy*e2u(nlci-2,jj)) * umask(nlci-2,jj,1) 
    786                vbdy_e(jj) = zvnb(nlci-1,jj)/(zrhox*e1v(nlci-1,jj)) * vmask(nlci-1,jj,1) 
    787                hbdy_e(jj) = zsshn(nlci-1,jj) * tmask(nlci-1,jj,1) 
    788          END DO 
    789       ENDIF 
    790  
    791       IF((nbondj == -1).OR.(nbondj == 2)) THEN 
    792          DO ji=1,jpi 
    793                ubdy_s(ji) = zunb(ji,2)/(zrhoy*e2u(ji,2)) * umask(ji,2,1) 
    794                vbdy_s(ji) = zvnb(ji,2)/(zrhox*e1v(ji,2)) * vmask(ji,2,1) 
    795                hbdy_s(ji) = zsshn(ji,2) * tmask(ji,2,1) 
    796          END DO 
    797       ENDIF 
    798  
    799       IF((nbondj == 1).OR.(nbondj == 2)) THEN 
    800          DO ji=1,jpi 
    801             ubdy_n(ji) = zunb(ji,nlcj-1)/(zrhoy*e2u(ji,nlcj-1)) * umask(ji,nlcj-1,1) 
    802             vbdy_n(ji) = zvnb(ji,nlcj-2)/(zrhox*e1v(ji,nlcj-2)) * vmask(ji,nlcj-2,1) 
    803             hbdy_n(ji) = zsshn(ji,nlcj-1) * tmask(ji,nlcj-1,1) 
    804          END DO 
    805       ENDIF 
    806  
    807       CALL wrk_dealloc( jpi, jpj, zunb, zvnb, zsshn ) 
    808  
    809    END SUBROUTINE Agrif_dta_ts 
    810  
    811    SUBROUTINE Agrif_ssh( kt ) 
    812       !!---------------------------------------------------------------------- 
    813       !!                  ***  ROUTINE Agrif_DYN  *** 
    814       !!----------------------------------------------------------------------   
    815       INTEGER, INTENT(in) ::   kt 
    816       !! 
    817       !!----------------------------------------------------------------------   
    818  
    819       IF( Agrif_Root() )   RETURN 
    820  
    821  
    822       IF((nbondi == -1).OR.(nbondi == 2)) THEN 
    823          ssha(2,:)=ssha(3,:) 
    824          sshn(2,:)=sshn(3,:) 
    825       ENDIF 
    826  
    827       IF((nbondi == 1).OR.(nbondi == 2)) THEN 
    828          ssha(nlci-1,:)=ssha(nlci-2,:) 
    829          sshn(nlci-1,:)=sshn(nlci-2,:)         
    830       ENDIF 
    831  
    832       IF((nbondj == -1).OR.(nbondj == 2)) THEN 
    833          ssha(:,2)=ssha(:,3) 
    834          sshn(:,2)=sshn(:,3) 
    835       ENDIF 
    836  
    837       IF((nbondj == 1).OR.(nbondj == 2)) THEN 
    838          ssha(:,nlcj-1)=ssha(:,nlcj-2) 
    839          sshn(:,nlcj-1)=sshn(:,nlcj-2)                 
    840       ENDIF 
    841  
    842    END SUBROUTINE Agrif_ssh 
    843  
    844    SUBROUTINE Agrif_ssh_ts( jn ) 
    845       !!---------------------------------------------------------------------- 
    846       !!                  ***  ROUTINE Agrif_ssh_ts  *** 
    847       !!----------------------------------------------------------------------   
    848       INTEGER, INTENT(in) ::   jn 
    849       !! 
    850       INTEGER :: ji,jj 
    851       !!----------------------------------------------------------------------   
    852  
    853       IF((nbondi == -1).OR.(nbondi == 2)) THEN 
    854          DO jj=1,jpj 
    855             ssha_e(2,jj) = hbdy_w(jj) 
    856          END DO 
    857       ENDIF 
    858  
    859       IF((nbondi == 1).OR.(nbondi == 2)) THEN 
    860          DO jj=1,jpj 
    861             ssha_e(nlci-1,jj) = hbdy_e(jj) 
    862          END DO 
    863       ENDIF 
    864  
    865       IF((nbondj == -1).OR.(nbondj == 2)) THEN 
    866          DO ji=1,jpi 
    867             ssha_e(ji,2) = hbdy_s(ji) 
    868          END DO 
    869       ENDIF 
    870  
    871       IF((nbondj == 1).OR.(nbondj == 2)) THEN 
    872          DO ji=1,jpi 
    873             ssha_e(ji,nlcj-1) = hbdy_n(ji) 
    874          END DO 
    875       ENDIF 
    876  
    877    END SUBROUTINE Agrif_ssh_ts 
    878  
    879    SUBROUTINE interpsshn(tabres,i1,i2,j1,j2) 
    880       !!---------------------------------------------------------------------- 
    881       !!                  ***  ROUTINE interpsshn  *** 
    882       !!----------------------------------------------------------------------   
    883       INTEGER, INTENT(in) :: i1,i2,j1,j2 
    884       REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) :: tabres 
    885       !! 
    886       INTEGER :: ji,jj 
    887       !!----------------------------------------------------------------------   
    888  
    889       tabres(i1:i2,j1:j2) = sshn(i1:i2,j1:j2) 
    890  
    891    END SUBROUTINE interpsshn 
    892  
    893    SUBROUTINE interpu(tabres,i1,i2,j1,j2,k1,k2) 
    894       !!---------------------------------------------------------------------- 
    895       !!                  ***  ROUTINE interpu  *** 
    896       !!----------------------------------------------------------------------   
    897       INTEGER, INTENT(in) :: i1,i2,j1,j2,k1,k2 
    898       REAL(wp),DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) :: tabres 
    899       !! 
    900       INTEGER :: ji,jj,jk 
    901       !!----------------------------------------------------------------------   
    902  
    903       DO jk=k1,k2 
    904          DO jj=j1,j2 
    905             DO ji=i1,i2 
    906                tabres(ji,jj,jk) = e2u(ji,jj) * un(ji,jj,jk) 
    907                tabres(ji,jj,jk) = tabres(ji,jj,jk) * fse3u_n(ji,jj,jk) 
    908             END DO 
    909          END DO 
    910       END DO 
    911    END SUBROUTINE interpu 
    912  
    913  
    914    SUBROUTINE interpu2d(tabres,i1,i2,j1,j2) 
    915       !!---------------------------------------------------------------------- 
    916       !!                  ***  ROUTINE interpu2d  *** 
    917       !!----------------------------------------------------------------------   
    918       INTEGER, INTENT(in) :: i1,i2,j1,j2 
    919       REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) :: tabres 
    920       !! 
    921       INTEGER :: ji,jj 
    922       !!----------------------------------------------------------------------   
    923  
    924       DO jj=j1,j2 
    925          DO ji=i1,i2 
    926             tabres(ji,jj) = e2u(ji,jj) * ((gcx(ji+1,jj) - gcx(ji,jj))/e1u(ji,jj)) & 
    927                * umask(ji,jj,1) 
    928          END DO 
    929       END DO 
    930  
    931    END SUBROUTINE interpu2d 
    932  
    933  
    934    SUBROUTINE interpv(tabres,i1,i2,j1,j2,k1,k2) 
    935       !!---------------------------------------------------------------------- 
    936       !!                  ***  ROUTINE interpv  *** 
    937       !!----------------------------------------------------------------------   
    938       INTEGER, INTENT(in) :: i1,i2,j1,j2,k1,k2 
    939       REAL(wp),DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) :: tabres 
    940       !! 
     992         zat = zrhot * (  zt1**2._wp * (-2._wp*zt1 + 3._wp)    & 
     993            &           - zt0**2._wp * (-2._wp*zt0 + 3._wp)    )  
     994         !  
     995         IF(western_side ) ubdy_w(j1:j2) = zat * ptab(i1,j1:j2)   
     996         IF(eastern_side ) ubdy_e(j1:j2) = zat * ptab(i1,j1:j2)   
     997         IF(southern_side) ubdy_s(i1:i2) = zat * ptab(i1:i2,j1)  
     998         IF(northern_side) ubdy_n(i1:i2) = zat * ptab(i1:i2,j1)  
     999      ENDIF 
     1000      !  
     1001   END SUBROUTINE interpub2b 
     1002    
     1003 
     1004   SUBROUTINE interpvb2b( ptab, i1, i2, j1, j2, before, nb, ndir ) 
     1005      !!---------------------------------------------------------------------- 
     1006      !!                  ***  ROUTINE interpvb2b  *** 
     1007      !!----------------------------------------------------------------------   
     1008      INTEGER                         , INTENT(in   ) ::   i1, i2, j1, j2 
     1009      REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) ::   ptab 
     1010      LOGICAL                         , INTENT(in   ) ::   before 
     1011      INTEGER                         , INTENT(in   ) ::   nb , ndir 
     1012      ! 
     1013      INTEGER ::   ji,jj 
     1014      REAL(wp) ::   zrhot, zt0, zt1,zat 
     1015      LOGICAL ::   western_side, eastern_side,northern_side,southern_side 
     1016      !!----------------------------------------------------------------------   
     1017      ! 
     1018      IF( before ) THEN 
     1019         ptab(i1:i2,j1:j2) = e1v(i1:i2,j1:j2) * vb2_b(i1:i2,j1:j2) 
     1020      ELSE       
     1021         western_side  = (nb == 1).AND.(ndir == 1) 
     1022         eastern_side  = (nb == 1).AND.(ndir == 2) 
     1023         southern_side = (nb == 2).AND.(ndir == 1) 
     1024         northern_side = (nb == 2).AND.(ndir == 2) 
     1025         zrhot = Agrif_rhot() 
     1026         ! Time indexes bounds for integration 
     1027         zt0 = REAL(Agrif_NbStepint()  , wp) / zrhot 
     1028         zt1 = REAL(Agrif_NbStepint()+1, wp) / zrhot 
     1029         ! Polynomial interpolation coefficients: 
     1030         zat = zrhot * (  zt1**2._wp * (-2._wp*zt1 + 3._wp)    & 
     1031            &           - zt0**2._wp * (-2._wp*zt0 + 3._wp)    )  
     1032         ! 
     1033         IF(western_side )   vbdy_w(j1:j2) = zat * ptab(i1,j1:j2)   
     1034         IF(eastern_side )   vbdy_e(j1:j2) = zat * ptab(i1,j1:j2)   
     1035         IF(southern_side)   vbdy_s(i1:i2) = zat * ptab(i1:i2,j1)  
     1036         IF(northern_side)   vbdy_n(i1:i2) = zat * ptab(i1:i2,j1)  
     1037      ENDIF 
     1038      !       
     1039   END SUBROUTINE interpvb2b 
     1040 
     1041 
     1042   SUBROUTINE interpe3t( ptab, i1, i2, j1, j2, k1, k2, before, nb, ndir ) 
     1043      !!---------------------------------------------------------------------- 
     1044      !!                  ***  ROUTINE interpe3t  *** 
     1045      !!----------------------------------------------------------------------   
     1046      INTEGER                              , INTENT(in   ) :: i1, i2, j1, j2, k1, k2 
     1047      REAL(wp),DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) :: ptab 
     1048      LOGICAL                              , INTENT(in   ) :: before 
     1049      INTEGER                              , INTENT(in   ) :: nb , ndir 
     1050      ! 
    9411051      INTEGER :: ji, jj, jk 
    942       !!----------------------------------------------------------------------   
    943  
    944       DO jk=k1,k2 
    945          DO jj=j1,j2 
    946             DO ji=i1,i2 
    947                tabres(ji,jj,jk) = e1v(ji,jj) * vn(ji,jj,jk) 
    948                tabres(ji,jj,jk) = tabres(ji,jj,jk) * fse3v_n(ji,jj,jk) 
    949             END DO 
    950          END DO 
    951       END DO 
    952  
    953    END SUBROUTINE interpv 
    954  
    955  
    956    SUBROUTINE interpv2d(tabres,i1,i2,j1,j2) 
    957       !!---------------------------------------------------------------------- 
    958       !!                  ***  ROUTINE interpu2d  *** 
    959       !!----------------------------------------------------------------------   
    960       INTEGER, INTENT(in) :: i1,i2,j1,j2 
    961       REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) :: tabres 
    962       !! 
    963       INTEGER :: ji,jj 
    964       !!----------------------------------------------------------------------   
    965  
    966       DO jj=j1,j2 
    967          DO ji=i1,i2 
    968             tabres(ji,jj) = e1v(ji,jj) * ((gcx(ji,jj+1) - gcx(ji,jj))/e2v(ji,jj)) & 
    969                * vmask(ji,jj,1) 
    970          END DO 
    971       END DO 
    972  
    973    END SUBROUTINE interpv2d 
    974  
    975    SUBROUTINE interpunb(tabres,i1,i2,j1,j2) 
    976       !!---------------------------------------------------------------------- 
    977       !!                  ***  ROUTINE interpunb  *** 
    978       !!----------------------------------------------------------------------   
    979       INTEGER, INTENT(in) :: i1,i2,j1,j2 
    980       REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) :: tabres 
    981       !! 
    982       INTEGER :: ji,jj 
    983       !!----------------------------------------------------------------------   
    984  
    985       DO jj=j1,j2 
    986          DO ji=i1,i2 
    987             tabres(ji,jj) = un_b(ji,jj) * e2u(ji,jj) * hu(ji,jj)  
    988          END DO 
    989       END DO 
    990  
    991    END SUBROUTINE interpunb 
    992  
    993    SUBROUTINE interpvnb(tabres,i1,i2,j1,j2) 
    994       !!---------------------------------------------------------------------- 
    995       !!                  ***  ROUTINE interpvnb  *** 
    996       !!----------------------------------------------------------------------   
    997       INTEGER, INTENT(in) :: i1,i2,j1,j2 
    998       REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) :: tabres 
    999       !! 
    1000       INTEGER :: ji,jj 
    1001       !!----------------------------------------------------------------------   
    1002  
    1003       DO jj=j1,j2 
    1004          DO ji=i1,i2 
    1005             tabres(ji,jj) = vn_b(ji,jj) * e1v(ji,jj) * hv(ji,jj) 
    1006          END DO 
    1007       END DO 
    1008  
    1009    END SUBROUTINE interpvnb 
    1010  
    1011    SUBROUTINE interpub2b(tabres,i1,i2,j1,j2) 
    1012       !!---------------------------------------------------------------------- 
    1013       !!                  ***  ROUTINE interpub2b  *** 
    1014       !!----------------------------------------------------------------------   
    1015       INTEGER, INTENT(in) :: i1,i2,j1,j2 
    1016       REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) :: tabres 
    1017       !! 
    1018       INTEGER :: ji,jj 
    1019       !!----------------------------------------------------------------------   
    1020  
    1021       DO jj=j1,j2 
    1022          DO ji=i1,i2 
    1023             tabres(ji,jj) = ub2_b(ji,jj) * e2u(ji,jj) 
    1024          END DO 
    1025       END DO 
    1026  
    1027    END SUBROUTINE interpub2b 
    1028  
    1029    SUBROUTINE interpvb2b(tabres,i1,i2,j1,j2) 
    1030       !!---------------------------------------------------------------------- 
    1031       !!                  ***  ROUTINE interpvb2b  *** 
    1032       !!----------------------------------------------------------------------   
    1033       INTEGER, INTENT(in) :: i1,i2,j1,j2 
    1034       REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) :: tabres 
    1035       !! 
    1036       INTEGER :: ji,jj 
    1037       !!----------------------------------------------------------------------   
    1038  
    1039       DO jj=j1,j2 
    1040          DO ji=i1,i2 
    1041             tabres(ji,jj) = vb2_b(ji,jj) * e1v(ji,jj) 
    1042          END DO 
    1043       END DO 
    1044  
    1045    END SUBROUTINE interpvb2b 
     1052      LOGICAL :: western_side, eastern_side, northern_side, southern_side 
     1053      REAL(wp) :: ztmpmsk       
     1054      !!----------------------------------------------------------------------   
     1055      !     
     1056      IF( before ) THEN 
     1057         ptab(i1:i2,j1:j2,k1:k2) = tmask(i1:i2,j1:j2,k1:k2) * e3t_0(i1:i2,j1:j2,k1:k2) 
     1058      ELSE 
     1059         western_side  = (nb == 1).AND.(ndir == 1) 
     1060         eastern_side  = (nb == 1).AND.(ndir == 2) 
     1061         southern_side = (nb == 2).AND.(ndir == 1) 
     1062         northern_side = (nb == 2).AND.(ndir == 2) 
     1063 
     1064         DO jk = k1, k2 
     1065            DO jj = j1, j2 
     1066               DO ji = i1, i2 
     1067                  ! Get velocity mask at boundary edge points: 
     1068                  IF( western_side )   ztmpmsk = umask(ji    ,jj    ,1) 
     1069                  IF( eastern_side )   ztmpmsk = umask(nlci-2,jj    ,1) 
     1070                  IF( northern_side)   ztmpmsk = vmask(ji    ,nlcj-2,1) 
     1071                  IF( southern_side)   ztmpmsk = vmask(ji    ,2     ,1) 
     1072                  ! 
     1073                  IF( ABS( ptab(ji,jj,jk) - tmask(ji,jj,jk) * e3t_0(ji,jj,jk) )*ztmpmsk > 1.D-2) THEN 
     1074                     IF (western_side) THEN 
     1075                        WRITE(numout,*) 'ERROR bathymetry merge at the western border ji,jj,jk ', ji+nimpp-1,jj+njmpp-1,jk 
     1076                     ELSEIF (eastern_side) THEN 
     1077                        WRITE(numout,*) 'ERROR bathymetry merge at the eastern border ji,jj,jk ', ji+nimpp-1,jj+njmpp-1,jk 
     1078                     ELSEIF (southern_side) THEN 
     1079                        WRITE(numout,*) 'ERROR bathymetry merge at the southern border ji,jj,jk', ji+nimpp-1,jj+njmpp-1,jk 
     1080                     ELSEIF (northern_side) THEN 
     1081                        WRITE(numout,*) 'ERROR bathymetry merge at the northen border ji,jj,jk', ji+nimpp-1,jj+njmpp-1,jk 
     1082                     ENDIF 
     1083                     WRITE(numout,*) '      ptab(ji,jj,jk), e3t(ji,jj,jk) ', ptab(ji,jj,jk), e3t_0(ji,jj,jk) 
     1084                     kindic_agr = kindic_agr + 1 
     1085                  ENDIF 
     1086               END DO 
     1087            END DO 
     1088         END DO 
     1089         ! 
     1090      ENDIF 
     1091      !  
     1092   END SUBROUTINE interpe3t 
     1093 
     1094 
     1095   SUBROUTINE interpumsk( ptab, i1, i2, j1, j2, k1, k2, before, nb, ndir ) 
     1096      !!---------------------------------------------------------------------- 
     1097      !!                  ***  ROUTINE interpumsk  *** 
     1098      !!----------------------------------------------------------------------   
     1099      INTEGER                              , INTENT(in   ) ::   i1, i2, j1, j2, k1, k2 
     1100      REAL(wp),DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) ::   ptab 
     1101      LOGICAL                              , INTENT(in   ) ::   before 
     1102      INTEGER                              , INTENT(in   ) ::   nb , ndir 
     1103      ! 
     1104      INTEGER ::   ji, jj, jk 
     1105      LOGICAL ::   western_side, eastern_side    
     1106      !!----------------------------------------------------------------------   
     1107      !     
     1108      IF( before ) THEN 
     1109         ptab(i1:i2,j1:j2,k1:k2) = umask(i1:i2,j1:j2,k1:k2) 
     1110      ELSE 
     1111         western_side = (nb == 1).AND.(ndir == 1) 
     1112         eastern_side = (nb == 1).AND.(ndir == 2) 
     1113         DO jk = k1, k2 
     1114            DO jj = j1, j2 
     1115               DO ji = i1, i2 
     1116                   ! Velocity mask at boundary edge points: 
     1117                  IF (ABS(ptab(ji,jj,jk) - umask(ji,jj,jk)) > 1.D-2) THEN 
     1118                     IF (western_side) THEN 
     1119                        WRITE(numout,*) 'ERROR with umask at the western border ji,jj,jk ', ji+nimpp-1,jj+njmpp-1,jk 
     1120                        WRITE(numout,*) '      masks: parent, child ', ptab(ji,jj,jk), umask(ji,jj,jk) 
     1121                        kindic_agr = kindic_agr + 1 
     1122                     ELSEIF (eastern_side) THEN 
     1123                        WRITE(numout,*) 'ERROR with umask at the eastern border ji,jj,jk ', ji+nimpp-1,jj+njmpp-1,jk 
     1124                        WRITE(numout,*) '      masks: parent, child ', ptab(ji,jj,jk), umask(ji,jj,jk) 
     1125                        kindic_agr = kindic_agr + 1 
     1126                     ENDIF 
     1127                  ENDIF 
     1128               END DO 
     1129            END DO 
     1130         END DO 
     1131         ! 
     1132      ENDIF 
     1133      !  
     1134   END SUBROUTINE interpumsk 
     1135 
     1136 
     1137   SUBROUTINE interpvmsk( ptab, i1, i2, j1, j2, k1, k2, before, nb, ndir ) 
     1138      !!---------------------------------------------------------------------- 
     1139      !!                  ***  ROUTINE interpvmsk  *** 
     1140      !!----------------------------------------------------------------------   
     1141      INTEGER                              , INTENT(in   ) ::   i1,i2,j1,j2,k1,k2 
     1142      REAL(wp),DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) ::   ptab 
     1143      LOGICAL                              , INTENT(in   ) ::   before 
     1144      INTEGER                              , INTENT(in   ) :: nb , ndir 
     1145      ! 
     1146      INTEGER ::   ji, jj, jk 
     1147      LOGICAL ::   northern_side, southern_side      
     1148      !!----------------------------------------------------------------------   
     1149      !     
     1150      IF( before ) THEN 
     1151         ptab(i1:i2,j1:j2,k1:k2) = vmask(i1:i2,j1:j2,k1:k2) 
     1152      ELSE 
     1153         southern_side = (nb == 2).AND.(ndir == 1) 
     1154         northern_side = (nb == 2).AND.(ndir == 2) 
     1155         DO jk = k1, k2 
     1156            DO jj = j1, j2 
     1157               DO ji = i1, i2 
     1158                   ! Velocity mask at boundary edge points: 
     1159                  IF (ABS(ptab(ji,jj,jk) - vmask(ji,jj,jk)) > 1.D-2) THEN 
     1160                     IF (southern_side) THEN 
     1161                        WRITE(numout,*) 'ERROR with vmask at the southern border ji,jj,jk ', ji+nimpp-1,jj+njmpp-1,jk 
     1162                        WRITE(numout,*) '      masks: parent, child ', ptab(ji,jj,jk), vmask(ji,jj,jk) 
     1163                        kindic_agr = kindic_agr + 1 
     1164                     ELSEIF (northern_side) THEN 
     1165                        WRITE(numout,*) 'ERROR with vmask at the northern border ji,jj,jk ', ji+nimpp-1,jj+njmpp-1,jk 
     1166                        WRITE(numout,*) '      masks: parent, child ', ptab(ji,jj,jk), vmask(ji,jj,jk) 
     1167                        kindic_agr = kindic_agr + 1 
     1168                     ENDIF 
     1169                  ENDIF 
     1170               END DO 
     1171            END DO 
     1172         END DO 
     1173         ! 
     1174      ENDIF 
     1175      !  
     1176   END SUBROUTINE interpvmsk 
     1177 
     1178# if defined key_zdftke 
     1179 
     1180   SUBROUTINE interpavm( ptab, i1, i2, j1, j2, k1, k2, before ) 
     1181      !!---------------------------------------------------------------------- 
     1182      !!                  ***  ROUTINE interavm  *** 
     1183      !!----------------------------------------------------------------------   
     1184      INTEGER                              , INTENT(in   ) ::   i1, i2, j1, j2, k1, k2 
     1185      REAL(wp),DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) ::   ptab 
     1186      LOGICAL                              , INTENT(in   ) ::   before 
     1187      !!----------------------------------------------------------------------   
     1188      !       
     1189      IF( before ) THEN 
     1190         ptab (i1:i2,j1:j2,k1:k2) = avm_k(i1:i2,j1:j2,k1:k2) 
     1191      ELSE 
     1192         avm_k(i1:i2,j1:j2,k1:k2) = ptab (i1:i2,j1:j2,k1:k2) 
     1193      ENDIF 
     1194      ! 
     1195   END SUBROUTINE interpavm 
     1196 
     1197# endif /* key_zdftke */ 
    10461198 
    10471199#else 
Note: See TracChangeset for help on using the changeset viewer.