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 4245 for branches/2013/dev_LOCEAN_CMCC_INGV_MERC_UKMO_2013/NEMOGCM/NEMO/OPA_SRC/DOM – NEMO

Ignore:
Timestamp:
2013-11-19T12:19:21+01:00 (10 years ago)
Author:
cetlod
Message:

dev_locean_cmcc_ingv_ukmo_merc : merge in the MERC_UKMO dev branch with trunk rev 4119

Location:
branches/2013/dev_LOCEAN_CMCC_INGV_MERC_UKMO_2013/NEMOGCM/NEMO/OPA_SRC/DOM
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • branches/2013/dev_LOCEAN_CMCC_INGV_MERC_UKMO_2013/NEMOGCM/NEMO/OPA_SRC/DOM/domain.F90

    r4152 r4245  
    125125         &             nn_it000, nn_itend  , nn_date0    , nn_leapy     , nn_istate , nn_stock ,   & 
    126126         &             nn_write, ln_dimgnnn, ln_mskland  , ln_clobber   , nn_chunksz 
    127       NAMELIST/namdom/ nn_bathy , rn_e3zps_min, rn_e3zps_rat, nn_msh    , rn_hmin,   & 
    128          &             nn_acc   , rn_atfp     , rn_rdt      , rn_rdtmin ,            & 
     127      NAMELIST/namdom/ nn_bathy, rn_bathy , rn_e3zps_min, rn_e3zps_rat, nn_msh, rn_hmin,   & 
     128         &             nn_acc   , rn_atfp     , rn_rdt      , rn_rdtmin ,                  & 
    129129         &             rn_rdtmax, rn_rdth     , nn_baro     , nn_closea , ln_crs,    & 
    130130         &             jphgr_msh, & 
     
    228228         WRITE(numout,*) '   Namelist namdom : space & time domain' 
    229229         WRITE(numout,*) '      flag read/compute bathymetry      nn_bathy     = ', nn_bathy 
     230         WRITE(numout,*) '      Depth (if =0 bathy=jpkm1)         rn_bathy     = ', rn_bathy 
    230231         WRITE(numout,*) '      min depth of the ocean    (>0) or    rn_hmin   = ', rn_hmin 
    231232         WRITE(numout,*) '      min number of ocean level (<0)       ' 
  • branches/2013/dev_LOCEAN_CMCC_INGV_MERC_UKMO_2013/NEMOGCM/NEMO/OPA_SRC/DOM/domcfg.F90

    r4147 r4245  
    1616   USE lib_mpp         ! distributed memory computing library 
    1717   USE timing          ! Timing 
     18   USE c1d             ! 1D configuration 
     19   USE domc1d          ! 1D configuration: column location 
    1820 
    1921   IMPLICIT NONE 
     
    7981      INTEGER ::   ji, jj   ! dummy loop argument 
    8082      !!---------------------------------------------------------------------- 
     83      !                              ! recalculate jpizoom/jpjzoom given lat/lon 
     84      IF( lk_c1d )  CALL dom_c1d( rn_lat1d, rn_lon1d ) 
     85      ! 
    8186      !                        ! ============== ! 
    8287      !                        !  Local domain  !  
  • branches/2013/dev_LOCEAN_CMCC_INGV_MERC_UKMO_2013/NEMOGCM/NEMO/OPA_SRC/DOM/domzgr.F90

    r4153 r4245  
    374374            IF(lwp) WRITE(numout,*) 
    375375            IF(lwp) WRITE(numout,*) '         bathymetry field: flat basin' 
    376             idta(:,:) = jpkm1                            ! before last level 
    377             zdta(:,:) = gdepw_0(jpk)                     ! last w-point depth 
    378             h_oce     = gdepw_0(jpk) 
     376            IF( rn_bathy > 0.01 ) THEN  
     377               IF(lwp) WRITE(numout,*) '         Depth = rn_bathy read in namelist' 
     378               zdta(:,:) = rn_bathy 
     379               IF( ln_sco ) THEN                                   ! s-coordinate (zsc       ): idta()=jpk 
     380                  idta(:,:) = jpkm1 
     381               ELSE                                                ! z-coordinate (zco or zps): step-like topography 
     382                  idta(:,:) = jpkm1 
     383                  DO jk = 1, jpkm1 
     384                     WHERE( gdept_0(jk) < zdta(:,:) .AND. zdta(:,:) <= gdept_0(jk+1) )   idta(:,:) = jk 
     385                  END DO 
     386               ENDIF 
     387            ELSE 
     388               IF(lwp) WRITE(numout,*) '         Depth = depthw(jpkm1)' 
     389               idta(:,:) = jpkm1                            ! before last level 
     390               zdta(:,:) = gdepw_0(jpk)                     ! last w-point depth 
     391               h_oce     = gdepw_0(jpk) 
     392            ENDIF 
    379393         ELSE                                         ! bump centered in the basin 
    380394            IF(lwp) WRITE(numout,*) 
     
    11061120      INTEGER  ::   ios                      ! Local integer output status for namelist read 
    11071121      REAL(wp) ::   zrmax, ztaper   ! temporary scalars 
    1108       ! 
     1122      REAL(wp) ::   zrfact 
     1123      ! 
     1124      REAL(wp), POINTER, DIMENSION(:,:  ) :: ztmpi1, ztmpi2, ztmpj1, ztmpj2 
    11091125      REAL(wp), POINTER, DIMENSION(:,:  ) :: zenv, ztmp, zmsk, zri, zrj, zhbat 
    11101126 
     
    11151131      IF( nn_timing == 1 )  CALL timing_start('zgr_sco') 
    11161132      ! 
    1117       CALL wrk_alloc( jpi, jpj,      zenv, ztmp, zmsk, zri, zrj, zhbat                          ) 
     1133      CALL wrk_alloc( jpi, jpj, zenv, ztmp, zmsk, zri, zrj, zhbat , ztmpi1, ztmpi2, ztmpj1, ztmpj2 ) 
    11181134      ! 
    11191135      REWIND( numnam_ref )              ! Namelist namzgr_sco in reference namelist : Sigma-stretching parameters 
     
    11691185      !                                        ! ============================= 
    11701186      ! use r-value to create hybrid coordinates 
     1187      zenv(:,:) = bathy(:,:) 
     1188      ! 
     1189      ! set first land point adjacent to a wet cell to sbot_min as this needs to be included in smoothing 
    11711190      DO jj = 1, jpj 
    11721191         DO ji = 1, jpi 
    1173             zenv(ji,jj) = MAX( bathy(ji,jj), rn_sbot_min ) 
    1174          END DO 
    1175       END DO 
     1192           IF( bathy(ji,jj) == 0._wp ) THEN 
     1193             iip1 = MIN( ji+1, jpi ) 
     1194             ijp1 = MIN( jj+1, jpj ) 
     1195             iim1 = MAX( ji-1, 1 ) 
     1196             ijm1 = MAX( jj-1, 1 ) 
     1197             IF( (bathy(iip1,jj) + bathy(iim1,jj) + bathy(ji,ijp1) + bathy(ji,ijm1) +              & 
     1198        &         bathy(iip1,ijp1) + bathy(iim1,ijm1) + bathy(iip1,ijp1) + bathy(iim1,ijm1)) > 0._wp ) THEN 
     1199               zenv(ji,jj) = rn_sbot_min 
     1200             ENDIF 
     1201           ENDIF 
     1202         END DO 
     1203      END DO 
     1204      ! apply lateral boundary condition   CAUTION: keep the value when the lbc field is zero 
     1205      CALL lbc_lnk( zenv, 'T', 1._wp, 'no0' ) 
    11761206      !  
    1177       ! Smooth the bathymetry (if required) 
     1207      ! smooth the bathymetry (if required) 
    11781208      scosrf(:,:) = 0._wp             ! ocean surface depth (here zero: no under ice-shelf sea) 
    11791209      scobot(:,:) = bathy(:,:)        ! ocean bottom  depth 
     
    11811211      jl = 0 
    11821212      zrmax = 1._wp 
    1183       !                                                     ! ================ ! 
    1184       DO WHILE( jl <= 10000 .AND. zrmax > rn_rmax )         !  Iterative loop  ! 
    1185          !                                                  ! ================ ! 
     1213      !    
     1214      !      
     1215      ! set scaling factor used in reducing vertical gradients 
     1216      zrfact = ( 1._wp - rn_rmax ) / ( 1._wp + rn_rmax ) 
     1217      ! 
     1218      ! initialise temporary evelope depth arrays 
     1219      ztmpi1(:,:) = zenv(:,:) 
     1220      ztmpi2(:,:) = zenv(:,:) 
     1221      ztmpj1(:,:) = zenv(:,:) 
     1222      ztmpj2(:,:) = zenv(:,:) 
     1223      ! 
     1224      ! initialise temporary r-value arrays 
     1225      zri(:,:) = 1._wp 
     1226      zrj(:,:) = 1._wp 
     1227      !                                                            ! ================ ! 
     1228      DO WHILE( jl <= 10000 .AND. ( zrmax - rn_rmax ) > 1.e-8_wp ) !  Iterative loop  ! 
     1229         !                                                         ! ================ ! 
    11861230         jl = jl + 1 
    11871231         zrmax = 0._wp 
    1188          zmsk(:,:) = 0._wp 
     1232         ! we set zrmax from previous r-values (zri and zrj) first 
     1233         ! if set after current r-value calculation (as previously) 
     1234         ! we could exit DO WHILE prematurely before checking r-value 
     1235         ! of current zenv 
     1236         DO jj = 1, nlcj 
     1237            DO ji = 1, nlci 
     1238               zrmax = MAX( zrmax, ABS(zri(ji,jj)), ABS(zrj(ji,jj)) ) 
     1239            END DO 
     1240         END DO 
     1241         zri(:,:) = 0._wp 
     1242         zrj(:,:) = 0._wp 
    11891243         DO jj = 1, nlcj 
    11901244            DO ji = 1, nlci 
    11911245               iip1 = MIN( ji+1, nlci )      ! force zri = 0 on last line (ji=ncli+1 to jpi) 
    11921246               ijp1 = MIN( jj+1, nlcj )      ! force zrj = 0 on last raw  (jj=nclj+1 to jpj) 
    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 
     1247               IF( (zenv(ji,jj) > 0._wp) .AND. (zenv(iip1,jj) > 0._wp)) THEN 
     1248                  zri(ji,jj) = ( zenv(iip1,jj  ) - zenv(ji,jj) ) / ( zenv(iip1,jj  ) + zenv(ji,jj) ) 
     1249               END IF 
     1250               IF( (zenv(ji,jj) > 0._wp) .AND. (zenv(ji,ijp1) > 0._wp)) THEN 
     1251                  zrj(ji,jj) = ( zenv(ji  ,ijp1) - zenv(ji,jj) ) / ( zenv(ji  ,ijp1) + zenv(ji,jj) ) 
     1252               END IF 
     1253               IF( zri(ji,jj) >  rn_rmax )   ztmpi1(ji  ,jj  ) = zenv(iip1,jj  ) * zrfact 
     1254               IF( zri(ji,jj) < -rn_rmax )   ztmpi2(iip1,jj  ) = zenv(ji  ,jj  ) * zrfact 
     1255               IF( zrj(ji,jj) >  rn_rmax )   ztmpj1(ji  ,jj  ) = zenv(ji  ,ijp1) * zrfact 
     1256               IF( zrj(ji,jj) < -rn_rmax )   ztmpj2(ji  ,ijp1) = zenv(ji  ,jj  ) * zrfact 
    12001257            END DO 
    12011258         END DO 
    12021259         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 
    12101260         ! 
    1211          IF(lwp)WRITE(numout,*) 'zgr_sco :   iter= ',jl, ' rmax= ', zrmax, ' nb of pt= ', INT( SUM(zmsk(:,:) ) ) 
     1261         IF(lwp)WRITE(numout,*) 'zgr_sco :   iter= ',jl, ' rmax= ', zrmax 
    12121262         ! 
    12131263         DO jj = 1, nlcj 
    12141264            DO ji = 1, nlci 
    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 
    1230             END DO 
    1231          END DO 
    1232          ! 
    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 
     1265               zenv(ji,jj) = MAX(zenv(ji,jj), ztmpi1(ji,jj), ztmpi2(ji,jj), ztmpj1(ji,jj), ztmpj2(ji,jj) ) 
     1266            END DO 
     1267         END DO 
     1268         ! apply lateral boundary condition   CAUTION: keep the value when the lbc field is zero 
     1269         CALL lbc_lnk( zenv, 'T', 1._wp, 'no0' ) 
    12461270         !                                                  ! ================ ! 
    12471271      END DO                                                !     End loop     ! 
    12481272      !                                                     ! ================ ! 
    1249       ! 
    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) 
     1273      DO jj = 1, jpj 
     1274         DO ji = 1, jpi 
     1275            zenv(ji,jj) = MAX( zenv(ji,jj), rn_sbot_min ) ! set all points to avoid undefined scale value warnings 
     1276         END DO 
    12571277      END DO 
    12581278      ! 
     
    15321552      END DO 
    15331553      ! 
    1534       CALL wrk_dealloc( jpi, jpj,      zenv, ztmp, zmsk, zri, zrj, zhbat                          ) 
     1554      CALL wrk_dealloc( jpi, jpj, zenv, ztmp, zmsk, zri, zrj, zhbat , ztmpi1, ztmpi2, ztmpj1, ztmpj2 ) 
    15351555      ! 
    15361556      IF( nn_timing == 1 )  CALL timing_stop('zgr_sco') 
  • branches/2013/dev_LOCEAN_CMCC_INGV_MERC_UKMO_2013/NEMOGCM/NEMO/OPA_SRC/DOM/dtatsd.F90

    r4230 r4245  
    7070      ierr0 = 0  ;  ierr1 = 0  ;  ierr2 = 0  ;  ierr3 = 0 
    7171      ! 
    72       !                             ! set default namelist values  
    73       cn_dir = './'                       ! directory in which the model is executed 
    74       !                                   ! sn_... default values (NB: frequency positive => hours, negative => months) 
    75       !            !   file    ! frequency ! variable  ! time intep !  clim   ! 'yearly' or ! weights  ! rotation ! land/sea mask ! 
    76       !            !   name    !  (hours)  !  name     !   (T/F)    !  (T/F)  !  'monthly'  ! filename ! pairs    ! filename      ! 
    77       sn_tem = FLD_N( 'temperature',  -1.  , 'votemper',  .false.   , .true.  ,  'monthly'  , ''       , & 
    78            & ''       , ''            ) 
    79       sn_sal = FLD_N( 'salinity'   ,  -1.  , 'vosaline',  .false.   , .true.  ,  'monthly'  , ''       , & 
    80            & ''       , ''            ) 
    81   
    8272      REWIND( numnam_ref )              ! Namelist namtsd in reference namelist :  
    8373      READ  ( numnam_ref, namtsd, IOSTAT = ios, ERR = 901) 
  • branches/2013/dev_LOCEAN_CMCC_INGV_MERC_UKMO_2013/NEMOGCM/NEMO/OPA_SRC/DOM/istate.F90

    r3764 r4245  
    2626   USE oce             ! ocean dynamics and active tracers  
    2727   USE dom_oce         ! ocean space and time domain  
     28   USE c1d             ! 1D vertical configuration 
    2829   USE daymod          ! calendar 
    2930   USE eosbn2          ! eq. of state, Brunt Vaisala frequency (eos     routine) 
     
    3233   USE phycst          ! physical constants 
    3334   USE dtatsd          ! data temperature and salinity   (dta_tsd routine) 
     35   USE dtauvd          ! data: U & V current             (dta_uvd routine) 
    3436   USE in_out_manager  ! I/O manager 
    3537   USE iom             ! I/O library 
     
    7072      ! - ML - needed for initialization of e3t_b 
    7173      INTEGER  ::  jk     ! dummy loop indice 
     74      REAL(wp), POINTER, DIMENSION(:,:,:,:)  ::  zuvd    ! U & V data workspace 
    7275      !!---------------------------------------------------------------------- 
    7376      ! 
     
    8083 
    8184      CALL dta_tsd_init                       ! Initialisation of T & S input data 
     85      IF( lk_c1d ) CALL dta_uvd_init          ! Initialization of U & V input data 
    8286 
    8387      rhd  (:,:,:  ) = 0.e0 
     
    111115         ELSEIF( cp_cfg == 'gyre' ) THEN          
    112116            CALL istate_gyre                     ! GYRE  configuration : start from pre-defined T-S fields 
    113          ELSEIF( ln_tsd_init      ) THEN         ! Initial T-S fields read in files 
    114             CALL dta_tsd( nit000, tsb )                  ! read 3D T and S data at nit000 
    115             tsn(:,:,:,:) = tsb(:,:,:,:) 
    116             ! 
    117          ELSE                                    ! Initial T-S fields defined analytically 
    118             CALL istate_t_s 
     117         ELSE                                    ! Initial T-S, U-V fields read in files 
     118            IF ( ln_tsd_init ) THEN              ! read 3D T and S data at nit000 
     119               CALL dta_tsd( nit000, tsb )   
     120               tsn(:,:,:,:) = tsb(:,:,:,:) 
     121               ! 
     122            ELSE                                 ! Initial T-S fields defined analytically 
     123               CALL istate_t_s 
     124            ENDIF 
     125            IF ( ln_uvd_init .AND. lk_c1d ) THEN ! read 3D U and V data at nit000 
     126               CALL wrk_alloc( jpi, jpj, jpk, 2, zuvd ) 
     127               CALL dta_uvd( nit000, zuvd ) 
     128               ub(:,:,:) = zuvd(:,:,:,1) ;  un(:,:,:) = ub(:,:,:) 
     129               vb(:,:,:) = zuvd(:,:,:,2) ;  vn(:,:,:) = vb(:,:,:) 
     130               CALL wrk_dealloc( jpi, jpj, jpk, 2, zuvd ) 
     131            ENDIF 
    119132         ENDIF 
    120133         ! 
     
    180193   END SUBROUTINE istate_t_s 
    181194 
    182  
    183195   SUBROUTINE istate_eel 
    184196      !!---------------------------------------------------------------------- 
     
    404416 
    405417   END SUBROUTINE istate_gyre 
    406  
    407418 
    408419   SUBROUTINE istate_uvg 
Note: See TracChangeset for help on using the changeset viewer.