00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 module seq_timemgr_mod
00025
00026
00027 use ESMF_Mod
00028 use SHR_KIND_mod, only: SHR_KIND_IN, SHR_KIND_R8, SHR_KIND_CS, &
00029 SHR_KIND_CL, SHR_KIND_I8
00030 use seq_comm_mct, only: logunit, loglevel
00031 use shr_sys_mod, only: shr_sys_abort, shr_sys_flush
00032 use shr_cal_mod, only: shr_cal_ymd2date, shr_cal_date2ymd, shr_cal_set
00033
00034 implicit none
00035
00036 private
00037
00038
00039
00040 public :: seq_timemgr_type
00041
00042
00043
00044
00045 public :: seq_timemgr_clockInit
00046 public :: seq_timemgr_clockAdvance
00047 public :: seq_timemgr_clockPrint
00048 public :: seq_timemgr_clockRestart
00049
00050 public :: seq_timemgr_EClockGetData
00051
00052 public :: seq_timemgr_EClockDateInSync
00053 public :: seq_timemgr_alarmSetOn
00054 public :: seq_timemgr_alarmSetOff
00055 public :: seq_timemgr_alarmIsOn
00056
00057
00058 public :: seq_timemgr_restartAlarmIsOn
00059 public :: seq_timemgr_restartAlarmSetOff
00060 public :: seq_timemgr_runAlarmIsOn
00061 public :: seq_timemgr_runAlarmSetOff
00062 public :: seq_timemgr_stopAlarmIsOn
00063 public :: seq_timemgr_historyAlarmIsOn
00064 public :: seq_timemgr_historyAlarmSetOff
00065
00066
00067
00068 integer(SHR_KIND_IN),public :: seq_timemgr_histavg_type
00069 integer(SHR_KIND_IN),public,parameter :: seq_timemgr_type_other = -1
00070 integer(SHR_KIND_IN),public,parameter :: seq_timemgr_type_never = 1
00071 integer(SHR_KIND_IN),public,parameter :: seq_timemgr_type_nhour = 2
00072 integer(SHR_KIND_IN),public,parameter :: seq_timemgr_type_nday = 3
00073 integer(SHR_KIND_IN),public,parameter :: seq_timemgr_type_nmonth = 4
00074 integer(SHR_KIND_IN),public,parameter :: seq_timemgr_type_nyear = 5
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105 private:: seq_timemgr_alarmGet
00106 private:: seq_timemgr_alarmInit
00107 private:: seq_timemgr_ETimeInit
00108 private:: seq_timemgr_ETimeGet
00109 private:: seq_timemgr_EClockInit
00110 private:: seq_timemgr_ESMFDebug
00111 private:: seq_timemgr_ESMFCodeCheck
00112
00113 character(len=*), private, parameter ::
00114 seq_timemgr_noLeap = "NO_LEAP" ,
00115 seq_timemgr_gregorian = "GREGORIAN" ,
00116 seq_timemgr_optNONE = "none" ,
00117 seq_timemgr_optNever = "never" ,
00118 seq_timemgr_optNSteps = "nsteps" ,
00119 seq_timemgr_optNStep = "nstep" ,
00120 seq_timemgr_optNSeconds = "nseconds" ,
00121 seq_timemgr_optNSecond = "nsecond" ,
00122 seq_timemgr_optNMinutes = "nminutes" ,
00123 seq_timemgr_optNMinute = "nminute" ,
00124 seq_timemgr_optNHours = "nhours" ,
00125 seq_timemgr_optNHour = "nhour" ,
00126 seq_timemgr_optNDays = "ndays" ,
00127 seq_timemgr_optNDay = "nday" ,
00128 seq_timemgr_optNMonths = "nmonths" ,
00129 seq_timemgr_optNMonth = "nmonth" ,
00130 seq_timemgr_optNYears = "nyears" ,
00131 seq_timemgr_optNYear = "nyear" ,
00132 seq_timemgr_optMonthly = "monthly" ,
00133 seq_timemgr_optYearly = "yearly" ,
00134 seq_timemgr_optDate = "date" ,
00135 seq_timemgr_optIfdays0 = "ifdays0" ,
00136 seq_timemgr_optEnd = "end"
00137
00138 integer(SHR_KIND_IN),private,parameter :: max_clocks = 6
00139 character(len=*),public,parameter ::
00140 seq_timemgr_clock_drv = 'seq_timemgr_clock_drv' ,
00141 seq_timemgr_clock_atm = 'seq_timemgr_clock_atm' ,
00142 seq_timemgr_clock_lnd = 'seq_timemgr_clock_lnd' ,
00143 seq_timemgr_clock_ocn = 'seq_timemgr_clock_ocn' ,
00144 seq_timemgr_clock_ice = 'seq_timemgr_clock_ice' ,
00145 seq_timemgr_clock_glc = 'seq_timemgr_clock_glc'
00146 integer(SHR_KIND_IN),private,parameter ::
00147 seq_timemgr_nclock_drv = 1,
00148 seq_timemgr_nclock_atm = 2,
00149 seq_timemgr_nclock_lnd = 3,
00150 seq_timemgr_nclock_ocn = 4,
00151 seq_timemgr_nclock_ice = 5,
00152 seq_timemgr_nclock_glc = 6
00153 character(len=8),private,parameter :: seq_timemgr_clocks(max_clocks) =
00154 (/'drv ','atm ','lnd ','ocn ',
00155 'ice ','glc '/)
00156
00157 integer(SHR_KIND_IN),private,parameter :: max_alarms = 13
00158 character(len=*),public,parameter ::
00159 seq_timemgr_alarm_restart = 'seq_timemgr_alarm_restart ',
00160 seq_timemgr_alarm_run = 'seq_timemgr_alarm_run ',
00161 seq_timemgr_alarm_stop = 'seq_timemgr_alarm_stop ',
00162 seq_timemgr_alarm_datestop= 'seq_timemgr_alarm_datestop',
00163 seq_timemgr_alarm_history = 'seq_timemgr_alarm_history ',
00164 seq_timemgr_alarm_atmrun = 'seq_timemgr_alarm_atmrun ',
00165 seq_timemgr_alarm_lndrun = 'seq_timemgr_alarm_lndrun ',
00166 seq_timemgr_alarm_ocnrun = 'seq_timemgr_alarm_ocnrun ',
00167 seq_timemgr_alarm_icerun = 'seq_timemgr_alarm_icerun ',
00168 seq_timemgr_alarm_glcrun = 'seq_timemgr_alarm_glcrun ',
00169 seq_timemgr_alarm_ocnnext = 'seq_timemgr_alarm_ocnnext ',
00170 seq_timemgr_alarm_tprof = 'seq_timemgr_alarm_tprof ',
00171 seq_timemgr_alarm_histavg = 'seq_timemgr_alarm_histavg '
00172 integer(SHR_KIND_IN),private,parameter ::
00173 seq_timemgr_nalarm_restart = 1,
00174 seq_timemgr_nalarm_run = 2,
00175 seq_timemgr_nalarm_stop = 3,
00176 seq_timemgr_nalarm_datestop= 4,
00177 seq_timemgr_nalarm_history = 5,
00178 seq_timemgr_nalarm_atmrun = 6,
00179 seq_timemgr_nalarm_lndrun = 7,
00180 seq_timemgr_nalarm_ocnrun = 8,
00181 seq_timemgr_nalarm_icerun = 9,
00182 seq_timemgr_nalarm_glcrun =10,
00183 seq_timemgr_nalarm_ocnnext =11,
00184 seq_timemgr_nalarm_tprof =12,
00185 seq_timemgr_nalarm_histavg =13
00186
00187 type EClock_pointer
00188 type(ESMF_Clock),pointer :: EClock
00189 end type EClock_pointer
00190 type seq_timemgr_type
00191 private
00192 type(EClock_pointer) :: ECP(max_clocks)
00193 type(ESMF_Alarm) :: EAlarm(max_clocks,max_alarms)
00194 end type seq_timemgr_type
00195
00196
00197
00198
00199 integer, parameter :: nrestvar = 6
00200 character(len=*),parameter :: restname(nrestvar) =
00201 (/'start_ymd ','start_tod ','ref_ymd ','ref_tod ',
00202 'curr_ymd ','curr_tod '/)
00203 character(len=*),parameter :: restlnam(nrestvar) =
00204 (/'clock start date','clock start tod ','clock ref date ','clock ref tod ',
00205 'clock curr date ','clock curr tod '/)
00206 character(len=*),parameter :: restunit(nrestvar) =
00207 (/'date [YYYYMMDD] ','seconds ','date [YYYYMMDD] ','seconds ',
00208 'date [YYYYMMDD] ','seconds '/)
00209 character(len=*),parameter :: resttype(nrestvar) =
00210 (/'integer ','integer ','integer ','integer ',
00211 'integer ','integer '/)
00212 integer(SHR_KIND_IN) :: rest_start_ymd
00213 integer(SHR_KIND_IN) :: rest_start_tod
00214 integer(SHR_KIND_IN) :: rest_ref_ymd
00215 integer(SHR_KIND_IN) :: rest_ref_tod
00216 integer(SHR_KIND_IN) :: rest_curr_ymd
00217 integer(SHR_KIND_IN) :: rest_curr_tod
00218
00219 type(ESMF_Calendar), target, save :: seq_timemgr_cal
00220 character(len=SHR_KIND_CS),save :: seq_timemgr_calendar
00221 logical :: seq_timemgr_end_restart
00222 logical, save :: seq_timemgr_setCalendar = .false.
00223 integer, parameter :: SecPerDay = 86400
00224
00225
00226
00227 contains
00228
00229
00230
00231
00232
00233
00234
00235
00236
00237
00238
00239 subroutine seq_timemgr_clockInit(SyncClock, nmlfile, restart, restart_file, mpicom, &
00240 EClock_drv, EClock_atm, EClock_lnd, EClock_ocn, EClock_ice, Eclock_glc)
00241
00242
00243 use shr_string_mod, only : shr_string_toupper
00244 use shr_file_mod, only : shr_file_getunit, shr_file_freeunit
00245 use shr_mpi_mod, only : shr_mpi_bcast
00246
00247 implicit none
00248
00249
00250
00251 type(seq_timemgr_type), intent(INOUT) :: SyncClock
00252 character(len=*), intent(IN) :: nmlfile
00253 integer, intent(IN) :: mpicom
00254 logical, intent(IN) :: restart
00255 character(len=*), intent(IN) :: restart_file
00256 type(ESMF_clock),target,intent(IN) :: EClock_drv
00257 type(ESMF_clock),target,intent(IN) :: EClock_atm
00258 type(ESMF_clock),target,intent(IN) :: EClock_lnd
00259 type(ESMF_clock),target,intent(IN) :: EClock_ocn
00260 type(ESMF_clock),target,intent(IN) :: EClock_ice
00261 type(ESMF_clock),target,intent(IN) :: EClock_glc
00262
00263
00264
00265
00266 character(len=*), parameter :: subname = '(seq_timemgr_clockInit) '
00267 type(ESMF_Time) :: StartTime
00268 type(ESMF_Time) :: RefTime
00269 type(ESMF_Time) :: CurrTime
00270 type(ESMF_Time) :: OffsetTime
00271 type(ESMF_Time) :: StopTime1
00272 type(ESMF_Time) :: StopTime2
00273 type(ESMF_TimeInterval) :: TimeStep
00274 type(ESMF_TimeInterval) :: AlarmInterval
00275 type(ESMF_CalendarType) :: esmf_caltype
00276 integer :: rc
00277 integer :: n
00278 integer :: dtime(max_clocks)
00279 integer :: offset(max_clocks)
00280 integer :: unitn
00281 integer :: iam
00282
00283 character(SHR_KIND_CS) :: calendar
00284 character(SHR_KIND_CS) :: stop_option
00285 integer(SHR_KIND_IN) :: stop_n
00286 integer(SHR_KIND_IN) :: stop_ymd
00287 integer(SHR_KIND_IN) :: stop_tod
00288 character(SHR_KIND_CS) :: restart_option
00289 integer(SHR_KIND_IN) :: restart_n
00290 integer(SHR_KIND_IN) :: restart_ymd
00291 character(SHR_KIND_CS) :: history_option
00292 integer(SHR_KIND_IN) :: history_n
00293 integer(SHR_KIND_IN) :: history_ymd
00294 character(SHR_KIND_CS) :: histavg_option
00295 integer(SHR_KIND_IN) :: histavg_n
00296 integer(SHR_KIND_IN) :: histavg_ymd
00297 character(SHR_KIND_CS) :: tprof_option
00298 integer(SHR_KIND_IN) :: tprof_n
00299 integer(SHR_KIND_IN) :: tprof_ymd
00300 integer(SHR_KIND_IN) :: start_ymd
00301 integer(SHR_KIND_IN) :: start_tod
00302 integer(SHR_KIND_IN) :: curr_ymd
00303 integer(SHR_KIND_IN) :: curr_tod
00304 integer(SHR_KIND_IN) :: ref_ymd
00305 integer(SHR_KIND_IN) :: ref_tod
00306 integer(SHR_KIND_IN) :: atm_cpl_dt
00307 integer(SHR_KIND_IN) :: lnd_cpl_dt
00308 integer(SHR_KIND_IN) :: ice_cpl_dt
00309 integer(SHR_KIND_IN) :: ocn_cpl_dt
00310 integer(SHR_KIND_IN) :: glc_cpl_dt
00311 integer(SHR_KIND_IN) :: atm_cpl_offset
00312 integer(SHR_KIND_IN) :: lnd_cpl_offset
00313 integer(SHR_KIND_IN) :: ice_cpl_offset
00314 integer(SHR_KIND_IN) :: ocn_cpl_offset
00315 integer(SHR_KIND_IN) :: glc_cpl_offset
00316 logical :: end_restart
00317 integer(SHR_KIND_IN) :: nlUnit
00318 integer(SHR_KIND_IN) :: ierr
00319
00320 character(len=*), parameter :: F0A = "(2A,A)"
00321 character(len=*), parameter :: F0I = "(2A,I10)"
00322 character(len=*), parameter :: F0L = "(2A,L3)"
00323
00324 namelist /seq_timemgr_inparm/ calendar, curr_ymd, curr_tod, &
00325 stop_option, stop_n, stop_ymd, stop_tod, &
00326 restart_option, restart_n, restart_ymd, &
00327 history_option, history_n, history_ymd, &
00328 histavg_option, histavg_n, histavg_ymd, &
00329 tprof_option, tprof_n, tprof_ymd, &
00330 start_ymd, start_tod, ref_ymd, ref_tod, &
00331 atm_cpl_dt, ocn_cpl_dt, ice_cpl_dt, lnd_cpl_dt, &
00332 atm_cpl_offset, lnd_cpl_offset, ocn_cpl_offset, &
00333 ice_cpl_offset, glc_cpl_dt, glc_cpl_offset, &
00334 end_restart
00335
00336
00337
00338
00339 SyncClock%ECP(seq_timemgr_nclock_drv)%EClock => EClock_drv
00340 SyncClock%ECP(seq_timemgr_nclock_atm)%EClock => EClock_atm
00341 SyncClock%ECP(seq_timemgr_nclock_lnd)%EClock => EClock_lnd
00342 SyncClock%ECP(seq_timemgr_nclock_ocn)%EClock => EClock_ocn
00343 SyncClock%ECP(seq_timemgr_nclock_ice)%EClock => EClock_ice
00344 SyncClock%ECP(seq_timemgr_nclock_glc)%EClock => EClock_glc
00345
00346 call mpi_comm_rank(mpicom,iam,ierr)
00347
00348
00349
00350
00351
00352 if (iam == 0) then
00353
00354
00355
00356
00357 calendar = seq_timemgr_noLeap
00358 stop_option = ' '
00359 stop_n = -1
00360 stop_ymd = -1
00361 stop_tod = 0
00362 restart_option = seq_timemgr_optYearly
00363 restart_n = -1
00364 restart_ymd = -1
00365 history_option = seq_timemgr_optNever
00366 history_n = -1
00367 history_ymd = -1
00368 histavg_option = seq_timemgr_optNever
00369 histavg_n = -1
00370 histavg_ymd = -1
00371 tprof_option = seq_timemgr_optNever
00372 tprof_n = -1
00373 tprof_ymd = -1
00374 start_ymd = 0
00375 start_tod = 0
00376 ref_ymd = 0
00377 ref_tod = 0
00378 curr_ymd = 0
00379 curr_tod = 0
00380 atm_cpl_dt = 0
00381 lnd_cpl_dt = 0
00382 ice_cpl_dt = 0
00383 ocn_cpl_dt = 0
00384 glc_cpl_dt = 0
00385 atm_cpl_offset = 0
00386 lnd_cpl_offset = 0
00387 ice_cpl_offset = 0
00388 ocn_cpl_offset = 0
00389 glc_cpl_offset = 0
00390 end_restart = .true.
00391
00392
00393
00394
00395 unitn = shr_file_getUnit()
00396 write(logunit,F0A) trim(subname),' Read in seq_timemgr_inparm namelist from: '//trim(nmlfile)
00397 open( unitn, file=trim(nmlfile), status='old' )
00398 ierr = 1
00399 do while( ierr /= 0 )
00400 read(unitn,nml=seq_timemgr_inparm,iostat=ierr)
00401 if (ierr < 0) then
00402 call shr_sys_abort( subname//':: namelist read returns an'// &
00403 ' end of file or end of record condition' )
00404 end if
00405 end do
00406 close(unitn)
00407 call shr_file_freeUnit( unitn )
00408
00409
00410
00411
00412 if (restart) then
00413 call seq_timemgr_clockRestart('read', SyncClock, restart_file)
00414 start_ymd = rest_start_ymd
00415 start_tod = rest_start_tod
00416 ref_ymd = rest_ref_ymd
00417 ref_tod = rest_ref_tod
00418 curr_ymd = rest_curr_ymd
00419 curr_tod = rest_curr_tod
00420 endif
00421
00422
00423
00424
00425
00426 if (lnd_cpl_dt == 0) lnd_cpl_dt = atm_cpl_dt
00427 if (ice_cpl_dt == 0) ice_cpl_dt = atm_cpl_dt
00428 if (ocn_cpl_dt == 0) ocn_cpl_dt = atm_cpl_dt
00429 if (glc_cpl_dt == 0) glc_cpl_dt = atm_cpl_dt
00430
00431 if ( ref_ymd == 0 ) then
00432 ref_ymd = start_ymd
00433 ref_tod = start_tod
00434 endif
00435
00436 if ( curr_ymd == 0 ) then
00437 curr_ymd = start_ymd
00438 curr_tod = start_tod
00439 endif
00440
00441 if ( stop_ymd < 0) then
00442 stop_ymd = 99990101
00443 stop_tod = 0
00444 endif
00445
00446 if (trim(restart_option) == trim(seq_timemgr_optNone) .or. &
00447 trim(restart_option) == trim(seq_timemgr_optNever)) then
00448 if (end_restart) then
00449 end_restart = .false.
00450 write(logunit,F0A) trim(subname),' WARNING: overriding end_restart to '// &
00451 'false based on restart_option '
00452 endif
00453 endif
00454
00455 if (trim(restart_option) == trim(seq_timemgr_optEnd)) then
00456 restart_option = seq_timemgr_optNone
00457 write(logunit,F0A) trim(subname),' WARNING: overriding restart_option to '// &
00458 'none and verifying end_restart flag is true '
00459 if (.not. end_restart) then
00460 end_restart = .true.
00461 write(logunit,F0A) trim(subname),' WARNING: overriding end_restart to '// &
00462 'true based on restart_option (end) '
00463 endif
00464 endif
00465
00466
00467
00468
00469
00470 write(logunit,F0A) ' '
00471 write(logunit,F0A) trim(subname),' Clock Init Settings:'
00472 write(logunit,F0A) trim(subname),' calendar = ',trim(calendar)
00473 write(logunit,F0A) trim(subname),' stop_option = ',trim(stop_option)
00474 write(logunit,F0I) trim(subname),' stop_n = ',stop_n
00475 write(logunit,F0I) trim(subname),' stop_ymd = ',stop_ymd
00476 write(logunit,F0I) trim(subname),' stop_tod = ',stop_tod
00477 write(logunit,F0A) trim(subname),' restart_option = ',trim(restart_option)
00478 write(logunit,F0I) trim(subname),' restart_n = ',restart_n
00479 write(logunit,F0I) trim(subname),' restart_ymd = ',restart_ymd
00480 write(logunit,F0L) trim(subname),' end_restart = ',end_restart
00481 write(logunit,F0A) trim(subname),' history_option = ',trim(history_option)
00482 write(logunit,F0I) trim(subname),' history_n = ',history_n
00483 write(logunit,F0I) trim(subname),' history_ymd = ',history_ymd
00484 write(logunit,F0A) trim(subname),' histavg_option = ',trim(histavg_option)
00485 write(logunit,F0I) trim(subname),' histavg_n = ',histavg_n
00486 write(logunit,F0I) trim(subname),' histavg_ymd = ',histavg_ymd
00487 write(logunit,F0A) trim(subname),' tprof_option = ',trim(tprof_option)
00488 write(logunit,F0I) trim(subname),' tprof_n = ',tprof_n
00489 write(logunit,F0I) trim(subname),' tprof_ymd = ',tprof_ymd
00490 write(logunit,F0I) trim(subname),' start_ymd = ',start_ymd
00491 write(logunit,F0I) trim(subname),' start_tod = ',start_tod
00492 write(logunit,F0I) trim(subname),' ref_ymd = ',ref_ymd
00493 write(logunit,F0I) trim(subname),' ref_tod = ',ref_tod
00494 write(logunit,F0I) trim(subname),' atm_cpl_dt = ',atm_cpl_dt
00495 write(logunit,F0I) trim(subname),' lnd_cpl_dt = ',lnd_cpl_dt
00496 write(logunit,F0I) trim(subname),' ice_cpl_dt = ',ice_cpl_dt
00497 write(logunit,F0I) trim(subname),' ocn_cpl_dt = ',ocn_cpl_dt
00498 write(logunit,F0I) trim(subname),' glc_cpl_dt = ',glc_cpl_dt
00499 write(logunit,F0I) trim(subname),' atm_cpl_offset = ',atm_cpl_offset
00500 write(logunit,F0I) trim(subname),' lnd_cpl_offset = ',lnd_cpl_offset
00501 write(logunit,F0I) trim(subname),' ice_cpl_offset = ',ice_cpl_offset
00502 write(logunit,F0I) trim(subname),' ocn_cpl_offset = ',ocn_cpl_offset
00503 write(logunit,F0I) trim(subname),' glc_cpl_offset = ',glc_cpl_offset
00504 write(logunit,F0A) ' '
00505
00506
00507
00508
00509
00510
00511 if ( atm_cpl_dt <= 0 .or. &
00512 lnd_cpl_dt /= atm_cpl_dt .or. &
00513 ice_cpl_dt /= atm_cpl_dt .or. &
00514 ocn_cpl_dt <= 0 .or. glc_cpl_dt <= 0) then
00515 write(logunit,*) trim(subname),' ERROR: aliog _cpl_dt = ', &
00516 atm_cpl_dt, lnd_cpl_dt, ice_cpl_dt, ocn_cpl_dt, glc_cpl_dt
00517 call shr_sys_abort( subname//': ERROR coupling intervals invalid' )
00518 end if
00519
00520
00521 if ( abs(atm_cpl_offset) > atm_cpl_dt .or. &
00522 abs(lnd_cpl_offset) > lnd_cpl_dt .or. &
00523 abs(ice_cpl_offset) > ice_cpl_dt .or. &
00524 abs(glc_cpl_offset) > glc_cpl_dt .or. &
00525 abs(ocn_cpl_offset) > ocn_cpl_dt) then
00526 write(logunit,*) trim(subname),' ERROR: aliog _cpl_offset = ', &
00527 atm_cpl_offset, lnd_cpl_offset, ice_cpl_offset, ocn_cpl_offset, &
00528 glc_cpl_offset
00529 call shr_sys_abort( subname//': ERROR coupling intervals invalid' )
00530 end if
00531
00532
00533 if ( (start_ymd < 101) .or. (start_ymd > 99991231)) then
00534 write(logunit,*) subname,' ERROR: illegal start_ymd',start_ymd
00535 call shr_sys_abort( subname//': ERROR invalid start_ymd')
00536 end if
00537
00538 endif
00539
00540
00541
00542
00543 call shr_mpi_bcast( calendar, mpicom )
00544 call shr_mpi_bcast( stop_n, mpicom )
00545 call shr_mpi_bcast( stop_option, mpicom )
00546 call shr_mpi_bcast( stop_ymd, mpicom )
00547 call shr_mpi_bcast( stop_tod, mpicom )
00548 call shr_mpi_bcast( restart_n, mpicom )
00549 call shr_mpi_bcast( restart_option, mpicom )
00550 call shr_mpi_bcast( restart_ymd, mpicom )
00551 call shr_mpi_bcast( history_n, mpicom )
00552 call shr_mpi_bcast( history_option, mpicom )
00553 call shr_mpi_bcast( history_ymd, mpicom )
00554 call shr_mpi_bcast( histavg_n, mpicom )
00555 call shr_mpi_bcast( histavg_option, mpicom )
00556 call shr_mpi_bcast( histavg_ymd, mpicom )
00557 call shr_mpi_bcast( tprof_n, mpicom )
00558 call shr_mpi_bcast( tprof_option, mpicom )
00559 call shr_mpi_bcast( tprof_ymd, mpicom )
00560 call shr_mpi_bcast( start_ymd, mpicom )
00561 call shr_mpi_bcast( start_tod, mpicom )
00562 call shr_mpi_bcast( ref_ymd, mpicom )
00563 call shr_mpi_bcast( ref_tod, mpicom )
00564 call shr_mpi_bcast( curr_ymd, mpicom )
00565 call shr_mpi_bcast( curr_tod, mpicom )
00566 call shr_mpi_bcast( atm_cpl_dt, mpicom )
00567 call shr_mpi_bcast( lnd_cpl_dt, mpicom )
00568 call shr_mpi_bcast( ice_cpl_dt, mpicom )
00569 call shr_mpi_bcast( ocn_cpl_dt, mpicom )
00570 call shr_mpi_bcast( glc_cpl_dt, mpicom )
00571 call shr_mpi_bcast( atm_cpl_offset, mpicom )
00572 call shr_mpi_bcast( lnd_cpl_offset, mpicom )
00573 call shr_mpi_bcast( ice_cpl_offset, mpicom )
00574 call shr_mpi_bcast( ocn_cpl_offset, mpicom )
00575 call shr_mpi_bcast( glc_cpl_offset, mpicom )
00576 call shr_mpi_bcast( end_restart, mpicom )
00577
00578
00579 if (trim(histavg_option) == trim(seq_timemgr_optNever) .or. &
00580 trim(histavg_option) == trim(seq_timemgr_optNone)) then
00581 seq_timemgr_histavg_type = seq_timemgr_type_never
00582 elseif (trim(histavg_option) == trim(seq_timemgr_optNHours) .or. &
00583 trim(histavg_option) == trim(seq_timemgr_optNHour)) then
00584 seq_timemgr_histavg_type = seq_timemgr_type_nhour
00585 elseif (trim(histavg_option) == trim(seq_timemgr_optNDays) .or. &
00586 trim(histavg_option) == trim(seq_timemgr_optNDay)) then
00587 seq_timemgr_histavg_type = seq_timemgr_type_nday
00588 elseif (trim(histavg_option) == trim(seq_timemgr_optNMonths) .or. &
00589 trim(histavg_option) == trim(seq_timemgr_optNMonth) .or. &
00590 trim(histavg_option) == trim(seq_timemgr_optMonthly)) then
00591 seq_timemgr_histavg_type = seq_timemgr_type_nmonth
00592 elseif (trim(histavg_option) == trim(seq_timemgr_optNYears) .or. &
00593 trim(histavg_option) == trim(seq_timemgr_optNYear) .or. &
00594 trim(histavg_option) == trim(seq_timemgr_optYearly)) then
00595 seq_timemgr_histavg_type = seq_timemgr_type_nyear
00596 else
00597 seq_timemgr_histavg_type = seq_timemgr_type_other
00598 endif
00599
00600
00601
00602 seq_timemgr_calendar = shr_string_toUpper(calendar)
00603 seq_timemgr_end_restart = end_restart
00604
00605
00606 if ( trim(seq_timemgr_calendar) == seq_timemgr_noLeap ) then
00607 esmf_caltype = ESMF_CAL_NOLEAP
00608 call shr_cal_set('noleap')
00609 else if ( trim(seq_timemgr_calendar) == seq_timemgr_Gregorian ) then
00610 esmf_caltype = ESMF_CAL_GREGORIAN
00611 call shr_cal_set('gregorian')
00612 else
00613 write(logunit,*) subname//': unrecognized calendar specified: '// &
00614 trim(seq_timemgr_calendar)
00615 call shr_sys_abort( subname//'ERROR:: bad calendar for ESMF' )
00616 end if
00617
00618 seq_timemgr_cal = ESMF_CalendarCreate( name='CCSM_'//seq_timemgr_calendar, &
00619 calendarType=esmf_caltype, rc=rc )
00620 call seq_timemgr_ESMFCodeCheck( rc, subname//': error return from ESMF_CalendarCreate' )
00621
00622
00623
00624 call seq_timemgr_ETimeInit( StartTime, start_ymd, start_tod, "Start date" )
00625 call seq_timemgr_ETimeInit( RefTime , ref_ymd , ref_tod , "Reference date" )
00626 call seq_timemgr_ETimeInit( CurrTime , curr_ymd , curr_tod , "Current date")
00627
00628
00629
00630 dtime = 0
00631 dtime(seq_timemgr_nclock_atm ) = atm_cpl_dt
00632 dtime(seq_timemgr_nclock_lnd ) = lnd_cpl_dt
00633 dtime(seq_timemgr_nclock_ocn ) = ocn_cpl_dt
00634 dtime(seq_timemgr_nclock_ice ) = ice_cpl_dt
00635 dtime(seq_timemgr_nclock_glc ) = glc_cpl_dt
00636
00637
00638 dtime(seq_timemgr_nclock_drv) = maxval(dtime)
00639 dtime(seq_timemgr_nclock_drv) = minval(dtime)
00640
00641 do n = 1,max_clocks
00642 if ( mod(dtime(n),dtime(seq_timemgr_nclock_drv)) /= 0) then
00643 write(logunit,*) trim(subname),' ERROR: dtime inconsistent = ',dtime
00644 call shr_sys_abort( subname//' :coupling intervals not compatible' )
00645 endif
00646 enddo
00647
00648
00649
00650 do n = 1,max_clocks
00651 call ESMF_TimeIntervalSet( TimeStep, s=dtime(n), rc=rc )
00652 call seq_timemgr_ESMFCodeCheck( rc, subname//': error ESMF_TimeIntervalSet' )
00653
00654 call seq_timemgr_EClockInit( TimeStep, StartTime, RefTime, CurrTime, SyncClock%ECP(n)%EClock)
00655
00656 call seq_timemgr_alarmInit(SyncClock%ECP(n)%EClock, &
00657 EAlarm = SyncClock%EAlarm(n,seq_timemgr_nalarm_run), &
00658 option = seq_timemgr_optNSeconds, &
00659 opt_n = dtime(n), RefTime = CurrTime, &
00660 alarmname = trim(seq_timemgr_alarm_run))
00661
00662 call seq_timemgr_alarmInit(SyncClock%ECP(n)%EClock, &
00663 EAlarm = SyncClock%EAlarm(n,seq_timemgr_nalarm_stop), &
00664 option = stop_option, &
00665 opt_n = stop_n, &
00666 opt_ymd = stop_ymd, &
00667 opt_tod = stop_tod, &
00668 RefTime = CurrTime, &
00669 alarmname = trim(seq_timemgr_alarm_stop))
00670
00671 call seq_timemgr_alarmInit(SyncClock%ECP(n)%EClock, &
00672 EAlarm = SyncClock%EAlarm(n,seq_timemgr_nalarm_datestop), &
00673 option = seq_timemgr_optDate, &
00674 opt_ymd = stop_ymd, &
00675 opt_tod = stop_tod, &
00676 RefTime = StartTime, &
00677 alarmname = trim(seq_timemgr_alarm_datestop))
00678
00679 call seq_timemgr_alarmInit(SyncClock%ECP(n)%EClock, &
00680 EAlarm = SyncClock%EAlarm(n,seq_timemgr_nalarm_restart), &
00681 option = restart_option, &
00682 opt_n = restart_n, &
00683 opt_ymd = restart_ymd, &
00684 RefTime = CurrTime, &
00685 alarmname = trim(seq_timemgr_alarm_restart))
00686
00687 call seq_timemgr_alarmInit(SyncClock%ECP(n)%EClock, &
00688 EAlarm = SyncClock%EAlarm(n,seq_timemgr_nalarm_history), &
00689 option = history_option, &
00690 opt_n = history_n, &
00691 opt_ymd = history_ymd, &
00692 RefTime = StartTime, &
00693 alarmname = trim(seq_timemgr_alarm_history))
00694
00695 call seq_timemgr_alarmInit(SyncClock%ECP(n)%EClock, &
00696 EAlarm = SyncClock%EAlarm(n,seq_timemgr_nalarm_histavg), &
00697 option = histavg_option, &
00698 opt_n = histavg_n, &
00699 opt_ymd = histavg_ymd, &
00700 RefTime = StartTime, &
00701 alarmname = trim(seq_timemgr_alarm_histavg))
00702
00703 call seq_timemgr_alarmInit(SyncClock%ECP(n)%EClock, &
00704 EAlarm = SyncClock%EAlarm(n,seq_timemgr_nalarm_tprof), &
00705 option = tprof_option, &
00706 opt_n = tprof_n, &
00707 opt_ymd = tprof_ymd, &
00708 RefTime = StartTime, &
00709 alarmname = trim(seq_timemgr_alarm_tprof))
00710
00711 call ESMF_AlarmGet(SyncClock%EAlarm(n,seq_timemgr_nalarm_stop), RingTime=StopTime1, rc=rc )
00712 call ESMF_AlarmGet(SyncClock%EAlarm(n,seq_timemgr_nalarm_datestop), RingTime=StopTime2, rc=rc )
00713 if (StopTime2 < StopTime1) then
00714 call ESMF_ClockSet(SyncClock%ECP(n)%EClock, StopTime=StopTime2)
00715 else
00716 call ESMF_ClockSet(SyncClock%ECP(n)%EClock, StopTime=StopTime1)
00717 endif
00718
00719 enddo
00720
00721
00722
00723
00724
00725
00726
00727
00728
00729
00730
00731
00732 offset(seq_timemgr_nclock_drv) = 0
00733 offset(seq_timemgr_nclock_atm) = atm_cpl_offset
00734 offset(seq_timemgr_nclock_lnd) = lnd_cpl_offset
00735 offset(seq_timemgr_nclock_ocn) = ocn_cpl_offset
00736 offset(seq_timemgr_nclock_ice) = ice_cpl_offset
00737 offset(seq_timemgr_nclock_glc) = glc_cpl_offset
00738
00739 do n = 1,max_clocks
00740 if (abs(offset(n)) > dtime(n)) then
00741 write(logunit,*) subname,' ERROR: offset too large',n,dtime(n),offset(n)
00742 call shr_sys_abort()
00743 endif
00744
00745
00746 offset(n) = offset(n) + dtime(seq_timemgr_nclock_drv)
00747
00748 if (mod(offset(n),dtime(seq_timemgr_nclock_drv)) /= 0) then
00749 write(logunit,*) subname,' ERROR: offset not multiple',n,dtime(seq_timemgr_nclock_drv),offset(n)
00750 call shr_sys_abort()
00751 endif
00752 enddo
00753
00754
00755
00756 call ESMF_TimeIntervalSet( TimeStep, s=offset(seq_timemgr_nclock_atm), rc=rc )
00757 OffsetTime = CurrTime + TimeStep
00758 call seq_timemgr_alarmInit(SyncClock%ECP(seq_timemgr_nclock_drv)%EClock, &
00759 EAlarm = SyncClock%EAlarm(seq_timemgr_nclock_drv,seq_timemgr_nalarm_atmrun), &
00760 option = seq_timemgr_optNSeconds, &
00761 opt_n = dtime(seq_timemgr_nclock_atm), &
00762 RefTime = OffsetTime, &
00763 alarmname = trim(seq_timemgr_alarm_atmrun))
00764
00765 call ESMF_TimeIntervalSet( TimeStep, s=offset(seq_timemgr_nclock_lnd), rc=rc )
00766 OffsetTime = CurrTime + TimeStep
00767 call seq_timemgr_alarmInit(SyncClock%ECP(seq_timemgr_nclock_drv)%EClock, &
00768 EAlarm = SyncClock%EAlarm(seq_timemgr_nclock_drv,seq_timemgr_nalarm_lndrun), &
00769 option = seq_timemgr_optNSeconds, &
00770 opt_n = dtime(seq_timemgr_nclock_lnd), &
00771 RefTime = OffsetTime, &
00772 alarmname = trim(seq_timemgr_alarm_lndrun))
00773
00774 call ESMF_TimeIntervalSet( TimeStep, s=offset(seq_timemgr_nclock_ice), rc=rc )
00775 OffsetTime = CurrTime + TimeStep
00776 call seq_timemgr_alarmInit(SyncClock%ECP(seq_timemgr_nclock_drv)%EClock, &
00777 EAlarm = SyncClock%EAlarm(seq_timemgr_nclock_drv,seq_timemgr_nalarm_icerun), &
00778 option = seq_timemgr_optNSeconds, &
00779 opt_n = dtime(seq_timemgr_nclock_ice), &
00780 RefTime = OffsetTime, &
00781 alarmname = trim(seq_timemgr_alarm_icerun))
00782
00783
00784 call ESMF_TimeIntervalSet( TimeStep, s=offset(seq_timemgr_nclock_glc), rc=rc )
00785 OffsetTime = CurrTime + TimeStep
00786 call ESMF_TimeIntervalSet( TimeStep, s=-offset(seq_timemgr_nclock_drv), rc=rc )
00787 OffsetTime = OffsetTime + TimeStep
00788 call seq_timemgr_alarmInit(SyncClock%ECP(seq_timemgr_nclock_drv)%EClock, &
00789 EAlarm = SyncClock%EAlarm(seq_timemgr_nclock_drv,seq_timemgr_nalarm_glcrun), &
00790 option = seq_timemgr_optNSeconds, &
00791 opt_n = dtime(seq_timemgr_nclock_glc), &
00792 RefTime = OffsetTime, &
00793 alarmname = trim(seq_timemgr_alarm_glcrun))
00794
00795 call ESMF_TimeIntervalSet( TimeStep, s=offset(seq_timemgr_nclock_ocn), rc=rc )
00796 OffsetTime = CurrTime + TimeStep
00797 call seq_timemgr_alarmInit(SyncClock%ECP(seq_timemgr_nclock_drv)%EClock, &
00798 EAlarm = SyncClock%EAlarm(seq_timemgr_nclock_drv,seq_timemgr_nalarm_ocnrun), &
00799 option = seq_timemgr_optNSeconds, &
00800 opt_n = dtime(seq_timemgr_nclock_ocn), &
00801 RefTime = OffsetTime, &
00802 alarmname = trim(seq_timemgr_alarm_ocnrun))
00803
00804
00805 call ESMF_TimeIntervalSet( TimeStep, s=offset(seq_timemgr_nclock_ocn), rc=rc )
00806 OffsetTime = CurrTime + TimeStep
00807 call ESMF_TimeIntervalSet( TimeStep, s=-offset(seq_timemgr_nclock_drv), rc=rc )
00808 OffsetTime = OffsetTime + TimeStep
00809 call seq_timemgr_alarmInit(SyncClock%ECP(seq_timemgr_nclock_drv)%EClock, &
00810 EAlarm = SyncClock%EAlarm(seq_timemgr_nclock_drv,seq_timemgr_nalarm_ocnnext), &
00811 option = seq_timemgr_optNSeconds, &
00812 opt_n = dtime(seq_timemgr_nclock_ocn), &
00813 RefTime = OffsetTime, &
00814 alarmname = trim(seq_timemgr_alarm_ocnnext))
00815
00816 end subroutine seq_timemgr_clockInit
00817
00818
00819
00820
00821
00822
00823
00824
00825
00826
00827
00828 subroutine seq_timemgr_EClockGetData( EClock, curr_yr, curr_mon, curr_day, &
00829 curr_ymd, curr_tod, prev_ymd, prev_tod, start_ymd, &
00830 start_tod, StepNo, ref_ymd, ref_tod, &
00831 stop_ymd, stop_tod, dtime, ECurrTime, alarmcount, &
00832 curr_cday, next_cday, curr_time, prev_time, calendar)
00833
00834 implicit none
00835
00836
00837
00838 type(ESMF_Clock), intent(IN) :: EClock
00839 integer(SHR_KIND_IN), intent(OUT), optional :: curr_yr
00840 integer(SHR_KIND_IN), intent(OUT), optional :: curr_mon
00841 integer(SHR_KIND_IN), intent(OUT), optional :: curr_day
00842 integer(SHR_KIND_IN), intent(OUT), optional :: curr_ymd
00843 integer(SHR_KIND_IN), intent(OUT), optional :: curr_tod
00844 integer(SHR_KIND_IN), intent(OUT), optional :: prev_ymd
00845 integer(SHR_KIND_IN), intent(OUT), optional :: prev_tod
00846 integer(SHR_KIND_IN), intent(OUT), optional :: start_ymd
00847 integer(SHR_KIND_IN), intent(OUT), optional :: start_tod
00848 integer(SHR_KIND_IN), intent(OUT), optional :: StepNo
00849 integer(SHR_KIND_IN), intent(OUT), optional :: ref_ymd
00850 integer(SHR_KIND_IN), intent(OUT), optional :: ref_tod
00851 integer(SHR_KIND_IN), intent(OUT), optional :: stop_ymd
00852 integer(SHR_KIND_IN), intent(OUT), optional :: stop_tod
00853 integer(SHR_KIND_IN), intent(OUT), optional :: dtime
00854 integer(SHR_KIND_IN), intent(OUT), optional :: alarmcount
00855 type(ESMF_Time), intent(OUT), optional :: ECurrTime
00856 real(SHR_KIND_R8) , intent(OUT), optional :: curr_cday
00857 real(SHR_KIND_R8) , intent(OUT), optional :: next_cday
00858 real(SHR_KIND_R8) , intent(OUT), optional :: curr_time
00859
00860 real(SHR_KIND_R8) , intent(OUT), optional :: prev_time
00861
00862 character(len=*) , intent(OUT), optional :: calendar
00863
00864
00865
00866
00867 character(len=*), parameter :: subname = '(seq_timemgr_EClockGetData) '
00868 type(ESMF_Time) :: CurrentTime
00869 type(ESMF_Time) :: PreviousTime
00870 type(ESMF_Time) :: StartTime
00871 type(ESMF_Time) :: StopTime
00872 type(ESMF_Time) :: RefTime
00873 type(ESMF_TimeInterval) :: timeStep
00874 type(ESMF_TimeInterval) :: timediff
00875 integer(SHR_KIND_IN) :: rc
00876 integer(SHR_KIND_I8) :: advSteps
00877 integer(SHR_KIND_IN) :: yy, mm, dd, sec
00878 integer(SHR_KIND_IN) :: ymd
00879 integer(SHR_KIND_IN) :: tod
00880 integer(SHR_KIND_IN) :: ldtime
00881 integer(SHR_KIND_IN) :: intyrs
00882 integer(SHR_KIND_IN) :: intmon
00883 integer(SHR_KIND_IN) :: intsec
00884 integer(SHR_KIND_IN) :: days
00885 integer(SHR_KIND_IN) :: seconds
00886 integer(SHR_KIND_IN) :: acount
00887 real(SHR_KIND_R8) :: doy, tmpdoy
00888 real(SHR_KIND_R8),parameter :: c1 = 1.0_SHR_KIND_R8
00889
00890 type(ESMF_Time) :: tmpTime
00891 type(ESMF_TimeInterval) :: tmpDTime
00892
00893
00894
00895
00896 if (present(calendar)) calendar = seq_timemgr_calendar
00897
00898 call ESMF_ClockGet( EClock, currTime=CurrentTime, &
00899 advanceCount=advSteps, prevTime=previousTime, TimeStep=timeStep, &
00900 startTime=StartTime, stopTime=stopTime, refTime=RefTime, &
00901 AlarmCount=acount, rc=rc )
00902 call seq_timemgr_ESMFCodeCheck( rc, msg=subname//"Error from ESMF_ClockGet" )
00903
00904 call ESMF_TimeGet( CurrentTime, yy=yy, mm=mm, dd=dd, s=sec, dayofyear_r8=doy, rc=rc )
00905 call seq_timemgr_ESMFCodeCheck( rc, msg=subname//"Error from ESMF_TimeGet" )
00906 call seq_timemgr_ETimeGet( CurrentTime, ymd=ymd, tod=tod )
00907 call ESMF_TimeIntervalGet( timeStep, s=ldtime, rc=rc )
00908 call seq_timemgr_ESMFCodeCheck( rc, msg=subname//"Error from ESMF_TimeIntervalGet" )
00909
00910 if ( present(curr_yr) ) curr_yr = yy
00911 if ( present(curr_mon) ) curr_mon = mm
00912 if ( present(curr_day) ) curr_day = dd
00913 if ( present(curr_tod) ) curr_tod = tod
00914 if ( present(curr_ymd) ) curr_ymd = ymd
00915 if ( present(ECurrTime)) ECurrTime= CurrentTime
00916 if ( present(StepNo) ) StepNo = advSteps
00917 if ( present(dtime) ) dtime = ldtime
00918 if ( present(curr_cday)) curr_cday = doy
00919 if ( present(alarmcount)) alarmcount = acount
00920 if ( present(next_cday)) then
00921 call ESMF_TimeSet(tmpTime, yy=yy, mm=mm, dd=dd, s=tod, calendar=seq_timemgr_cal, rc=rc )
00922 call seq_timemgr_ESMFCodeCheck( rc, msg=subname//"Error from TimeSet tmpTime")
00923 call ESMF_TimeIntervalSet( tmpDTime, d=1, rc=rc )
00924 call seq_timemgr_ESMFCodeCheck( rc, msg=subname//"Error from TimeIntSet tmpDTime")
00925 tmpTime = tmpTime + tmpDTime
00926 call ESMF_TimeGet(tmpTime, dayOfYear_r8=tmpdoy, rc=rc)
00927 call seq_timemgr_ESMFCodeCheck( rc, msg=subname//"Error from TimeGet tmpdoy")
00928 next_cday = tmpdoy
00929 endif
00930
00931
00932 if ( present(curr_time)) then
00933 timediff = CurrentTime - RefTime
00934 call ESMF_TimeIntervalGet(timediff, d=days, s=seconds, rc=rc)
00935 call seq_timemgr_ESMFCodeCheck( rc, msg=subname//"Error from TimeIntervalGet timediff")
00936 curr_time = days + seconds/real(SecPerDay)
00937 end if
00938
00939
00940 if ( present(prev_time)) then
00941 timediff = PreviousTime - RefTime
00942 call ESMF_TimeIntervalGet(timediff, d=days, s=seconds, rc=rc)
00943 call seq_timemgr_ESMFCodeCheck( rc, msg=subname//"Error from TimeIntervalGet timediff")
00944 prev_time = days + seconds/real(SecPerDay)
00945 end if
00946
00947
00948 if ( present(prev_ymd) .or. present(prev_tod) )then
00949 call seq_timemgr_ETimeGet( PreviousTime, ymd=ymd, tod=tod )
00950 if ( present(prev_ymd) ) prev_ymd = ymd
00951 if ( present(prev_tod) ) prev_tod = tod
00952 end if
00953
00954
00955 if ( present(start_ymd) .or. present(start_tod) )then
00956 call seq_timemgr_ETimeGet( StartTime, ymd=ymd, tod=tod )
00957 if ( present(start_ymd) ) start_ymd = ymd
00958 if ( present(start_tod) ) start_tod = tod
00959 end if
00960
00961
00962 if ( present(stop_ymd) .or. present(stop_tod) )then
00963 call seq_timemgr_ETimeGet( stopTime, ymd=ymd, tod=tod )
00964 if ( present(stop_ymd) ) stop_ymd = ymd
00965 if ( present(stop_tod) ) stop_tod = tod
00966 end if
00967
00968
00969 if ( present(ref_ymd) .or. present(ref_tod) )then
00970 call seq_timemgr_ETimeGet( RefTime, ymd=ymd, tod=tod )
00971 if ( present(ref_ymd) ) ref_ymd = ymd
00972 if ( present(ref_tod) ) ref_tod = tod
00973 end if
00974
00975 end subroutine seq_timemgr_EClockGetData
00976
00977
00978
00979
00980
00981
00982
00983
00984
00985
00986 subroutine seq_timemgr_clockAdvance( SyncClock )
00987
00988 implicit none
00989
00990
00991
00992 type(seq_timemgr_type), intent(INOUT) :: SyncClock
00993
00994
00995
00996
00997 character(len=*), parameter :: subname = '(seq_timemgr_clockAdvance) '
00998 integer :: n
00999 type(ESMF_Time) :: drvCT,clkCT
01000 integer :: rc
01001
01002
01003
01004
01005
01006
01007
01008 do n = 1,max_clocks
01009 call seq_timemgr_alarmSetOff(SyncClock%ECP(n)%EClock)
01010 enddo
01011
01012
01013
01014 call ESMF_ClockAdvance( SyncClock%ECP(seq_timemgr_nclock_drv)%EClock, rc=rc )
01015 call seq_timemgr_ESMFCodeCheck( rc, msg=subname//"Error from drv ESMF_ClockAdvance")
01016
01017
01018
01019 if (ESMF_AlarmIsRinging(SyncClock%EAlarm(seq_timemgr_nclock_drv,seq_timemgr_nalarm_atmrun))) then
01020 call ESMF_ClockAdvance(SyncClock%ECP(seq_timemgr_nclock_atm)%EClock, rc=rc )
01021 call seq_timemgr_ESMFCodeCheck(rc, msg=subname//"Error from atm ESMF_ClockAdvance")
01022 endif
01023
01024 if (ESMF_AlarmIsRinging(SyncClock%EAlarm(seq_timemgr_nclock_drv,seq_timemgr_nalarm_lndrun))) then
01025 call ESMF_ClockAdvance(SyncClock%ECP(seq_timemgr_nclock_lnd)%EClock, rc=rc )
01026 call seq_timemgr_ESMFCodeCheck(rc, msg=subname//"Error from lnd ESMF_ClockAdvance")
01027 endif
01028
01029 if (ESMF_AlarmIsRinging(SyncClock%EAlarm(seq_timemgr_nclock_drv,seq_timemgr_nalarm_ocnrun))) then
01030 call ESMF_ClockAdvance(SyncClock%ECP(seq_timemgr_nclock_ocn)%EClock, rc=rc )
01031 call seq_timemgr_ESMFCodeCheck(rc, msg=subname//"Error from ocn ESMF_ClockAdvance")
01032 endif
01033
01034 if (ESMF_AlarmIsRinging(SyncClock%EAlarm(seq_timemgr_nclock_drv,seq_timemgr_nalarm_icerun))) then
01035 call ESMF_ClockAdvance(SyncClock%ECP(seq_timemgr_nclock_ice)%EClock, rc=rc )
01036 call seq_timemgr_ESMFCodeCheck(rc, msg=subname//"Error from ice ESMF_ClockAdvance")
01037 endif
01038
01039 if (ESMF_AlarmIsRinging(SyncClock%EAlarm(seq_timemgr_nclock_drv,seq_timemgr_nalarm_glcrun))) then
01040 call ESMF_ClockAdvance(SyncClock%ECP(seq_timemgr_nclock_glc)%EClock, rc=rc )
01041 call seq_timemgr_ESMFCodeCheck(rc, msg=subname//"Error from glc ESMF_ClockAdvance")
01042 endif
01043
01044 if (seq_timemgr_end_restart) then
01045 do n = 1,max_clocks
01046 if (seq_timemgr_alarmIsOn(SyncClock%ECP(n)%EClock,seq_timemgr_alarm_stop) .or. &
01047 seq_timemgr_alarmIsOn(SyncClock%ECP(n)%EClock,seq_timemgr_alarm_datestop)) then
01048 call seq_timemgr_alarmSetOn(SyncClock%ECP(n)%EClock,seq_timemgr_alarm_restart)
01049 endif
01050 enddo
01051 endif
01052
01053 end subroutine seq_timemgr_clockAdvance
01054
01055
01056
01057
01058
01059
01060
01061
01062
01063
01064
01065 subroutine seq_timemgr_alarmInit( EClock, EAlarm, option, opt_n, opt_ymd, opt_tod, RefTime, alarmname)
01066
01067 implicit none
01068
01069
01070
01071 type(ESMF_Clock) , intent(INOUT) :: EClock
01072 type(ESMF_Alarm) , intent(INOUT) :: EAlarm
01073 character(len=*) , intent(IN) :: option
01074 integer(SHR_KIND_IN),optional, intent(IN) :: opt_n
01075 integer(SHR_KIND_IN),optional, intent(IN) :: opt_ymd
01076 integer(SHR_KIND_IN),optional, intent(IN) :: opt_tod
01077 type(ESMF_Time) ,optional, intent(IN) :: RefTime
01078 character(len=*) ,optional, intent(IN) :: alarmname
01079
01080
01081
01082
01083 character(len=*), parameter :: subname = '(seq_timemgr_alarmInit) '
01084 integer :: rc
01085 integer :: lymd
01086 integer :: ltod
01087 integer :: cyy,cmm,cdd,csec
01088 integer :: nyy,nmm,ndd,nsec
01089 character(len=64) :: lalarmname
01090 logical :: update_nextalarm
01091 type(ESMF_Time) :: CurrTime
01092 type(ESMF_Time) :: NextAlarm
01093 type(ESMF_Time) :: AltAlarm
01094 type(ESMF_TimeInterval) :: AlarmInterval
01095
01096
01097
01098
01099
01100
01101
01102
01103
01104
01105
01106
01107
01108
01109 lalarmname = 'alarm_unknown'
01110 if (present(alarmname)) then
01111 lalarmname = trim(alarmname)
01112 endif
01113
01114 ltod = 0
01115 if (present(opt_tod)) then
01116 ltod = opt_tod
01117 endif
01118
01119 lymd = -1
01120 if (present(opt_ymd)) then
01121 lymd = opt_ymd
01122 endif
01123
01124 call ESMF_ClockGet(EClock, CurrTime=CurrTime, rc=rc)
01125 call ESMF_TimeGet(CurrTime, yy=cyy, mm=cmm, dd=cdd, s=csec, rc=rc )
01126
01127
01128 if (present(RefTime)) then
01129 NextAlarm = RefTime
01130 else
01131 NextAlarm = CurrTime
01132 endif
01133 call ESMF_TimeGet(CurrTime, yy=nyy, mm=nmm, dd=ndd, s=nsec, rc=rc )
01134
01135 update_nextalarm = .true.
01136
01137 selectcase (trim(option))
01138
01139 case (seq_timemgr_optNONE)
01140
01141
01142 call ESMF_TimeIntervalSet(AlarmInterval, yy=9999, rc=rc)
01143 call ESMF_TimeSet( NextAlarm, yy=9999, mm=12, dd=1, s=0, calendar=seq_timemgr_cal, rc=rc )
01144 update_nextalarm = .false.
01145
01146 case (seq_timemgr_optNever)
01147
01148
01149 call ESMF_TimeIntervalSet(AlarmInterval, yy=9999, rc=rc)
01150 call ESMF_TimeSet( NextAlarm, yy=9999, mm=12, dd=1, s=0, calendar=seq_timemgr_cal, rc=rc )
01151 update_nextalarm = .false.
01152
01153 case (seq_timemgr_optDate)
01154
01155
01156 call ESMF_TimeIntervalSet(AlarmInterval, yy=9999, rc=rc)
01157 if (.not. present(opt_ymd)) call shr_sys_abort(subname//':'//trim(option)//' requires opt_ymd')
01158 if (lymd < 0 .or. ltod < 0) then
01159 call shr_sys_abort(subname//':'//trim(option)//'opt_ymd, opt_tod invalid')
01160 endif
01161 call seq_timemgr_ETimeInit(NextAlarm, lymd, ltod, "optDate")
01162 update_nextalarm = .false.
01163
01164 case (seq_timemgr_optIfdays0)
01165 call ESMF_TimeIntervalSet(AlarmInterval, mm=1, rc=rc)
01166 if (.not. present(opt_ymd)) call shr_sys_abort(subname//':'//trim(option)//' requires opt_ymd')
01167 if (.not.present(opt_n)) call shr_sys_abort(subname//':'//trim(option)//' requires opt_n')
01168 if (opt_n <= 0) call shr_sys_abort(subname//':'//trim(option)//' invalid opt_n')
01169 call ESMF_TimeSet( NextAlarm, yy=cyy, mm=cmm, dd=opt_n, s=0, calendar=seq_timemgr_cal, rc=rc )
01170
01171 case (seq_timemgr_optNSteps)
01172 call ESMF_ClockGet(EClock, TimeStep=AlarmInterval, rc=rc)
01173 if (.not.present(opt_n)) call shr_sys_abort(subname//':'//trim(option)//' requires opt_n')
01174 if (opt_n <= 0) call shr_sys_abort(subname//':'//trim(option)//' invalid opt_n')
01175 AlarmInterval = AlarmInterval * opt_n
01176
01177 case (seq_timemgr_optNStep)
01178 call ESMF_ClockGet(EClock, TimeStep=AlarmInterval, rc=rc)
01179 if (.not.present(opt_n)) call shr_sys_abort(subname//':'//trim(option)//' requires opt_n')
01180 if (opt_n <= 0) call shr_sys_abort(subname//':'//trim(option)//' invalid opt_n')
01181 AlarmInterval = AlarmInterval * opt_n
01182
01183 case (seq_timemgr_optNSeconds)
01184 call ESMF_TimeIntervalSet(AlarmInterval, s=1, rc=rc)
01185 if (.not.present(opt_n)) call shr_sys_abort(subname//':'//trim(option)//' requires opt_n')
01186 if (opt_n <= 0) call shr_sys_abort(subname//':'//trim(option)//' invalid opt_n')
01187 AlarmInterval = AlarmInterval * opt_n
01188
01189 case (seq_timemgr_optNSecond)
01190 call ESMF_TimeIntervalSet(AlarmInterval, s=1, rc=rc)
01191 if (.not.present(opt_n)) call shr_sys_abort(subname//':'//trim(option)//' requires opt_n')
01192 if (opt_n <= 0) call shr_sys_abort(subname//':'//trim(option)//' invalid opt_n')
01193 AlarmInterval = AlarmInterval * opt_n
01194
01195 case (seq_timemgr_optNMinutes)
01196 call ESMF_TimeIntervalSet(AlarmInterval, s=60, rc=rc)
01197 if (.not.present(opt_n)) call shr_sys_abort(subname//':'//trim(option)//' requires opt_n')
01198 if (opt_n <= 0) call shr_sys_abort(subname//':'//trim(option)//' invalid opt_n')
01199 AlarmInterval = AlarmInterval * opt_n
01200
01201 case (seq_timemgr_optNMinute)
01202 call ESMF_TimeIntervalSet(AlarmInterval, s=60, rc=rc)
01203 if (.not.present(opt_n)) call shr_sys_abort(subname//':'//trim(option)//' requires opt_n')
01204 if (opt_n <= 0) call shr_sys_abort(subname//':'//trim(option)//' invalid opt_n')
01205 AlarmInterval = AlarmInterval * opt_n
01206
01207 case (seq_timemgr_optNHours)
01208 call ESMF_TimeIntervalSet(AlarmInterval, s=3600, rc=rc)
01209 if (.not.present(opt_n)) call shr_sys_abort(subname//':'//trim(option)//' requires opt_n')
01210 if (opt_n <= 0) call shr_sys_abort(subname//':'//trim(option)//' invalid opt_n')
01211 AlarmInterval = AlarmInterval * opt_n
01212
01213 case (seq_timemgr_optNHour)
01214 call ESMF_TimeIntervalSet(AlarmInterval, s=3600, rc=rc)
01215 if (.not.present(opt_n)) call shr_sys_abort(subname//':'//trim(option)//' requires opt_n')
01216 if (opt_n <= 0) call shr_sys_abort(subname//':'//trim(option)//' invalid opt_n')
01217 AlarmInterval = AlarmInterval * opt_n
01218
01219 case (seq_timemgr_optNDays)
01220 call ESMF_TimeIntervalSet(AlarmInterval, d=1, rc=rc)
01221 if (.not.present(opt_n)) call shr_sys_abort(subname//':'//trim(option)//' requires opt_n')
01222 if (opt_n <= 0) call shr_sys_abort(subname//':'//trim(option)//' invalid opt_n')
01223 AlarmInterval = AlarmInterval * opt_n
01224
01225
01226 case (seq_timemgr_optNDay)
01227 call ESMF_TimeIntervalSet(AlarmInterval, d=1, rc=rc)
01228 if (.not.present(opt_n)) call shr_sys_abort(subname//':'//trim(option)//' requires opt_n')
01229 if (opt_n <= 0) call shr_sys_abort(subname//':'//trim(option)//' invalid opt_n')
01230 AlarmInterval = AlarmInterval * opt_n
01231
01232
01233 case (seq_timemgr_optNMonths)
01234 call ESMF_TimeIntervalSet(AlarmInterval, mm=1, rc=rc)
01235 if (.not.present(opt_n)) call shr_sys_abort(subname//':'//trim(option)//' requires opt_n')
01236 if (opt_n <= 0) call shr_sys_abort(subname//':'//trim(option)//' invalid opt_n')
01237 AlarmInterval = AlarmInterval * opt_n
01238
01239
01240 case (seq_timemgr_optNMonth)
01241 call ESMF_TimeIntervalSet(AlarmInterval, mm=1, rc=rc)
01242 if (.not.present(opt_n)) call shr_sys_abort(subname//':'//trim(option)//' requires opt_n')
01243 if (opt_n <= 0) call shr_sys_abort(subname//':'//trim(option)//' invalid opt_n')
01244 AlarmInterval = AlarmInterval * opt_n
01245
01246
01247 case (seq_timemgr_optMonthly)
01248 call ESMF_TimeIntervalSet(AlarmInterval, mm=1, rc=rc)
01249 call ESMF_TimeSet( NextAlarm, yy=cyy, mm=cmm, dd=1, s=0, calendar=seq_timemgr_cal, rc=rc )
01250
01251 case (seq_timemgr_optNYears)
01252 call ESMF_TimeIntervalSet(AlarmInterval, yy=1, rc=rc)
01253 if (.not.present(opt_n)) call shr_sys_abort(subname//':'//trim(option)//' requires opt_n')
01254 if (opt_n <= 0) call shr_sys_abort(subname//':'//trim(option)//' invalid opt_n')
01255 AlarmInterval = AlarmInterval * opt_n
01256
01257
01258 case (seq_timemgr_optNYear)
01259 call ESMF_TimeIntervalSet(AlarmInterval, yy=1, rc=rc)
01260 if (.not.present(opt_n)) call shr_sys_abort(subname//':'//trim(option)//' requires opt_n')
01261 if (opt_n <= 0) call shr_sys_abort(subname//':'//trim(option)//' invalid opt_n')
01262 AlarmInterval = AlarmInterval * opt_n
01263
01264
01265 case (seq_timemgr_optYearly)
01266 call ESMF_TimeIntervalSet(AlarmInterval, yy=1, rc=rc)
01267 call ESMF_TimeSet( NextAlarm, yy=cyy, mm=1, dd=1, s=0, calendar=seq_timemgr_cal, rc=rc )
01268
01269 case (seq_timemgr_optEnd)
01270 call shr_sys_abort(subname//': deprecated option '//trim(option))
01271
01272 case default
01273 call shr_sys_abort(subname//': unknown option '//trim(option))
01274
01275 end select
01276
01277
01278
01279
01280
01281
01282
01283
01284 if (update_nextalarm) then
01285 NextAlarm = NextAlarm - AlarmInterval
01286 do while (NextAlarm <= CurrTime)
01287 NextAlarm = NextAlarm + AlarmInterval
01288 enddo
01289 endif
01290
01291 EAlarm = ESMF_AlarmCreate( name=lalarmname, clock=EClock, ringTime=NextAlarm, &
01292 ringInterval=AlarmInterval, rc=rc)
01293 call seq_timemgr_ESMFCodeCheck( rc, msg=subname//"Error from ESMF_AlarmCreate" )
01294
01295 end subroutine seq_timemgr_AlarmInit
01296
01297
01298
01299
01300
01301
01302
01303
01304
01305
01306
01307 subroutine seq_timemgr_alarmGet( EAlarm, next_ymd, next_tod, prev_ymd, prev_tod, &
01308 IntSec, IntMon, IntYrs, name)
01309
01310 implicit none
01311
01312
01313
01314 type(ESMF_Alarm) , intent(INOUT) :: EAlarm
01315 integer(SHR_KIND_IN), intent(OUT), optional :: next_ymd
01316 integer(SHR_KIND_IN), intent(OUT), optional :: next_tod
01317 integer(SHR_KIND_IN), intent(OUT), optional :: prev_ymd
01318 integer(SHR_KIND_IN), intent(OUT), optional :: prev_tod
01319 integer(SHR_KIND_IN), intent(OUT), optional :: IntSec
01320 integer(SHR_KIND_IN), intent(OUT), optional :: IntMon
01321 integer(SHR_KIND_IN), intent(OUT), optional :: IntYrs
01322 character(len=*) , intent(OUT), optional :: name
01323
01324
01325
01326
01327 character(len=*), parameter :: subname = '(seq_timemgr_alarmGet) '
01328 integer :: yy, mm, dd, sec
01329 integer :: ymd
01330 integer :: tod
01331 integer :: rc
01332 type(ESMF_TimeInterval) :: alarmInterval
01333 type(ESMF_Time) :: ringTime
01334
01335
01336
01337
01338
01339 if (present(name)) then
01340 call ESMF_AlarmGet( EAlarm, name=name, rc=rc)
01341 call seq_timemgr_ESMFCodeCheck( rc, msg=subname//"Error from ESMF_AlarmGet name" )
01342 endif
01343
01344 call ESMF_AlarmGet( EAlarm, RingTime=RingTime, rc=rc )
01345 call seq_timemgr_ESMFCodeCheck( rc, msg=subname//"Error from ESMF_AlarmGet RingTime" )
01346 call seq_timemgr_ETimeGet( RingTime, ymd=ymd, tod=tod)
01347 if ( present(next_ymd) ) next_ymd = ymd
01348 if ( present(next_tod) ) next_tod = tod
01349
01350 call ESMF_AlarmGet( EAlarm, PrevRingTime=RingTime, rc=rc )
01351 call seq_timemgr_ESMFCodeCheck( rc, msg=subname//"Error from ESMF_AlarmGet PrevRingTime")
01352 call seq_timemgr_ETimeGet( RingTime, ymd=ymd, tod=tod)
01353 if ( present(prev_ymd) ) prev_ymd = ymd
01354 if ( present(prev_tod) ) prev_tod = tod
01355
01356 yy = 0
01357 mm = 0
01358 dd = 0
01359 sec = 0
01360 call ESMF_AlarmGet( EAlarm, RingInterval=AlarmInterval, rc=rc )
01361 call seq_timemgr_ESMFCodeCheck( rc, msg=subname//"Error from ESMF_AlarmGet RingInterval")
01362 call ESMF_TimeIntervalGet( alarmInterval, yy=yy, mm=mm, d=dd, s=sec, rc=rc )
01363 call seq_timemgr_ESMFCodeCheck( rc, msg=subname//"Error from ESMF_TimeIntervalGet" )
01364 sec = sec + dd*(SecPerDay)
01365
01366
01367 if ( present(IntSec) ) IntSec = sec
01368 if ( present(IntMon) ) IntMon = mm
01369 if ( present(IntYrs) ) IntYrs = yy
01370
01371 end subroutine seq_timemgr_alarmGet
01372
01373
01374
01375
01376
01377
01378
01379
01380
01381
01382 subroutine seq_timemgr_AlarmSetOn( EClock, alarmname)
01383
01384 implicit none
01385
01386
01387
01388 type(ESMF_Clock), intent(INOUT) :: EClock
01389 character(len=*), intent(IN), optional :: alarmname
01390
01391
01392
01393
01394 character(len=*), parameter :: subname = '(seq_timemgr_alarmSetOn) '
01395 character(len=*), parameter :: xalarm = 'unset'
01396 integer :: n
01397 integer :: rc
01398 logical :: found
01399 logical :: set
01400 character(len=64) :: name
01401 type(ESMF_Alarm),pointer :: EAlarm
01402 type(ESMF_Alarm),pointer :: EAlarm_list(:)
01403 integer(SHR_KIND_IN) :: AlarmCount
01404
01405
01406
01407
01408
01409
01410
01411
01412
01413
01414
01415
01416
01417
01418
01419
01420 set = .false.
01421
01422 call seq_timemgr_EClockGetData(EClock, AlarmCount=AlarmCount)
01423 #ifdef USE_ESMF_LIB
01424 allocate(EAlarm_list(AlarmCount))
01425 call ESMF_ClockGetAlarmList(EClock, alarmListType=ESMF_ALARMLIST_ALL, &
01426 alarmList=EAlarm_list, alarmCount=AlarmCount, rc=rc)
01427 #else
01428 call ESMF_ClockGetAlarmList(EClock, EAlarm_list, rc=rc)
01429 #endif
01430 call seq_timemgr_ESMFCodeCheck( rc, msg=subname//"Error from ESMF_ClockGetAlarmList" )
01431 do n = 1,AlarmCount
01432 found = .false.
01433 if (present(alarmname)) then
01434 call ESMF_AlarmGet(EAlarm_list(n), name=name)
01435 if (trim(name) == trim(alarmname)) found = .true.
01436 else
01437 found = .true.
01438 endif
01439 if (found) then
01440 set = .true.
01441 call ESMF_AlarmRingerOn( EAlarm_list(n), rc=rc )
01442 call seq_timemgr_ESMFCodeCheck( rc, msg=subname//"Error from ESMF_AlarmRingerOn" )
01443 endif
01444 enddo
01445
01446 if (present(alarmname) .and. .not. set) then
01447 write(logunit,*) subname,' ERROR in alarmname ',trim(alarmname)
01448 call shr_sys_abort()
01449 endif
01450 #ifdef USE_ESMF_LIB
01451 deallocate(EAlarm_list)
01452 #endif
01453
01454 end subroutine seq_timemgr_AlarmSetOn
01455
01456
01457
01458
01459
01460
01461
01462
01463
01464
01465
01466 subroutine seq_timemgr_AlarmSetOff( EClock, alarmname)
01467
01468 implicit none
01469
01470
01471
01472 type(ESMF_Clock), intent(INOUT) :: EClock
01473 character(len=*), intent(IN), optional :: alarmname
01474
01475
01476
01477
01478 character(len=*), parameter :: subname = '(seq_timemgr_alarmSetOff) '
01479 character(len=*), parameter :: xalarm = 'unset'
01480 integer :: n
01481 integer :: rc
01482 logical :: found
01483 logical :: set
01484 character(len=64) :: name
01485 type(ESMF_Alarm),pointer :: EAlarm
01486 type(ESMF_Alarm),pointer :: EAlarm_list(:)
01487 integer(SHR_KIND_IN) :: AlarmCount
01488
01489
01490
01491
01492
01493
01494
01495
01496
01497
01498
01499
01500
01501
01502
01503
01504 set = .false.
01505
01506 call seq_timemgr_EClockGetData(EClock, AlarmCount=AlarmCount)
01507 #ifdef USE_ESMF_LIB
01508 allocate(EAlarm_list(AlarmCount))
01509 call ESMF_ClockGetAlarmList(EClock, alarmListType=ESMF_ALARMLIST_ALL, &
01510 alarmList=EAlarm_list, alarmCount=AlarmCount, rc=rc)
01511 #else
01512 call ESMF_ClockGetAlarmList(EClock, EAlarm_list, rc=rc)
01513 #endif
01514 call seq_timemgr_ESMFCodeCheck( rc, msg=subname//"Error from ESMF_ClockGetAlarmList" )
01515 do n = 1,AlarmCount
01516 found = .false.
01517 if (present(alarmname)) then
01518 call ESMF_AlarmGet(EAlarm_list(n), name=name)
01519 if (trim(name) == trim(alarmname)) found = .true.
01520 else
01521 found = .true.
01522 endif
01523 if (found) then
01524 set = .true.
01525 call ESMF_AlarmRingerOff( EAlarm_list(n), rc=rc )
01526 call seq_timemgr_ESMFCodeCheck( rc, msg=subname//"Error from ESMF_AlarmRingerOff" )
01527 endif
01528 enddo
01529
01530 if (present(alarmname) .and. .not. set) then
01531 write(logunit,*) subname,' ERROR in alarmname ',trim(alarmname)
01532 call shr_sys_abort()
01533 endif
01534 #ifdef USE_ESMF_LIB
01535 deallocate(EAlarm_list)
01536 #endif
01537
01538 end subroutine seq_timemgr_AlarmSetOff
01539
01540
01541
01542
01543
01544
01545
01546
01547
01548
01549
01550 subroutine seq_timemgr_restartAlarmSetOff( EClock)
01551
01552 implicit none
01553
01554
01555
01556 type(ESMF_Clock) , intent(INOUT) :: EClock
01557
01558
01559
01560
01561 character(len=*), parameter :: subname = '(seq_timemgr_restartAlarmSetOff) '
01562
01563
01564
01565
01566
01567 call seq_timemgr_AlarmSetOff(EClock, seq_timemgr_alarm_restart)
01568
01569 end subroutine seq_timemgr_restartAlarmSetOff
01570
01571
01572
01573
01574
01575
01576
01577
01578
01579
01580
01581 subroutine seq_timemgr_runAlarmSetOff( EClock)
01582
01583 implicit none
01584
01585
01586
01587 type(ESMF_Clock) , intent(INOUT) :: EClock
01588
01589
01590
01591
01592 character(len=*), parameter :: subname = '(seq_timemgr_runAlarmSetOff) '
01593
01594
01595
01596
01597
01598 call seq_timemgr_AlarmSetOff(EClock, seq_timemgr_alarm_run)
01599
01600 end subroutine seq_timemgr_runAlarmSetOff
01601
01602
01603
01604
01605
01606
01607
01608
01609
01610
01611
01612 subroutine seq_timemgr_historyAlarmSetOff( EClock)
01613
01614 implicit none
01615
01616
01617
01618 type(ESMF_Clock) , intent(INOUT) :: EClock
01619
01620
01621
01622
01623 character(len=*), parameter :: subname = '(seq_timemgr_historyAlarmSetOff) '
01624
01625
01626
01627
01628
01629 call seq_timemgr_AlarmSetOff(EClock, seq_timemgr_alarm_history)
01630
01631 end subroutine seq_timemgr_historyAlarmSetOff
01632
01633
01634
01635
01636
01637
01638
01639
01640
01641
01642
01643 logical function seq_timemgr_alarmIsOn( EClock, alarmname)
01644
01645 implicit none
01646
01647
01648
01649 type(ESMF_Clock), intent(IN) :: EClock
01650 character(len=*), intent(IN) :: alarmname
01651
01652
01653
01654
01655 character(len=*), parameter :: subname = '(seq_timemgr_alarmIsOn) '
01656 character(len=*), parameter :: xalarm = 'unset'
01657 integer :: n
01658 integer :: rc
01659 logical :: found
01660 logical :: set
01661 character(len=64) :: name
01662 type(ESMF_Time) :: ETime1, ETime2
01663 type(ESMF_Alarm),pointer :: EAlarm
01664 type(ESMF_Alarm),pointer :: EAlarm_list(:)
01665 integer(SHR_KIND_IN) :: AlarmCount
01666
01667
01668
01669
01670
01671
01672
01673
01674
01675
01676 seq_timemgr_alarmIsOn = .false.
01677 found = .false.
01678
01679 call seq_timemgr_EClockGetData(EClock, AlarmCount=AlarmCount)
01680 #ifdef USE_ESMF_LIB
01681 allocate(EAlarm_list(AlarmCount))
01682 call ESMF_ClockGetAlarmList(EClock, alarmListType=ESMF_ALARMLIST_ALL, &
01683 alarmList=EAlarm_list, alarmCount=AlarmCount, rc=rc)
01684 #else
01685 call ESMF_ClockGetAlarmList(EClock, EAlarm_list, rc=rc)
01686 #endif
01687 call seq_timemgr_ESMFCodeCheck( rc, msg=subname//"Error from ESMF_ClockGetAlarmList" )
01688 do n = 1,AlarmCount
01689 name = trim(xalarm)
01690 call ESMF_AlarmGet(EAlarm_list(n), name=name)
01691 if (trim(name) == trim(alarmname)) then
01692 found = .true.
01693 seq_timemgr_alarmIsOn = ESMF_AlarmIsRinging(EAlarm_list(n),rc)
01694 call seq_timemgr_ESMFCodeCheck( rc, msg=subname// &
01695 "Error from ESMF_AlarmIsRinging" )
01696
01697 if (trim(alarmname) == trim(seq_timemgr_alarm_datestop)) then
01698 call ESMF_ClockGet(EClock, CurrTime = ETime1, rc=rc)
01699 call seq_timemgr_ESMFCodeCheck( rc, msg=subname//"Error from ESMF_ClockGet CurrTime" )
01700 call ESMF_AlarmGet(EAlarm_list(n), RingTime = ETime2, rc=rc)
01701 call seq_timemgr_ESMFCodeCheck( rc, msg=subname//"Error from ESMF_AlarmGet RingTime" )
01702 if (ETime1 >= ETime2) seq_timemgr_alarmIsOn = .true.
01703 endif
01704 endif
01705 enddo
01706
01707 if (.not.found) then
01708 write(logunit,*) subname//': ERROR alarm not valid for EClock '//trim(alarmname)
01709 call shr_sys_abort( subname//'ERROR: alarm invalid '//trim(alarmname) )
01710 endif
01711 #ifdef USE_ESMF_LIB
01712 deallocate(EAlarm_list)
01713 #endif
01714
01715 end function seq_timemgr_alarmIsOn
01716
01717
01718
01719
01720
01721
01722
01723
01724
01725
01726
01727 logical function seq_timemgr_restartAlarmIsOn( EClock)
01728
01729 implicit none
01730
01731
01732
01733 type(ESMF_Clock) , intent(IN) :: EClock
01734
01735
01736
01737
01738 integer :: rc
01739 character(len=*), parameter :: subname = '(seq_timemgr_restartAlarmIsOn) '
01740
01741
01742
01743
01744
01745 seq_timemgr_restartAlarmIsOn = &
01746 seq_timemgr_alarmIsOn(EClock, alarmname=seq_timemgr_alarm_restart)
01747
01748 end function seq_timemgr_restartAlarmIsOn
01749
01750
01751
01752
01753
01754
01755
01756
01757
01758
01759
01760 logical function seq_timemgr_stopAlarmIsOn( EClock)
01761
01762 implicit none
01763
01764
01765
01766 type(ESMF_Clock) , intent(IN) :: EClock
01767
01768
01769
01770
01771 character(len=*), parameter :: subname = '(seq_timemgr_stopAlarmIsOn) '
01772
01773
01774
01775
01776
01777 seq_timemgr_stopAlarmIsOn = &
01778 seq_timemgr_alarmIsOn(EClock, alarmname=seq_timemgr_alarm_stop)
01779
01780 end function seq_timemgr_stopAlarmIsOn
01781
01782
01783
01784
01785
01786
01787
01788
01789
01790
01791
01792 logical function seq_timemgr_runAlarmIsOn( EClock)
01793
01794 implicit none
01795
01796
01797
01798 type(ESMF_Clock) , intent(IN) :: EClock
01799
01800
01801
01802
01803 character(len=*), parameter :: subname = '(seq_timemgr_runAlarmIsOn) '
01804
01805
01806
01807
01808
01809 seq_timemgr_runAlarmIsOn = &
01810 seq_timemgr_alarmIsOn(EClock, alarmname=seq_timemgr_alarm_run)
01811
01812 end function seq_timemgr_runAlarmIsOn
01813
01814
01815
01816
01817
01818
01819
01820
01821
01822
01823 logical function seq_timemgr_historyAlarmIsOn( EClock)
01824
01825 implicit none
01826
01827
01828
01829 type(ESMF_Clock) , intent(IN) :: EClock
01830
01831
01832
01833
01834 integer :: rc
01835 character(len=*), parameter :: subname = '(seq_timemgr_historyAlarmIsOn) '
01836
01837
01838
01839
01840
01841 seq_timemgr_historyAlarmIsOn = &
01842 seq_timemgr_alarmIsOn(EClock, alarmname=seq_timemgr_alarm_history)
01843
01844 end function seq_timemgr_historyAlarmIsOn
01845
01846
01847
01848
01849
01850
01851
01852
01853
01854
01855
01856
01857
01858 subroutine seq_timemgr_ETimeInit( ETime, ymd, tod, desc )
01859
01860 implicit none
01861
01862
01863
01864 type(ESMF_Time) , intent(inout) :: ETime
01865 integer , intent(in) :: ymd
01866 integer , intent(in), optional :: tod
01867 character(len=*), intent(in), optional :: desc
01868
01869
01870
01871
01872 character(len=*), parameter :: subname = '(seq_timemgr_ETimeInit) '
01873 integer :: yr, mon, day
01874 integer :: ltod
01875 character(SHR_KIND_CL) :: ldesc
01876 integer :: rc
01877
01878
01879
01880
01881
01882 ltod = 0
01883 if (present(tod)) then
01884 ltod = tod
01885 endif
01886
01887 ldesc = ''
01888 if (present(desc)) then
01889 ldesc = desc
01890 endif
01891
01892 if ( (ymd < 0) .or. (ltod < 0) .or. (ltod > SecPerDay) )then
01893 write(logunit,*) subname//': ERROR yymmdd is a negative number or '// &
01894 'time-of-day out of bounds', ymd, ltod
01895 call shr_sys_abort( subname//'ERROR: Bad input' )
01896 end if
01897
01898 call shr_cal_date2ymd(ymd,yr,mon,day)
01899
01900 call ESMF_TimeSet( ETime, yy=yr, mm=mon, dd=day, s=ltod, &
01901 calendar=seq_timemgr_cal, rc=rc )
01902 call seq_timemgr_ESMFCodeCheck(rc, subname//': error return from '// &
01903 'ESMF_TimeSet: setting '//trim(ldesc))
01904
01905 end subroutine seq_timemgr_ETimeInit
01906
01907
01908
01909
01910
01911
01912
01913
01914
01915
01916
01917 subroutine seq_timemgr_ETimeGet( ETime, offset, ymd, tod )
01918
01919 implicit none
01920
01921
01922
01923 type(ESMF_Time), intent(IN) :: ETime
01924 integer, optional, intent(IN) :: offset
01925 integer, optional, intent(OUT) :: ymd
01926 integer, optional, intent(OUT) :: tod
01927
01928
01929
01930
01931 character(len=*), parameter :: subname = '(seq_timemgr_ETimeGet) '
01932 type(ESMF_Time) :: ETimeAdd
01933 type(ESMF_TimeInterval) :: ETimeOff
01934 integer :: year
01935 integer :: month
01936 integer :: day
01937 integer :: sec
01938 integer :: rc
01939
01940
01941
01942
01943
01944 ETimeAdd = ETime
01945 if ( present(offset) )then
01946 if ( offset > 0 )then
01947 call ESMF_TimeIntervalSet( ETimeOff, s=offset, rc=rc )
01948 call seq_timemgr_ESMFCodeCheck( rc, msg=subname// &
01949 ": Error from ESMF_TimeIntervalSet" )
01950 ETimeAdd = ETime + ETimeOff
01951 else if ( offset < 0 )then
01952 call ESMF_TimeIntervalSet( ETimeOff, s=-offset, rc=rc )
01953 call seq_timemgr_ESMFCodeCheck( rc, msg=subname// &
01954 ": Error from ESMF_TimeIntervalSet" )
01955 ETimeAdd = ETime - ETimeOff
01956 end if
01957 end if
01958
01959 call ESMF_TimeGet( ETimeAdd, yy=year, mm=month, dd=day, s=sec, rc=rc )
01960 call seq_timemgr_ESMFCodeCheck( rc, msg=subname// &
01961 ": Error from ESMF_TimeGet" )
01962
01963
01964
01965 if ( present(ymd) ) then
01966 if (year < 0) then
01967 ymd = 0
01968 else
01969 call shr_cal_ymd2date(year,month,day,ymd)
01970 endif
01971 endif
01972 if ( present(tod) ) then
01973 if (year < 0) then
01974 tod = 0
01975 else
01976 tod = sec
01977 endif
01978 endif
01979
01980 end subroutine seq_timemgr_ETimeGet
01981
01982
01983
01984
01985
01986
01987
01988
01989
01990
01991
01992
01993
01994 subroutine seq_timemgr_EClockInit( TimeStep, StartTime, RefTime, CurrTime, EClock )
01995
01996 implicit none
01997
01998
01999
02000 type(ESMF_TimeInterval), intent(IN) :: TimeStep
02001 type(ESMF_Time) , intent(IN) :: StartTime
02002 type(ESMF_Time) , intent(IN) :: RefTime
02003 type(ESMF_Time) , intent(IN) :: CurrTime
02004 type(ESMF_Clock) , intent(OUT) :: EClock
02005
02006
02007
02008
02009 character(len=*), parameter :: subname = '(seq_timemgr_EClockInit) '
02010 integer :: rc
02011 character(len=SHR_KIND_CL) :: description
02012 type(ESMF_Time) :: clocktime
02013
02014
02015
02016
02017
02018 description = 'CCSM shared Time-manager clock'
02019
02020
02021
02022
02023
02024 call seq_timemgr_ETimeInit(clocktime, 99990101, 0, "artificial stop date")
02025
02026 EClock = ESMF_ClockCreate(trim(description), &
02027 TimeStep=TimeStep, startTime=StartTime, &
02028 refTime=RefTime, stopTime=clocktime, rc=rc)
02029 call seq_timemgr_ESMFCodeCheck( rc, msg=subname//': Error from ESMF_ClockCreate')
02030
02031
02032 call ESMF_ClockGet(EClock, currTime=clocktime, rc=rc )
02033 call seq_timemgr_ESMFCodeCheck(rc, subname//': Error from ESMF_ClockGet')
02034 do while( clocktime < CurrTime)
02035 call ESMF_ClockAdvance( EClock, rc=rc )
02036 call seq_timemgr_ESMFCodeCheck(rc, subname//': Error from ESMF_ClockAdvance')
02037 call ESMF_ClockGet( EClock, currTime=clocktime )
02038 call seq_timemgr_ESMFCodeCheck(rc, subname//': Error from ESMF_ClockGet')
02039 end do
02040
02041 if (clocktime /= CurrTime) then
02042 if (loglevel > 0) write(logunit,*) trim(subname), &
02043 ' : WARNING clocktime and currtime inconsistent'
02044 endif
02045
02046 end subroutine seq_timemgr_EClockInit
02047
02048
02049
02050
02051
02052
02053
02054
02055
02056
02057
02058 logical function seq_timemgr_EClockDateInSync( EClock, ymd, tod, prev)
02059
02060 implicit none
02061
02062
02063
02064 type(ESMF_Clock), intent(IN) :: Eclock
02065 integer, intent(IN) :: ymd
02066 integer, intent(IN) :: tod
02067 logical, optional,intent(IN) :: prev
02068
02069
02070
02071
02072 character(len=*), parameter :: subname = "(seq_timemgr_EClockDateInSync) "
02073 type(ESMF_Time) :: ETime
02074 integer :: ymd1
02075 integer :: tod1
02076 logical :: previous
02077 integer :: rc
02078
02079
02080
02081
02082
02083 previous = .false.
02084 if ( present(prev) )then
02085 previous = prev
02086 end if
02087
02088 if (previous )then
02089 call ESMF_ClockGet( EClock, prevTime=ETime, rc=rc)
02090 else
02091 call ESMF_ClockGet( EClock, currTime=ETime, rc=rc)
02092 end if
02093 call seq_timemgr_ETimeGet( ETime, ymd=ymd1, tod=tod1 )
02094
02095
02096
02097 if ( (ymd == ymd1) .and. (tod == tod1) )then
02098 seq_timemgr_EClockDateInSync = .true.
02099 else
02100 seq_timemgr_EClockDateInSync = .false.
02101 end if
02102
02103 end function seq_timemgr_EClockDateInSync
02104
02105
02106
02107
02108
02109
02110
02111
02112
02113
02114
02115
02116
02117
02118 subroutine seq_timemgr_clockRestart( type, SyncClock, restart_file, mpicom)
02119
02120
02121 USE shr_ncio_mod, ONLY : shr_ncio_descripType, shr_ncio_descripInit, &
02122 shr_ncio_descripSetDefault, &
02123 shr_ncio_open, shr_ncio_close, &
02124 shr_ncio_descripRead, shr_ncio_descripName, &
02125 shr_ncio_descripPutData, shr_ncio_descripWrite, &
02126 shr_ncio_descripGetInteger, &
02127 shr_ncio_descripGetRealR8, &
02128 shr_ncio_descripGetString, &
02129 shr_ncio_descripGetLogical, &
02130 shr_ncio_setDebug
02131 USE shr_string_mod, ONLY : shr_string_listGetIndexF
02132
02133 implicit none
02134
02135
02136
02137 character(len=*), intent(IN) :: type
02138 type(seq_timemgr_type), intent(INOUT) :: SyncClock
02139 character(len=*), intent(IN) :: restart_file
02140 integer, optional, intent(IN) :: mpicom
02141
02142
02143
02144
02145 character(len=*), parameter :: subname = '(seq_timemgr_clockRestart) '
02146 integer :: iam
02147 logical :: lmaster
02148 integer :: n
02149 integer :: ncId
02150 logical :: exists
02151 integer(SHR_KIND_IN) :: intvar
02152 real(SHR_KIND_R8) :: real8var
02153 logical :: logvar
02154 character(SHR_KIND_CL) :: strvar
02155 logical :: doread
02156 integer :: ierr
02157
02158 type(shr_ncio_descripType) :: restvar(nrestvar)
02159 integer(SHR_KIND_IN), parameter :: intFill = -9876
02160 real(SHR_KIND_R8) , parameter :: real8Fill = -9876._SHR_KIND_R8
02161 character(len=*), parameter :: prefix = "seq_timemgr_"
02162
02163
02164
02165
02166
02167 if (trim(type) == 'read') then
02168 doread = .true.
02169 elseif (trim(type) == 'write') then
02170 doread = .false.
02171 else
02172 write(logunit,*) subname,' ERROR: invalid type ',trim(type)
02173 call shr_sys_abort()
02174 endif
02175
02176 iam = 0
02177 if ( present(mpicom) )then
02178 call mpi_comm_rank(mpicom,iam,ierr)
02179 endif
02180 lmaster = .false.
02181 if (iam == 0) lmaster = .true.
02182
02183
02184
02185
02186 call shr_ncio_descripSetDefault( nrestvar, restvar )
02187 do n = 1, nrestvar
02188 if (trim(resttype(n)) == 'integer') then
02189 call shr_ncio_descripInit( restvar(n), restname(n), &
02190 LongName = restlnam(n), units = restunit(n), &
02191 IntegerData =.true., IntegerFill = IntFill )
02192 elseif (trim(resttype(n)) == 'real8') then
02193 call shr_ncio_descripInit( restvar(n), restname(n), &
02194 LongName = restlnam(n), units = restunit(n), &
02195 RealR8Data =.true., RealR8Fill = real8Fill )
02196 elseif (trim(resttype(n)) == 'logical') then
02197 call shr_ncio_descripInit( restvar(n), restname(n), &
02198 LongName = restlnam(n), units = restunit(n), &
02199 LogicalData =.true. )
02200 elseif (trim(resttype(n)) == 'char') then
02201 call shr_ncio_descripInit( restvar(n), restname(n), &
02202 LongName = restlnam(n), units = restunit(n), &
02203 StringData =.true. )
02204 else
02205 write(logunit,*) subname,' ERROR descripInit not implemented for type ',trim(resttype(n))
02206 call shr_sys_abort()
02207 endif
02208 enddo
02209
02210
02211
02212
02213 if (.not.doread) then
02214 do n = 1, nrestvar
02215 selectcase (trim(restname(n)))
02216 case('start_ymd')
02217 call seq_timemgr_EClockGetData( SyncClock%ECP(seq_timemgr_nclock_drv)%EClock, start_ymd = intvar )
02218 case('start_tod')
02219 call seq_timemgr_EClockGetData( SyncClock%ECP(seq_timemgr_nclock_drv)%EClock, start_tod = intvar )
02220 case('ref_ymd')
02221 call seq_timemgr_EClockGetData( SyncClock%ECP(seq_timemgr_nclock_drv)%EClock, ref_ymd = intvar )
02222 case('ref_tod')
02223 call seq_timemgr_EClockGetData( SyncClock%ECP(seq_timemgr_nclock_drv)%EClock, ref_tod = intvar )
02224 case('curr_ymd')
02225 call seq_timemgr_EClockGetData( SyncClock%ECP(seq_timemgr_nclock_drv)%EClock, curr_ymd = intvar )
02226 case('curr_tod')
02227 call seq_timemgr_EClockGetData( SyncClock%ECP(seq_timemgr_nclock_drv)%EClock, curr_tod = intvar )
02228
02229 case default
02230 write(logunit,*) subname,' ERROR descripPut not implemented for name ',trim(restname(n))
02231 call shr_sys_abort()
02232 endselect
02233
02234 if (trim(resttype(n)) == 'integer') then
02235 call shr_ncio_descripPutData( restvar(n), restname(n), IntegerData=intvar )
02236 elseif (trim(resttype(n)) == 'real8') then
02237 call shr_ncio_descripPutData( restvar(n), restname(n), RealR8Data =real8var )
02238 elseif (trim(resttype(n)) == 'logical') then
02239 call shr_ncio_descripPutData( restvar(n), restname(n), LogicalData=logvar )
02240 elseif (trim(resttype(n)) == 'char') then
02241 call shr_ncio_descripPutData( restvar(n), restname(n), StringData =trim(strvar) )
02242 else
02243 write(logunit,*) subname,' ERROR descripPut not implemented for type ',trim(resttype(n))
02244 call shr_sys_abort()
02245 end if
02246 enddo
02247
02248 call shr_ncio_open( restart_file, lmaster, FileType=prefix, &
02249 ncId=ncId, exists=exists, writing=.true. )
02250 if ( present(mpicom) )then
02251 call shr_ncio_descripWrite( ncId, nrestvar, prefix=prefix, mpicom=mpicom, &
02252 mastertask=lmaster, exists=exists, var=restvar )
02253 else
02254 call shr_ncio_descripWrite( ncId, nrestvar, prefix=prefix, &
02255 exists=exists, var=restvar )
02256 end if
02257 call shr_ncio_close( ncId, lmaster, type=prefix, NCFileName=restart_file )
02258
02259 endif
02260
02261
02262
02263
02264
02265
02266
02267 if (doread) then
02268
02269
02270 call shr_ncio_open( restart_file, lmaster, FileType=prefix, &
02271 ncId=ncId, exists=exists, writing=.false. )
02272 if ( present(MPICom) )then
02273 call shr_ncio_descripRead( ncId, nrestvar, prefix=prefix, mpicom=MPICom, &
02274 mastertask=lmaster, var=restvar )
02275 else
02276 call shr_ncio_descripRead( ncId, nrestvar, prefix=prefix, &
02277 var=restvar )
02278 end if
02279 call shr_ncio_close( ncId, lmaster, type=prefix, NCFileName=restart_file )
02280
02281 do n = 1, nrestvar
02282
02283
02284 if (trim(shr_ncio_descripName(restvar(n))) /= trim(restname(n))) then
02285 write(logunit,*) subname,' ERROR restvar name no match with restname ', &
02286 trim(shr_ncio_descripName(restvar(n))),' ',trim(restname(n))
02287 call shr_sys_abort()
02288 endif
02289
02290 if (trim(resttype(n)) == 'integer') then
02291 intvar = shr_ncio_descripGetInteger(restvar(n))
02292 if (lmaster.and.loglevel > 1) write(logunit) subname,' read ',trim(restname(n)),intvar
02293 elseif (trim(resttype(n)) == 'real8') then
02294 real8var = shr_ncio_descripGetRealR8 (restvar(n))
02295 if (lmaster.and.loglevel > 1) write(logunit) subname,' read ',trim(restname(n)),real8var
02296 elseif (trim(resttype(n)) == 'logical') then
02297 logvar = shr_ncio_descripGetLogical(restvar(n))
02298 if (lmaster.and.loglevel > 1) write(logunit) subname,' read ',trim(restname(n)),logvar
02299 elseif (trim(resttype(n)) == 'char') then
02300 strvar = shr_ncio_descripGetString (restvar(n))
02301 if (lmaster.and.loglevel > 1) write(logunit) subname,' read ',trim(restname(n)),trim(strvar)
02302 else
02303 write(logunit,*) subname,' ERROR descripGet not implemented for type ',trim(resttype(n))
02304 call shr_sys_abort()
02305 endif
02306
02307 selectcase (trim(restname(n)))
02308 case('start_ymd')
02309 rest_start_ymd = intvar
02310 case('start_tod')
02311 rest_start_tod = intvar
02312 case('ref_ymd')
02313 rest_ref_ymd = intvar
02314 case('ref_tod')
02315 rest_ref_tod = intvar
02316 case('curr_ymd')
02317 rest_curr_ymd = intvar
02318 case('curr_tod')
02319 rest_curr_tod = intvar
02320
02321 case default
02322 write(logunit,*) subname,' ERROR descripGet not implemented for ',trim(restname(n))
02323 call shr_sys_abort()
02324 endselect
02325 enddo
02326
02327 endif
02328
02329 end subroutine seq_timemgr_clockRestart
02330
02331
02332
02333
02334
02335
02336
02337
02338
02339
02340
02341 subroutine seq_timemgr_clockPrint( SyncClock )
02342
02343 implicit none
02344
02345
02346
02347 type(seq_timemgr_type), intent(in) :: SyncClock
02348
02349
02350
02351 character(len=*), parameter :: subname = "(seq_timemgr_clockPrint) "
02352 integer(SHR_KIND_IN) :: m,n
02353 integer(SHR_KIND_IN) :: curr_ymd
02354 integer(SHR_KIND_IN) :: curr_tod
02355 integer(SHR_KIND_IN) :: StepNo
02356 integer(SHR_KIND_IN) :: start_ymd
02357 integer(SHR_KIND_IN) :: start_tod
02358 integer(SHR_KIND_IN) :: stop_ymd
02359 integer(SHR_KIND_IN) :: stop_tod
02360 integer(SHR_KIND_IN) :: ref_ymd
02361 integer(SHR_KIND_IN) :: ref_tod
02362 integer(SHR_KIND_IN) :: DTime
02363 integer(SHR_KIND_IN) :: prev_ymd
02364 integer(SHR_KIND_IN) :: prev_tod
02365 integer(SHR_KIND_IN) :: next_ymd
02366 integer(SHR_KIND_IN) :: next_tod
02367 integer(SHR_KIND_IN) :: IntSec
02368 integer(SHR_KIND_IN) :: IntMon
02369 integer(SHR_KIND_IN) :: IntYrs
02370 integer(SHR_KIND_IN) :: AlarmCount
02371 character(len=64) :: alarmname
02372 character(len=*), parameter :: xalarm = 'unset'
02373 type(ESMF_Alarm),pointer :: EAlarm_list(:)
02374 integer(SHR_KIND_IN) :: rc
02375
02376 character(len=*), parameter :: F06 = "(2A,L3)"
02377 character(len=*), parameter :: F07 = "(3A)"
02378 character(len=*), parameter :: F08 = "(2A,I8.8,3x,I5.5)"
02379 character(len=*), parameter :: F09 = "(2A,2I8,I12)"
02380 character(len=*), parameter :: F10 = "(2A,I2,2x,A)"
02381
02382
02383
02384
02385
02386 if (loglevel <= 0) return
02387
02388 write(logunit,F07) subname,'calendar = ', trim(seq_timemgr_calendar)
02389 write(logunit,F06) subname,'end_restart = ', seq_timemgr_end_restart
02390 write(logunit,F07) ''
02391
02392 do n = 1,max_clocks
02393 call seq_timemgr_EClockGetData( SyncClock%ECP(n)%EClock, curr_ymd=curr_ymd, &
02394 curr_tod=curr_tod, start_ymd=start_ymd, &
02395 start_tod=start_tod, StepNo=StepNo, &
02396 ref_ymd=ref_ymd, ref_tod=ref_tod, &
02397 stop_ymd=stop_ymd, stop_tod=stop_tod, &
02398 dtime = dtime, alarmcount=AlarmCount)
02399 #ifdef USE_ESMF_LIB
02400 allocate(EAlarm_list(AlarmCount))
02401 call ESMF_ClockGetAlarmList(SyncClock%ECP(n)%EClock, alarmListType=ESMF_ALARMLIST_ALL, &
02402 alarmList=EAlarm_list, alarmCount=AlarmCount, rc=rc)
02403 #else
02404 call ESMF_ClockGetAlarmList(SyncClock%ECP(n)%EClock, EAlarm_list, rc=rc)
02405 #endif
02406 call seq_timemgr_ESMFCodeCheck( rc, msg=subname//"Error from ESMF_ClockGetAlarmList" )
02407
02408 write(logunit,F09) subname,"Clock = "//seq_timemgr_clocks(n),n
02409 write(logunit,F08) subname," Start Time = ", start_ymd, start_tod
02410 write(logunit,F08) subname," Curr Time = ", curr_ymd, curr_tod
02411 write(logunit,F08) subname," Ref Time = ", ref_ymd, ref_tod
02412 write(logunit,F08) subname," Stop Time = ", stop_ymd, stop_tod
02413 write(logunit,F09) subname," Step number = ", StepNo
02414 write(logunit,F09) subname," Dtime = ", DTime
02415
02416 do m = 1,alarmCount
02417 call seq_timemgr_alarmGet( EAlarm_list(m), &
02418 next_ymd=next_ymd, next_tod=next_tod, prev_ymd=prev_ymd, prev_tod=prev_tod, &
02419 IntSec=IntSec, IntMon=IntMon, IntYrs=IntYrs, name=alarmname )
02420 write(logunit,F10) subname," Alarm = ",m,trim(alarmname)
02421 write(logunit,F08) subname," Prev Time = ", prev_ymd,prev_tod
02422 write(logunit,F08) subname," Next Time = ", next_ymd,next_tod
02423 write(logunit,F09) subname," Intervl yms = ", IntYrs,IntMon,IntSec
02424 enddo
02425
02426 write(logunit,*) ''
02427 #ifdef USE_ESMF_LIB
02428 deallocate(EAlarm_list)
02429 #endif
02430 enddo
02431
02432 end subroutine seq_timemgr_clockPrint
02433
02434
02435
02436
02437
02438
02439
02440
02441
02442
02443
02444 subroutine seq_timemgr_ESMFDebug( EClock, ETime, ETimeInterval, istring )
02445
02446 implicit none
02447
02448
02449
02450 type(ESMF_Clock), optional, intent(in) :: EClock
02451 type(ESMF_Time) , optional, intent(inout) :: ETime
02452 type(ESMF_TimeInterval), optional, intent(inout) :: ETimeInterval
02453 character(len=*), optional, intent(in) :: istring
02454
02455
02456
02457
02458 character(len=*), parameter :: subname = '(seq_timemgr_ESMFDebug) '
02459 character(len=128) :: timestring
02460 integer :: yy,mm,dd,s
02461 type(ESMF_Time) :: LTime
02462 type(ESMF_TimeInterval) :: LTimeInterval
02463 integer(SHR_KIND_I8) :: LStep
02464 integer :: rc
02465
02466
02467
02468
02469
02470 if (present(ETime)) then
02471 write(logunit,*) subname,' ETime ',trim(istring)
02472 call ESMF_TimeGet(ETime, yy=yy,mm=mm,dd=dd,s=s,timestring=timestring,rc=rc)
02473 write(logunit,*) subname,rc,'ymds=',yy,mm,dd,s,trim(timestring)
02474 endif
02475
02476 if (present(ETimeInterval)) then
02477 write(logunit,*) subname,' ETimeInterval ',trim(istring)
02478 call ESMF_TimeIntervalGet(ETimeInterval, yy=yy,mm=mm,d=dd,s=s,timestring=timestring,rc=rc)
02479 write(logunit,*) subname,rc,'ymds=',yy,mm,dd,s,trim(timestring)
02480 endif
02481
02482 if (present(EClock)) then
02483 write(logunit,*) subname,' EClock ',trim(istring)
02484 call ESMF_ClockGet( EClock, StartTime=LTime )
02485 call ESMF_TimeGet(LTime, yy=yy,mm=mm,dd=dd,s=s,timestring=timestring,rc=rc)
02486 write(logunit,*) subname,rc,'start ymds=',yy,mm,dd,s,trim(timestring)
02487 call ESMF_ClockGet( EClock, CurrTime=LTime )
02488 call ESMF_TimeGet(LTime, yy=yy,mm=mm,dd=dd,s=s,timestring=timestring,rc=rc)
02489 write(logunit,*) subname,rc,'curr ymds=',yy,mm,dd,s,trim(timestring)
02490 call ESMF_ClockGet( EClock, StopTime=LTime )
02491 call ESMF_TimeGet(LTime, yy=yy,mm=mm,dd=dd,s=s,timestring=timestring,rc=rc)
02492 write(logunit,*) subname,rc,'stop ymds=',yy,mm,dd,s,trim(timestring)
02493 call ESMF_ClockGet( EClock, PrevTime=LTime )
02494 call ESMF_TimeGet(LTime, yy=yy,mm=mm,dd=dd,s=s,timestring=timestring,rc=rc)
02495 write(logunit,*) subname,rc,'prev ymds=',yy,mm,dd,s,trim(timestring)
02496 call ESMF_ClockGet( EClock, RefTime=LTime )
02497 call ESMF_TimeGet(LTime, yy=yy,mm=mm,dd=dd,s=s,timestring=timestring,rc=rc)
02498 write(logunit,*) subname,rc,'ref ymds=',yy,mm,dd,s,trim(timestring)
02499 call ESMF_ClockGet( EClock, TimeStep=LTimeInterval )
02500 call ESMF_TimeIntervalGet(LTimeInterval, yy=yy,mm=mm,d=dd,s=s,timestring=timestring,rc=rc)
02501 write(logunit,*) subname,rc,'tint ymds=',yy,mm,dd,s,trim(timestring)
02502 call ESMF_ClockGet( EClock, AdvanceCount=LStep )
02503 write(logunit,*) subname,rc,'advcnt =',LStep
02504 endif
02505
02506 end subroutine seq_timemgr_ESMFDebug
02507
02508
02509
02510
02511
02512
02513
02514
02515
02516
02517
02518 subroutine seq_timemgr_ESMFCodeCheck( rc, msg )
02519
02520
02521
02522 implicit none
02523
02524
02525
02526 integer, intent(in) :: rc
02527 character(len=*),optional,intent(in) :: msg
02528
02529
02530
02531 character(len=*),parameter :: subname = 'seq_timemgr_ESMFCodeCheck'
02532
02533
02534
02535
02536 if ( rc == ESMF_SUCCESS ) return
02537 if ( present(msg)) then
02538 write(logunit,*) trim(subname),' error= ',rc,trim(msg)
02539 else
02540 write(logunit,*) trim(subname),' error= ',rc
02541 endif
02542 call shr_sys_flush(logunit)
02543 call shr_sys_abort(trim(subname))
02544
02545 end subroutine seq_timemgr_ESMFCodeCheck
02546
02547
02548
02549
02550 end module seq_timemgr_mod