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 6808 for branches/NERC/dev_r5549_BDY_ZEROGRAD/NEMOGCM/NEMO/NST_SRC/agrif_opa_sponge.F90 – NEMO

Ignore:
Timestamp:
2016-07-19T10:38:35+02:00 (8 years ago)
Author:
jamesharle
Message:

merge with trunk@6232 for consistency with SSB code

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/NERC/dev_r5549_BDY_ZEROGRAD/NEMOGCM/NEMO/NST_SRC/agrif_opa_sponge.F90

    r4153 r6808  
    11#define SPONGE && define SPONGE_TOP 
    22 
    3 Module agrif_opa_sponge 
     3MODULE agrif_opa_sponge 
     4   !!====================================================================== 
     5   !!                ***  MODULE agrif_opa_update  *** 
     6   !! AGRIF :    
     7   !!====================================================================== 
     8   !! History :   
     9   !!---------------------------------------------------------------------- 
    410#if defined key_agrif  && ! defined key_offline 
    511   USE par_oce 
     
    915   USE agrif_oce 
    1016   USE wrk_nemo   
     17   USE lbclnk          ! ocean lateral boundary conditions (or mpp link) 
    1118 
    1219   IMPLICIT NONE 
    1320   PRIVATE 
    1421 
    15    PUBLIC Agrif_Sponge, Agrif_Sponge_Tra, Agrif_Sponge_Dyn, interptsn, interpun, interpvn 
    16  
    17   !! * Substitutions 
    18 #  include "domzgr_substitute.h90" 
     22   PUBLIC Agrif_Sponge, Agrif_Sponge_Tra, Agrif_Sponge_Dyn 
     23   PUBLIC interptsn_sponge, interpun_sponge, interpvn_sponge 
     24 
    1925   !!---------------------------------------------------------------------- 
    20    !! NEMO/NST 3.3 , NEMO Consortium (2010) 
     26   !! NEMO/NST 3.7 , NEMO Consortium (2015) 
    2127   !! $Id$ 
    2228   !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) 
    2329   !!---------------------------------------------------------------------- 
    24  
    25    CONTAINS 
     30CONTAINS 
    2631 
    2732   SUBROUTINE Agrif_Sponge_Tra 
     
    2934      !!   *** ROUTINE Agrif_Sponge_Tra *** 
    3035      !!--------------------------------------------- 
    31       !! 
    32       INTEGER :: ji,jj,jk,jn 
    3336      REAL(wp) :: timecoeff 
    34       REAL(wp) :: ztsa, zabe1, zabe2, zbtr 
    35       REAL(wp), POINTER, DIMENSION(:,:    ) :: ztu, ztv 
    36       REAL(wp), POINTER, DIMENSION(:,:,:,:) :: ztab 
    37       REAL(wp), POINTER, DIMENSION(:,:,:,:) :: tsbdiff 
    38  
     37      !!--------------------------------------------- 
     38      ! 
    3939#if defined SPONGE 
    40       CALL wrk_alloc( jpi, jpj, ztu, ztv ) 
    41       CALL wrk_alloc( jpi, jpj, jpk, jpts, ztab, tsbdiff  ) 
    42  
    4340      timecoeff = REAL(Agrif_NbStepint(),wp)/Agrif_rhot() 
    4441 
     42      CALL Agrif_Sponge 
    4543      Agrif_SpecialValue=0. 
    4644      Agrif_UseSpecialValue = .TRUE. 
    47       ztab = 0.e0 
    48       CALL Agrif_Bc_Variable(ztab, tsa_id,calledweight=timecoeff,procname=interptsn) 
     45      tabspongedone_tsn = .FALSE. 
     46 
     47      CALL Agrif_Bc_Variable(tsn_sponge_id,calledweight=timecoeff,procname=interptsn_sponge) 
     48 
    4949      Agrif_UseSpecialValue = .FALSE. 
    50  
    51       tsbdiff(:,:,:,:) = tsb(:,:,:,:) - ztab(:,:,:,:) 
    52  
    53       CALL Agrif_Sponge 
    54  
    55       DO jn = 1, jpts 
    56          DO jk = 1, jpkm1 
    57             ! 
    58             DO jj = 1, jpjm1 
    59                DO ji = 1, jpim1 
    60                   zabe1 = umask(ji,jj,jk) * spe1ur(ji,jj) * fse3u(ji,jj,jk) 
    61                   zabe2 = vmask(ji,jj,jk) * spe2vr(ji,jj) * fse3v(ji,jj,jk) 
    62                   ztu(ji,jj) = zabe1 * ( tsbdiff(ji+1,jj  ,jk,jn) - tsbdiff(ji,jj,jk,jn) ) 
    63                   ztv(ji,jj) = zabe2 * ( tsbdiff(ji  ,jj+1,jk,jn) - tsbdiff(ji,jj,jk,jn) ) 
    64                ENDDO 
    65             ENDDO 
    66  
    67             DO jj = 2, jpjm1 
    68                DO ji = 2, jpim1 
    69                   zbtr = spbtr2(ji,jj) / fse3t(ji,jj,jk) 
    70                   ! horizontal diffusive trends 
    71                   ztsa = zbtr * (  ztu(ji,jj) - ztu(ji-1,jj  )   & 
    72                   &              + ztv(ji,jj) - ztv(ji  ,jj-1)  ) 
    73                   ! add it to the general tracer trends 
    74                   tsa(ji,jj,jk,jn) = tsa(ji,jj,jk,jn) + ztsa 
    75                END DO 
    76             END DO 
    77             ! 
    78          ENDDO 
    79       ENDDO 
    80  
    81       CALL wrk_dealloc( jpi, jpj, ztu, ztv ) 
    82       CALL wrk_dealloc( jpi, jpj, jpk, jpts, ztab, tsbdiff  ) 
    8350#endif 
    84  
     51      ! 
    8552   END SUBROUTINE Agrif_Sponge_Tra 
    8653 
     54 
    8755   SUBROUTINE Agrif_Sponge_dyn 
    8856      !!--------------------------------------------- 
    8957      !!   *** ROUTINE Agrif_Sponge_dyn *** 
    9058      !!--------------------------------------------- 
    91       !! 
    92       INTEGER :: ji,jj,jk 
    9359      REAL(wp) :: timecoeff 
    94       REAL(wp) :: ze2u, ze1v, zua, zva, zbtr 
    95       REAL(wp), POINTER, DIMENSION(:,:,:) :: ubdiff, vbdiff 
    96       REAL(wp), POINTER, DIMENSION(:,:,:) :: rotdiff, hdivdiff 
    97       REAL(wp), POINTER, DIMENSION(:,:,:) :: ztab 
     60      !!--------------------------------------------- 
    9861 
    9962#if defined SPONGE 
    100       CALL wrk_alloc( jpi, jpj, jpk, ztab, ubdiff, vbdiff, rotdiff, hdivdiff ) 
    101  
    10263      timecoeff = REAL(Agrif_NbStepint(),wp)/Agrif_rhot() 
    10364 
    10465      Agrif_SpecialValue=0. 
    10566      Agrif_UseSpecialValue = ln_spc_dyn 
    106       ztab = 0.e0 
    107       CALL Agrif_Bc_Variable(ztab, ua_id,calledweight=timecoeff,procname=interpun) 
     67 
     68      tabspongedone_u = .FALSE. 
     69      tabspongedone_v = .FALSE.          
     70      CALL Agrif_Bc_Variable(un_sponge_id,calledweight=timecoeff,procname=interpun_sponge) 
     71 
     72      tabspongedone_u = .FALSE. 
     73      tabspongedone_v = .FALSE. 
     74      CALL Agrif_Bc_Variable(vn_sponge_id,calledweight=timecoeff,procname=interpvn_sponge) 
     75 
    10876      Agrif_UseSpecialValue = .FALSE. 
    109  
    110       ubdiff(:,:,:) = ( ub(:,:,:) - ztab(:,:,:) ) * umask(:,:,:) 
    111  
    112       ztab = 0.e0 
    113       Agrif_SpecialValue=0. 
    114       Agrif_UseSpecialValue = ln_spc_dyn 
    115       CALL Agrif_Bc_Variable(ztab, va_id,calledweight=timecoeff,procname=interpvn) 
    116       Agrif_UseSpecialValue = .FALSE. 
    117  
    118       vbdiff(:,:,:) = ( vb(:,:,:) - ztab(:,:,:) ) * vmask(:,:,:) 
    119  
    120       CALL Agrif_Sponge 
    121  
    122       DO jk = 1,jpkm1 
    123          ubdiff(:,:,jk) = ubdiff(:,:,jk) * spe1ur2(:,:) 
    124          vbdiff(:,:,jk) = vbdiff(:,:,jk) * spe2vr2(:,:) 
    125       ENDDO 
    126        
    127       hdivdiff = 0. 
    128       rotdiff = 0. 
    129  
    130       DO jk = 1, jpkm1                                 ! Horizontal slab 
    131          !                                             ! =============== 
    132  
    133          !                                             ! -------- 
    134          ! Horizontal divergence                       !   div 
    135          !                                             ! -------- 
    136          DO jj = 2, jpjm1 
    137             DO ji = 2, jpim1   ! vector opt. 
    138                zbtr = spbtr2(ji,jj) / fse3t(ji,jj,jk) 
    139                hdivdiff(ji,jj,jk) =  (  e2u(ji  ,jj  ) * fse3u(ji  ,jj  ,jk) * ubdiff(ji  ,jj  ,jk)     & 
    140                   &                   - e2u(ji-1,jj  ) * fse3u(ji-1,jj  ,jk) * ubdiff(ji-1,jj  ,jk)     & 
    141                   &                   + e1v(ji  ,jj  ) * fse3v(ji  ,jj  ,jk) * vbdiff(ji  ,jj  ,jk)     & 
    142                   &                   - e1v(ji  ,jj-1) * fse3v(ji  ,jj-1,jk) * vbdiff(ji  ,jj-1,jk)  ) * zbtr 
    143             END DO 
    144          END DO 
    145  
    146          DO jj = 1, jpjm1 
    147             DO ji = 1, jpim1   ! vector opt. 
    148                zbtr = spbtr3(ji,jj) * fse3f(ji,jj,jk) 
    149                rotdiff(ji,jj,jk) = (  e2v(ji+1,jj  ) * vbdiff(ji+1,jj  ,jk) - e2v(ji,jj) * vbdiff(ji,jj,jk)    & 
    150                   &                 - e1u(ji  ,jj+1) * ubdiff(ji  ,jj+1,jk) + e1u(ji,jj) * ubdiff(ji,jj,jk)  ) & 
    151                   &               * fmask(ji,jj,jk) * zbtr 
    152             END DO 
    153          END DO 
    154  
    155       ENDDO 
    156  
    157       !                                                ! =============== 
    158       DO jk = 1, jpkm1                                 ! Horizontal slab 
    159          !                                             ! =============== 
    160          DO jj = 2, jpjm1 
    161             DO ji = 2, jpim1   ! vector opt. 
    162                ! horizontal diffusive trends 
    163                zua = - ( rotdiff (ji  ,jj,jk) - rotdiff (ji,jj-1,jk) ) / ( e2u(ji,jj) * fse3u(ji,jj,jk) )   & 
    164                      + ( hdivdiff(ji+1,jj,jk) - hdivdiff(ji,jj  ,jk) ) / e1u(ji,jj) 
    165  
    166                zva = + ( rotdiff (ji,jj  ,jk) - rotdiff (ji-1,jj,jk) ) / ( e1v(ji,jj) * fse3v(ji,jj,jk) )   & 
    167                      + ( hdivdiff(ji,jj+1,jk) - hdivdiff(ji  ,jj,jk) ) / e2v(ji,jj) 
    168                ! add it to the general momentum trends 
    169                ua(ji,jj,jk) = ua(ji,jj,jk) + zua 
    170                va(ji,jj,jk) = va(ji,jj,jk) + zva 
    171             END DO 
    172          END DO 
    173          !                                             ! =============== 
    174       END DO                                           !   End of slab 
    175       !                                                ! =============== 
    176       CALL wrk_dealloc( jpi, jpj, jpk, ztab, ubdiff, vbdiff, rotdiff, hdivdiff ) 
    17777#endif 
    178  
     78      ! 
    17979   END SUBROUTINE Agrif_Sponge_dyn 
     80 
    18081 
    18182   SUBROUTINE Agrif_Sponge 
     
    199100         CALL wrk_alloc( jpi, jpj, ztabramp ) 
    200101 
    201          ispongearea  = 2 + 2 * Agrif_irhox() 
     102         ispongearea  = 2 + nn_sponge_len * Agrif_irhox() 
    202103         ilci = nlci - ispongearea 
    203104         ilcj = nlcj - ispongearea  
    204105         z1spongearea = 1._wp / REAL( ispongearea - 2 ) 
    205          spbtr2(:,:) = 1. / ( e1t(:,:) * e2t(:,:) ) 
    206  
    207          ztabramp(:,:) = 0. 
     106 
     107         ztabramp(:,:) = 0._wp 
    208108 
    209109         IF( (nbondi == -1) .OR. (nbondi == 2) ) THEN 
     
    254154      ! Tracers 
    255155      IF( .NOT. spongedoneT ) THEN 
    256          spe1ur(:,:) = 0. 
    257          spe2vr(:,:) = 0. 
    258  
    259          IF( (nbondi == -1) .OR. (nbondi == 2) ) THEN 
    260             spe1ur(2:ispongearea-1,:       ) = visc_tra                                        & 
    261                &                             *    0.5 * (  ztabramp(2:ispongearea-1,:      )   & 
    262                &                                         + ztabramp(3:ispongearea  ,:      ) ) & 
    263                &                             * e2u(2:ispongearea-1,:) / e1u(2:ispongearea-1,:) 
    264  
    265             spe2vr(2:ispongearea  ,1:jpjm1 ) = visc_tra                                        & 
    266                &                             *    0.5 * (  ztabramp(2:ispongearea  ,1:jpjm1)   & 
    267                &                                         + ztabramp(2:ispongearea,2  :jpj  ) ) & 
    268                &                             * e1v(2:ispongearea,1:jpjm1) / e2v(2:ispongearea,1:jpjm1) 
    269          ENDIF 
    270  
    271          IF( (nbondi == 1) .OR. (nbondi == 2) ) THEN 
    272             spe1ur(ilci+1:nlci-2,:        ) = visc_tra                                   & 
    273                &                            * 0.5 * (  ztabramp(ilci+1:nlci-2,:      )   &  
    274                &                                     + ztabramp(ilci+2:nlci-1,:      ) ) & 
    275                &                            * e2u(ilci+1:nlci-2,:) / e1u(ilci+1:nlci-2,:) 
    276  
    277             spe2vr(ilci+1:nlci-1,1:jpjm1  )  = visc_tra                                  & 
    278                &                            * 0.5 * (  ztabramp(ilci+1:nlci-1,1:jpjm1)   &  
    279                &                                     + ztabramp(ilci+1:nlci-1,2:jpj  ) ) &  
    280                &                            * e1v(ilci+1:nlci-1,1:jpjm1) / e2v(ilci+1:nlci-1,1:jpjm1) 
    281          ENDIF 
    282  
    283          IF( (nbondj == -1) .OR. (nbondj == 2) ) THEN 
    284             spe1ur(1:jpim1,2:ispongearea  ) = visc_tra                                     & 
    285                &                            * 0.5 * (  ztabramp(1:jpim1,2:ispongearea  )   &  
    286                &                                     + ztabramp(2:jpi  ,2:ispongearea  ) ) & 
    287                &                            * e2u(1:jpim1,2:ispongearea) / e1u(1:jpim1,2:ispongearea) 
    288     
    289             spe2vr(:      ,2:ispongearea-1) = visc_tra                                     & 
    290                &                            * 0.5 * (  ztabramp(:      ,2:ispongearea-1)   & 
    291                &                                     + ztabramp(:      ,3:ispongearea  ) ) & 
    292                &                            * e1v(:,2:ispongearea-1) / e2v(:,2:ispongearea-1) 
    293          ENDIF 
    294  
    295          IF( (nbondj == 1) .OR. (nbondj == 2) ) THEN 
    296             spe1ur(1:jpim1,ilcj+1:nlcj-1) = visc_tra                                   & 
    297                &                          * 0.5 * (  ztabramp(1:jpim1,ilcj+1:nlcj-1)   & 
    298                &                                   + ztabramp(2:jpi  ,ilcj+1:nlcj-1) ) & 
    299                &                                * e2u(1:jpim1,ilcj+1:nlcj-1) / e1u(1:jpim1,ilcj+1:nlcj-1) 
    300  
    301             spe2vr(:      ,ilcj+1:nlcj-2) = visc_tra                                   & 
    302                &                          * 0.5 * (  ztabramp(:      ,ilcj+1:nlcj-2)   & 
    303                &                                   + ztabramp(:      ,ilcj+2:nlcj-1) ) & 
    304                &                                * e1v(:,ilcj+1:nlcj-2) / e2v(:,ilcj+1:nlcj-2) 
    305          ENDIF 
     156         fsaht_spu(:,:) = 0._wp 
     157         fsaht_spv(:,:) = 0._wp 
     158         DO jj = 2, jpjm1 
     159            DO ji = 2, jpim1   ! vector opt. 
     160               fsaht_spu(ji,jj) = 0.5_wp * visc_tra * (ztabramp(ji,jj) + ztabramp(ji+1,jj  )) 
     161               fsaht_spv(ji,jj) = 0.5_wp * visc_tra * (ztabramp(ji,jj) + ztabramp(ji  ,jj+1)) 
     162            END DO 
     163         END DO 
     164 
     165         CALL lbc_lnk( fsaht_spu, 'U', 1. )   ! Lateral boundary conditions 
     166         CALL lbc_lnk( fsaht_spv, 'V', 1. ) 
    306167         spongedoneT = .TRUE. 
    307168      ENDIF 
     
    309170      ! Dynamics 
    310171      IF( .NOT. spongedoneU ) THEN 
    311          spe1ur2(:,:) = 0. 
    312          spe2vr2(:,:) = 0. 
    313  
    314          IF( (nbondi == -1) .OR. (nbondi == 2) ) THEN 
    315             spe1ur2(2:ispongearea-1,:      ) = visc_dyn                                   & 
    316                &                             * 0.5 * (  ztabramp(2:ispongearea-1,:      ) & 
    317                &                                      + ztabramp(3:ispongearea  ,:      ) ) 
    318             spe2vr2(2:ispongearea  ,1:jpjm1) = visc_dyn                                   & 
    319                &                             * 0.5 * (  ztabramp(2:ispongearea  ,1:jpjm1) & 
    320                &                                      + ztabramp(2:ispongearea  ,2:jpj  ) )  
    321          ENDIF 
    322  
    323          IF( (nbondi == 1) .OR. (nbondi == 2) ) THEN 
    324             spe1ur2(ilci+1:nlci-2  ,:      ) = visc_dyn                                   & 
    325                &                             * 0.5 * (  ztabramp(ilci+1:nlci-2, :       ) & 
    326                &                                      + ztabramp(ilci+2:nlci-1, :       ) )                       
    327             spe2vr2(ilci+1:nlci-1  ,1:jpjm1) = visc_dyn                                   & 
    328                &                             * 0.5 * (  ztabramp(ilci+1:nlci-1,1:jpjm1  ) & 
    329                &                                      + ztabramp(ilci+1:nlci-1,2:jpj    ) )  
    330          ENDIF 
    331  
    332          IF( (nbondj == -1) .OR. (nbondj == 2) ) THEN 
    333             spe1ur2(1:jpim1,2:ispongearea  ) = visc_dyn                                   &   
    334                &                             * 0.5 * (  ztabramp(1:jpim1,2:ispongearea  ) & 
    335                &                                      + ztabramp(2:jpi  ,2:ispongearea  ) )  
    336             spe2vr2(:      ,2:ispongearea-1) = visc_dyn                                   & 
    337                &                             * 0.5 * (  ztabramp(:      ,2:ispongearea-1) & 
    338                &                                      + ztabramp(:      ,3:ispongearea  ) ) 
    339          ENDIF 
    340  
    341          IF( (nbondj == 1) .OR. (nbondj == 2) ) THEN 
    342             spe1ur2(1:jpim1,ilcj+1:nlcj-1  ) = visc_dyn                                   & 
    343                &                             * 0.5 * (  ztabramp(1:jpim1,ilcj+1:nlcj-1  ) & 
    344                &                                      + ztabramp(2:jpi  ,ilcj+1:nlcj-1  ) )  
    345             spe2vr2(:      ,ilcj+1:nlcj-2  ) = visc_dyn                                   & 
    346                &                             * 0.5 * (  ztabramp(:      ,ilcj+1:nlcj-2  ) & 
    347                &                                      + ztabramp(:      ,ilcj+2:nlcj-1  ) ) 
    348          ENDIF 
     172         fsahm_spt(:,:) = 0._wp 
     173         fsahm_spf(:,:) = 0._wp 
     174         DO jj = 2, jpjm1 
     175            DO ji = 2, jpim1   ! vector opt. 
     176               fsahm_spt(ji,jj) = visc_dyn * ztabramp(ji,jj) 
     177               fsahm_spf(ji,jj) = 0.25_wp * visc_dyn * ( ztabramp(ji,jj) + ztabramp(ji  ,jj+1) & 
     178                                                     &  +ztabramp(ji,jj) + ztabramp(ji+1,jj  ) ) 
     179            END DO 
     180         END DO 
     181 
     182         CALL lbc_lnk( fsahm_spt, 'T', 1. )   ! Lateral boundary conditions 
     183         CALL lbc_lnk( fsahm_spf, 'F', 1. ) 
    349184         spongedoneU = .TRUE. 
    350          spbtr3(:,:) = 1. / ( e1f(:,:) * e2f(:,:) ) 
    351185      ENDIF 
    352186      ! 
     
    354188      ! 
    355189#endif 
    356  
     190      ! 
    357191   END SUBROUTINE Agrif_Sponge 
    358192 
    359    SUBROUTINE interptsn(tabres,i1,i2,j1,j2,k1,k2,n1,n2) 
    360       !!--------------------------------------------- 
    361       !!   *** ROUTINE interptsn *** 
     193 
     194   SUBROUTINE interptsn_sponge(tabres,i1,i2,j1,j2,k1,k2,n1,n2,before) 
     195      !!--------------------------------------------- 
     196      !!   *** ROUTINE interptsn_sponge *** 
    362197      !!--------------------------------------------- 
    363198      INTEGER, INTENT(in) :: i1,i2,j1,j2,k1,k2,n1,n2 
    364199      REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2,n1:n2), INTENT(inout) :: tabres 
    365  
    366       tabres(i1:i2,j1:j2,k1:k2,n1:n2) = tsn(i1:i2,j1:j2,k1:k2,n1:n2) 
    367  
    368    END SUBROUTINE interptsn 
    369  
    370    SUBROUTINE interpun(tabres,i1,i2,j1,j2,k1,k2) 
    371       !!--------------------------------------------- 
    372       !!   *** ROUTINE interpun *** 
    373       !!--------------------------------------------- 
     200      LOGICAL, INTENT(in) :: before 
     201      ! 
     202      INTEGER  ::   ji, jj, jk, jn   ! dummy loop indices 
     203      INTEGER  ::   iku, ikv 
     204      REAL(wp) :: ztsa, zabe1, zabe2, zbtr 
     205      REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2) :: ztu, ztv 
     206      REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2,n1:n2) ::tsbdiff 
     207      ! 
     208      IF( before ) THEN 
     209         tabres(i1:i2,j1:j2,k1:k2,n1:n2) = tsn(i1:i2,j1:j2,k1:k2,n1:n2) 
     210      ELSE    
     211         ! 
     212         tsbdiff(:,:,:,:) = tsb(i1:i2,j1:j2,:,:) - tabres(:,:,:,:)     
     213         DO jn = 1, jpts             
     214            DO jk = 1, jpkm1 
     215               DO jj = j1,j2-1 
     216                  DO ji = i1,i2-1 
     217                     zabe1 = fsaht_spu(ji,jj) * umask(ji,jj,jk) * e2_e1u(ji,jj) * e3u_n(ji,jj,jk) 
     218                     zabe2 = fsaht_spv(ji,jj) * vmask(ji,jj,jk) * e1_e2v(ji,jj) * e3v_n(ji,jj,jk) 
     219                     ztu(ji,jj,jk) = zabe1 * ( tsbdiff(ji+1,jj  ,jk,jn) - tsbdiff(ji,jj,jk,jn) )  
     220                     ztv(ji,jj,jk) = zabe2 * ( tsbdiff(ji  ,jj+1,jk,jn) - tsbdiff(ji,jj,jk,jn) ) 
     221                  END DO 
     222               END DO 
     223               ! 
     224               IF( ln_zps ) THEN      ! set gradient at partial step level 
     225                  DO jj = j1,j2-1 
     226                     DO ji = i1,i2-1 
     227                        ! last level 
     228                        iku = mbku(ji,jj) 
     229                        ikv = mbkv(ji,jj) 
     230                        IF( iku == jk )   ztu(ji,jj,jk) = 0._wp 
     231                        IF( ikv == jk )   ztv(ji,jj,jk) = 0._wp 
     232                     END DO 
     233                  END DO 
     234               ENDIF 
     235            END DO 
     236            ! 
     237            DO jk = 1, jpkm1 
     238               DO jj = j1+1,j2-1 
     239                  DO ji = i1+1,i2-1 
     240                     IF (.NOT. tabspongedone_tsn(ji,jj)) THEN  
     241                        zbtr = r1_e1e2t(ji,jj) / e3t_n(ji,jj,jk) 
     242                        ! horizontal diffusive trends 
     243                        ztsa = zbtr * (  ztu(ji,jj,jk) - ztu(ji-1,jj,jk) + ztv(ji,jj,jk) - ztv(ji  ,jj-1,jk)  ) 
     244                        ! add it to the general tracer trends 
     245                        tsa(ji,jj,jk,jn) = tsa(ji,jj,jk,jn) + ztsa 
     246                     ENDIF 
     247                  END DO 
     248               END DO 
     249            END DO 
     250            ! 
     251         END DO 
     252         ! 
     253         tabspongedone_tsn(i1+1:i2-1,j1+1:j2-1) = .TRUE. 
     254         ! 
     255      ENDIF 
     256      ! 
     257   END SUBROUTINE interptsn_sponge 
     258 
     259 
     260   SUBROUTINE interpun_sponge(tabres,i1,i2,j1,j2,k1,k2, before) 
     261      !!--------------------------------------------- 
     262      !!   *** ROUTINE interpun_sponge *** 
     263      !!---------------------------------------------     
    374264      INTEGER, INTENT(in) :: i1,i2,j1,j2,k1,k2 
    375265      REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) :: tabres 
    376  
    377       tabres(i1:i2,j1:j2,k1:k2) = un(i1:i2,j1:j2,k1:k2) 
    378  
    379    END SUBROUTINE interpun 
    380  
    381    SUBROUTINE interpvn(tabres,i1,i2,j1,j2,k1,k2) 
    382       !!--------------------------------------------- 
    383       !!   *** ROUTINE interpvn *** 
    384       !!--------------------------------------------- 
     266      LOGICAL, INTENT(in) :: before 
     267 
     268      INTEGER :: ji,jj,jk 
     269 
     270      ! sponge parameters  
     271      REAL(wp) :: ze2u, ze1v, zua, zva, zbtr 
     272      REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2) :: ubdiff 
     273      REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2) :: rotdiff, hdivdiff 
     274      INTEGER :: jmax 
     275      !!---------------------------------------------     
     276      ! 
     277      IF( before ) THEN 
     278         tabres = un(i1:i2,j1:j2,:) 
     279      ELSE 
     280         ubdiff(i1:i2,j1:j2,:) = (ub(i1:i2,j1:j2,:) - tabres(:,:,:))*umask(i1:i2,j1:j2,:) 
     281         ! 
     282         DO jk = 1, jpkm1                                 ! Horizontal slab 
     283            !                                             ! =============== 
     284 
     285            !                                             ! -------- 
     286            ! Horizontal divergence                       !   div 
     287            !                                             ! -------- 
     288            DO jj = j1,j2 
     289               DO ji = i1+1,i2   ! vector opt. 
     290                  zbtr = r1_e1e2t(ji,jj) / e3t_n(ji,jj,jk) * fsahm_spt(ji,jj) 
     291                  hdivdiff(ji,jj,jk) = (  e2u(ji  ,jj)*e3u_n(ji  ,jj,jk) * ubdiff(ji  ,jj,jk) & 
     292                                     &   -e2u(ji-1,jj)*e3u_n(ji-1,jj,jk) * ubdiff(ji-1,jj,jk) ) * zbtr 
     293               END DO 
     294            END DO 
     295 
     296            DO jj = j1,j2-1 
     297               DO ji = i1,i2   ! vector opt. 
     298                  zbtr = r1_e1e2f(ji,jj) * e3f_n(ji,jj,jk) * fsahm_spf(ji,jj) 
     299                  rotdiff(ji,jj,jk) = (-e1u(ji,jj+1) * ubdiff(ji,jj+1,jk) & 
     300                                       +e1u(ji,jj  ) * ubdiff(ji,jj  ,jk) &  
     301                                    & ) * fmask(ji,jj,jk) * zbtr  
     302               END DO 
     303            END DO 
     304         END DO 
     305         ! 
     306         DO jj = j1+1, j2-1 
     307            DO ji = i1+1, i2-1   ! vector opt. 
     308 
     309               IF (.NOT. tabspongedone_u(ji,jj)) THEN 
     310                  DO jk = 1, jpkm1                                 ! Horizontal slab 
     311                     ze2u = rotdiff (ji,jj,jk) 
     312                     ze1v = hdivdiff(ji,jj,jk) 
     313                     ! horizontal diffusive trends 
     314                     zua = - ( ze2u - rotdiff (ji,jj-1,jk)) / ( e2u(ji,jj) * e3u_n(ji,jj,jk) )   & 
     315                           + ( hdivdiff(ji+1,jj,jk) - ze1v  ) / e1u(ji,jj) 
     316 
     317                     ! add it to the general momentum trends 
     318                     ua(ji,jj,jk) = ua(ji,jj,jk) + zua 
     319 
     320                  END DO 
     321               ENDIF 
     322 
     323            END DO 
     324         END DO 
     325 
     326         tabspongedone_u(i1+1:i2-1,j1+1:j2-1) = .TRUE. 
     327 
     328         jmax = j2-1 
     329         IF ((nbondj == 1).OR.(nbondj == 2)) jmax = MIN(jmax,nlcj-3) 
     330 
     331         DO jj = j1+1, jmax 
     332            DO ji = i1+1, i2   ! vector opt. 
     333 
     334               IF (.NOT. tabspongedone_v(ji,jj)) THEN 
     335                  DO jk = 1, jpkm1                                 ! Horizontal slab 
     336                     ze2u = rotdiff (ji,jj,jk) 
     337                     ze1v = hdivdiff(ji,jj,jk) 
     338 
     339                     ! horizontal diffusive trends 
     340                     zva = + ( ze2u - rotdiff (ji-1,jj,jk)) / ( e1v(ji,jj) * e3v_n(ji,jj,jk) )   & 
     341                           + ( hdivdiff(ji,jj+1,jk) - ze1v  ) / e2v(ji,jj) 
     342 
     343                     ! add it to the general momentum trends 
     344                     va(ji,jj,jk) = va(ji,jj,jk) + zva 
     345                  END DO 
     346               ENDIF 
     347               ! 
     348            END DO 
     349         END DO 
     350         ! 
     351         tabspongedone_v(i1+1:i2,j1+1:jmax) = .TRUE. 
     352         ! 
     353      ENDIF 
     354      ! 
     355   END SUBROUTINE interpun_sponge 
     356 
     357 
     358   SUBROUTINE interpvn_sponge(tabres,i1,i2,j1,j2,k1,k2, before,nb,ndir) 
     359      !!--------------------------------------------- 
     360      !!   *** ROUTINE interpvn_sponge *** 
     361      !!---------------------------------------------  
    385362      INTEGER, INTENT(in) :: i1,i2,j1,j2,k1,k2 
    386363      REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) :: tabres 
    387  
    388       tabres(i1:i2,j1:j2,k1:k2) = vn(i1:i2,j1:j2,k1:k2) 
    389  
    390    END SUBROUTINE interpvn 
     364      LOGICAL, INTENT(in) :: before 
     365      INTEGER, INTENT(in) :: nb , ndir 
     366      ! 
     367      INTEGER  ::   ji, jj, jk 
     368      REAL(wp) ::   ze2u, ze1v, zua, zva, zbtr 
     369      REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2) :: vbdiff 
     370      REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2) :: rotdiff, hdivdiff 
     371      INTEGER :: imax 
     372      !!---------------------------------------------  
     373 
     374      IF( before ) THEN  
     375         tabres = vn(i1:i2,j1:j2,:) 
     376      ELSE 
     377         ! 
     378         vbdiff(i1:i2,j1:j2,:) = (vb(i1:i2,j1:j2,:) - tabres(:,:,:))*vmask(i1:i2,j1:j2,:) 
     379         ! 
     380         DO jk = 1, jpkm1                                 ! Horizontal slab 
     381            !                                             ! =============== 
     382 
     383            !                                             ! -------- 
     384            ! Horizontal divergence                       !   div 
     385            !                                             ! -------- 
     386            DO jj = j1+1,j2 
     387               DO ji = i1,i2   ! vector opt. 
     388                  zbtr = r1_e1e2t(ji,jj) / e3t_n(ji,jj,jk) * fsahm_spt(ji,jj) 
     389                  hdivdiff(ji,jj,jk) = ( e1v(ji,jj  ) * e3v_n(ji,jj  ,jk) * vbdiff(ji,jj  ,jk)  & 
     390                                     &  -e1v(ji,jj-1) * e3v_n(ji,jj-1,jk) * vbdiff(ji,jj-1,jk)  ) * zbtr 
     391               END DO 
     392            END DO 
     393            DO jj = j1,j2 
     394               DO ji = i1,i2-1   ! vector opt. 
     395                  zbtr = r1_e1e2f(ji,jj) * e3f_n(ji,jj,jk) * fsahm_spf(ji,jj) 
     396                  rotdiff(ji,jj,jk) = ( e2v(ji+1,jj) * vbdiff(ji+1,jj,jk) &  
     397                                    &  -e2v(ji  ,jj) * vbdiff(ji  ,jj,jk)  ) * fmask(ji,jj,jk) * zbtr 
     398               END DO 
     399            END DO 
     400         END DO 
     401 
     402         !                                                ! =============== 
     403         !                                                 
     404 
     405         imax = i2-1 
     406         IF ((nbondi == 1).OR.(nbondi == 2))   imax = MIN(imax,nlci-3) 
     407 
     408         DO jj = j1+1, j2 
     409            DO ji = i1+1, imax   ! vector opt. 
     410               IF( .NOT. tabspongedone_u(ji,jj) ) THEN 
     411                  DO jk = 1, jpkm1 
     412                     ua(ji,jj,jk) = ua(ji,jj,jk)                                                               & 
     413                        & - ( rotdiff (ji  ,jj,jk) - rotdiff (ji,jj-1,jk)) / ( e2u(ji,jj) * e3u_n(ji,jj,jk) )  & 
     414                        & + ( hdivdiff(ji+1,jj,jk) - hdivdiff(ji,jj  ,jk)) * r1_e1u(ji,jj) 
     415                  END DO 
     416               ENDIF 
     417            END DO 
     418         END DO 
     419         ! 
     420         tabspongedone_u(i1+1:imax,j1+1:j2) = .TRUE. 
     421         ! 
     422         DO jj = j1+1, j2-1 
     423            DO ji = i1+1, i2-1   ! vector opt. 
     424               IF( .NOT. tabspongedone_v(ji,jj) ) THEN 
     425                  DO jk = 1, jpkm1 
     426                     va(ji,jj,jk) = va(ji,jj,jk)                                                                  & 
     427                        &  + ( rotdiff (ji,jj  ,jk) - rotdiff (ji-1,jj,jk) ) / ( e1v(ji,jj) * e3v_n(ji,jj,jk) )   & 
     428                        &  + ( hdivdiff(ji,jj+1,jk) - hdivdiff(ji  ,jj,jk) ) * r1_e2v(ji,jj) 
     429                  END DO 
     430               ENDIF 
     431            END DO 
     432         END DO 
     433         tabspongedone_v(i1+1:i2-1,j1+1:j2-1) = .TRUE. 
     434      ENDIF 
     435      ! 
     436   END SUBROUTINE interpvn_sponge 
    391437 
    392438#else 
    393439CONTAINS 
    394  
    395440   SUBROUTINE agrif_opa_sponge_empty 
    396441      !!--------------------------------------------- 
     
    401446#endif 
    402447 
     448   !!====================================================================== 
    403449END MODULE agrif_opa_sponge 
Note: See TracChangeset for help on using the changeset viewer.