Changeset 1130
- Timestamp:
- 2008-06-24T17:00:56+02:00 (16 years ago)
- Location:
- trunk/NEMO/OPA_SRC
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/NEMO/OPA_SRC/DOM/domain.F90
r1102 r1130 16 16 USE sbc_oce ! surface boundary condition: ocean 17 17 USE phycst ! physical constants 18 USE daymod ! calendar19 18 USE in_out_manager ! I/O manager 20 19 USE lib_mpp ! distributed memory computing library … … 176 175 WRITE(numout,*) ' multi file dimgout ln_dimgnnn = ', ln_dimgnnn 177 176 ENDIF 178 179 ndastp = ndate0 ! Assign initial date to current date180 177 181 178 ! ... Control of output frequency -
trunk/NEMO/OPA_SRC/daymod.F90
r888 r1130 15 15 !!---------------------------------------------------------------------- 16 16 !! day : calendar 17 !! 18 !! ------------------------------- 19 !! ----------- WARNING ----------- 20 !! 21 !! we suppose that the time step is deviding the number of second of in a day 22 !! ---> MOD( rday, rdttra(1) ) == 0 23 !! 24 !! ----------- WARNING ----------- 25 !! ------------------------------- 26 !! 17 27 !!---------------------------------------------------------------------- 18 28 USE dom_oce ! ocean space and time domain 19 29 USE phycst ! physical constants 20 30 USE in_out_manager ! I/O manager 31 USE iom ! 21 32 USE prtctl ! Print control 33 USE restart ! 22 34 23 35 IMPLICIT NONE … … 25 37 26 38 PUBLIC day ! called by step.F90 39 PUBLIC day_init ! called by istate.F90 27 40 28 41 INTEGER , PUBLIC :: nyear !: current year 29 42 INTEGER , PUBLIC :: nmonth !: current month 30 43 INTEGER , PUBLIC :: nday !: current day of the month 44 INTEGER , PUBLIC :: ndastp !: time step date in yyyymmdd format 31 45 INTEGER , PUBLIC :: nday_year !: current day counted from jan 1st of the current year 32 46 REAL(wp), PUBLIC :: rsec_year !: current time step counted in second since 00h jan 1st of the current year 33 47 REAL(wp), PUBLIC :: rsec_month !: current time step counted in second since 00h 1st day of the current month 34 REAL(wp), PUBLIC :: rsec_day !: current time step counted in second since 00h of the current day 35 INTEGER , PUBLIC :: ndastp !: time step date in year/month/day aammjj 36 37 !!gm supprimer adatrj et adatrj0 ==> remplacer par rsecday..... 48 REAL(wp), PUBLIC :: rsec_day !: current time step counted in second since 00h of the current day 49 38 50 REAL(wp), PUBLIC :: adatrj !: number of elapsed days since the begining of the run 39 REAL(wp), PUBLIC :: adatrj0 !: value of adatrj at nit000-1 (before the present run). 40 ! ! it is the accumulated duration of previous runs 41 ! ! that may have been run with different time steps. 42 INTEGER , PUBLIC, DIMENSION(0:13) :: nmonth_len !: length of the current year 43 51 ! !: it is the accumulated duration of previous runs 52 ! !: that may have been run with different time steps. 53 INTEGER , PUBLIC, DIMENSION(0:1) :: nyear_len !: length in days of the previous/current year 54 INTEGER , PUBLIC, DIMENSION(0:13) :: nmonth_len !: length in days of the months of the current year 55 REAL(wp), PUBLIC, DIMENSION(0:13) :: rmonth_half !: second since the beginning of the year and the halft of the months 56 REAL(wp), PUBLIC, DIMENSION(0:13) :: rmonth_end !: second since the beginning of the year and the end of the months 57 REAL(wp), PUBLIC :: sec1jan000 !: second since Jan. 1st 00h of nit000 year 58 59 ! this two variables are wrong DO NOT USE THEM !!! 44 60 INTEGER, PUBLIC, DIMENSION(12) :: nbiss = (/ 31, 29, 31, 30, 31, 30, & !: number of days per month 45 61 & 31, 31, 30, 31, 30, 31 /) !: (leap-year) … … 47 63 & 31, 31, 30, 31, 30, 31 /) !: (365 days a year) 48 64 49 REAL(wp), PUBLIC, DIMENSION(0:14) :: rmonth_half(0:14)50 65 51 66 !!---------------------------------------------------------------------- … … 57 72 CONTAINS 58 73 74 SUBROUTINE day_init 75 !!---------------------------------------------------------------------- 76 !! *** ROUTINE day_init *** 77 !! 78 !! ** Purpose : Initialization of the calendar values to their values 1 time step before nit000 79 !! because day will be called at the beginning of step 80 !! 81 !! ** Action : - nyear : current year 82 !! - nmonth : current month of the year nyear 83 !! - nday : current day of the month nmonth 84 !! - nday_year : current day of the year nyear 85 !! - rsec_year : current time step counted in second since 00h jan 1st of the current year 86 !! - rsec_month : current time step counted in second since 00h 1st day of the current month 87 !! - rsec_day : current time step counted in second since 00h of the current day 88 !! - sec1jan000 : second since Jan. 1st 00h of nit000 year 89 !! - nmonth_len, nyear_len, rmonth_half, rmonth_end through day_mth 90 !!---------------------------------------------------------------------- 91 92 ! all calendar staff is based on the fact that MOD( rday, rdttra(1) ) == 0 93 IF( MOD( rday, rdttra(1) ) /= 0 ) CALL ctl_stop( 'the time step must devide the number of second of in a day' ) 94 95 CALL day_rst( nit000, 'READ' ) 96 97 ! set the calandar from ndastp (read in restart file and namelist) 98 99 nyear = ndastp / 10000 100 nmonth = ( ndastp - (nyear * 10000) ) / 100 101 nday = ndastp - (nyear * 10000) - ( nmonth * 100 ) 102 103 sec1jan000 = 0.e0 104 CALL day_mth 105 106 IF ( nday == 0 ) THEN ! for ex if ndastp = ndate0 - 1 107 nmonth = nmonth - 1 108 nday = nmonth_len(nmonth) 109 ENDIF 110 IF ( nmonth == 0 ) THEN ! go at the end of previous year 111 nmonth = 12 112 nyear = nyear - 1 113 sec1jan000 = sec1jan000 - rday * REAL( nyear_len(0), wp ) 114 IF( nleapy == 1 ) CALL day_mth 115 ENDIF 116 117 ! day since january 1st 118 nday_year = nday + SUM( nmonth_len(1:nmonth - 1) ) 119 120 ! number of seconds since the beginning of current year/month at the middle of the time-step 121 rsec_year = REAL( nday_year, wp ) * rday - 0.5 * rdttra(1) ! 1 time step before the middle of the first time step 122 rsec_month = REAL( nday , wp ) * rday - 0.5 * rdttra(1) ! because day will be called at the beginning of step 123 rsec_day = rday - 0.5 * rdttra(1) 124 125 ! control print 126 IF(lwp) WRITE(numout,*)' ==============>> One time step before the start of the run DATE Y/M/D = ', & 127 & nyear, '/', nmonth, '/', nday, ' rsec_day:', rsec_day 128 129 END SUBROUTINE day_init 130 131 132 SUBROUTINE day_mth 133 !!---------------------------------------------------------------------- 134 !! *** ROUTINE day_init *** 135 !! 136 !! ** Purpose : calendar values related to the months 137 !! 138 !! ** Action : - nmonth_len : length in days of the months of the current year 139 !! - nyear_len : length in days of the previous/current year 140 !! - rmonth_half : second since the beginning of the year and the halft of the months 141 !! - rmonth_end : second since the beginning of the year and the end of the months 142 !!---------------------------------------------------------------------- 143 INTEGER :: jm ! dummy loop indice 144 !!---------------------------------------------------------------------- 145 146 ! length of the month of the current year (from nleapy, read in namelist) 147 IF ( nleapy < 2 ) THEN 148 nmonth_len(:) = (/ 31, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, 31 /) 149 nyear_len(:) = 365 150 IF ( nleapy == 1 ) THEN ! we are using calandar with leap years 151 IF ( MOD(nyear-1, 4) == 0 .AND. ( MOD(nyear-1, 400) == 0 .OR. MOD(nyear-1, 100) /= 0 ) ) THEN 152 nyear_len(0) = 366 153 ENDIF 154 IF ( MOD(nyear, 4) == 0 .AND. ( MOD(nyear, 400) == 0 .OR. MOD(nyear, 100) /= 0 ) ) THEN 155 nmonth_len(2) = 29 156 nyear_len(1) = 366 157 ENDIF 158 ENDIF 159 ELSE 160 nmonth_len(:) = nleapy ! all months with nleapy days per year 161 nyear_len(:) = 12 * nleapy 162 ENDIF 163 164 ! half month in second since the begining of the year: 165 ! time since Jan 1st 0 1 2 ... 11 12 13 166 ! ---------*--|--*--|--*--| ... |--*--|--*--|--*--|-------------------------------------- 167 ! <---> <---> <---> ... <---> <---> <---> 168 ! month number 0 1 2 ... 11 12 13 169 ! 170 ! rmonth_half(jm) = rday * REAL( 0.5 * nmonth_len(jm) + SUM(nmonth_len(1:jm-1)) ) 171 rmonth_half(0) = - 0.5 * rday * REAL( nmonth_len(0), wp ) 172 DO jm = 1, 13 173 rmonth_half(jm) = rmonth_half(jm-1) + 0.5 * rday * REAL( nmonth_len(jm-1) + nmonth_len(jm), wp ) 174 END DO 175 rmonth_half(:) = rmonth_half(:) + sec1jan000 176 177 rmonth_end(0) = 0. 178 DO jm = 1, 13 179 rmonth_end(jm) = rmonth_end(jm-1) + rday * REAL( nmonth_len(jm), wp ) 180 END DO 181 182 END SUBROUTINE 183 184 59 185 SUBROUTINE day( kt ) 60 186 !!---------------------------------------------------------------------- … … 69 195 !! - nday : current day of the month nmonth 70 196 !! - nday_year : current day of the year nyear 71 !! - ndastp : = nyear*10000+nmonth*100+nday197 !! - ndastp : = nyear*10000 + nmonth*100 + nday 72 198 !! - adatrj : date in days since the beginning of the run 73 199 !! - rsec_year : current time of the year (in second since 00h, jan 1st) … … 75 201 INTEGER, INTENT(in) :: kt ! ocean time-step indices 76 202 ! 77 INTEGER :: js, jm ! dummy loop indice78 203 CHARACTER (len=25) :: charout 79 204 !!---------------------------------------------------------------------- 80 205 81 ! 0. initialization of adatrj0 and nday, nmonth,nyear, nday_year. 82 ! ndastp has been initialized in domain.F90 or restart.F90 83 !----------------------------------------------------------------- 84 85 ! ! ---------------- ! 86 IF( kt == -1 ) THEN ! Initialisation ! 87 ! ! ---------------- ! 88 ! 89 IF( .NOT.ln_rstart ) adatrj0 = 0.e0 ! adatrj0 initialized in rst_read when restart 90 91 ! set the calandar from adatrj0 and ndastp (read in restart file and namelist) 92 adatrj = adatrj0 !???? bug.... toujours rest !!gm 93 nyear = ndastp / 10000 94 nmonth = ( ndastp - (nyear * 10000) ) / 100 95 nday = ndastp - (nyear * 10000) - ( nmonth * 100 ) 96 97 ! length of the month of the current year (from nleapy, read in namelist) 98 nmonth_len(0) = nbiss(12) ; nmonth_len(13) = nbiss(1) 99 SELECT CASE( nleapy ) 100 CASE( 1 ) 101 IF( MOD( nyear, 4 ) == 0 ) THEN 102 ; nmonth_len(1:12) = nbiss(:) ! 366 days per year (leap year) 103 ELSE 104 ; nmonth_len(1:12) = nobis(:) ! 365 days per year 105 ENDIF 106 CASE( 0 ) ; nmonth_len(1:12) = nobis(:) ! 365 days per year 107 CASE( 2: ) ; nmonth_len(1:13) = nleapy ! 12*nleapy days per year 108 END SELECT 109 110 ! half month in second since the bigining of the year 111 rmonth_half(0) = - 0.5 * rday * REAL( nmonth_len( 0 ) ) 112 DO jm = 1, 12 113 rmonth_half(jm) = rmonth_half(jm-1) + 0.5 * rday * REAL( nmonth_len(jm-1) + nmonth_len(jm) ) 114 END DO 115 rmonth_half(13) = rmonth_half( 1 ) + 365. * rday 116 rmonth_half(14) = rmonth_half( 2 ) + 365. * rday 117 118 ! day since january 1st (useful to read daily forcing fields) 119 nday_year = nday 120 DO js = 1, nmonth - 1 ! accumulates days of previous months of this year 121 nday_year = nday_year + nmonth_len(js) 122 END DO 123 124 ! number of seconds since... 125 IF( ln_rstart ) THEN 126 rsec_year = REAL( nday_year ) * rday - rdttra(1) ! 00h 1st day of the current year 127 rsec_month = REAL( nday ) * rday - rdttra(1) ! 00h 1st day of the current month 128 rsec_day = REAL( nday ) * rday - rdttra(1) ! 00h of the current day 206 ! ! New time-step 207 rsec_year = rsec_year + rdttra(1) 208 rsec_month = rsec_month + rdttra(1) 209 rsec_day = rsec_day + rdttra(1) 210 adatrj = adatrj + rdttra(1) / rday 211 212 IF( rsec_day > rday ) THEN ! NEW day 213 ! 214 nday = nday + 1 215 nday_year = nday_year + 1 216 rsec_day = 0.5 * rdttra(1) 217 ! 218 IF( nday == nmonth_len(nmonth) + 1 ) THEN ! NEW month 219 nday = 1 220 nmonth = nmonth + 1 221 rsec_month = 0.5 * rdttra(1) 222 IF( nmonth == 13 ) THEN ! NEW year 223 nyear = nyear + 1 224 nmonth = 1 225 nday_year = 1 226 rsec_year = 0.5 * rdttra(1) 227 sec1jan000 = sec1jan000 + rday * REAL( nyear_len(1), wp ) 228 IF( nleapy == 1 ) CALL day_mth 229 ENDIF 230 ENDIF 231 ! 232 ndastp = nyear * 10000 + nmonth * 100 + nday ! NEW date 233 ! 234 IF(lwp) WRITE(numout,'(a,i8,a,i4,a,i2,a,i2,a,i3)') '======>> time-step =', kt, & 235 & ' New day, DATE Y/M/D = ', nyear, '/', nmonth, '/', nday, ' nday_year = ', nday_year 236 IF(lwp) WRITE(numout,'(a,F9.0,a,F9.0,a,F9.0)') ' rsec_year = ', rsec_year, & 237 & ' rsec_month = ', rsec_month, ' rsec_day = ', rsec_day 238 ENDIF 239 240 IF(ln_ctl) THEN 241 WRITE(charout,FMT="('kt =', I4,' d/m/y =',I2,I2,I4)") kt, nday, nmonth, nyear 242 CALL prt_ctl_info(charout) 243 ENDIF 244 245 IF( lrst_oce ) CALL day_rst( kt, 'WRITE' ) 246 ! 247 END SUBROUTINE day 248 249 250 SUBROUTINE day_rst( kt, cdrw ) 251 !!--------------------------------------------------------------------- 252 !! *** ROUTINE ts_rst *** 253 !! 254 !! ** Purpose : Read or write calendar in restart file: 255 !! 256 !! WRITE(READ) mode: 257 !! kt : number of time step since the begining of the experiment at the 258 !! end of the current(previous) run 259 !! adatrj(0) : number of elapsed days since the begining of the experiment at the 260 !! end of the current(previous) run (REAL -> keep fractions of day) 261 !! ndastp : date at the end of the current(previous) run (coded as yyyymmdd integer) 262 !! 263 !! According to namelist parameter nrstdt, 264 !! nrstdt = 0 no control on the date (nit000 is arbitrary). 265 !! nrstdt = 1 we verify that nit000 is equal to the last 266 !! time step of previous run + 1. 267 !! In both those options, the exact duration of the experiment 268 !! since the beginning (cumulated duration of all previous restart runs) 269 !! is not stored in the restart and is assumed to be (nit000-1)*rdt. 270 !! This is valid is the time step has remained constant. 271 !! 272 !! nrstdt = 2 the duration of the experiment in days (adatrj) 273 !! has been stored in the restart file. 274 !!---------------------------------------------------------------------- 275 INTEGER , INTENT(in) :: kt ! ocean time-step 276 CHARACTER(len=*), INTENT(in) :: cdrw ! "READ"/"WRITE" flag 277 ! 278 REAL(wp) :: zkt, zndastp 279 !!---------------------------------------------------------------------- 280 281 IF( TRIM(cdrw) == 'READ' ) THEN 282 283 IF( iom_varid( numror, 'kt', ldstop = .FALSE. ) > 0 ) THEN 284 ! Get Calendar informations 285 CALL iom_get( numror, 'kt', zkt ) ! last time-step of previous run 286 IF(lwp) THEN 287 WRITE(numout,*) ' *** Info read in restart : ' 288 WRITE(numout,*) ' previous time-step : ', NINT( zkt ) 289 WRITE(numout,*) ' *** restart option' 290 SELECT CASE ( nrstdt ) 291 CASE ( 0 ) ; WRITE(numout,*) ' nrstdt = 0 : no control of nit000' 292 CASE ( 1 ) ; WRITE(numout,*) ' nrstdt = 1 : no control the date at nit000 (use ndate0 read in the namelist)' 293 CASE ( 2 ) ; WRITE(numout,*) ' nrstdt = 2 : calendar parameters read in restart' 294 END SELECT 295 WRITE(numout,*) 296 ENDIF 297 ! Control of date 298 IF( nit000 - NINT( zkt ) /= 1 .AND. nrstdt /= 0 ) & 299 & CALL ctl_stop( ' ===>>>> : problem with nit000 for the restart', & 300 & ' verify the restart file or rerun with nrstdt = 0 (namelist)' ) 301 ! define ndastp and adatrj 302 IF ( nrstdt == 2 ) THEN 303 CALL iom_get( numror, 'ndastp', zndastp ) 304 ndastp = NINT( zndastp ) 305 CALL iom_get( numror, 'adatrj', adatrj ) 306 ELSE 307 ndastp = ndate0 - 1 ! ndate0 read in the namelist in dom_nam 308 adatrj = ( REAL( nit000-1, wp ) * rdttra(1) ) / rday 309 ! note this is wrong if time step has changed during run 310 ENDIF 129 311 ELSE 130 rsec_year = REAL( nday_year - 1 ) * rday - rdttra(1) ! 00h 1st day of the current year 131 rsec_month = REAL( nday - 1 ) * rday - rdttra(1) ! 00h 1st day of the current month 132 rsec_day = - rdttra(1) ! 00h of the current day 133 ENDIF 134 135 ! control print 136 IF(lwp) WRITE(numout,*)' ==============>> time-step =', kt, ' Initial DATE Y/M/D = ', & 137 & nyear, '/', nmonth, '/', nday, ' rsec_day:', rsec_day 138 139 ! ! -------------------------------- ! 140 ELSE ! Model calendar at time-step kt ! 141 ! ! -------------------------------- ! 142 143 rsec_year = rsec_year + rdttra(1) ! New time-step 144 rsec_month = rsec_month + rdttra(1) ! New time-step 145 rsec_day = rsec_day + rdttra(1) ! New time-step 146 147 adatrj = adatrj0 + ( kt - nit000 + 1 ) * rdttra(1) / rday 148 149 IF( rsec_day >= rday ) THEN 150 ! 151 rsec_day = 0.e0 ! NEW day 152 nday = nday + 1 153 nday_year = nday_year + 1 154 ! 155 IF( nday == nmonth_len(nmonth) + 1 ) THEN ! NEW month 156 nday = 1 157 rsec_month = 0.e0 158 nmonth = nmonth + 1 159 IF( nmonth == 13 ) THEN ! NEW year 160 nyear = nyear + 1 161 nmonth = 1 162 nday_year = 1 163 rsec_year = 0.e0 164 ! ! update the length of the month 165 IF( nleapy == 1 ) THEN ! of the current year (if necessary) 166 IF( MOD( nyear, 4 ) == 0 ) THEN 167 nmonth_len(1:12) = nbiss(:) ! 366 days per year (leap year) 168 ELSE 169 nmonth_len(1:12) = nobis(:) ! 365 days per year 170 ENDIF 171 ! half month in second since the bigining of the year 172 rmonth_half(0) = - 0.5 * rday * REAL( nmonth_len( 0 ) ) 173 DO jm = 1, 12 174 rmonth_half(jm) = rmonth_half(jm-1) + 0.5 * rday * REAL( nmonth_len(jm-1) + nmonth_len(jm) ) 175 END DO 176 rmonth_half(13) = rmonth_half( 1 ) + 365. * rday 177 rmonth_half(14) = rmonth_half( 2 ) + 365. * rday 178 ENDIF 179 ENDIF 180 ENDIF 181 182 ! 183 ndastp = nyear * 10000 + nmonth * 100 + nday ! NEW date 184 ! 185 IF(lwp) WRITE(numout,'(a,i8,a,i4,a,i2,a,i2,a,i3)') '======>> time-step =', kt, & 186 & ' New day, DATE Y/M/D = ', nyear, '/', nmonth, '/', nday, ' nday_year = ', nday_year 187 IF(lwp) WRITE(numout,'(a,F9.0,a,F9.0,a,F9.0)') ' rsec_year = ', rsec_year, & 188 & ' rsec_month = ', rsec_month, ' rsec_day = ', rsec_day 189 ENDIF 190 191 IF(ln_ctl) THEN 192 WRITE(charout,FMT="('kt =', I4,' d/m/y =',I2,I2,I4)") kt, nday, nmonth, nyear 193 CALL prt_ctl_info(charout) 194 ENDIF 195 ! 196 ENDIF 197 198 END SUBROUTINE day 312 ndastp = ndate0 - 1 ! ndate0 read in the namelist in dom_nam 313 adatrj = ( REAL( nit000-1, wp ) * rdttra(1) ) / rday 314 ENDIF 315 ! 316 IF(lwp) THEN 317 WRITE(numout,*) ' *** Info used values : ' 318 WRITE(numout,*) ' date ndastp : ', ndastp 319 WRITE(numout,*) ' number of elapsed days since the begining of run : ', adatrj 320 WRITE(numout,*) 321 ENDIF 322 ! 323 ELSEIF( TRIM(cdrw) == 'WRITE' ) THEN 324 ! 325 IF( kt == nitrst ) THEN 326 IF(lwp) WRITE(numout,*) 327 IF(lwp) WRITE(numout,*) 'rst_write : write oce restart file kt =', kt 328 IF(lwp) WRITE(numout,*) '~~~~~~~' 329 ENDIF 330 ! calendar control 331 CALL iom_rstput( kt, nitrst, numrow, 'kt' , REAL( kt , wp) ) ! time-step 332 CALL iom_rstput( kt, nitrst, numrow, 'ndastp' , REAL( ndastp, wp) ) ! date 333 CALL iom_rstput( kt, nitrst, numrow, 'adatrj' , adatrj ) ! number of elapsed days since 334 ! ! the begining of the run [s] 335 ENDIF 336 ! 337 END SUBROUTINE day_rst 199 338 200 339 !!====================================================================== -
trunk/NEMO/OPA_SRC/istate.F90
r900 r1130 81 81 neuler = 1 ! Set time-step indicator at nit000 (leap-frog) 82 82 CALL rst_read ! Read the restart file 83 CALL day ( -1 )! model calendar (using both namelist and restart infos)83 CALL day_init ! model calendar (using both namelist and restart infos) 84 84 ELSE 85 85 ! ! Start from rest 86 86 ! ! --------------- 87 numror = 0 ! define numror = 0 -> no restart file to read 87 88 neuler = 0 ! Set time-step indicator at nit000 (euler forward) 88 adatrj = 0._wp 89 CALL day( -1 ) ! model calendar (using namelist infos) 90 numror = 0 ! define numror = 0 -> no restart file to read 89 CALL day_init ! model calendar (using both namelist and restart infos) 91 90 ! ! Initialization of ocean to zero 92 91 ! before fields ! now fields -
trunk/NEMO/OPA_SRC/restart.F90
r900 r1130 18 18 USE oce ! ocean dynamics and tracers 19 19 USE phycst ! physical constants 20 USE daymod ! calendar21 20 USE cpl_oce, ONLY : lk_cpl ! 22 21 USE in_out_manager ! I/O manager … … 89 88 CASE DEFAULT ; WRITE(numout,*) ' open ocean restart NetCDF file: '//clname 90 89 END SELECT 91 IF( kt == nitrst - 1 ) THEN ; WRITE(numout,*) ' kt = nitrst - 1 = ', kt ,' date= ', ndastp92 ELSE ; WRITE(numout,*) ' kt = ' , kt ,' date= ', ndastp90 IF( kt == nitrst - 1 ) THEN ; WRITE(numout,*) ' kt = nitrst - 1 = ', kt 91 ELSE ; WRITE(numout,*) ' kt = ' , kt 93 92 ENDIF 94 93 ENDIF … … 112 111 INTEGER, INTENT(in) :: kt ! ocean time-step 113 112 !!---------------------------------------------------------------------- 114 115 IF( kt == nitrst ) THEN116 IF(lwp) WRITE(numout,*)117 IF(lwp) WRITE(numout,*) 'rst_write : write oce restart file kt =', kt118 IF(lwp) WRITE(numout,*) '~~~~~~~'119 ENDIF120 121 ! calendar control122 CALL iom_rstput( kt, nitrst, numrow, 'kt' , REAL( kt , wp) ) ! time-step123 CALL iom_rstput( kt, nitrst, numrow, 'ndastp' , REAL( ndastp, wp) ) ! date124 CALL iom_rstput( kt, nitrst, numrow, 'adatrj' , adatrj ) ! number of elapsed days since125 113 ! ! the begining of the run [s] 126 114 CALL iom_rstput( kt, nitrst, numrow, 'rdt' , rdt ) ! dynamics time step … … 179 167 !! for this last three records, the previous characteristics 180 168 !! could be different with those used in the present run. 181 !! 182 !! According to namelist parameter nrstdt, 183 !! nrstdt = 0 no control on the date (nit000 is arbitrary). 184 !! nrstdt = 1 we verify that nit000 is equal to the last 185 !! time step of previous run + 1. 186 !! In both those options, the exact duration of the experiment 187 !! since the beginning (cumulated duration of all previous restart runs) 188 !! is not stored in the restart and is assumed to be (nit000-1)*rdt. 189 !! This is valid is the time step has remained constant. 190 !! 191 !! nrstdt = 2 the duration of the experiment in days (adatrj) 192 !! has been stored in the restart file. 193 !!---------------------------------------------------------------------- 194 REAL(wp) :: zkt, zrdt, zrdttra1, zndastp 169 !!---------------------------------------------------------------------- 170 REAL(wp) :: zrdt, zrdttra1 195 171 !!---------------------------------------------------------------------- 196 172 … … 198 174 WRITE(numout,*) 199 175 SELECT CASE ( jprstlib ) 200 CASE ( jpnf90 ) 201 WRITE(numout,*) 'rst_read : read oce NetCDF restart file' 202 CASE ( jprstdimg ) 203 WRITE(numout,*) 'rst_read : read oce binary restart file' 176 CASE ( jpnf90 ) ; WRITE(numout,*) 'rst_read : read oce NetCDF restart file' 177 CASE ( jprstdimg ) ; WRITE(numout,*) 'rst_read : read oce binary restart file' 204 178 END SELECT 205 179 WRITE(numout,*) '~~~~~~~~' 206 207 WRITE(numout,*) ' *** Info on the present job : '208 WRITE(numout,*) ' time-step : ', nit000209 WRITE(numout,*) ' date ndastp : ', ndastp210 WRITE(numout,*)211 WRITE(numout,*) ' *** restart option'212 SELECT CASE ( nrstdt )213 CASE ( 0 )214 WRITE(numout,*) ' nrstdt = 0 no control of nit000'215 CASE ( 1 )216 WRITE(numout,*) ' nrstdt = 1 we control the date of nit000'217 CASE ( 2 )218 WRITE(numout,*) ' nrstdt = 2 the date adatrj is read in restart file'219 CASE DEFAULT220 WRITE(numout,*) ' ===>>>> nrstdt not equal 0, 1 or 2 : no control of the date'221 WRITE(numout,*) ' ======= ========='222 END SELECT223 WRITE(numout,*)224 180 ENDIF 225 181 226 182 CALL iom_open( 'restart', numror, kiolib = jprstlib ) 227 183 228 ! Calendar informations229 CALL iom_get( numror, 'kt' , zkt ) ! time-step230 CALL iom_get( numror, 'ndastp' , zndastp ) ! date231 IF(lwp) THEN232 WRITE(numout,*)233 WRITE(numout,*) ' *** Info on the restart file read : '234 WRITE(numout,*) ' time-step : ', NINT( zkt )235 WRITE(numout,*) ' date ndastp : ', NINT( zndastp )236 WRITE(numout,*)237 ENDIF238 ! Control of date239 IF( nit000 - NINT( zkt ) /= 1 .AND. nrstdt /= 0 ) &240 & CALL ctl_stop( ' ===>>>> : problem with nit000 for the restart', &241 & ' verify the restart file or rerun with nrstdt = 0 (namelist)' )242 ! re-initialisation of adatrj0243 adatrj0 = ( REAL( nit000-1, wp ) * rdttra(1) ) / rday244 IF ( nrstdt == 2 ) THEN245 ! by default ndatsp has been set to ndate0 in dom_nam246 ! ndate0 has been read in the namelist (standard OPA 8)247 ! here when nrstdt=2 we keep the final date of previous run248 ndastp = NINT( zndastp )249 CALL iom_get( numror, 'adatrj', adatrj ) ! number of elapsed days since the begining of last run250 ENDIF251 184 ! Check dynamics and tracer time-step consistency and force Euler restart if changed 252 185 IF( iom_varid( numror, 'rdt', ldstop = .FALSE. ) > 0 ) THEN … … 258 191 IF( zrdttra1 /= rdttra(1) ) neuler = 0 259 192 ENDIF 260 !261 193 ! ! Read prognostic variables 262 194 CALL iom_get( numror, jpdom_autoglo, 'ub' , ub ) ! before i-component velocity
Note: See TracChangeset
for help on using the changeset viewer.