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

Changeset 13498


Ignore:
Timestamp:
2020-09-21T15:56:43+02:00 (4 years ago)
Author:
jchanut
Message:

#2222 1) Define agrif sponge at f-points 2) Correct bathymetry check with vertical refinement just over needed points

Location:
NEMO/branches/2020/dev_r13312_AGRIF-03-04_jchanut_vinterp_tstep/src/NST
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • NEMO/branches/2020/dev_r13312_AGRIF-03-04_jchanut_vinterp_tstep/src/NST/agrif_oce_interp.F90

    r13352 r13498  
    15891589      IF(lk_west) THEN 
    15901590         ispon  = nn_sponge_len * Agrif_irhox() 
    1591          istart = nn_hls + 2                                 ! halo + land + 1 
    1592          iend   = nn_hls + 1 + nbghostcells + ispon          ! halo + land + nbghostcells + sponge 
     1591         istart = nn_hls + 2                                  ! halo + land + 1 
     1592         iend   = nn_hls + 1 + nbghostcells + ispon           ! halo + land + nbghostcells + sponge 
    15931593         jstart = nn_hls + 2 
    15941594         jend   = jpjglo - nn_hls - 1 
     
    16111611      IF(lk_east) THEN 
    16121612         ispon  = nn_sponge_len * Agrif_irhox()  
    1613          istart = jpiglo - ( nn_hls + nbghostcells + ispon ) ! halo + land + nbghostcells + sponge - 1 
    1614          iend   = jpiglo - ( nn_hls + 1 )                    ! halo + land + 1                     - 1 
     1613         istart = jpiglo - ( nn_hls + nbghostcells + ispon )  ! halo + land + nbghostcells + sponge - 1 
     1614         iend   = jpiglo - ( nn_hls + 1 )                     ! halo + land + 1                     - 1 
    16151615         jstart = nn_hls + 2 
    1616          jend   = jpjglo - nn_hls - 1 
     1616         jend   = jpjglo - nn_hls - 1  
    16171617         DO ji = mi0(istart), mi1(iend) 
    16181618            DO jj = mj0(jstart), mj1(jend) 
     
    16231623            END DO 
    16241624         END DO 
    1625          DO ji = mi0(istart), mi1(iend-1) 
     1625         DO ji = mi0(istart+1), mi1(iend-1) 
    16261626            DO jj = mj0(jstart), mj1(jend) 
    16271627               IF ( ABS(hu0_parent(ji,jj)-hu_0(ji,jj)) > 1.e-3 ) iindic = iindic + 1 
     
    16671667            END DO 
    16681668         END DO 
    1669          DO jj = mj0(jstart), mj1(jend-1) 
     1669         DO jj = mj0(jstart+1), mj1(jend-1) 
    16701670            DO ji = mi0(istart), mi1(iend) 
    16711671               IF ( ABS(hv0_parent(ji,jj)-hv_0(ji,jj)) > 1.e-3 ) iindic = iindic + 1 
  • NEMO/branches/2020/dev_r13312_AGRIF-03-04_jchanut_vinterp_tstep/src/NST/agrif_oce_sponge.F90

    r13351 r13498  
    113113      REAL(wp) ::   z1_ispongearea, z1_jspongearea 
    114114      REAL(wp), DIMENSION(jpi,jpj) :: ztabramp 
    115       REAL(wp), DIMENSION(jpi,jpj) :: ztabrampu 
    116       REAL(wp), DIMENSION(jpi,jpj) :: ztabrampv 
    117115      !!---------------------------------------------------------------------- 
    118116      ! 
     
    123121      !|            |           |           |           | 
    124122      !fine :     t u t u t u t u t u t u t u t u t u t u t 
    125       !sponge val:0   0   0   1  5/6 4/6 3/6 2/6 1/6  0   0 
     123      !sponge val:0 1   1   1   1  5/6 4/6 3/6 2/6 1/6  0  
    126124      !           |   ghost     | <-- sponge area  -- > | 
    127125      !           |   points    |                       | 
     
    130128#if defined SPONGE || defined SPONGE_TOP 
    131129      IF (( .NOT. spongedoneT ).OR.( .NOT. spongedoneU )) THEN 
    132          ! Define ramp from boundaries towards domain interior at T-points 
     130         ! Define ramp from boundaries towards domain interior at F-points 
    133131         ! Store it in ztabramp 
    134132 
    135133         ispongearea    = nn_sponge_len * Agrif_irhox() 
    136          z1_ispongearea = 1._wp / REAL( ispongearea, wp ) 
     134         z1_ispongearea = 1._wp / REAL( MAX(ispongearea,1), wp ) 
    137135         jspongearea    = nn_sponge_len * Agrif_irhoy() 
    138          z1_jspongearea = 1._wp / REAL( jspongearea, wp ) 
     136         z1_jspongearea = 1._wp / REAL( MAX(jspongearea,1), wp ) 
    139137          
    140138         ztabramp(:,:) = 0._wp 
     
    162160         ENDIF 
    163161         IF( lk_east ) THEN                             ! --- East --- ! 
    164             ind1 = jpiglo - ( nn_hls + nbghostcells ) - ispongearea 
    165             ind2 = jpiglo - ( nn_hls + nbghostcells )      ! halo + land + nbghostcells - 1 
     162            ind1 = jpiglo - ( nn_hls + nbghostcells ) - ispongearea - 1 
     163            ind2 = jpiglo - ( nn_hls + nbghostcells ) - 1    ! halo + land + nbghostcells - 1 
    166164            DO ji = mi0(ind1), mi1(ind2) 
    167165               DO jj = 1, jpj 
     
    170168            END DO 
    171169            ! ghost cells: 
    172             ind1 = jpiglo - ( nn_hls + nbghostcells )      ! halo + land + nbghostcells - 1 
    173             ind2 = jpiglo 
     170            ind1 = jpiglo - ( nn_hls + nbghostcells ) - 1    ! halo + land + nbghostcells - 1 
     171            ind2 = jpiglo - 1 
    174172            DO ji = mi0(ind1), mi1(ind2) 
    175173               DO jj = 1, jpj 
     
    179177         ENDIF       
    180178         IF( lk_south ) THEN                            ! --- South --- ! 
    181             ind1 = nn_hls + 1 + nbghostcells               ! halo + land + nbghostcells 
     179            ind1 = nn_hls + 1 + nbghostcells                 ! halo + land + nbghostcells 
    182180            ind2 = nn_hls + 1 + nbghostcells + jspongearea  
    183181            DO jj = mj0(ind1), mj1(ind2)  
     
    188186            ! ghost cells: 
    189187            ind1 = 1 
    190             ind2 = nn_hls + 1 + nbghostcells               ! halo + land + nbghostcells 
     188            ind2 = nn_hls + 1 + nbghostcells                 ! halo + land + nbghostcells 
    191189            DO jj = mj0(ind1), mj1(ind2)  
    192190               DO ji = 1, jpi 
     
    196194         ENDIF 
    197195         IF( lk_north ) THEN                            ! --- North --- ! 
    198             ind1 = jpjglo - ( nn_hls + nbghostcells ) - jspongearea 
    199             ind2 = jpjglo - ( nn_hls + nbghostcells )      ! halo + land + nbghostcells - 1 
     196            ind1 = jpjglo - ( nn_hls + nbghostcells ) - jspongearea - 1 
     197            ind2 = jpjglo - ( nn_hls + nbghostcells ) - 1    ! halo + land + nbghostcells - 1 
    200198            DO jj = mj0(ind1), mj1(ind2) 
    201199               DO ji = 1, jpi 
     
    220218         fspv(:,:) = 0._wp 
    221219         DO_2D( 0, 0, 0, 0 ) 
    222             fspu(ji,jj) = 0.5_wp * ( ztabramp(ji,jj) + ztabramp(ji+1,jj  ) ) * ssumask(ji,jj) 
    223             fspv(ji,jj) = 0.5_wp * ( ztabramp(ji,jj) + ztabramp(ji  ,jj+1) ) * ssvmask(ji,jj) 
     220            fspu(ji,jj) = 0.5_wp * ( ztabramp(ji,jj) + ztabramp(ji,jj-1) ) * ssumask(ji,jj) 
     221            fspv(ji,jj) = 0.5_wp * ( ztabramp(ji,jj) + ztabramp(ji-1,jj) ) * ssvmask(ji,jj) 
    224222         END_2D 
    225223      ENDIF 
     
    230228         fspf(:,:) = 0._wp 
    231229         DO_2D( 0, 0, 0, 0 ) 
    232             fspt(ji,jj) = ztabramp(ji,jj) * ssmask(ji,jj) 
    233             fspf(ji,jj) = 0.25_wp * ( ztabramp(ji  ,jj  ) + ztabramp(ji  ,jj+1)   & 
    234                                   &  +ztabramp(ji+1,jj+1) + ztabramp(ji+1,jj  ) ) & 
    235                                   &  * ssvmask(ji,jj) * ssvmask(ji,jj+1) 
     230            fspt(ji,jj) = 0.25_wp * ( ztabramp(ji  ,jj  ) + ztabramp(ji-1,jj  ) & 
     231                                  &  +ztabramp(ji  ,jj-1) + ztabramp(ji-1,jj-1) ) * ssmask(ji,jj) 
     232            fspf(ji,jj) = ztabramp(ji,jj) * ssvmask(ji,jj) * ssvmask(ji,jj+1) 
    236233         END_2D 
    237234      ENDIF 
     
    250247         spongedoneU = .TRUE. 
    251248      ENDIF 
    252  
     249      ! 
    253250      ! Remove vertical interpolation where not needed: 
    254       DO_2D( 0, 0, 0, 0 ) 
    255          IF ((fspu(ji-1,jj)==0._wp).AND.(fspu(ji,jj)==0._wp).AND. & 
    256          &   (fspv(ji,jj-1)==0._wp).AND.(fspv(ji,jj)==0._wp)) mbkt_parent(ji,jj) = 0 
    257 ! 
    258          IF ((fspt(ji+1,jj)==0._wp).AND.(fspt(ji,jj)==0._wp).AND. & 
    259          &   (fspf(ji,jj-1)==0._wp).AND.(fspf(ji,jj)==0._wp)) mbku_parent(ji,jj) = 0 
    260 ! 
    261          IF ((fspt(ji,jj+1)==0._wp).AND.(fspt(ji,jj)==0._wp).AND. & 
    262          &   (fspf(ji-1,jj)==0._wp).AND.(fspf(ji,jj)==0._wp)) mbkv_parent(ji,jj) = 0 
    263 ! 
    264          IF ( ssmask(ji,jj) == 0._wp) mbkt_parent(ji,jj) = 0 
    265          IF (ssumask(ji,jj) == 0._wp) mbku_parent(ji,jj) = 0 
    266          IF (ssvmask(ji,jj) == 0._wp) mbkv_parent(ji,jj) = 0 
    267       END_2D 
    268       ! 
    269       ztabramp (:,:) = REAL( mbkt_parent(:,:), wp ) 
    270       ztabrampu(:,:) = REAL( mbku_parent(:,:), wp ) 
    271       ztabrampv(:,:) = REAL( mbkv_parent(:,:), wp ) 
    272       CALL lbc_lnk_multi( 'Agrif_Sponge', ztabramp, 'T', 1._wp, ztabrampu, 'U', 1._wp, ztabrampv, 'V', 1._wp ) 
    273       mbkt_parent(:,:) = NINT( ztabramp (:,:) ) 
    274       mbku_parent(:,:) = NINT( ztabrampu(:,:) ) 
    275       mbkv_parent(:,:) = NINT( ztabrampv(:,:) ) 
     251      ! (A null value in mbkx arrays does the job) 
     252      WHERE (fspu(:,:) == 0._wp) mbku_parent(:,:) = 0 
     253      WHERE (fspv(:,:) == 0._wp) mbkv_parent(:,:) = 0 
     254      WHERE (fspt(:,:) == 0._wp) mbkt_parent(:,:) = 0 
    276255      ! 
    277256#endif 
     
    406385               DO jj = j1,j2 
    407386                  DO ji = i1,i2-1 
    408                      zabe1 = rn_sponge_tra * r1_Dt * fspu(ji,jj) * umask(ji,jj,jk) * e1e2u(ji,jj) * e3u(ji,jj,jk,Kmm_a) 
     387                     zabe1 = fspu(ji,jj) * rn_sponge_tra * r1_Dt * umask(ji,jj,jk) * e1e2u(ji,jj) * e3u(ji,jj,jk,Kmm_a) 
    409388                     ztu(ji,jj,jk) = zabe1 * ( tsbdiff(ji+1,jj  ,jk,jn) - tsbdiff(ji,jj,jk,jn) )  
    410389                  END DO 
     
    413392               DO ji = i1,i2 
    414393                  DO jj = j1,j2-1 
    415                      zabe2 = rn_sponge_tra * r1_Dt * fspv(ji,jj) * vmask(ji,jj,jk) * e1e2v(ji,jj) * e3v(ji,jj,jk,Kmm_a) 
     394                     zabe2 = fspv(ji,jj) * rn_sponge_tra * r1_Dt * vmask(ji,jj,jk) * e1e2v(ji,jj) * e3v(ji,jj,jk,Kmm_a) 
    416395                     ztv(ji,jj,jk) = zabe2 * ( tsbdiff(ji  ,jj+1,jk,jn) - tsbdiff(ji,jj,jk,jn) ) 
    417396                  END DO 
Note: See TracChangeset for help on using the changeset viewer.