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 4153 for branches/2013/dev_LOCEAN_2013/NEMOGCM/NEMO/OPA_SRC/DOM/domzgr.F90 – NEMO

Ignore:
Timestamp:
2013-11-05T13:25:45+01:00 (10 years ago)
Author:
cetlod
Message:

dev_LOCEAN_2013: merge in trunk changes between r3940 and r4028, see ticket #1169

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2013/dev_LOCEAN_2013/NEMOGCM/NEMO/OPA_SRC/DOM/domzgr.F90

    r4148 r4153  
    11061106      INTEGER  ::   ios                      ! Local integer output status for namelist read 
    11071107      REAL(wp) ::   zrmax, ztaper   ! temporary scalars 
    1108       REAL(wp) ::   zrfact   ! temporary scalars 
    1109       REAL(wp), POINTER, DIMENSION(:,:  ) :: ztmpi1, ztmpi2, ztmpj1, ztmpj2 
    1110  
    1111       ! 
    1112       REAL(wp), POINTER, DIMENSION(:,:  ) :: zenv, zri, zrj, zhbat 
     1108      ! 
     1109      REAL(wp), POINTER, DIMENSION(:,:  ) :: zenv, ztmp, zmsk, zri, zrj, zhbat 
    11131110 
    11141111      NAMELIST/namzgr_sco/ln_s_sh94, ln_s_sf12, ln_sigcrit, rn_sbot_min, rn_sbot_max, rn_hc, rn_rmax,rn_theta, & 
     
    11181115      IF( nn_timing == 1 )  CALL timing_start('zgr_sco') 
    11191116      ! 
    1120       CALL wrk_alloc( jpi, jpj,      ztmpi1, ztmpi2, ztmpj1, ztmpj2         ) 
    1121       CALL wrk_alloc( jpi, jpj,      zenv, zri, zrj, zhbat     ) 
    1122      ! 
     1117      CALL wrk_alloc( jpi, jpj,      zenv, ztmp, zmsk, zri, zrj, zhbat                           ) 
     1118      ! 
    11231119      REWIND( numnam_ref )              ! Namelist namzgr_sco in reference namelist : Sigma-stretching parameters 
    11241120      READ  ( numnam_ref, namzgr_sco, IOSTAT = ios, ERR = 901) 
     
    11731169      !                                        ! ============================= 
    11741170      ! use r-value to create hybrid coordinates 
    1175 !     DO jj = 1, jpj 
    1176 !        DO ji = 1, jpi 
    1177 !           zenv(ji,jj) = MAX( bathy(ji,jj), 0._wp ) 
    1178 !        END DO 
    1179 !     END DO 
    1180 !     CALL lbc_lnk( zenv, 'T', 1._wp ) 
    1181       zenv(:,:) = bathy(:,:) 
     1171      DO jj = 1, jpj 
     1172         DO ji = 1, jpi 
     1173            zenv(ji,jj) = MAX( bathy(ji,jj), rn_sbot_min ) 
     1174         END DO 
     1175      END DO 
    11821176      !  
    11831177      ! Smooth the bathymetry (if required) 
     
    11871181      jl = 0 
    11881182      zrmax = 1._wp 
    1189       !      
    1190       ! set scaling factor used in reducing vertical gradients 
    1191       zrfact = ( 1._wp - rn_rmax ) / ( 1._wp + rn_rmax )  
    1192       ! 
    1193       ! initialise temporary evelope depth arrays 
    1194       ztmpi1(:,:) = zenv(:,:) 
    1195       ztmpi2(:,:) = zenv(:,:) 
    1196       ztmpj1(:,:) = zenv(:,:) 
    1197       ztmpj2(:,:) = zenv(:,:) 
    1198       ! 
    1199       ! initialise temporary r-value arrays 
    1200       zri(:,:) = 1._wp 
    1201       zrj(:,:) = 1._wp 
    1202       !                                                            ! ================ ! 
    1203       DO WHILE( jl <= 10000 .AND. ( zrmax - rn_rmax ) > 1.e-8_wp ) !  Iterative loop  ! 
    1204          !                                                         ! ================ ! 
     1183      !                                                     ! ================ ! 
     1184      DO WHILE( jl <= 10000 .AND. zrmax > rn_rmax )         !  Iterative loop  ! 
     1185         !                                                  ! ================ ! 
    12051186         jl = jl + 1 
    12061187         zrmax = 0._wp 
    1207          ! we set zrmax from previous r-values (zri abd zrj) first 
    1208          ! if set after current r-value calculation (as previously) 
    1209          ! we could exit DO WHILE prematurely before checking r-value 
    1210          ! of current zenv 
    1211          DO jj = 1, nlcj 
    1212             DO ji = 1, nlci 
    1213                zrmax = MAX( zrmax, ABS(zri(ji,jj)), ABS(zrj(ji,jj)) ) 
    1214             END DO 
    1215          END DO 
    1216          zri(:,:) = 0._wp 
    1217          zrj(:,:) = 0._wp 
     1188         zmsk(:,:) = 0._wp 
    12181189         DO jj = 1, nlcj 
    12191190            DO ji = 1, nlci 
    12201191               iip1 = MIN( ji+1, nlci )      ! force zri = 0 on last line (ji=ncli+1 to jpi) 
    12211192               ijp1 = MIN( jj+1, nlcj )      ! force zrj = 0 on last raw  (jj=nclj+1 to jpj) 
    1222                IF( (zenv(ji,jj) > 0._wp) .AND. (zenv(iip1,jj) > 0._wp)) THEN 
    1223                   zri(ji,jj) = ( zenv(iip1,jj  ) - zenv(ji,jj) ) / ( zenv(iip1,jj  ) + zenv(ji,jj) ) 
    1224                END IF 
    1225                IF( (zenv(ji,jj) > 0._wp) .AND. (zenv(ji,ijp1) > 0._wp)) THEN 
    1226                   zrj(ji,jj) = ( zenv(ji  ,ijp1) - zenv(ji,jj) ) / ( zenv(ji  ,ijp1) + zenv(ji,jj) ) 
    1227                END IF 
    1228                IF( zri(ji,jj) >  rn_rmax )   ztmpi1(ji  ,jj  ) = zenv(iip1,jj  ) * zrfact 
    1229                IF( zri(ji,jj) < -rn_rmax )   ztmpi2(iip1,jj  ) = zenv(ji  ,jj  ) * zrfact  
    1230                IF( zrj(ji,jj) >  rn_rmax )   ztmpj1(ji  ,jj  ) = zenv(ji  ,ijp1) * zrfact 
    1231                IF( zrj(ji,jj) < -rn_rmax )   ztmpj2(ji  ,ijp1) = zenv(ji  ,jj  ) * zrfact 
     1193               zri(ji,jj) = ABS( zenv(iip1,jj  ) - zenv(ji,jj) ) / ( zenv(iip1,jj  ) + zenv(ji,jj) ) 
     1194               zrj(ji,jj) = ABS( zenv(ji  ,ijp1) - zenv(ji,jj) ) / ( zenv(ji  ,ijp1) + zenv(ji,jj) ) 
     1195               zrmax = MAX( zrmax, zri(ji,jj), zrj(ji,jj) ) 
     1196               IF( zri(ji,jj) > rn_rmax )   zmsk(ji  ,jj  ) = 1._wp 
     1197               IF( zri(ji,jj) > rn_rmax )   zmsk(iip1,jj  ) = 1._wp 
     1198               IF( zrj(ji,jj) > rn_rmax )   zmsk(ji  ,jj  ) = 1._wp 
     1199               IF( zrj(ji,jj) > rn_rmax )   zmsk(ji  ,ijp1) = 1._wp 
    12321200            END DO 
    12331201         END DO 
    12341202         IF( lk_mpp )   CALL mpp_max( zrmax )   ! max over the global domain 
     1203         ! lateral boundary condition on zmsk: keep 1 along closed boundary (use of MAX) 
     1204         ztmp(:,:) = zmsk(:,:)   ;   CALL lbc_lnk( zmsk, 'T', 1._wp ) 
     1205         DO jj = 1, nlcj 
     1206            DO ji = 1, nlci 
     1207                zmsk(ji,jj) = MAX( zmsk(ji,jj), ztmp(ji,jj) ) 
     1208            END DO 
     1209         END DO 
    12351210         ! 
    1236          IF(lwp)WRITE(numout,*) 'zgr_sco :   iter= ',jl, ' rmax= ', zrmax 
     1211         IF(lwp)WRITE(numout,*) 'zgr_sco :   iter= ',jl, ' rmax= ', zrmax, ' nb of pt= ', INT( SUM(zmsk(:,:) ) ) 
    12371212         ! 
    12381213         DO jj = 1, nlcj 
    12391214            DO ji = 1, nlci 
    1240                zenv(ji,jj) = MAX(zenv(ji,jj), ztmpi1(ji,jj), ztmpi2(ji,jj), ztmpj1(ji,jj), ztmpj2(ji,jj) ) 
     1215               iip1 = MIN( ji+1, nlci )     ! last  line (ji=nlci) 
     1216               ijp1 = MIN( jj+1, nlcj )     ! last  raw  (jj=nlcj) 
     1217               iim1 = MAX( ji-1,  1  )      ! first line (ji=nlci) 
     1218               ijm1 = MAX( jj-1,  1  )      ! first raw  (jj=nlcj) 
     1219               IF( zmsk(ji,jj) == 1._wp ) THEN 
     1220                  ztmp(ji,jj) =   (                                                                                   & 
     1221             &      zenv(iim1,ijp1)*zmsk(iim1,ijp1) + zenv(ji,ijp1)*zmsk(ji,ijp1) + zenv(iip1,ijp1)*zmsk(iip1,ijp1)   & 
     1222             &    + zenv(iim1,jj  )*zmsk(iim1,jj  ) + zenv(ji,jj  )*    2._wp     + zenv(iip1,jj  )*zmsk(iip1,jj  )   & 
     1223             &    + zenv(iim1,ijm1)*zmsk(iim1,ijm1) + zenv(ji,ijm1)*zmsk(ji,ijm1) + zenv(iip1,ijm1)*zmsk(iip1,ijm1)   & 
     1224             &                    ) / (                                                                               & 
     1225             &                      zmsk(iim1,ijp1) +               zmsk(ji,ijp1) +                 zmsk(iip1,ijp1)   & 
     1226             &    +                 zmsk(iim1,jj  ) +                   2._wp     +                 zmsk(iip1,jj  )   & 
     1227             &    +                 zmsk(iim1,ijm1) +               zmsk(ji,ijm1) +                 zmsk(iip1,ijm1)   & 
     1228             &                        ) 
     1229               ENDIF 
    12411230            END DO 
    12421231         END DO 
    12431232         ! 
    1244          CALL lbc_lnk( zenv, 'T', 1._wp ) 
     1233         DO jj = 1, nlcj 
     1234            DO ji = 1, nlci 
     1235               IF( zmsk(ji,jj) == 1._wp )   zenv(ji,jj) = MAX( ztmp(ji,jj), bathy(ji,jj) ) 
     1236            END DO 
     1237         END DO 
     1238         ! 
     1239         ! Apply lateral boundary condition   CAUTION: keep the value when the lbc field is zero 
     1240         ztmp(:,:) = zenv(:,:)   ;   CALL lbc_lnk( zenv, 'T', 1._wp ) 
     1241         DO jj = 1, nlcj 
     1242            DO ji = 1, nlci 
     1243               IF( zenv(ji,jj) == 0._wp )   zenv(ji,jj) = ztmp(ji,jj) 
     1244            END DO 
     1245         END DO 
    12451246         !                                                  ! ================ ! 
    12461247      END DO                                                !     End loop     ! 
    12471248      !                                                     ! ================ ! 
    12481249      ! 
    1249 !     DO jj = 1, jpj 
    1250 !        DO ji = 1, jpi 
    1251 !           zenv(ji,jj) = MAX( zenv(ji,jj), rn_sbot_min ) ! set all points to avoid undefined scale values 
    1252 !        END DO 
    1253 !     END DO 
     1250      ! Fill ghost rows with appropriate values to avoid undefined e3 values with some mpp decompositions 
     1251      DO ji = nlci+1, jpi  
     1252         zenv(ji,1:nlcj) = zenv(nlci,1:nlcj) 
     1253      END DO 
     1254      ! 
     1255      DO jj = nlcj+1, jpj 
     1256         zenv(:,jj) = zenv(:,nlcj) 
     1257      END DO 
    12541258      ! 
    12551259      ! Envelope bathymetry saved in hbatt 
    12561260      hbatt(:,:) = zenv(:,:)  
    1257  
    12581261      IF( MINVAL( gphit(:,:) ) * MAXVAL( gphit(:,:) ) <= 0._wp ) THEN 
    12591262         CALL ctl_warn( ' s-coordinates are tapered in vicinity of the Equator' ) 
    12601263         DO jj = 1, jpj 
    12611264            DO ji = 1, jpi 
    1262                ztaper = EXP( -(gphit(ji,jj)/8._wp)**2 ) 
     1265               ztaper = EXP( -(gphit(ji,jj)/8._wp)**2._wp ) 
    12631266               hbatt(ji,jj) = rn_sbot_max * ztaper + hbatt(ji,jj) * ( 1._wp - ztaper ) 
    12641267            END DO 
     
    13751378      fsde3w(:,:,:) = gdep3w(:,:,:) 
    13761379      ! 
    1377       where (e3t   (:,:,:).eq.0.0)  e3t(:,:,:) = 1.0 
    1378       where (e3u   (:,:,:).eq.0.0)  e3u(:,:,:) = 1.0 
    1379       where (e3v   (:,:,:).eq.0.0)  e3v(:,:,:) = 1.0 
    1380       where (e3f   (:,:,:).eq.0.0)  e3f(:,:,:) = 1.0 
    1381       where (e3w   (:,:,:).eq.0.0)  e3w(:,:,:) = 1.0 
    1382       where (e3uw  (:,:,:).eq.0.0)  e3uw(:,:,:) = 1.0 
    1383       where (e3vw  (:,:,:).eq.0.0)  e3vw(:,:,:) = 1.0 
    1384  
     1380      where (e3t   (:,:,:).eq.0.0)  e3t(:,:,:) = 1._wp 
     1381      where (e3u   (:,:,:).eq.0.0)  e3u(:,:,:) = 1._wp 
     1382      where (e3v   (:,:,:).eq.0.0)  e3v(:,:,:) = 1._wp 
     1383      where (e3f   (:,:,:).eq.0.0)  e3f(:,:,:) = 1._wp 
     1384      where (e3w   (:,:,:).eq.0.0)  e3w(:,:,:) = 1._wp 
     1385      where (e3uw  (:,:,:).eq.0.0)  e3uw(:,:,:) = 1._wp 
     1386      where (e3vw  (:,:,:).eq.0.0)  e3vw(:,:,:) = 1._wp 
     1387 
     1388#if defined key_agrif 
     1389      ! Ensure meaningful vertical scale factors in ghost lines/columns 
     1390      IF( .NOT. Agrif_Root() ) THEN 
     1391         !   
     1392         IF((nbondi == -1).OR.(nbondi == 2)) THEN 
     1393            e3u(1,:,:) = e3u(2,:,:) 
     1394         ENDIF 
     1395         ! 
     1396         IF((nbondi ==  1).OR.(nbondi == 2)) THEN 
     1397            e3u(nlci-1,:,:) = e3u(nlci-2,:,:) 
     1398         ENDIF 
     1399         ! 
     1400         IF((nbondj == -1).OR.(nbondj == 2)) THEN 
     1401            e3v(:,1,:) = e3v(:,2,:) 
     1402         ENDIF 
     1403         ! 
     1404         IF((nbondj ==  1).OR.(nbondj == 2)) THEN 
     1405            e3v(:,nlcj-1,:) = e3v(:,nlcj-2,:) 
     1406         ENDIF 
     1407         ! 
     1408      ENDIF 
     1409#endif 
    13851410 
    13861411      fsdept(:,:,:) = gdept (:,:,:) 
     
    14311456         WRITE(numout,"(10x,i4,4f9.2)") ( jk, fsdept(1,1,jk), fsdepw(1,1,jk),     & 
    14321457            &                                 fse3t (1,1,jk), fse3w (1,1,jk), jk=1,jpk ) 
    1433          DO jj = mj0(20), mj1(20) 
    1434             DO ji = mi0(20), mi1(20) 
     1458         iip1 = MIN(20, jpiglo-1)  ! for config with i smaller than 20 points 
     1459         ijp1 = MIN(20, jpjglo-1)  ! for config with j smaller than 20 points 
     1460         DO jj = mj0(ijp1), mj1(ijp1) 
     1461            DO ji = mi0(iip1), mi1(iip1) 
    14351462               WRITE(numout,*) 
    1436                WRITE(numout,*) ' domzgr: vertical coordinates : point (20,20,k)   bathy = ', bathy(ji,jj), hbatt(ji,jj) 
     1463               WRITE(numout,*) ' domzgr: vertical coordinates : point (',iip1,',',ijp1,',k)   bathy = ',  & 
     1464                  &                                              bathy(ji,jj), hbatt(ji,jj) 
    14371465               WRITE(numout,*) ' ~~~~~~  --------------------' 
    14381466               WRITE(numout,"(9x,' level   gdept    gdepw    gde3w     e3t      e3w  ')") 
     
    14411469            END DO 
    14421470         END DO 
    1443          DO jj = mj0(74), mj1(74) 
    1444             DO ji = mi0(100), mi1(100) 
     1471         iip1 = MIN(  74, jpiglo-1) 
     1472         ijp1 = MIN( 100, jpjglo-1) 
     1473         DO jj = mj0(ijp1), mj1(ijp1) 
     1474            DO ji = mi0(iip1), mi1(iip1) 
    14451475               WRITE(numout,*) 
    1446                WRITE(numout,*) ' domzgr: vertical coordinates : point (100,74,k)   bathy = ', bathy(ji,jj), hbatt(ji,jj) 
     1476               WRITE(numout,*) ' domzgr: vertical coordinates : point (',iip1,',',ijp1,',k)   bathy = ',  & 
     1477                  &                                              bathy(ji,jj), hbatt(ji,jj) 
    14471478               WRITE(numout,*) ' ~~~~~~  --------------------' 
    14481479               WRITE(numout,"(9x,' level   gdept    gdepw    gde3w     e3t      e3w  ')") 
     
    15011532      END DO 
    15021533      ! 
    1503       CALL wrk_dealloc( jpi, jpj,      zenv, ztmpi1, ztmpi2, ztmpj1, ztmpj2, zri, zrj, zhbat                           )      ! 
     1534      CALL wrk_dealloc( jpi, jpj,      zenv, ztmp, zmsk, zri, zrj, zhbat                           ) 
     1535      ! 
    15041536      IF( nn_timing == 1 )  CALL timing_stop('zgr_sco') 
    15051537      ! 
     
    17301762      ENDDO 
    17311763      ! 
    1732       CALL lbc_lnk(e3t ,'T',1.) ; CALL lbc_lnk(e3u ,'T',1.) 
    1733       CALL lbc_lnk(e3v ,'T',1.) ; CALL lbc_lnk(e3f ,'T',1.) 
    1734       CALL lbc_lnk(e3w ,'T',1.) 
    1735       CALL lbc_lnk(e3uw,'T',1.) ; CALL lbc_lnk(e3vw,'T',1.) 
    1736       ! 
    17371764      !                                               ! ============= 
    17381765 
     
    18311858      !!---------------------------------------------------------------------- 
    18321859      ! 
    1833       pf =   (   TANH( rn_theta * ( -(pk-0.5_wp) / REAL(jpkm1) + rn_thetb )  )   & 
     1860      pf =   (   TANH( rn_theta * ( -(pk-0.5_wp) / REAL(jpkm1,wp) + rn_thetb )  )   & 
    18341861         &     - TANH( rn_thetb * rn_theta                                )  )   & 
    18351862         & * (   COSH( rn_theta                           )                      & 
     
    18571884      ! 
    18581885      IF ( rn_theta == 0 ) then      ! uniform sigma 
    1859          pf1 = - ( pk1 - 0.5_wp ) / REAL( jpkm1 ) 
     1886         pf1 = - ( pk1 - 0.5_wp ) / REAL( jpkm1,wp ) 
    18601887      ELSE                        ! stretched sigma 
    1861          pf1 =   ( 1._wp - pbb ) * ( SINH( rn_theta*(-(pk1-0.5_wp)/REAL(jpkm1)) ) ) / SINH( rn_theta )              & 
    1862             &  + pbb * (  (TANH( rn_theta*( (-(pk1-0.5_wp)/REAL(jpkm1)) + 0.5_wp) ) - TANH( 0.5_wp * rn_theta )  )  & 
     1888         pf1 =   ( 1._wp - pbb ) * ( SINH( rn_theta*(-(pk1-0.5_wp)/REAL(jpkm1,wp)) ) ) / SINH( rn_theta )              & 
     1889            &  + pbb * (  (TANH( rn_theta*( (-(pk1-0.5_wp)/REAL(jpkm1,wp)) + 0.5_wp) ) - TANH( 0.5_wp * rn_theta )  )  & 
    18631890            &        / ( 2._wp * TANH( 0.5_wp * rn_theta ) )  ) 
    18641891      ENDIF 
Note: See TracChangeset for help on using the changeset viewer.