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 4862 – NEMO

Changeset 4862


Ignore:
Timestamp:
2014-11-18T13:35:02+01:00 (9 years ago)
Author:
rblod
Message:

dev_r4765_CNRS_agrif: corner treatment for agrif sponge

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2014/dev_r4765_CNRS_agrif/NEMOGCM/NEMO/NST_SRC/agrif_opa_sponge.F90

    r4789 r4862  
    8080      INTEGER  :: ji,jj,jk 
    8181      INTEGER  :: ispongearea, ilci, ilcj 
    82       REAL(wp) :: z1spongearea 
    83       REAL(wp), POINTER, DIMENSION(:,:) :: zlocalviscsponge 
     82      LOGICAL  :: ll_spdone 
     83      REAL(wp) :: z1spongearea, zramp 
     84      REAL(wp), POINTER, DIMENSION(:,:) :: ztabramp 
    8485 
    8586#if defined SPONGE || defined SPONGE_TOP 
    86  
    87       CALL wrk_alloc( jpi, jpj, zlocalviscsponge ) 
    88  
    89       ispongearea  = 2 + 2 * Agrif_irhox() 
    90       ilci = nlci - ispongearea 
    91       ilcj = nlcj - ispongearea  
    92       z1spongearea = 1._wp / REAL( ispongearea - 2 ) 
    93       spbtr2(:,:) = 1. / ( e1t(:,:) * e2t(:,:) ) 
     87      ll_spdone=.TRUE. 
     88      IF (( .NOT. spongedoneT ).OR.( .NOT. spongedoneU )) THEN 
     89         ! Define ramp from boundaries towards domain interior 
     90         ! at T-points 
     91         ! Store it in ztabramp 
     92         ll_spdone=.FALSE. 
     93 
     94         CALL wrk_alloc( jpi, jpj, ztabramp ) 
     95 
     96         ispongearea  = 2 + 2 * Agrif_irhox() 
     97         ilci = nlci - ispongearea 
     98         ilcj = nlcj - ispongearea  
     99         z1spongearea = 1._wp / REAL( ispongearea - 2 ) 
     100         spbtr2(:,:) = 1. / ( e1t(:,:) * e2t(:,:) ) 
     101 
     102         ztabramp(:,:) = 0. 
     103 
     104         IF( (nbondi == -1) .OR. (nbondi == 2) ) THEN 
     105            DO jj = 1, jpj 
     106               IF ( umask(2,jj,1) == 1._wp ) THEN 
     107                 DO ji = 2, ispongearea                   
     108                    ztabramp(ji,jj) = ( ispongearea-ji ) * z1spongearea 
     109                 END DO 
     110               ENDIF 
     111            ENDDO 
     112         ENDIF 
     113 
     114         IF( (nbondi == 1) .OR. (nbondi == 2) ) THEN 
     115            DO jj = 1, jpj 
     116               IF ( umask(nlci-2,jj,1) == 1._wp ) THEN 
     117                  DO ji = ilci+1,nlci-1 
     118                     zramp = (ji - (ilci+1) ) * z1spongearea 
     119                     ztabramp(ji,jj) = MAX( ztabramp(ji,jj), zramp ) 
     120                  ENDDO 
     121               ENDIF 
     122            ENDDO 
     123         ENDIF 
     124 
     125         IF( (nbondj == -1) .OR. (nbondj == 2) ) THEN 
     126            DO ji = 1, jpi 
     127               IF ( vmask(ji,2,1) == 1._wp ) THEN 
     128                  DO jj = 2, ispongearea 
     129                     zramp = ( ispongearea-jj ) * z1spongearea 
     130                     ztabramp(ji,jj) = MAX( ztabramp(ji,jj), zramp ) 
     131                  END DO 
     132               ENDIF 
     133            ENDDO 
     134         ENDIF 
     135 
     136         IF( (nbondj == 1) .OR. (nbondj == 2) ) THEN 
     137            DO ji = 1, jpi 
     138               IF ( vmask(ji,nlcj-2,1) == 1._wp ) THEN 
     139                  DO jj = ilcj+1,nlcj-1 
     140                     zramp = (jj - (ilcj+1) ) * z1spongearea 
     141                     ztabramp(ji,jj) = MAX( ztabramp(ji,jj), zramp ) 
     142                  END DO 
     143               ENDIF 
     144            ENDDO 
     145         ENDIF 
     146 
     147      ENDIF 
    94148 
    95149      ! Tracers 
    96150      IF( .NOT. spongedoneT ) THEN 
    97          zlocalviscsponge(:,:) = 0. 
    98151         spe1ur(:,:) = 0. 
    99152         spe2vr(:,:) = 0. 
    100153 
    101154         IF( (nbondi == -1) .OR. (nbondi == 2) ) THEN 
    102             DO ji = 2, ispongearea 
    103                zlocalviscsponge(ji,:) = visc_tra * ( ispongearea-ji ) * z1spongearea 
    104             ENDDO 
    105             spe1ur(2:ispongearea-1,:      ) = 0.5 * ( zlocalviscsponge(2:ispongearea-1,:      )   & 
    106                   &                         +            zlocalviscsponge(3:ispongearea  ,:      ) ) & 
    107                   &                         * e2u(2:ispongearea-1,:      ) / e1u(2:ispongearea-1,:      ) 
    108             spe2vr(2:ispongearea  ,1:jpjm1) = 0.5 * ( zlocalviscsponge(2:ispongearea  ,1:jpjm1)   & 
    109                   &                         +            zlocalviscsponge(2:ispongearea,2  :jpj  ) ) & 
    110                   &                         * e1v(2:ispongearea  ,1:jpjm1) / e2v(2:ispongearea  ,1:jpjm1) 
     155            spe1ur(2:ispongearea-1,:       ) = visc_tra                                        & 
     156               &                             *    0.5 * (  ztabramp(2:ispongearea-1,:      )   & 
     157               &                                         + ztabramp(3:ispongearea  ,:      ) ) & 
     158               &                             * e2u(2:ispongearea-1,:) / e1u(2:ispongearea-1,:) 
     159 
     160            spe2vr(2:ispongearea  ,1:jpjm1 ) = visc_tra                                        & 
     161               &                             *    0.5 * (  ztabramp(2:ispongearea  ,1:jpjm1)   & 
     162               &                                         + ztabramp(2:ispongearea,2  :jpj  ) ) & 
     163               &                             * e1v(2:ispongearea,1:jpjm1) / e2v(2:ispongearea,1:jpjm1) 
    111164         ENDIF 
    112165 
    113166         IF( (nbondi == 1) .OR. (nbondi == 2) ) THEN 
    114             DO ji = ilci+1,nlci-1 
    115                zlocalviscsponge(ji,:) = visc_tra * (ji - (ilci+1) ) * z1spongearea 
    116             ENDDO 
    117  
    118             spe1ur(ilci+1:nlci-2,:      ) = 0.5 * (  zlocalviscsponge(ilci+1:nlci-2,:)    &  
    119                   &                          +          zlocalviscsponge(ilci+2:nlci-1,:) )  & 
    120                   &                          * e2u(ilci+1:nlci-2,:) / e1u(ilci+1:nlci-2,:) 
    121  
    122             spe2vr(ilci+1:nlci-1,1:jpjm1) = 0.5 * (  zlocalviscsponge(ilci+1:nlci-1,1:jpjm1)    &  
    123                   &                            +        zlocalviscsponge(ilci+1:nlci-1,2:jpj  )  ) &  
    124                   &                                   * e1v(ilci+1:nlci-1,1:jpjm1) / e2v(ilci+1:nlci-1,1:jpjm1) 
     167            spe1ur(ilci+1:nlci-2,:        ) = visc_tra                                   & 
     168               &                            * 0.5 * (  ztabramp(ilci+1:nlci-2,:      )   &  
     169               &                                     + ztabramp(ilci+2:nlci-1,:      ) ) & 
     170               &                            * e2u(ilci+1:nlci-2,:) / e1u(ilci+1:nlci-2,:) 
     171 
     172            spe2vr(ilci+1:nlci-1,1:jpjm1  )  = visc_tra                                  & 
     173               &                            * 0.5 * (  ztabramp(ilci+1:nlci-1,1:jpjm1)   &  
     174               &                                     + ztabramp(ilci+1:nlci-1,2:jpj  ) ) &  
     175               &                            * e1v(ilci+1:nlci-1,1:jpjm1) / e2v(ilci+1:nlci-1,1:jpjm1) 
    125176         ENDIF 
    126177 
    127178         IF( (nbondj == -1) .OR. (nbondj == 2) ) THEN 
    128             DO jj = 2, ispongearea 
    129                zlocalviscsponge(:,jj) = visc_tra * ( ispongearea-jj ) * z1spongearea 
    130             ENDDO 
    131             spe1ur(1:jpim1,2:ispongearea  ) = 0.5 * ( zlocalviscsponge(1:jpim1,2:ispongearea  ) &  
    132                   &                            +         zlocalviscsponge(2:jpi  ,2:ispongearea) ) & 
    133                   &                            * e2u(1:jpim1,2:ispongearea) / e1u(1:jpim1,2:ispongearea) 
    134  
    135             spe2vr(:      ,2:ispongearea-1) = 0.5 * ( zlocalviscsponge(:,2:ispongearea-1)       & 
    136                   &                            +         zlocalviscsponge(:,3:ispongearea  )     ) & 
    137                   &                            * e1v(:,2:ispongearea-1) / e2v(:,2:ispongearea-1) 
     179            spe1ur(1:jpim1,2:ispongearea  ) = visc_tra                                     & 
     180               &                            * 0.5 * (  ztabramp(1:jpim1,2:ispongearea  )   &  
     181               &                                     + ztabramp(2:jpi  ,2:ispongearea  ) ) & 
     182               &                            * e2u(1:jpim1,2:ispongearea) / e1u(1:jpim1,2:ispongearea) 
     183    
     184            spe2vr(:      ,2:ispongearea-1) = visc_tra                                     & 
     185               &                            * 0.5 * (  ztabramp(:      ,2:ispongearea-1)   & 
     186               &                                     + ztabramp(:      ,3:ispongearea  ) ) & 
     187               &                            * e1v(:,2:ispongearea-1) / e2v(:,2:ispongearea-1) 
    138188         ENDIF 
    139189 
    140190         IF( (nbondj == 1) .OR. (nbondj == 2) ) THEN 
    141             DO jj = ilcj+1,nlcj-1 
    142                zlocalviscsponge(:,jj) = visc_tra * (jj - (ilcj+1) ) * z1spongearea 
    143             ENDDO 
    144             spe1ur(1:jpim1,ilcj+1:nlcj-1) = 0.5 * ( zlocalviscsponge(1:jpim1,ilcj+1:nlcj-1)   & 
    145                   &                          +         zlocalviscsponge(2:jpi  ,ilcj+1:nlcj-1) ) & 
    146                   &                                * e2u(1:jpim1,ilcj+1:nlcj-1) / e1u(1:jpim1,ilcj+1:nlcj-1) 
    147             spe2vr(:      ,ilcj+1:nlcj-2) = 0.5 * ( zlocalviscsponge(:,ilcj+1:nlcj-2      )   & 
    148                   &                          +         zlocalviscsponge(:,ilcj+2:nlcj-1)     )  & 
    149                   &                                * e1v(:,ilcj+1:nlcj-2) / e2v(:,ilcj+1:nlcj-2) 
     191            spe1ur(1:jpim1,ilcj+1:nlcj-1) = visc_tra                                   & 
     192               &                          * 0.5 * (  ztabramp(1:jpim1,ilcj+1:nlcj-1)   & 
     193               &                                   + ztabramp(2:jpi  ,ilcj+1:nlcj-1) ) & 
     194               &                                * e2u(1:jpim1,ilcj+1:nlcj-1) / e1u(1:jpim1,ilcj+1:nlcj-1) 
     195 
     196            spe2vr(:      ,ilcj+1:nlcj-2) = visc_tra                                   & 
     197               &                          * 0.5 * (  ztabramp(:      ,ilcj+1:nlcj-2)   & 
     198               &                                   + ztabramp(:      ,ilcj+2:nlcj-1) ) & 
     199               &                                * e1v(:,ilcj+1:nlcj-2) / e2v(:,ilcj+1:nlcj-2) 
    150200         ENDIF 
    151201         spongedoneT = .TRUE. 
     
    154204      ! Dynamics 
    155205      IF( .NOT. spongedoneU ) THEN 
    156          zlocalviscsponge(:,:) = 0. 
    157206         spe1ur2(:,:) = 0. 
    158207         spe2vr2(:,:) = 0. 
    159208 
    160209         IF( (nbondi == -1) .OR. (nbondi == 2) ) THEN 
    161             DO ji = 2, ispongearea 
    162                zlocalviscsponge(ji,:) = visc_dyn * ( ispongearea-ji ) * z1spongearea 
    163             ENDDO 
    164             spe1ur2(2:ispongearea-1,:      ) = 0.5 * ( zlocalviscsponge(2:ispongearea-1,:      ) & 
    165                   &     +   zlocalviscsponge(3:ispongearea,:    ) ) 
    166             spe2vr2(2:ispongearea  ,1:jpjm1) = 0.5 * ( zlocalviscsponge(2:ispongearea  ,1:jpjm1) & 
    167                   &     +   zlocalviscsponge(2:ispongearea,2:jpj) )  
     210            spe1ur2(2:ispongearea-1,:      ) = visc_dyn                                   & 
     211               &                             * 0.5 * (  ztabramp(2:ispongearea-1,:      ) & 
     212               &                                      + ztabramp(3:ispongearea  ,:      ) ) 
     213            spe2vr2(2:ispongearea  ,1:jpjm1) = visc_dyn                                   & 
     214               &                             * 0.5 * (  ztabramp(2:ispongearea  ,1:jpjm1) & 
     215               &                                      + ztabramp(2:ispongearea  ,2:jpj  ) )  
    168216         ENDIF 
    169217 
    170218         IF( (nbondi == 1) .OR. (nbondi == 2) ) THEN 
    171             DO ji = ilci+1,nlci-1 
    172                zlocalviscsponge(ji,:) = visc_dyn * (ji - (ilci+1) ) * z1spongearea 
    173             ENDDO 
    174             spe1ur2(ilci+1:nlci-2,:      ) = 0.5 * (  zlocalviscsponge(ilci+1:nlci-2,:) & 
    175                   &        + zlocalviscsponge(ilci+2:nlci-1,:) )   
    176             spe2vr2(ilci+1:nlci-1,1:jpjm1) = 0.5 * (  zlocalviscsponge(ilci+1:nlci-1,1:jpjm1) & 
    177                   &        + zlocalviscsponge(ilci+1:nlci-1,2:jpj  )  )  
     219            spe1ur2(ilci+1:nlci-2  ,:      ) = visc_dyn                                   & 
     220               &                             * 0.5 * (  ztabramp(ilci+1:nlci-2, :       ) & 
     221               &                                      + ztabramp(ilci+2:nlci-1, :       ) )                       
     222            spe2vr2(ilci+1:nlci-1  ,1:jpjm1) = visc_dyn                                   & 
     223               &                             * 0.5 * (  ztabramp(ilci+1:nlci-1,1:jpjm1  ) & 
     224               &                                      + ztabramp(ilci+1:nlci-1,2:jpj    ) )  
    178225         ENDIF 
    179226 
    180227         IF( (nbondj == -1) .OR. (nbondj == 2) ) THEN 
    181             DO jj = 2, ispongearea 
    182                zlocalviscsponge(:,jj) = visc_dyn * ( ispongearea-jj ) * z1spongearea 
    183             ENDDO 
    184             spe1ur2(1:jpim1,2:ispongearea  ) = 0.5 * ( zlocalviscsponge(1:jpim1,2:ispongearea) & 
    185                   &      + zlocalviscsponge(2:jpi,2:ispongearea) )  
    186             spe2vr2(:      ,2:ispongearea-1) = 0.5 * ( zlocalviscsponge(:,2:ispongearea-1)     & 
    187                   &      + zlocalviscsponge(:,3:ispongearea)     ) 
     228            spe1ur2(1:jpim1,2:ispongearea  ) = visc_dyn                                   &   
     229               &                             * 0.5 * (  ztabramp(1:jpim1,2:ispongearea  ) & 
     230               &                                      + ztabramp(2:jpi  ,2:ispongearea  ) )  
     231            spe2vr2(:      ,2:ispongearea-1) = visc_dyn                                   & 
     232               &                             * 0.5 * (  ztabramp(:      ,2:ispongearea-1) & 
     233               &                                      + ztabramp(:      ,3:ispongearea  ) ) 
    188234         ENDIF 
    189235 
    190236         IF( (nbondj == 1) .OR. (nbondj == 2) ) THEN 
    191             DO jj = ilcj+1,nlcj-1 
    192                zlocalviscsponge(:,jj) = visc_dyn * (jj - (ilcj+1) ) * z1spongearea 
    193             ENDDO 
    194             spe1ur2(1:jpim1,ilcj+1:nlcj-1) = 0.5 * ( zlocalviscsponge(1:jpim1,ilcj+1:nlcj-1) & 
    195                   &         + zlocalviscsponge(2:jpi,ilcj+1:nlcj-1) )  
    196             spe2vr2(:      ,ilcj+1:nlcj-2) = 0.5 * ( zlocalviscsponge(:,ilcj+1:nlcj-2      ) & 
    197                   &         + zlocalviscsponge(:,ilcj+2:nlcj-1)     ) 
     237            spe1ur2(1:jpim1,ilcj+1:nlcj-1  ) = visc_dyn                                   & 
     238               &                             * 0.5 * (  ztabramp(1:jpim1,ilcj+1:nlcj-1  ) & 
     239               &                                      + ztabramp(2:jpi  ,ilcj+1:nlcj-1  ) )  
     240            spe2vr2(:      ,ilcj+1:nlcj-2  ) = visc_dyn                                   & 
     241               &                             * 0.5 * (  ztabramp(:      ,ilcj+1:nlcj-2  ) & 
     242               &                                      + ztabramp(:      ,ilcj+2:nlcj-1  ) ) 
    198243         ENDIF 
    199244         spongedoneU = .TRUE. 
     
    201246      ENDIF 
    202247      ! 
    203       CALL wrk_dealloc( jpi, jpj, zlocalviscsponge ) 
     248      IF (.NOT.ll_spdone) CALL wrk_dealloc( jpi, jpj, ztabramp ) 
    204249      ! 
    205250#endif 
    206  
    207251   END SUBROUTINE Agrif_Sponge 
    208252 
Note: See TracChangeset for help on using the changeset viewer.