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 !jm Month has no meaning for an interval; get rid of it, 20100319
67 ! INTEGER :: MM ! relative month
70 !------------------------------------------------------------------------------
72 public ESMF_TimeInterval
73 !------------------------------------------------------------------------------
75 ! !PUBLIC MEMBER FUNCTIONS:
76 public ESMF_TimeIntervalGet
77 public ESMF_TimeIntervalSet
78 public ESMFold_TimeIntervalGetString
79 public ESMF_TimeIntervalAbsValue
80 public ESMF_TimeIntervalNegAbsValue
82 ! Required inherited and overridden ESMF_Base class methods
84 !!!!!!!!! added 20051012, JM
85 ! public WRFADDITION_TimeIntervalDIVQuot
86 !!!!!!!!! renamed to simplify testing 20060320, TH
87 public ESMF_TimeIntervalDIVQuot
89 ! This convenience routine is only used by other modules in
91 public ESMF_TimeIntervalIsPositive
94 ! !PRIVATE MEMBER FUNCTIONS:
96 ! overloaded operator functions
99 private ESMF_TimeIntervalQuotI
102 private ESMF_TimeIntervalProdI
104 ! Inherited and overloaded from ESMF_BaseTime
107 private ESMF_TimeIntervalSum
110 private ESMF_TimeIntervalDiff
112 public operator(.EQ.)
113 private ESMF_TimeIntervalEQ
115 public operator(.NE.)
116 private ESMF_TimeIntervalNE
118 public operator(.LT.)
119 private ESMF_TimeIntervalLT
121 public operator(.GT.)
122 private ESMF_TimeIntervalGT
124 public operator(.LE.)
125 private ESMF_TimeIntervalLE
127 public operator(.GE.)
128 private ESMF_TimeIntervalGE
131 !==============================================================================
135 !==============================================================================
138 interface operator(*)
140 ! !PRIVATE MEMBER FUNCTIONS:
141 module procedure ESMF_TimeIntervalProdI
144 ! This interface overloads the * operator for the {\tt ESMF\_TimeInterval}
150 !------------------------------------------------------------------------------
153 interface operator(/)
155 ! !PRIVATE MEMBER FUNCTIONS:
156 module procedure ESMF_TimeIntervalQuotI
159 ! This interface overloads the / operator for the
160 ! {\tt ESMF\_TimeInterval} class
165 !------------------------------------------------------------------------------
168 interface operator(+)
170 ! !PRIVATE MEMBER FUNCTIONS:
171 module procedure ESMF_TimeIntervalSum
174 ! This interface overloads the + operator for the
175 ! {\tt ESMF\_TimeInterval} class
180 !------------------------------------------------------------------------------
183 interface operator(-)
185 ! !PRIVATE MEMBER FUNCTIONS:
186 module procedure ESMF_TimeIntervalDiff
189 ! This interface overloads the - operator for the
190 ! {\tt ESMF\_TimeInterval} class
195 !------------------------------------------------------------------------------
198 interface operator(.EQ.)
200 ! !PRIVATE MEMBER FUNCTIONS:
201 module procedure ESMF_TimeIntervalEQ
204 ! This interface overloads the .EQ. operator for the
205 ! {\tt ESMF\_TimeInterval} class
210 !------------------------------------------------------------------------------
213 interface operator(.NE.)
215 ! !PRIVATE MEMBER FUNCTIONS:
216 module procedure ESMF_TimeIntervalNE
219 ! This interface overloads the .NE. operator for the
220 ! {\tt ESMF\_TimeInterval} class
225 !------------------------------------------------------------------------------
228 interface operator(.LT.)
230 ! !PRIVATE MEMBER FUNCTIONS:
231 module procedure ESMF_TimeIntervalLT
234 ! This interface overloads the .LT. operator for the
235 ! {\tt ESMF\_TimeInterval} class
240 !------------------------------------------------------------------------------
243 interface operator(.GT.)
245 ! !PRIVATE MEMBER FUNCTIONS:
246 module procedure ESMF_TimeIntervalGT
249 ! This interface overloads the .GT. operator for the
250 ! {\tt ESMF\_TimeInterval} class
255 !------------------------------------------------------------------------------
258 interface operator(.LE.)
260 ! !PRIVATE MEMBER FUNCTIONS:
261 module procedure ESMF_TimeIntervalLE
264 ! This interface overloads the .LE. operator for the
265 ! {\tt ESMF\_TimeInterval} class
270 !------------------------------------------------------------------------------
273 interface operator(.GE.)
275 ! !PRIVATE MEMBER FUNCTIONS:
276 module procedure ESMF_TimeIntervalGE
279 ! This interface overloads the .GE. operator for the
280 ! {\tt ESMF\_TimeInterval} class
285 !------------------------------------------------------------------------------
287 !==============================================================================
291 !==============================================================================
293 ! Generic Get/Set routines which use F90 optional arguments
295 !------------------------------------------------------------------------------
297 ! !IROUTINE: ESMF_TimeIntervalGet - Get value in user-specified units
300 subroutine ESMF_TimeIntervalGet(timeinterval, D, d_r8, S, S_i8, Sn, Sd, &
304 type(ESMF_TimeInterval), intent(in) :: timeinterval
305 integer, intent(out), optional :: D
306 real(ESMF_KIND_R8), intent(out), optional :: d_r8
307 integer(ESMF_KIND_I8), intent(out), optional :: S_i8
308 integer, intent(out), optional :: S
309 integer, intent(out), optional :: Sn
310 integer, intent(out), optional :: Sd
311 character*(*), optional, intent(out) :: TimeString
312 integer, intent(out), optional :: rc
316 ! Get the value of the {\tt ESMF\_TimeInterval} in units specified by the
317 ! user via F90 optional arguments.
319 ! Time manager represents and manipulates time internally with integers
320 ! to maintain precision. Hence, user-specified floating point values are
321 ! converted internally from integers.
323 ! See {\tt ../include/ESMC\_BaseTime.h} and
324 ! {\tt ../include/ESMC\_TimeInterval.h} for complete description.
327 ! \begin{description}
328 ! \item[timeinterval]
329 ! The object instance to query
331 ! Integer years (>= 32-bit)
333 ! Integer years (large, >= 64-bit)
335 ! Integer months (>= 32-bit)
337 ! Integer months (large, >= 64-bit)
339 ! Integer days (>= 32-bit)
341 ! Integer days (large, >= 64-bit)
347 ! Integer seconds (>= 32-bit)
349 ! Integer seconds (large, >= 64-bit)
351 ! Integer milliseconds
353 ! Integer microseconds
355 ! Integer nanoseconds
357 ! Double precision days
359 ! Double precision hours
361 ! Double precision minutes
363 ! Double precision seconds
365 ! Double precision milliseconds
367 ! Double precision microseconds
369 ! Double precision nanoseconds
371 ! Integer fractional seconds - numerator
373 ! Integer fractional seconds - denominator
375 ! Return code; equals {\tt ESMF\_SUCCESS} if there are no errors.
381 ! Added argument to output double precision seconds, S_i8
382 ! William.Gustafson@pnl.gov; 9-May-2008
385 INTEGER(ESMF_KIND_I8) :: seconds
389 seconds = timeinterval%basetime%S
390 ! note that S is overwritten below (if present) if other args are also
392 IF ( PRESENT(S) ) S = seconds
393 IF ( PRESENT(S_i8) ) S_i8 = seconds
394 IF ( PRESENT( D ) ) THEN
395 D = seconds / SECONDS_PER_DAY
396 IF ( PRESENT(S) ) S = MOD( seconds, SECONDS_PER_DAY )
397 IF ( PRESENT(S_i8) ) S_i8 = MOD( seconds, SECONDS_PER_DAY )
399 IF ( PRESENT( d_r8 ) ) THEN
400 D_r8 = REAL( seconds, ESMF_KIND_R8 ) / &
401 REAL( SECONDS_PER_DAY, ESMF_KIND_R8 )
402 IF ( PRESENT(S) ) S = MOD( seconds, SECONDS_PER_DAY )
403 IF ( PRESENT(S_i8) ) S_i8 = MOD( seconds, SECONDS_PER_DAY )
405 IF ( PRESENT(Sn) ) THEN
406 Sn = timeinterval%basetime%Sn
408 IF ( PRESENT(Sd) ) THEN
409 Sd = timeinterval%basetime%Sd
411 IF ( PRESENT( timeString ) ) THEN
412 CALL ESMFold_TimeIntervalGetString( timeinterval, timeString, rc=ierr )
414 IF ( PRESENT(rc) ) rc = ierr
416 end subroutine ESMF_TimeIntervalGet
418 !------------------------------------------------------------------------------
420 ! !IROUTINE: ESMF_TimeIntervalSet - Initialize via user-specified unit set
423 subroutine ESMF_TimeIntervalSet(timeinterval, YY, YYl, MM, MOl, D, Dl, &
424 H, M, S, Sl, MS, US, NS, &
425 d_, h_, m_, s_, ms_, us_, ns_, &
429 type(ESMF_TimeInterval), intent(out) :: timeinterval
430 integer, intent(in), optional :: YY
431 integer(ESMF_KIND_I8), intent(in), optional :: YYl
432 integer, intent(in), optional :: MM
433 integer(ESMF_KIND_I8), intent(in), optional :: MOl
434 integer, intent(in), optional :: D
435 integer(ESMF_KIND_I8), intent(in), optional :: Dl
436 integer, intent(in), optional :: H
437 integer, intent(in), optional :: M
438 integer, intent(in), optional :: S
439 integer(ESMF_KIND_I8), intent(in), optional :: Sl
440 integer, intent(in), optional :: MS
441 integer, intent(in), optional :: US
442 integer, intent(in), optional :: NS
443 double precision, intent(in), optional :: d_
444 double precision, intent(in), optional :: h_
445 double precision, intent(in), optional :: m_
446 double precision, intent(in), optional :: s_
447 double precision, intent(in), optional :: ms_
448 double precision, intent(in), optional :: us_
449 double precision, intent(in), optional :: ns_
450 integer, intent(in), optional :: Sn
451 integer, intent(in), optional :: Sd
452 integer, intent(out), optional :: rc
457 ! Set the value of the {\tt ESMF\_TimeInterval} in units specified by
458 ! the user via F90 optional arguments
460 ! Time manager represents and manipulates time internally with integers
461 ! to maintain precision. Hence, user-specified floating point values are
462 ! converted internally to integers.
464 ! See {\tt ../include/ESMC\_BaseTime.h} and
465 ! {\tt ../include/ESMC\_TimeInterval.h} for complete description.
468 ! \begin{description}
469 ! \item[timeinterval]
470 ! The object instance to initialize
472 ! Integer number of interval years (>= 32-bit)
474 ! Integer number of interval years (large, >= 64-bit)
476 ! Integer number of interval months (>= 32-bit)
478 ! Integer number of interval months (large, >= 64-bit)
480 ! Integer number of interval days (>= 32-bit)
482 ! Integer number of interval days (large, >= 64-bit)
488 ! Integer seconds (>= 32-bit)
490 ! Integer seconds (large, >= 64-bit)
492 ! Integer milliseconds
494 ! Integer microseconds
496 ! Integer nanoseconds
498 ! Double precision days
500 ! Double precision hours
502 ! Double precision minutes
504 ! Double precision seconds
506 ! Double precision milliseconds
508 ! Double precision microseconds
510 ! Double precision nanoseconds
512 ! Integer fractional seconds - numerator
514 ! Integer fractional seconds - denominator
516 ! Return code; equals {\tt ESMF\_SUCCESS} if there are no errors.
523 IF ( PRESENT(rc) ) rc = ESMF_FAILURE
524 ! note that YR and MM are relative
526 IF ( PRESENT( YY ) ) THEN
529 !jm timeinterval%MM = 0
530 !jm IF ( PRESENT( MM ) ) THEN
531 !jm timeinterval%MM = MM
533 !jm ! Rollover months to years
534 !jm IF ( abs(timeinterval%MM) .GE. MONTHS_PER_YEAR ) THEN
535 !jm timeinterval%YR = timeinterval%YR + timeinterval%MM/MONTHS_PER_YEAR
536 !jm timeinterval%MM = mod(timeinterval%MM,MONTHS_PER_YEAR)
539 timeinterval%basetime%S = 0
540 ! For 365-day calendar, immediately convert years to days since we know
541 ! how to do it in this case.
542 !$$$ replace this hack with something saner...
543 IF ( nfeb( 2004 ) == 28 ) THEN
544 timeinterval%basetime%S = timeinterval%basetime%S + &
545 ( 365_ESMF_KIND_I8 * &
546 INT( timeinterval%YR, ESMF_KIND_I8 ) * SECONDS_PER_DAY )
549 IF ( PRESENT( D ) ) THEN
550 timeinterval%basetime%S = timeinterval%basetime%S + &
551 ( SECONDS_PER_DAY * INT( D, ESMF_KIND_I8 ) )
553 !$$$ Push H,M,S,Sn,Sd,MS down into BaseTime constructor from EVERYWHERE
554 !$$$ and THEN add ESMF scaling behavior when other args are present...
555 IF ( PRESENT( H ) ) THEN
556 timeinterval%basetime%S = timeinterval%basetime%S + &
557 ( SECONDS_PER_HOUR * INT( H, ESMF_KIND_I8 ) )
559 IF ( PRESENT( M ) ) THEN
560 timeinterval%basetime%S = timeinterval%basetime%S + &
561 ( SECONDS_PER_MINUTE * INT( M, ESMF_KIND_I8 ) )
563 IF ( PRESENT( S ) ) THEN
564 timeinterval%basetime%S = timeinterval%basetime%S + &
565 INT( S, ESMF_KIND_I8 )
567 IF ( PRESENT( Sn ) .AND. ( .NOT. PRESENT( Sd ) ) ) THEN
568 CALL wrf_error_fatal( &
569 "ESMF_TimeIntervalSet: Must specify Sd if Sn is specified")
571 IF ( PRESENT( Sd ) .AND. PRESENT( MS ) ) THEN
572 CALL wrf_error_fatal( &
573 "ESMF_TimeIntervalSet: Must not specify both Sd and MS")
575 timeinterval%basetime%Sn = 0
576 timeinterval%basetime%Sd = 0
577 IF ( PRESENT( MS ) ) THEN
578 timeinterval%basetime%Sn = MS
579 timeinterval%basetime%Sd = 1000_ESMF_KIND_I8
580 ELSE IF ( PRESENT( Sd ) ) THEN
581 timeinterval%basetime%Sd = Sd
582 IF ( PRESENT( Sn ) ) THEN
583 timeinterval%basetime%Sn = Sn
586 CALL normalize_timeint( timeinterval )
588 IF ( PRESENT(rc) ) rc = ESMF_SUCCESS
590 end subroutine ESMF_TimeIntervalSet
592 !------------------------------------------------------------------------------
594 ! !IROUTINE: ESMFold_TimeIntervalGetString - Get time interval value in string format
597 subroutine ESMFold_TimeIntervalGetString(timeinterval, TimeString, rc)
600 type(ESMF_TimeInterval), intent(in) :: timeinterval
601 character*(*), intent(out) :: TimeString
602 integer, intent(out), optional :: rc
604 integer :: signnormtimeint
606 INTEGER(ESMF_KIND_I8) :: iS, iSn, iSd, H, M, S
607 character (len=1) :: signstr
610 ! Convert {\tt ESMF\_TimeInterval}'s value into string format
613 ! \begin{description}
614 ! \item[timeinterval]
615 ! The object instance to convert
617 ! The string to return
619 ! Return code; equals {\tt ESMF\_SUCCESS} if there are no errors.
626 ! NOTE: YR, MM, Sn, and Sd are not yet included in the returned string...
627 !PRINT *,'DEBUG ESMFold_TimeIntervalGetString(): YR,MM,S,Sn,Sd = ', &
630 ! timeinterval%basetime%S, &
631 ! timeinterval%basetime%Sn, &
632 ! timeinterval%basetime%Sd
634 negative = ( signnormtimeint( timeInterval ) == -1 )
636 iS = -timeinterval%basetime%S
637 iSn = -timeinterval%basetime%Sn
640 iS = timeinterval%basetime%S
641 iSn = timeinterval%basetime%Sn
644 iSd = timeinterval%basetime%Sd
646 H = mod( iS, SECONDS_PER_DAY ) / SECONDS_PER_HOUR
647 M = mod( iS, SECONDS_PER_HOUR) / SECONDS_PER_MINUTE
648 S = mod( iS, SECONDS_PER_MINUTE )
650 !$$$here... need to print Sn and Sd when they are used ???
652 write(TimeString,FMT="(A,I10.10,'_',I3.3,':',I3.3,':',I3.3)") &
653 TRIM(signstr), ( iS / SECONDS_PER_DAY ), H, M, S
655 !write(0,*)'TimeIntervalGetString Sn ',timeinterval%basetime%Sn,' Sd ',timeinterval%basetime%Sd
659 end subroutine ESMFold_TimeIntervalGetString
661 !------------------------------------------------------------------------------
663 ! !IROUTINE: ESMF_TimeIntervalAbsValue - Get the absolute value of a time interval
666 function ESMF_TimeIntervalAbsValue(timeinterval)
669 type(ESMF_TimeInterval) :: ESMF_TimeIntervalAbsValue
672 type(ESMF_TimeInterval), intent(in) :: timeinterval
677 ! Return a {\tt ESMF\_TimeInterval}'s absolute value.
680 ! \begin{description}
681 ! \item[timeinterval]
682 ! The object instance to take the absolute value of.
683 ! Absolute value returned as value of function.
689 CALL timeintchecknormalized( timeinterval, 'ESMF_TimeIntervalAbsValue arg1' )
690 ESMF_TimeIntervalAbsValue = timeinterval
691 !$$$here... move implementation into BaseTime
692 ESMF_TimeIntervalAbsValue%basetime%S = &
693 abs(ESMF_TimeIntervalAbsValue%basetime%S)
694 ESMF_TimeIntervalAbsValue%basetime%Sn = &
695 abs(ESMF_TimeIntervalAbsValue%basetime%Sn )
697 end function ESMF_TimeIntervalAbsValue
699 !------------------------------------------------------------------------------
701 ! !IROUTINE: ESMF_TimeIntervalNegAbsValue - Get the negative absolute value of a time interval
704 function ESMF_TimeIntervalNegAbsValue(timeinterval)
707 type(ESMF_TimeInterval) :: ESMF_TimeIntervalNegAbsValue
710 type(ESMF_TimeInterval), intent(in) :: timeinterval
715 ! Return a {\tt ESMF\_TimeInterval}'s negative absolute value.
718 ! \begin{description}
719 ! \item[timeinterval]
720 ! The object instance to take the negative absolute value of.
721 ! Negative absolute value returned as value of function.
727 CALL timeintchecknormalized( timeinterval, 'ESMF_TimeIntervalNegAbsValue arg1' )
729 ESMF_TimeIntervalNegAbsValue = timeinterval
730 !$$$here... move implementation into BaseTime
731 ESMF_TimeIntervalNegAbsValue%basetime%S = &
732 -abs(ESMF_TimeIntervalNegAbsValue%basetime%S)
733 ESMF_TimeIntervalNegAbsValue%basetime%Sn = &
734 -abs(ESMF_TimeIntervalNegAbsValue%basetime%Sn )
736 end function ESMF_TimeIntervalNegAbsValue
738 !------------------------------------------------------------------------------
740 ! This section includes overloaded operators defined only for TimeInterval
741 ! (not inherited from BaseTime)
742 ! Note: these functions do not have a return code, since F90 forbids more
743 ! than 2 arguments for arithmetic overloaded operators
745 !------------------------------------------------------------------------------
747 !!!!!!!!!!!!!!!!!! added jm 20051012
748 ! new WRF-specific function, Divide two time intervals and return the whole integer, without remainder
749 function ESMF_TimeIntervalDIVQuot(timeinterval1, timeinterval2)
752 INTEGER :: ESMF_TimeIntervalDIVQuot
755 type(ESMF_TimeInterval), intent(in) :: timeinterval1
756 type(ESMF_TimeInterval), intent(in) :: timeinterval2
759 INTEGER :: retval, isgn, rc
760 type(ESMF_TimeInterval) :: zero, i1,i2
763 ! Returns timeinterval1 divided by timeinterval2 as a fraction quotient.
766 ! \begin{description}
767 ! \item[timeinterval1]
769 ! \item[timeinterval2]
777 CALL timeintchecknormalized( timeinterval1, 'ESMF_TimeIntervalDIVQuot arg1' )
778 CALL timeintchecknormalized( timeinterval2, 'ESMF_TimeIntervalDIVQuot arg2' )
780 call ESMF_TimeIntervalSet( zero, rc=rc )
784 if ( i1 .LT. zero ) then
785 i1 = ESMF_TimeIntervalProdI(i1, -1)
788 if ( i2 .LT. zero ) then
789 i2 = ESMF_TimeIntervalProdI(i2, -1)
792 ! repeated subtraction
794 DO WHILE ( i1 .GE. i2 )
798 retval = retval * isgn
800 ESMF_TimeIntervalDIVQuot = retval
802 end function ESMF_TimeIntervalDIVQuot
807 !------------------------------------------------------------------------------
809 ! !IROUTINE: ESMF_TimeIntervalQuotI - Divide time interval by an integer, return time interval result
812 function ESMF_TimeIntervalQuotI(timeinterval, divisor)
815 type(ESMF_TimeInterval) :: ESMF_TimeIntervalQuotI
818 type(ESMF_TimeInterval), intent(in) :: timeinterval
819 integer, intent(in) :: divisor
822 ! Divides a {\tt ESMF\_TimeInterval} by an integer divisor, returns
823 ! quotient as a {\tt ESMF\_TimeInterval}
826 ! \begin{description}
827 ! \item[timeinterval]
834 ! TMG1.5.6, TMG5.3, TMG7.2
837 !PRINT *,'DEBUG ESMF_TimeIntervalQuotI() A: S,Sn,Sd = ', &
838 ! timeinterval%basetime%S,timeinterval%basetime%Sn,timeinterval%basetime%Sd
839 !PRINT *,'DEBUG ESMF_TimeIntervalQuotI() A: divisor = ', divisor
841 CALL timeintchecknormalized( timeinterval, 'ESMF_TimeIntervalQuotI arg1' )
843 IF ( divisor == 0 ) THEN
844 CALL wrf_error_fatal( 'ESMF_TimeIntervalQuotI: divide by zero' )
846 ESMF_TimeIntervalQuotI = timeinterval
847 !PRINT *,'DEBUG ESMF_TimeIntervalQuotI() B: S,Sn,Sd = ', &
848 ! ESMF_TimeIntervalQuotI%basetime%S,ESMF_TimeIntervalQuotI%basetime%Sn,ESMF_TimeIntervalQuotI%basetime%Sd
849 ESMF_TimeIntervalQuotI%basetime = &
850 timeinterval%basetime / divisor
851 !PRINT *,'DEBUG ESMF_TimeIntervalQuotI() C: S,Sn,Sd = ', &
852 ! ESMF_TimeIntervalQuotI%basetime%S,ESMF_TimeIntervalQuotI%basetime%Sn,ESMF_TimeIntervalQuotI%basetime%Sd
854 CALL normalize_timeint( ESMF_TimeIntervalQuotI )
855 !PRINT *,'DEBUG ESMF_TimeIntervalQuotI() D: S,Sn,Sd = ', &
856 ! ESMF_TimeIntervalQuotI%basetime%S,ESMF_TimeIntervalQuotI%basetime%Sn,ESMF_TimeIntervalQuotI%basetime%Sd
858 end function ESMF_TimeIntervalQuotI
860 !------------------------------------------------------------------------------
862 ! !IROUTINE: ESMF_TimeIntervalProdI - Multiply a time interval by an integer
865 function ESMF_TimeIntervalProdI(timeinterval, multiplier)
868 type(ESMF_TimeInterval) :: ESMF_TimeIntervalProdI
871 type(ESMF_TimeInterval), intent(in) :: timeinterval
872 integer, intent(in) :: multiplier
877 ! Multiply a {\tt ESMF\_TimeInterval} by an integer, return product as a
878 ! {\tt ESMF\_TimeInterval}
881 ! \begin{description}
882 ! \item[timeinterval]
891 CALL timeintchecknormalized( timeinterval, 'ESMF_TimeIntervalProdI arg1' )
893 CALL ESMF_TimeIntervalSet( ESMF_TimeIntervalProdI, rc=rc )
894 !$$$move this into overloaded operator(*) in BaseTime
895 ESMF_TimeIntervalProdI%basetime%S = &
896 timeinterval%basetime%S * INT( multiplier, ESMF_KIND_I8 )
897 ESMF_TimeIntervalProdI%basetime%Sn = &
898 timeinterval%basetime%Sn * INT( multiplier, ESMF_KIND_I8 )
900 ESMF_TimeIntervalProdI%basetime%Sd = timeinterval%basetime%Sd
901 CALL normalize_timeint( ESMF_TimeIntervalProdI )
903 end function ESMF_TimeIntervalProdI
905 !------------------------------------------------------------------------------
907 ! This section includes the inherited ESMF_BaseTime class overloaded operators
909 !------------------------------------------------------------------------------
911 ! !IROUTINE: ESMF_TimeIntervalSum - Add two time intervals together
914 function ESMF_TimeIntervalSum(timeinterval1, timeinterval2)
917 type(ESMF_TimeInterval) :: ESMF_TimeIntervalSum
920 type(ESMF_TimeInterval), intent(in) :: timeinterval1
921 type(ESMF_TimeInterval), intent(in) :: timeinterval2
925 ! Add two {\tt ESMF\_TimeIntervals}, return sum as a
926 ! {\tt ESMF\_TimeInterval}. Maps overloaded (+) operator interface
927 ! function to {\tt ESMF\_BaseTime} base class.
930 ! \begin{description}
931 ! \item[timeinterval1]
933 ! \item[timeinterval2]
938 ! TMG1.5.4, TMG2.4.4, TMG2.4.5, TMG2.4.6, TMG5.1, TMG5.2,
941 CALL timeintchecknormalized( timeinterval1, 'ESMF_TimeIntervalSum arg1' )
942 CALL timeintchecknormalized( timeinterval2, 'ESMF_TimeIntervalSum arg2' )
944 ESMF_TimeIntervalSum = timeinterval1
945 ESMF_TimeIntervalSum%basetime = ESMF_TimeIntervalSum%basetime + &
946 timeinterval2%basetime
948 CALL normalize_timeint( ESMF_TimeIntervalSum )
950 end function ESMF_TimeIntervalSum
952 !------------------------------------------------------------------------------
954 ! !IROUTINE: ESMF_TimeIntervalDiff - Subtract one time interval from another
957 function ESMF_TimeIntervalDiff(timeinterval1, timeinterval2)
960 type(ESMF_TimeInterval) :: ESMF_TimeIntervalDiff
963 type(ESMF_TimeInterval), intent(in) :: timeinterval1
964 type(ESMF_TimeInterval), intent(in) :: timeinterval2
968 ! Subtract timeinterval2 from timeinterval1, return remainder as a
969 ! {\tt ESMF\_TimeInterval}.
970 ! Map overloaded (-) operator interface function to {\tt ESMF\_BaseTime}
974 ! \begin{description}
975 ! \item[timeinterval1]
977 ! \item[timeinterval2]
982 ! TMG1.5.4, TMG2.4.4, TMG2.4.5, TMG2.4.6, TMG5.1, TMG5.2, TMG7.2
984 CALL timeintchecknormalized( timeinterval1, 'ESMF_TimeIntervalDiff arg1' )
985 CALL timeintchecknormalized( timeinterval2, 'ESMF_TimeIntervalDiff arg2' )
987 ESMF_TimeIntervalDiff = timeinterval1
988 ESMF_TimeIntervalDiff%basetime = ESMF_TimeIntervalDiff%basetime - &
989 timeinterval2%basetime
990 CALL normalize_timeint( ESMF_TimeIntervalDiff )
992 end function ESMF_TimeIntervalDiff
994 !------------------------------------------------------------------------------
996 ! !IROUTINE: ESMF_TimeIntervalEQ - Compare two time intervals for equality
999 function ESMF_TimeIntervalEQ(timeinterval1, timeinterval2)
1002 logical :: ESMF_TimeIntervalEQ
1005 type(ESMF_TimeInterval), intent(in) :: timeinterval1
1006 type(ESMF_TimeInterval), intent(in) :: timeinterval2
1009 ! Return true if both given time intervals are equal, false otherwise.
1010 ! Maps overloaded (==) operator interface function to {\tt ESMF\_BaseTime}
1013 ! The arguments are:
1014 ! \begin{description}
1015 ! \item[timeinterval1]
1016 ! First time interval to compare
1017 ! \item[timeinterval2]
1018 ! Second time interval to compare
1022 ! TMG1.5.3, TMG2.4.3, TMG7.2
1024 CALL timeintchecknormalized( timeinterval1, 'ESMF_TimeIntervalEQ arg1' )
1025 CALL timeintchecknormalized( timeinterval2, 'ESMF_TimeIntervalEQ arg2' )
1027 !$$$here... move all this out of Meat.F90 ?
1028 ! call ESMC_BaseTime base class function
1029 call c_ESMC_BaseTimeIntEQ(timeinterval1, timeinterval2, ESMF_TimeIntervalEQ)
1031 end function ESMF_TimeIntervalEQ
1033 !------------------------------------------------------------------------------
1035 ! !IROUTINE: ESMF_TimeIntervalNE - Compare two time intervals for inequality
1038 function ESMF_TimeIntervalNE(timeinterval1, timeinterval2)
1041 logical :: ESMF_TimeIntervalNE
1044 type(ESMF_TimeInterval), intent(in) :: timeinterval1
1045 type(ESMF_TimeInterval), intent(in) :: timeinterval2
1048 ! Return true if both given time intervals are not equal, false otherwise.
1049 ! Maps overloaded (/=) operator interface function to {\tt ESMF\_BaseTime}
1052 ! The arguments are:
1053 ! \begin{description}
1054 ! \item[timeinterval1]
1055 ! First time interval to compare
1056 ! \item[timeinterval2]
1057 ! Second time interval to compare
1061 ! TMG1.5.3, TMG2.4.3, TMG7.2
1063 CALL timeintchecknormalized( timeinterval1, 'ESMF_TimeIntervalNE arg1' )
1064 CALL timeintchecknormalized( timeinterval2, 'ESMF_TimeIntervalNE arg2' )
1066 ! call ESMC_BaseTime base class function
1067 call c_ESMC_BaseTimeIntNE(timeinterval1, timeinterval2, ESMF_TimeIntervalNE)
1069 end function ESMF_TimeIntervalNE
1071 !------------------------------------------------------------------------------
1073 ! !IROUTINE: ESMF_TimeIntervalLT - Time interval 1 less than time interval 2 ?
1076 function ESMF_TimeIntervalLT(timeinterval1, timeinterval2)
1079 logical :: ESMF_TimeIntervalLT
1082 type(ESMF_TimeInterval), intent(in) :: timeinterval1
1083 type(ESMF_TimeInterval), intent(in) :: timeinterval2
1086 ! Return true if first time interval is less than second time interval,
1087 ! false otherwise. Maps overloaded (<) operator interface function to
1088 ! {\tt ESMF\_BaseTime} base class.
1090 ! The arguments are:
1091 ! \begin{description}
1092 ! \item[timeinterval1]
1093 ! First time interval to compare
1094 ! \item[timeinterval2]
1095 ! Second time interval to compare
1099 ! TMG1.5.3, TMG2.4.3, TMG7.2
1101 CALL timeintchecknormalized( timeinterval1, 'ESMF_TimeIntervalLT arg1' )
1102 CALL timeintchecknormalized( timeinterval2, 'ESMF_TimeIntervalLT arg2' )
1104 ! call ESMC_BaseTime base class function
1105 call c_ESMC_BaseTimeIntLT(timeinterval1, timeinterval2, ESMF_TimeIntervalLT)
1107 end function ESMF_TimeIntervalLT
1109 !------------------------------------------------------------------------------
1111 ! !IROUTINE: ESMF_TimeIntervalGT - Time interval 1 greater than time interval 2?
1114 function ESMF_TimeIntervalGT(timeinterval1, timeinterval2)
1117 logical :: ESMF_TimeIntervalGT
1120 type(ESMF_TimeInterval), intent(in) :: timeinterval1
1121 type(ESMF_TimeInterval), intent(in) :: timeinterval2
1124 ! Return true if first time interval is greater than second time interval,
1125 ! false otherwise. Maps overloaded (>) operator interface function to
1126 ! {\tt ESMF\_BaseTime} base class.
1128 ! The arguments are:
1129 ! \begin{description}
1130 ! \item[timeinterval1]
1131 ! First time interval to compare
1132 ! \item[timeinterval2]
1133 ! Second time interval to compare
1137 ! TMG1.5.3, TMG2.4.3, TMG7.2
1139 CALL timeintchecknormalized( timeinterval1, 'ESMF_TimeIntervalGT arg1' )
1140 CALL timeintchecknormalized( timeinterval2, 'ESMF_TimeIntervalGT arg2' )
1142 ! call ESMC_BaseTime base class function
1143 call c_ESMC_BaseTimeIntGT(timeinterval1, timeinterval2, ESMF_TimeIntervalGT)
1145 end function ESMF_TimeIntervalGT
1147 !------------------------------------------------------------------------------
1149 ! !IROUTINE: ESMF_TimeIntervalLE - Time interval 1 less than or equal to time interval 2 ?
1152 function ESMF_TimeIntervalLE(timeinterval1, timeinterval2)
1155 logical :: ESMF_TimeIntervalLE
1158 type(ESMF_TimeInterval), intent(in) :: timeinterval1
1159 type(ESMF_TimeInterval), intent(in) :: timeinterval2
1162 ! Return true if first time interval is less than or equal to second time
1163 ! interval, false otherwise.
1164 ! Maps overloaded (<=) operator interface function to {\tt ESMF\_BaseTime}
1167 ! The arguments are:
1168 ! \begin{description}
1169 ! \item[timeinterval1]
1170 ! First time interval to compare
1171 ! \item[timeinterval2]
1172 ! Second time interval to compare
1176 ! TMG1.5.3, TMG2.4.3, TMG7.2
1178 CALL timeintchecknormalized( timeinterval1, 'ESMF_TimeIntervalLE arg1' )
1179 CALL timeintchecknormalized( timeinterval2, 'ESMF_TimeIntervalLE arg2' )
1181 ! call ESMC_BaseTime base class function
1182 call c_ESMC_BaseTimeIntLE(timeinterval1, timeinterval2, ESMF_TimeIntervalLE)
1184 end function ESMF_TimeIntervalLE
1186 !------------------------------------------------------------------------------
1188 ! !IROUTINE: ESMF_TimeIntervalGE - Time interval 1 greater than or equal to time interval 2 ?
1191 function ESMF_TimeIntervalGE(timeinterval1, timeinterval2)
1194 logical :: ESMF_TimeIntervalGE
1197 type(ESMF_TimeInterval), intent(in) :: timeinterval1
1198 type(ESMF_TimeInterval), intent(in) :: timeinterval2
1201 ! Return true if first time interval is greater than or equal to second
1202 ! time interval, false otherwise. Maps overloaded (>=) operator interface
1203 ! function to {\tt ESMF\_BaseTime} base class.
1205 ! The arguments are:
1206 ! \begin{description}
1207 ! \item[timeinterval1]
1208 ! First time interval to compare
1209 ! \item[timeinterval2]
1210 ! Second time interval to compare
1214 ! TMG1.5.3, TMG2.4.3, TMG7.2
1216 CALL timeintchecknormalized( timeinterval1, 'ESMF_TimeIntervalGE arg1' )
1217 CALL timeintchecknormalized( timeinterval2, 'ESMF_TimeIntervalGE arg2' )
1219 ! call ESMC_BaseTime base class function
1220 call c_ESMC_BaseTimeIntGE(timeinterval1, timeinterval2, ESMF_TimeIntervalGE)
1222 end function ESMF_TimeIntervalGE
1225 !------------------------------------------------------------------------------
1227 ! !IROUTINE: ESMF_TimeIntervalIsPositive - Time interval greater than zero?
1230 function ESMF_TimeIntervalIsPositive(timeinterval)
1233 logical :: ESMF_TimeIntervalIsPositive
1236 type(ESMF_TimeInterval), intent(in) :: timeinterval
1239 type(ESMF_TimeInterval) :: zerotimeint
1243 ! Return true if time interval is greater than zero,
1246 ! The arguments are:
1247 ! \begin{description}
1248 ! \item[timeinterval]
1249 ! Time interval to compare
1252 CALL timeintchecknormalized( timeinterval, &
1253 'ESMF_TimeIntervalIsPositive arg' )
1255 CALL ESMF_TimeIntervalSet ( zerotimeint, rc=rcint )
1256 IF ( rcint /= ESMF_SUCCESS ) THEN
1257 CALL wrf_error_fatal( &
1258 'ESMF_TimeIntervalIsPositive: ESMF_TimeIntervalSet failed' )
1260 ! hack for bug in PGI 5.1-x
1261 ! ESMF_TimeIntervalIsPositive = timeinterval > zerotimeint
1262 ESMF_TimeIntervalIsPositive = ESMF_TimeIntervalGT( timeinterval, &
1264 end function ESMF_TimeIntervalIsPositive
1266 end module ESMF_TimeIntervalMod