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 3432 for branches/2011/DEV_r2739_STFC_dCSE/NEMOGCM/NEMO/OPA_SRC/DOM/domzgr.F90 – NEMO

Ignore:
Timestamp:
2012-07-11T13:22:58+02:00 (12 years ago)
Author:
trackstand2
Message:

Merge branch 'ksection_partition'

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2011/DEV_r2739_STFC_dCSE/NEMOGCM/NEMO/OPA_SRC/DOM/domzgr.F90

    r3226 r3432  
    5454   !                                        ! ( rn_bb=0; top only, rn_bb =1; top and bottom) 
    5555   REAL(wp) ::   rn_hc       =  150._wp     ! Critical depth for s-sigma coordinates 
    56  
     56   PUBLIC rn_sbot_min, rn_sbot_max, rn_theta, rn_thetb, rn_rmax, ln_s_sigma, rn_bb,rn_hc 
    5757   !! * Control permutation of array indices 
    5858#  include "oce_ftrans.h90" 
     
    8282      !!                   ln_zco=T   z-coordinate    
    8383      !!                   ln_zps=T   z-coordinate with partial steps 
    84       !!                   ln_sco=T   s-coordinate  
     84      !!                   ln_zco=T   s-coordinate  
    8585      !! 
    8686      !! ** Action  :   define gdep., e3., mbathy and bathy 
     
    395395         mbathy(:,:) = 0                                   ! set to zero extra halo points 
    396396         bathy (:,:) = 0._wp                               ! (require for mpp case) 
     397#if defined key_mpp_rkpart 
     398         DO jj = nldj, nlcj                                   ! interior values 
     399            DO ji = nldi, nlci 
     400#else 
    397401         DO jj = 1, nlcj                                   ! interior values 
    398402            DO ji = 1, nlci 
     403#endif 
    399404               mbathy(ji,jj) = idta( mig(ji), mjg(jj) ) 
    400405               bathy (ji,jj) = zdta( mig(ji), mjg(jj) ) 
     
    593598      !!              - update bathy : meter bathymetry (in meters) 
    594599      !!---------------------------------------------------------------------- 
    595       USE wrk_nemo, ONLY:   wrk_in_use, wrk_not_released 
    596       USE wrk_nemo, ONLY:   zbathy => wrk_2d_1 
     600      USE mapcomm_mod, ONLY:   trimmed, nidx,eidx,sidx,widx 
     601      USE wrk_nemo,    ONLY:   wrk_in_use, wrk_not_released 
     602      USE wrk_nemo,    ONLY:   zbathy => wrk_2d_1 
    597603      !! 
    598604      INTEGER ::   ji, jj, jl                    ! dummy loop indices 
     
    636642         IF(lwp) WRITE(numout,*)'    ',icompt,' ocean grid points suppressed' 
    637643      ENDIF 
     644 
    638645      IF( lk_mpp ) THEN 
    639646         zbathy(:,:) = FLOAT( mbathy(:,:) ) 
     
    646653         IF(lwp) WRITE(numout,*) ' mbathy set to 0 along east and west boundary: nperio = ', nperio 
    647654         IF( lk_mpp ) THEN 
    648             IF( nbondi == -1 .OR. nbondi == 2 ) THEN 
     655            IF( (nbondi == -1 .OR. nbondi == 2) .AND. (.NOT. trimmed(widx,narea) ) ) THEN 
    649656               IF( jperio /= 1 )   mbathy(1,:) = 0 
    650657            ENDIF 
    651             IF( nbondi == 1 .OR. nbondi == 2 ) THEN 
     658            IF( (nbondi == 1 .OR. nbondi == 2) .AND. (.NOT. trimmed(eidx,narea) ) ) THEN 
    652659               IF( jperio /= 1 )   mbathy(nlci,:) = 0 
    653660            ENDIF 
     
    11881195      USE wrk_nemo, ONLY:   wrk_in_use, wrk_not_released 
    11891196      USE wrk_nemo, ONLY:   zenv => wrk_2d_1 , ztmp => wrk_2d_2 , zmsk  => wrk_2d_3 
    1190       USE wrk_nemo, ONLY:   zri  => wrk_2d_4 , zrj  => wrk_2d_5 , zhbat => wrk_2d_6 
     1197      USE wrk_nemo, ONLY:   ztmp2 => wrk_2d_4 , zhbat => wrk_2d_5 
    11911198      USE wrk_nemo, ONLY:   gsigw3  => wrk_3d_1 
    11921199      USE wrk_nemo, ONLY:   gsigt3  => wrk_3d_2 
     
    11991206      USE wrk_nemo, ONLY:   esigwu3 => wrk_3d_9 
    12001207      USE wrk_nemo, ONLY:   esigwv3 => wrk_3d_10 
     1208      USE mapcomm_mod, ONLY: trimmed, cyclic_bc 
     1209      USE mapcomm_mod, ONLY: nidx, eidx, sidx, widx 
     1210!      USE arpdebugging, ONLY: dump_array 
    12011211      !! DCSE_NEMO: wrk_nemo module variables renamed, need additional directives 
    12021212!FTRANS gsigw3 :I :I :z 
     
    12131223      INTEGER  ::   ji, jj, jk, jl           ! dummy loop argument 
    12141224      INTEGER  ::   iip1, ijp1, iim1, ijm1   ! temporary integers 
    1215       REAL(wp) ::   zcoeft, zcoefw, zrmax, ztaper   ! temporary scalars 
     1225      REAL(wp) ::   zcoeft, zcoefw, zrmax, ztaper, zri, zrj   ! temporary scalars 
     1226      REAL(wp), PARAMETER :: TOL_ZERO = 1.0E-20_wp ! Any value less than this assumed zero 
    12161227      ! 
    12171228 
     
    12191230      !!---------------------------------------------------------------------- 
    12201231 
    1221       IF( wrk_in_use(2, 1,2,3,4,5,6) .OR. wrk_in_use(3, 1,2,3,4,5,6,7,8,9,10) ) THEN 
     1232      IF( wrk_in_use(2, 1,2,3,4,5) .OR. wrk_in_use(3, 1,2,3,4,5,6,7,8,9,10) ) THEN 
    12221233         CALL ctl_stop('zgr_sco: ERROR - requested workspace arrays unavailable')   ;   RETURN 
    12231234      ENDIF 
     
    12691280         END DO 
    12701281      END DO 
     1282 
     1283      CALL lbc_lnk( zenv, 'T', 1._wp, lzero=.FALSE. ) 
    12711284      !  
    12721285      ! Smooth the bathymetry (if required) 
     
    12821295         zrmax = 0._wp 
    12831296         zmsk(:,:) = 0._wp 
     1297 
    12841298         DO jj = 1, nlcj 
    12851299            DO ji = 1, nlci 
    12861300               iip1 = MIN( ji+1, nlci )      ! force zri = 0 on last line (ji=ncli+1 to jpi) 
    1287                ijp1 = MIN( jj+1, nlcj )      ! force zrj = 0 on last raw  (jj=nclj+1 to jpj) 
    1288                zri(ji,jj) = ABS( zenv(iip1,jj  ) - zenv(ji,jj) ) / ( zenv(iip1,jj  ) + zenv(ji,jj) ) 
    1289                zrj(ji,jj) = ABS( zenv(ji  ,ijp1) - zenv(ji,jj) ) / ( zenv(ji  ,ijp1) + zenv(ji,jj) ) 
    1290                zrmax = MAX( zrmax, zri(ji,jj), zrj(ji,jj) ) 
    1291                IF( zri(ji,jj) > rn_rmax )   zmsk(ji  ,jj  ) = 1._wp 
    1292                IF( zri(ji,jj) > rn_rmax )   zmsk(iip1,jj  ) = 1._wp 
    1293                IF( zrj(ji,jj) > rn_rmax )   zmsk(ji  ,jj  ) = 1._wp 
    1294                IF( zrj(ji,jj) > rn_rmax )   zmsk(ji  ,ijp1) = 1._wp 
    1295             END DO 
    1296          END DO 
     1301               ijp1 = MIN( jj+1, nlcj )      ! force zrj = 0 on last row  (jj=nclj+1 to jpj) 
     1302               zri = ABS( zenv(iip1,jj  ) - zenv(ji,jj) ) / ( zenv(iip1,jj  ) + zenv(ji,jj) ) 
     1303               zrj = ABS( zenv(ji  ,ijp1) - zenv(ji,jj) ) / ( zenv(ji  ,ijp1) + zenv(ji,jj) ) 
     1304               zrmax = MAX( zrmax, zri, zrj ) 
     1305               IF( zri > rn_rmax )   zmsk(ji  ,jj  ) = 1._wp 
     1306               IF( zri > rn_rmax )   zmsk(iip1,jj  ) = 1._wp 
     1307               IF( zrj > rn_rmax )   zmsk(ji  ,jj  ) = 1._wp 
     1308               IF( zrj > rn_rmax )   zmsk(ji  ,ijp1) = 1._wp 
     1309            END DO 
     1310         END DO 
     1311 
     1312         ! lateral boundary condition on zmsk: retain any 1's along closed  
     1313         ! boundary (use of lzero flag to lbc_lnk) 
     1314         CALL lbc_lnk( zmsk, 'T', 1._wp, lzero=.FALSE. ) 
     1315 
    12971316         IF( lk_mpp )   CALL mpp_max( zrmax )   ! max over the global domain 
    1298          ! lateral boundary condition on zmsk: keep 1 along closed boundary (use of MAX) 
    1299          ztmp(:,:) = zmsk(:,:)   ;   CALL lbc_lnk( zmsk, 'T', 1._wp ) 
    1300          DO jj = 1, nlcj 
    1301             DO ji = 1, nlci 
    1302                 zmsk(ji,jj) = MAX( zmsk(ji,jj), ztmp(ji,jj) ) 
    1303             END DO 
    1304          END DO 
    13051317         ! 
    1306          IF(lwp)WRITE(numout,*) 'zgr_sco :   iter= ',jl, ' rmax= ', zrmax, ' nb of pt= ', INT( SUM(zmsk(:,:) ) ) 
     1318         IF(lwp)WRITE(numout,"('zgr_sco : iter=',I5,' rmax=',F8.4,' nb of pt= ',I8)") & 
     1319                                                         jl, zrmax, INT( SUM(zmsk(:,:) ) ) 
    13071320         ! 
    1308          DO jj = 1, nlcj 
    1309             DO ji = 1, nlci 
     1321!!$         IF(jl < 6)THEN ! .OR. (MOD(jl,1000) == 0) )THEN 
     1322!!$            CALL dump_array(jl, 'zenv_before', zenv, withHalos=.TRUE.) 
     1323!!$            CALL dump_array(jl, 'ztmp_before', ztmp, withHalos=.TRUE.) 
     1324!!$            CALL dump_array(jl, 'zmsk_before', zmsk, withHalos=.TRUE.) 
     1325!!$         END IF 
     1326 
     1327         ! Copy current surface before next smoothing iteration  
     1328         ztmp(:,:) = zenv(:,:) 
     1329 
     1330         DO jj = nldj, nlcj 
     1331            DO ji = nldi, nlci 
    13101332               iip1 = MIN( ji+1, nlci )     ! last  line (ji=nlci) 
    13111333               ijp1 = MIN( jj+1, nlcj )     ! last  raw  (jj=nlcj) 
     
    13261348         END DO 
    13271349         ! 
    1328          DO jj = 1, nlcj 
    1329             DO ji = 1, nlci 
    1330                IF( zmsk(ji,jj) == 1._wp )   zenv(ji,jj) = MAX( ztmp(ji,jj), bathy(ji,jj) ) 
     1350 
     1351         ! Need to update halos of ztmp here but do not zero halos on closed  
     1352         ! boundaries 
     1353         CALL lbc_lnk( ztmp, 'T', 1._wp, lzero=.FALSE.) 
     1354 
     1355         DO jj = 1,nlcj 
     1356            DO ji = 1,nlci 
     1357               IF( zmsk(ji,jj) >= 1._wp-TOL_ZERO ) zenv(ji,jj) = MAX( ztmp(ji,jj), bathy(ji,jj) ) 
    13311358            END DO 
    13321359         END DO 
    13331360         ! 
    1334          ! Apply lateral boundary condition   CAUTION: kept the value when the lbc field is zero 
    1335          ztmp(:,:) = zenv(:,:)   ;   CALL lbc_lnk( zenv, 'T', 1._wp ) 
    1336          DO jj = 1, nlcj 
    1337             DO ji = 1, nlci 
    1338                IF( zenv(ji,jj) == 0._wp )   zenv(ji,jj) = ztmp(ji,jj) 
    1339             END DO 
    1340          END DO 
     1361         ! Apply lateral boundary condition but do not zero on closed boundaries 
     1362         CALL lbc_lnk( zenv, 'T', 1._wp, lzero=.FALSE. ) 
     1363 
     1364!!$         IF(jl < 6)THEN ! .OR. (MOD(jl,1000) == 0) )THEN 
     1365!!$            CALL dump_array(jl, 'zenv', zenv, withHalos=.TRUE.) 
     1366!!$            CALL dump_array(jl, 'ztmp', ztmp, withHalos=.TRUE.) 
     1367!!$            CALL dump_array(jl, 'zmsk', zmsk, withHalos=.TRUE.) 
     1368!!$         END IF 
     1369 
    13411370         !                                                  ! ================ ! 
    13421371      END DO                                                !     End loop     ! 
     
    13651394         ENDIF 
    13661395      ENDIF 
     1396 
     1397!      CALL dump_array(0, 'hbatt', hbatt, withHalos=.FALSE.) 
    13671398 
    13681399      !                                        ! ============================== 
     
    15761607      ! 
    15771608!!    H. Liu, POL. April 2009. Added for passing the scale check for the new released vvl code. 
     1609      where (e3t   (:,:,:).eq.0.0)  e3t(:,:,:) = 1.0 
     1610      where (e3u   (:,:,:).eq.0.0)  e3u(:,:,:) = 1.0 
     1611      where (e3v   (:,:,:).eq.0.0)  e3v(:,:,:) = 1.0 
     1612      where (e3f   (:,:,:).eq.0.0)  e3f(:,:,:) = 1.0 
     1613      where (e3w   (:,:,:).eq.0.0)  e3w(:,:,:) = 1.0 
     1614      where (e3uw  (:,:,:).eq.0.0)  e3uw(:,:,:) = 1.0 
     1615      where (e3vw  (:,:,:).eq.0.0)  e3vw(:,:,:) = 1.0 
     1616 
    15781617 
    15791618      fsdept(:,:,:) = gdept (:,:,:) 
     
    15971636         END DO 
    15981637      END DO 
     1638 
    15991639      IF( nprint == 1 .AND. lwp ) WRITE(numout,*) ' MIN val mbathy h90 ', MINVAL( mbathy(:,:) ),   & 
    16001640         &                                                       ' MAX ', MAXVAL( mbathy(:,:) ) 
     
    16421682            END DO 
    16431683         END DO 
    1644          DO jj = mj0(74), mj1(74) 
    1645             DO ji = mi0(100), mi1(100) 
    1646                WRITE(numout,*) 
    1647                WRITE(numout,*) ' domzgr: vertical coordinates : point (100,74,k)   bathy = ', bathy(ji,jj), hbatt(ji,jj) 
    1648                WRITE(numout,*) ' ~~~~~~  --------------------' 
    1649                WRITE(numout,"(9x,' level   gdept    gdepw    gde3w     e3t      e3w  ')") 
    1650                WRITE(numout,"(10x,i4,4f9.2)") ( jk, fsdept(ji,jj,jk), fsdepw(ji,jj,jk),     & 
    1651                   &                                 fse3t (ji,jj,jk), fse3w (ji,jj,jk), jk=1,jpk ) 
    1652             END DO 
    1653          END DO 
     1684!!$ ARPDBG - out of bounds if jpj < 74 or jpi < 100, e.g. default GYRE 
     1685!!$         DO jj = mj0(74), mj1(74) 
     1686!!$            DO ji = mi0(100), mi1(100) 
     1687!!$               WRITE(numout,*) 
     1688!!$               WRITE(numout,*) ' domzgr: vertical coordinates : point (100,74,k)   bathy = ', bathy(ji,jj), hbatt(ji,jj) 
     1689!!$               WRITE(numout,*) ' ~~~~~~  --------------------' 
     1690!!$               WRITE(numout,"(9x,' level   gdept    gdepw    gde3w     e3t      e3w  ')") 
     1691!!$               WRITE(numout,"(10x,i4,4f9.2)") ( jk, fsdept(ji,jj,jk), fsdepw(ji,jj,jk),     & 
     1692!!$                  &                                 fse3t (ji,jj,jk), fse3w (ji,jj,jk), jk=1,jpk ) 
     1693!!$            END DO 
     1694!!$         END DO 
    16541695      ENDIF 
    16551696 
     
    16681709                  CALL ctl_stop( ctmp1 ) 
    16691710               ENDIF 
    1670                IF( fsdepw(ji,jj,jk) < 0._wp .OR. fsdept(ji,jj,jk) < 0._wp ) THEN 
     1711               IF( gdepw_1(ji,jj,jk) < 0._wp .OR. gdept_1(ji,jj,jk) < 0._wp ) THEN 
    16711712                  WRITE(ctmp1,*) 'zgr_sco :   gdepw or gdept =< 0  at point (i,j,k)= ', ji, jj, jk 
    16721713                  CALL ctl_stop( ctmp1 ) 
     
    16771718!!gm bug    #endif 
    16781719      ! 
    1679       IF( wrk_not_released(2, 1,2,3,4,5,6) .OR. wrk_not_released(3, 1,2,3,4,5,6,7,8,9,10) )  & 
     1720      IF( wrk_not_released(2, 1,2,3,4,5) .OR. wrk_not_released(3, 1,2,3,4,5,6,7,8,9,10) )  & 
    16801721        &  CALL ctl_stop('dom:zgr_sco: failed to release workspace arrays') 
    16811722      ! 
Note: See TracChangeset for help on using the changeset viewer.