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 12489 for NEMO/trunk/src/OCE/DOM – NEMO

Ignore:
Timestamp:
2020-02-28T16:55:11+01:00 (4 years ago)
Author:
davestorkey
Message:

Preparation for new timestepping scheme #2390.
Main changes:

  1. Initial euler timestep now handled in stp and not in TRA/DYN routines.
  2. Renaming of all timestep parameters. In summary, the namelist parameter is now rn_Dt and the current timestep is rDt (and rDt_ice, rDt_trc etc).
  3. Renaming of a few miscellaneous parameters, eg. atfp -> rn_atfp (namelist parameter used everywhere) and rau0 -> rho0.

This version gives bit-comparable results to the previous version of the trunk.

Location:
NEMO/trunk/src/OCE/DOM
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • NEMO/trunk/src/OCE/DOM/daymod.F90

    r12377 r12489  
    2020   !!                    ------------------------------- 
    2121   !!   sbcmod assume that the time step is dividing the number of second of  
    22    !!   in a day, i.e. ===> MOD( rday, rdt ) == 0  
     22   !!   in a day, i.e. ===> MOD( rday, rn_Dt ) == 0  
    2323   !!   except when user defined forcing is used (see sbcmod.F90) 
    2424   !!---------------------------------------------------------------------- 
     
    7373      ! 
    7474      ! max number of seconds between each restart 
    75       IF( REAL( nitend - nit000 + 1 ) * rdt > REAL( HUGE( nsec1jan000 ) ) ) THEN 
     75      IF( REAL( nitend - nit000 + 1 ) * rn_Dt > REAL( HUGE( nsec1jan000 ) ) ) THEN 
    7676         CALL ctl_stop( 'The number of seconds between each restart exceeds the integer 4 max value: 2^31-1. ',   & 
    7777            &           'You must do a restart at higher frequency (or remove this stop and recompile the code in I8)' ) 
     
    7979      nsecd   = NINT(       rday ) 
    8080      nsecd05 = NINT( 0.5 * rday ) 
    81       ndt     = NINT(       rdt  ) 
    82       ndt05   = NINT( 0.5 * rdt  ) 
     81      ndt     = NINT(       rn_Dt  ) 
     82      ndt05   = NINT( 0.5 * rn_Dt  ) 
    8383 
    8484      IF( .NOT. l_offline )   CALL day_rst( nit000, 'READ' ) 
     
    239239      nsec_monday  = nsec_monday  + ndt 
    240240      nsec_day   = nsec_day   + ndt 
    241       adatrj  = adatrj  + rdt / rday 
    242       fjulday = fjulday + rdt / rday 
     241      adatrj  = adatrj  + rn_Dt / rday 
     242      fjulday = fjulday + rn_Dt / rday 
    243243      IF( ABS(fjulday - REAL(NINT(fjulday),wp)) < zprec )   fjulday = REAL(NINT(fjulday),wp)   ! avoid truncation error 
    244244      IF( ABS(adatrj  - REAL(NINT(adatrj ),wp)) < zprec )   adatrj  = REAL(NINT(adatrj ),wp)   ! avoid truncation error 
     
    309309      !!       In both those options, the  exact duration of the experiment 
    310310      !!       since the beginning (cumulated duration of all previous restart runs) 
    311       !!       is not stored in the restart and is assumed to be (nit000-1)*rdt. 
     311      !!       is not stored in the restart and is assumed to be (nit000-1)*rn_Dt. 
    312312      !!       This is valid is the time step has remained constant. 
    313313      !! 
     
    379379               isecond = ( nhour * NINT(rhhmm) + nminute ) * NINT(rmmss) 
    380380               IF( isecond - ndt05 .lt. 0 )   ndastp = ndastp - 1      ! Start hour is specified in the namelist (default 0) 
    381                adatrj = ( REAL( nit000-1, wp ) * rdt ) / rday 
     381               adatrj = ( REAL( nit000-1, wp ) * rn_Dt ) / rday 
    382382               ! note this is wrong if time step has changed during run 
    383383            ENDIF 
     
    389389            isecond = ( nhour * NINT(rhhmm) + nminute ) * NINT(rmmss) 
    390390            IF( isecond - ndt05 .LT. 0 )   ndastp = ndastp - 1         ! Start hour is specified in the namelist (default 0) 
    391             adatrj = ( REAL( nit000-1, wp ) * rdt ) / rday 
     391            adatrj = ( REAL( nit000-1, wp ) * rn_Dt ) / rday 
    392392         ENDIF 
    393393         IF( ABS(adatrj  - REAL(NINT(adatrj),wp)) < 0.1 / rday )   adatrj = REAL(NINT(adatrj),wp)   ! avoid truncation error 
  • NEMO/trunk/src/OCE/DOM/dom_oce.F90

    r12377 r12489  
    3333   LOGICAL , PUBLIC ::   ln_linssh      !: =T  linear free surface ==>> model level are fixed in time 
    3434   LOGICAL , PUBLIC ::   ln_meshmask    !: =T  create a mesh-mask file (mesh_mask.nc) 
    35    REAL(wp), PUBLIC ::   rn_rdt         !: time step for the dynamics and tracer 
     35   REAL(wp), PUBLIC ::   rn_Dt          !: time step for the dynamics and tracer 
    3636   REAL(wp), PUBLIC ::   rn_atfp        !: asselin time filter parameter 
    37    INTEGER , PUBLIC ::   nn_euler       !: =0 start with forward time step or not (=1) 
     37   LOGICAL , PUBLIC ::   ln_1st_euler   !: =T start with forward time step or not (=F) 
    3838   LOGICAL , PUBLIC ::   ln_crs         !: Apply grid coarsening to dynamical model output or online passive tracers 
    3939 
     
    4949   LOGICAL,  PUBLIC :: ln_bt_auto       !: Set number of barotropic iterations automatically 
    5050   INTEGER,  PUBLIC :: nn_bt_flt        !: Filter choice 
    51    INTEGER,  PUBLIC :: nn_baro          !: Number of barotropic iterations during one baroclinic step (rdt) 
     51   INTEGER,  PUBLIC :: nn_e          !: Number of barotropic iterations during one baroclinic step (rn_Dt) 
    5252   REAL(wp), PUBLIC :: rn_bt_cmax       !: Maximum allowed courant number (used if ln_bt_auto=T) 
    5353   REAL(wp), PUBLIC :: rn_bt_alpha      !: Time stepping diffusion parameter 
    5454 
    5555 
    56    !                                   !! old non-DOCTOR names still used in the model 
    57    REAL(wp), PUBLIC ::   atfp           !: asselin time filter parameter 
    58    REAL(wp), PUBLIC ::   rdt            !: time step for the dynamics and tracer 
    59  
    6056   !                                   !!! associated variables 
    61    INTEGER , PUBLIC ::   neuler         !: restart euler forward option (0=Euler) 
    62    REAL(wp), PUBLIC ::   r2dt           !: = 2*rdt except at nit000 (=rdt) if neuler=0 
     57   LOGICAL , PUBLIC ::   l_1st_euler    !: Euler 1st time-step flag (=T if ln_restart=F or ln_1st_euler=T) 
     58   REAL(wp), PUBLIC ::   rDt, r1_Dt     !: Current model timestep and reciprocal 
     59                                        !: rDt = 2 * rn_Dt if leapfrog and l_1st_euler = F 
     60                                        !:     =     rn_Dt if leapfrog and l_1st_euler = T 
     61                                        !:     =     rn_Dt if RK3 
    6362 
    6463   !!---------------------------------------------------------------------- 
  • NEMO/trunk/src/OCE/DOM/domain.F90

    r12377 r12489  
    287287         &             nn_no   , cn_exp   , cn_ocerst_in, cn_ocerst_out, ln_rstart , nn_rstctl ,     & 
    288288         &             nn_it000, nn_itend , nn_date0    , nn_time0     , nn_leapy  , nn_istate ,     & 
    289          &             nn_stock, nn_write , ln_mskland  , ln_clobber   , nn_chunksz, nn_euler  ,    & 
     289         &             nn_stock, nn_write , ln_mskland  , ln_clobber   , nn_chunksz, ln_1st_euler  , & 
    290290         &             ln_cfmeta, ln_xios_read, nn_wxios 
    291       NAMELIST/namdom/ ln_linssh, rn_rdt, rn_atfp, ln_crs, ln_meshmask 
     291      NAMELIST/namdom/ ln_linssh, rn_Dt, rn_atfp, ln_crs, ln_meshmask 
    292292#if defined key_netcdf4 
    293293      NAMELIST/namnc4/ nn_nchunks_i, nn_nchunks_j, nn_nchunks_k, ln_nc4zip 
     
    317317         WRITE(numout,*) '      restart output directory        cn_ocerst_outdir= ', TRIM( cn_ocerst_outdir ) 
    318318         WRITE(numout,*) '      restart logical                 ln_rstart       = ', ln_rstart 
    319          WRITE(numout,*) '      start with forward time step    nn_euler        = ', nn_euler 
     319         WRITE(numout,*) '      start with forward time step    ln_1st_euler    = ', ln_1st_euler 
    320320         WRITE(numout,*) '      control of time step            nn_rstctl       = ', nn_rstctl 
    321321         WRITE(numout,*) '      number of the first time step   nn_it000        = ', nn_it000 
     
    353353      nleapy = nn_leapy 
    354354      ninist = nn_istate 
    355       neuler = nn_euler 
    356       IF( neuler == 1 .AND. .NOT. ln_rstart ) THEN 
     355      l_1st_euler = ln_1st_euler 
     356      IF( .NOT. l_1st_euler .AND. .NOT. ln_rstart ) THEN 
    357357         IF(lwp) WRITE(numout,*)   
    358358         IF(lwp) WRITE(numout,*)'   ==>>>   Start from rest (ln_rstart=F)' 
    359          IF(lwp) WRITE(numout,*)'           an Euler initial time step is used : nn_euler is forced to 0 '    
    360          neuler = 0 
     359         IF(lwp) WRITE(numout,*)'           an Euler initial time step is used : l_1st_euler is forced to .true. '    
     360         l_1st_euler = .true. 
    361361      ENDIF 
    362362      !                             ! control of output frequency 
     
    408408         WRITE(numout,*) '      linear free surface (=T)                ln_linssh   = ', ln_linssh 
    409409         WRITE(numout,*) '      create mesh/mask file                   ln_meshmask = ', ln_meshmask 
    410          WRITE(numout,*) '      ocean time step                         rn_rdt      = ', rn_rdt 
     410         WRITE(numout,*) '      ocean time step                         rn_Dt       = ', rn_Dt 
    411411         WRITE(numout,*) '      asselin time filter parameter           rn_atfp     = ', rn_atfp 
    412412         WRITE(numout,*) '      online coarsening of dynamical fields   ln_crs      = ', ln_crs 
    413413      ENDIF 
    414414      ! 
    415       !          ! conversion DOCTOR names into model names (this should disappear soon) 
    416       atfp = rn_atfp 
    417       rdt  = rn_rdt 
     415      !! Initialise current model timestep rDt = 2*rn_Dt if MLF or rDt = rn_Dt if RK3 
     416      rDt  = 2._wp * rn_Dt 
     417      r1_Dt = 1._wp / rDt 
    418418 
    419419      IF( TRIM(Agrif_CFixed()) == '0' ) THEN 
  • NEMO/trunk/src/OCE/DOM/domvvl.F90

    r12377 r12489  
    235235         IF( ln_vvl_ztilde_as_zstar ) THEN   ! z-star emulation using z-tile 
    236236            frq_rst_e3t(:,:) = 0._wp               !Ignore namelist settings 
    237             frq_rst_hdv(:,:) = 1._wp / rdt 
     237            frq_rst_hdv(:,:) = 1._wp / rn_Dt 
    238238         ENDIF 
    239239         IF ( ln_vvl_zstar_at_eqtor ) THEN   ! use z-star in vicinity of the Equator 
     
    247247                  ! values inside the equatorial band (ztilde as zstar) 
    248248                  frq_rst_e3t(ji,jj) =  0.0_wp 
    249                   frq_rst_hdv(ji,jj) =  1.0_wp / rdt 
     249                  frq_rst_hdv(ji,jj) =  1.0_wp / rn_Dt 
    250250               ELSE                                      ! transition band (2.5 to 6 degrees N/S) 
    251251                  !                                      ! (linearly transition from z-tilde to z-star) 
     
    253253                     &            * (  1.0_wp - COS( rad*(ABS(gphit(ji,jj))-2.5_wp)  & 
    254254                     &                                          * 180._wp / 3.5_wp ) ) 
    255                   frq_rst_hdv(ji,jj) = (1.0_wp / rdt)                                & 
    256                      &            + (  frq_rst_hdv(ji,jj)-(1.e0_wp / rdt) )*0.5_wp   & 
     255                  frq_rst_hdv(ji,jj) = (1.0_wp / rn_Dt)                                & 
     256                     &            + (  frq_rst_hdv(ji,jj)-(1.e0_wp / rn_Dt) )*0.5_wp   & 
    257257                     &            * (  1._wp  - COS( rad*(ABS(gphit(ji,jj))-2.5_wp)  & 
    258258                     &                                          * 180._wp / 3.5_wp ) ) 
     
    264264                  ij0 = 128   ;   ij1 = 135   ;    
    265265                  frq_rst_e3t( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) ) =  0.0_wp 
    266                   frq_rst_hdv( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) ) =  1.e0_wp / rdt 
     266                  frq_rst_hdv( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) ) =  1.e0_wp / rn_Dt 
    267267               ENDIF 
    268268            ENDIF 
     
    319319      INTEGER                ::   ji, jj, jk            ! dummy loop indices 
    320320      INTEGER , DIMENSION(3) ::   ijk_max, ijk_min      ! temporary integers 
    321       REAL(wp)               ::   z2dt, z_tmin, z_tmax  ! local scalars 
     321      REAL(wp)               ::   z_tmin, z_tmax        ! local scalars 
    322322      LOGICAL                ::   ll_do_bclinic         ! local logical 
    323323      REAL(wp), DIMENSION(jpi,jpj)     ::   zht, z_scale, zwu, zwv, zhdiv 
     
    373373            IF( kt > nit000 ) THEN 
    374374               DO jk = 1, jpkm1 
    375                   hdiv_lf(:,:,jk) = hdiv_lf(:,:,jk) - rdt * frq_rst_hdv(:,:)   & 
     375                  hdiv_lf(:,:,jk) = hdiv_lf(:,:,jk) - rn_Dt * frq_rst_hdv(:,:)   & 
    376376                     &          * ( hdiv_lf(:,:,jk) - e3t(:,:,jk,Kmm) * ( hdiv(:,:,jk) - zhdiv(:,:) ) ) 
    377377               END DO 
     
    430430         ! 4 - Time stepping of baroclinic scale factors 
    431431         ! --------------------------------------------- 
    432          ! Leapfrog time stepping 
    433          ! ~~~~~~~~~~~~~~~~~~~~~~ 
    434          IF( neuler == 0 .AND. kt == nit000 ) THEN 
    435             z2dt =  rdt 
    436          ELSE 
    437             z2dt = 2.0_wp * rdt 
    438          ENDIF 
    439432         CALL lbc_lnk( 'domvvl', tilde_e3t_a(:,:,:), 'T', 1._wp ) 
    440          tilde_e3t_a(:,:,:) = tilde_e3t_b(:,:,:) + z2dt * tmask(:,:,:) * tilde_e3t_a(:,:,:) 
     433         tilde_e3t_a(:,:,:) = tilde_e3t_b(:,:,:) + rDt * tmask(:,:,:) * tilde_e3t_a(:,:,:) 
    441434 
    442435         ! Maximum deformation control 
     
    624617      ! - ML - e3(t/u/v)_b are allready computed in dynnxt. 
    625618      IF( ln_vvl_ztilde .OR. ln_vvl_layer ) THEN 
    626          IF( neuler == 0 .AND. kt == nit000 ) THEN 
     619         IF( l_1st_euler ) THEN 
    627620            tilde_e3t_b(:,:,:) = tilde_e3t_n(:,:,:) 
    628621         ELSE 
    629622            tilde_e3t_b(:,:,:) = tilde_e3t_n(:,:,:) &  
    630             &         + atfp * ( tilde_e3t_b(:,:,:) - 2.0_wp * tilde_e3t_n(:,:,:) + tilde_e3t_a(:,:,:) ) 
     623            &         + rn_atfp * ( tilde_e3t_b(:,:,:) - 2.0_wp * tilde_e3t_n(:,:,:) + tilde_e3t_a(:,:,:) ) 
    631624         ENDIF 
    632625         tilde_e3t_n(:,:,:) = tilde_e3t_a(:,:,:) 
     
    821814                  e3t(:,:,:,Kbb) = e3t_0(:,:,:) 
    822815               END WHERE 
    823                IF( neuler == 0 ) THEN 
     816               IF( l_1st_euler ) THEN 
    824817                  e3t(:,:,:,Kbb) = e3t(:,:,:,Kmm) 
    825818               ENDIF 
     
    827820               IF(lwp) write(numout,*) 'dom_vvl_rst WARNING : e3t(:,:,:,Kmm) not found in restart files' 
    828821               IF(lwp) write(numout,*) 'e3t_n set equal to e3t_b.' 
    829                IF(lwp) write(numout,*) 'neuler is forced to 0' 
     822               IF(lwp) write(numout,*) 'l_1st_euler is forced to true' 
    830823               CALL iom_get( numror, jpdom_autoglo, 'e3t_b', e3t(:,:,:,Kbb), ldxios = lrxios ) 
    831824               e3t(:,:,:,Kmm) = e3t(:,:,:,Kbb) 
    832                neuler = 0 
     825               l_1st_euler = .true. 
    833826            ELSE IF( id2 > 0 ) THEN 
    834827               IF(lwp) write(numout,*) 'dom_vvl_rst WARNING : e3t(:,:,:,Kbb) not found in restart files' 
    835828               IF(lwp) write(numout,*) 'e3t_b set equal to e3t_n.' 
    836                IF(lwp) write(numout,*) 'neuler is forced to 0' 
     829               IF(lwp) write(numout,*) 'l_1st_euler is forced to true' 
    837830               CALL iom_get( numror, jpdom_autoglo, 'e3t_n', e3t(:,:,:,Kmm), ldxios = lrxios ) 
    838831               e3t(:,:,:,Kbb) = e3t(:,:,:,Kmm) 
    839                neuler = 0 
     832               l_1st_euler = .true. 
    840833            ELSE 
    841834               IF(lwp) write(numout,*) 'dom_vvl_rst WARNING : e3t(:,:,:,Kmm) not found in restart file' 
    842835               IF(lwp) write(numout,*) 'Compute scale factor from sshn' 
    843                IF(lwp) write(numout,*) 'neuler is forced to 0' 
     836               IF(lwp) write(numout,*) 'l_1st_euler is forced to true' 
    844837               DO jk = 1, jpk 
    845838                  e3t(:,:,jk,Kmm) =  e3t_0(:,:,jk) * ( ht_0(:,:) + ssh(:,:,Kmm) ) & 
     
    848841               END DO 
    849842               e3t(:,:,:,Kbb) = e3t(:,:,:,Kmm) 
    850                neuler = 0 
     843               l_1st_euler = .true. 
    851844            ENDIF 
    852845            !                             ! ----------- ! 
     
    10081001            WRITE(numout,*) '                         rn_rst_e3t     = 0.e0' 
    10091002            WRITE(numout,*) '            hard-wired : z-tilde cutoff frequency of low-pass filter (days)' 
    1010             WRITE(numout,*) '                         rn_lf_cutoff   = 1.0/rdt' 
     1003            WRITE(numout,*) '                         rn_lf_cutoff   = 1.0/rn_Dt' 
    10111004         ELSE 
    10121005            WRITE(numout,*) '      z-tilde to zstar restoration timescale (days)        rn_rst_e3t   = ', rn_rst_e3t 
  • NEMO/trunk/src/OCE/DOM/istate.F90

    r12377 r12489  
    9292         !                                    ! --------------- 
    9393         numror = 0                           ! define numror = 0 -> no restart file to read 
    94          neuler = 0                           ! Set time-step indicator at nit000 (euler forward) 
     94         l_1st_euler = .true.                 ! Set time-step indicator at nit000 (euler forward) 
    9595         CALL day_init                        ! model calendar (using both namelist and restart infos) 
    9696         !                                    ! Initialization of ocean to zero 
  • NEMO/trunk/src/OCE/DOM/phycst.F90

    r10068 r12489  
    3939   REAL(wp), PUBLIC ::   rt0      = 273.15_wp        !: freezing point of fresh water [Kelvin] 
    4040 
    41    REAL(wp), PUBLIC ::   rau0                        !: volumic mass of reference     [kg/m3] 
    42    REAL(wp), PUBLIC ::   r1_rau0                     !: = 1. / rau0                   [m3/kg] 
     41   REAL(wp), PUBLIC ::   rho0                        !: volumic mass of reference     [kg/m3] 
     42   REAL(wp), PUBLIC ::   r1_rho0                     !: = 1. / rho0                   [m3/kg] 
    4343   REAL(wp), PUBLIC ::   rcp                         !: ocean specific heat           [J/Kelvin] 
    4444   REAL(wp), PUBLIC ::   r1_rcp                      !: = 1. / rcp                    [Kelvin/J] 
    45    REAL(wp), PUBLIC ::   rau0_rcp                    !: = rau0 * rcp  
    46    REAL(wp), PUBLIC ::   r1_rau0_rcp                 !: = 1. / ( rau0 * rcp ) 
     45   REAL(wp), PUBLIC ::   rho0_rcp                    !: = rho0 * rcp  
     46   REAL(wp), PUBLIC ::   r1_rho0_rcp                 !: = 1. / ( rho0 * rcp ) 
    4747 
    4848   REAL(wp), PUBLIC ::   emic     =    0.97_wp       !: emissivity of snow or ice (not used?) 
Note: See TracChangeset for help on using the changeset viewer.