Skip to content
Snippets Groups Projects
Commit 63c80010 authored by WAUTELET Philippe's avatar WAUTELET Philippe
Browse files

Philippe 27/10/2022: datetime: add + operator via DATETIME_TIME_ADD subroutine

parent c71972c2
No related branches found
No related tags found
No related merge requests found
!MNH_LIC Copyright 2018-2021 CNRS, Meteo-France and Universite Paul Sabatier !MNH_LIC Copyright 2018-2022 CNRS, Meteo-France and Universite Paul Sabatier
!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
!MNH_LIC for details. version 1. !MNH_LIC for details. version 1.
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
! P. Wautelet 22/02/2019: use MOD intrinsics with same kind for all arguments (to respect Fortran standard) ! P. Wautelet 22/02/2019: use MOD intrinsics with same kind for all arguments (to respect Fortran standard)
! P. Wautelet 19/04/2019: use modd_precision kinds ! P. Wautelet 19/04/2019: use modd_precision kinds
! P. Wautelet 20/07/2021: modify DATETIME_TIME2REFERENCE and DATETIME_DISTANCE to allow correct computation with 32-bit floats ! P. Wautelet 20/07/2021: modify DATETIME_TIME2REFERENCE and DATETIME_DISTANCE to allow correct computation with 32-bit floats
! P. Wautelet 27/10/2022: add + operator via DATETIME_TIME_ADD subroutine
!----------------------------------------------------------------- !-----------------------------------------------------------------
MODULE MODE_DATETIME MODULE MODE_DATETIME
! !
...@@ -21,6 +22,7 @@ PRIVATE ...@@ -21,6 +22,7 @@ PRIVATE
PUBLIC :: DATETIME_DISTANCE, DATETIME_CORRECTDATE PUBLIC :: DATETIME_DISTANCE, DATETIME_CORRECTDATE
PUBLIC :: OPERATOR(<) PUBLIC :: OPERATOR(<)
PUBLIC :: OPERATOR(>=) PUBLIC :: OPERATOR(>=)
PUBLIC :: OPERATOR(+)
! !
!Reference date (do not change it) !Reference date (do not change it)
!To work with DATETIME_TIME2REFERENCE, we assume the year is a multiple of 400 + 1 and the date is January 1st (and time=0.) !To work with DATETIME_TIME2REFERENCE, we assume the year is a multiple of 400 + 1 and the date is January 1st (and time=0.)
...@@ -34,6 +36,10 @@ INTERFACE OPERATOR(>=) ...@@ -34,6 +36,10 @@ INTERFACE OPERATOR(>=)
MODULE PROCEDURE DATETIME_GE MODULE PROCEDURE DATETIME_GE
END INTERFACE END INTERFACE
! !
INTERFACE OPERATOR(+)
MODULE PROCEDURE DATETIME_TIME_ADD
END INTERFACE
!
CONTAINS CONTAINS
! !
SUBROUTINE DATETIME_TIME2REFERENCE( TPDATE, KDAYS, PSEC ) SUBROUTINE DATETIME_TIME2REFERENCE( TPDATE, KDAYS, PSEC )
...@@ -140,7 +146,7 @@ PDIST = REAL( ( IDAYSEND - IDAYSBEG ) * (24*60*60) ) + ZSECEND - ZSECBEG ...@@ -140,7 +146,7 @@ PDIST = REAL( ( IDAYSEND - IDAYSBEG ) * (24*60*60) ) + ZSECEND - ZSECBEG
! !
END SUBROUTINE DATETIME_DISTANCE END SUBROUTINE DATETIME_DISTANCE
! !
SUBROUTINE DATETIME_CORRECTDATE(TPDATE) PURE SUBROUTINE DATETIME_CORRECTDATE(TPDATE)
! !
! Correct the date if not in the correct interval ! Correct the date if not in the correct interval
! Change the date if time is <0 or >=86400 s ! Change the date if time is <0 or >=86400 s
...@@ -232,7 +238,7 @@ TPDATE%xtime = ZSEC ...@@ -232,7 +238,7 @@ TPDATE%xtime = ZSEC
END SUBROUTINE DATETIME_CORRECTDATE END SUBROUTINE DATETIME_CORRECTDATE
! !
! !
SUBROUTINE DATETIME_GETMONTHLGT(KYEAR,KMONTH,KLGT) PURE SUBROUTINE DATETIME_GETMONTHLGT(KYEAR,KMONTH,KLGT)
! !
INTEGER, INTENT(IN) :: KYEAR INTEGER, INTENT(IN) :: KYEAR
INTEGER, INTENT(IN) :: KMONTH INTEGER, INTENT(IN) :: KMONTH
...@@ -256,7 +262,7 @@ END SELECT ...@@ -256,7 +262,7 @@ END SELECT
END SUBROUTINE DATETIME_GETMONTHLGT END SUBROUTINE DATETIME_GETMONTHLGT
! !
! !
FUNCTION DATETIME_LT(TPT1, TPT2) RESULT (OLT) ELEMENTAL FUNCTION DATETIME_LT(TPT1, TPT2) RESULT (OLT)
IMPLICIT NONE IMPLICIT NONE
LOGICAL :: OLT LOGICAL :: OLT
TYPE(DATE_TIME), INTENT(IN) :: TPT1, TPT2 TYPE(DATE_TIME), INTENT(IN) :: TPT1, TPT2
...@@ -281,7 +287,7 @@ ENDIF ...@@ -281,7 +287,7 @@ ENDIF
END FUNCTION DATETIME_LT END FUNCTION DATETIME_LT
! !
! !
FUNCTION DATETIME_GE(TPT1, TPT2) RESULT (OLT) ELEMENTAL FUNCTION DATETIME_GE(TPT1, TPT2) RESULT (OLT)
IMPLICIT NONE IMPLICIT NONE
LOGICAL :: OLT LOGICAL :: OLT
TYPE(DATE_TIME), INTENT(IN) :: TPT1, TPT2 TYPE(DATE_TIME), INTENT(IN) :: TPT1, TPT2
...@@ -291,5 +297,21 @@ TYPE(DATE_TIME), INTENT(IN) :: TPT1, TPT2 ...@@ -291,5 +297,21 @@ TYPE(DATE_TIME), INTENT(IN) :: TPT1, TPT2
OLT = .NOT.DATETIME_LT(TPT1,TPT2) OLT = .NOT.DATETIME_LT(TPT1,TPT2)
! !
END FUNCTION DATETIME_GE END FUNCTION DATETIME_GE
!
ELEMENTAL FUNCTION DATETIME_TIME_ADD( TPIN, PTIME ) RESULT ( TPOUT )
IMPLICIT NONE
TYPE(DATE_TIME), INTENT(IN) :: TPIN ! Start date
REAL, INTENT(IN) :: PTIME ! Added time
TYPE(DATE_TIME) :: TPOUT ! End date = start date + added time
TPOUT = TPIN
TPOUT%XTIME = TPOUT%XTIME + PTIME
CALL DATETIME_CORRECTDATE( TPOUT )
END FUNCTION DATETIME_TIME_ADD
END MODULE MODE_DATETIME END MODULE MODE_DATETIME
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment