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

Changeset 14641


Ignore:
Timestamp:
2021-03-26T11:30:01+01:00 (3 years ago)
Author:
jchanut
Message:

1) Revise boundary checking with AGRIF (unify vertical remaping case or not) 2) Disable parent volume check without vertical remaping until we sort out what to do in the damned overlapping zone. At this stage DOMAINcfg produces meshes in agreement with what NEMO expects, except for cyclic East-West child grids for which a mismatch persists at boundaries. Child grids over North Pole Fold or East-West boundaries are however correct, #2638

Location:
NEMO/branches/2021/dev_r14608_AGRIF_domcfg/src/NST
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • NEMO/branches/2021/dev_r14608_AGRIF_domcfg/src/NST/agrif_oce_interp.F90

    r14433 r14641  
    4444   PUBLIC   interptsn, interpsshn, interpavm 
    4545   PUBLIC   interpunb, interpvnb , interpub2b, interpvb2b 
    46    PUBLIC   interpe3t, interpglamt, interpgphit 
     46   PUBLIC   interpglamt, interpgphit 
    4747   PUBLIC   interpht0, interpmbkt, interpe3t0_vremap 
    4848   PUBLIC   agrif_istate_oce, agrif_istate_ssh   ! called by icestate.F90 and domvvl.F90 
     
    15351535 
    15361536 
    1537    SUBROUTINE interpe3t( ptab, i1, i2, j1, j2, k1, k2, before ) 
    1538       !!---------------------------------------------------------------------- 
    1539       !!                  ***  ROUTINE interpe3t  *** 
    1540       !!----------------------------------------------------------------------   
    1541       INTEGER                              , INTENT(in   ) :: i1, i2, j1, j2, k1, k2 
    1542       REAL(wp),DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) :: ptab 
    1543       LOGICAL                              , INTENT(in   ) :: before 
    1544       ! 
    1545       INTEGER :: ji, jj, jk 
    1546       !!----------------------------------------------------------------------   
    1547       !     
    1548       IF( before ) THEN 
    1549          ptab(i1:i2,j1:j2,k1:k2) = tmask(i1:i2,j1:j2,k1:k2) * e3t_0(i1:i2,j1:j2,k1:k2) 
    1550       ELSE 
    1551          ! 
    1552          DO jk = k1, k2 
    1553             DO jj = j1, j2 
    1554                DO ji = i1, i2 
    1555                   IF( ABS( ptab(ji,jj,jk) - tmask(ji,jj,jk) * e3t_0(ji,jj,jk) ) > 1.D-2) THEN 
    1556                      WRITE(numout,*) ' Agrif error for e3t_0: parent , child, i, j, k ',  &  
    1557                      &                 ptab(ji,jj,jk), tmask(ji,jj,jk) * e3t_0(ji,jj,jk), & 
    1558                      &                 mig0(ji), mjg0(jj), jk 
    1559                      kindic_agr = kindic_agr + 1 
    1560                   ENDIF 
    1561                END DO 
    1562             END DO 
    1563          END DO 
    1564          ! 
    1565       ENDIF 
    1566       !  
    1567    END SUBROUTINE interpe3t 
    1568  
    1569  
    15701537   SUBROUTINE interpe3t0_vremap( ptab, i1, i2, j1, j2, k1, k2, before ) 
    15711538      !!---------------------------------------------------------------------- 
     
    17931760      INTEGER, INTENT(inout) ::   iindic 
    17941761      !! 
    1795       INTEGER :: ji, jj 
     1762      INTEGER :: ji, jj, jk 
    17961763      INTEGER  :: istart, iend, jstart, jend, ispon 
    17971764      !!----------------------------------------------------------------------   
     
    18011768      IF(lk_west) THEN 
    18021769         ispon  = nn_sponge_len * Agrif_irhox() 
    1803          istart = nn_hls + 2                                  ! halo + land + 1 
     1770         istart = nn_hls + 1                                  ! halo + land + 1 
    18041771         iend   = nn_hls + 1 + nbghostcells + ispon           ! halo + land + nbghostcells + sponge 
    1805          jstart = nn_hls + 2 
    1806          jend   = jpjglo - nn_hls - 1 
     1772         jstart = nn_hls + 1  
     1773         jend   = jpjglo - nn_hls  
    18071774         DO ji = mi0(istart), mi1(iend) 
    18081775            DO jj = mj0(jstart), mj1(jend) 
    18091776               IF ( ABS(ht0_parent(ji,jj)-ht_0(ji,jj)) > 1.e-3 ) iindic = iindic + 1 
     1777               IF ( .NOT.ln_vert_remap) THEN 
     1778                  DO jk = 1, jpkm1 
     1779                     IF ( ABS(e3t0_parent(ji,jj,jk)-e3t_0(ji,jj,jk))*tmask(ji,jj,jk) > 1.e-3 ) iindic = iindic + 1 
     1780                  END DO  
     1781               ENDIF 
    18101782            END DO 
    18111783            DO jj = mj0(jstart), mj1(jend-1) 
    18121784               IF ( ABS(hv0_parent(ji,jj)-hv_0(ji,jj)) > 1.e-3 ) iindic = iindic + 1 
     1785               IF ( .NOT.ln_vert_remap) THEN 
     1786                  DO jk = 1, jpkm1 
     1787                     IF ( ABS(e3v0_parent(ji,jj,jk)-e3v_0(ji,jj,jk))*vmask(ji,jj,jk) > 1.e-3 ) iindic = iindic + 1 
     1788                  END DO  
     1789               ENDIF 
    18131790            END DO 
    18141791         END DO 
     
    18161793            DO jj = mj0(jstart), mj1(jend) 
    18171794               IF ( ABS(hu0_parent(ji,jj)-hu_0(ji,jj)) > 1.e-3 ) iindic = iindic + 1 
     1795               IF ( .NOT.ln_vert_remap) THEN 
     1796                  DO jk = 1, jpkm1 
     1797                     IF ( ABS(e3u0_parent(ji,jj,jk)-e3u_0(ji,jj,jk))*umask(ji,jj,jk) > 1.e-3 ) iindic = iindic + 1 
     1798                  END DO  
     1799               ENDIF 
    18181800            END DO 
    18191801         END DO 
     
    18241806         ispon  = nn_sponge_len * Agrif_irhox()  
    18251807         istart = jpiglo - ( nn_hls + nbghostcells + ispon )  ! halo + land + nbghostcells + sponge - 1 
    1826          iend   = jpiglo - ( nn_hls + 1 )                     ! halo + land + 1                     - 1 
    1827          jstart = nn_hls + 2 
    1828          jend   = jpjglo - nn_hls - 1  
     1808         iend   = jpiglo - nn_hls                             ! halo + land + 1                     - 1 
     1809         jstart = nn_hls + 1  
     1810         jend   = jpjglo - nn_hls  
    18291811         DO ji = mi0(istart), mi1(iend) 
    18301812            DO jj = mj0(jstart), mj1(jend) 
    18311813               IF ( ABS(ht0_parent(ji,jj)-ht_0(ji,jj)) > 1.e-3 ) iindic = iindic + 1 
     1814               IF ( .NOT.ln_vert_remap) THEN 
     1815                  DO jk = 1, jpkm1 
     1816                     IF ( ABS(e3t0_parent(ji,jj,jk)-e3t_0(ji,jj,jk))*tmask(ji,jj,jk) > 1.e-3 ) iindic = iindic + 1 
     1817                  END DO  
     1818               ENDIF 
    18321819            END DO 
    18331820            DO jj = mj0(jstart), mj1(jend-1) 
    18341821               IF ( ABS(hv0_parent(ji,jj)-hv_0(ji,jj)) > 1.e-3 ) iindic = iindic + 1 
    1835             END DO 
    1836          END DO 
    1837          DO ji = mi0(istart+1), mi1(iend-1) 
     1822               IF ( .NOT.ln_vert_remap) THEN 
     1823                  DO jk = 1, jpkm1 
     1824                     IF ( ABS(e3v0_parent(ji,jj,jk)-e3v_0(ji,jj,jk))*vmask(ji,jj,jk) > 1.e-3 ) iindic = iindic + 1 
     1825                  END DO  
     1826               ENDIF 
     1827            END DO 
     1828         END DO 
     1829         DO ji = mi0(istart), mi1(iend-1) 
    18381830            DO jj = mj0(jstart), mj1(jend) 
    18391831               IF ( ABS(hu0_parent(ji,jj)-hu_0(ji,jj)) > 1.e-3 ) iindic = iindic + 1 
     1832               IF ( .NOT.ln_vert_remap) THEN 
     1833                  DO jk = 1, jpkm1 
     1834                     IF ( ABS(e3u0_parent(ji,jj,jk)-e3u_0(ji,jj,jk))*umask(ji,jj,jk) > 1.e-3 ) iindic = iindic + 1 
     1835                  END DO  
     1836               ENDIF 
    18401837            END DO 
    18411838         END DO 
     
    18441841      ! --- South --- ! 
    18451842      IF(lk_south) THEN 
    1846          ispon  = nn_sponge_len * Agrif_irhoy()  
    1847          jstart = nn_hls + 2                                 ! halo + land + 1 
     1843         ispon  = nn_sponge_len * Agrif_irhoy()   
     1844         jstart = nn_hls + 1                                 ! halo + land + 1 
    18481845         jend   = nn_hls + 1 + nbghostcells + ispon          ! halo + land + nbghostcells + sponge 
    1849          istart = nn_hls + 2 
    1850          iend   = jpiglo - nn_hls - 1 
     1846         istart = nn_hls + 1  
     1847         iend   = jpiglo - nn_hls  
    18511848         DO jj = mj0(jstart), mj1(jend) 
    18521849            DO ji = mi0(istart), mi1(iend) 
    18531850               IF ( ABS(ht0_parent(ji,jj)-ht_0(ji,jj)) > 1.e-3 ) iindic = iindic + 1 
     1851               IF ( .NOT.ln_vert_remap) THEN 
     1852                  DO jk = 1, jpkm1 
     1853                     IF ( ABS(e3t0_parent(ji,jj,jk)-e3t_0(ji,jj,jk))*tmask(ji,jj,jk) > 1.e-3 ) iindic = iindic + 1 
     1854                  END DO  
     1855               ENDIF 
    18541856            END DO 
    18551857            DO ji = mi0(istart), mi1(iend-1) 
    18561858               IF ( ABS(hu0_parent(ji,jj)-hu_0(ji,jj)) > 1.e-3 ) iindic = iindic + 1 
     1859               IF ( .NOT.ln_vert_remap) THEN 
     1860                  DO jk = 1, jpkm1 
     1861                     IF ( ABS(e3u0_parent(ji,jj,jk)-e3u_0(ji,jj,jk))*umask(ji,jj,jk) > 1.e-3 ) iindic = iindic + 1 
     1862                  END DO  
     1863               ENDIF 
    18571864            END DO 
    18581865         END DO 
     
    18601867            DO ji = mi0(istart), mi1(iend) 
    18611868               IF ( ABS(hv0_parent(ji,jj)-hv_0(ji,jj)) > 1.e-3 ) iindic = iindic + 1 
     1869               IF ( .NOT.ln_vert_remap) THEN 
     1870                  DO jk = 1, jpkm1 
     1871                     IF ( ABS(e3v0_parent(ji,jj,jk)-e3v_0(ji,jj,jk))*vmask(ji,jj,jk) > 1.e-3 ) iindic = iindic + 1 
     1872                  END DO  
     1873               ENDIF 
    18621874            END DO 
    18631875         END DO 
     
    18681880         ispon  = nn_sponge_len * Agrif_irhoy()  
    18691881         jstart = jpjglo - ( nn_hls + nbghostcells + ispon)  ! halo + land + nbghostcells +sponge - 1 
    1870          jend   = jpjglo - ( nn_hls + 1 )                    ! halo + land + 1            - 1 
    1871          istart = nn_hls + 2 
    1872          iend   = jpiglo - nn_hls - 1 
     1882         jend   = jpjglo - nn_hls                            ! halo + land + 1            - 1 
     1883         istart = nn_hls + 1  
     1884         iend   = jpiglo - nn_hls  
    18731885         DO jj = mj0(jstart), mj1(jend) 
    18741886            DO ji = mi0(istart), mi1(iend) 
    18751887               IF ( ABS(ht0_parent(ji,jj)-ht_0(ji,jj)) > 1.e-3 ) iindic = iindic + 1 
     1888               IF ( .NOT.ln_vert_remap) THEN 
     1889                  DO jk = 1, jpkm1 
     1890                     IF ( ABS(e3t0_parent(ji,jj,jk)-e3t_0(ji,jj,jk))*tmask(ji,jj,jk) > 1.e-3 ) iindic = iindic + 1 
     1891                  END DO  
     1892               ENDIF 
    18761893            END DO 
    18771894            DO ji = mi0(istart), mi1(iend-1) 
    18781895               IF ( ABS(hu0_parent(ji,jj)-hu_0(ji,jj)) > 1.e-3 ) iindic = iindic + 1 
    1879             END DO 
    1880          END DO 
    1881          DO jj = mj0(jstart+1), mj1(jend-1) 
     1896               IF ( .NOT.ln_vert_remap) THEN 
     1897                  DO jk = 1, jpkm1 
     1898                     IF ( ABS(e3u0_parent(ji,jj,jk)-e3u_0(ji,jj,jk))*umask(ji,jj,jk) > 1.e-3 ) iindic = iindic + 1 
     1899                  END DO  
     1900               ENDIF 
     1901            END DO 
     1902         END DO 
     1903         DO jj = mj0(jstart), mj1(jend-1) 
    18821904            DO ji = mi0(istart), mi1(iend) 
    18831905               IF ( ABS(hv0_parent(ji,jj)-hv_0(ji,jj)) > 1.e-3 ) iindic = iindic + 1 
     1906               IF ( .NOT.ln_vert_remap) THEN 
     1907                  DO jk = 1, jpkm1 
     1908                     IF ( ABS(e3v0_parent(ji,jj,jk)-e3v_0(ji,jj,jk))*vmask(ji,jj,jk) > 1.e-3 ) iindic = iindic + 1 
     1909                  END DO  
     1910               ENDIF 
    18841911            END DO 
    18851912         END DO 
  • NEMO/branches/2021/dev_r14608_AGRIF_domcfg/src/NST/agrif_oce_update.F90

    r14227 r14641  
    12841284      !!---------------------------------------------------------------------- 
    12851285      !  
    1286       IF (( .NOT.ln_agrif_2way ).OR.(.NOT.ln_chk_bathy).OR.(Agrif_Root())) RETURN 
     1286      IF (( .NOT.ln_agrif_2way ).OR.(.NOT.ln_chk_bathy) &  
     1287      & .OR.(.NOT.ln_vert_remap).OR.(Agrif_Root())) RETURN 
    12871288      ! 
    12881289      Agrif_UseSpecialValueInUpdate = .FALSE. 
  • NEMO/branches/2021/dev_r14608_AGRIF_domcfg/src/NST/agrif_user.F90

    r14619 r14641  
    120120       ! 3. Location of interpolation 
    121121      !----------------------------- 
    122 !      CALL Agrif_Set_bc(  e3t_id, (/-nn_sponge_len*imaxrho,ind1-1/) )   
    123 ! JC: check near the boundary only until matching in sponge has been sorted out: 
    124       CALL Agrif_Set_bc(    e3t_id, (/0,ind1-1/) )   
     122      CALL Agrif_Set_bc(  e3t_id, (/-nn_sponge_len*imaxrho-2,ind1-1/) )   
    125123 
    126124      ! extend the interpolation zone by 1 more point than necessary: 
    127125      ! RB check here 
    128       CALL Agrif_Set_bc( e3t0_interp_id, (/-nn_sponge_len*imaxrho-2,ind1/) ) 
    129       CALL Agrif_Set_bc(        mbkt_id, (/-nn_sponge_len*imaxrho-2,ind1/) ) 
    130       CALL Agrif_Set_bc(         ht0_id, (/-nn_sponge_len*imaxrho-2,ind1/) ) 
     126      CALL Agrif_Set_bc( e3t0_interp_id, (/-nn_sponge_len*imaxrho-2,ind1-1/) ) 
     127      CALL Agrif_Set_bc(        mbkt_id, (/-nn_sponge_len*imaxrho-2,ind1-1/) ) 
     128      CALL Agrif_Set_bc(         ht0_id, (/-nn_sponge_len*imaxrho-2,ind1-1/) ) 
     129 
    131130      CALL Agrif_Set_bc(       tsini_id, (/0,ind1-1/) ) ! if west,  rhox=3 and nbghost=3: columns 2 to 4 
    132131      CALL Agrif_Set_bc(        uini_id, (/0,ind1-1/) )  
     
    222221      ! 
    223222      ! Build "intermediate" parent vertical grid on child domain 
    224       IF ( ln_vert_remap ) THEN 
    225  
    226          jpk_parent = Agrif_parent( jpk ) 
    227          ALLOCATE(e3t0_parent(jpi,jpj,jpk_parent), & 
    228             &     e3u0_parent(jpi,jpj,jpk_parent), & 
    229             &     e3v0_parent(jpi,jpj,jpk_parent), STAT = ierr)  
    230          IF( ierr  > 0 )   CALL ctl_warn('Agrif_Init_Domain: allocation of arrays failed') 
     223      jpk_parent = Agrif_parent( jpk ) 
     224      ALLOCATE(e3t0_parent(jpi,jpj,jpk_parent), & 
     225         &     e3u0_parent(jpi,jpj,jpk_parent), & 
     226         &     e3v0_parent(jpi,jpj,jpk_parent), STAT = ierr)  
     227      IF( ierr  > 0 )   CALL ctl_warn('Agrif_Init_Domain: allocation of arrays failed') 
    231228        
    232          ! Retrieve expected parent scale factors on child grid: 
    233          Agrif_UseSpecialValue = .FALSE. 
    234          e3t0_parent(:,:,:) = 0._wp 
    235          CALL Agrif_Init_Variable(e3t0_interp_id, procname=interpe3t0_vremap) 
    236          ! 
    237          ! Deduce scale factors at U and V points: 
    238          DO_3D( 0, 0, 0, 0, 1, jpk_parent ) 
    239             e3u0_parent(ji,jj,jk) = 0.5_wp * (e3t0_parent(ji,jj,jk) + e3t0_parent(ji+1,jj  ,jk)) 
    240             e3v0_parent(ji,jj,jk) = 0.5_wp * (e3t0_parent(ji,jj,jk) + e3t0_parent(ji  ,jj+1,jk)) 
    241          END_3D 
    242  
    243          ! Assume a step at the bottom except if (pure) s-coordinates 
    244          IF ( .NOT.Agrif_Parent(ln_sco) ) THEN  
    245             DO_2D( 1, 0, 1, 0 ) 
    246                jk = mbku_parent(ji,jj) 
    247                e3u0_parent(ji,jj,jk) = MIN(e3t0_parent(ji,jj,jk), e3t0_parent(ji+1,jj  ,jk)) 
    248                jk = mbkv_parent(ji,jj) 
    249                e3v0_parent(ji,jj,jk) = MIN(e3t0_parent(ji,jj,jk), e3t0_parent(ji  ,jj+1,jk)) 
    250             END_2D 
    251          ENDIF 
    252  
    253          CALL lbc_lnk( 'Agrif_Init_Domain', e3u0_parent, 'U', 1.0_wp, e3v0_parent, 'V', 1.0_wp ) 
    254       ENDIF 
     229      ! Retrieve expected parent scale factors on child grid: 
     230      Agrif_UseSpecialValue = .FALSE. 
     231      e3t0_parent(:,:,:) = 0._wp 
     232      CALL Agrif_Init_Variable(e3t0_interp_id, procname=interpe3t0_vremap) 
     233      ! 
     234      ! Deduce scale factors at U and V points: 
     235      DO_3D( 0, 0, 0, 0, 1, jpk_parent ) 
     236         e3u0_parent(ji,jj,jk) = 0.5_wp * (e3t0_parent(ji,jj,jk) + e3t0_parent(ji+1,jj  ,jk)) 
     237         e3v0_parent(ji,jj,jk) = 0.5_wp * (e3t0_parent(ji,jj,jk) + e3t0_parent(ji  ,jj+1,jk)) 
     238      END_3D 
     239 
     240      ! Assume a step at the bottom except if (pure) s-coordinates 
     241      IF ( .NOT.Agrif_Parent(ln_sco) ) THEN  
     242         DO_2D( 1, 0, 1, 0 ) 
     243            jk = mbku_parent(ji,jj) 
     244            e3u0_parent(ji,jj,jk) = MIN(e3t0_parent(ji,jj,jk), e3t0_parent(ji+1,jj  ,jk)) 
     245            jk = mbkv_parent(ji,jj) 
     246            e3v0_parent(ji,jj,jk) = MIN(e3t0_parent(ji,jj,jk), e3t0_parent(ji  ,jj+1,jk)) 
     247         END_2D 
     248      ENDIF 
     249 
     250      CALL lbc_lnk( 'Agrif_Init_Domain', e3u0_parent, 'U', 1.0_wp, e3v0_parent, 'V', 1.0_wp ) 
    255251 
    256252      ! check if masks and bathymetries match 
     
    262258         ! 
    263259         kindic_agr = 0 
    264          IF( .NOT. ln_vert_remap ) THEN 
    265             ! 
    266             ! check if tmask and vertical scale factors agree with parent in sponge area: 
    267             CALL Agrif_Bc_variable(e3t_id,calledweight=1.,procname=interpe3t) 
    268             ! 
    269          ELSE 
    270             ! 
    271             ! In case of vertical interpolation, check only that total depths agree between child and parent: 
    272                    
    273             CALL Agrif_check_bat( kindic_agr )            
    274          ENDIF 
     260         !          
     261         CALL Agrif_check_bat( kindic_agr )            
    275262         ! 
    276263         CALL mpp_sum( 'agrif_InitValues_Domain', kindic_agr ) 
     
    287274      WHERE (ssmask(:,:)  == 0._wp) mbkt_parent(:,:) = 0 
    288275      ! 
     276      IF ( .NOT.ln_vert_remap ) DEALLOCATE(e3t0_parent, e3u0_parent, e3v0_parent) 
     277 
    289278   END SUBROUTINE Agrif_Init_Domain 
    290279 
Note: See TracChangeset for help on using the changeset viewer.