Ignore:
Timestamp:
2019-09-19T12:08:31+02:00 (12 months ago)
Author:
jchanut
Message:

#2222, import changes from dev_r10973_AGRIF-01_jchanut_small_jpi_jpj (i.e. #2199)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • NEMO/branches/2019/dev_r11233_AGRIF-05_jchanut_vert_coord_interp/src/NST/agrif_oce_sponge.F90

    r10425 r11574  
    2222   USE agrif_oce 
    2323   USE lbclnk          ! ocean lateral boundary conditions (or mpp link) 
     24   USE iom 
    2425 
    2526   IMPLICIT NONE 
     
    5859#endif 
    5960      ! 
     61      CALL iom_put("fsaht_spu", fsaht_spu(:,:)) 
     62      CALL iom_put("fsaht_spv", fsaht_spv(:,:)) 
     63      ! 
    6064   END SUBROUTINE Agrif_Sponge_Tra 
    6165 
     
    8589#endif 
    8690      ! 
     91      CALL iom_put("fsahm_spt", fsahm_spt(:,:)) 
     92      CALL iom_put("fsahm_spf", fsahm_spf(:,:)) 
     93      ! 
    8794   END SUBROUTINE Agrif_Sponge_dyn 
    8895 
     
    93100      !!---------------------------------------------------------------------- 
    94101      INTEGER  ::   ji, jj, ind1, ind2 
    95       INTEGER  ::   ispongearea 
    96       REAL(wp) ::   z1_spongearea 
     102      INTEGER  ::   ispongearea, jspongearea 
     103      REAL(wp) ::   z1_ispongearea, z1_jspongearea 
    97104      REAL(wp), DIMENSION(jpi,jpj) :: ztabramp 
     105      REAL(wp), DIMENSION(jpjmax)  :: zmskwest,  zmskeast 
     106      REAL(wp), DIMENSION(jpimax)  :: zmsknorth, zmsksouth 
    98107      !!---------------------------------------------------------------------- 
    99108      ! 
    100109#if defined SPONGE || defined SPONGE_TOP 
    101110      IF (( .NOT. spongedoneT ).OR.( .NOT. spongedoneU )) THEN 
     111         ! 
     112         ! Retrieve masks at open boundaries: 
     113 
     114         ! --- West --- ! 
     115         ztabramp(:,:) = 0._wp 
     116         ind1 = 1+nbghostcells 
     117         DO ji = mi0(ind1), mi1(ind1)                 
     118            ztabramp(ji,:) = umask(ji,:,1) 
     119         END DO 
     120         ! 
     121         zmskwest(:) = 0._wp 
     122         zmskwest(1:jpj) = MAXVAL(ztabramp(:,:), dim=1) 
     123 
     124         ! --- East --- ! 
     125         ztabramp(:,:) = 0._wp 
     126         ind1 = jpiglo - nbghostcells - 1 
     127         DO ji = mi0(ind1), mi1(ind1)                  
     128            ztabramp(ji,:) = umask(ji,:,1) 
     129         END DO 
     130         ! 
     131         zmskeast(:) = 0._wp 
     132         zmskeast(1:jpj) = MAXVAL(ztabramp(:,:), dim=1) 
     133 
     134         ! --- South --- ! 
     135         ztabramp(:,:) = 0._wp 
     136         ind1 = 1+nbghostcells 
     137         DO jj = mj0(ind1), mj1(ind1)                  
     138            ztabramp(:,jj) = vmask(:,jj,1) 
     139         END DO 
     140         ! 
     141         zmsksouth(:) = 0._wp 
     142         zmsksouth(1:jpi) = MAXVAL(ztabramp(:,:), dim=2) 
     143 
     144         ! --- North --- ! 
     145         ztabramp(:,:) = 0._wp 
     146         ind1 = jpjglo - nbghostcells - 1 
     147         DO jj = mj0(ind1), mj1(ind1)                  
     148            ztabramp(:,jj) = vmask(:,jj,1) 
     149         END DO 
     150         ! 
     151         zmsknorth(:) = 0._wp 
     152         zmsknorth(1:jpi) = MAXVAL(ztabramp(:,:), dim=2) 
     153 
     154#if defined key_mpp_mpi 
     155         CALL mpp_max( 'AGRIF_sponge', zmskwest(:) , jpjmax ) 
     156         CALL mpp_max( 'AGRIF_Sponge', zmskeast(:) , jpjmax ) 
     157         CALL mpp_max( 'AGRIF_Sponge', zmsksouth(:), jpimax ) 
     158         CALL mpp_max( 'AGRIF_Sponge', zmsknorth(:), jpimax ) 
     159#endif 
     160 
    102161         ! Define ramp from boundaries towards domain interior at T-points 
    103162         ! Store it in ztabramp 
    104163 
    105164         ispongearea  = 1 + nn_sponge_len * Agrif_irhox() 
    106          z1_spongearea = 1._wp / REAL( ispongearea ) 
     165         z1_ispongearea = 1._wp / REAL( ispongearea ) 
     166         jspongearea  = 1 + nn_sponge_len * Agrif_irhoy() 
     167         z1_jspongearea = 1._wp / REAL( jspongearea ) 
    107168          
    108169         ztabramp(:,:) = 0._wp 
     170         IF ( Agrif_irhox()==1 ) ispongearea =-1 
     171         IF ( Agrif_irhoy()==1 ) jspongearea =-1 
    109172 
    110173         ! --- West --- ! 
    111          IF( (nbondi == -1) .OR. (nbondi == 2) ) THEN 
    112             ind1 = 1+nbghostcells 
    113             ind2 = 1+nbghostcells + ispongearea  
     174         ind1 = 1+nbghostcells 
     175         ind2 = 1+nbghostcells + ispongearea  
     176         DO ji = mi0(ind1), mi1(ind2)    
     177            DO jj = 1, jpj                
     178               ztabramp(ji,jj) = REAL( ind2 - mig(ji) ) * z1_ispongearea * zmskwest(jj) 
     179            END DO 
     180         END DO 
     181 
     182         ! ghost cells (cosmetic): 
     183         ind1 = 1 
     184         ind2 = nbghostcells 
     185         DO ji = mi0(ind1), mi1(ind2)    
     186            DO jj = 1, jpj                
     187               ztabramp(ji,jj) = zmskwest(jj) 
     188            END DO 
     189         END DO 
     190 
     191         ! --- East --- ! 
     192         ind1 = jpiglo - nbghostcells - ispongearea 
     193         ind2 = jpiglo - nbghostcells 
     194         DO ji = mi0(ind1), mi1(ind2) 
    114195            DO jj = 1, jpj 
    115                DO ji = ind1, ind2                 
    116                   ztabramp(ji,jj) = REAL( ind2 - ji ) * z1_spongearea * umask(ind1,jj,1) 
    117                END DO 
     196               ztabramp(ji,jj) = MAX( ztabramp(ji,jj), REAL( mig(ji) - ind1 ) * z1_ispongearea) * zmskeast(jj) 
    118197            ENDDO 
    119          ENDIF 
    120  
    121          ! --- East --- ! 
    122          IF( (nbondi == 1) .OR. (nbondi == 2) ) THEN 
    123             ind1 = nlci - nbghostcells - ispongearea 
    124             ind2 = nlci - nbghostcells 
     198         END DO 
     199 
     200         ! ghost cells (cosmetic): 
     201         ind1 = jpiglo - nbghostcells + 1 
     202         ind2 = jpiglo 
     203         DO ji = mi0(ind1), mi1(ind2) 
    125204            DO jj = 1, jpj 
    126                DO ji = ind1, ind2 
    127                   ztabramp(ji,jj) = MAX( ztabramp(ji,jj), REAL( ji - ind1 ) * z1_spongearea * umask(ind2-1,jj,1) ) 
    128                ENDDO 
     205               ztabramp(ji,jj) = zmskeast(jj) 
    129206            ENDDO 
    130          ENDIF 
     207         END DO 
    131208 
    132209         ! --- South --- ! 
    133          IF( (nbondj == -1) .OR. (nbondj == 2) ) THEN 
    134             ind1 = 1+nbghostcells 
    135             ind2 = 1+nbghostcells + ispongearea 
    136             DO jj = ind1, ind2  
    137                DO ji = 1, jpi 
    138                   ztabramp(ji,jj) = MAX( ztabramp(ji,jj), REAL( ind2 - jj ) * z1_spongearea * vmask(ji,ind1,1) ) 
    139                END DO 
    140             ENDDO 
    141          ENDIF 
     210         ind1 = 1+nbghostcells 
     211         ind2 = 1+nbghostcells + jspongearea 
     212         DO jj = mj0(ind1), mj1(ind2)  
     213            DO ji = 1, jpi 
     214               ztabramp(ji,jj) = MAX( ztabramp(ji,jj), REAL( ind2 - mjg(jj) ) * z1_jspongearea) * zmsksouth(ji) 
     215            END DO 
     216         END DO 
     217 
     218         ! ghost cells (cosmetic): 
     219         ind1 = 1 
     220         ind2 = nbghostcells 
     221         DO jj = mj0(ind1), mj1(ind2)  
     222            DO ji = 1, jpi 
     223               ztabramp(ji,jj) = zmsksouth(ji) 
     224            END DO 
     225         END DO 
    142226 
    143227         ! --- North --- ! 
    144          IF( (nbondj == 1) .OR. (nbondj == 2) ) THEN 
    145             ind1 = nlcj - nbghostcells - ispongearea 
    146             ind2 = nlcj - nbghostcells 
    147             DO jj = ind1, ind2 
    148                DO ji = 1, jpi 
    149                   ztabramp(ji,jj) = MAX( ztabramp(ji,jj), REAL( jj - ind1 ) * z1_spongearea * vmask(ji,ind2-1,1) ) 
    150                END DO 
    151             ENDDO 
    152          ENDIF 
     228         ind1 = jpjglo - nbghostcells - jspongearea 
     229         ind2 = jpjglo - nbghostcells 
     230         DO jj = mj0(ind1), mj1(ind2) 
     231            DO ji = 1, jpi 
     232               ztabramp(ji,jj) = MAX( ztabramp(ji,jj), REAL( mjg(jj) - ind1 ) * z1_jspongearea) * zmsknorth(ji) 
     233            END DO 
     234         END DO 
     235 
     236         ! ghost cells (cosmetic): 
     237         ind1 = jpjglo - nbghostcells + 1 
     238         ind2 = jpjglo 
     239         DO jj = mj0(ind1), mj1(ind2) 
     240            DO ji = 1, jpi 
     241               ztabramp(ji,jj) = zmsknorth(ji) 
     242            END DO 
     243         END DO 
    153244 
    154245      ENDIF 
     
    160251         DO jj = 2, jpjm1 
    161252            DO ji = 2, jpim1   ! vector opt. 
    162                fsaht_spu(ji,jj) = 0.5_wp * visc_tra * ( ztabramp(ji,jj) + ztabramp(ji+1,jj  ) ) 
    163                fsaht_spv(ji,jj) = 0.5_wp * visc_tra * ( ztabramp(ji,jj) + ztabramp(ji  ,jj+1) ) 
    164             END DO 
    165          END DO 
    166          CALL lbc_lnk( 'agrif_oce_sponge', fsaht_spu, 'U', 1. )   ! Lateral boundary conditions 
    167          CALL lbc_lnk( 'agrif_oce_sponge', fsaht_spv, 'V', 1. ) 
     253               fsaht_spu(ji,jj) = 0.5_wp * rn_sponge_tra * ( ztabramp(ji,jj) + ztabramp(ji+1,jj  ) ) 
     254               fsaht_spv(ji,jj) = 0.5_wp * rn_sponge_tra * ( ztabramp(ji,jj) + ztabramp(ji  ,jj+1) ) 
     255            END DO 
     256         END DO 
     257         CALL lbc_lnk( 'agrif_Sponge', fsaht_spu, 'U', 1. )   ! Lateral boundary conditions 
     258         CALL lbc_lnk( 'agrif_Sponge', fsaht_spv, 'V', 1. ) 
    168259          
    169260         spongedoneT = .TRUE. 
     
    176267         DO jj = 2, jpjm1 
    177268            DO ji = 2, jpim1   ! vector opt. 
    178                fsahm_spt(ji,jj) = visc_dyn * ztabramp(ji,jj) 
    179                fsahm_spf(ji,jj) = 0.25_wp * visc_dyn * ( ztabramp(ji  ,jj  ) + ztabramp(ji  ,jj+1) & 
    180                                                      &  +ztabramp(ji+1,jj+1) + ztabramp(ji+1,jj  ) ) 
    181             END DO 
    182          END DO 
    183          CALL lbc_lnk( 'agrif_oce_sponge', fsahm_spt, 'T', 1. )   ! Lateral boundary conditions 
    184          CALL lbc_lnk( 'agrif_oce_sponge', fsahm_spf, 'F', 1. ) 
     269               fsahm_spt(ji,jj) = rn_sponge_dyn * ztabramp(ji,jj) 
     270               fsahm_spf(ji,jj) = 0.25_wp * rn_sponge_dyn * ( ztabramp(ji  ,jj  ) + ztabramp(ji  ,jj+1) & 
     271                                                          &  +ztabramp(ji+1,jj+1) + ztabramp(ji+1,jj  ) ) 
     272            END DO 
     273         END DO 
     274         CALL lbc_lnk( 'agrif_Sponge', fsahm_spt, 'T', 1. )   ! Lateral boundary conditions 
     275         CALL lbc_lnk( 'agrif_Sponge', fsahm_spf, 'F', 1. ) 
    185276          
    186277         spongedoneU = .TRUE. 
Note: See TracChangeset for help on using the changeset viewer.