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 TimeInterval Module
13 module ESMF_TimeIntervalMod
15 !==============================================================================
17 ! This file contains the TimeInterval class definition and all TimeInterval
20 !------------------------------------------------------------------------------
22 #include <ESMF_TimeMgr.inc>
24 !===============================================================================
26 ! !MODULE: ESMF_TimeIntervalMod
29 ! Part of Time Manager F90 API wrapper of C++ implemenation
31 ! Defines F90 wrapper entry points for corresponding
32 ! C++ implementaion of class {\tt ESMC\_TimeInterval}
34 ! See {\tt ../include/ESMC\_TimeInterval.h} for complete description
36 !------------------------------------------------------------------------------
38 ! inherit from ESMF base class
41 ! inherit from base time class
44 ! associated derived types
45 use ESMF_FractionMod, only : ESMF_Fraction
50 !------------------------------------------------------------------------------
53 !------------------------------------------------------------------------------
56 ! ! F90 class type to match C++ TimeInterval class in size only;
57 ! ! all dereferencing within class is performed by C++ implementation
59 type ESMF_TimeInterval
60 ! time interval is expressed as basetime
61 type(ESMF_BaseTime) :: basetime ! inherit base class
62 ! Relative year and month fields support monthly or yearly time
63 ! intervals. Many operations are undefined when these fields are
65 INTEGER :: YR ! relative year
66 INTEGER :: MM ! relative month
69 !------------------------------------------------------------------------------
71 public ESMF_TimeInterval
72 !------------------------------------------------------------------------------
74 ! !PUBLIC MEMBER FUNCTIONS:
75 public ESMF_TimeIntervalGet
76 public ESMF_TimeIntervalSet
77 public ESMFold_TimeIntervalGetString
78 public ESMF_TimeIntervalAbsValue
79 public ESMF_TimeIntervalNegAbsValue
81 ! Required inherited and overridden ESMF_Base class methods
83 !!!!!!!!! added 20051012, JM
84 ! public WRFADDITION_TimeIntervalDIVQuot
85 !!!!!!!!! renamed to simplify testing 20060320, TH
86 public ESMF_TimeIntervalDIVQuot
88 ! This convenience routine is only used by other modules in
90 public ESMF_TimeIntervalIsPositive
93 ! !PRIVATE MEMBER FUNCTIONS:
95 ! overloaded operator functions
98 private ESMF_TimeIntervalQuotI
101 private ESMF_TimeIntervalProdI
103 ! Inherited and overloaded from ESMF_BaseTime
106 private ESMF_TimeIntervalSum
109 private ESMF_TimeIntervalDiff
111 public operator(.EQ.)
112 private ESMF_TimeIntervalEQ
114 public operator(.NE.)
115 private ESMF_TimeIntervalNE
117 public operator(.LT.)
118 private ESMF_TimeIntervalLT
120 public operator(.GT.)
121 private ESMF_TimeIntervalGT
123 public operator(.LE.)
124 private ESMF_TimeIntervalLE
126 public operator(.GE.)
127 private ESMF_TimeIntervalGE
130 !==============================================================================
134 !==============================================================================
137 interface operator(*)
139 ! !PRIVATE MEMBER FUNCTIONS:
140 module procedure ESMF_TimeIntervalProdI
143 ! This interface overloads the * operator for the {\tt ESMF\_TimeInterval}
149 !------------------------------------------------------------------------------
152 interface operator(/)
154 ! !PRIVATE MEMBER FUNCTIONS:
155 module procedure ESMF_TimeIntervalQuotI
158 ! This interface overloads the / operator for the
159 ! {\tt ESMF\_TimeInterval} class
164 !------------------------------------------------------------------------------
167 interface operator(+)
169 ! !PRIVATE MEMBER FUNCTIONS:
170 module procedure ESMF_TimeIntervalSum
173 ! This interface overloads the + operator for the
174 ! {\tt ESMF\_TimeInterval} class
179 !------------------------------------------------------------------------------
182 interface operator(-)
184 ! !PRIVATE MEMBER FUNCTIONS:
185 module procedure ESMF_TimeIntervalDiff
188 ! This interface overloads the - operator for the
189 ! {\tt ESMF\_TimeInterval} class
194 !------------------------------------------------------------------------------
197 interface operator(.EQ.)
199 ! !PRIVATE MEMBER FUNCTIONS:
200 module procedure ESMF_TimeIntervalEQ
203 ! This interface overloads the .EQ. operator for the
204 ! {\tt ESMF\_TimeInterval} class
209 !------------------------------------------------------------------------------
212 interface operator(.NE.)
214 ! !PRIVATE MEMBER FUNCTIONS:
215 module procedure ESMF_TimeIntervalNE
218 ! This interface overloads the .NE. operator for the
219 ! {\tt ESMF\_TimeInterval} class
224 !------------------------------------------------------------------------------
227 interface operator(.LT.)
229 ! !PRIVATE MEMBER FUNCTIONS:
230 module procedure ESMF_TimeIntervalLT
233 ! This interface overloads the .LT. operator for the
234 ! {\tt ESMF\_TimeInterval} class
239 !------------------------------------------------------------------------------
242 interface operator(.GT.)
244 ! !PRIVATE MEMBER FUNCTIONS:
245 module procedure ESMF_TimeIntervalGT
248 ! This interface overloads the .GT. operator for the
249 ! {\tt ESMF\_TimeInterval} class
254 !------------------------------------------------------------------------------
257 interface operator(.LE.)
259 ! !PRIVATE MEMBER FUNCTIONS:
260 module procedure ESMF_TimeIntervalLE
263 ! This interface overloads the .LE. operator for the
264 ! {\tt ESMF\_TimeInterval} class
269 !------------------------------------------------------------------------------
272 interface operator(.GE.)
274 ! !PRIVATE MEMBER FUNCTIONS:
275 module procedure ESMF_TimeIntervalGE
278 ! This interface overloads the .GE. operator for the
279 ! {\tt ESMF\_TimeInterval} class
284 !------------------------------------------------------------------------------
286 !==============================================================================
290 !==============================================================================
292 ! Generic Get/Set routines which use F90 optional arguments
294 !------------------------------------------------------------------------------
296 ! !IROUTINE: ESMF_TimeIntervalGet - Get value in user-specified units
299 subroutine ESMF_TimeIntervalGet(timeinterval, D, d_r8, S, Sn, Sd, &
303 type(ESMF_TimeInterval), intent(in) :: timeinterval
304 integer, intent(out), optional :: D
305 real(ESMF_KIND_R8), intent(out), optional :: d_r8
306 integer, intent(out), optional :: S
307 integer, intent(out), optional :: Sn
308 integer, intent(out), optional :: Sd
309 character*(*), optional, intent(out) :: TimeString
310 integer, intent(out), optional :: rc
314 ! Get the value of the {\tt ESMF\_TimeInterval} in units specified by the
315 ! user via F90 optional arguments.
317 ! Time manager represents and manipulates time internally with integers
318 ! to maintain precision. Hence, user-specified floating point values are
319 ! converted internally from integers.
321 ! See {\tt ../include/ESMC\_BaseTime.h} and
322 ! {\tt ../include/ESMC\_TimeInterval.h} for complete description.
325 ! \begin{description}
326 ! \item[timeinterval]
327 ! The object instance to query
329 ! Integer years (>= 32-bit)
331 ! Integer years (large, >= 64-bit)
333 ! Integer months (>= 32-bit)
335 ! Integer months (large, >= 64-bit)
337 ! Integer days (>= 32-bit)
339 ! Integer days (large, >= 64-bit)
345 ! Integer seconds (>= 32-bit)
347 ! Integer seconds (large, >= 64-bit)
349 ! Integer milliseconds
351 ! Integer microseconds
353 ! Integer nanoseconds
355 ! Double precision days
357 ! Double precision hours
359 ! Double precision minutes
361 ! Double precision seconds
363 ! Double precision milliseconds
365 ! Double precision microseconds
367 ! Double precision nanoseconds
369 ! Integer fractional seconds - numerator
371 ! Integer fractional seconds - denominator
373 ! Return code; equals {\tt ESMF\_SUCCESS} if there are no errors.
379 INTEGER(ESMF_KIND_I8) :: seconds
383 seconds = timeinterval%basetime%S
384 ! note that S is overwritten below (if present) if other args are also
386 IF ( PRESENT(S) ) S = seconds
387 IF ( PRESENT( D ) ) THEN
388 D = seconds / SECONDS_PER_DAY
389 IF ( PRESENT(S) ) S = MOD( seconds, SECONDS_PER_DAY )
391 IF ( PRESENT( d_r8 ) ) THEN
392 D_r8 = REAL( seconds, ESMF_KIND_R8 ) / &
393 REAL( SECONDS_PER_DAY, ESMF_KIND_R8 )
394 IF ( PRESENT(S) ) S = MOD( seconds, SECONDS_PER_DAY )
396 IF ( PRESENT(Sn) ) THEN
397 Sn = timeinterval%basetime%Sn
399 IF ( PRESENT(Sd) ) THEN
400 Sd = timeinterval%basetime%Sd
402 IF ( PRESENT( timeString ) ) THEN
403 CALL ESMFold_TimeIntervalGetString( timeinterval, timeString, rc=ierr )
405 IF ( PRESENT(rc) ) rc = ierr
407 end subroutine ESMF_TimeIntervalGet
409 !------------------------------------------------------------------------------
411 ! !IROUTINE: ESMF_TimeIntervalSet - Initialize via user-specified unit set
414 subroutine ESMF_TimeIntervalSet(timeinterval, YY, YYl, MM, MOl, D, Dl, &
415 H, M, S, Sl, MS, US, NS, &
416 d_, h_, m_, s_, ms_, us_, ns_, &
420 type(ESMF_TimeInterval), intent(out) :: timeinterval
421 integer, intent(in), optional :: YY
422 integer(ESMF_KIND_I8), intent(in), optional :: YYl
423 integer, intent(in), optional :: MM
424 integer(ESMF_KIND_I8), intent(in), optional :: MOl
425 integer, intent(in), optional :: D
426 integer(ESMF_KIND_I8), intent(in), optional :: Dl
427 integer, intent(in), optional :: H
428 integer, intent(in), optional :: M
429 integer, intent(in), optional :: S
430 integer(ESMF_KIND_I8), intent(in), optional :: Sl
431 integer, intent(in), optional :: MS
432 integer, intent(in), optional :: US
433 integer, intent(in), optional :: NS
434 double precision, intent(in), optional :: d_
435 double precision, intent(in), optional :: h_
436 double precision, intent(in), optional :: m_
437 double precision, intent(in), optional :: s_
438 double precision, intent(in), optional :: ms_
439 double precision, intent(in), optional :: us_
440 double precision, intent(in), optional :: ns_
441 integer, intent(in), optional :: Sn
442 integer, intent(in), optional :: Sd
443 integer, intent(out), optional :: rc
448 ! Set the value of the {\tt ESMF\_TimeInterval} in units specified by
449 ! the user via F90 optional arguments
451 ! Time manager represents and manipulates time internally with integers
452 ! to maintain precision. Hence, user-specified floating point values are
453 ! converted internally to integers.
455 ! See {\tt ../include/ESMC\_BaseTime.h} and
456 ! {\tt ../include/ESMC\_TimeInterval.h} for complete description.
459 ! \begin{description}
460 ! \item[timeinterval]
461 ! The object instance to initialize
463 ! Integer number of interval years (>= 32-bit)
465 ! Integer number of interval years (large, >= 64-bit)
467 ! Integer number of interval months (>= 32-bit)
469 ! Integer number of interval months (large, >= 64-bit)
471 ! Integer number of interval days (>= 32-bit)
473 ! Integer number of interval days (large, >= 64-bit)
479 ! Integer seconds (>= 32-bit)
481 ! Integer seconds (large, >= 64-bit)
483 ! Integer milliseconds
485 ! Integer microseconds
487 ! Integer nanoseconds
489 ! Double precision days
491 ! Double precision hours
493 ! Double precision minutes
495 ! Double precision seconds
497 ! Double precision milliseconds
499 ! Double precision microseconds
501 ! Double precision nanoseconds
503 ! Integer fractional seconds - numerator
505 ! Integer fractional seconds - denominator
507 ! Return code; equals {\tt ESMF\_SUCCESS} if there are no errors.
514 IF ( PRESENT(rc) ) rc = ESMF_FAILURE
515 ! note that YR and MM are relative
517 IF ( PRESENT( YY ) ) THEN
521 IF ( PRESENT( MM ) ) THEN
524 ! Rollover months to years
525 IF ( abs(timeinterval%MM) .GE. MONTHS_PER_YEAR ) THEN
526 timeinterval%YR = timeinterval%YR + timeinterval%MM/MONTHS_PER_YEAR
527 timeinterval%MM = mod(timeinterval%MM,MONTHS_PER_YEAR)
530 timeinterval%basetime%S = 0
531 ! For 365-day calendar, immediately convert years to days since we know
532 ! how to do it in this case.
533 !$$$ replace this hack with something saner...
534 IF ( nfeb( 2004 ) == 28 ) THEN
535 timeinterval%basetime%S = timeinterval%basetime%S + &
536 ( 365_ESMF_KIND_I8 * &
537 INT( timeinterval%YR, ESMF_KIND_I8 ) * SECONDS_PER_DAY )
540 IF ( PRESENT( D ) ) THEN
541 timeinterval%basetime%S = timeinterval%basetime%S + &
542 ( SECONDS_PER_DAY * INT( D, ESMF_KIND_I8 ) )
544 !$$$ Push H,M,S,Sn,Sd,MS down into BaseTime constructor from EVERYWHERE
545 !$$$ and THEN add ESMF scaling behavior when other args are present...
546 IF ( PRESENT( H ) ) THEN
547 timeinterval%basetime%S = timeinterval%basetime%S + &
548 ( SECONDS_PER_HOUR * INT( H, ESMF_KIND_I8 ) )
550 IF ( PRESENT( M ) ) THEN
551 timeinterval%basetime%S = timeinterval%basetime%S + &
552 ( SECONDS_PER_MINUTE * INT( M, ESMF_KIND_I8 ) )
554 IF ( PRESENT( S ) ) THEN
555 timeinterval%basetime%S = timeinterval%basetime%S + &
556 INT( S, ESMF_KIND_I8 )
558 IF ( PRESENT( Sn ) .AND. ( .NOT. PRESENT( Sd ) ) ) THEN
559 CALL wrf_error_fatal( &
560 "ESMF_TimeIntervalSet: Must specify Sd if Sn is specified")
562 IF ( PRESENT( Sd ) .AND. PRESENT( MS ) ) THEN
563 CALL wrf_error_fatal( &
564 "ESMF_TimeIntervalSet: Must not specify both Sd and MS")
566 timeinterval%basetime%Sn = 0
567 timeinterval%basetime%Sd = 0
568 IF ( PRESENT( MS ) ) THEN
569 timeinterval%basetime%Sn = MS
570 timeinterval%basetime%Sd = 1000_ESMF_KIND_I8
571 ELSE IF ( PRESENT( Sd ) ) THEN
572 timeinterval%basetime%Sd = Sd
573 IF ( PRESENT( Sn ) ) THEN
574 timeinterval%basetime%Sn = Sn
577 CALL normalize_timeint( timeinterval )
579 IF ( PRESENT(rc) ) rc = ESMF_SUCCESS
581 end subroutine ESMF_TimeIntervalSet
583 !------------------------------------------------------------------------------
585 ! !IROUTINE: ESMFold_TimeIntervalGetString - Get time interval value in string format
588 subroutine ESMFold_TimeIntervalGetString(timeinterval, TimeString, rc)
591 type(ESMF_TimeInterval), intent(in) :: timeinterval
592 character*(*), intent(out) :: TimeString
593 integer, intent(out), optional :: rc
595 integer :: signnormtimeint
597 INTEGER(ESMF_KIND_I8) :: iS, iSn, iSd, H, M, S
598 character (len=1) :: signstr
601 ! Convert {\tt ESMF\_TimeInterval}'s value into string format
604 ! \begin{description}
605 ! \item[timeinterval]
606 ! The object instance to convert
608 ! The string to return
610 ! Return code; equals {\tt ESMF\_SUCCESS} if there are no errors.
617 ! NOTE: YR, MM, Sn, and Sd are not yet included in the returned string...
618 !PRINT *,'DEBUG ESMFold_TimeIntervalGetString(): YR,MM,S,Sn,Sd = ', &
621 ! timeinterval%basetime%S, &
622 ! timeinterval%basetime%Sn, &
623 ! timeinterval%basetime%Sd
625 negative = ( signnormtimeint( timeInterval ) == -1 )
627 iS = -timeinterval%basetime%S
628 iSn = -timeinterval%basetime%Sn
631 iS = timeinterval%basetime%S
632 iSn = timeinterval%basetime%Sn
635 iSd = timeinterval%basetime%Sd
637 H = mod( iS, SECONDS_PER_DAY ) / SECONDS_PER_HOUR
638 M = mod( iS, SECONDS_PER_HOUR) / SECONDS_PER_MINUTE
639 S = mod( iS, SECONDS_PER_MINUTE )
641 !$$$here... need to print Sn and Sd when they are used ???
643 write(TimeString,FMT="(A,I10.10,'_',I3.3,':',I3.3,':',I3.3)") &
644 TRIM(signstr), ( iS / SECONDS_PER_DAY ), H, M, S
646 !write(0,*)'TimeIntervalGetString Sn ',timeinterval%basetime%Sn,' Sd ',timeinterval%basetime%Sd
650 end subroutine ESMFold_TimeIntervalGetString
652 !------------------------------------------------------------------------------
654 ! !IROUTINE: ESMF_TimeIntervalAbsValue - Get the absolute value of a time interval
657 function ESMF_TimeIntervalAbsValue(timeinterval)
660 type(ESMF_TimeInterval) :: ESMF_TimeIntervalAbsValue
663 type(ESMF_TimeInterval), intent(in) :: timeinterval
668 ! Return a {\tt ESMF\_TimeInterval}'s absolute value.
671 ! \begin{description}
672 ! \item[timeinterval]
673 ! The object instance to take the absolute value of.
674 ! Absolute value returned as value of function.
680 CALL timeintchecknormalized( timeinterval, 'ESMF_TimeIntervalAbsValue arg1' )
681 ESMF_TimeIntervalAbsValue = timeinterval
682 !$$$here... move implementation into BaseTime
683 ESMF_TimeIntervalAbsValue%basetime%S = &
684 abs(ESMF_TimeIntervalAbsValue%basetime%S)
685 ESMF_TimeIntervalAbsValue%basetime%Sn = &
686 abs(ESMF_TimeIntervalAbsValue%basetime%Sn )
688 end function ESMF_TimeIntervalAbsValue
690 !------------------------------------------------------------------------------
692 ! !IROUTINE: ESMF_TimeIntervalNegAbsValue - Get the negative absolute value of a time interval
695 function ESMF_TimeIntervalNegAbsValue(timeinterval)
698 type(ESMF_TimeInterval) :: ESMF_TimeIntervalNegAbsValue
701 type(ESMF_TimeInterval), intent(in) :: timeinterval
706 ! Return a {\tt ESMF\_TimeInterval}'s negative absolute value.
709 ! \begin{description}
710 ! \item[timeinterval]
711 ! The object instance to take the negative absolute value of.
712 ! Negative absolute value returned as value of function.
718 CALL timeintchecknormalized( timeinterval, 'ESMF_TimeIntervalNegAbsValue arg1' )
720 ESMF_TimeIntervalNegAbsValue = timeinterval
721 !$$$here... move implementation into BaseTime
722 ESMF_TimeIntervalNegAbsValue%basetime%S = &
723 -abs(ESMF_TimeIntervalNegAbsValue%basetime%S)
724 ESMF_TimeIntervalNegAbsValue%basetime%Sn = &
725 -abs(ESMF_TimeIntervalNegAbsValue%basetime%Sn )
727 end function ESMF_TimeIntervalNegAbsValue
729 !------------------------------------------------------------------------------
731 ! This section includes overloaded operators defined only for TimeInterval
732 ! (not inherited from BaseTime)
733 ! Note: these functions do not have a return code, since F90 forbids more
734 ! than 2 arguments for arithmetic overloaded operators
736 !------------------------------------------------------------------------------
738 !!!!!!!!!!!!!!!!!! added jm 20051012
739 ! new WRF-specific function, Divide two time intervals and return the whole integer, without remainder
740 function ESMF_TimeIntervalDIVQuot(timeinterval1, timeinterval2)
743 INTEGER :: ESMF_TimeIntervalDIVQuot
746 type(ESMF_TimeInterval), intent(in) :: timeinterval1
747 type(ESMF_TimeInterval), intent(in) :: timeinterval2
750 INTEGER :: retval, isgn, rc
751 type(ESMF_TimeInterval) :: zero, i1,i2
754 ! Returns timeinterval1 divided by timeinterval2 as a fraction quotient.
757 ! \begin{description}
758 ! \item[timeinterval1]
760 ! \item[timeinterval2]
768 CALL timeintchecknormalized( timeinterval1, 'ESMF_TimeIntervalDIVQuot arg1' )
769 CALL timeintchecknormalized( timeinterval2, 'ESMF_TimeIntervalDIVQuot arg2' )
771 call ESMF_TimeIntervalSet( zero, rc=rc )
775 if ( i1 .LT. zero ) then
776 i1 = ESMF_TimeIntervalProdI(i1, -1)
779 if ( i2 .LT. zero ) then
780 i2 = ESMF_TimeIntervalProdI(i2, -1)
783 ! repeated subtraction
785 DO WHILE ( i1 .GE. i2 )
789 retval = retval * isgn
791 ESMF_TimeIntervalDIVQuot = retval
793 end function ESMF_TimeIntervalDIVQuot
798 !------------------------------------------------------------------------------
800 ! !IROUTINE: ESMF_TimeIntervalQuotI - Divide time interval by an integer, return time interval result
803 function ESMF_TimeIntervalQuotI(timeinterval, divisor)
806 type(ESMF_TimeInterval) :: ESMF_TimeIntervalQuotI
809 type(ESMF_TimeInterval), intent(in) :: timeinterval
810 integer, intent(in) :: divisor
813 ! Divides a {\tt ESMF\_TimeInterval} by an integer divisor, returns
814 ! quotient as a {\tt ESMF\_TimeInterval}
817 ! \begin{description}
818 ! \item[timeinterval]
825 ! TMG1.5.6, TMG5.3, TMG7.2
828 !PRINT *,'DEBUG ESMF_TimeIntervalQuotI() A: S,Sn,Sd = ', &
829 ! timeinterval%basetime%S,timeinterval%basetime%Sn,timeinterval%basetime%Sd
830 !PRINT *,'DEBUG ESMF_TimeIntervalQuotI() A: divisor = ', divisor
832 CALL timeintchecknormalized( timeinterval, 'ESMF_TimeIntervalQuotI arg1' )
834 IF ( divisor == 0 ) THEN
835 CALL wrf_error_fatal( 'ESMF_TimeIntervalQuotI: divide by zero' )
837 ESMF_TimeIntervalQuotI = timeinterval
838 !PRINT *,'DEBUG ESMF_TimeIntervalQuotI() B: S,Sn,Sd = ', &
839 ! ESMF_TimeIntervalQuotI%basetime%S,ESMF_TimeIntervalQuotI%basetime%Sn,ESMF_TimeIntervalQuotI%basetime%Sd
840 ESMF_TimeIntervalQuotI%basetime = &
841 timeinterval%basetime / divisor
842 !PRINT *,'DEBUG ESMF_TimeIntervalQuotI() C: S,Sn,Sd = ', &
843 ! ESMF_TimeIntervalQuotI%basetime%S,ESMF_TimeIntervalQuotI%basetime%Sn,ESMF_TimeIntervalQuotI%basetime%Sd
845 CALL normalize_timeint( ESMF_TimeIntervalQuotI )
846 !PRINT *,'DEBUG ESMF_TimeIntervalQuotI() D: S,Sn,Sd = ', &
847 ! ESMF_TimeIntervalQuotI%basetime%S,ESMF_TimeIntervalQuotI%basetime%Sn,ESMF_TimeIntervalQuotI%basetime%Sd
849 end function ESMF_TimeIntervalQuotI
851 !------------------------------------------------------------------------------
853 ! !IROUTINE: ESMF_TimeIntervalProdI - Multiply a time interval by an integer
856 function ESMF_TimeIntervalProdI(timeinterval, multiplier)
859 type(ESMF_TimeInterval) :: ESMF_TimeIntervalProdI
862 type(ESMF_TimeInterval), intent(in) :: timeinterval
863 integer, intent(in) :: multiplier
868 ! Multiply a {\tt ESMF\_TimeInterval} by an integer, return product as a
869 ! {\tt ESMF\_TimeInterval}
872 ! \begin{description}
873 ! \item[timeinterval]
882 CALL timeintchecknormalized( timeinterval, 'ESMF_TimeIntervalProdI arg1' )
884 CALL ESMF_TimeIntervalSet( ESMF_TimeIntervalProdI, rc=rc )
885 !$$$move this into overloaded operator(*) in BaseTime
886 ESMF_TimeIntervalProdI%basetime%S = &
887 timeinterval%basetime%S * INT( multiplier, ESMF_KIND_I8 )
888 ESMF_TimeIntervalProdI%basetime%Sn = &
889 timeinterval%basetime%Sn * INT( multiplier, ESMF_KIND_I8 )
891 ESMF_TimeIntervalProdI%basetime%Sd = timeinterval%basetime%Sd
892 CALL normalize_timeint( ESMF_TimeIntervalProdI )
894 end function ESMF_TimeIntervalProdI
896 !------------------------------------------------------------------------------
898 ! This section includes the inherited ESMF_BaseTime class overloaded operators
900 !------------------------------------------------------------------------------
902 ! !IROUTINE: ESMF_TimeIntervalSum - Add two time intervals together
905 function ESMF_TimeIntervalSum(timeinterval1, timeinterval2)
908 type(ESMF_TimeInterval) :: ESMF_TimeIntervalSum
911 type(ESMF_TimeInterval), intent(in) :: timeinterval1
912 type(ESMF_TimeInterval), intent(in) :: timeinterval2
916 ! Add two {\tt ESMF\_TimeIntervals}, return sum as a
917 ! {\tt ESMF\_TimeInterval}. Maps overloaded (+) operator interface
918 ! function to {\tt ESMF\_BaseTime} base class.
921 ! \begin{description}
922 ! \item[timeinterval1]
924 ! \item[timeinterval2]
929 ! TMG1.5.4, TMG2.4.4, TMG2.4.5, TMG2.4.6, TMG5.1, TMG5.2,
932 CALL timeintchecknormalized( timeinterval1, 'ESMF_TimeIntervalSum arg1' )
933 CALL timeintchecknormalized( timeinterval2, 'ESMF_TimeIntervalSum arg2' )
935 ESMF_TimeIntervalSum = timeinterval1
936 ESMF_TimeIntervalSum%basetime = ESMF_TimeIntervalSum%basetime + &
937 timeinterval2%basetime
939 CALL normalize_timeint( ESMF_TimeIntervalSum )
941 end function ESMF_TimeIntervalSum
943 !------------------------------------------------------------------------------
945 ! !IROUTINE: ESMF_TimeIntervalDiff - Subtract one time interval from another
948 function ESMF_TimeIntervalDiff(timeinterval1, timeinterval2)
951 type(ESMF_TimeInterval) :: ESMF_TimeIntervalDiff
954 type(ESMF_TimeInterval), intent(in) :: timeinterval1
955 type(ESMF_TimeInterval), intent(in) :: timeinterval2
959 ! Subtract timeinterval2 from timeinterval1, return remainder as a
960 ! {\tt ESMF\_TimeInterval}.
961 ! Map overloaded (-) operator interface function to {\tt ESMF\_BaseTime}
965 ! \begin{description}
966 ! \item[timeinterval1]
968 ! \item[timeinterval2]
973 ! TMG1.5.4, TMG2.4.4, TMG2.4.5, TMG2.4.6, TMG5.1, TMG5.2, TMG7.2
975 CALL timeintchecknormalized( timeinterval1, 'ESMF_TimeIntervalDiff arg1' )
976 CALL timeintchecknormalized( timeinterval2, 'ESMF_TimeIntervalDiff arg2' )
978 ESMF_TimeIntervalDiff = timeinterval1
979 ESMF_TimeIntervalDiff%basetime = ESMF_TimeIntervalDiff%basetime - &
980 timeinterval2%basetime
981 CALL normalize_timeint( ESMF_TimeIntervalDiff )
983 end function ESMF_TimeIntervalDiff
985 !------------------------------------------------------------------------------
987 ! !IROUTINE: ESMF_TimeIntervalEQ - Compare two time intervals for equality
990 function ESMF_TimeIntervalEQ(timeinterval1, timeinterval2)
993 logical :: ESMF_TimeIntervalEQ
996 type(ESMF_TimeInterval), intent(in) :: timeinterval1
997 type(ESMF_TimeInterval), intent(in) :: timeinterval2
1000 ! Return true if both given time intervals are equal, false otherwise.
1001 ! Maps overloaded (==) operator interface function to {\tt ESMF\_BaseTime}
1004 ! The arguments are:
1005 ! \begin{description}
1006 ! \item[timeinterval1]
1007 ! First time interval to compare
1008 ! \item[timeinterval2]
1009 ! Second time interval to compare
1013 ! TMG1.5.3, TMG2.4.3, TMG7.2
1015 CALL timeintchecknormalized( timeinterval1, 'ESMF_TimeIntervalEQ arg1' )
1016 CALL timeintchecknormalized( timeinterval2, 'ESMF_TimeIntervalEQ arg2' )
1018 !$$$here... move all this out of Meat.F90 ?
1019 ! call ESMC_BaseTime base class function
1020 call c_ESMC_BaseTimeIntEQ(timeinterval1, timeinterval2, ESMF_TimeIntervalEQ)
1022 end function ESMF_TimeIntervalEQ
1024 !------------------------------------------------------------------------------
1026 ! !IROUTINE: ESMF_TimeIntervalNE - Compare two time intervals for inequality
1029 function ESMF_TimeIntervalNE(timeinterval1, timeinterval2)
1032 logical :: ESMF_TimeIntervalNE
1035 type(ESMF_TimeInterval), intent(in) :: timeinterval1
1036 type(ESMF_TimeInterval), intent(in) :: timeinterval2
1039 ! Return true if both given time intervals are not equal, false otherwise.
1040 ! Maps overloaded (/=) operator interface function to {\tt ESMF\_BaseTime}
1043 ! The arguments are:
1044 ! \begin{description}
1045 ! \item[timeinterval1]
1046 ! First time interval to compare
1047 ! \item[timeinterval2]
1048 ! Second time interval to compare
1052 ! TMG1.5.3, TMG2.4.3, TMG7.2
1054 CALL timeintchecknormalized( timeinterval1, 'ESMF_TimeIntervalNE arg1' )
1055 CALL timeintchecknormalized( timeinterval2, 'ESMF_TimeIntervalNE arg2' )
1057 ! call ESMC_BaseTime base class function
1058 call c_ESMC_BaseTimeIntNE(timeinterval1, timeinterval2, ESMF_TimeIntervalNE)
1060 end function ESMF_TimeIntervalNE
1062 !------------------------------------------------------------------------------
1064 ! !IROUTINE: ESMF_TimeIntervalLT - Time interval 1 less than time interval 2 ?
1067 function ESMF_TimeIntervalLT(timeinterval1, timeinterval2)
1070 logical :: ESMF_TimeIntervalLT
1073 type(ESMF_TimeInterval), intent(in) :: timeinterval1
1074 type(ESMF_TimeInterval), intent(in) :: timeinterval2
1077 ! Return true if first time interval is less than second time interval,
1078 ! false otherwise. Maps overloaded (<) operator interface function to
1079 ! {\tt ESMF\_BaseTime} base class.
1081 ! The arguments are:
1082 ! \begin{description}
1083 ! \item[timeinterval1]
1084 ! First time interval to compare
1085 ! \item[timeinterval2]
1086 ! Second time interval to compare
1090 ! TMG1.5.3, TMG2.4.3, TMG7.2
1092 CALL timeintchecknormalized( timeinterval1, 'ESMF_TimeIntervalLT arg1' )
1093 CALL timeintchecknormalized( timeinterval2, 'ESMF_TimeIntervalLT arg2' )
1095 ! call ESMC_BaseTime base class function
1096 call c_ESMC_BaseTimeIntLT(timeinterval1, timeinterval2, ESMF_TimeIntervalLT)
1098 end function ESMF_TimeIntervalLT
1100 !------------------------------------------------------------------------------
1102 ! !IROUTINE: ESMF_TimeIntervalGT - Time interval 1 greater than time interval 2?
1105 function ESMF_TimeIntervalGT(timeinterval1, timeinterval2)
1108 logical :: ESMF_TimeIntervalGT
1111 type(ESMF_TimeInterval), intent(in) :: timeinterval1
1112 type(ESMF_TimeInterval), intent(in) :: timeinterval2
1115 ! Return true if first time interval is greater than second time interval,
1116 ! false otherwise. Maps overloaded (>) operator interface function to
1117 ! {\tt ESMF\_BaseTime} base class.
1119 ! The arguments are:
1120 ! \begin{description}
1121 ! \item[timeinterval1]
1122 ! First time interval to compare
1123 ! \item[timeinterval2]
1124 ! Second time interval to compare
1128 ! TMG1.5.3, TMG2.4.3, TMG7.2
1130 CALL timeintchecknormalized( timeinterval1, 'ESMF_TimeIntervalGT arg1' )
1131 CALL timeintchecknormalized( timeinterval2, 'ESMF_TimeIntervalGT arg2' )
1133 ! call ESMC_BaseTime base class function
1134 call c_ESMC_BaseTimeIntGT(timeinterval1, timeinterval2, ESMF_TimeIntervalGT)
1136 end function ESMF_TimeIntervalGT
1138 !------------------------------------------------------------------------------
1140 ! !IROUTINE: ESMF_TimeIntervalLE - Time interval 1 less than or equal to time interval 2 ?
1143 function ESMF_TimeIntervalLE(timeinterval1, timeinterval2)
1146 logical :: ESMF_TimeIntervalLE
1149 type(ESMF_TimeInterval), intent(in) :: timeinterval1
1150 type(ESMF_TimeInterval), intent(in) :: timeinterval2
1153 ! Return true if first time interval is less than or equal to second time
1154 ! interval, false otherwise.
1155 ! Maps overloaded (<=) operator interface function to {\tt ESMF\_BaseTime}
1158 ! The arguments are:
1159 ! \begin{description}
1160 ! \item[timeinterval1]
1161 ! First time interval to compare
1162 ! \item[timeinterval2]
1163 ! Second time interval to compare
1167 ! TMG1.5.3, TMG2.4.3, TMG7.2
1169 CALL timeintchecknormalized( timeinterval1, 'ESMF_TimeIntervalLE arg1' )
1170 CALL timeintchecknormalized( timeinterval2, 'ESMF_TimeIntervalLE arg2' )
1172 ! call ESMC_BaseTime base class function
1173 call c_ESMC_BaseTimeIntLE(timeinterval1, timeinterval2, ESMF_TimeIntervalLE)
1175 end function ESMF_TimeIntervalLE
1177 !------------------------------------------------------------------------------
1179 ! !IROUTINE: ESMF_TimeIntervalGE - Time interval 1 greater than or equal to time interval 2 ?
1182 function ESMF_TimeIntervalGE(timeinterval1, timeinterval2)
1185 logical :: ESMF_TimeIntervalGE
1188 type(ESMF_TimeInterval), intent(in) :: timeinterval1
1189 type(ESMF_TimeInterval), intent(in) :: timeinterval2
1192 ! Return true if first time interval is greater than or equal to second
1193 ! time interval, false otherwise. Maps overloaded (>=) operator interface
1194 ! function to {\tt ESMF\_BaseTime} base class.
1196 ! The arguments are:
1197 ! \begin{description}
1198 ! \item[timeinterval1]
1199 ! First time interval to compare
1200 ! \item[timeinterval2]
1201 ! Second time interval to compare
1205 ! TMG1.5.3, TMG2.4.3, TMG7.2
1207 CALL timeintchecknormalized( timeinterval1, 'ESMF_TimeIntervalGE arg1' )
1208 CALL timeintchecknormalized( timeinterval2, 'ESMF_TimeIntervalGE arg2' )
1210 ! call ESMC_BaseTime base class function
1211 call c_ESMC_BaseTimeIntGE(timeinterval1, timeinterval2, ESMF_TimeIntervalGE)
1213 end function ESMF_TimeIntervalGE
1216 !------------------------------------------------------------------------------
1218 ! !IROUTINE: ESMF_TimeIntervalIsPositive - Time interval greater than zero?
1221 function ESMF_TimeIntervalIsPositive(timeinterval)
1224 logical :: ESMF_TimeIntervalIsPositive
1227 type(ESMF_TimeInterval), intent(in) :: timeinterval
1230 type(ESMF_TimeInterval) :: zerotimeint
1234 ! Return true if time interval is greater than zero,
1237 ! The arguments are:
1238 ! \begin{description}
1239 ! \item[timeinterval]
1240 ! Time interval to compare
1243 CALL timeintchecknormalized( timeinterval, &
1244 'ESMF_TimeIntervalIsPositive arg' )
1246 CALL ESMF_TimeIntervalSet ( zerotimeint, rc=rcint )
1247 IF ( rcint /= ESMF_SUCCESS ) THEN
1248 CALL wrf_error_fatal( &
1249 'ESMF_TimeIntervalIsPositive: ESMF_TimeIntervalSet failed' )
1251 ! hack for bug in PGI 5.1-x
1252 ! ESMF_TimeIntervalIsPositive = timeinterval > zerotimeint
1253 ESMF_TimeIntervalIsPositive = ESMF_TimeIntervalGT( timeinterval, &
1255 end function ESMF_TimeIntervalIsPositive
1257 end module ESMF_TimeIntervalMod