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 12229 for NEMO/branches/2019/dev_r11943_MERGE_2019/src/NST/agrif_oce_interp.F90 – NEMO

Ignore:
Timestamp:
2019-12-12T17:41:04+01:00 (4 years ago)
Author:
acc
Message:

2019/dev_r11943_MERGE_2019: Merge in dev_AGRIF-01-05_merged. Fully SETTE tested

File:
1 edited

Legend:

Unmodified
Added
Removed
  • NEMO/branches/2019/dev_r11943_MERGE_2019/src/NST/agrif_oce_interp.F90

    r11949 r12229  
    3333   USE agrif_oce_sponge 
    3434   USE lib_mpp 
     35   USE vremap 
    3536  
    3637   IMPLICIT NONE 
    3738   PRIVATE 
    3839 
    39    PUBLIC   Agrif_dyn, Agrif_ssh, Agrif_dyn_ts, Agrif_ssh_ts, Agrif_dta_ts 
     40   PUBLIC   Agrif_dyn, Agrif_ssh, Agrif_dyn_ts, Agrif_dyn_ts_flux, Agrif_ssh_ts, Agrif_dta_ts 
    4041   PUBLIC   Agrif_tra, Agrif_avm 
    4142   PUBLIC   interpun , interpvn 
    4243   PUBLIC   interptsn, interpsshn, interpavm 
    4344   PUBLIC   interpunb, interpvnb , interpub2b, interpvb2b 
    44    PUBLIC   interpe3t, interpumsk, interpvmsk 
    45  
     45   PUBLIC   interpe3t 
     46#if defined key_vertical 
     47   PUBLIC   interpht0, interpmbkt 
     48# endif 
    4649   INTEGER ::   bdy_tinterp = 0 
    4750 
     
    7881      ! 
    7982      INTEGER ::   ji, jj, jk       ! dummy loop indices 
    80       INTEGER ::   j1, j2, i1, i2 
    8183      INTEGER ::   ibdy1, jbdy1, ibdy2, jbdy2 
    8284      REAL(wp), DIMENSION(jpi,jpj) ::   zub, zvb 
     
    9395      Agrif_UseSpecialValue = .FALSE. 
    9496      ! 
    95       ! prevent smoothing in ghost cells 
    96       i1 =  1   ;   i2 = nlci 
    97       j1 =  1   ;   j2 = nlcj 
    98       IF( nbondj == -1 .OR. nbondj == 2 )   j1 = 2 + nbghostcells 
    99       IF( nbondj == +1 .OR. nbondj == 2 )   j2 = nlcj - nbghostcells - 1 
    100       IF( nbondi == -1 .OR. nbondi == 2 )   i1 = 2 + nbghostcells  
    101       IF( nbondi == +1 .OR. nbondi == 2 )   i2 = nlci - nbghostcells - 1 
    102  
    10397      ! --- West --- ! 
    104       IF( nbondi == -1 .OR. nbondi == 2 ) THEN 
    105          ibdy1 = 2 
    106          ibdy2 = 1+nbghostcells  
    107          ! 
    108          IF( .NOT.ln_dynspg_ts ) THEN  ! Store transport 
    109             uu_b(ibdy1:ibdy2,:,Krhs_a) = 0._wp 
     98      ibdy1 = 2 
     99      ibdy2 = 1+nbghostcells  
     100      ! 
     101      IF( .NOT.ln_dynspg_ts ) THEN  ! Store transport 
     102         DO ji = mi0(ibdy1), mi1(ibdy2) 
     103            uu_b(ji,:,Krhs_a) = 0._wp 
     104 
    110105            DO jk = 1, jpkm1 
    111106               DO jj = 1, jpj 
    112                   uu_b(ibdy1:ibdy2,jj,Krhs_a) = uu_b(ibdy1:ibdy2,jj,   Krhs_a) &  
    113                       &                        + e3u(ibdy1:ibdy2,jj,jk,Krhs_a) & 
    114                       &                        *  uu(ibdy1:ibdy2,jj,jk,Krhs_a) * umask(ibdy1:ibdy2,jj,jk) 
    115                END DO 
    116             END DO 
     107                  uu_b(ji,jj,Krhs_a) = uu_b(ji,jj,Krhs_a) + e3u(ji,jj,jk,Krhs_a) * uu(ji,jj,jk,Krhs_a) * umask(ji,jj,jk) 
     108               END DO 
     109            END DO 
     110 
    117111            DO jj = 1, jpj 
    118                uu_b(ibdy1:ibdy2,jj,Krhs_a) = uu_b(ibdy1:ibdy2,jj,Krhs_a) * r1_hu(ibdy1:ibdy2,jj,Krhs_a) 
    119             END DO 
    120          ENDIF 
    121          ! 
    122          IF( .NOT.lk_agrif_clp ) THEN 
    123             DO jk=1,jpkm1              ! Smooth 
    124                DO jj=j1,j2 
    125                   uu(ibdy2,jj,jk,Krhs_a) = 0.25_wp*( uu(ibdy2-1,jj,jk,Krhs_a)+2._wp*uu(ibdy2,jj,jk,Krhs_a) & 
    126                       &                            + uu(ibdy2+1,jj,jk,Krhs_a) ) 
    127                END DO 
    128             END DO 
    129          ENDIF 
    130          ! 
    131          zub(ibdy1:ibdy2,:) = 0._wp    ! Correct transport 
     112               uu_b(ji,jj,Krhs_a) = uu_b(ji,jj,Krhs_a) * r1_hu(ji,jj,Krhs_a) 
     113            END DO 
     114         END DO 
     115      ENDIF 
     116      ! 
     117      DO ji = mi0(ibdy1), mi1(ibdy2) 
     118         zub(ji,:) = 0._wp    ! Correct transport 
    132119         DO jk = 1, jpkm1 
    133120            DO jj = 1, jpj 
    134                zub(ibdy1:ibdy2,jj) = zub(ibdy1:ibdy2,jj)           +   e3u(ibdy1:ibdy2,jj,jk,Krhs_a) &  
    135                  &                  * uu(ibdy1:ibdy2,jj,jk,Krhs_a) * umask(ibdy1:ibdy2,jj,jk) 
     121               zub(ji,jj) = zub(ji,jj) &  
     122                  & + e3u(ji,jj,jk,Krhs_a)  * uu(ji,jj,jk,Krhs_a)*umask(ji,jj,jk) 
    136123            END DO 
    137124         END DO 
    138125         DO jj=1,jpj 
    139             zub(ibdy1:ibdy2,jj) = zub(ibdy1:ibdy2,jj) * r1_hu(ibdy1:ibdy2,jj,Krhs_a) 
     126            zub(ji,jj) = zub(ji,jj) * r1_hu(ji,jj,Krhs_a) 
    140127         END DO 
    141128             
    142129         DO jk = 1, jpkm1 
    143130            DO jj = 1, jpj 
    144                uu(ibdy1:ibdy2,jj,jk,Krhs_a) = (    uu(ibdy1:ibdy2,jj,jk,Krhs_a)   & 
    145                  &                             + uu_b(ibdy1:ibdy2,jj,   Krhs_a)   & 
    146                  &                             -  zub(ibdy1:ibdy2,jj)           ) & 
    147                  &                            * umask(ibdy1:ibdy2,jj,jk) 
    148             END DO 
    149          END DO 
     131               uu(ji,jj,jk,Krhs_a) = ( uu(ji,jj,jk,Krhs_a) + uu_b(ji,jj,Krhs_a)-zub(ji,jj)) * umask(ji,jj,jk) 
     132            END DO 
     133         END DO 
     134      END DO 
    150135             
    151          IF( ln_dynspg_ts ) THEN       ! Set tangential velocities to time splitting estimate 
    152             zvb(ibdy1:ibdy2,:) = 0._wp 
     136      IF( ln_dynspg_ts ) THEN       ! Set tangential velocities to time splitting estimate 
     137         DO ji = mi0(ibdy1), mi1(ibdy2) 
     138            zvb(ji,:) = 0._wp 
    153139            DO jk = 1, jpkm1 
    154140               DO jj = 1, jpj 
    155                   zvb(ibdy1:ibdy2,jj) = zvb(ibdy1:ibdy2,jj)           +   e3v(ibdy1:ibdy2,jj,jk,Krhs_a)  & 
    156                     &                  * vv(ibdy1:ibdy2,jj,jk,Krhs_a) * vmask(ibdy1:ibdy2,jj,jk) 
     141                  zvb(ji,jj) = zvb(ji,jj) + e3v(ji,jj,jk,Krhs_a) * vv(ji,jj,jk,Krhs_a) * vmask(ji,jj,jk) 
    157142               END DO 
    158143            END DO 
    159144            DO jj = 1, jpj 
    160                zvb(ibdy1:ibdy2,jj) = zvb(ibdy1:ibdy2,jj) * r1_hv(ibdy1:ibdy2,jj,Krhs_a) 
     145               zvb(ji,jj) = zvb(ji,jj) * r1_hv(ji,jj,Krhs_a) 
    161146            END DO 
    162147            DO jk = 1, jpkm1 
    163148               DO jj = 1, jpj 
    164                   vv(ibdy1:ibdy2,jj,jk,Krhs_a) = (    vv(ibdy1:ibdy2,jj,jk,Krhs_a)   &  
    165                     &                             + vv_b(ibdy1:ibdy2,jj,   Krhs_a)   & 
    166                     &                             -  zvb(ibdy1:ibdy2,jj)           ) & 
    167                     &                            * vmask(ibdy1:ibdy2,jj,jk) 
    168                END DO 
    169             END DO 
    170          ENDIF 
    171          ! 
    172          DO jk = 1, jpkm1              ! Mask domain edges 
    173             DO jj = 1, jpj 
    174                uu(1,jj,jk,Krhs_a) = 0._wp 
    175                vv(1,jj,jk,Krhs_a) = 0._wp 
    176             END DO 
    177          END DO  
     149                  vv(ji,jj,jk,Krhs_a) = ( vv(ji,jj,jk,Krhs_a) + vv_b(ji,jj,Krhs_a)-zvb(ji,jj))*vmask(ji,jj,jk) 
     150               END DO 
     151            END DO 
     152         END DO 
    178153      ENDIF 
    179154 
    180155      ! --- East --- ! 
    181       IF( nbondi ==  1 .OR. nbondi == 2 ) THEN 
    182          ibdy1 = nlci-1-nbghostcells 
    183          ibdy2 = nlci-2  
    184          ! 
    185          IF( .NOT.ln_dynspg_ts ) THEN  ! Store transport 
    186             uu_b(ibdy1:ibdy2,:,Krhs_a) = 0._wp 
     156      ibdy1 = jpiglo-1-nbghostcells 
     157      ibdy2 = jpiglo-2  
     158      ! 
     159      IF( .NOT.ln_dynspg_ts ) THEN  ! Store transport 
     160         DO ji = mi0(ibdy1), mi1(ibdy2) 
     161            uu_b(ji,:,Krhs_a) = 0._wp 
    187162            DO jk = 1, jpkm1 
    188163               DO jj = 1, jpj 
    189                   uu_b(ibdy1:ibdy2,jj,Krhs_a) =   uu_b(ibdy1:ibdy2,jj,   Krhs_a) &  
    190                       &                        +   e3u(ibdy1:ibdy2,jj,jk,Krhs_a) & 
    191                       &                        *    uu(ibdy1:ibdy2,jj,jk,Krhs_a) & 
    192                       &                        * umask(ibdy1:ibdy2,jj,jk) 
     164                  uu_b(ji,jj,Krhs_a) = uu_b(ji,jj,Krhs_a) &  
     165                      & + e3u(ji,jj,jk,Krhs_a) * uu(ji,jj,jk,Krhs_a) * umask(ji,jj,jk) 
    193166               END DO 
    194167            END DO 
    195168            DO jj = 1, jpj 
    196                uu_b(ibdy1:ibdy2,jj,Krhs_a) = uu_b(ibdy1:ibdy2,jj,Krhs_a) * r1_hu(ibdy1:ibdy2,jj,Krhs_a) 
    197             END DO 
    198          ENDIF 
    199          ! 
    200          IF( .NOT.lk_agrif_clp ) THEN 
    201             DO jk=1,jpkm1              ! Smooth 
    202                DO jj=j1,j2 
    203                   uu(ibdy1,jj,jk,Krhs_a) = 0.25_wp*(        uu(ibdy1-1,jj,jk,Krhs_a)  & 
    204                     &                               + 2._wp*uu(ibdy1  ,jj,jk,Krhs_a)  & 
    205                     &                                     + uu(ibdy1+1,jj,jk,Krhs_a) ) 
    206                END DO 
    207             END DO 
    208          ENDIF 
    209          ! 
    210          zub(ibdy1:ibdy2,:) = 0._wp    ! Correct transport 
     169               uu_b(ji,jj,Krhs_a) = uu_b(ji,jj,Krhs_a) * r1_hu(ji,jj,Krhs_a) 
     170            END DO 
     171         END DO 
     172      ENDIF 
     173      ! 
     174      DO ji = mi0(ibdy1), mi1(ibdy2) 
     175         zub(ji,:) = 0._wp    ! Correct transport 
    211176         DO jk = 1, jpkm1 
    212177            DO jj = 1, jpj 
    213                zub(ibdy1:ibdy2,jj) =  zub(ibdy1:ibdy2,jj)                                      &  
    214                   &                 + e3u(ibdy1:ibdy2,jj,jk,Krhs_a)                            & 
    215                   &                 *  uu(ibdy1:ibdy2,jj,jk,Krhs_a) * umask(ibdy1:ibdy2,jj,jk) 
     178               zub(ji,jj) = zub(ji,jj) &  
     179                  & + e3u(ji,jj,jk,Krhs_a)  * uu(ji,jj,jk,Krhs_a) * umask(ji,jj,jk) 
    216180            END DO 
    217181         END DO 
    218182         DO jj=1,jpj 
    219             zub(ibdy1:ibdy2,jj) = zub(ibdy1:ibdy2,jj) * r1_hu(ibdy1:ibdy2,jj,Krhs_a) 
     183            zub(ji,jj) = zub(ji,jj) * r1_hu(ji,jj,Krhs_a) 
    220184         END DO 
    221185             
    222186         DO jk = 1, jpkm1 
    223187            DO jj = 1, jpj 
    224                uu(ibdy1:ibdy2,jj,jk,Krhs_a) = (      uu(ibdy1:ibdy2,jj,jk,Krhs_a) &  
    225                  &                             +   uu_b(ibdy1:ibdy2,jj,   Krhs_a) & 
    226                  &                             -    zub(ibdy1:ibdy2,jj)           & 
    227                  &                            ) * umask(ibdy1:ibdy2,jj,jk) 
    228             END DO 
    229          END DO 
     188               uu(ji,jj,jk,Krhs_a) = ( uu(ji,jj,jk,Krhs_a) &  
     189                 & + uu_b(ji,jj,Krhs_a)-zub(ji,jj))*umask(ji,jj,jk) 
     190            END DO 
     191         END DO 
     192      END DO 
    230193             
    231          IF( ln_dynspg_ts ) THEN       ! Set tangential velocities to time splitting estimate 
    232             ibdy1 = ibdy1 + 1 
    233             ibdy2 = ibdy2 + 1  
    234             zvb(ibdy1:ibdy2,:) = 0._wp 
     194      IF( ln_dynspg_ts ) THEN       ! Set tangential velocities to time splitting estimate 
     195         ibdy1 = jpiglo-nbghostcells 
     196         ibdy2 = jpiglo-1  
     197         DO ji = mi0(ibdy1), mi1(ibdy2) 
     198            zvb(ji,:) = 0._wp 
    235199            DO jk = 1, jpkm1 
    236200               DO jj = 1, jpj 
    237                   zvb(ibdy1:ibdy2,jj) =    zvb(ibdy1:ibdy2,jj)                     & 
    238                      &                 +   e3v(ibdy1:ibdy2,jj,jk,Krhs_a)           & 
    239                      &                 *    vv(ibdy1:ibdy2,jj,jk,Krhs_a)           & 
    240                      &                 * vmask(ibdy1:ibdy2,jj,jk) 
     201                  zvb(ji,jj) = zvb(ji,jj) & 
     202                     & + e3v(ji,jj,jk,Krhs_a) * vv(ji,jj,jk,Krhs_a) * vmask(ji,jj,jk) 
    241203               END DO 
    242204            END DO 
    243205            DO jj = 1, jpj 
    244                zvb(ibdy1:ibdy2,jj) = zvb(ibdy1:ibdy2,jj) * r1_hv(ibdy1:ibdy2,jj,Krhs_a) 
     206               zvb(ji,jj) = zvb(ji,jj) * r1_hv(ji,jj,Krhs_a) 
    245207            END DO 
    246208            DO jk = 1, jpkm1 
    247209               DO jj = 1, jpj 
    248                   vv(ibdy1:ibdy2,jj,jk,Krhs_a) = (      vv(ibdy1:ibdy2,jj,jk,Krhs_a) &  
    249                       &                           +   vv_b(ibdy1:ibdy2,jj,   Krhs_a) & 
    250                       &                           -    zvb(ibdy1:ibdy2,jj)           & 
    251                       &                          ) * vmask(ibdy1:ibdy2,jj,jk) 
    252                END DO 
    253             END DO 
    254          ENDIF 
    255          ! 
    256          DO jk = 1, jpkm1              ! Mask domain edges 
    257             DO jj = 1, jpj 
    258                uu(nlci-1,jj,jk,Krhs_a) = 0._wp 
    259                vv(nlci  ,jj,jk,Krhs_a) = 0._wp 
    260             END DO 
    261          END DO  
     210                  vv(ji,jj,jk,Krhs_a) = ( vv(ji,jj,jk,Krhs_a) &  
     211                      & + vv_b(ji,jj,Krhs_a)-zvb(ji,jj)) * vmask(ji,jj,jk) 
     212               END DO 
     213            END DO 
     214         END DO 
    262215      ENDIF 
    263216 
    264217      ! --- South --- ! 
    265       IF( nbondj == -1 .OR. nbondj == 2 ) THEN 
    266          jbdy1 = 2 
    267          jbdy2 = 1+nbghostcells  
    268          ! 
    269          IF( .NOT.ln_dynspg_ts ) THEN  ! Store transport 
    270             vv_b(:,jbdy1:jbdy2,Krhs_a) = 0._wp 
     218      jbdy1 = 2 
     219      jbdy2 = 1+nbghostcells  
     220      ! 
     221      IF( .NOT.ln_dynspg_ts ) THEN  ! Store transport 
     222         DO jj = mj0(jbdy1), mj1(jbdy2) 
     223            vv_b(:,jj,Krhs_a) = 0._wp 
    271224            DO jk = 1, jpkm1 
    272225               DO ji = 1, jpi 
    273                   vv_b(ji,jbdy1:jbdy2,Krhs_a) =   vv_b(ji,jbdy1:jbdy2,   Krhs_a) &  
    274                       &                        +   e3v(ji,jbdy1:jbdy2,jk,Krhs_a) & 
    275                       &                        *    vv(ji,jbdy1:jbdy2,jk,Krhs_a) & 
    276                       &                        * vmask(ji,jbdy1:jbdy2,jk) 
     226                  vv_b(ji,jj,Krhs_a) = vv_b(ji,jj,Krhs_a) &  
     227                      & + e3v(ji,jj,jk,Krhs_a) * vv(ji,jj,jk,Krhs_a) * vmask(ji,jj,jk) 
    277228               END DO 
    278229            END DO 
    279230            DO ji=1,jpi 
    280                vv_b(ji,jbdy1:jbdy2,Krhs_a) = vv_b(ji,jbdy1:jbdy2,Krhs_a) * r1_hv(ji,jbdy1:jbdy2,Krhs_a) 
    281             END DO 
    282          ENDIF 
    283          ! 
    284          IF ( .NOT.lk_agrif_clp ) THEN 
    285             DO jk = 1, jpkm1           ! Smooth 
    286                DO ji = i1, i2 
    287                   vv(ji,jbdy2,jk,Krhs_a) = 0.25_wp*(        vv(ji,jbdy2-1,jk,Krhs_a)  & 
    288                     &                               + 2._wp*vv(ji,jbdy2  ,jk,Krhs_a)  & 
    289                     &                               +       vv(ji,jbdy2+1,jk,Krhs_a) ) 
    290                END DO 
    291             END DO 
    292          ENDIF 
    293          ! 
    294          zvb(:,jbdy1:jbdy2) = 0._wp    ! Correct transport 
     231               vv_b(ji,jj,Krhs_a) = vv_b(ji,jj,Krhs_a) * r1_hv(ji,jj,Krhs_a)      
     232            END DO 
     233         END DO 
     234      ENDIF 
     235      ! 
     236      DO jj = mj0(jbdy1), mj1(jbdy2) 
     237         zvb(:,jj) = 0._wp    ! Correct transport 
    295238         DO jk=1,jpkm1 
    296239            DO ji=1,jpi 
    297                zvb(ji,jbdy1:jbdy2) =    zvb(ji,jbdy1:jbdy2)           &  
    298                   &                 +   e3v(ji,jbdy1:jbdy2,jk,Krhs_a) & 
    299                   &                 *    vv(ji,jbdy1:jbdy2,jk,Krhs_a) & 
    300                   &                 * vmask(ji,jbdy1:jbdy2,jk) 
     240               zvb(ji,jj) = zvb(ji,jj) &  
     241                  & + e3v(ji,jj,jk,Krhs_a) * vv(ji,jj,jk,Krhs_a) * vmask(ji,jj,jk) 
    301242            END DO 
    302243         END DO 
    303244         DO ji = 1, jpi 
    304             zvb(ji,jbdy1:jbdy2) = zvb(ji,jbdy1:jbdy2) * r1_hv(ji,jbdy1:jbdy2,Krhs_a) 
     245            zvb(ji,jj) = zvb(ji,jj) * r1_hv(ji,jj,Krhs_a) 
    305246         END DO 
    306247 
    307248         DO jk = 1, jpkm1 
    308249            DO ji = 1, jpi 
    309                vv(ji,jbdy1:jbdy2,jk,Krhs_a) = (      vv(ji,jbdy1:jbdy2,jk,Krhs_a) &  
    310                  &                             +   vv_b(ji,jbdy1:jbdy2,   Krhs_a) & 
    311                  &                             -    zvb(ji,jbdy1:jbdy2)           & 
    312                  &                            ) * vmask(ji,jbdy1:jbdy2,jk) 
    313             END DO 
    314          END DO 
     250               vv(ji,jj,jk,Krhs_a) = ( vv(ji,jj,jk,Krhs_a) &  
     251                 & + vv_b(ji,jj,Krhs_a) - zvb(ji,jj) ) * vmask(ji,jj,jk) 
     252            END DO 
     253         END DO 
     254      END DO 
    315255             
    316          IF( ln_dynspg_ts ) THEN       ! Set tangential velocities to time splitting estimate 
    317             zub(:,jbdy1:jbdy2) = 0._wp 
     256      IF( ln_dynspg_ts ) THEN       ! Set tangential velocities to time splitting estimate 
     257         DO jj = mj0(jbdy1), mj1(jbdy2) 
     258            zub(:,jj) = 0._wp 
    318259            DO jk = 1, jpkm1 
    319260               DO ji = 1, jpi 
    320                   zub(ji,jbdy1:jbdy2) =    zub(ji,jbdy1:jbdy2)           &  
    321                      &                 +   e3u(ji,jbdy1:jbdy2,jk,Krhs_a) & 
    322                      &                 *    uu(ji,jbdy1:jbdy2,jk,Krhs_a) & 
    323                      &                 * umask(ji,jbdy1:jbdy2,jk) 
     261                  zub(ji,jj) = zub(ji,jj) &  
     262                     & + e3u(ji,jj,jk,Krhs_a) * uu(ji,jj,jk,Krhs_a) * umask(ji,jj,jk) 
    324263               END DO 
    325264            END DO 
    326265            DO ji = 1, jpi 
    327                zub(ji,jbdy1:jbdy2) = zub(ji,jbdy1:jbdy2) * r1_hu(ji,jbdy1:jbdy2,Krhs_a) 
     266               zub(ji,jj) = zub(ji,jj) * r1_hu(ji,jj,Krhs_a) 
    328267            END DO 
    329268                
    330269            DO jk = 1, jpkm1 
    331270               DO ji = 1, jpi 
    332                   uu(ji,jbdy1:jbdy2,jk,Krhs_a) = (      uu(ji,jbdy1:jbdy2,jk,Krhs_a) &  
    333                     &                             +   uu_b(ji,jbdy1:jbdy2,   Krhs_a) & 
    334                     &                             -    zub(ji,jbdy1:jbdy2)           & 
    335                     &                            ) * umask(ji,jbdy1:jbdy2,jk) 
    336                END DO 
    337             END DO 
    338          ENDIF 
    339          ! 
    340          DO jk = 1, jpkm1              ! Mask domain edges 
    341             DO ji = 1, jpi 
    342                uu(ji,1,jk,Krhs_a) = 0._wp 
    343                vv(ji,1,jk,Krhs_a) = 0._wp 
    344             END DO 
    345          END DO  
     271                  uu(ji,jj,jk,Krhs_a) = ( uu(ji,jj,jk,Krhs_a) &  
     272                    & + uu_b(ji,jj,Krhs_a) - zub(ji,jj) ) * umask(ji,jj,jk) 
     273               END DO 
     274            END DO 
     275         END DO 
    346276      ENDIF 
    347277 
    348278      ! --- North --- ! 
    349       IF( nbondj ==  1 .OR. nbondj == 2 ) THEN 
    350          jbdy1 = nlcj-1-nbghostcells 
    351          jbdy2 = nlcj-2  
    352          ! 
    353          IF( .NOT.ln_dynspg_ts ) THEN  ! Store transport 
    354             vv_b(:,jbdy1:jbdy2,Krhs_a) = 0._wp 
     279      jbdy1 = jpjglo-1-nbghostcells 
     280      jbdy2 = jpjglo-2  
     281      ! 
     282      IF( .NOT.ln_dynspg_ts ) THEN  ! Store transport 
     283         DO jj = mj0(jbdy1), mj1(jbdy2) 
     284            vv_b(:,jj,Krhs_a) = 0._wp 
    355285            DO jk = 1, jpkm1 
    356286               DO ji = 1, jpi 
    357                   vv_b(ji,jbdy1:jbdy2,Krhs_a) =   vv_b(ji,jbdy1:jbdy2,   Krhs_a) &  
    358                       &                        +   e3v(ji,jbdy1:jbdy2,jk,Krhs_a) & 
    359                       &                        *    vv(ji,jbdy1:jbdy2,jk,Krhs_a) & 
    360                       &                        * vmask(ji,jbdy1:jbdy2,jk) 
     287                  vv_b(ji,jj,Krhs_a) = vv_b(ji,jj,Krhs_a) &  
     288                      & + e3v(ji,jj,jk,Krhs_a) * vv(ji,jj,jk,Krhs_a) * vmask(ji,jj,jk) 
    361289               END DO 
    362290            END DO 
    363291            DO ji=1,jpi 
    364                vv_b(ji,jbdy1:jbdy2,Krhs_a) = vv_b(ji,jbdy1:jbdy2,Krhs_a) * r1_hv(ji,jbdy1:jbdy2,Krhs_a) 
    365             END DO 
    366          ENDIF 
    367          ! 
    368          IF ( .NOT.lk_agrif_clp ) THEN 
    369             DO jk = 1, jpkm1           ! Smooth 
    370                DO ji = i1, i2 
    371                   vv(ji,jbdy1,jk,Krhs_a) = 0.25_wp*(        vv(ji,jbdy1-1,jk,Krhs_a)  & 
    372                     &                               + 2._wp*vv(ji,jbdy1  ,jk,Krhs_a)  & 
    373                     &                               +       vv(ji,jbdy1+1,jk,Krhs_a) ) 
    374                END DO 
    375             END DO 
    376          ENDIF 
    377          ! 
    378          zvb(:,jbdy1:jbdy2) = 0._wp    ! Correct transport 
     292               vv_b(ji,jj,Krhs_a) = vv_b(ji,jj,Krhs_a) * r1_hv(ji,jj,Krhs_a) 
     293            END DO 
     294         END DO 
     295      ENDIF 
     296      ! 
     297      DO jj = mj0(jbdy1), mj1(jbdy2) 
     298         zvb(:,jj) = 0._wp    ! Correct transport 
    379299         DO jk=1,jpkm1 
    380300            DO ji=1,jpi 
    381                zvb(ji,jbdy1:jbdy2) =    zvb(ji,jbdy1:jbdy2)           &  
    382                   &                 +   e3v(ji,jbdy1:jbdy2,jk,Krhs_a) & 
    383                   &                 *    vv(ji,jbdy1:jbdy2,jk,Krhs_a) & 
    384                   &                 * vmask(ji,jbdy1:jbdy2,jk) 
     301               zvb(ji,jj) = zvb(ji,jj) &  
     302                  & + e3v(ji,jj,jk,Krhs_a) * vv(ji,jj,jk,Krhs_a) * vmask(ji,jj,jk) 
    385303            END DO 
    386304         END DO 
    387305         DO ji = 1, jpi 
    388             zvb(ji,jbdy1:jbdy2) = zvb(ji,jbdy1:jbdy2) * r1_hv(ji,jbdy1:jbdy2,Krhs_a) 
     306            zvb(ji,jj) = zvb(ji,jj) * r1_hv(ji,jj,Krhs_a) 
    389307         END DO 
    390308 
    391309         DO jk = 1, jpkm1 
    392310            DO ji = 1, jpi 
    393                vv(ji,jbdy1:jbdy2,jk,Krhs_a) = (      vv(ji,jbdy1:jbdy2,jk,Krhs_a) &  
    394                  &                             +   vv_b(ji,jbdy1:jbdy2,   Krhs_a) & 
    395                  &                             -    zvb(ji,jbdy1:jbdy2)           & 
    396                  &                            ) * vmask(ji,jbdy1:jbdy2,jk) 
    397             END DO 
    398          END DO 
     311               vv(ji,jj,jk,Krhs_a) = ( vv(ji,jj,jk,Krhs_a) &  
     312                 & + vv_b(ji,jj,Krhs_a) - zvb(ji,jj) ) * vmask(ji,jj,jk) 
     313            END DO 
     314         END DO 
     315      END DO 
    399316             
    400          IF( ln_dynspg_ts ) THEN       ! Set tangential velocities to time splitting estimate 
    401             jbdy1 = jbdy1 + 1 
    402             jbdy2 = jbdy2 + 1  
    403             zub(:,jbdy1:jbdy2) = 0._wp 
     317      IF( ln_dynspg_ts ) THEN       ! Set tangential velocities to time splitting estimate 
     318         jbdy1 = jpjglo-nbghostcells 
     319         jbdy2 = jpjglo-1 
     320         DO jj = mj0(jbdy1), mj1(jbdy2) 
     321            zub(:,jj) = 0._wp 
    404322            DO jk = 1, jpkm1 
    405323               DO ji = 1, jpi 
    406                   zub(ji,jbdy1:jbdy2) =    zub(ji,jbdy1:jbdy2)           &  
    407                      &                 +   e3u(ji,jbdy1:jbdy2,jk,Krhs_a) & 
    408                      &                 *    uu(ji,jbdy1:jbdy2,jk,Krhs_a) & 
    409                      &                 * umask(ji,jbdy1:jbdy2,jk) 
     324                  zub(ji,jj) = zub(ji,jj) &  
     325                     & + e3u(ji,jj,jk,Krhs_a) * uu(ji,jj,jk,Krhs_a) * umask(ji,jj,jk) 
    410326               END DO 
    411327            END DO 
    412328            DO ji = 1, jpi 
    413                zub(ji,jbdy1:jbdy2) = zub(ji,jbdy1:jbdy2) * r1_hu(ji,jbdy1:jbdy2,Krhs_a) 
     329               zub(ji,jj) = zub(ji,jj) * r1_hu(ji,jj,Krhs_a) 
    414330            END DO 
    415331                
    416332            DO jk = 1, jpkm1 
    417333               DO ji = 1, jpi 
    418                   uu(ji,jbdy1:jbdy2,jk,Krhs_a) = (      uu(ji,jbdy1:jbdy2,jk,Krhs_a) &  
    419                     &                             +   uu_b(ji,jbdy1:jbdy2,   Krhs_a) & 
    420                     &                             -    zub(ji,jbdy1:jbdy2)           & 
    421                     &                            ) * umask(ji,jbdy1:jbdy2,jk) 
    422                END DO 
    423             END DO 
    424          ENDIF 
    425          ! 
    426          DO jk = 1, jpkm1              ! Mask domain edges 
    427             DO ji = 1, jpi 
    428                uu(ji,nlcj  ,jk,Krhs_a) = 0._wp 
    429                vv(ji,nlcj-1,jk,Krhs_a) = 0._wp 
    430             END DO 
    431          END DO  
     334                  uu(ji,jj,jk,Krhs_a) = ( uu(ji,jj,jk,Krhs_a) &  
     335                    & + uu_b(ji,jj,Krhs_a) - zub(ji,jj) ) * umask(ji,jj,jk) 
     336               END DO 
     337            END DO 
     338         END DO 
    432339      ENDIF 
    433340      ! 
     
    442349      !! 
    443350      INTEGER :: ji, jj 
     351      INTEGER :: istart, iend, jstart, jend 
    444352      !!----------------------------------------------------------------------   
    445353      ! 
    446354      IF( Agrif_Root() )   RETURN 
    447355      ! 
    448       IF((nbondi == -1).OR.(nbondi == 2)) THEN 
     356      !--- West ---! 
     357      istart = 2 
     358      iend   = nbghostcells+1 
     359      DO ji = mi0(istart), mi1(iend) 
    449360         DO jj=1,jpj 
    450             va_e(2:nbghostcells+1,jj) = vbdy_w(1:nbghostcells,jj) * hvr_e(2:nbghostcells+1,jj) 
    451             ! Specified fluxes: 
    452             ua_e(2:nbghostcells+1,jj) = ubdy_w(1:nbghostcells,jj) * hur_e(2:nbghostcells+1,jj) 
    453             ! Characteristics method (only if ghostcells=1): 
    454             !alt            ua_e(2,jj) = 0.5_wp * ( ubdy_w(jj) * hur_e(2,jj) + ua_e(3,jj) & 
    455             !alt                       &           - sqrt(grav * hur_e(2,jj)) * (sshn_e(3,jj) - hbdy_w(jj)) ) 
    456          END DO 
    457       ENDIF 
    458       ! 
    459       IF((nbondi == 1).OR.(nbondi == 2)) THEN 
     361            va_e(ji,jj) = vbdy(ji,jj) * hvr_e(ji,jj) 
     362            ua_e(ji,jj) = ubdy(ji,jj) * hur_e(ji,jj) 
     363         END DO 
     364      END DO 
     365      ! 
     366      !--- East ---! 
     367      istart = jpiglo-nbghostcells 
     368      iend   = jpiglo-1 
     369      DO ji = mi0(istart), mi1(iend) 
    460370         DO jj=1,jpj 
    461             va_e(nlci-nbghostcells:nlci-1,jj)   = vbdy_e(1:nbghostcells,jj) * hvr_e(nlci-nbghostcells:nlci-1,jj) 
    462             ! Specified fluxes: 
    463             ua_e(nlci-nbghostcells-1:nlci-2,jj) = ubdy_e(1:nbghostcells,jj) * hur_e(nlci-nbghostcells-1:nlci-2,jj) 
    464             ! Characteristics method (only if ghostcells=1): 
    465             !alt            ua_e(nlci-2,jj) = 0.5_wp * ( ubdy_e(jj) * hur_e(nlci-2,jj) + ua_e(nlci-3,jj) & 
    466             !alt                            &           + sqrt(grav * hur_e(nlci-2,jj)) * (sshn_e(nlci-2,jj) - hbdy_e(jj)) ) 
    467          END DO 
    468       ENDIF 
    469       ! 
    470       IF((nbondj == -1).OR.(nbondj == 2)) THEN 
     371            va_e(ji,jj) = vbdy(ji,jj) * hvr_e(ji,jj) 
     372         END DO 
     373      END DO 
     374      istart = jpiglo-nbghostcells-1 
     375      iend   = jpiglo-2 
     376      DO ji = mi0(istart), mi1(iend) 
     377         DO jj=1,jpj 
     378            ua_e(ji,jj) = ubdy(ji,jj) * hur_e(ji,jj) 
     379         END DO 
     380      END DO 
     381      ! 
     382      !--- South ---! 
     383      jstart = 2 
     384      jend   = nbghostcells+1 
     385      DO jj = mj0(jstart), mj1(jend) 
    471386         DO ji=1,jpi 
    472             ua_e(ji,2:nbghostcells+1) = ubdy_s(ji,1:nbghostcells) * hur_e(ji,2:nbghostcells+1) 
    473             ! Specified fluxes: 
    474             va_e(ji,2:nbghostcells+1) = vbdy_s(ji,1:nbghostcells) * hvr_e(ji,2:nbghostcells+1) 
    475             ! Characteristics method (only if ghostcells=1): 
    476             !alt            va_e(ji,2) = 0.5_wp * ( vbdy_s(ji) * hvr_e(ji,2) + va_e(ji,3) & 
    477             !alt                       &           - sqrt(grav * hvr_e(ji,2)) * (sshn_e(ji,3) - hbdy_s(ji)) ) 
    478          END DO 
    479       ENDIF 
    480       ! 
    481       IF((nbondj == 1).OR.(nbondj == 2)) THEN 
     387            ua_e(ji,jj) = ubdy(ji,jj) * hur_e(ji,jj) 
     388            va_e(ji,jj) = vbdy(ji,jj) * hvr_e(ji,jj) 
     389         END DO 
     390      END DO 
     391      ! 
     392      !--- North ---! 
     393      jstart = jpjglo-nbghostcells 
     394      jend   = jpjglo-1 
     395      DO jj = mj0(jstart), mj1(jend) 
    482396         DO ji=1,jpi 
    483             ua_e(ji,nlcj-nbghostcells:nlcj-1)   = ubdy_n(ji,1:nbghostcells) * hur_e(ji,nlcj-nbghostcells:nlcj-1) 
    484             ! Specified fluxes: 
    485             va_e(ji,nlcj-nbghostcells-1:nlcj-2) = vbdy_n(ji,1:nbghostcells) * hvr_e(ji,nlcj-nbghostcells-1:nlcj-2) 
    486             ! Characteristics method (only if ghostcells=1): 
    487             !alt            va_e(ji,nlcj-2) = 0.5_wp * ( vbdy_n(ji) * hvr_e(ji,nlcj-2)  + va_e(ji,nlcj-3) & 
    488             !alt                            &           + sqrt(grav * hvr_e(ji,nlcj-2)) * (sshn_e(ji,nlcj-2) - hbdy_n(ji)) ) 
    489          END DO 
    490       ENDIF 
     397            ua_e(ji,jj) = ubdy(ji,jj) * hur_e(ji,jj) 
     398         END DO 
     399      END DO 
     400      jstart = jpjglo-nbghostcells-1 
     401      jend   = jpjglo-2 
     402      DO jj = mj0(jstart), mj1(jend) 
     403         DO ji=1,jpi 
     404            va_e(ji,jj) = vbdy(ji,jj) * hvr_e(ji,jj) 
     405         END DO 
     406      END DO 
    491407      ! 
    492408   END SUBROUTINE Agrif_dyn_ts 
    493409 
     410   SUBROUTINE Agrif_dyn_ts_flux( jn, zu, zv ) 
     411      !!---------------------------------------------------------------------- 
     412      !!                  ***  ROUTINE Agrif_dyn_ts_flux  *** 
     413      !!----------------------------------------------------------------------   
     414      INTEGER, INTENT(in) ::   jn 
     415      REAL(wp), DIMENSION(jpi,jpj), INTENT(inout) ::   zu, zv 
     416      !! 
     417      INTEGER :: ji, jj 
     418      INTEGER :: istart, iend, jstart, jend 
     419      !!----------------------------------------------------------------------   
     420      ! 
     421      IF( Agrif_Root() )   RETURN 
     422      ! 
     423      !--- West ---! 
     424      istart = 2 
     425      iend   = nbghostcells+1 
     426      DO ji = mi0(istart), mi1(iend) 
     427         DO jj=1,jpj 
     428            zv(ji,jj) = vbdy(ji,jj) * e1v(ji,jj) 
     429            zu(ji,jj) = ubdy(ji,jj) * e2u(ji,jj) 
     430         END DO 
     431      END DO 
     432      ! 
     433      !--- East ---! 
     434      istart = jpiglo-nbghostcells 
     435      iend   = jpiglo-1 
     436      DO ji = mi0(istart), mi1(iend) 
     437         DO jj=1,jpj 
     438            zv(ji,jj) = vbdy(ji,jj) * e1v(ji,jj) 
     439         END DO 
     440      END DO 
     441      istart = jpiglo-nbghostcells-1 
     442      iend   = jpiglo-2 
     443      DO ji = mi0(istart), mi1(iend) 
     444         DO jj=1,jpj 
     445            zu(ji,jj) = ubdy(ji,jj) * e2u(ji,jj) 
     446         END DO 
     447      END DO 
     448      ! 
     449      !--- South ---! 
     450      jstart = 2 
     451      jend   = nbghostcells+1 
     452      DO jj = mj0(jstart), mj1(jend) 
     453         DO ji=1,jpi 
     454            zu(ji,jj) = ubdy(ji,jj) * e2u(ji,jj) 
     455            zv(ji,jj) = vbdy(ji,jj) * e1v(ji,jj) 
     456         END DO 
     457      END DO 
     458      ! 
     459      !--- North ---! 
     460      jstart = jpjglo-nbghostcells 
     461      jend   = jpjglo-1 
     462      DO jj = mj0(jstart), mj1(jend) 
     463         DO ji=1,jpi 
     464            zu(ji,jj) = ubdy(ji,jj) * e2u(ji,jj) 
     465         END DO 
     466      END DO 
     467      jstart = jpjglo-nbghostcells-1 
     468      jend   = jpjglo-2 
     469      DO jj = mj0(jstart), mj1(jend) 
     470         DO ji=1,jpi 
     471            zv(ji,jj) = vbdy(ji,jj) * e1v(ji,jj) 
     472         END DO 
     473      END DO 
     474      ! 
     475   END SUBROUTINE Agrif_dyn_ts_flux 
    494476 
    495477   SUBROUTINE Agrif_dta_ts( kt ) 
     
    511493      ! 
    512494      ! Interpolate barotropic fluxes 
    513       Agrif_SpecialValue=0._wp 
     495      Agrif_SpecialValue = 0._wp 
    514496      Agrif_UseSpecialValue = ln_spc_dyn 
     497      ! 
     498      ! Set bdy time interpolation stage to 0 (latter incremented locally do deal with corners) 
     499      utint_stage(:,:) = 0 
     500      vtint_stage(:,:) = 0 
    515501      ! 
    516502      IF( ll_int_cons ) THEN  ! Conservative interpolation 
    517503         ! order matters here !!!!!! 
    518504         CALL Agrif_Bc_variable( ub2b_interp_id, calledweight=1._wp, procname=interpub2b ) ! Time integrated 
    519          CALL Agrif_Bc_variable( vb2b_interp_id, calledweight=1._wp, procname=interpvb2b ) 
     505         CALL Agrif_Bc_variable( vb2b_interp_id, calledweight=1._wp, procname=interpvb2b )  
     506         ! 
    520507         bdy_tinterp = 1 
    521508         CALL Agrif_Bc_variable( unb_id        , calledweight=1._wp, procname=interpunb  ) ! After 
    522          CALL Agrif_Bc_variable( vnb_id        , calledweight=1._wp, procname=interpvnb  ) 
     509         CALL Agrif_Bc_variable( vnb_id        , calledweight=1._wp, procname=interpvnb  )   
     510         ! 
    523511         bdy_tinterp = 2 
    524512         CALL Agrif_Bc_variable( unb_id        , calledweight=0._wp, procname=interpunb  ) ! Before 
    525          CALL Agrif_Bc_variable( vnb_id        , calledweight=0._wp, procname=interpvnb  )          
     513         CALL Agrif_Bc_variable( vnb_id        , calledweight=0._wp, procname=interpvnb  )    
    526514      ELSE ! Linear interpolation 
    527          bdy_tinterp = 0 
    528          ubdy_w(:,:) = 0._wp   ;   vbdy_w(:,:) = 0._wp  
    529          ubdy_e(:,:) = 0._wp   ;   vbdy_e(:,:) = 0._wp  
    530          ubdy_n(:,:) = 0._wp   ;   vbdy_n(:,:) = 0._wp  
    531          ubdy_s(:,:) = 0._wp   ;   vbdy_s(:,:) = 0._wp 
     515         ! 
     516         ubdy(:,:) = 0._wp   ;   vbdy(:,:) = 0._wp  
    532517         CALL Agrif_Bc_variable( unb_id, procname=interpunb ) 
    533518         CALL Agrif_Bc_variable( vnb_id, procname=interpvnb ) 
     
    544529      INTEGER, INTENT(in) ::   kt 
    545530      ! 
    546       INTEGER  :: ji, jj, indx, indy 
     531      INTEGER  :: ji, jj 
     532      INTEGER  :: istart, iend, jstart, jend 
    547533      !!----------------------------------------------------------------------   
    548534      ! 
     
    557543      ! 
    558544      ! --- West --- ! 
    559       IF((nbondi == -1).OR.(nbondi == 2)) THEN 
    560          indx = 1+nbghostcells 
     545      istart = 2 
     546      iend   = 1 + nbghostcells 
     547      DO ji = mi0(istart), mi1(iend) 
    561548         DO jj = 1, jpj 
    562             DO ji = 2, indx 
    563                ssh(ji,jj,Krhs_a) = hbdy_w(ji-1,jj) 
    564             ENDDO 
     549            ssh(ji,jj,Krhs_a) = hbdy(ji,jj) 
    565550         ENDDO 
    566       ENDIF 
     551      ENDDO 
    567552      ! 
    568553      ! --- East --- ! 
    569       IF((nbondi == 1).OR.(nbondi == 2)) THEN 
    570          indx = nlci-nbghostcells 
     554      istart = jpiglo - nbghostcells 
     555      iend   = jpiglo - 1 
     556      DO ji = mi0(istart), mi1(iend) 
    571557         DO jj = 1, jpj 
    572             DO ji = indx, nlci-1 
    573                ssh(ji,jj,Krhs_a) = hbdy_e(ji-indx+1,jj) 
    574             ENDDO 
     558            ssh(ji,jj,Krhs_a) = hbdy(ji,jj) 
    575559         ENDDO 
    576       ENDIF 
     560      ENDDO 
    577561      ! 
    578562      ! --- South --- ! 
    579       IF((nbondj == -1).OR.(nbondj == 2)) THEN 
    580          indy = 1+nbghostcells 
    581          DO jj = 2, indy 
    582             DO ji = 1, jpi 
    583                ssh(ji,jj,Krhs_a) = hbdy_s(ji,jj-1) 
    584             ENDDO 
     563      jstart = 2 
     564      jend   = 1 + nbghostcells 
     565      DO jj = mj0(jstart), mj1(jend) 
     566         DO ji = 1, jpi 
     567            ssh(ji,jj,Krhs_a) = hbdy(ji,jj) 
    585568         ENDDO 
    586       ENDIF 
     569      ENDDO 
    587570      ! 
    588571      ! --- North --- ! 
    589       IF((nbondj == 1).OR.(nbondj == 2)) THEN 
    590          indy = nlcj-nbghostcells 
    591          DO jj = indy, nlcj-1 
    592             DO ji = 1, jpi 
    593                ssh(ji,jj,Krhs_a) = hbdy_n(ji,jj-indy+1) 
    594             ENDDO 
     572      jstart = jpjglo - nbghostcells 
     573      jend   = jpjglo - 1 
     574      DO jj = mj0(jstart), mj1(jend) 
     575         DO ji = 1, jpi 
     576            ssh(ji,jj,Krhs_a) = hbdy(ji,jj) 
    595577         ENDDO 
    596       ENDIF 
     578      ENDDO 
    597579      ! 
    598580   END SUBROUTINE Agrif_ssh 
     
    605587      INTEGER, INTENT(in) ::   jn 
    606588      !! 
    607       INTEGER :: ji, jj, indx, indy 
    608       !!----------------------------------------------------------------------   
    609       !! clem ghost (starting at i,j=1 is important I think otherwise you introduce a grad(ssh)/=0 at point 2) 
     589      INTEGER :: ji, jj 
     590      INTEGER  :: istart, iend, jstart, jend 
     591      !!----------------------------------------------------------------------   
    610592      ! 
    611593      IF( Agrif_Root() )   RETURN 
    612594      ! 
    613595      ! --- West --- ! 
    614       IF((nbondi == -1).OR.(nbondi == 2)) THEN 
    615          indx = 1+nbghostcells 
     596      istart = 2 
     597      iend   = 1+nbghostcells 
     598      DO ji = mi0(istart), mi1(iend) 
    616599         DO jj = 1, jpj 
    617             DO ji = 2, indx 
    618                ssha_e(ji,jj) = hbdy_w(ji-1,jj) 
    619             ENDDO 
     600            ssha_e(ji,jj) = hbdy(ji,jj) 
    620601         ENDDO 
    621       ENDIF 
     602      ENDDO 
    622603      ! 
    623604      ! --- East --- ! 
    624       IF((nbondi == 1).OR.(nbondi == 2)) THEN 
    625          indx = nlci-nbghostcells 
     605      istart = jpiglo - nbghostcells 
     606      iend   = jpiglo - 1 
     607      DO ji = mi0(istart), mi1(iend) 
    626608         DO jj = 1, jpj 
    627             DO ji = indx, nlci-1 
    628                ssha_e(ji,jj) = hbdy_e(ji-indx+1,jj) 
    629             ENDDO 
     609            ssha_e(ji,jj) = hbdy(ji,jj) 
    630610         ENDDO 
    631       ENDIF 
     611      ENDDO 
    632612      ! 
    633613      ! --- South --- ! 
    634       IF((nbondj == -1).OR.(nbondj == 2)) THEN 
    635          indy = 1+nbghostcells 
    636          DO jj = 2, indy 
    637             DO ji = 1, jpi 
    638                ssha_e(ji,jj) = hbdy_s(ji,jj-1) 
    639             ENDDO 
     614      jstart = 2 
     615      jend   = 1+nbghostcells 
     616      DO jj = mj0(jstart), mj1(jend) 
     617         DO ji = 1, jpi 
     618            ssha_e(ji,jj) = hbdy(ji,jj) 
    640619         ENDDO 
    641       ENDIF 
     620      ENDDO 
    642621      ! 
    643622      ! --- North --- ! 
    644       IF((nbondj == 1).OR.(nbondj == 2)) THEN 
    645          indy = nlcj-nbghostcells 
    646          DO jj = indy, nlcj-1 
    647             DO ji = 1, jpi 
    648                ssha_e(ji,jj) = hbdy_n(ji,jj-indy+1) 
    649             ENDDO 
     623      jstart = jpjglo - nbghostcells 
     624      jend   = jpjglo - 1 
     625      DO jj = mj0(jstart), mj1(jend) 
     626         DO ji = 1, jpi 
     627            ssha_e(ji,jj) = hbdy(ji,jj) 
    650628         ENDDO 
    651       ENDIF 
     629      ENDDO 
    652630      ! 
    653631   END SUBROUTINE Agrif_ssh_ts 
     
    675653    
    676654 
    677    SUBROUTINE interptsn( ptab, i1, i2, j1, j2, k1, k2, n1, n2, before, nb, ndir ) 
     655   SUBROUTINE interptsn( ptab, i1, i2, j1, j2, k1, k2, n1, n2, before ) 
    678656      !!---------------------------------------------------------------------- 
    679657      !!                  *** ROUTINE interptsn *** 
     
    682660      INTEGER                                     , INTENT(in   ) ::   i1, i2, j1, j2, k1, k2, n1, n2 
    683661      LOGICAL                                     , INTENT(in   ) ::   before 
    684       INTEGER                                     , INTENT(in   ) ::   nb , ndir 
    685       ! 
    686       INTEGER  ::   ji, jj, jk, jn, iref, jref, ibdy, jbdy   ! dummy loop indices 
    687       INTEGER  ::   imin, imax, jmin, jmax, N_in, N_out 
    688       REAL(wp) ::   zrho, z1, z2, z3, z4, z5, z6, z7 
    689       LOGICAL :: western_side, eastern_side,northern_side,southern_side 
     662      ! 
     663      INTEGER  ::   ji, jj, jk, jn  ! dummy loop indices 
     664      INTEGER  ::   N_in, N_out 
    690665      ! vertical interpolation: 
    691       REAL(wp), DIMENSION(i1:i2,j1:j2,1:jpk,n1:n2) :: ptab_child 
    692       REAL(wp), DIMENSION(k1:k2,n1:n2-1) :: tabin 
     666      REAL(wp) :: zhtot 
     667      REAL(wp), DIMENSION(k1:k2,1:jpts) :: tabin 
    693668      REAL(wp), DIMENSION(k1:k2) :: h_in 
    694669      REAL(wp), DIMENSION(1:jpk) :: h_out 
    695       REAL(wp) :: h_diff 
     670      !!---------------------------------------------------------------------- 
    696671 
    697672      IF( before ) THEN          
     
    707682 
    708683# if defined key_vertical 
     684        ! Interpolate thicknesses 
     685        ! Warning: these are masked, hence extrapolated prior interpolation. 
    709686        DO jk=k1,k2 
    710687           DO jj=j1,j2 
    711688              DO ji=i1,i2 
    712                  ptab(ji,jj,jk,jpts+1) = tmask(ji,jj,jk) * e3t(ji,jj,jk,Kmm_a)  
     689                  ptab(ji,jj,jk,jpts+1) = tmask(ji,jj,jk) * e3t(ji,jj,jk,Kmm_a) 
    713690              END DO 
    714691           END DO 
    715692        END DO 
     693 
     694        ! Extrapolate thicknesses in partial bottom cells: 
     695        ! Set them to Agrif_SpecialValue (0.). Correct bottom thicknesses are retrieved later on 
     696        IF (ln_zps) THEN 
     697           DO jj=j1,j2 
     698              DO ji=i1,i2 
     699                  jk = mbkt(ji,jj) 
     700                  ptab(ji,jj,jk,jpts+1) = 0._wp 
     701              END DO 
     702           END DO            
     703        END IF 
     704      
     705        ! Save ssh at last level: 
     706        IF (.NOT.ln_linssh) THEN 
     707           ptab(i1:i2,j1:j2,k2,jpts+1) = ssh(i1:i2,j1:j2,Kmm_a)*tmask(i1:i2,j1:j2,1)  
     708        ELSE 
     709           ptab(i1:i2,j1:j2,k2,jpts+1) = 0._wp 
     710        END IF       
    716711# endif 
    717712      ELSE  
    718713 
    719          western_side  = (nb == 1).AND.(ndir == 1)   ;   eastern_side  = (nb == 1).AND.(ndir == 2) 
    720          southern_side = (nb == 2).AND.(ndir == 1)   ;   northern_side = (nb == 2).AND.(ndir == 2) 
    721  
    722 # if defined key_vertical               
     714# if defined key_vertical  
     715         IF (ln_linssh) ptab(i1:i2,j1:j2,k2,n2) = 0._wp  
     716             
    723717         DO jj=j1,j2 
    724718            DO ji=i1,i2 
    725                iref = ji 
    726                jref = jj 
    727                if(western_side)  iref=MAX(2     ,ji) 
    728                if(eastern_side)  iref=MIN(nlci-1,ji) 
    729                if(southern_side) jref=MAX(2     ,jj) 
    730                if(northern_side) jref=MIN(nlcj-1,jj) 
    731                N_in = 0 
    732                DO jk=k1,k2 !k2 = jpk of parent grid 
    733                   IF (ptab(ji,jj,jk,n2) == 0) EXIT 
    734                   N_in = N_in + 1 
     719               ts(ji,jj,:,:,Krhs_a) = 0._wp 
     720               N_in = mbkt_parent(ji,jj) 
     721               zhtot = 0._wp 
     722               DO jk=1,N_in !k2 = jpk of parent grid 
     723                  IF (jk==N_in) THEN 
     724                     h_in(jk) = ht0_parent(ji,jj) + ptab(ji,jj,k2,n2) - zhtot 
     725                  ELSE 
     726                     h_in(jk) = ptab(ji,jj,jk,n2) 
     727                  ENDIF 
     728                  zhtot = zhtot + h_in(jk) 
    735729                  tabin(jk,:) = ptab(ji,jj,jk,n1:n2-1) 
    736                   h_in(N_in)  = ptab(ji,jj,jk,n2) 
    737730               END DO 
    738731               N_out = 0 
    739732               DO jk=1,jpk ! jpk of child grid 
    740                   IF (tmask(iref,jref,jk) == 0) EXIT  
     733                  IF (tmask(ji,jj,jk) == 0._wp) EXIT  
    741734                  N_out = N_out + 1 
    742                   h_out(jk) = e3t(iref,jref,jk,Kmm_a) 
     735                  h_out(jk) = e3t(ji,jj,jk,Krhs_a) 
    743736               ENDDO 
    744                IF (N_in > 0) THEN 
    745                   DO jn=1,jpts 
    746                      call reconstructandremap(tabin(1:N_in,jn),h_in,ptab_child(ji,jj,1:N_out,jn),h_out,N_in,N_out) 
    747                   ENDDO 
     737               IF (N_in*N_out > 0) THEN 
     738                  CALL reconstructandremap(tabin(1:N_in,1:jpts),h_in(1:N_in),ts(ji,jj,1:N_out,1:jpts,Krhs_a),h_out(1:N_out),N_in,N_out,jpts) 
    748739               ENDIF 
    749740            ENDDO 
    750741         ENDDO 
    751742# else 
    752          ptab_child(i1:i2,j1:j2,1:jpk,1:jpts) = ptab(i1:i2,j1:j2,1:jpk,1:jpts) 
    753 # endif 
    754743         ! 
    755744         DO jn=1, jpts 
    756             ts(i1:i2,j1:j2,1:jpk,jn,Krhs_a)=ptab_child(i1:i2,j1:j2,1:jpk,jn)*tmask(i1:i2,j1:j2,1:jpk)  
    757          END DO 
    758  
    759          IF ( .NOT.lk_agrif_clp ) THEN  
    760             ! 
    761             imin = i1 ; imax = i2 
    762             jmin = j1 ; jmax = j2 
    763             !  
    764             ! Remove CORNERS 
    765             IF((nbondj == -1).OR.(nbondj == 2)) jmin = 2    + nbghostcells 
    766             IF((nbondj == +1).OR.(nbondj == 2)) jmax = nlcj - nbghostcells - 1 
    767             IF((nbondi == -1).OR.(nbondi == 2)) imin = 2    + nbghostcells 
    768             IF((nbondi == +1).OR.(nbondi == 2)) imax = nlci - nbghostcells - 1       
    769             ! 
    770             IF( eastern_side ) THEN 
    771                zrho = Agrif_Rhox() 
    772                z1 = ( zrho - 1._wp ) * 0.5_wp                     
    773                z3 = ( zrho - 1._wp ) / ( zrho + 1._wp )          
    774                z6 = 2._wp * ( zrho - 1._wp ) / ( zrho + 1._wp ) 
    775                z7 =       - ( zrho - 1._wp ) / ( zrho + 3._wp ) 
    776                z2 = 1._wp - z1 ; z4 = 1._wp - z3 ; z5 = 1._wp - z6 - z7 
    777                ! 
    778                ibdy = nlci-nbghostcells 
    779                DO jn = 1, jpts 
    780                   ts(ibdy+1,jmin:jmax,1:jpkm1,jn,Krhs_a) =  z1 * ptab_child(ibdy+1,jmin:jmax,1:jpkm1,jn) & 
    781                     &                                     + z2 * ptab_child(ibdy  ,jmin:jmax,1:jpkm1,jn) 
    782                   DO jk = 1, jpkm1 
    783                      DO jj = jmin,jmax 
    784                         IF( umask(ibdy-1,jj,jk) == 0._wp ) THEN 
    785                            ts(ibdy,jj,jk,jn,Krhs_a) = ts(ibdy+1,jj,jk,jn,Krhs_a) * tmask(ibdy,jj,jk) 
    786                         ELSE 
    787                            ts(ibdy,jj,jk,jn,Krhs_a) = (   z4 * ts(ibdy+1,jj,jk,jn,Krhs_a) & 
    788                     &                                  +  z3 * ts(ibdy-1,jj,jk,jn,Krhs_a) & 
    789                     &                                 ) *   tmask(ibdy  ,jj,jk) 
    790                            IF( uu(ibdy-1,jj,jk,Kmm_a) > 0._wp ) THEN 
    791                               ts(ibdy,jj,jk,jn,Krhs_a) = (  z6 * ts(ibdy-1,jj,jk,jn,Krhs_a) & 
    792                     &                                     + z5 * ts(ibdy+1,jj,jk,jn,Krhs_a) &  
    793                     &                                     + z7 * ts(ibdy-2,jj,jk,jn,Krhs_a) & 
    794                     &                                    ) *  tmask(ibdy  ,jj,jk) 
    795                            ENDIF 
    796                         ENDIF 
    797                      END DO 
    798                   END DO 
    799                   ! Restore ghost points: 
    800                   ts(ibdy+1,jmin:jmax,1:jpkm1,jn,Krhs_a) = ptab_child(ibdy+1,jmin:jmax,1:jpkm1,jn) & 
    801                     &                                     *     tmask(ibdy+1,jmin:jmax,1:jpkm1) 
    802                END DO 
    803             ENDIF 
    804             !  
    805             IF( northern_side ) THEN 
    806                zrho = Agrif_Rhoy() 
    807                z1 = ( zrho - 1._wp ) * 0.5_wp                     
    808                z3 = ( zrho - 1._wp ) / ( zrho + 1._wp )          
    809                z6 = 2._wp * ( zrho - 1._wp ) / ( zrho + 1._wp ) 
    810                z7 =       - ( zrho - 1._wp ) / ( zrho + 3._wp ) 
    811                z2 = 1._wp - z1 ; z4 = 1._wp - z3 ; z5 = 1._wp - z6 - z7 
    812                ! 
    813                jbdy = nlcj-nbghostcells          
    814                DO jn = 1, jpts 
    815                   ts(imin:imax,jbdy+1,1:jpkm1,jn,Krhs_a) =  z1 * ptab_child(imin:imax,jbdy+1,1:jpkm1,jn) & 
    816                     &                                     + z2 * ptab_child(imin:imax,jbdy  ,1:jpkm1,jn) 
    817                   DO jk = 1, jpkm1 
    818                      DO ji = imin,imax 
    819                         IF( vmask(ji,jbdy-1,jk) == 0._wp ) THEN 
    820                            ts(ji,jbdy,jk,jn,Krhs_a) = ts(ji,jbdy+1,jk,jn,Krhs_a) * tmask(ji,jbdy,jk) 
    821                         ELSE 
    822                            ts(ji,jbdy,jk,jn,Krhs_a)=(  z4 * ts(ji,jbdy+1,jk,jn,Krhs_a)   & 
    823                     &                                + z3 * ts(ji,jbdy-1,jk,jn,Krhs_a)   & 
    824                     &                               ) *  tmask(ji,jbdy  ,jk)         
    825                            IF (vv(ji,jbdy-1,jk,Kmm_a) > 0._wp ) THEN 
    826                               ts(ji,jbdy,jk,jn,Krhs_a)=(  z6 * ts(ji,jbdy-1,jk,jn,Krhs_a) & 
    827                     &                                   + z5 * ts(ji,jbdy+1,jk,jn,Krhs_a) & 
    828                     &                                   + z7 * ts(ji,jbdy-2,jk,jn,Krhs_a) & 
    829                     &                                  ) *  tmask(ji,jbdy  ,jk) 
    830                            ENDIF 
    831                         ENDIF 
    832                      END DO 
    833                   END DO 
    834                   ! Restore ghost points: 
    835                   ts(imin:imax,jbdy+1,1:jpkm1,jn,Krhs_a) = ptab_child(imin:imax,jbdy+1,1:jpkm1,jn) & 
    836                     &                                     *     tmask(imin:imax,jbdy+1,1:jpkm1) 
    837                END DO 
    838             ENDIF 
    839             ! 
    840             IF( western_side ) THEN 
    841                zrho = Agrif_Rhox() 
    842                z1 = ( zrho - 1._wp ) * 0.5_wp                     
    843                z3 = ( zrho - 1._wp ) / ( zrho + 1._wp )          
    844                z6 = 2._wp * ( zrho - 1._wp ) / ( zrho + 1._wp ) 
    845                z7 =       - ( zrho - 1._wp ) / ( zrho + 3._wp ) 
    846                z2 = 1._wp - z1 ; z4 = 1._wp - z3 ; z5 = 1._wp - z6 - z7 
    847                !     
    848                ibdy = 1+nbghostcells        
    849                DO jn = 1, jpts 
    850                   ts(ibdy-1,jmin:jmax,1:jpkm1,jn,Krhs_a) =  z1 * ptab_child(ibdy-1,jmin:jmax,1:jpkm1,jn) & 
    851                     &                                     + z2 * ptab_child(ibdy  ,jmin:jmax,1:jpkm1,jn) 
    852                   DO jk = 1, jpkm1 
    853                      DO jj = jmin,jmax 
    854                         IF( umask(ibdy,jj,jk) == 0._wp ) THEN 
    855                            ts(ibdy,jj,jk,jn,Krhs_a) = ts(ibdy-1,jj,jk,jn,Krhs_a) * tmask(ibdy,jj,jk) 
    856                         ELSE 
    857                            ts(ibdy,jj,jk,jn,Krhs_a) = (  z4 * ts(ibdy-1,jj,jk,jn,Krhs_a) & 
    858                     &                                  + z3 * ts(ibdy+1,jj,jk,jn,Krhs_a) & 
    859                     &                                 ) *  tmask(ibdy  ,jj,jk)         
    860                            IF( uu(ibdy,jj,jk,Kmm_a) < 0._wp ) THEN 
    861                               ts(ibdy,jj,jk,jn,Krhs_a) = (  z6 * ts(ibdy+1,jj,jk,jn,Krhs_a) & 
    862                     &                                     + z5 * ts(ibdy-1,jj,jk,jn,Krhs_a) & 
    863                     &                                     + z7 * ts(ibdy+2,jj,jk,jn,Krhs_a) & 
    864                     &                                    ) *  tmask(ibdy,jj,jk) 
    865                            ENDIF 
    866                         ENDIF 
    867                      END DO 
    868                   END DO 
    869                   ! Restore ghost points: 
    870                   ts(ibdy-1,jmin:jmax,1:jpkm1,jn,Krhs_a) = ptab_child(ibdy-1,jmin:jmax,1:jpkm1,jn) & 
    871                     &                                     *     tmask(ibdy-1,jmin:jmax,1:jpkm1) 
    872                END DO 
    873             ENDIF 
    874             ! 
    875             IF( southern_side ) THEN 
    876                zrho = Agrif_Rhoy() 
    877                z1 = ( zrho - 1._wp ) * 0.5_wp                     
    878                z3 = ( zrho - 1._wp ) / ( zrho + 1._wp )          
    879                z6 = 2._wp * ( zrho - 1._wp ) / ( zrho + 1._wp ) 
    880                z7 =       - ( zrho - 1._wp ) / ( zrho + 3._wp ) 
    881                z2 = 1._wp - z1 ; z4 = 1._wp - z3 ; z5 = 1._wp - z6 - z7 
    882                !   
    883                jbdy=1+nbghostcells         
    884                DO jn = 1, jpts 
    885                   ts(imin:imax,jbdy-1,1:jpkm1,jn,Krhs_a) =  z1 * ptab_child(imin:imax,jbdy-1,1:jpkm1,jn) & 
    886                     &                                     + z2 * ptab_child(imin:imax,jbdy  ,1:jpkm1,jn) 
    887                   DO jk = 1, jpkm1       
    888                      DO ji = imin,imax 
    889                         IF( vmask(ji,jbdy,jk) == 0._wp ) THEN 
    890                            ts(ji,jbdy,jk,jn,Krhs_a) = ts(ji,jbdy-1,jk,jn,Krhs_a) * tmask(ji,jbdy,jk) 
    891                         ELSE 
    892                            ts(ji,jbdy,jk,jn,Krhs_a) = (  z4 * ts(ji,jbdy-1,jk,jn,Krhs_a) & 
    893                     &                                  + z3 * ts(ji,jbdy+1,jk,jn,Krhs_a) & 
    894                     &                                 ) *  tmask(ji,jbdy  ,jk) 
    895                            IF( vv(ji,jbdy,jk,Kmm_a) < 0._wp ) THEN 
    896                               ts(ji,jbdy,jk,jn,Krhs_a) = (  z6 * ts(ji,jbdy+1,jk,jn,Krhs_a) & 
    897                     &                                     + z5 * ts(ji,jbdy-1,jk,jn,Krhs_a) &  
    898                     &                                     + z7 * ts(ji,jbdy+2,jk,jn,Krhs_a) & 
    899                     &                                    ) *  tmask(ji,jbdy  ,jk) 
    900                            ENDIF 
    901                         ENDIF 
    902                      END DO 
    903                   END DO 
    904                   ! Restore ghost points: 
    905                   ts(imin:imax,jbdy-1,1:jpkm1,jn,Krhs_a) = ptab_child(imin:imax,jbdy-1,1:jpkm1,jn) & 
    906                     &                                     *     tmask(imin:imax,jbdy-1,1:jpkm1) 
    907                END DO 
    908             ENDIF 
    909             ! 
    910          ENDIF 
     745            ts(i1:i2,j1:j2,1:jpk,jn,Krhs_a)=ptab(i1:i2,j1:j2,1:jpk,jn)*tmask(i1:i2,j1:j2,1:jpk)  
     746         END DO 
     747# endif 
     748 
    911749      ENDIF 
    912750      ! 
    913751   END SUBROUTINE interptsn 
    914752 
    915    SUBROUTINE interpsshn( ptab, i1, i2, j1, j2, before, nb, ndir ) 
     753   SUBROUTINE interpsshn( ptab, i1, i2, j1, j2, before ) 
    916754      !!---------------------------------------------------------------------- 
    917755      !!                  ***  ROUTINE interpsshn  *** 
     
    920758      REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) ::   ptab 
    921759      LOGICAL                         , INTENT(in   ) ::   before 
    922       INTEGER                         , INTENT(in   ) ::   nb , ndir 
    923       ! 
    924       LOGICAL :: western_side, eastern_side,northern_side,southern_side 
     760      ! 
    925761      !!----------------------------------------------------------------------   
    926762      ! 
     
    928764         ptab(i1:i2,j1:j2) = ssh(i1:i2,j1:j2,Kmm_a) 
    929765      ELSE 
    930          western_side  = (nb == 1).AND.(ndir == 1) 
    931          eastern_side  = (nb == 1).AND.(ndir == 2) 
    932          southern_side = (nb == 2).AND.(ndir == 1) 
    933          northern_side = (nb == 2).AND.(ndir == 2) 
    934          !! clem ghost 
    935          IF(western_side)  hbdy_w(1:nbghostcells,j1:j2) = ptab(i1:i2,j1:j2) * tmask(i1:i2,j1:j2,1) 
    936          IF(eastern_side)  hbdy_e(1:nbghostcells,j1:j2) = ptab(i1:i2,j1:j2) * tmask(i1:i2,j1:j2,1) 
    937          IF(southern_side) hbdy_s(i1:i2,1:nbghostcells) = ptab(i1:i2,j1:j2) * tmask(i1:i2,j1:j2,1)  
    938          IF(northern_side) hbdy_n(i1:i2,1:nbghostcells) = ptab(i1:i2,j1:j2) * tmask(i1:i2,j1:j2,1) 
     766         hbdy(i1:i2,j1:j2) = ptab(i1:i2,j1:j2) * tmask(i1:i2,j1:j2,1) 
    939767      ENDIF 
    940768      ! 
    941769   END SUBROUTINE interpsshn 
    942770 
    943    SUBROUTINE interpun( ptab, i1, i2, j1, j2, k1, k2, m1, m2, before, nb, ndir ) 
     771   SUBROUTINE interpun( ptab, i1, i2, j1, j2, k1, k2, m1, m2, before ) 
    944772      !!---------------------------------------------------------------------- 
    945773      !!                  *** ROUTINE interpun *** 
     
    949777      REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2,m1:m2), INTENT(inout) :: ptab 
    950778      LOGICAL, INTENT(in) :: before 
    951       INTEGER, INTENT(in) :: nb , ndir 
    952779      !! 
    953780      INTEGER :: ji,jj,jk 
    954       REAL(wp) :: zrhoy 
     781      REAL(wp) :: zrhoy, zhtot 
    955782      ! vertical interpolation: 
    956783      REAL(wp), DIMENSION(k1:k2) :: tabin, h_in 
    957784      REAL(wp), DIMENSION(1:jpk) :: h_out 
    958       INTEGER  :: N_in, N_out, iref 
     785      INTEGER  :: N_in, N_out 
    959786      REAL(wp) :: h_diff 
    960       LOGICAL  :: western_side, eastern_side 
    961787      !!---------------------------------------------     
    962788      ! 
     
    965791            DO jj=j1,j2 
    966792               DO ji=i1,i2 
    967                   ptab(ji,jj,jk,1) = (  e2u(ji,jj)          *   e3u(ji,jj,jk,Kmm_a)  & 
    968                     &                 *  uu(ji,jj,jk,Kmm_a) * umask(ji,jj,jk)      )  
     793                  ptab(ji,jj,jk,1) = (e2u(ji,jj) * e3u(ji,jj,jk,Kmm_a) * uu(ji,jj,jk,Kmm_a)*umask(ji,jj,jk))  
    969794# if defined key_vertical 
    970                   ptab(ji,jj,jk,2) = (umask(ji,jj,jk) * e2u(ji,jj) * e3u(ji,jj,jk,Kmm_a)) 
     795                  ! Interpolate thicknesses (masked for subsequent extrapolation) 
     796                  ptab(ji,jj,jk,2) = umask(ji,jj,jk) * e2u(ji,jj) * e3u(ji,jj,jk,Kmm_a) 
    971797# endif 
    972798               END DO 
    973799            END DO 
    974800         END DO 
     801# if defined key_vertical 
     802         ! Extrapolate thicknesses in partial bottom cells: 
     803         ! Set them to Agrif_SpecialValue (0.). Correct bottom thicknesses are retrieved later on 
     804         IF (ln_zps) THEN 
     805            DO jj=j1,j2 
     806               DO ji=i1,i2 
     807                  jk = mbku(ji,jj) 
     808                  ptab(ji,jj,jk,2) = 0._wp 
     809               END DO 
     810            END DO            
     811         END IF 
     812        ! Save ssh at last level: 
     813        ptab(i1:i2,j1:j2,k2,2) = 0._wp 
     814        IF (.NOT.ln_linssh) THEN 
     815           ! This vertical sum below should be replaced by the sea-level at U-points (optimization): 
     816           DO jk=1,jpk 
     817              ptab(i1:i2,j1:j2,k2,2) = ptab(i1:i2,j1:j2,k2,2) + e3u(i1:i2,j1:j2,jk,Kmm_a) * umask(i1:i2,j1:j2,jk) 
     818           END DO 
     819           ptab(i1:i2,j1:j2,k2,2) = ptab(i1:i2,j1:j2,k2,2) - hu_0(i1:i2,j1:j2) 
     820        END IF  
     821# endif 
     822         ! 
    975823      ELSE 
    976824         zrhoy = Agrif_rhoy() 
    977825# if defined key_vertical 
    978826! VERTICAL REFINEMENT BEGIN 
    979          western_side  = (nb == 1).AND.(ndir == 1) 
    980          eastern_side  = (nb == 1).AND.(ndir == 2) 
     827 
     828         IF (ln_linssh) ptab(i1:i2,j1:j2,k2,2) = 0._wp  
    981829 
    982830         DO ji=i1,i2 
    983             iref = ji 
    984             IF (western_side) iref = MAX(2,ji) 
    985             IF (eastern_side) iref = MIN(nlci-2,ji) 
    986831            DO jj=j1,j2 
    987                N_in = 0 
    988                DO jk=k1,k2 
    989                   IF (ptab(ji,jj,jk,2) == 0) EXIT 
    990                   N_in = N_in + 1 
    991                   tabin(jk)  = ptab(ji,jj,jk,1)/ptab(ji,jj,jk,2) 
    992                   h_in(N_in) = ptab(ji,jj,jk,2)/(e2u(ji,jj)*zrhoy)  
     832               uu(ji,jj,:,Krhs_a) = 0._wp 
     833               N_in = mbku_parent(ji,jj) 
     834               zhtot = 0._wp 
     835               DO jk=1,N_in 
     836                  IF (jk==N_in) THEN 
     837                     h_in(jk) = hu0_parent(ji,jj) + ptab(ji,jj,k2,2) - zhtot 
     838                  ELSE 
     839                     h_in(jk) = ptab(ji,jj,jk,2)/(e2u(ji,jj)*zrhoy)  
     840                  ENDIF 
     841                  zhtot = zhtot + h_in(jk) 
     842                  tabin(jk) = ptab(ji,jj,jk,1)/(e2u(ji,jj)*zrhoy*h_in(jk)) 
    993843              ENDDO 
    994           
    995               IF (N_in == 0) THEN 
    996                  uu(ji,jj,:,Krhs_a) = 0._wp 
    997                  CYCLE 
    998               ENDIF 
    999           
     844                   
    1000845              N_out = 0 
    1001846              DO jk=1,jpk 
    1002                  if (umask(iref,jj,jk) == 0) EXIT 
     847                 if (umask(ji,jj,jk) == 0) EXIT 
    1003848                 N_out = N_out + 1 
    1004                  h_out(N_out) = e3u(iref,jj,jk,Krhs_a) 
     849                 h_out(N_out) = e3u(ji,jj,jk,Krhs_a) 
    1005850              ENDDO 
    1006           
    1007               IF (N_out == 0) THEN 
    1008                  uu(ji,jj,:,Krhs_a) = 0._wp 
    1009                  CYCLE 
     851              IF (N_in*N_out > 0) THEN 
     852                 CALL reconstructandremap(tabin(1:N_in),h_in(1:N_in),uu(ji,jj,1:N_out,Krhs_a),h_out(1:N_out),N_in,N_out,1) 
    1010853              ENDIF 
    1011           
    1012               IF (N_in * N_out > 0) THEN 
    1013                  h_diff = SUM( h_out(1:N_out) ) - SUM( h_in(1:N_in) ) 
    1014 ! Should be able to remove the next IF/ELSEIF statement once scale factors are dealt with properly 
    1015                  if (h_diff < -1.e4) then 
    1016                     print *,'CHECK YOUR BATHY ...', h_diff, SUM( h_out(1:N_out) ), SUM( h_in(1:N_in) ) 
    1017 !                    stop 
    1018                  endif 
    1019               ENDIF 
    1020               call reconstructandremap( tabin(1:N_in) , h_in(1:N_in), uu(ji,jj,1:N_out,Krhs_a), & 
    1021                     &                   h_out(1:N_out), N_in        , N_out                    ) 
    1022854            ENDDO 
    1023855         ENDDO 
     
    1035867   END SUBROUTINE interpun 
    1036868 
    1037    SUBROUTINE interpvn( ptab, i1, i2, j1, j2, k1, k2, m1, m2, before, nb, ndir ) 
     869   SUBROUTINE interpvn( ptab, i1, i2, j1, j2, k1, k2, m1, m2, before ) 
    1038870      !!---------------------------------------------------------------------- 
    1039871      !!                  *** ROUTINE interpvn *** 
     
    1043875      REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2,m1:m2), INTENT(inout) :: ptab 
    1044876      LOGICAL, INTENT(in) :: before 
    1045       INTEGER, INTENT(in) :: nb , ndir 
    1046877      ! 
    1047878      INTEGER :: ji,jj,jk 
     
    1050881      REAL(wp), DIMENSION(k1:k2) :: tabin, h_in 
    1051882      REAL(wp), DIMENSION(1:jpk) :: h_out 
    1052       INTEGER  :: N_in, N_out, jref 
    1053       REAL(wp) :: h_diff 
    1054       LOGICAL  :: northern_side,southern_side 
     883      INTEGER  :: N_in, N_out 
     884      REAL(wp) :: h_diff, zhtot 
    1055885      !!---------------------------------------------     
    1056886      !       
     
    1059889            DO jj=j1,j2 
    1060890               DO ji=i1,i2 
    1061                   ptab(ji,jj,jk,1) = (  e1v(ji,jj)          *   e3v(ji,jj,jk,Kmm_a) & 
    1062                     &                 *  vv(ji,jj,jk,Kmm_a) * vmask(ji,jj,jk)      ) 
     891                  ptab(ji,jj,jk,1) = (e1v(ji,jj) * e3v(ji,jj,jk,Kmm_a) * vv(ji,jj,jk,Kmm_a)*vmask(ji,jj,jk)) 
    1063892# if defined key_vertical 
     893                  ! Interpolate thicknesses (masked for subsequent extrapolation) 
    1064894                  ptab(ji,jj,jk,2) = vmask(ji,jj,jk) * e1v(ji,jj) * e3v(ji,jj,jk,Kmm_a) 
    1065895# endif 
     
    1067897            END DO 
    1068898         END DO 
     899# if defined key_vertical 
     900         ! Extrapolate thicknesses in partial bottom cells: 
     901         ! Set them to Agrif_SpecialValue (0.). Correct bottom thicknesses are retrieved later on 
     902         IF (ln_zps) THEN 
     903            DO jj=j1,j2 
     904               DO ji=i1,i2 
     905                  jk = mbkv(ji,jj) 
     906                  ptab(ji,jj,jk,2) = 0._wp 
     907               END DO 
     908            END DO            
     909         END IF 
     910        ! Save ssh at last level: 
     911        ptab(i1:i2,j1:j2,k2,2) = 0._wp 
     912        IF (.NOT.ln_linssh) THEN 
     913           ! This vertical sum below should be replaced by the sea-level at V-points (optimization): 
     914           DO jk=1,jpk 
     915              ptab(i1:i2,j1:j2,k2,2) = ptab(i1:i2,j1:j2,k2,2) + e3v(i1:i2,j1:j2,jk,Kmm_a) * vmask(i1:i2,j1:j2,jk) 
     916           END DO 
     917           ptab(i1:i2,j1:j2,k2,2) = ptab(i1:i2,j1:j2,k2,2) - hv_0(i1:i2,j1:j2) 
     918        END IF  
     919# endif 
    1069920      ELSE        
    1070921         zrhox = Agrif_rhox() 
    1071922# if defined key_vertical 
    1072923 
    1073          southern_side = (nb == 2).AND.(ndir == 1) 
    1074          northern_side = (nb == 2).AND.(ndir == 2) 
     924         IF (ln_linssh) ptab(i1:i2,j1:j2,k2,2) = 0._wp  
    1075925 
    1076926         DO jj=j1,j2 
    1077             jref = jj 
    1078             IF (southern_side) jref = MAX(2,jj) 
    1079             IF (northern_side) jref = MIN(nlcj-2,jj) 
    1080927            DO ji=i1,i2 
    1081                N_in = 0 
    1082                DO jk=k1,k2 
    1083                   if (ptab(ji,jj,jk,2) == 0) EXIT 
    1084                   N_in = N_in + 1 
    1085                   tabin(jk)  = ptab(ji,jj,jk,1)/ptab(ji,jj,jk,2) 
    1086                   h_in(N_in) = ptab(ji,jj,jk,2)/(e1v(ji,jj)*zrhox) 
    1087                END DO 
    1088                IF (N_in == 0) THEN 
    1089                   vv(ji,jj,:,Krhs_a) = 0._wp 
    1090                   CYCLE 
    1091                ENDIF 
     928               vv(ji,jj,:,Krhs_a) = 0._wp 
     929               N_in = mbkv_parent(ji,jj) 
     930               zhtot = 0._wp 
     931               DO jk=1,N_in 
     932                  IF (jk==N_in) THEN 
     933                     h_in(jk) = hv0_parent(ji,jj) + ptab(ji,jj,k2,2) - zhtot 
     934                  ELSE 
     935                     h_in(jk) = ptab(ji,jj,jk,2)/(e1v(ji,jj)*zrhox)  
     936                  ENDIF 
     937                  zhtot = zhtot + h_in(jk) 
     938                  tabin(jk) = ptab(ji,jj,jk,1)/(e1v(ji,jj)*zrhox*h_in(jk)) 
     939              ENDDO 
    1092940          
    1093941               N_out = 0 
    1094942               DO jk=1,jpk 
    1095                   if (vmask(ji,jref,jk) == 0) EXIT 
     943                  if (vmask(ji,jj,jk) == 0) EXIT 
    1096944                  N_out = N_out + 1 
    1097                   h_out(N_out) = e3v(ji,jref,jk,Krhs_a) 
    1098                END DO 
    1099                IF (N_out == 0) THEN 
    1100                  vv(ji,jj,:,Krhs_a) = 0._wp 
    1101                  CYCLE 
     945                  h_out(N_out) = e3v(ji,jj,jk,Krhs_a) 
     946               END DO 
     947               IF (N_in*N_out > 0) THEN 
     948                  call reconstructandremap(tabin(1:N_in),h_in(1:N_in),vv(ji,jj,1:N_out,Krhs_a),h_out(1:N_out),N_in,N_out,1) 
    1102949               ENDIF 
    1103                call reconstructandremap( tabin(1:N_in) , h_in(1:N_in), vv(ji,jj,1:N_out,Krhs_a), & 
    1104                     &                    h_out(1:N_out), N_in        , N_out                    ) 
    1105950            END DO 
    1106951         END DO 
     
    1114959   END SUBROUTINE interpvn 
    1115960 
    1116    SUBROUTINE interpunb( ptab, i1, i2, j1, j2, before, nb, ndir ) 
     961   SUBROUTINE interpunb( ptab, i1, i2, j1, j2, before) 
    1117962      !!---------------------------------------------------------------------- 
    1118963      !!                  ***  ROUTINE interpunb  *** 
     
    1121966      REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) ::   ptab 
    1122967      LOGICAL                         , INTENT(in   ) ::   before 
    1123       INTEGER                         , INTENT(in   ) ::   nb , ndir 
    1124968      ! 
    1125969      INTEGER  ::   ji, jj 
    1126970      REAL(wp) ::   zrhoy, zrhot, zt0, zt1, ztcoeff 
    1127       LOGICAL  ::   western_side, eastern_side,northern_side,southern_side 
    1128971      !!----------------------------------------------------------------------   
    1129972      ! 
     
    1131974         ptab(i1:i2,j1:j2) = e2u(i1:i2,j1:j2) * hu(i1:i2,j1:j2,Kmm_a) * uu_b(i1:i2,j1:j2,Kmm_a) 
    1132975      ELSE 
    1133          western_side  = (nb == 1).AND.(ndir == 1) 
    1134          eastern_side  = (nb == 1).AND.(ndir == 2) 
    1135          southern_side = (nb == 2).AND.(ndir == 1) 
    1136          northern_side = (nb == 2).AND.(ndir == 2) 
    1137976         zrhoy = Agrif_Rhoy() 
    1138977         zrhot = Agrif_rhot() 
     
    1140979         zt0 = REAL(Agrif_NbStepint()  , wp) / zrhot 
    1141980         zt1 = REAL(Agrif_NbStepint()+1, wp) / zrhot       
    1142          ! Polynomial interpolation coefficients: 
    1143          IF( bdy_tinterp == 1 ) THEN 
    1144             ztcoeff = zrhot * (  zt1**2._wp * (       zt1 - 1._wp)        & 
    1145                &               - zt0**2._wp * (       zt0 - 1._wp)        ) 
    1146          ELSEIF( bdy_tinterp == 2 ) THEN 
    1147             ztcoeff = zrhot * (  zt1        * (       zt1 - 1._wp)**2._wp & 
    1148                &               - zt0        * (       zt0 - 1._wp)**2._wp ) 
    1149          ELSE 
    1150             ztcoeff = 1 
    1151          ENDIF 
    1152          !    
    1153          IF(western_side)   ubdy_w(1:nbghostcells,j1:j2) = ubdy_w(1:nbghostcells,j1:j2) + ztcoeff * ptab(i1:i2,j1:j2)   
    1154          IF(eastern_side)   ubdy_e(1:nbghostcells,j1:j2) = ubdy_e(1:nbghostcells,j1:j2) + ztcoeff * ptab(i1:i2,j1:j2)   
    1155          IF(southern_side)  ubdy_s(i1:i2,1:nbghostcells) = ubdy_s(i1:i2,1:nbghostcells) + ztcoeff * ptab(i1:i2,j1:j2) 
    1156          IF(northern_side)  ubdy_n(i1:i2,1:nbghostcells) = ubdy_n(i1:i2,1:nbghostcells) + ztcoeff * ptab(i1:i2,j1:j2)  
    1157          !             
    1158          IF( bdy_tinterp == 0 .OR. bdy_tinterp == 2) THEN 
    1159             IF(western_side)   ubdy_w(1:nbghostcells,j1:j2) = ubdy_w(1:nbghostcells,j1:j2) / (zrhoy*e2u(i1:i2,j1:j2)) * umask(i1:i2,j1:j2,1) 
    1160             IF(eastern_side)   ubdy_e(1:nbghostcells,j1:j2) = ubdy_e(1:nbghostcells,j1:j2) / (zrhoy*e2u(i1:i2,j1:j2)) * umask(i1:i2,j1:j2,1) 
    1161             IF(southern_side)  ubdy_s(i1:i2,1:nbghostcells) = ubdy_s(i1:i2,1:nbghostcells) / (zrhoy*e2u(i1:i2,j1:j2)) * umask(i1:i2,j1:j2,1) 
    1162             IF(northern_side)  ubdy_n(i1:i2,1:nbghostcells) = ubdy_n(i1:i2,1:nbghostcells) / (zrhoy*e2u(i1:i2,j1:j2)) * umask(i1:i2,j1:j2,1) 
    1163          ENDIF 
    1164       ENDIF 
     981         !  
     982         DO ji = i1, i2 
     983            DO jj = j1, j2 
     984               IF ( utint_stage(ji,jj) < (bdy_tinterp + 1) ) THEN 
     985                  IF    ( utint_stage(ji,jj) == 1  ) THEN 
     986                     ztcoeff = zrhot * (  zt1**2._wp * (       zt1 - 1._wp)        & 
     987                        &               - zt0**2._wp * (       zt0 - 1._wp)        ) 
     988                  ELSEIF( utint_stage(ji,jj) == 2  ) THEN 
     989                     ztcoeff = zrhot * (  zt1        * (       zt1 - 1._wp)**2._wp & 
     990                        &               - zt0        * (       zt0 - 1._wp)**2._wp ) 
     991                  ELSEIF( utint_stage(ji,jj) == 0  ) THEN                 
     992                     ztcoeff = 1._wp 
     993                  ELSE 
     994                     ztcoeff = 0._wp 
     995                  ENDIF 
     996                  !    
     997                  ubdy(ji,jj) = ubdy(ji,jj) + ztcoeff * ptab(ji,jj) 
     998                  !             
     999                  IF (( utint_stage(ji,jj) == 2 ).OR.( utint_stage(ji,jj) == 0 )) THEN 
     1000                     ubdy(ji,jj) = ubdy(ji,jj) / (zrhoy*e2u(ji,jj)) * umask(ji,jj,1) 
     1001                  ENDIF 
     1002                  ! 
     1003                  utint_stage(ji,jj) = utint_stage(ji,jj) + 1 
     1004               ENDIF 
     1005            END DO 
     1006         END DO 
     1007      END IF 
    11651008      !  
    11661009   END SUBROUTINE interpunb 
    11671010 
    11681011 
    1169    SUBROUTINE interpvnb( ptab, i1, i2, j1, j2, before, nb, ndir ) 
     1012   SUBROUTINE interpvnb( ptab, i1, i2, j1, j2, before ) 
    11701013      !!---------------------------------------------------------------------- 
    11711014      !!                  ***  ROUTINE interpvnb  *** 
     
    11741017      REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) ::   ptab 
    11751018      LOGICAL                         , INTENT(in   ) ::   before 
    1176       INTEGER                         , INTENT(in   ) ::   nb , ndir 
    1177       ! 
    1178       INTEGER  ::   ji,jj 
     1019      ! 
     1020      INTEGER  ::   ji, jj 
    11791021      REAL(wp) ::   zrhox, zrhot, zt0, zt1, ztcoeff    
    1180       LOGICAL  ::   western_side, eastern_side,northern_side,southern_side 
    11811022      !!----------------------------------------------------------------------   
    11821023      !  
     
    11841025         ptab(i1:i2,j1:j2) = e1v(i1:i2,j1:j2) * hv(i1:i2,j1:j2,Kmm_a) * vv_b(i1:i2,j1:j2,Kmm_a) 
    11851026      ELSE 
    1186          western_side  = (nb == 1).AND.(ndir == 1) 
    1187          eastern_side  = (nb == 1).AND.(ndir == 2) 
    1188          southern_side = (nb == 2).AND.(ndir == 1) 
    1189          northern_side = (nb == 2).AND.(ndir == 2) 
    11901027         zrhox = Agrif_Rhox() 
    11911028         zrhot = Agrif_rhot() 
    11921029         ! Time indexes bounds for integration 
    11931030         zt0 = REAL(Agrif_NbStepint()  , wp) / zrhot 
    1194          zt1 = REAL(Agrif_NbStepint()+1, wp) / zrhot       
    1195          IF( bdy_tinterp == 1 ) THEN 
    1196             ztcoeff = zrhot * (  zt1**2._wp * (       zt1 - 1._wp)        & 
    1197                &               - zt0**2._wp * (       zt0 - 1._wp)        ) 
    1198          ELSEIF( bdy_tinterp == 2 ) THEN 
    1199             ztcoeff = zrhot * (  zt1        * (       zt1 - 1._wp)**2._wp & 
    1200                &               - zt0        * (       zt0 - 1._wp)**2._wp )  
    1201          ELSE 
    1202             ztcoeff = 1 
    1203          ENDIF 
    1204          !! clem ghost 
    1205          IF(western_side)   vbdy_w(1:nbghostcells,j1:j2) = vbdy_w(1:nbghostcells,j1:j2) + ztcoeff * ptab(i1:i2,j1:j2)   
    1206          IF(eastern_side)   vbdy_e(1:nbghostcells,j1:j2) = vbdy_e(1:nbghostcells,j1:j2) + ztcoeff * ptab(i1:i2,j1:j2)    
    1207          IF(southern_side)  vbdy_s(i1:i2,1:nbghostcells) = vbdy_s(i1:i2,1:nbghostcells) + ztcoeff * ptab(i1:i2,j1:j2) 
    1208          IF(northern_side)  vbdy_n(i1:i2,1:nbghostcells) = vbdy_n(i1:i2,1:nbghostcells) + ztcoeff * ptab(i1:i2,j1:j2)  
    1209          !             
    1210          IF( bdy_tinterp == 0 .OR. bdy_tinterp == 2) THEN 
    1211             IF(western_side)   vbdy_w(1:nbghostcells,j1:j2) = vbdy_w(1:nbghostcells,j1:j2) / (zrhox*e1v(i1:i2,j1:j2)) * vmask(i1:i2,j1:j2,1) 
    1212             IF(eastern_side)   vbdy_e(1:nbghostcells,j1:j2) = vbdy_e(1:nbghostcells,j1:j2) / (zrhox*e1v(i1:i2,j1:j2)) * vmask(i1:i2,j1:j2,1) 
    1213             IF(southern_side)  vbdy_s(i1:i2,1:nbghostcells) = vbdy_s(i1:i2,1:nbghostcells) / (zrhox*e1v(i1:i2,j1:j2)) * vmask(i1:i2,j1:j2,1) 
    1214             IF(northern_side)  vbdy_n(i1:i2,1:nbghostcells) = vbdy_n(i1:i2,1:nbghostcells) / (zrhox*e1v(i1:i2,j1:j2)) * vmask(i1:i2,j1:j2,1) 
    1215          ENDIF 
     1031         zt1 = REAL(Agrif_NbStepint()+1, wp) / zrhot  
     1032         !      
     1033         DO ji = i1, i2 
     1034            DO jj = j1, j2 
     1035               IF ( vtint_stage(ji,jj) < (bdy_tinterp + 1) ) THEN 
     1036                  IF    ( vtint_stage(ji,jj) == 1  ) THEN 
     1037                     ztcoeff = zrhot * (  zt1**2._wp * (       zt1 - 1._wp)        & 
     1038                        &               - zt0**2._wp * (       zt0 - 1._wp)        ) 
     1039                  ELSEIF( vtint_stage(ji,jj) == 2  ) THEN 
     1040                     ztcoeff = zrhot * (  zt1        * (       zt1 - 1._wp)**2._wp & 
     1041                        &               - zt0        * (       zt0 - 1._wp)**2._wp ) 
     1042                  ELSEIF( vtint_stage(ji,jj) == 0  ) THEN                 
     1043                     ztcoeff = 1._wp 
     1044                  ELSE 
     1045                     ztcoeff = 0._wp 
     1046                  ENDIF 
     1047                  !    
     1048                  vbdy(ji,jj) = vbdy(ji,jj) + ztcoeff * ptab(ji,jj) 
     1049                  !             
     1050                  IF (( vtint_stage(ji,jj) == 2 ).OR.( vtint_stage(ji,jj) == 0 )) THEN 
     1051                     vbdy(ji,jj) = vbdy(ji,jj) / (zrhox*e1v(ji,jj)) * vmask(ji,jj,1) 
     1052                  ENDIF 
     1053                  ! 
     1054                  vtint_stage(ji,jj) = vtint_stage(ji,jj) + 1 
     1055               ENDIF 
     1056            END DO 
     1057         END DO           
    12161058      ENDIF 
    12171059      ! 
     
    12191061 
    12201062 
    1221    SUBROUTINE interpub2b( ptab, i1, i2, j1, j2, before, nb, ndir ) 
     1063   SUBROUTINE interpub2b( ptab, i1, i2, j1, j2, before ) 
    12221064      !!---------------------------------------------------------------------- 
    12231065      !!                  ***  ROUTINE interpub2b  *** 
     
    12261068      REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) ::   ptab 
    12271069      LOGICAL                         , INTENT(in   ) ::   before 
    1228       INTEGER                         , INTENT(in   ) ::   nb , ndir 
    12291070      ! 
    12301071      INTEGER  ::   ji,jj 
    1231       REAL(wp) ::   zrhot, zt0, zt1,zat 
    1232       LOGICAL  ::   western_side, eastern_side,northern_side,southern_side 
     1072      REAL(wp) ::   zrhot, zt0, zt1, zat 
    12331073      !!----------------------------------------------------------------------   
    12341074      IF( before ) THEN 
     
    12391079         ENDIF 
    12401080      ELSE 
    1241          western_side  = (nb == 1).AND.(ndir == 1) 
    1242          eastern_side  = (nb == 1).AND.(ndir == 2) 
    1243          southern_side = (nb == 2).AND.(ndir == 1) 
    1244          northern_side = (nb == 2).AND.(ndir == 2) 
    1245          zrhot = Agrif_rhot() 
    1246          ! Time indexes bounds for integration 
    1247          zt0 = REAL(Agrif_NbStepint()  , wp) / zrhot 
    1248          zt1 = REAL(Agrif_NbStepint()+1, wp) / zrhot 
    1249          ! Polynomial interpolation coefficients: 
    1250          zat = zrhot * (  zt1**2._wp * (-2._wp*zt1 + 3._wp)    & 
    1251             &           - zt0**2._wp * (-2._wp*zt0 + 3._wp)    )  
    1252          !! clem ghost 
    1253          IF(western_side ) ubdy_w(1:nbghostcells,j1:j2) = zat * ptab(i1:i2,j1:j2)   
    1254          IF(eastern_side ) ubdy_e(1:nbghostcells,j1:j2) = zat * ptab(i1:i2,j1:j2)   
    1255          IF(southern_side) ubdy_s(i1:i2,1:nbghostcells) = zat * ptab(i1:i2,j1:j2) 
    1256          IF(northern_side) ubdy_n(i1:i2,1:nbghostcells) = zat * ptab(i1:i2,j1:j2)  
    1257       ENDIF 
    1258       !  
    1259    END SUBROUTINE interpub2b 
    1260     
    1261  
    1262    SUBROUTINE interpvb2b( ptab, i1, i2, j1, j2, before, nb, ndir ) 
    1263       !!---------------------------------------------------------------------- 
    1264       !!                  ***  ROUTINE interpvb2b  *** 
    1265       !!----------------------------------------------------------------------   
    1266       INTEGER                         , INTENT(in   ) ::   i1, i2, j1, j2 
    1267       REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) ::   ptab 
    1268       LOGICAL                         , INTENT(in   ) ::   before 
    1269       INTEGER                         , INTENT(in   ) ::   nb , ndir 
    1270       ! 
    1271       INTEGER ::   ji,jj 
    1272       REAL(wp) ::   zrhot, zt0, zt1,zat 
    1273       LOGICAL ::   western_side, eastern_side,northern_side,southern_side 
    1274       !!----------------------------------------------------------------------   
    1275       ! 
    1276       IF( before ) THEN 
    1277          IF ( ln_bt_fw ) THEN 
    1278             ptab(i1:i2,j1:j2) = e1v(i1:i2,j1:j2) * vb2_b(i1:i2,j1:j2) 
    1279          ELSE 
    1280             ptab(i1:i2,j1:j2) = e1v(i1:i2,j1:j2) * vn_adv(i1:i2,j1:j2) 
    1281          ENDIF 
    1282       ELSE       
    1283          western_side  = (nb == 1).AND.(ndir == 1) 
    1284          eastern_side  = (nb == 1).AND.(ndir == 2) 
    1285          southern_side = (nb == 2).AND.(ndir == 1) 
    1286          northern_side = (nb == 2).AND.(ndir == 2) 
    12871081         zrhot = Agrif_rhot() 
    12881082         ! Time indexes bounds for integration 
     
    12931087            &           - zt0**2._wp * (-2._wp*zt0 + 3._wp)    )  
    12941088         ! 
    1295          IF(western_side )   vbdy_w(1:nbghostcells,j1:j2) = zat * ptab(i1:i2,j1:j2)   
    1296          IF(eastern_side )   vbdy_e(1:nbghostcells,j1:j2) = zat * ptab(i1:i2,j1:j2)   
    1297          IF(southern_side)   vbdy_s(i1:i2,1:nbghostcells) = zat * ptab(i1:i2,j1:j2) 
    1298          IF(northern_side)   vbdy_n(i1:i2,1:nbghostcells) = zat * ptab(i1:i2,j1:j2)  
     1089         ubdy(i1:i2,j1:j2) = zat * ptab(i1:i2,j1:j2)  
     1090         ! 
     1091         ! Update interpolation stage: 
     1092         utint_stage(i1:i2,j1:j2) = 1 
     1093      ENDIF 
     1094      !  
     1095   END SUBROUTINE interpub2b 
     1096    
     1097 
     1098   SUBROUTINE interpvb2b( ptab, i1, i2, j1, j2, before ) 
     1099      !!---------------------------------------------------------------------- 
     1100      !!                  ***  ROUTINE interpvb2b  *** 
     1101      !!----------------------------------------------------------------------   
     1102      INTEGER                         , INTENT(in   ) ::   i1, i2, j1, j2 
     1103      REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) ::   ptab 
     1104      LOGICAL                         , INTENT(in   ) ::   before 
     1105      ! 
     1106      INTEGER ::   ji,jj 
     1107      REAL(wp) ::   zrhot, zt0, zt1, zat 
     1108      !!----------------------------------------------------------------------   
     1109      ! 
     1110      IF( before ) THEN 
     1111         IF ( ln_bt_fw ) THEN 
     1112            ptab(i1:i2,j1:j2) = e1v(i1:i2,j1:j2) * vb2_b(i1:i2,j1:j2) 
     1113         ELSE 
     1114            ptab(i1:i2,j1:j2) = e1v(i1:i2,j1:j2) * vn_adv(i1:i2,j1:j2) 
     1115         ENDIF 
     1116      ELSE       
     1117         zrhot = Agrif_rhot() 
     1118         ! Time indexes bounds for integration 
     1119         zt0 = REAL(Agrif_NbStepint()  , wp) / zrhot 
     1120         zt1 = REAL(Agrif_NbStepint()+1, wp) / zrhot 
     1121         ! Polynomial interpolation coefficients: 
     1122         zat = zrhot * (  zt1**2._wp * (-2._wp*zt1 + 3._wp)    & 
     1123            &           - zt0**2._wp * (-2._wp*zt0 + 3._wp)    )  
     1124         ! 
     1125         vbdy(i1:i2,j1:j2) = zat * ptab(i1:i2,j1:j2) 
     1126         ! 
     1127         ! update interpolation stage: 
     1128         vtint_stage(i1:i2,j1:j2) = 1 
    12991129      ENDIF 
    13001130      !       
     
    13021132 
    13031133 
    1304    SUBROUTINE interpe3t( ptab, i1, i2, j1, j2, k1, k2, before, nb, ndir ) 
     1134   SUBROUTINE interpe3t( ptab, i1, i2, j1, j2, k1, k2, before ) 
    13051135      !!---------------------------------------------------------------------- 
    13061136      !!                  ***  ROUTINE interpe3t  *** 
     
    13091139      REAL(wp),DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) :: ptab 
    13101140      LOGICAL                              , INTENT(in   ) :: before 
    1311       INTEGER                              , INTENT(in   ) :: nb , ndir 
    13121141      ! 
    13131142      INTEGER :: ji, jj, jk 
    1314       LOGICAL :: western_side, eastern_side, northern_side, southern_side 
    13151143      !!----------------------------------------------------------------------   
    13161144      !     
     
    13181146         ptab(i1:i2,j1:j2,k1:k2) = tmask(i1:i2,j1:j2,k1:k2) * e3t_0(i1:i2,j1:j2,k1:k2) 
    13191147      ELSE 
    1320          western_side  = (nb == 1).AND.(ndir == 1) 
    1321          eastern_side  = (nb == 1).AND.(ndir == 2) 
    1322          southern_side = (nb == 2).AND.(ndir == 1) 
    1323          northern_side = (nb == 2).AND.(ndir == 2) 
    13241148         ! 
    13251149         DO jk = k1, k2 
    13261150            DO jj = j1, j2 
    13271151               DO ji = i1, i2 
    1328                   ! 
    13291152                  IF( ABS( ptab(ji,jj,jk) - tmask(ji,jj,jk) * e3t_0(ji,jj,jk) ) > 1.D-2) THEN 
    1330                      IF (western_side.AND.(ptab(i1+nbghostcells-1,jj,jk)>0._wp)) THEN 
    1331                         WRITE(numout,*) 'ERROR bathymetry merge at the western border ji,jj,jk ', ji+nimpp-1,jj+njmpp-1,jk 
    1332                         WRITE(numout,*)  ptab(ji,jj,jk), e3t_0(ji,jj,jk)  
    1333                         kindic_agr = kindic_agr + 1 
    1334                      ELSEIF (eastern_side.AND.(ptab(i2-nbghostcells+1,jj,jk)>0._wp)) THEN 
    1335                         WRITE(numout,*) 'ERROR bathymetry merge at the eastern border ji,jj,jk ', ji+nimpp-1,jj+njmpp-1,jk 
    1336                         WRITE(numout,*)  ptab(ji,jj,jk), e3t_0(ji,jj,jk) 
    1337                         kindic_agr = kindic_agr + 1 
    1338                      ELSEIF (southern_side.AND.(ptab(ji,j1+nbghostcells-1,jk)>0._wp)) THEN 
    1339                         WRITE(numout,*) 'ERROR bathymetry merge at the southern border ji,jj,jk', ji+nimpp-1,jj+njmpp-1,jk 
    1340                         WRITE(numout,*)  ptab(ji,jj,jk), e3t_0(ji,jj,jk) 
    1341                         kindic_agr = kindic_agr + 1 
    1342                      ELSEIF (northern_side.AND.(ptab(ji,j2-nbghostcells+1,jk)>0._wp)) THEN 
    1343                         WRITE(numout,*) 'ERROR bathymetry merge at the northen border ji,jj,jk', ji+nimpp-1,jj+njmpp-1,jk 
    1344                         WRITE(numout,*)  ptab(ji,jj,jk), e3t_0(ji,jj,jk) 
    1345                         kindic_agr = kindic_agr + 1 
    1346                      ENDIF 
     1153                     WRITE(numout,*) ' Agrif error for e3t_0: parent , child, i, j, k ',  &  
     1154                     &                 ptab(ji,jj,jk), tmask(ji,jj,jk) * e3t_0(ji,jj,jk), & 
     1155                     &                 ji+nimpp-1, jj+njmpp-1, jk 
     1156                     kindic_agr = kindic_agr + 1 
    13471157                  ENDIF 
    13481158               END DO 
     
    13531163      !  
    13541164   END SUBROUTINE interpe3t 
    1355  
    1356  
    1357    SUBROUTINE interpumsk( ptab, i1, i2, j1, j2, k1, k2, before, nb, ndir ) 
    1358       !!---------------------------------------------------------------------- 
    1359       !!                  ***  ROUTINE interpumsk  *** 
    1360       !!----------------------------------------------------------------------   
    1361       INTEGER                              , INTENT(in   ) ::   i1, i2, j1, j2, k1, k2 
    1362       REAL(wp),DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) ::   ptab 
    1363       LOGICAL                              , INTENT(in   ) ::   before 
    1364       INTEGER                              , INTENT(in   ) ::   nb , ndir 
    1365       ! 
    1366       INTEGER ::   ji, jj, jk 
    1367       LOGICAL ::   western_side, eastern_side    
    1368       !!----------------------------------------------------------------------   
    1369       !     
    1370       IF( before ) THEN 
    1371          ptab(i1:i2,j1:j2,k1:k2) = umask(i1:i2,j1:j2,k1:k2) 
    1372       ELSE 
    1373          western_side = (nb == 1).AND.(ndir == 1) 
    1374          eastern_side = (nb == 1).AND.(ndir == 2) 
    1375          DO jk = k1, k2 
    1376             DO jj = j1, j2 
    1377                DO ji = i1, i2 
    1378                    ! Velocity mask at boundary edge points: 
    1379                   IF (ABS(ptab(ji,jj,jk) - umask(ji,jj,jk)) > 1.D-2) THEN 
    1380                      IF (western_side) THEN 
    1381                         WRITE(numout,*) 'ERROR with umask at the western border ji,jj,jk ', ji+nimpp-1,jj+njmpp-1,jk 
    1382                         WRITE(numout,*) '      masks: parent, child ', ptab(ji,jj,jk), umask(ji,jj,jk) 
    1383                         kindic_agr = kindic_agr + 1 
    1384                      ELSEIF (eastern_side) THEN 
    1385                         WRITE(numout,*) 'ERROR with umask at the eastern border ji,jj,jk ', ji+nimpp-1,jj+njmpp-1,jk 
    1386                         WRITE(numout,*) '      masks: parent, child ', ptab(ji,jj,jk), umask(ji,jj,jk) 
    1387                         kindic_agr = kindic_agr + 1 
    1388                      ENDIF 
    1389                   ENDIF 
    1390                END DO 
    1391             END DO 
    1392          END DO 
    1393          ! 
    1394       ENDIF 
    1395       !  
    1396    END SUBROUTINE interpumsk 
    1397  
    1398  
    1399    SUBROUTINE interpvmsk( ptab, i1, i2, j1, j2, k1, k2, before, nb, ndir ) 
    1400       !!---------------------------------------------------------------------- 
    1401       !!                  ***  ROUTINE interpvmsk  *** 
    1402       !!----------------------------------------------------------------------   
    1403       INTEGER                              , INTENT(in   ) ::   i1,i2,j1,j2,k1,k2 
    1404       REAL(wp),DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) ::   ptab 
    1405       LOGICAL                              , INTENT(in   ) ::   before 
    1406       INTEGER                              , INTENT(in   ) :: nb , ndir 
    1407       ! 
    1408       INTEGER ::   ji, jj, jk 
    1409       LOGICAL ::   northern_side, southern_side      
    1410       !!----------------------------------------------------------------------   
    1411       !     
    1412       IF( before ) THEN 
    1413          ptab(i1:i2,j1:j2,k1:k2) = vmask(i1:i2,j1:j2,k1:k2) 
    1414       ELSE 
    1415          southern_side = (nb == 2).AND.(ndir == 1) 
    1416          northern_side = (nb == 2).AND.(ndir == 2) 
    1417          DO jk = k1, k2 
    1418             DO jj = j1, j2 
    1419                DO ji = i1, i2 
    1420                    ! Velocity mask at boundary edge points: 
    1421                   IF (ABS(ptab(ji,jj,jk) - vmask(ji,jj,jk)) > 1.D-2) THEN 
    1422                      IF (southern_side) THEN 
    1423                         WRITE(numout,*) 'ERROR with vmask at the southern border ji,jj,jk ', ji+nimpp-1,jj+njmpp-1,jk 
    1424                         WRITE(numout,*) '      masks: parent, child ', ptab(ji,jj,jk), vmask(ji,jj,jk) 
    1425                         kindic_agr = kindic_agr + 1 
    1426                      ELSEIF (northern_side) THEN 
    1427                         WRITE(numout,*) 'ERROR with vmask at the northern border ji,jj,jk ', ji+nimpp-1,jj+njmpp-1,jk 
    1428                         WRITE(numout,*) '      masks: parent, child ', ptab(ji,jj,jk), vmask(ji,jj,jk) 
    1429                         kindic_agr = kindic_agr + 1 
    1430                      ENDIF 
    1431                   ENDIF 
    1432                END DO 
    1433             END DO 
    1434          END DO 
    1435          ! 
    1436       ENDIF 
    1437       !  
    1438    END SUBROUTINE interpvmsk 
    14391165 
    14401166 
     
    14461172      REAL(wp),DIMENSION(i1:i2,j1:j2,k1:k2,m1:m2), INTENT(inout) ::   ptab 
    14471173      LOGICAL                                    , INTENT(in   ) ::   before 
    1448       REAL(wp), DIMENSION(k1:k2) :: tabin, h_in 
    1449       REAL(wp), DIMENSION(1:jpk) :: h_out 
    1450       INTEGER  :: N_in, N_out, ji, jj, jk 
     1174      ! 
     1175      INTEGER  :: ji, jj, jk 
     1176      INTEGER  :: N_in, N_out 
     1177      REAL(wp), DIMENSION(k1:k2) :: tabin, z_in 
     1178      REAL(wp), DIMENSION(1:jpk) :: z_out 
    14511179      !!----------------------------------------------------------------------   
    14521180      !       
     
    14591187           END DO 
    14601188        END DO 
    1461 #ifdef key_vertical          
     1189 
     1190# if defined key_vertical 
     1191        ! Interpolate thicknesses 
     1192        ! Warning: these are masked, hence extrapolated prior interpolation. 
    14621193        DO jk=k1,k2 
    14631194           DO jj=j1,j2 
    14641195              DO ji=i1,i2 
    1465                  ptab(ji,jj,jk,2) = wmask(ji,jj,jk) * e3w(ji,jj,jk,Kmm_a)  
     1196                  ptab(ji,jj,jk,2) = tmask(ji,jj,jk) * e3t(ji,jj,jk,Kmm_a) 
    14661197              END DO 
    14671198           END DO 
    14681199        END DO 
    1469 #endif 
     1200 
     1201        ! Extrapolate thicknesses in partial bottom cells: 
     1202        ! Set them to Agrif_SpecialValue (0.). Correct bottom thicknesses are retrieved later on 
     1203        IF (ln_zps) THEN 
     1204           DO jj=j1,j2 
     1205              DO ji=i1,i2 
     1206                  jk = mbkt(ji,jj) 
     1207                  ptab(ji,jj,jk,2) = 0._wp 
     1208              END DO 
     1209           END DO            
     1210        END IF 
     1211      
     1212        ! Save ssh at last level: 
     1213        IF (.NOT.ln_linssh) THEN 
     1214           ptab(i1:i2,j1:j2,k2,2) = ssh(i1:i2,j1:j2,Kmm_a)*tmask(i1:i2,j1:j2,1)  
     1215        ELSE 
     1216           ptab(i1:i2,j1:j2,k2,2) = 0._wp 
     1217        END IF       
     1218# endif 
    14701219      ELSE  
    14711220#ifdef key_vertical          
    1472          avm_k(i1:i2,j1:j2,1:jpk) = 0. 
    1473          DO jj=j1,j2 
    1474             DO ji=i1,i2 
    1475                N_in = 0 
    1476                DO jk=k1,k2 !k2 = jpk of parent grid 
    1477                   IF (ptab(ji,jj,jk,2) == 0) EXIT 
    1478                   N_in = N_in + 1 
    1479                   tabin(jk) = ptab(ji,jj,jk,1) 
    1480                   h_in(N_in) = ptab(ji,jj,jk,2) 
    1481                END DO 
    1482                N_out = 0 
    1483                DO jk=1,jpk ! jpk of child grid 
    1484                   IF (wmask(ji,jj,jk) == 0) EXIT  
    1485                   N_out = N_out + 1 
    1486                   h_out(jk) = e3t(ji,jj,jk,Kmm_a) 
     1221         IF (ln_linssh) ptab(i1:i2,j1:j2,k2,2) = 0._wp  
     1222         avm_k(i1:i2,j1:j2,k1:k2) = 0._wp 
     1223             
     1224         DO jj = j1, j2 
     1225            DO ji =i1, i2 
     1226               N_in = mbkt_parent(ji,jj) 
     1227               IF ( tmask(ji,jj,1) == 0._wp) N_in = 0 
     1228               z_in(N_in+1) = ht0_parent(ji,jj) + ptab(ji,jj,k2,2) 
     1229               DO jk = N_in, 1, -1  ! Parent vertical grid                
     1230                     z_in(jk) = z_in(jk+1) - ptab(ji,jj,jk,2) 
     1231                    tabin(jk) = ptab(ji,jj,jk,1) 
     1232               END DO 
     1233               N_out = mbkt(ji,jj)  
     1234               DO jk = 1, N_out        ! Child vertical grid 
     1235                  z_out(jk) = gdepw(ji,jj,jk,Kmm_a) 
    14871236               ENDDO 
    1488                IF (N_in > 0) THEN 
    1489                   CALL reconstructandremap(tabin(1:N_in),h_in,avm_k(ji,jj,1:N_out),h_out,N_in,N_out) 
     1237               IF (N_in*N_out > 0) THEN 
     1238                  CALL remap_linear(tabin(1:N_in),z_in(1:N_in),avm_k(ji,jj,1:N_out),z_out(1:N_out),N_in,N_out,1) 
    14901239               ENDIF 
    14911240            ENDDO 
     
    14971246      ! 
    14981247   END SUBROUTINE interpavm 
     1248 
     1249# if defined key_vertical 
     1250   SUBROUTINE interpmbkt( ptab, i1, i2, j1, j2, before ) 
     1251      !!---------------------------------------------------------------------- 
     1252      !!                  ***  ROUTINE interpsshn  *** 
     1253      !!----------------------------------------------------------------------   
     1254      INTEGER                         , INTENT(in   ) ::   i1, i2, j1, j2 
     1255      REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) ::   ptab 
     1256      LOGICAL                         , INTENT(in   ) ::   before 
     1257      ! 
     1258      !!----------------------------------------------------------------------   
     1259      ! 
     1260      IF( before) THEN 
     1261         ptab(i1:i2,j1:j2) = REAL(mbkt(i1:i2,j1:j2),wp) 
     1262      ELSE 
     1263         mbkt_parent(i1:i2,j1:j2) = NINT(ptab(i1:i2,j1:j2)) 
     1264      ENDIF 
     1265      ! 
     1266   END SUBROUTINE interpmbkt 
     1267 
     1268   SUBROUTINE interpht0( ptab, i1, i2, j1, j2, before ) 
     1269      !!---------------------------------------------------------------------- 
     1270      !!                  ***  ROUTINE interpsshn  *** 
     1271      !!----------------------------------------------------------------------   
     1272      INTEGER                         , INTENT(in   ) ::   i1, i2, j1, j2 
     1273      REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) ::   ptab 
     1274      LOGICAL                         , INTENT(in   ) ::   before 
     1275      ! 
     1276      !!----------------------------------------------------------------------   
     1277      ! 
     1278      IF( before) THEN 
     1279         ptab(i1:i2,j1:j2) = ht_0(i1:i2,j1:j2) 
     1280      ELSE 
     1281         ht0_parent(i1:i2,j1:j2) = ptab(i1:i2,j1:j2) 
     1282      ENDIF 
     1283      ! 
     1284   END SUBROUTINE interpht0 
     1285#endif 
    14991286 
    15001287#else 
Note: See TracChangeset for help on using the changeset viewer.