merge standard release WRF/WPS V3.0.1.1 into wrffire
[wrffire.git] / wrfv2_fire / external / esmf_time_f90 / ESMF_Clock.F90
blob48dcffcba1156ea0a1bdbe13c4cc775a8437d9f4
2 ! Earth System Modeling Framework
3 ! Copyright 2002-2003, University Corporation for Atmospheric Research,
4 ! Massachusetts Institute of Technology, Geophysical Fluid Dynamics
5 ! Laboratory, University of Michigan, National Centers for Environmental
6 ! Prediction, Los Alamos National Laboratory, Argonne National Laboratory,
7 ! NASA Goddard Space Flight Center.
8 ! Licensed under the University of Illinois-NCSA license.
10 !==============================================================================
12 !     ESMF Clock Module
13       module ESMF_ClockMod
14 !     
15 !==============================================================================
16 !     
17 ! This file contains the Clock class definition and all Clock class methods.
18 !     
19 !------------------------------------------------------------------------------
20 ! INCLUDES
21 #include <ESMF_TimeMgr.inc> 
23 !==============================================================================
24 !BOPI
25 ! !MODULE: ESMF_ClockMod
26 !     
27 ! !DESCRIPTION:
28 ! Part of Time Manager F90 API wrapper of C++ implemenation
30 ! Defines F90 wrapper entry points for corresponding
31 ! C++ class {\tt ESMC\_Time} implementation
32 !     
33 ! See {\tt ../include/ESMC\_Clock.h} for complete description
35 !------------------------------------------------------------------------------
36 ! !USES:
37       ! inherit from ESMF base class
38       use ESMF_BaseMod
40       ! associated derived types
41       use ESMF_TimeIntervalMod   ! , only : ESMF_TimeInterval, &
42                                  !          ESMF_TimeIntervalIsPositive
43       use ESMF_TimeMod           ! , only : ESMF_Time
44       use ESMF_AlarmMod,        only : ESMF_Alarm
46       implicit none
48 !------------------------------------------------------------------------------
49 ! !PRIVATE TYPES:
50       private
51 !------------------------------------------------------------------------------
52 !     ! ESMF_Clock
53 !     
54 !     ! F90 class type to match C++ Clock class in size only;
55 !     !  all dereferencing within class is performed by C++ implementation
57 ! internals for ESMF_Clock
58       type ESMF_ClockInt
59         type(ESMF_TimeInterval) :: TimeStep
60         type(ESMF_Time)  :: StartTime
61         type(ESMF_Time)  :: StopTime
62         type(ESMF_Time)  :: RefTime
63         type(ESMF_Time)  :: CurrTime
64         type(ESMF_Time)  :: PrevTime
65         integer(ESMF_KIND_I8) :: AdvanceCount
66         integer :: ClockMutex
67         integer :: NumAlarms
68         ! Note:  to mimic ESMF 2.1.0+, AlarmList is maintained 
69         ! within ESMF_Clock even though copies of each alarm are 
70         ! returned from ESMF_AlarmCreate() at the same time they 
71         ! are copied into the AlarmList!  This duplication is not 
72         ! as hideous as it might be because the ESMF_Alarm type 
73         ! has data members that are all POINTERs (thus the horrible 
74         ! shallow-copy-masquerading-as-reference-copy hack works).  
75         type(ESMF_Alarm), pointer, dimension(:) :: AlarmList
76       end type
78 ! Actual public type:  this bit allows easy mimic of "deep" ESMF_ClockCreate 
79 ! in ESMF 2.1.0+
80 ! NOTE:  DO NOT ADD NON-POINTER STATE TO THIS DATA TYPE.  It emulates ESMF 
81 !        shallow-copy-masquerading-as-reference-copy.  
82       type ESMF_Clock
83         type(ESMF_ClockInt), pointer  :: clockint
84       end type
86 !------------------------------------------------------------------------------
87 ! !PUBLIC TYPES:
88       public ESMF_Clock
89       public ESMF_ClockInt   ! needed on AIX but not PGI
90 !------------------------------------------------------------------------------
92 ! !PUBLIC MEMBER FUNCTIONS:
93       public ESMF_ClockCreate
94       public ESMF_ClockDestroy
95       public ESMF_ClockSet
96 !      public ESMF_ClockSetOLD
97       public ESMF_ClockGet
98 !      public ESMF_ClockGetAdvanceCount
99 !      public ESMF_ClockGetTimeStep
100 !      public ESMF_ClockSetTimeStep
101 !      public ESMF_ClockGetCurrTime
102 !      public ESMF_ClockSetCurrTime
103 !      public ESMF_ClockGetStartTime
104 !      public ESMF_ClockGetStopTime
105 !      public ESMF_ClockGetRefTime
106 !      public ESMF_ClockGetPrevTime
107 !      public ESMF_ClockGetCurrSimTime
108 !      public ESMF_ClockGetPrevSimTime
109 ! This must be public for ESMF_AlarmClockMod...  
110       public ESMF_ClockAddAlarm
111       public ESMF_ClockGetAlarmList
112 !      public ESMF_ClockGetNumAlarms
113 !      public ESMF_ClockSyncToWallClock
114       public ESMF_ClockAdvance
115       public ESMF_ClockIsStopTime
116       public ESMF_ClockStopTimeDisable
118 ! Required inherited and overridden ESMF_Base class methods
120 !      public ESMF_ClockRead
121 !      public ESMF_ClockWrite
122       public ESMF_ClockValidate
123       public ESMF_ClockPrint
124 !EOPI
126 !==============================================================================
128       contains
130 !==============================================================================
132 ! This section includes the Set methods.
134 !------------------------------------------------------------------------------
135 !BOP
136 ! !IROUTINE: ESMF_ClockSetOLD - Initialize a clockint
138 ! !INTERFACE:
139       subroutine ESMF_ClockSetOLD(clockint, TimeStep, StartTime, &
140                                   StopTime, RefTime, rc)
142 ! !ARGUMENTS:
143       type(ESMF_ClockInt), intent(out) :: clockint
144       type(ESMF_TimeInterval), intent(in), optional :: TimeStep
145       type(ESMF_Time), intent(in) :: StartTime
146       type(ESMF_Time), intent(in) :: StopTime
147       type(ESMF_Time), intent(in), optional :: RefTime
148       integer, intent(out), optional :: rc
149 ! Local
150       integer i
151     
152 ! !DESCRIPTION:
153 !     Initialize an {\tt ESMF\_Clock}
154 !     
155 !     The arguments are:
156 !     \begin{description}
157 !     \item[clockint]
158 !          The object instance to initialize
159 !     \item[{[TimeStep]}]
160 !          The {\tt ESMF\_Clock}'s time step interval
161 !     \item[StartTime]
162 !          The {\tt ESMF\_Clock}'s starting time
163 !     \item[StopTime]
164 !          The {\tt ESMF\_Clock}'s stopping time
165 !     \item[{[RefTime]}]
166 !          The {\tt ESMF\_Clock}'s reference time
167 !     \item[{[rc]}]
168 !          Return code; equals {\tt ESMF\_SUCCESS} if there are no errors.
169 !     \end{description}
170 !     
171 ! !REQUIREMENTS:
172 !     TMG3.1, TMG3.4.4
173 !EOP
174       IF ( PRESENT(TimeStep) ) clockint%TimeStep = TimeStep
175       IF ( PRESENT(RefTime) )THEN
176          clockint%RefTime = RefTime
177       ELSE
178          clockint%RefTime = StartTime
179       END IF
180       clockint%CurrTime = StartTime
181       clockint%StartTime = StartTime
182       clockint%StopTime = StopTime
183       clockint%NumAlarms = 0
184       clockint%AdvanceCount = 0
185       ALLOCATE(clockint%AlarmList(MAX_ALARMS))
186       ! TBH:  This incredible hack can be removed once ESMF_*Validate() 
187       ! TBH:  can tell if a deep ESMF_* was created or not.  
188       DO i = 1, MAX_ALARMS
189         NULLIFY( clockint%AlarmList( i )%alarmint )
190       ENDDO
191       IF ( PRESENT( rc ) ) rc = ESMF_SUCCESS
192     
193       end subroutine ESMF_ClockSetOLD
196 ! !IROUTINE: ESMF_ClockSet - Set clock properties -- for compatibility with ESMF 2.0.1
198 ! !INTERFACE:
199       subroutine ESMF_ClockSet(clock, TimeStep, StartTime, StopTime, &
200                                RefTime, CurrTime, rc)
202 ! !ARGUMENTS:
203       type(ESMF_Clock), intent(inout) :: clock
204       type(ESMF_TimeInterval), intent(in), optional :: TimeStep
205       type(ESMF_Time), intent(in), optional :: StartTime
206       type(ESMF_Time), intent(in), optional :: StopTime
207       type(ESMF_Time), intent(in), optional :: RefTime
208       type(ESMF_Time), intent(in), optional :: CurrTime
209       integer, intent(out), optional :: rc
210 ! Local
211       integer ierr
212     
213 ! !DESCRIPTION:
214 !     Initialize an {\tt ESMF\_Clock}
215 !     
216 !     The arguments are:
217 !     \begin{description}
218 !     \item[clock]
219 !          The object instance to initialize
220 !     \item[{[TimeStep]}]
221 !          The {\tt ESMF\_Clock}'s time step interval
222 !     \item[StartTime]
223 !          The {\tt ESMF\_Clock}'s starting time
224 !     \item[StopTime]
225 !          The {\tt ESMF\_Clock}'s stopping time
226 !     \item[{[RefTime]}]
227 !          The {\tt ESMF\_Clock}'s reference time
228 !     \item[{[rc]}]
229 !          Return code; equals {\tt ESMF\_SUCCESS} if there are no errors.
230 !     \end{description}
231 !     
232 ! !REQUIREMENTS:
233 !     TMG3.1, TMG3.4.4
234 !EOP
235       ierr = ESMF_SUCCESS
236       IF ( PRESENT(TimeStep) ) THEN
237         CALL ESMF_ClockSetTimeStep ( clock, TimeStep, rc=ierr )
238       ENDIF
239       IF ( PRESENT(RefTime) ) clock%clockint%RefTime = RefTime
240       IF ( PRESENT(StartTime) ) clock%clockint%StartTime = StartTime
241       IF ( PRESENT(StopTime) ) clock%clockint%StopTime = StopTime
242       IF ( PRESENT(CurrTime) ) THEN
243         CALL ESMF_ClockSetCurrTime(clock, CurrTime, rc=ierr)
244       ENDIF
245       IF ( PRESENT(rc) ) rc = ierr
247       end subroutine ESMF_ClockSet
250 ! Create ESMF_Clock using ESMF 2.1.0+ semantics
251       FUNCTION ESMF_ClockCreate( name, TimeStep, StartTime, StopTime, &
252                                  RefTime, rc )
253         ! return value
254         type(ESMF_Clock) :: ESMF_ClockCreate
255         ! !ARGUMENTS:
256         character (len=*),       intent(in),  optional :: name
257         type(ESMF_TimeInterval), intent(in), optional :: TimeStep
258         type(ESMF_Time), intent(in) :: StartTime
259         type(ESMF_Time), intent(in) :: StopTime
260         type(ESMF_Time), intent(in), optional :: RefTime
261         integer, intent(out), optional :: rc
262         ! locals
263         type(ESMF_Clock) :: clocktmp
264          ! TBH:  ignore allocate errors, for now
265         ALLOCATE( clocktmp%clockint )
266         CALL ESMF_ClockSetOLD( clocktmp%clockint,   &
267                                TimeStep= TimeStep,  &
268                                StartTime=StartTime, &
269                                StopTime= StopTime,  &
270                                RefTime=RefTime, rc=rc )
271         ESMF_ClockCreate = clocktmp
272       END FUNCTION ESMF_ClockCreate
275 ! Deallocate memory for ESMF_Clock
276       SUBROUTINE ESMF_ClockDestroy( clock, rc )
277          TYPE(ESMF_Clock), INTENT(INOUT) :: clock
278          INTEGER,          INTENT(  OUT), OPTIONAL :: rc
279          ! TBH:  ignore deallocate errors, for now
280          DEALLOCATE( clock%clockint%AlarmList )
281          DEALLOCATE( clock%clockint )
282          IF ( PRESENT( rc ) ) rc = ESMF_SUCCESS
283       END SUBROUTINE ESMF_ClockDestroy
286 !------------------------------------------------------------------------------
287 !BOP
288 ! !IROUTINE: ESMF_ClockGet - Get clock properties -- for compatibility with ESMF 2.0.1 
290 ! !INTERFACE:
291       subroutine ESMF_ClockGet(clock, StartTime, CurrTime,       &
292                                AdvanceCount, StopTime, TimeStep, &
293                                PrevTime, RefTime, &
294                                rc)
296 ! !ARGUMENTS:
297       type(ESMF_Clock), intent(in) :: clock
298       type(ESMF_Time), intent(out), optional :: StartTime
299       type(ESMF_Time), intent(out), optional :: CurrTime
300       type(ESMF_Time), intent(out), optional :: StopTime
301       type(ESMF_Time), intent(out), optional :: PrevTime
302       type(ESMF_Time), intent(out), optional :: RefTime
303       integer(ESMF_KIND_I8), intent(out), optional :: AdvanceCount
304       type(ESMF_TimeInterval), intent(out), optional :: TimeStep
305       integer, intent(out), optional :: rc
306       integer :: ierr
308 ! !DESCRIPTION:
309 !     Returns the number of times the {\tt ESMF\_Clock} has been advanced
310 !     (time stepped)
312 !     The arguments are:
313 !     \begin{description}
314 !     \item[clock]
315 !          The object instance to get the advance count from
316 !     \item[StartTime]
317 !          The start time
318 !     \item[CurrTime]
319 !          The current time
320 !     \item[AdvanceCount]
321 !          The number of times the {\tt ESMF\_Clock} has been advanced
322 !     \item[StopTime]
323 !          The {\tt ESMF\_Clock}'s stopping time
324 !     \item[{[TimeStep]}]
325 !          The {\tt ESMF\_Clock}'s time step interval
326 !     \item[{[PrevTime]}]
327 !          The {\tt ESMF\_Clock}'s previous current time
328 !     \item[{[PrevTime]}]
329 !          The {\tt ESMF\_Clock}'s reference time
330 !     \item[{[rc]}]
331 !          Return code; equals {\tt ESMF\_SUCCESS} if there are no errors.
332 !     \end{description}
334 ! !REQUIREMENTS:
335 !     TMG3.5.1
336 !EOP
337       ierr = ESMF_SUCCESS
339       IF ( PRESENT (StartTime) ) THEN
340         CALL ESMF_ClockGetStartTime( clock, StartTime=StartTime, rc=ierr )
341       ENDIF
342       IF ( PRESENT (CurrTime) ) THEN
343         CALL ESMF_ClockGetCurrTime( clock , CurrTime, ierr )
344       ENDIF
345       IF ( PRESENT (StopTime) ) THEN
346         CALL ESMF_ClockGetStopTime( clock , StopTime, ierr )
347       ENDIF
348       IF ( PRESENT (AdvanceCount) ) THEN
349         CALL ESMF_ClockGetAdvanceCount(clock, AdvanceCount, ierr)
350       ENDIF
351       IF ( PRESENT (TimeStep) ) THEN
352         CALL ESMF_ClockGetTimeStep(clock, TimeStep, ierr)
353       ENDIF
354       IF ( PRESENT (PrevTime) ) THEN
355         CALL ESMF_ClockGetPrevTime(clock, PrevTime, ierr)
356       ENDIF
357       IF ( PRESENT (RefTime) ) THEN
358         CALL ESMF_ClockGetRefTime(clock, RefTime, ierr)
359       ENDIF
361       IF ( PRESENT (rc) ) THEN
362         rc = ierr
363       ENDIF
364     
365       end subroutine ESMF_ClockGet
368 ! !IROUTINE: ESMF_ClockGetAdvanceCount - Get the clock's advance count
370 ! !INTERFACE:
371       subroutine ESMF_ClockGetAdvanceCount(clock, AdvanceCount, rc)
373 ! !ARGUMENTS:
374       type(ESMF_Clock), intent(in) :: clock
375       integer(ESMF_KIND_I8), intent(out) :: AdvanceCount
376       integer, intent(out), optional :: rc
378 ! !DESCRIPTION:
379 !     Returns the number of times the {\tt ESMF\_Clock} has been advanced
380 !     (time stepped)
382 !     The arguments are:
383 !     \begin{description}
384 !     \item[clock]
385 !          The object instance to get the advance count from
386 !     \item[AdvanceCount]
387 !          The number of times the {\tt ESMF\_Clock} has been advanced
388 !     \item[{[rc]}]
389 !          Return code; equals {\tt ESMF\_SUCCESS} if there are no errors.
390 !     \end{description}
392 ! !REQUIREMENTS:
393 !     TMG3.5.1
394 !EOP
396       AdvanceCount = clock%clockint%AdvanceCount
398       IF ( PRESENT(rc) ) rc = ESMF_SUCCESS
399     
400       end subroutine ESMF_ClockGetAdvanceCount
402 !------------------------------------------------------------------------------
403 !BOP
404 ! !IROUTINE: ESMF_ClockGetTimeStep - Get a clock's timestep interval
406 ! !INTERFACE:
407       subroutine ESMF_ClockGetTimeStep(clock, TimeStep, rc)
409 ! !ARGUMENTS:
410       type(ESMF_Clock), intent(in) :: clock
411       type(ESMF_TimeInterval), intent(out) :: TimeStep
412       integer, intent(out), optional :: rc
414 ! !DESCRIPTION:
415 !     Get an {\tt ESMF\_Clock}'s timestep interval
417 !     The arguments are:
418 !     \begin{description}
419 !     \item[clock]
420 !          The object instance to get the time step from
421 !     \item[TimeStep]
422 !          The time step
423 !     \item[{[rc]}]
424 !          Return code; equals {\tt ESMF\_SUCCESS} if there are no errors.
425 !     \end{description}
427 ! !REQUIREMENTS:
428 !     TMG3.5.2
429 !EOP
431       TimeStep = clock%clockint%TimeStep
432       IF ( PRESENT(rc) ) rc = ESMF_SUCCESS
433     
434       end subroutine ESMF_ClockGetTimeStep
436 !------------------------------------------------------------------------------
437 !BOP
438 ! !IROUTINE: ESMF_ClockSetTimeStep - Set a clock's timestep interval
440 ! !INTERFACE:
441       subroutine ESMF_ClockSetTimeStep(clock, TimeStep, rc)
443 ! !ARGUMENTS:
444       type(ESMF_Clock), intent(inout) :: clock  ! really INTENT(OUT)
445       type(ESMF_TimeInterval), intent(in) :: TimeStep
446       integer, intent(out), optional      :: rc
448 ! !DESCRIPTION:
449 !     Set an {\tt ESMF\_Clock}'s timestep interval
451 !     The arguments are:
452 !     \begin{description}
453 !     \item[clock]
454 !          The object instance to set the time step
455 !     \item[TimeStep]
456 !          The time step
457 !     \item[{[rc]}]
458 !          Return code; equals {\tt ESMF\_SUCCESS} if there are no errors.
459 !     \end{description}
461 ! !REQUIREMENTS:
462 !     TMG3.4.2
463 !EOP
465       clock%clockint%TimeStep = TimeStep
466       IF ( PRESENT(rc) ) rc = ESMF_SUCCESS
468       end subroutine ESMF_ClockSetTimeStep
470 !------------------------------------------------------------------------------
471 !BOP
472 ! !IROUTINE: ESMF_ClockGetCurrTime - Get a clock's current time
474 ! !INTERFACE:
475       subroutine ESMF_ClockGetCurrTime(clock, CurrTime, rc)
477 ! !ARGUMENTS:
478       type(ESMF_Clock), intent(in) :: clock
479       type(ESMF_Time), intent(out) :: CurrTime
480       integer, intent(out), optional :: rc
482 ! !DESCRIPTION:
483 !     Get an {\tt ESMF\_Clock}'s current time     
485 !     The arguments are:
486 !     \begin{description}
487 !     \item[clock]
488 !          The object instance to get the current time from
489 !     \item[CurrTime]
490 !          The current time
491 !     \item[{[rc]}]
492 !          Return code; equals {\tt ESMF\_SUCCESS} if there are no errors.
493 !     \end{description}
495 ! !REQUIREMENTS:
496 !     TMG3.5.4
497 !EOP
499       CurrTime = clock%clockint%CurrTime
500       IF ( PRESENT(rc) ) rc = ESMF_SUCCESS
501       end subroutine ESMF_ClockGetCurrTime
503 !------------------------------------------------------------------------------
504 !BOP
505 ! !IROUTINE: ESMF_ClockSetCurrTime - Set a clock's current time
507 ! !INTERFACE:
508       subroutine ESMF_ClockSetCurrTime(clock, CurrTime, rc)
510 ! !ARGUMENTS:
511       type(ESMF_Clock), intent(inout) :: clock  ! really INTENT(OUT)
512       type(ESMF_Time), intent(in) :: CurrTime
513       integer, intent(out), optional :: rc
515 ! !DESCRIPTION:
516 !     Set an {\tt ESMF\_Clock}'s current time
518 !     The arguments are:
519 !     \begin{description}
520 !     \item[clock]
521 !          The object instance to set the current time from
522 !     \item[CurrTime]
523 !          The current time
524 !     \item[{[rc]}]
525 !          Return code; equals {\tt ESMF\_SUCCESS} if there are no errors.
526 !     \end{description}
528 ! !REQUIREMENTS:
529 !     TMG3.4.3
530 !EOP
532       clock%clockint%CurrTime = CurrTime
533       IF ( PRESENT(rc) ) rc = ESMF_SUCCESS
534     
535       end subroutine ESMF_ClockSetCurrTime
537 !------------------------------------------------------------------------------
538 !BOP
539 ! !IROUTINE: ESMF_ClockGetStartTime - Get a clock's start time
541 ! !INTERFACE:
542       subroutine ESMF_ClockGetStartTime(clock, StartTime, rc)
544 ! !ARGUMENTS:
545       type(ESMF_Clock), intent(in) :: clock
546       type(ESMF_Time), intent(out) :: StartTime
547       integer, intent(out), optional :: rc
549 ! !DESCRIPTION:
550 !     Get an {\tt ESMF\_Clock}'s start time
552 !     The arguments are:
553 !     \begin{description}
554 !     \item[clock]
555 !          The object instance to get the start time from
556 !     \item[StartTime]
557 !          The start time
558 !     \item[{[rc]}]
559 !          Return code; equals {\tt ESMF\_SUCCESS} if there are no errors.
560 !     \end{description}
562 ! !REQUIREMENTS:
563 !     TMG3.5.3
564 !EOP
566       StartTime = clock%clockint%StartTime
567       IF ( PRESENT(rc) ) rc = ESMF_SUCCESS
568     
569       end subroutine ESMF_ClockGetStartTime
571 !------------------------------------------------------------------------------
572 !BOP
573 ! !IROUTINE: ESMF_ClockGetStopTime - Get a clock's stop time
575 ! !INTERFACE:
576       subroutine ESMF_ClockGetStopTime(clock, StopTime, rc)
578 ! !ARGUMENTS:
579       type(ESMF_Clock), intent(in) :: clock
580       type(ESMF_Time), intent(out) :: StopTime
581       integer, intent(out), optional :: rc
583 ! !DESCRIPTION:
584 !     Get an {\tt ESMF\_Clock}'s stop time
586 !     The arguments are:
587 !     \begin{description}
588 !     \item[clock]
589 !          The object instance to get the stop time from
590 !     \item[StopTime]
591 !          The stop time
592 !     \item[{[rc]}]
593 !          Return code; equals {\tt ESMF\_SUCCESS} if there are no errors.
594 !     \end{description}
596 ! !REQUIREMENTS:
597 !     TMG3.5.3
598 !EOP
600       StopTime = clock%clockint%StopTime
601       IF ( PRESENT(rc) ) rc = ESMF_SUCCESS
602     
603       end subroutine ESMF_ClockGetStopTime
605 !------------------------------------------------------------------------------
606 !BOP
607 ! !IROUTINE: ESMF_ClockGetRefTime - Get a clock's reference time
609 ! !INTERFACE:
610       subroutine ESMF_ClockGetRefTime(clock, RefTime, rc)
612 ! !ARGUMENTS:
613       type(ESMF_Clock), intent(in) :: clock
614       type(ESMF_Time), intent(out) :: RefTime
615       integer, intent(out), optional :: rc
617 ! !DESCRIPTION:
618 !     Get an {\tt ESMF\_Clock}'s reference time
620 !     The arguments are:
621 !     \begin{description}
622 !     \item[clock]
623 !          The object instance to get the reference time from
624 !     \item[RefTime]
625 !          The reference time
626 !     \item[{[rc]}]
627 !          Return code; equals {\tt ESMF\_SUCCESS} if there are no errors.
628 !     \end{description}
630 ! !REQUIREMENTS:
631 !     TMG3.5.3
632 !EOP
633       refTime = clock%clockint%RefTime
634       IF ( PRESENT(rc) ) rc = ESMF_SUCCESS
635       end subroutine ESMF_ClockGetRefTime
637 !------------------------------------------------------------------------------
638 !BOP
639 ! !IROUTINE: ESMF_ClockGetPrevTime - Get a clock's previous current time
641 ! !INTERFACE:
642       subroutine ESMF_ClockGetPrevTime(clock, PrevTime, rc)
644 ! !ARGUMENTS:
645       type(ESMF_Clock), intent(in) :: clock
646       type(ESMF_Time), intent(out) :: PrevTime
647       integer, intent(out), optional :: rc
649 ! !DESCRIPTION:
650 !     Get an {\tt ESMF\_Clock}'s previous current time
652 !     The arguments are:
653 !     \begin{description}
654 !     \item[clock]
655 !          The object instance to get the previous current time from
656 !     \item[PrevTime]
657 !          The previous current time
658 !     \item[{[rc]}]
659 !          Return code; equals {\tt ESMF\_SUCCESS} if there are no errors.
660 !     \end{description}
662 ! !REQUIREMENTS:
663 !     TMG3.5.4
664 !EOP
666 ! hack for bug in PGI 5.1-x
667 !      prevTime = Clock%clockint%CurrTime - Clock%clockint%TimeStep
668       prevTime = ESMF_TimeDec( Clock%clockint%CurrTime, &
669                                Clock%clockint%TimeStep )
671       IF ( PRESENT(rc) ) rc = ESMF_SUCCESS
672       end subroutine ESMF_ClockGetPrevTime
674 !------------------------------------------------------------------------------
675 !BOP
676 ! !IROUTINE: ESMF_ClockGetCurrSimTime - Get a clock's current simulation time
678 ! !INTERFACE:
679       subroutine ESMF_ClockGetCurrSimTime(clock, CurrSimTime, rc)
681 ! !ARGUMENTS:
682       type(ESMF_Clock), intent(in) :: clock
683       type(ESMF_TimeInterval), intent(out) :: CurrSimTime
684       integer, intent(out), optional :: rc
686 ! !DESCRIPTION:
687 !     Get an {\tt ESMF\_Clock}'s current simulation time
689 !     The arguments are:
690 !     \begin{description}
691 !     \item[clock]
692 !          The object instance to get the current simulation time from
693 !     \item[CurrSimTime]
694 !          The current simulation time
695 !     \item[{[rc]}]
696 !          Return code; equals {\tt ESMF\_SUCCESS} if there are no errors.
697 !     \end{description}
699 ! !REQUIREMENTS:
700 !     TMG3.5.5
701 !EOP
702       CALL wrf_error_fatal( 'ESMF_ClockGetCurrSimTime not supported' )
703       end subroutine ESMF_ClockGetCurrSimTime
705 !------------------------------------------------------------------------------
706 !BOP
707 ! !IROUTINE: ESMF_ClockGetPrevSimTime - Get a clock's previous simulation time
709 ! !INTERFACE:
710       subroutine ESMF_ClockGetPrevSimTime(clock, PrevSimTime, rc)
712 ! !ARGUMENTS:
713       type(ESMF_Clock), intent(in) :: clock
714       type(ESMF_TimeInterval), intent(out) :: PrevSimTime
715       integer, intent(out), optional :: rc
717 ! !DESCRIPTION:
718 !     Get an {\tt ESMF\_Clock}'s previous simulation time
720 !     The arguments are:
721 !     \begin{description}
722 !     \item[clock]
723 !          The object instance to get the previous simulation time from
724 !     \item[PrevSimTime]
725 !          The previous simulation time
726 !     \item[{[rc]}]
727 !          Return code; equals {\tt ESMF\_SUCCESS} if there are no errors.
728 !     \end{description}
730 ! !REQUIREMENTS:
731 !     TMG3.5.5
732 !EOP
733       CALL wrf_error_fatal( 'ESMF_ClockGetPrevSimTime not supported' )
734       end subroutine ESMF_ClockGetPrevSimTime
736 !------------------------------------------------------------------------------
737 !BOP
738 ! !IROUTINE: ESMF_ClockAddAlarm - Add an alarm to a clock's alarm list
740 ! !INTERFACE:
741       subroutine ESMF_ClockAddAlarm(clock, Alarm, rc)
743 ! !ARGUMENTS:
744       type(ESMF_Clock), intent(inout) :: clock
745       type(ESMF_Alarm), intent(inout) :: Alarm
746       integer, intent(out), optional :: rc
748 ! !DESCRIPTION:
749 !     Add an {\tt ESMF\_Alarm} to an {\tt ESMF\_Clock}'s {\tt ESMF\_Alarm} list
751 !     The arguments are:
752 !     \begin{description}
753 !     \item[clock]
754 !          The object instance to add an {\tt ESMF\_Alarm} to
755 !     \item[Alarm]
756 !          The {\tt ESMF\_Alarm} to add to the {\tt ESMF\_Clock}'s
757 !          {\tt ESMF\_Alarm} list
758 !     \item[{[rc]}]
759 !          Return code; equals {\tt ESMF\_SUCCESS} if there are no errors.
760 !     \end{description}
761 !   
762 ! !REQUIREMENTS:
763 !     TMG4.1, TMG4.2
764 !EOP
765     
766       IF ( PRESENT( rc ) ) rc = ESMF_SUCCESS
767       clock%clockint%NumAlarms = clock%clockint%NumAlarms + 1
768       IF ( clock%clockint%NumAlarms > SIZE (clock%clockint%AlarmList) ) THEN
769         CALL wrf_error_fatal ( 'ESMF_ClockAddAlarm:  too many alarms' )
770       ELSE IF ( .NOT. ASSOCIATED( Alarm%alarmint ) ) THEN
771         CALL wrf_error_fatal ( &
772                'ESMF_ClockAddAlarm:  alarm not created' )
773       ELSE
774         IF ( Alarm%alarmint%RingTimeSet ) THEN
775            Alarm%alarmint%PrevRingTime = Alarm%alarmint%RingTime
776         ELSE
777 !TBH:  This has the nasty side-effect of forcing us to explicitly turn on 
778 !TBH:  alarms that are created with RingInterval only, if we want them to start 
779 !TBH:  ringing right away.  And this is done (see 
780 !TBH:  COMPUTE_VORTEX_CENTER_ALARM).  Straighten this out...  
781            Alarm%alarmint%PrevRingTime = clock%clockint%CurrTime
782         ENDIF
783         Alarm%alarmint%Ringing = .FALSE.
785         ! finally, load the alarm into the list
786         clock%clockint%AlarmList(clock%clockint%NumAlarms) = Alarm
787       ENDIF
788     
789       end subroutine ESMF_ClockAddAlarm
791 !------------------------------------------------------------------------------
792 !BOP
793 ! !IROUTINE: ESMF_ClockGetAlarmList - Get a clock's alarm list
795 ! !INTERFACE:
796       subroutine ESMF_ClockGetAlarmList(clock, AlarmList, rc)
798 ! !ARGUMENTS:
799       type(ESMF_Clock), intent(in) :: clock
800       type(ESMF_Alarm), pointer :: AlarmList(:)
801       integer, intent(out), optional :: rc
803 ! !DESCRIPTION:
804 !     Get an {\tt ESMF\_Clock}'s {\tt ESMF\_Alarm} list     
805 !   
806 !     The arguments are:
807 !     \begin{description}
808 !     \item[clock]
809 !          The object instance to get the {\tt ESMF\_Alarm} list from
810 !     \item[AlarmList]
811 !          The {\tt ESMF\_Clock}'s {\tt ESMF\_Alarm} list
812 !     \item[{[rc]}]
813 !          Return code; equals {\tt ESMF\_SUCCESS} if there are no errors.
814 !     \end{description}
815 !   
816 ! !REQUIREMENTS:
817 !     TMG4.3
818 !EOP
820       AlarmList => clock%clockint%AlarmList
821       IF ( PRESENT(rc) ) rc = ESMF_SUCCESS
823       end subroutine ESMF_ClockGetAlarmList
825 !------------------------------------------------------------------------------
826 !BOP
827 ! !IROUTINE: ESMF_ClockGetNumAlarms - Get the number of alarms in a clock's alarm list
829 ! !INTERFACE:
830       subroutine ESMF_ClockGetNumAlarms(clock, NumAlarms, rc)
832 ! !ARGUMENTS:
833       type(ESMF_Clock), intent(in) :: clock
834       integer, intent(out) :: NumAlarms
835       integer, intent(out), optional :: rc
837 ! !DESCRIPTION:
838 !     Get the number of {\tt ESMF\_Alarm}s in an {\tt ESMF\_Clock}'s
839 !       {\tt ESMF\_Alarm} list     
840 !   
841 !     The arguments are:
842 !     \begin{description}
843 !     \item[clock]
844 !          The object instance to get the number of {\tt ESMF\_Alarm}s from
845 !     \item[NumAlarms]
846 !          The number of {\tt ESMF\_Alarm}s in the {\tt ESMF\_Clock}'s
847 !            {\tt ESMF\_Alarm} list
848 !     \item[{[rc]}]
849 !          Return code; equals {\tt ESMF\_SUCCESS} if there are no errors.
850 !     \end{description}
851 !   
852 ! !REQUIREMENTS:
853 !     TMG4.3
854 !EOP
856       NumAlarms = clock%clockint%NumAlarms
857       IF ( PRESENT(rc) ) rc = ESMF_SUCCESS
858     
859       end subroutine ESMF_ClockGetNumAlarms
861 !------------------------------------------------------------------------------
862 !BOP
863 ! !IROUTINE: ESMF_ClockSyncToWallClock - Set clock's current time to wall clock time
865 ! !INTERFACE:
866       subroutine ESMF_ClockSyncToWallClock(clock, rc)
868 ! !ARGUMENTS:
869       type(ESMF_Clock), intent(inout) :: clock
870       integer, intent(out), optional :: rc
871     
872 ! !DESCRIPTION:
873 !     Set an {\tt ESMF\_Clock}'s current time to wall clock time     
874 !   
875 !     The arguments are:
876 !     \begin{description}
877 !     \item[clock]
878 !          The object instance to synchronize to wall clock time
879 !     \item[{[rc]}]
880 !          Return code; equals {\tt ESMF\_SUCCESS} if there are no errors.
881 !     \end{description}
882 !   
883 ! !REQUIREMENTS:
884 !     TMG3.4.5
885 !EOP
886       CALL wrf_error_fatal( 'ESMF_ClockSyncToWallClock not supported' )
887       end subroutine ESMF_ClockSyncToWallClock
889 !------------------------------------------------------------------------------
890 !BOP
891 ! !IROUTINE: ESMF_ClockAdvance - Advance a clock's current time by one time step
893 ! !INTERFACE:
894       subroutine ESMF_ClockAdvance(clock, RingingAlarmList, &
895                                    NumRingingAlarms, rc)
897 use esmf_timemod
899 ! !ARGUMENTS:
900       type(ESMF_Clock), intent(inout) :: clock
901       type(ESMF_Alarm), dimension(MAX_ALARMS), intent(out), optional :: &
902                                         RingingAlarmList
903       integer, intent(out), optional :: NumRingingAlarms
904       integer, intent(out), optional :: rc
905 ! Local
906       logical pred1, pred2, pred3
907       integer i, n
908       type(ESMF_Alarm) :: alarm
909       logical :: positive_timestep
910 !   
911 ! !DESCRIPTION:
912 !     Advance an {\tt ESMF\_Clock}'s current time by one time step
913 !  
914 !     The arguments are:
915 !     \begin{description}
916 !     \item[clock]
917 !          The object instance to advance
918 !     \item[{[RingingAlarmList]}]
919 !          Return a list of any ringing alarms after the time step
920 !     \item[{[NumRingingAlarms]}]
921 !          The number of ringing alarms returned
922 !     \item[{[rc]}]
923 !          Return code; equals {\tt ESMF\_SUCCESS} if there are no errors.
924 !     \end{description}
925 !  
926 ! !REQUIREMENTS:
927 !     TMG3.4.1
928 !EOP
929 ! hack for bug in PGI 5.1-x
930 !      clock%clockint%CurrTime = clock%clockint%CurrTime + &
931 !                                clock%clockint%TimeStep
932       clock%clockint%CurrTime = ESMF_TimeInc( clock%clockint%CurrTime, &
933                                               clock%clockint%TimeStep )
934       positive_timestep = ESMF_TimeIntervalIsPositive( clock%clockint%TimeStep )
936       IF ( Present(NumRingingAlarms) ) NumRingingAlarms = 0
937       clock%clockint%AdvanceCount = clock%clockint%AdvanceCount + 1
938       DO i = 1, MAX_ALARMS
939         alarm = clock%clockint%AlarmList(i)
940         ! TBH:  This is really dangerous.  We need to be able to NULLIFY 
941         ! TBH:  alarmint at compile-time (F95 synax) to make this safe.  
942 !$$$TBH:  see if F95 compile-time pointer-nullification is supported by all 
943 !$$$TBH:  compilers we support
944         IF ( ASSOCIATED( alarm%alarmint ) ) THEN
945           IF ( alarm%alarmint%Enabled ) THEN
946             IF ( alarm%alarmint%RingIntervalSet ) THEN
947               pred1 = .FALSE. ; pred2 = .FALSE. ; pred3 = .FALSE.
948               ! alarm cannot ring if clock has passed the alarms stop time
949               IF ( alarm%alarmint%StopTimeSet ) THEN
950                 IF ( positive_timestep ) THEN
951 ! hack for bug in PGI 5.1-x
952 !                  PRED1 = clock%clockint%CurrTime > alarm%alarmint%StopTime
953                   PRED1 = ESMF_TimeGT( clock%clockint%CurrTime, &
954                                        alarm%alarmint%StopTime )
955                 ELSE
956                   ! in this case time step is negative and stop time is 
957                   ! less than start time
958 !                  PRED1 = clock%clockint%CurrTime < alarm%alarmint%StopTime
959                   PRED1 = ESMF_TimeLT( clock%clockint%CurrTime, &
960                                        alarm%alarmint%StopTime )
961                 ENDIF
962               ENDIF
963               ! one-shot alarm:  check for ring time 
964 ! TBH:  Need to remove duplicated code.  Need to enforce only one of 
965 ! TBH:  alarm%alarmint%RingTimeSet or alarm%alarmint%RingIntervalSet ever 
966 ! TBH:  being .TRUE. and simplify the logic.  Also, the simpler 
967 ! TBH:  implementation in the duplicated code below should be sufficient.  
968               IF ( alarm%alarmint%RingTimeSet ) THEN
969                 IF ( positive_timestep ) THEN
970 ! hack for bug in PGI 5.1-x
971 !                   PRED2 = ( alarm%alarmint%RingTime <= clock%clockint%CurrTime     &
972 !                          .AND. clock%clockint%CurrTime < alarm%alarmint%RingTime + &
973 !                                clock%clockint%TimeStep )
974                    PRED2 = ( ESMF_TimeLE( alarm%alarmint%RingTime,       &
975                                           clock%clockint%CurrTime )      &
976                              .AND. ESMF_TimeLT( clock%clockint%CurrTime, &
977                                ESMF_TimeInc( alarm%alarmint%RingTime,    &
978                                              clock%clockint%TimeStep ) ) )
979                 ELSE
980                   ! in this case time step is negative and stop time is 
981                   ! less than start time
982 ! hack for bug in PGI 5.1-x
983 !                   PRED2 = ( alarm%alarmint%RingTime >= clock%clockint%CurrTime     &
984 !                          .AND. clock%clockint%CurrTime > alarm%alarmint%RingTime + &
985 !                                clock%clockint%TimeStep )
986                    PRED2 = ( ESMF_TimeGE( alarm%alarmint%RingTime,       &
987                                           clock%clockint%CurrTime )      &
988                              .AND. ESMF_TimeGT( clock%clockint%CurrTime, &
989                                ESMF_TimeInc( alarm%alarmint%RingTime,    &
990                                              clock%clockint%TimeStep ) ) )
991                 ENDIF
992               ENDIF
993               ! repeating alarm:  check for ring interval
994               IF ( alarm%alarmint%RingIntervalSet ) THEN
995                 IF ( positive_timestep ) THEN
996 ! hack for bug in PGI 5.1-x
997 !                   PRED3 = ( alarm%alarmint%PrevRingTime + alarm%alarmint%RingInterval <= &
998 !                             clock%clockint%CurrTime )
1000                    PRED3 = ( ESMF_TimeLE( ESMF_TimeInc(                  &
1001                                           alarm%alarmint%PrevRingTime,   &
1002                                           alarm%alarmint%RingInterval ), &
1003                              clock%clockint%CurrTime ) )
1004                 ELSE
1005                   ! in this case time step is negative and stop time is 
1006                   ! less than start time
1007                   ! ring interval must always be positive
1008 ! hack for bug in PGI 5.1-x
1009 !                   PRED3 = ( alarm%alarmint%PrevRingTime - alarm%alarmint%RingInterval >= &
1010 !                             clock%clockint%CurrTime )
1012                    PRED3 = ( ESMF_TimeGE( ESMF_TimeDec(                  &
1013                                           alarm%alarmint%PrevRingTime,   &
1014                                           alarm%alarmint%RingInterval ), &
1015                              clock%clockint%CurrTime ) )
1016                 ENDIF
1017               ENDIF
1018               IF ( ( .NOT. ( pred1 ) ) .AND. &
1019                    ( ( pred2 ) .OR. ( pred3 ) ) ) THEN
1020                  alarm%alarmint%Ringing = .TRUE.
1021                  IF ( positive_timestep ) THEN
1022 ! hack for bug in PGI 5.1-x
1023 !                   IF ( PRED3) alarm%alarmint%PrevRingTime = alarm%alarmint%PrevRingTime + &
1024 !                                                    alarm%alarmint%RingInterval
1025                    IF ( PRED3 )                                   &
1026                      alarm%alarmint%PrevRingTime =                &
1027                        ESMF_TimeInc( alarm%alarmint%PrevRingTime, &
1028                                      alarm%alarmint%RingInterval )
1029                  ELSE
1030                    ! in this case time step is negative and stop time is 
1031                    ! less than start time
1032                    ! ring interval must always be positive
1033 ! hack for bug in PGI 5.1-x
1034 !                   IF ( PRED3) alarm%alarmint%PrevRingTime = alarm%alarmint%PrevRingTime - &
1035 !                                                    alarm%alarmint%RingInterval
1036                    IF ( PRED3 )                                   &
1037                      alarm%alarmint%PrevRingTime =                &
1038                        ESMF_TimeDec( alarm%alarmint%PrevRingTime, &
1039                                      alarm%alarmint%RingInterval )
1040                  ENDIF
1041                  IF ( PRESENT( RingingAlarmList ) .AND. &
1042                       PRESENT ( NumRingingAlarms ) ) THEN
1043                    NumRingingAlarms = NumRingingAlarms + 1
1044                    RingingAlarmList( NumRingingAlarms ) = alarm
1045                  ENDIF
1046               ENDIF
1047             ELSE IF ( alarm%alarmint%RingTimeSet ) THEN
1048 ! TBH:  Need to remove duplicated code.  Need to enforce only one of 
1049 ! TBH:  alarm%alarmint%RingTimeSet or alarm%alarmint%RingIntervalSet ever 
1050 ! TBH:  being .TRUE. and simplify the logic.  Also, the simpler 
1051 ! TBH:  implementation in here should be sufficient.  
1052               IF ( positive_timestep ) THEN
1053 ! hack for bug in PGI 5.1-x
1054 !                IF ( alarm%alarmint%RingTime <= clock%clockint%CurrTime ) THEN
1055                 IF ( ESMF_TimeLE( alarm%alarmint%RingTime, &
1056                                   clock%clockint%CurrTime ) ) THEN
1057                    alarm%alarmint%Ringing = .TRUE.
1058                    IF ( PRESENT( RingingAlarmList ) .AND. &
1059                         PRESENT ( NumRingingAlarms ) ) THEN
1060                      NumRingingAlarms = NumRingingAlarms + 1
1061                      RingingAlarmList( NumRingingAlarms ) = alarm
1062                    ENDIF
1063                 ENDIF
1064               ELSE
1065                 ! in this case time step is negative and stop time is 
1066                 ! less than start time
1067 ! hack for bug in PGI 5.1-x
1068 !                IF ( alarm%alarmint%RingTime >= clock%clockint%CurrTime ) THEN
1069                 IF ( ESMF_TimeGE( alarm%alarmint%RingTime, &
1070                                   clock%clockint%CurrTime ) ) THEN
1071                    alarm%alarmint%Ringing = .TRUE.
1072                    IF ( PRESENT( RingingAlarmList ) .AND. &
1073                         PRESENT ( NumRingingAlarms ) ) THEN
1074                      NumRingingAlarms = NumRingingAlarms + 1
1075                      RingingAlarmList( NumRingingAlarms ) = alarm
1076                    ENDIF
1077                 ENDIF
1078               ENDIF
1079             ENDIF
1080             IF ( alarm%alarmint%StopTimeSet ) THEN
1081 ! TBH:  what is this for???  
1082             ENDIF
1083           ENDIF
1084         ENDIF
1085         clock%clockint%AlarmList(i) = alarm
1086       ENDDO
1087       IF ( PRESENT( rc ) ) rc = ESMF_SUCCESS
1088     
1089       end subroutine ESMF_ClockAdvance
1091 !------------------------------------------------------------------------------
1092 !BOP
1093 ! !IROUTINE: ESMF_ClockStopTimeDisable - NOOP for compatibility with ESMF 2.1.0+
1095 ! !INTERFACE:
1096       subroutine ESMF_ClockStopTimeDisable(clock, rc)
1098 ! !ARGUMENTS:
1099       type(ESMF_Clock), intent(in) :: clock
1100       integer, intent(out), optional :: rc
1102       rc = ESMF_SUCCESS
1104       end subroutine ESMF_ClockStopTimeDisable
1106 !------------------------------------------------------------------------------
1107 !BOP
1108 ! !IROUTINE: ESMF_ClockIsStopTime - Has the clock reached its stop time ?
1110 ! !INTERFACE:
1111       function ESMF_ClockIsStopTime(clock, rc)
1113 ! !RETURN VALUE:
1114       logical :: ESMF_ClockIsStopTime
1116 ! !ARGUMENTS:
1117       type(ESMF_Clock), intent(in) :: clock
1118       integer, intent(out), optional :: rc
1119       logical :: positive_timestep
1121 ! !DESCRIPTION:
1122 !     Return true if {\tt ESMF\_Clock} has reached its stop time, false 
1123 !     otherwise     
1125 !     The arguments are:
1126 !     \begin{description}
1127 !     \item[clock]
1128 !          The object instance to check
1129 !     \item[{[rc]}]
1130 !          Return code; equals {\tt ESMF\_SUCCESS} if there are no errors.
1131 !     \end{description}
1133 ! !REQUIREMENTS:
1134 !     TMG3.5.6
1135 !EOP
1137       positive_timestep = ESMF_TimeIntervalIsPositive( clock%clockint%TimeStep )
1138       IF ( positive_timestep ) THEN
1139 ! hack for bug in PGI 5.1-x
1140 !        if ( clock%clockint%CurrTime .GE. clock%clockint%StopTime ) THEN
1141         if ( ESMF_TimeGE( clock%clockint%CurrTime, &
1142                           clock%clockint%StopTime ) ) THEN
1143           ESMF_ClockIsStopTime = .TRUE.
1144         else
1145           ESMF_ClockIsStopTime = .FALSE.
1146         endif
1147       ELSE
1148 ! hack for bug in PGI 5.1-x
1149 !        if ( clock%clockint%CurrTime .LE. clock%clockint%StopTime ) THEN
1150         if ( ESMF_TimeLE( clock%clockint%CurrTime, &
1151                           clock%clockint%StopTime ) ) THEN
1152           ESMF_ClockIsStopTime = .TRUE.
1153         else
1154           ESMF_ClockIsStopTime = .FALSE.
1155         endif
1156       ENDIF
1157       IF ( PRESENT( rc ) ) rc = ESMF_SUCCESS
1158     
1159       end function ESMF_ClockIsStopTime
1161 !------------------------------------------------------------------------------
1163 ! This section defines the overridden Read, Write, Validate and Print methods
1164 ! from the ESMF_Base class
1166 !------------------------------------------------------------------------------
1167 !BOP
1168 ! !IROUTINE: ESMF_ClockRead - Restores a clock
1170 ! !INTERFACE:
1171       subroutine ESMF_ClockRead(clock, TimeStep, StartTime, StopTime, &
1172                                 RefTime, CurrTime, PrevTime, AdvanceCount, &
1173                                 AlarmList, rc)
1175 ! !ARGUMENTS:
1176       type(ESMF_Clock), intent(out) :: clock
1177       type(ESMF_TimeInterval), intent(in) :: TimeStep
1178       type(ESMF_Time), intent(in) :: StartTime
1179       type(ESMF_Time), intent(in) :: StopTime
1180       type(ESMF_Time), intent(in) :: RefTime
1181       type(ESMF_Time), intent(in) :: CurrTime
1182       type(ESMF_Time), intent(in) :: PrevTime
1183       integer(ESMF_KIND_I8), intent(in) :: AdvanceCount
1184       type(ESMF_Alarm), dimension(MAX_ALARMS), intent(in) :: AlarmList
1185       integer, intent(out), optional :: rc
1186     
1187 ! !DESCRIPTION:
1188 !     Restore an {\tt ESMF\_Clock}
1189 !     
1190 !     The arguments are:
1191 !     \begin{description}
1192 !     \item[clock]
1193 !          The object instance to restore
1194 !     \item[TimeStep]
1195 !          The {\tt ESMF\_Clock}'s time step interval
1196 !     \item[StartTime]
1197 !          The {\tt ESMF\_Clock}'s starting time
1198 !     \item[StopTime]
1199 !          The {\tt ESMF\_Clock}'s stopping time
1200 !     \item[RefTime]
1201 !          The {\tt ESMF\_Clock}'s reference time
1202 !     \item[CurrTime]
1203 !          The {\tt ESMF\_Clock}'s current time
1204 !     \item[PrevTime]
1205 !          The {\tt ESMF\_Clock}'s previous time
1206 !     \item[AdvanceCount]
1207 !          The number of times the {\tt ESMF\_Clock} has been advanced
1208 !     \item[AlarmList]
1209 !          The {\tt ESMF\_Clock}'s {\tt ESMF\_Alarm} list
1210 !     \item[{[rc]}]
1211 !          Return code; equals {\tt ESMF\_SUCCESS} if there are no errors.
1212 !     \end{description}
1213 !     
1214 ! !REQUIREMENTS:
1215 !EOP
1216       CALL wrf_error_fatal( 'ESMF_ClockRead not supported' )
1217       end subroutine ESMF_ClockRead
1219 !------------------------------------------------------------------------------
1220 !BOP
1221 ! !IROUTINE: ESMF_ClockWrite - Saves a clock
1223 ! !INTERFACE:
1224       subroutine ESMF_ClockWrite(clock, TimeStep, StartTime, StopTime, &
1225                             RefTime, CurrTime, PrevTime, AdvanceCount, &
1226                             AlarmList, rc)
1228 ! !ARGUMENTS:
1229       type(ESMF_Clock), intent(in) :: clock
1230       type(ESMF_TimeInterval), intent(out) :: TimeStep
1231       type(ESMF_Time), intent(out) :: StartTime
1232       type(ESMF_Time), intent(out) :: StopTime
1233       type(ESMF_Time), intent(out) :: RefTime
1234       type(ESMF_Time), intent(out) :: CurrTime
1235       type(ESMF_Time), intent(out) :: PrevTime
1236       integer(ESMF_KIND_I8), intent(out) :: AdvanceCount
1237       type(ESMF_Alarm), dimension(MAX_ALARMS), intent(out) :: AlarmList
1238       integer, intent(out), optional :: rc
1239     
1240 ! !DESCRIPTION:
1241 !     Save an {\tt ESMF\_Clock}
1242 !     
1243 !     The arguments are:
1244 !     \begin{description}
1245 !     \item[clock]
1246 !          The object instance to save
1247 !     \item[TimeStep]
1248 !          The {\tt ESMF\_Clock}'s time step interval
1249 !     \item[StartTime]
1250 !          The {\tt ESMF\_Clock}'s starting time
1251 !     \item[StopTime]
1252 !          The {\tt ESMF\_Clock}'s stopping time
1253 !     \item[RefTime]
1254 !          The {\tt ESMF\_Clock}'s reference time
1255 !     \item[CurrTime]
1256 !          The {\tt ESMF\_Clock}'s current time
1257 !     \item[PrevTime]
1258 !          The {\tt ESMF\_Clock}'s previous time
1259 !     \item[AdvanceCount]
1260 !          The number of times the {\tt ESMF\_Clock} has been advanced
1261 !     \item[AlarmList]
1262 !          The {\tt ESMF\_Clock}'s {\tt ESMF\_Alarm} list
1263 !     \item[{[rc]}]
1264 !          Return code; equals {\tt ESMF\_SUCCESS} if there are no errors.
1265 !     \end{description}
1266 !     
1267 ! !REQUIREMENTS:
1268 !EOP
1269       CALL wrf_error_fatal( 'ESMF_ClockWrite not supported' )
1270       end subroutine ESMF_ClockWrite
1272 !------------------------------------------------------------------------------
1273 !BOP
1274 ! !IROUTINE:  ESMF_ClockValidate - Validate a Clock's properties
1276 ! !INTERFACE:
1277       subroutine ESMF_ClockValidate(clock, opts, rc)
1279 ! !ARGUMENTS:
1280       type(ESMF_Clock), intent(in) :: clock
1281       character (len=*), intent(in), optional :: opts
1282       integer, intent(out), optional :: rc
1284 ! !DESCRIPTION:
1285 !     Perform a validation check on an {\tt ESMF\_Clock}'s properties
1287 !     The arguments are:  
1288 !     \begin{description}
1289 !     \item[clock]
1290 !          {\tt ESMF\_Clock} to validate
1291 !     \item[{[opts]}]
1292 !          Validate options
1293 !     \item[{[rc]}]
1294 !          Return code; equals {\tt ESMF\_SUCCESS} if there are no errors.
1295 !     \end{description} 
1297 ! !REQUIREMENTS:
1298 !     TMGn.n.n
1299 !EOP
1300       CALL wrf_error_fatal( 'ESMF_ClockValidate not supported' )
1301       end subroutine ESMF_ClockValidate
1303 !------------------------------------------------------------------------------
1304 !BOP
1305 ! !IROUTINE:  ESMF_ClockPrint - Print out a Clock's properties
1307 ! !INTERFACE:
1308       subroutine ESMF_ClockPrint(clock, opts, rc)
1310 ! !ARGUMENTS:
1311       type(ESMF_Clock), intent(in) :: clock
1312       character (len=*), intent(in), optional :: opts
1313       integer, intent(out), optional :: rc
1315 ! !DESCRIPTION:
1316 !     To support testing/debugging, print out an {\tt ESMF\_Clock}'s
1317 !     properties.
1319 !     The arguments are:
1320 !     \begin{description}
1321 !     \item[clock]
1322 !          {\tt ESMF\_Clock} to print out
1323 !     \item[{[opts]}]
1324 !          Print options
1325 !     \item[{[rc]}]
1326 !          Return code; equals {\tt ESMF\_SUCCESS} if there are no errors.
1327 !     \end{description}
1329 ! !REQUIREMENTS:
1330 !     TMGn.n.n
1331 !EOP
1332       CALL wrf_error_fatal( 'ESMF_ClockPrint not supported' )
1333       end subroutine ESMF_ClockPrint
1335 !------------------------------------------------------------------------------
1337       end module ESMF_ClockMod