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 1601 for trunk/NEMO/OPA_SRC/DOM/domzgr.F90 – NEMO

Ignore:
Timestamp:
2009-08-11T12:09:19+02:00 (15 years ago)
Author:
ctlod
Message:

Doctor naming of OPA namelist variables , see ticket: #526

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/NEMO/OPA_SRC/DOM/domzgr.F90

    r1577 r1601  
    4242 
    4343!!gm   DOCTOR name for the namelist parameter... 
    44    !                                 !!! ** Namelist nam_zgr_sco ** 
    45    REAL(wp) ::   sbot_min =  300.     ! minimum depth of s-bottom surface (>0) (m) 
    46    REAL(wp) ::   sbot_max = 5250.     ! maximum depth of s-bottom surface (= ocean depth) (>0) (m) 
    47    REAL(wp) ::   theta    =    6.0    ! surface control parameter (0<=theta<=20) 
    48    REAL(wp) ::   thetb    =    0.75   ! bottom control parameter  (0<=thetb<= 1) 
    49    REAL(wp) ::   r_max    =    0.15   ! maximum cut-off r-value allowed (0<r_max<1) 
     44   !                                    !!! ** Namelist namzgr_sco ** 
     45   REAL(wp) ::   rn_sbot_min =  300.     ! minimum depth of s-bottom surface (>0) (m) 
     46   REAL(wp) ::   rn_sbot_max = 5250.     ! maximum depth of s-bottom surface (= ocean depth) (>0) (m) 
     47   REAL(wp) ::   rn_theta    =    6.0    ! surface control parameter (0<=rn_theta<=20) 
     48   REAL(wp) ::   rn_thetb    =    0.75   ! bottom control parameter  (0<=rn_thetb<= 1) 
     49   REAL(wp) ::   rn_rmax     =    0.15   ! maximum cut-off r-value allowed (0<rn_rmax<1) 
     50   LOGICAL  ::   ln_s_sigma  = .false.   ! use hybrid s-sigma -coordinate & stretching function fssig1 (ln_sco=T) 
     51   REAL(wp) ::   rn_bb       =    0.8    ! stretching parameter for song and haidvogel stretching 
     52   !                                     ! ( rn_bb=0; top only, rn_bb =1; top and bottom) 
     53   REAL(wp) ::   rn_hc       = 150.      ! Critical depth for s-sigma coordinates 
    5054  
    5155   !! * Substitutions 
     
    7983      INTEGER ::   ioptio = 0   ! temporary integer 
    8084      !! 
    81       NAMELIST/nam_zgr/ ln_zco, ln_zps, ln_sco 
    82       !!---------------------------------------------------------------------- 
    83  
    84       REWIND ( numnam )                ! Read Namelist nam_zgr : vertical coordinate' 
    85       READ   ( numnam, nam_zgr ) 
     85      NAMELIST/namzgr/ ln_zco, ln_zps, ln_sco 
     86      !!---------------------------------------------------------------------- 
     87 
     88      REWIND ( numnam )                ! Read Namelist namzgr : vertical coordinate' 
     89      READ   ( numnam, namzgr ) 
    8690 
    8791      IF(lwp) THEN                     ! Control print 
     
    8993         WRITE(numout,*) 'dom_zgr : vertical coordinate' 
    9094         WRITE(numout,*) '~~~~~~~' 
    91          WRITE(numout,*) '          Namelist nam_zgr : set vertical coordinate' 
     95         WRITE(numout,*) '          Namelist namzgr : set vertical coordinate' 
    9296         WRITE(numout,*) '             z-coordinate - full steps      ln_zco = ', ln_zco 
    9397         WRITE(numout,*) '             z-coordinate - partial steps   ln_zps = ', ln_zps 
     
    232236      ENDIF 
    233237 
     238!!gm BUG in s-coordinate this does not work! 
    234239      ! deepest/shallowest W level Above/Bellow ~10m 
    235240      zrefdep = 10. - ( 0.1*MINVAL(e3w_0) )                          ! ref. depth with tolerance (10% of minimum layer thickness) 
    236241      nlb10 = MINLOC( gdepw_0, mask = gdepw_0 > zrefdep, dim = 1 )   ! shallowest W level Bellow ~10m 
    237242      nla10 = nlb10 - 1                                              ! deepest    W level Above  ~10m 
     243!!gm end bug 
    238244 
    239245      IF(lwp) THEN                        ! control print 
     
    10011007      !!---------------------------------------------------------------------- 
    10021008      ! 
    1003       pf =   (   TANH( theta * ( -(pk-0.5) / REAL(jpkm1) + thetb )  )      & 
    1004          &     - TANH( thetb * theta                                )  )   & 
    1005          & * (   COSH( theta                           )                   & 
    1006          &     + COSH( theta * ( 2.e0 * thetb - 1.e0 ) )  )                & 
    1007          & / ( 2.e0 * SINH( theta ) ) 
     1009      pf =   (   TANH( rn_theta * ( -(pk-0.5) / REAL(jpkm1) + rn_thetb )  )      & 
     1010         &     - TANH( rn_thetb * rn_theta                                )  )   & 
     1011         & * (   COSH( rn_theta                           )                   & 
     1012         &     + COSH( rn_theta * ( 2.e0 * rn_thetb - 1.e0 ) )  )                & 
     1013         & / ( 2.e0 * SINH( rn_theta ) ) 
    10081014      ! 
    10091015   END FUNCTION fssig 
    10101016 
    10111017 
    1012    FUNCTION fssig1( pk1, bb ) RESULT( pf1 ) 
     1018   FUNCTION fssig1( pk1, pbb ) RESULT( pf1 ) 
    10131019      !!---------------------------------------------------------------------- 
    10141020      !!                 ***  ROUTINE eos_init  *** 
     
    10241030      !!---------------------------------------------------------------------- 
    10251031      REAL(wp), INTENT(in   ) ::   pk1   ! continuous "k" coordinate 
    1026       REAL(wp), INTENT(in   ) ::   bb    ! Stretching coefficient 
     1032      REAL(wp), INTENT(in   ) ::   pbb   ! Stretching coefficient 
    10271033      REAL(wp)                ::   pf1   ! sigma value 
    10281034      !!---------------------------------------------------------------------- 
    10291035      ! 
    1030       IF ( theta == 0 ) then      ! uniform sigma 
     1036      IF ( rn_theta == 0 ) then      ! uniform sigma 
    10311037         pf1 = -(pk1-0.5) / REAL( jpkm1 ) 
    10321038      ELSE                        ! stretched sigma 
    1033          pf1 =   (1.0-bb) * (sinh( theta*(-(pk1-0.5)/REAL(jpkm1)) ) ) / sinh(theta) + & 
    1034             &    bb * ( (tanh( theta*( (-(pk1-0.5)/REAL(jpkm1)) + 0.5) ) - tanh(0.5*theta) ) / & 
    1035             &    (2*tanh(0.5*theta) ) ) 
     1039         pf1 =   (1.0-pbb) * (sinh( rn_theta*(-(pk1-0.5)/REAL(jpkm1)) ) ) / sinh(rn_theta) + & 
     1040            &    pbb * ( (tanh( rn_theta*( (-(pk1-0.5)/REAL(jpkm1)) + 0.5) ) - tanh(0.5*rn_theta) ) / & 
     1041            &    (2*tanh(0.5*rn_theta) ) ) 
    10361042      ENDIF 
    10371043      ! 
     
    10771083      REAL(wp), DIMENSION(jpi,jpj) ::   zri , zrj , zhbat   !  -     - 
    10781084      !! 
    1079       LOGICAL  :: ln_s_sigma = .false. !use hybrid s_sigma coordinates & stretching function fssig1,used with ln_sco = .true. 
    1080       REAL(wp) :: bb = 0.8   ! stretching parameter for song and haidvogel stretching, bb=0; top only, bb =1; top and bottom 
    1081       REAL(wp) :: hc = 150   ! Critical depth for s-sigma coordinates 
    10821085!!gm never do that !!!!   ==> Pb at compilation phase on several computer 
    10831086      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   gsigw3 = 0.0d0 
     
    10931096!!gm end 
    10941097      !! 
    1095       NAMELIST/nam_zgr_sco/ sbot_max, sbot_min, theta, thetb, r_max, ln_s_sigma, bb, hc 
    1096       !!---------------------------------------------------------------------- 
    1097  
    1098       REWIND( numnam )                        ! Read Namelist nam_zgr_sco : sigma-stretching parameters 
    1099       READ  ( numnam, nam_zgr_sco ) 
     1098      NAMELIST/namzgr_sco/ rn_sbot_max, rn_sbot_min, rn_theta, rn_thetb, rn_rmax, ln_s_sigma, rn_bb, rn_hc 
     1099      !!---------------------------------------------------------------------- 
     1100 
     1101      REWIND( numnam )                        ! Read Namelist namzgr_sco : sigma-stretching parameters 
     1102      READ  ( numnam, namzgr_sco ) 
    11001103 
    11011104      IF(lwp) THEN                            ! control print 
     
    11031106         WRITE(numout,*) 'dom:zgr_sco : s-coordinate or hybrid z-s-coordinate' 
    11041107         WRITE(numout,*) '~~~~~~~~~~~' 
    1105          WRITE(numout,*) '         Namelist nam_zgr_sco' 
    1106          WRITE(numout,*) '            sigma-stretching coeffs ' 
    1107          WRITE(numout,*) '            maximum depth of s-bottom surface (>0)    sbot_max   = ' ,sbot_max 
    1108          WRITE(numout,*) '            minimum depth of s-bottom surface (>0)    sbot_min   = ' ,sbot_min 
    1109          WRITE(numout,*) '            surface control parameter (0<=theta<=20)  theta      = ', theta 
    1110          WRITE(numout,*) '            bottom control parameter  (0<=thetb<= 1)  thetb      = ', thetb 
    1111          WRITE(numout,*) '            maximum cut-off r-value allowed           r_max      = ' , r_max 
    1112          WRITE(numout,*) '            Critical depth                            hc         = ', hc 
    1113          WRITE(numout,*) '            Hybrid s-sigma-coordinate                 ln_s_sigma = ', ln_s_sigma 
    1114       ENDIF 
    1115  
    1116       hift(:,:) = sbot_min                     ! set the minimum depth for the s-coordinate 
    1117       hifu(:,:) = sbot_min 
    1118       hifv(:,:) = sbot_min 
    1119       hiff(:,:) = sbot_min 
     1108         WRITE(numout,*) '   Namelist namzgr_sco' 
     1109         WRITE(numout,*) '      sigma-stretching coeffs ' 
     1110         WRITE(numout,*) '      maximum depth of s-bottom surface (>0)       rn_sbot_max   = ' ,rn_sbot_max 
     1111         WRITE(numout,*) '      minimum depth of s-bottom surface (>0)       rn_sbot_min   = ' ,rn_sbot_min 
     1112         WRITE(numout,*) '      surface control parameter (0<=rn_theta<=20)  rn_theta      = ', rn_theta 
     1113         WRITE(numout,*) '      bottom  control parameter (0<=rn_thetb<= 1)  rn_thetb      = ', rn_thetb 
     1114         WRITE(numout,*) '      maximum cut-off r-value allowed              rn_rmax       = ', rn_rmax 
     1115         WRITE(numout,*) '      Hybrid s-sigma-coordinate                    ln_s_sigma    = ', ln_s_sigma 
     1116         WRITE(numout,*) '      stretching parameter (song and haidvogel)    rn_bb         = ', rn_bb 
     1117         WRITE(numout,*) '      Critical depth                               rn_hc         = ', rn_hc 
     1118      ENDIF 
     1119 
     1120      hift(:,:) = rn_sbot_min                     ! set the minimum depth for the s-coordinate 
     1121      hifu(:,:) = rn_sbot_min 
     1122      hifv(:,:) = rn_sbot_min 
     1123      hiff(:,:) = rn_sbot_min 
    11201124 
    11211125      !                                        ! set maximum ocean depth 
    1122       bathy(:,:) = MIN( sbot_max, bathy(:,:) ) 
     1126      bathy(:,:) = MIN( rn_sbot_max, bathy(:,:) ) 
    11231127 
    11241128      DO jj = 1, jpj 
    11251129         DO ji = 1, jpi 
    11261130           IF (bathy(ji,jj) .gt. 0.0) THEN 
    1127               bathy(ji,jj) = MAX( sbot_min, bathy(ji,jj) ) 
     1131              bathy(ji,jj) = MAX( rn_sbot_min, bathy(ji,jj) ) 
    11281132           ENDIF 
    11291133         END DO 
     
    11391143      DO jj = 1, jpj 
    11401144         DO ji = 1, jpi 
    1141             zenv(ji,jj) = MAX( bathy(ji,jj), sbot_min ) 
     1145            zenv(ji,jj) = MAX( bathy(ji,jj), rn_sbot_min ) 
    11421146         END DO 
    11431147      END DO 
     
    11451149      zrmax = 1.e0 
    11461150      !                                                     ! ================ ! 
    1147       DO WHILE ( jl <= 10000 .AND. zrmax > r_max )          !  Iterative loop  ! 
     1151      DO WHILE ( jl <= 10000 .AND. zrmax > rn_rmax )          !  Iterative loop  ! 
    11481152         !                                                  ! ================ ! 
    11491153         jl = jl + 1 
     
    11571161               zrj(ji,jj) = ABS( zenv(ji  ,ijp1) - zenv(ji,jj) ) / ( zenv(ji  ,ijp1) + zenv(ji,jj) ) 
    11581162               zrmax = MAX( zrmax, zri(ji,jj), zrj(ji,jj) ) 
    1159                IF( zri(ji,jj) > r_max )   zmsk(ji  ,jj  ) = 1.0 
    1160                IF( zri(ji,jj) > r_max )   zmsk(iip1,jj  ) = 1.0 
    1161                IF( zrj(ji,jj) > r_max )   zmsk(ji  ,jj  ) = 1.0 
    1162                IF( zrj(ji,jj) > r_max )   zmsk(ji  ,ijp1) = 1.0 
     1163               IF( zri(ji,jj) > rn_rmax )   zmsk(ji  ,jj  ) = 1.0 
     1164               IF( zri(ji,jj) > rn_rmax )   zmsk(iip1,jj  ) = 1.0 
     1165               IF( zrj(ji,jj) > rn_rmax )   zmsk(ji  ,jj  ) = 1.0 
     1166               IF( zrj(ji,jj) > rn_rmax )   zmsk(ji  ,ijp1) = 1.0 
    11631167            END DO 
    11641168         END DO 
     
    12181222            DO ji = 1, jpi 
    12191223               ztaper = EXP( -(gphit(ji,jj)/8)**2 ) 
    1220                hbatt(ji,jj) = sbot_max * ztaper + hbatt(ji,jj) * (1.-ztaper) 
     1224               hbatt(ji,jj) = rn_sbot_max * ztaper + hbatt(ji,jj) * (1.-ztaper) 
    12211225            END DO 
    12221226         END DO 
     
    12391243      IF(lwp) THEN 
    12401244         WRITE(numout,*) 
    1241          WRITE(numout,*) ' zgr_sco: minimum depth of the envelop topography set to : ', sbot_min 
    1242       ENDIF 
    1243       hbatu(:,:) = sbot_min 
    1244       hbatv(:,:) = sbot_min 
    1245       hbatf(:,:) = sbot_min 
     1245         WRITE(numout,*) ' zgr_sco: minimum depth of the envelop topography set to : ', rn_sbot_min 
     1246      ENDIF 
     1247      hbatu(:,:) = rn_sbot_min 
     1248      hbatv(:,:) = rn_sbot_min 
     1249      hbatf(:,:) = rn_sbot_min 
    12461250      DO jj = 1, jpjm1 
    12471251        DO ji = 1, jpim1 
     
    12591263         DO ji = 1, jpi 
    12601264            IF( hbatu(ji,jj) == 0.e0 ) THEN 
    1261                IF( zhbat(ji,jj) == 0.e0 )   hbatu(ji,jj) = sbot_min 
     1265               IF( zhbat(ji,jj) == 0.e0 )   hbatu(ji,jj) = rn_sbot_min 
    12621266               IF( zhbat(ji,jj) /= 0.e0 )   hbatu(ji,jj) = zhbat(ji,jj) 
    12631267            ENDIF 
     
    12681272         DO ji = 1, jpi 
    12691273            IF( hbatv(ji,jj) == 0.e0 ) THEN 
    1270                IF( zhbat(ji,jj) == 0.e0 )   hbatv(ji,jj) = sbot_min 
     1274               IF( zhbat(ji,jj) == 0.e0 )   hbatv(ji,jj) = rn_sbot_min 
    12711275               IF( zhbat(ji,jj) /= 0.e0 )   hbatv(ji,jj) = zhbat(ji,jj) 
    12721276            ENDIF 
     
    12771281         DO ji = 1, jpi 
    12781282            IF( hbatf(ji,jj) == 0.e0 ) THEN 
    1279                IF( zhbat(ji,jj) == 0.e0 )   hbatf(ji,jj) = sbot_min 
     1283               IF( zhbat(ji,jj) == 0.e0 )   hbatf(ji,jj) = rn_sbot_min 
    12801284               IF( zhbat(ji,jj) /= 0.e0 )   hbatf(ji,jj) = zhbat(ji,jj) 
    12811285            ENDIF 
     
    13071311      ! non-dimensional "sigma" for model level depth at w- and t-levels 
    13081312 
    1309       IF ( ln_s_sigma ) THEN  !Song and Haidvogel style stretched sigma for depths below hc, with uniform sigma in shallower waters 
    1310  
    1311          DO ji=1,jpi 
    1312            DO jj=1,jpj 
    1313  
    1314              IF (hbatt(ji,jj).GT.hc) THEN !deep water, stretched sigma 
     1313      IF( ln_s_sigma ) THEN        ! Song and Haidvogel style stretched sigma for depths 
     1314         !                         ! below rn_hc, with uniform sigma in shallower waters 
     1315         DO ji = 1, jpi 
     1316            DO jj = 1, jpj 
     1317 
     1318             IF (hbatt(ji,jj).GT.rn_hc) THEN !deep water, stretched sigma 
    13151319               DO jk = 1, jpk 
    1316                   gsigw3(ji,jj,jk) = -fssig1( REAL(jk,wp)-0.5_wp, bb ) 
    1317                   gsigt3(ji,jj,jk) = -fssig1( REAL(jk,wp)       , bb ) 
     1320                  gsigw3(ji,jj,jk) = -fssig1( REAL(jk,wp)-0.5_wp, rn_bb ) 
     1321                  gsigt3(ji,jj,jk) = -fssig1( REAL(jk,wp)       , rn_bb ) 
    13181322               END DO 
    13191323             ELSE ! shallow water, uniform sigma 
     
    13421346                zcoeft = ( REAL(jk,wp) - 0.5 ) / REAL(jpkm1,wp) 
    13431347                zcoefw = ( REAL(jk,wp) - 1.0 ) / REAL(jpkm1,wp) 
    1344                 gdept (ji,jj,jk) = (scosrf(ji,jj)+(hbatt(ji,jj)-hc)*gsigt3(ji,jj,jk)+hc*zcoeft) 
    1345                 gdepw (ji,jj,jk) = (scosrf(ji,jj)+(hbatt(ji,jj)-hc)*gsigw3(ji,jj,jk)+hc*zcoefw) 
    1346                 gdep3w(ji,jj,jk) = (scosrf(ji,jj)+(hbatt(ji,jj)-hc)*gsi3w3(ji,jj,jk)+hc*zcoefw) 
     1348                gdept (ji,jj,jk) = (scosrf(ji,jj)+(hbatt(ji,jj)-rn_hc)*gsigt3(ji,jj,jk)+rn_hc*zcoeft) 
     1349                gdepw (ji,jj,jk) = (scosrf(ji,jj)+(hbatt(ji,jj)-rn_hc)*gsigw3(ji,jj,jk)+rn_hc*zcoefw) 
     1350                gdep3w(ji,jj,jk) = (scosrf(ji,jj)+(hbatt(ji,jj)-rn_hc)*gsi3w3(ji,jj,jk)+rn_hc*zcoefw) 
    13471351             END DO 
    13481352 
     
    13671371                                   ( hbatt(ji,jj)+hbatt(ji,jj+1) ) 
    13681372 
    1369                 e3t(ji,jj,jk)=((hbatt(ji,jj)-hc)*esigt3(ji,jj,jk) + hc/FLOAT(jpkm1)) 
    1370                 e3u(ji,jj,jk)=((hbatu(ji,jj)-hc)*esigtu3(ji,jj,jk) + hc/FLOAT(jpkm1)) 
    1371                 e3v(ji,jj,jk)=((hbatv(ji,jj)-hc)*esigtv3(ji,jj,jk) + hc/FLOAT(jpkm1)) 
    1372                 e3f(ji,jj,jk)=((hbatf(ji,jj)-hc)*esigtf3(ji,jj,jk) + hc/FLOAT(jpkm1)) 
     1373                e3t(ji,jj,jk)=((hbatt(ji,jj)-rn_hc)*esigt3(ji,jj,jk) + rn_hc/FLOAT(jpkm1)) 
     1374                e3u(ji,jj,jk)=((hbatu(ji,jj)-rn_hc)*esigtu3(ji,jj,jk) + rn_hc/FLOAT(jpkm1)) 
     1375                e3v(ji,jj,jk)=((hbatv(ji,jj)-rn_hc)*esigtv3(ji,jj,jk) + rn_hc/FLOAT(jpkm1)) 
     1376                e3f(ji,jj,jk)=((hbatf(ji,jj)-rn_hc)*esigtf3(ji,jj,jk) + rn_hc/FLOAT(jpkm1)) 
    13731377                ! 
    1374                 e3w (ji,jj,jk)=((hbatt(ji,jj)-hc)*esigw3(ji,jj,jk) + hc/FLOAT(jpkm1)) 
    1375                 e3uw(ji,jj,jk)=((hbatu(ji,jj)-hc)*esigwu3(ji,jj,jk) + hc/FLOAT(jpkm1)) 
    1376                 e3vw(ji,jj,jk)=((hbatv(ji,jj)-hc)*esigwv3(ji,jj,jk) + hc/FLOAT(jpkm1)) 
     1378                e3w (ji,jj,jk)=((hbatt(ji,jj)-rn_hc)*esigw3(ji,jj,jk) + rn_hc/FLOAT(jpkm1)) 
     1379                e3uw(ji,jj,jk)=((hbatu(ji,jj)-rn_hc)*esigwu3(ji,jj,jk) + rn_hc/FLOAT(jpkm1)) 
     1380                e3vw(ji,jj,jk)=((hbatv(ji,jj)-rn_hc)*esigwv3(ji,jj,jk) + rn_hc/FLOAT(jpkm1)) 
    13771381             END DO 
    13781382 
Note: See TracChangeset for help on using the changeset viewer.