Changeset 12489 for NEMO/trunk/src/OCE/DOM
- Timestamp:
- 2020-02-28T16:55:11+01:00 (4 years ago)
- Location:
- NEMO/trunk/src/OCE/DOM
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
NEMO/trunk/src/OCE/DOM/daymod.F90
r12377 r12489 20 20 !! ------------------------------- 21 21 !! sbcmod assume that the time step is dividing the number of second of 22 !! in a day, i.e. ===> MOD( rday, r dt ) == 022 !! in a day, i.e. ===> MOD( rday, rn_Dt ) == 0 23 23 !! except when user defined forcing is used (see sbcmod.F90) 24 24 !!---------------------------------------------------------------------- … … 73 73 ! 74 74 ! max number of seconds between each restart 75 IF( REAL( nitend - nit000 + 1 ) * r dt > REAL( HUGE( nsec1jan000 ) ) ) THEN75 IF( REAL( nitend - nit000 + 1 ) * rn_Dt > REAL( HUGE( nsec1jan000 ) ) ) THEN 76 76 CALL ctl_stop( 'The number of seconds between each restart exceeds the integer 4 max value: 2^31-1. ', & 77 77 & 'You must do a restart at higher frequency (or remove this stop and recompile the code in I8)' ) … … 79 79 nsecd = NINT( rday ) 80 80 nsecd05 = NINT( 0.5 * rday ) 81 ndt = NINT( r dt )82 ndt05 = NINT( 0.5 * r dt )81 ndt = NINT( rn_Dt ) 82 ndt05 = NINT( 0.5 * rn_Dt ) 83 83 84 84 IF( .NOT. l_offline ) CALL day_rst( nit000, 'READ' ) … … 239 239 nsec_monday = nsec_monday + ndt 240 240 nsec_day = nsec_day + ndt 241 adatrj = adatrj + r dt / rday242 fjulday = fjulday + r dt / rday241 adatrj = adatrj + rn_Dt / rday 242 fjulday = fjulday + rn_Dt / rday 243 243 IF( ABS(fjulday - REAL(NINT(fjulday),wp)) < zprec ) fjulday = REAL(NINT(fjulday),wp) ! avoid truncation error 244 244 IF( ABS(adatrj - REAL(NINT(adatrj ),wp)) < zprec ) adatrj = REAL(NINT(adatrj ),wp) ! avoid truncation error … … 309 309 !! In both those options, the exact duration of the experiment 310 310 !! since the beginning (cumulated duration of all previous restart runs) 311 !! is not stored in the restart and is assumed to be (nit000-1)*r dt.311 !! is not stored in the restart and is assumed to be (nit000-1)*rn_Dt. 312 312 !! This is valid is the time step has remained constant. 313 313 !! … … 379 379 isecond = ( nhour * NINT(rhhmm) + nminute ) * NINT(rmmss) 380 380 IF( isecond - ndt05 .lt. 0 ) ndastp = ndastp - 1 ! Start hour is specified in the namelist (default 0) 381 adatrj = ( REAL( nit000-1, wp ) * r dt ) / rday381 adatrj = ( REAL( nit000-1, wp ) * rn_Dt ) / rday 382 382 ! note this is wrong if time step has changed during run 383 383 ENDIF … … 389 389 isecond = ( nhour * NINT(rhhmm) + nminute ) * NINT(rmmss) 390 390 IF( isecond - ndt05 .LT. 0 ) ndastp = ndastp - 1 ! Start hour is specified in the namelist (default 0) 391 adatrj = ( REAL( nit000-1, wp ) * r dt ) / rday391 adatrj = ( REAL( nit000-1, wp ) * rn_Dt ) / rday 392 392 ENDIF 393 393 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 33 33 LOGICAL , PUBLIC :: ln_linssh !: =T linear free surface ==>> model level are fixed in time 34 34 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 tracer35 REAL(wp), PUBLIC :: rn_Dt !: time step for the dynamics and tracer 36 36 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) 38 38 LOGICAL , PUBLIC :: ln_crs !: Apply grid coarsening to dynamical model output or online passive tracers 39 39 … … 49 49 LOGICAL, PUBLIC :: ln_bt_auto !: Set number of barotropic iterations automatically 50 50 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) 52 52 REAL(wp), PUBLIC :: rn_bt_cmax !: Maximum allowed courant number (used if ln_bt_auto=T) 53 53 REAL(wp), PUBLIC :: rn_bt_alpha !: Time stepping diffusion parameter 54 54 55 55 56 ! !! old non-DOCTOR names still used in the model57 REAL(wp), PUBLIC :: atfp !: asselin time filter parameter58 REAL(wp), PUBLIC :: rdt !: time step for the dynamics and tracer59 60 56 ! !!! 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 63 62 64 63 !!---------------------------------------------------------------------- -
NEMO/trunk/src/OCE/DOM/domain.F90
r12377 r12489 287 287 & nn_no , cn_exp , cn_ocerst_in, cn_ocerst_out, ln_rstart , nn_rstctl , & 288 288 & 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 , & 290 290 & ln_cfmeta, ln_xios_read, nn_wxios 291 NAMELIST/namdom/ ln_linssh, rn_ rdt, rn_atfp, ln_crs, ln_meshmask291 NAMELIST/namdom/ ln_linssh, rn_Dt, rn_atfp, ln_crs, ln_meshmask 292 292 #if defined key_netcdf4 293 293 NAMELIST/namnc4/ nn_nchunks_i, nn_nchunks_j, nn_nchunks_k, ln_nc4zip … … 317 317 WRITE(numout,*) ' restart output directory cn_ocerst_outdir= ', TRIM( cn_ocerst_outdir ) 318 318 WRITE(numout,*) ' restart logical ln_rstart = ', ln_rstart 319 WRITE(numout,*) ' start with forward time step nn_euler = ', nn_euler319 WRITE(numout,*) ' start with forward time step ln_1st_euler = ', ln_1st_euler 320 320 WRITE(numout,*) ' control of time step nn_rstctl = ', nn_rstctl 321 321 WRITE(numout,*) ' number of the first time step nn_it000 = ', nn_it000 … … 353 353 nleapy = nn_leapy 354 354 ninist = nn_istate 355 neuler = nn_euler356 IF( neuler == 1.AND. .NOT. ln_rstart ) THEN355 l_1st_euler = ln_1st_euler 356 IF( .NOT. l_1st_euler .AND. .NOT. ln_rstart ) THEN 357 357 IF(lwp) WRITE(numout,*) 358 358 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 = 0359 IF(lwp) WRITE(numout,*)' an Euler initial time step is used : l_1st_euler is forced to .true. ' 360 l_1st_euler = .true. 361 361 ENDIF 362 362 ! ! control of output frequency … … 408 408 WRITE(numout,*) ' linear free surface (=T) ln_linssh = ', ln_linssh 409 409 WRITE(numout,*) ' create mesh/mask file ln_meshmask = ', ln_meshmask 410 WRITE(numout,*) ' ocean time step rn_ rdt = ', rn_rdt410 WRITE(numout,*) ' ocean time step rn_Dt = ', rn_Dt 411 411 WRITE(numout,*) ' asselin time filter parameter rn_atfp = ', rn_atfp 412 412 WRITE(numout,*) ' online coarsening of dynamical fields ln_crs = ', ln_crs 413 413 ENDIF 414 414 ! 415 ! ! conversion DOCTOR names into model names (this should disappear soon)416 atfp = rn_atfp417 r dt = rn_rdt415 !! 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 418 418 419 419 IF( TRIM(Agrif_CFixed()) == '0' ) THEN -
NEMO/trunk/src/OCE/DOM/domvvl.F90
r12377 r12489 235 235 IF( ln_vvl_ztilde_as_zstar ) THEN ! z-star emulation using z-tile 236 236 frq_rst_e3t(:,:) = 0._wp !Ignore namelist settings 237 frq_rst_hdv(:,:) = 1._wp / r dt237 frq_rst_hdv(:,:) = 1._wp / rn_Dt 238 238 ENDIF 239 239 IF ( ln_vvl_zstar_at_eqtor ) THEN ! use z-star in vicinity of the Equator … … 247 247 ! values inside the equatorial band (ztilde as zstar) 248 248 frq_rst_e3t(ji,jj) = 0.0_wp 249 frq_rst_hdv(ji,jj) = 1.0_wp / r dt249 frq_rst_hdv(ji,jj) = 1.0_wp / rn_Dt 250 250 ELSE ! transition band (2.5 to 6 degrees N/S) 251 251 ! ! (linearly transition from z-tilde to z-star) … … 253 253 & * ( 1.0_wp - COS( rad*(ABS(gphit(ji,jj))-2.5_wp) & 254 254 & * 180._wp / 3.5_wp ) ) 255 frq_rst_hdv(ji,jj) = (1.0_wp / r dt) &256 & + ( frq_rst_hdv(ji,jj)-(1.e0_wp / r dt) )*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 & 257 257 & * ( 1._wp - COS( rad*(ABS(gphit(ji,jj))-2.5_wp) & 258 258 & * 180._wp / 3.5_wp ) ) … … 264 264 ij0 = 128 ; ij1 = 135 ; 265 265 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 / r dt266 frq_rst_hdv( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) ) = 1.e0_wp / rn_Dt 267 267 ENDIF 268 268 ENDIF … … 319 319 INTEGER :: ji, jj, jk ! dummy loop indices 320 320 INTEGER , DIMENSION(3) :: ijk_max, ijk_min ! temporary integers 321 REAL(wp) :: z 2dt, z_tmin, z_tmax! local scalars321 REAL(wp) :: z_tmin, z_tmax ! local scalars 322 322 LOGICAL :: ll_do_bclinic ! local logical 323 323 REAL(wp), DIMENSION(jpi,jpj) :: zht, z_scale, zwu, zwv, zhdiv … … 373 373 IF( kt > nit000 ) THEN 374 374 DO jk = 1, jpkm1 375 hdiv_lf(:,:,jk) = hdiv_lf(:,:,jk) - r dt * frq_rst_hdv(:,:) &375 hdiv_lf(:,:,jk) = hdiv_lf(:,:,jk) - rn_Dt * frq_rst_hdv(:,:) & 376 376 & * ( hdiv_lf(:,:,jk) - e3t(:,:,jk,Kmm) * ( hdiv(:,:,jk) - zhdiv(:,:) ) ) 377 377 END DO … … 430 430 ! 4 - Time stepping of baroclinic scale factors 431 431 ! --------------------------------------------- 432 ! Leapfrog time stepping433 ! ~~~~~~~~~~~~~~~~~~~~~~434 IF( neuler == 0 .AND. kt == nit000 ) THEN435 z2dt = rdt436 ELSE437 z2dt = 2.0_wp * rdt438 ENDIF439 432 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(:,:,:) 441 434 442 435 ! Maximum deformation control … … 624 617 ! - ML - e3(t/u/v)_b are allready computed in dynnxt. 625 618 IF( ln_vvl_ztilde .OR. ln_vvl_layer ) THEN 626 IF( neuler == 0 .AND. kt == nit000) THEN619 IF( l_1st_euler ) THEN 627 620 tilde_e3t_b(:,:,:) = tilde_e3t_n(:,:,:) 628 621 ELSE 629 622 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(:,:,:) ) 631 624 ENDIF 632 625 tilde_e3t_n(:,:,:) = tilde_e3t_a(:,:,:) … … 821 814 e3t(:,:,:,Kbb) = e3t_0(:,:,:) 822 815 END WHERE 823 IF( neuler == 0) THEN816 IF( l_1st_euler ) THEN 824 817 e3t(:,:,:,Kbb) = e3t(:,:,:,Kmm) 825 818 ENDIF … … 827 820 IF(lwp) write(numout,*) 'dom_vvl_rst WARNING : e3t(:,:,:,Kmm) not found in restart files' 828 821 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' 830 823 CALL iom_get( numror, jpdom_autoglo, 'e3t_b', e3t(:,:,:,Kbb), ldxios = lrxios ) 831 824 e3t(:,:,:,Kmm) = e3t(:,:,:,Kbb) 832 neuler = 0825 l_1st_euler = .true. 833 826 ELSE IF( id2 > 0 ) THEN 834 827 IF(lwp) write(numout,*) 'dom_vvl_rst WARNING : e3t(:,:,:,Kbb) not found in restart files' 835 828 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' 837 830 CALL iom_get( numror, jpdom_autoglo, 'e3t_n', e3t(:,:,:,Kmm), ldxios = lrxios ) 838 831 e3t(:,:,:,Kbb) = e3t(:,:,:,Kmm) 839 neuler = 0832 l_1st_euler = .true. 840 833 ELSE 841 834 IF(lwp) write(numout,*) 'dom_vvl_rst WARNING : e3t(:,:,:,Kmm) not found in restart file' 842 835 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' 844 837 DO jk = 1, jpk 845 838 e3t(:,:,jk,Kmm) = e3t_0(:,:,jk) * ( ht_0(:,:) + ssh(:,:,Kmm) ) & … … 848 841 END DO 849 842 e3t(:,:,:,Kbb) = e3t(:,:,:,Kmm) 850 neuler = 0843 l_1st_euler = .true. 851 844 ENDIF 852 845 ! ! ----------- ! … … 1008 1001 WRITE(numout,*) ' rn_rst_e3t = 0.e0' 1009 1002 WRITE(numout,*) ' hard-wired : z-tilde cutoff frequency of low-pass filter (days)' 1010 WRITE(numout,*) ' rn_lf_cutoff = 1.0/r dt'1003 WRITE(numout,*) ' rn_lf_cutoff = 1.0/rn_Dt' 1011 1004 ELSE 1012 1005 WRITE(numout,*) ' z-tilde to zstar restoration timescale (days) rn_rst_e3t = ', rn_rst_e3t -
NEMO/trunk/src/OCE/DOM/istate.F90
r12377 r12489 92 92 ! ! --------------- 93 93 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) 95 95 CALL day_init ! model calendar (using both namelist and restart infos) 96 96 ! ! Initialization of ocean to zero -
NEMO/trunk/src/OCE/DOM/phycst.F90
r10068 r12489 39 39 REAL(wp), PUBLIC :: rt0 = 273.15_wp !: freezing point of fresh water [Kelvin] 40 40 41 REAL(wp), PUBLIC :: r au0 !: volumic mass of reference [kg/m3]42 REAL(wp), PUBLIC :: r1_r au0 !: = 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] 43 43 REAL(wp), PUBLIC :: rcp !: ocean specific heat [J/Kelvin] 44 44 REAL(wp), PUBLIC :: r1_rcp !: = 1. / rcp [Kelvin/J] 45 REAL(wp), PUBLIC :: r au0_rcp !: = rau0 * rcp46 REAL(wp), PUBLIC :: r1_r au0_rcp !: = 1. / ( rau0 * rcp )45 REAL(wp), PUBLIC :: rho0_rcp !: = rho0 * rcp 46 REAL(wp), PUBLIC :: r1_rho0_rcp !: = 1. / ( rho0 * rcp ) 47 47 48 48 REAL(wp), PUBLIC :: emic = 0.97_wp !: emissivity of snow or ice (not used?)
Note: See TracChangeset
for help on using the changeset viewer.