diff --git a/src/MNH/mode_datetime.f90 b/src/MNH/mode_datetime.f90 index fc9f68267d6cca9e7d770dc7b3cfd86ba067ad52..2d999f56421a1be9b156962e9a02cd6f5e60ddcb 100644 --- a/src/MNH/mode_datetime.f90 +++ b/src/MNH/mode_datetime.f90 @@ -1,4 +1,4 @@ -!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 version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. @@ -7,6 +7,7 @@ ! 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 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 ! @@ -21,6 +22,7 @@ PRIVATE PUBLIC :: DATETIME_DISTANCE, DATETIME_CORRECTDATE PUBLIC :: OPERATOR(<) PUBLIC :: OPERATOR(>=) +PUBLIC :: OPERATOR(+) ! !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.) @@ -34,6 +36,10 @@ INTERFACE OPERATOR(>=) MODULE PROCEDURE DATETIME_GE END INTERFACE ! +INTERFACE OPERATOR(+) + MODULE PROCEDURE DATETIME_TIME_ADD +END INTERFACE +! CONTAINS ! SUBROUTINE DATETIME_TIME2REFERENCE( TPDATE, KDAYS, PSEC ) @@ -140,7 +146,7 @@ PDIST = REAL( ( IDAYSEND - IDAYSBEG ) * (24*60*60) ) + ZSECEND - ZSECBEG ! END SUBROUTINE DATETIME_DISTANCE ! -SUBROUTINE DATETIME_CORRECTDATE(TPDATE) +PURE SUBROUTINE DATETIME_CORRECTDATE(TPDATE) ! ! Correct the date if not in the correct interval ! Change the date if time is <0 or >=86400 s @@ -232,7 +238,7 @@ TPDATE%xtime = ZSEC END SUBROUTINE DATETIME_CORRECTDATE ! ! -SUBROUTINE DATETIME_GETMONTHLGT(KYEAR,KMONTH,KLGT) +PURE SUBROUTINE DATETIME_GETMONTHLGT(KYEAR,KMONTH,KLGT) ! INTEGER, INTENT(IN) :: KYEAR INTEGER, INTENT(IN) :: KMONTH @@ -256,7 +262,7 @@ END SELECT END SUBROUTINE DATETIME_GETMONTHLGT ! ! -FUNCTION DATETIME_LT(TPT1, TPT2) RESULT (OLT) +ELEMENTAL FUNCTION DATETIME_LT(TPT1, TPT2) RESULT (OLT) IMPLICIT NONE LOGICAL :: OLT TYPE(DATE_TIME), INTENT(IN) :: TPT1, TPT2 @@ -281,7 +287,7 @@ ENDIF END FUNCTION DATETIME_LT ! ! -FUNCTION DATETIME_GE(TPT1, TPT2) RESULT (OLT) +ELEMENTAL FUNCTION DATETIME_GE(TPT1, TPT2) RESULT (OLT) IMPLICIT NONE LOGICAL :: OLT TYPE(DATE_TIME), INTENT(IN) :: TPT1, TPT2 @@ -291,5 +297,21 @@ TYPE(DATE_TIME), INTENT(IN) :: TPT1, TPT2 OLT = .NOT.DATETIME_LT(TPT1,TPT2) ! 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