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 4984 for branches/2014 – NEMO

Changeset 4984 for branches/2014


Ignore:
Timestamp:
2014-12-12T17:58:00+01:00 (9 years ago)
Author:
jchanut
Message:

AGRIF: Improve bathymetry checks at child boundaries

Location:
branches/2014/dev_r4765_CNRS_agrif/NEMOGCM/NEMO/NST_SRC
Files:
3 edited

Legend:

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

    r4978 r4984  
    6767   INTEGER :: scales_t_id 
    6868   INTEGER :: avt_id, avm_id, avmu_id, avmv_id 
     69   INTEGER :: umsk_id, vmsk_id 
     70   INTEGER :: kindic_agr 
    6971 
    7072   !!---------------------------------------------------------------------- 
  • branches/2014/dev_r4765_CNRS_agrif/NEMOGCM/NEMO/NST_SRC/agrif_opa_interp.F90

    r4789 r4984  
    4141   PUBLIC   interptsn,  interpsshn 
    4242   PUBLIC   interpunb, interpvnb, interpub2b, interpvb2b 
    43    PUBLIC   interpe3t 
     43   PUBLIC   interpe3t, interpumsk, interpvmsk 
    4444# if defined key_zdftke 
    4545   PUBLIC   Agrif_tke, interpavt, interpavm, interpavmu, interpavmv 
     
    11651165   SUBROUTINE interpe3t(ptab,i1,i2,j1,j2,k1,k2,before,nb,ndir) 
    11661166      !!---------------------------------------------------------------------- 
    1167       !!                  ***  ROUTINE interpv  *** 
     1167      !!                  ***  ROUTINE interpe3t  *** 
    11681168      !!----------------------------------------------------------------------   
    11691169      !  
     
    11741174      ! 
    11751175      INTEGER :: ji, jj, jk 
    1176       INTEGER :: icnt 
    1177       LOGICAL :: western_side, eastern_side,northern_side,southern_side       
     1176      LOGICAL :: western_side, eastern_side, northern_side, southern_side 
     1177      REAL(wp) :: ztmpmsk       
    11781178      !!----------------------------------------------------------------------   
    11791179      !     
     
    11821182            DO jj=j1,j2 
    11831183               DO ji=i1,i2 
    1184                   ptab(ji,jj,jk) = tmask(ji,jj,jk) * fse3t(ji,jj,jk) 
     1184                  ptab(ji,jj,jk) = tmask(ji,jj,jk) * e3t_0(ji,jj,jk) 
    11851185               END DO 
    11861186            END DO 
     
    11921192         northern_side = (nb == 2).AND.(ndir == 2) 
    11931193 
    1194          icnt = 0 
    11951194         DO jk=k1,k2 
    11961195            DO jj=j1,j2 
    11971196               DO ji=i1,i2 
    1198                   IF (ABS(ptab(ji,jj,jk) - tmask(ji,jj,jk) * fse3t(ji,jj,jk)) > 1.D-2) THEN 
     1197                  ! Get velocity mask at boundary edge points: 
     1198                  IF (western_side)  ztmpmsk = umask(ji    ,jj    ,1) 
     1199                  IF (eastern_side)  ztmpmsk = umask(nlci-2,jj    ,1) 
     1200                  IF (northern_side) ztmpmsk = vmask(ji    ,nlcj-2,1) 
     1201                  IF (southern_side) ztmpmsk = vmask(ji    ,2     ,1) 
     1202 
     1203                  IF (ABS(ptab(ji,jj,jk) - tmask(ji,jj,jk) * e3t_0(ji,jj,jk))*ztmpmsk > 1.D-2) THEN 
    11991204                     IF (western_side) THEN 
    1200                         WRITE(numout,*) 'ERROR bathymetry merge at the western border ji,jj,jk ', ji,jj,jk 
     1205                        WRITE(numout,*) 'ERROR bathymetry merge at the western border ji,jj,jk ', ji+nimpp-1,jj+njmpp-1,jk 
    12011206                     ELSEIF (eastern_side) THEN 
    1202                         WRITE(numout,*) 'ERROR bathymetry merge at the eastern border ji,jj,jk ', ji,jj,jk 
     1207                        WRITE(numout,*) 'ERROR bathymetry merge at the eastern border ji,jj,jk ', ji+nimpp-1,jj+njmpp-1,jk 
    12031208                     ELSEIF (southern_side) THEN 
    1204                         WRITE(numout,*) 'ERROR bathymetry merge at the southern border ji,jj,jk', ji,jj,jk 
     1209                        WRITE(numout,*) 'ERROR bathymetry merge at the southern border ji,jj,jk', ji+nimpp-1,jj+njmpp-1,jk 
    12051210                     ELSEIF (northern_side) THEN 
    1206                         WRITE(numout,*) 'ERROR bathymetry merge at the northen border ji,jj,jk', ji,jj,jk 
     1211                        WRITE(numout,*) 'ERROR bathymetry merge at the northen border ji,jj,jk', ji+nimpp-1,jj+njmpp-1,jk 
    12071212                     ENDIF 
    1208                      WRITE(numout,*) '      ptab(ji,jj,jk), fse3t(ji,jj,jk) ', ptab(ji,jj,jk), fse3t(ji,jj,jk) 
    1209                      icnt = icnt + 1 
     1213                     WRITE(numout,*) '      ptab(ji,jj,jk), fse3t(ji,jj,jk) ', ptab(ji,jj,jk), e3t_0(ji,jj,jk) 
     1214                     kindic_agr = kindic_agr + 1 
    12101215                  ENDIF 
    12111216               END DO 
    12121217            END DO 
    12131218         END DO 
    1214          IF(icnt /= 0) THEN  
    1215             CALL ctl_stop('ERROR in bathymetry merge between parent and child grids...') 
    1216          ELSE 
    1217             IF(lwp) WRITE(numout,*) 'interp e3t ok...' 
    1218          END IF 
     1219 
    12191220      ENDIF 
    12201221      !  
    12211222   END SUBROUTINE interpe3t 
     1223 
     1224   SUBROUTINE interpumsk(ptab,i1,i2,j1,j2,k1,k2,before,nb,ndir) 
     1225      !!---------------------------------------------------------------------- 
     1226      !!                  ***  ROUTINE interpumsk  *** 
     1227      !!----------------------------------------------------------------------   
     1228      !  
     1229      INTEGER, INTENT(in) :: i1,i2,j1,j2,k1,k2 
     1230      REAL(wp),DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) :: ptab 
     1231      LOGICAL :: before 
     1232      INTEGER, INTENT(in) :: nb , ndir 
     1233      ! 
     1234      INTEGER :: ji, jj, jk 
     1235      LOGICAL :: western_side, eastern_side    
     1236      !!----------------------------------------------------------------------   
     1237      !     
     1238      IF (before) THEN 
     1239         DO jk=k1,k2 
     1240            DO jj=j1,j2 
     1241               DO ji=i1,i2 
     1242                  ptab(ji,jj,jk) = umask(ji,jj,jk) 
     1243               END DO 
     1244            END DO 
     1245         END DO 
     1246      ELSE 
     1247 
     1248         western_side  = (nb == 1).AND.(ndir == 1) 
     1249         eastern_side  = (nb == 1).AND.(ndir == 2) 
     1250         DO jk=k1,k2 
     1251            DO jj=j1,j2 
     1252               DO ji=i1,i2 
     1253                   ! Velocity mask at boundary edge points: 
     1254                  IF (ABS(ptab(ji,jj,jk) - umask(ji,jj,jk)) > 1.D-2) THEN 
     1255                     IF (western_side) THEN 
     1256                        WRITE(numout,*) 'ERROR with umask at the western border ji,jj,jk ', ji+nimpp-1,jj+njmpp-1,jk 
     1257                        WRITE(numout,*) '      masks: parent, child ', ptab(ji,jj,jk), umask(ji,jj,jk) 
     1258                        kindic_agr = kindic_agr + 1 
     1259                     ELSEIF (eastern_side) THEN 
     1260                        WRITE(numout,*) 'ERROR with umask at the eastern border ji,jj,jk ', ji+nimpp-1,jj+njmpp-1,jk 
     1261                        WRITE(numout,*) '      masks: parent, child ', ptab(ji,jj,jk), umask(ji,jj,jk) 
     1262                        kindic_agr = kindic_agr + 1 
     1263                     ENDIF 
     1264                  ENDIF 
     1265               END DO 
     1266            END DO 
     1267         END DO 
     1268 
     1269      ENDIF 
     1270      !  
     1271   END SUBROUTINE interpumsk 
     1272 
     1273   SUBROUTINE interpvmsk(ptab,i1,i2,j1,j2,k1,k2,before,nb,ndir) 
     1274      !!---------------------------------------------------------------------- 
     1275      !!                  ***  ROUTINE interpvmsk  *** 
     1276      !!----------------------------------------------------------------------   
     1277      !  
     1278      INTEGER, INTENT(in) :: i1,i2,j1,j2,k1,k2 
     1279      REAL(wp),DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) :: ptab 
     1280      LOGICAL :: before 
     1281      INTEGER, INTENT(in) :: nb , ndir 
     1282      ! 
     1283      INTEGER :: ji, jj, jk 
     1284      LOGICAL :: northern_side, southern_side      
     1285      !!----------------------------------------------------------------------   
     1286      !     
     1287      IF (before) THEN 
     1288         DO jk=k1,k2 
     1289            DO jj=j1,j2 
     1290               DO ji=i1,i2 
     1291                  ptab(ji,jj,jk) = vmask(ji,jj,jk) 
     1292               END DO 
     1293            END DO 
     1294         END DO 
     1295      ELSE 
     1296 
     1297         southern_side = (nb == 2).AND.(ndir == 1) 
     1298         northern_side = (nb == 2).AND.(ndir == 2) 
     1299         DO jk=k1,k2 
     1300            DO jj=j1,j2 
     1301               DO ji=i1,i2 
     1302                   ! Velocity mask at boundary edge points: 
     1303                  IF (ABS(ptab(ji,jj,jk) - vmask(ji,jj,jk)) > 1.D-2) THEN 
     1304                     IF (southern_side) THEN 
     1305                        WRITE(numout,*) 'ERROR with vmask at the southern border ji,jj,jk ', ji+nimpp-1,jj+njmpp-1,jk 
     1306                        WRITE(numout,*) '      masks: parent, child ', ptab(ji,jj,jk), vmask(ji,jj,jk) 
     1307                        kindic_agr = kindic_agr + 1 
     1308                     ELSEIF (northern_side) THEN 
     1309                        WRITE(numout,*) 'ERROR with vmask at the northern border ji,jj,jk ', ji+nimpp-1,jj+njmpp-1,jk 
     1310                        WRITE(numout,*) '      masks: parent, child ', ptab(ji,jj,jk), vmask(ji,jj,jk) 
     1311                        kindic_agr = kindic_agr + 1 
     1312                     ENDIF 
     1313                  ENDIF 
     1314               END DO 
     1315            END DO 
     1316         END DO 
     1317 
     1318      ENDIF 
     1319      !  
     1320   END SUBROUTINE interpvmsk 
    12221321 
    12231322# if defined key_zdftke 
  • branches/2014/dev_r4765_CNRS_agrif/NEMOGCM/NEMO/NST_SRC/agrif_user.F90

    r4982 r4984  
    279279         ENDIF 
    280280      ENDIF 
    281       ! check if the bathy metry match 
    282       IF(ln_chk_bathy) CALL Agrif_Bc_variable(e3t_id,calledweight=1.,procname=interpe3t) 
     281      ! check if masks and bathymetries match 
     282      IF(ln_chk_bathy) THEN 
     283         ! 
     284         IF(lwp) WRITE(numout,*) 'AGRIF: Check Bathymetry and masks near bdys. Level: ', Agrif_Level() 
     285         ! 
     286         kindic_agr = 0 
     287         ! check if umask agree with parent along western and eastern boundaries: 
     288         CALL Agrif_Bc_variable(umsk_id,calledweight=1.,procname=interpumsk) 
     289         ! check if vmask agree with parent along northern and southern boundaries: 
     290         CALL Agrif_Bc_variable(vmsk_id,calledweight=1.,procname=interpvmsk) 
     291    ! check if tmask and vertical scale factors agree with parent over first two coarse grid points: 
     292         CALL Agrif_Bc_variable(e3t_id,calledweight=1.,procname=interpe3t) 
     293         ! 
     294         IF (lk_mpp) CALL mpp_sum( kindic_agr ) 
     295         IF( kindic_agr /= 0 ) THEN                    
     296            CALL ctl_stop('Child Bathymetry is not correct near boundaries.') 
     297         ELSE 
     298            IF(lwp) WRITE(numout,*) 'Child Bathymetry is ok near boundaries.' 
     299         END IF 
     300      ENDIF 
    283301      ! 
    284302   ENDIF 
     
    336354 
    337355   CALL agrif_declare_variable((/2,2,0/),(/3,3,0/),(/'x','y','N'/),(/1,1,1/),(/nlci,nlcj,jpk/),e3t_id) 
     356   CALL agrif_declare_variable((/1,2,0/),(/2,3,0/),(/'x','y','N'/),(/1,1,1/),(/nlci,nlcj,jpk/),umsk_id) 
     357   CALL agrif_declare_variable((/2,1,0/),(/3,2,0/),(/'x','y','N'/),(/1,1,1/),(/nlci,nlcj,jpk/),vmsk_id) 
    338358 
    339359   CALL agrif_declare_variable((/2,2,0,0/),(/3,3,0,0/),(/'x','y','N','N'/),(/1,1,1,1/),(/nlci,nlcj,jpk,3/),scales_t_id) 
     
    375395 
    376396   CALL Agrif_Set_bcinterp(e3t_id,interp=AGRIF_constant) 
     397   CALL Agrif_Set_bcinterp(umsk_id,interp=AGRIF_constant) 
     398   CALL Agrif_Set_bcinterp(vmsk_id,interp=AGRIF_constant) 
    377399 
    378400# if defined key_zdftke 
     
    403425   CALL Agrif_Set_bc(vb2b_interp_id,(/0,0/)) 
    404426 
    405    CALL Agrif_Set_bc(e3t_id,(/-3*Agrif_irhox(),0/))   ! if west and rhox=3: column 2 to 11 
     427   CALL Agrif_Set_bc(e3t_id,(/-2*Agrif_irhox()-1,0/))   ! if west and rhox=3: column 2 to 9 
     428   CALL Agrif_Set_bc(umsk_id,(/0,0/)) 
     429   CALL Agrif_Set_bc(vmsk_id,(/0,0/)) 
    406430 
    407431# if defined key_zdftke 
     
    417441 
    418442   CALL Agrif_Set_Updatetype(scales_t_id, update = AGRIF_Update_Average) 
     443 
    419444   CALL Agrif_Set_Updatetype(un_update_id,update1 = Agrif_Update_Copy, update2 = Agrif_Update_Average) 
    420445   CALL Agrif_Set_Updatetype(vn_update_id,update1 = Agrif_Update_Average, update2 = Agrif_Update_Copy) 
Note: See TracChangeset for help on using the changeset viewer.