From e95fbe93cdfb3c4ee22392245ca191c3209b427d Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Wed, 28 Mar 2018 16:00:10 +0200
Subject: [PATCH] Philippe 28/03/2018: overload < and >= operators for
 date_time comparisons + remove temporal_lt function

---
 src/MNH/adv_forcingn.f90  | 14 +++++------
 src/MNH/forcing.f90       | 14 +++++------
 src/MNH/mode_datetime.f90 | 49 ++++++++++++++++++++++++++++++++++++++-
 src/MNH/rel_forcingn.f90  | 14 +++++------
 src/MNH/set_advfrc.f90    |  5 ++--
 src/MNH/set_frc.f90       |  6 ++---
 src/MNH/set_relfrc.f90    |  5 ++--
 src/MNH/temporal_lt.f90   | 45 -----------------------------------
 8 files changed, 78 insertions(+), 74 deletions(-)
 delete mode 100644 src/MNH/temporal_lt.f90

diff --git a/src/MNH/adv_forcingn.f90 b/src/MNH/adv_forcingn.f90
index bccca3ad6..eeb0f247b 100644
--- a/src/MNH/adv_forcingn.f90
+++ b/src/MNH/adv_forcingn.f90
@@ -92,6 +92,7 @@ END MODULE MODI_ADV_FORCING_n
 !!    -------------
 !!      Original    08/11/10
 !!     28/03/2018 P. Wautelet: replace TEMPORAL_DIST by DATETIME_DISTANCE
+!!                             use overloaded comparison operator for date_time
 !!
 !-------------------------------------------------------------------------------
 !
@@ -108,7 +109,6 @@ USE MODD_PARAMETERS
 USE MODD_TIME
 USE MODD_BUDGET
 !
-USE MODI_TEMPORAL_LT
 USE MODI_BUDGET
 !
 USE MODD_ADVFRC_n     ! Modules for time evolving advfrc
@@ -168,14 +168,14 @@ IF (GSFIRSTCALL) THEN
 
 !*        1.2  find first sounding to be used 
   JSX_ADV = 0
-  IF( TEMPORAL_LT ( TPDTCUR, TDTADVFRC(1) ) ) THEN
+  IF( TPDTCUR < TDTADVFRC(1) ) THEN
     WRITE(UNIT=ILUOUT0,FMT='(" THE INITIAL ADV FORCING FIELDS ARE NULL ")') 
-  ELSE IF( .NOT. TEMPORAL_LT ( TPDTCUR, TDTADVFRC(NADVFRC) ) ) THEN
+  ELSE IF( TPDTCUR >= TDTADVFRC(NADVFRC) ) THEN
       WRITE(UNIT=ILUOUT0,FMT='(" THE ADV FORCING FIELDS WILL REMAIN STATIONARY ")')
   ELSE
     TIM1_FOR:  DO JN = NADVFRC-1, 1, -1
                   JSX_ADV = JN
-                  IF( .NOT. TEMPORAL_LT ( TPDTCUR, TDTADVFRC(JSX_ADV) ) ) EXIT TIM1_FOR
+                  IF( TPDTCUR >= TDTADVFRC(JSX_ADV) ) EXIT TIM1_FOR
                END DO TIM1_FOR
 !
     WRITE(UNIT=ILUOUT0,FMT='(" THE INITIAL FORCING FIELDS ARE INTERPOLATED" , &
@@ -189,16 +189,16 @@ END IF
 !
 !    2.1 Temporal interpolation of each term
 !   ------------------------------------------
-IF( TEMPORAL_LT ( TPDTCUR, TDTADVFRC(1) ) ) THEN
+IF( TPDTCUR < TDTADVFRC(1) ) THEN
   ZXADVTHFRC(:,:,:)   = 0.
   ZXADVRVFRC(:,:,:)   = 0.
-ELSE IF ( .NOT. TEMPORAL_LT ( TPDTCUR, TDTADVFRC(NADVFRC) ) ) THEN
+ELSE IF ( TPDTCUR >= TDTADVFRC(NADVFRC) ) THEN
    ZXADVTHFRC(:,:,:)   = XDTHFRC(:,:,:,NADVFRC)
    ZXADVRVFRC(:,:,:)   = XDRVFRC(:,:,:,NADVFRC)
 ELSE
   JXP = JSX_ADV + 1
 
-  IF( .NOT. TEMPORAL_LT ( TPDTCUR, TDTADVFRC(JXP) ) ) THEN
+  IF( TPDTCUR >= TDTADVFRC(JXP) ) THEN
     JSX_ADV = JSX_ADV +1
     JXP= JSX_ADV +1
     WRITE(UNIT=ILUOUT0,FMT='(" THE ADV FORCING FIELDS ARE INTERPOLATED NOW" ,&
diff --git a/src/MNH/forcing.f90 b/src/MNH/forcing.f90
index 24df53fe4..927b01faf 100644
--- a/src/MNH/forcing.f90
+++ b/src/MNH/forcing.f90
@@ -149,6 +149,7 @@ END MODULE MODI_FORCING
 !!      01/2014  J. escobar           correction for // initialisation geostrophic ZUF,ZVF,ZWF 
 !!      09/2017 Q.Rodier add LTEND_UV_FRC
 !!      28/03/2018 P. Wautelet        Replace TEMPORAL_DIST by DATETIME_DISTANCE
+!!                                    use overloaded comparison operator for date_time
 !-------------------------------------------------------------------------------
 !
 !*       0.    DECLARATIONS
@@ -170,7 +171,6 @@ USE MODD_CST
 !
 USE MODI_SHUMAN
 USE MODI_UPSTREAM_Z
-USE MODI_TEMPORAL_LT
 USE MODI_BUDGET
 !
 USE MODI_GET_HALO
@@ -275,15 +275,15 @@ IF (GSFIRSTCALL) THEN
 !*        1.2  find first sounding to be used 
 !
   JSX = 0
-  IF( TEMPORAL_LT ( TPDTCUR, TDTFRC(1) ) ) THEN
+  IF( TPDTCUR < TDTFRC(1) ) THEN
     WRITE(UNIT=ILUOUT0,FMT='(" THE INITIAL FORCING FIELDS ARE NULL ")') 
-    ELSE IF( .NOT. TEMPORAL_LT ( TPDTCUR, TDTFRC(NFRC) ) ) THEN
+    ELSE IF( TPDTCUR >= TDTFRC(NFRC) ) THEN
       WRITE(UNIT=ILUOUT0,FMT='(" THE FORCING FIELDS WILL REMAIN STATIONARY ")')
       ELSE
 !
     TIM_FOR:    DO JI = NFRC-1, 1, -1
                   JSX = JI
-                  IF( .NOT. TEMPORAL_LT ( TPDTCUR, TDTFRC(JSX) ) ) EXIT TIM_FOR
+                  IF( TPDTCUR >= TDTFRC(JSX) ) EXIT TIM_FOR
                 END DO TIM_FOR
 !
     WRITE(UNIT=ILUOUT0,FMT='(" THE INITIAL FORCING FIELDS ARE INTERPOLATED" , &
@@ -387,7 +387,7 @@ END IF
 !*       2.     INTERPOLATE IN TIME
 !    	        -------------------
 !
-IF( TEMPORAL_LT ( TPDTCUR, TDTFRC(1) ) ) THEN
+IF( TPDTCUR < TDTFRC(1) ) THEN
   ZXUFRC(:)    = XUFRC(:,1)
   ZXVFRC(:)    = XVFRC(:,1)
   ZXWFRC(:)    = XWFRC(:,1)
@@ -400,7 +400,7 @@ IF( TEMPORAL_LT ( TPDTCUR, TDTFRC(1) ) ) THEN
   ZXTENDUFRC(:) = XTENDUFRC(:,1)
   ZXTENDVFRC(:) = XTENDVFRC(:,1)
   ZXPGROUNDFRC  = XPGROUNDFRC(1)
-ELSE IF ( .NOT. TEMPORAL_LT ( TPDTCUR, TDTFRC(NFRC) ) ) THEN
+ELSE IF ( TPDTCUR >= TDTFRC(NFRC) ) THEN
   ZXUFRC(:)    = XUFRC(:,NFRC)
   ZXVFRC(:)    = XVFRC(:,NFRC)
   ZXWFRC(:)    = XWFRC(:,NFRC)
@@ -415,7 +415,7 @@ ELSE IF ( .NOT. TEMPORAL_LT ( TPDTCUR, TDTFRC(NFRC) ) ) THEN
   ZXPGROUNDFRC  = XPGROUNDFRC(NFRC)
 ELSE
   JXP = JSX + 1
-  IF( .NOT. TEMPORAL_LT ( TPDTCUR, TDTFRC(JXP) ) ) THEN
+  IF( TPDTCUR >= TDTFRC(JXP) ) THEN
     JSX = JSX +1
     JXP= JSX +1
     WRITE(UNIT=ILUOUT0,FMT='(" THE FORCING FIELDS ARE INTERPOLATED NOW" ,&
diff --git a/src/MNH/mode_datetime.f90 b/src/MNH/mode_datetime.f90
index f4db85092..1e0f9ed7f 100644
--- a/src/MNH/mode_datetime.f90
+++ b/src/MNH/mode_datetime.f90
@@ -12,11 +12,21 @@ IMPLICIT NONE
 !
 PRIVATE
 !
+PUBLIC :: DATETIME_DISTANCE, DATETIME_CORRECTDATE
+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.)
 TYPE(DATE_TIME),PARAMETER :: TPREFERENCE_DATE = DATE_TIME( TDATE=DATE(1601,1,1), TIME=0. )
 !
-PUBLIC DATETIME_DISTANCE, DATETIME_CORRECTDATE
+INTERFACE OPERATOR(<)
+  MODULE PROCEDURE DATETIME_LT
+END INTERFACE
+!
+INTERFACE OPERATOR(>=)
+  MODULE PROCEDURE DATETIME_GE
+END INTERFACE
 !
 CONTAINS
 !
@@ -225,4 +235,41 @@ END SELECT
 !
 END SUBROUTINE DATETIME_GETMONTHLGT
 !
+!
+FUNCTION DATETIME_LT(TPT1, TPT2) RESULT (OLT)
+IMPLICIT NONE
+LOGICAL :: OLT
+TYPE(DATE_TIME), INTENT(IN) :: TPT1, TPT2
+!
+! TRUE if TPT1 .LT. TPT2
+!
+!
+IF ( TPT1%TDATE%YEAR .EQ. TPT2%TDATE%YEAR ) THEN
+  IF ( TPT1%TDATE%MONTH .EQ. TPT2%TDATE%MONTH ) THEN
+    IF ( TPT1%TDATE%DAY .EQ. TPT2%TDATE%DAY ) THEN
+      OLT = TPT1%TIME .LT. TPT2%TIME
+    ELSE
+      OLT = TPT1%TDATE%DAY .LT. TPT2%TDATE%DAY
+    END IF
+  ELSE
+   OLT = TPT1%TDATE%MONTH .LT. TPT2%TDATE%MONTH
+  END IF
+ELSE
+  OLT = TPT1%TDATE%YEAR .LT. TPT2%TDATE%YEAR
+ENDIF
+!
+END FUNCTION DATETIME_LT
+!
+!
+FUNCTION DATETIME_GE(TPT1, TPT2) RESULT (OLT)
+IMPLICIT NONE
+LOGICAL :: OLT
+TYPE(DATE_TIME), INTENT(IN) :: TPT1, TPT2
+!
+! TRUE if TPT1 .GE. TPT2
+!
+OLT = .NOT.DATETIME_LT(TPT1,TPT2)
+!
+END FUNCTION DATETIME_GE
+!
 END MODULE MODE_DATETIME
diff --git a/src/MNH/rel_forcingn.f90 b/src/MNH/rel_forcingn.f90
index 7685fc3c6..b676884ff 100644
--- a/src/MNH/rel_forcingn.f90
+++ b/src/MNH/rel_forcingn.f90
@@ -91,6 +91,7 @@ END MODULE MODI_REL_FORCING_n
 !!    -------------
 !!      Original    08/11/10
 !!     28/03/2018 P. Wautelet: replace TEMPORAL_DIST by DATETIME_DISTANCE
+!!                             use overloaded comparison operator for date_time
 !!
 !-------------------------------------------------------------------------------
 !
@@ -110,7 +111,6 @@ USE MODE_IO_ll
 !
 USE MODI_BUDGET
 USE MODI_SHUMAN
-USE MODI_TEMPORAL_LT
 !
 IMPLICIT NONE
 !
@@ -169,14 +169,14 @@ IF (GSFIRSTCALL) THEN
 
 !*        1.2  find first sounding to be used 
   JSX_REL = 0
-  IF( TEMPORAL_LT ( TPDTCUR, TDTRELFRC(1) ) ) THEN
+  IF( TPDTCUR < TDTRELFRC(1) ) THEN
     WRITE(UNIT=ILUOUT0,FMT='(" THE INITIAL REL FORCING FIELDS ARE NULL ")') 
-  ELSE IF( .NOT. TEMPORAL_LT ( TPDTCUR, TDTRELFRC(nRELFRC) ) ) THEN
+  ELSE IF( TPDTCUR >= TDTRELFRC(nRELFRC) ) THEN
       WRITE(UNIT=ILUOUT0,FMT='(" THE REL FORCING FIELDS WILL REMAIN STATIONARY ")')
   ELSE
     TIM1_FOR:  DO JN = NRELFRC-1, 1, -1
                   JSX_REL = JN
-                  IF( .NOT. TEMPORAL_LT ( TPDTCUR, TDTRELFRC(JSX_REL) ) ) EXIT TIM1_FOR
+                  IF( TPDTCUR >= TDTRELFRC(JSX_REL) ) EXIT TIM1_FOR
                END DO TIM1_FOR
 !
     WRITE(UNIT=ILUOUT0,FMT='(" THE INITIAL FORCING FIELDS ARE INTERPOLATED" , &
@@ -190,16 +190,16 @@ END IF
 !
 !    2.1 Temporal interpolation of each term
 !   ------------------------------------------
-IF( TEMPORAL_LT ( TPDTCUR, TDTRELFRC(1) ) ) THEN
+IF( TPDTCUR < TDTRELFRC(1) ) THEN
   ZTHREL(:,:,:)   = 0.
   ZRVREL(:,:,:)   = 0.
-ELSE IF ( .NOT. TEMPORAL_LT ( TPDTCUR, TDTRELFRC(NRELFRC) ) ) THEN
+ELSE IF ( TPDTCUR >= TDTRELFRC(NRELFRC) ) THEN
    ZTHREL(:,:,:)   = XTHREL(:,:,:,NRELFRC)
    ZRVREL(:,:,:)   = XRVREL(:,:,:,NRELFRC)
 ELSE
   JXP = JSX_REL + 1
 
-  IF( .NOT. TEMPORAL_LT ( TPDTCUR, TDTRELFRC(JXP) ) ) THEN
+  IF( TPDTCUR >= TDTRELFRC(JXP) ) THEN
     JSX_REL = JSX_REL +1
     JXP= JSX_REL +1
     ILUOUT0 = TLUOUT0%NLU
diff --git a/src/MNH/set_advfrc.f90 b/src/MNH/set_advfrc.f90
index 3330d4648..899127565 100644
--- a/src/MNH/set_advfrc.f90
+++ b/src/MNH/set_advfrc.f90
@@ -74,6 +74,7 @@ END MODULE MODI_SETADVFRC
 !!    -------------
 !!      03/02/10 (Tomasini) USE MODDB_ADVFRC_n for grid-nesting
 !!      J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1
+!!      P.Wautelet  28/03/2018 : use overloaded comparison operator for date_time
 !!
 !-------------------------------------------------------------------------------
 !
@@ -92,6 +93,7 @@ USE MODD_LUNIT_n,    ONLY: TLUOUT
 USE MODD_PARAMETERS, ONLY: JPHEXT, JPVEXT
 USE MODD_REF
 ! 
+USE MODE_DATETIME
 USE MODE_IO_ll
 USE MODE_MSG
 USE MODE_THERMO
@@ -100,7 +102,6 @@ USE MODI_HEIGHT_PRESS
 USE MODI_PRESS_HEIGHT
 USE MODI_READ_ASC_LATPRESS
 USE MODI_READ_ASCP
-USE MODI_TEMPORAL_LT
 USE MODI_THETAVPU_THETAVPM 
 !
 IMPLICIT NONE
@@ -327,7 +328,7 @@ DO JL = 1 , NADVFRC
 END DO
 !
 DO JKT = 2,NADVFRC-1
-  IF (.NOT.TEMPORAL_LT(TDTADVFRC(JKT-1), TDTADVFRC(JKT))) THEN
+  IF ( TDTADVFRC(JKT-1) >= TDTADVFRC(JKT) ) THEN
     WRITE(ILUOUT,*) &
       "SET_FRC ERROR: sounding", JKT-1, " is given for a later time than", JKT
     WRITE(ILUOUT,*) &
diff --git a/src/MNH/set_frc.f90 b/src/MNH/set_frc.f90
index ce0ddf00d..13e80af36 100644
--- a/src/MNH/set_frc.f90
+++ b/src/MNH/set_frc.f90
@@ -52,7 +52,6 @@ END MODULE MODI_SET_FRC
 !!                                 potential virtual temperature
 !!      Module  MODI_THETAVPU_THETAVPM: to interpolate thetav on wind levels
 !!                                      from thetav on mass levels
-!!      Module  MODI_TEMPORAL_LT: to compare 2 TYPEd date_and_time data
 !!
 !!    IMPLICIT ARGUMENTS
 !!    ------------------
@@ -99,6 +98,7 @@ END MODULE MODI_SET_FRC
 !!                             data. Reproduces the same data instead.
 !!                   09/2017 Q.Rodier add LTEND_UV_FRC
 !!      27/11/17    (Chaboureau) fix bug in allocation relative to LTEND_UV_FRC 
+!!      28/03/2018  (P.Wautelet) use overloaded comparison operator for date_time
 !!
 !-------------------------------------------------------------------------------
 !
@@ -115,6 +115,7 @@ USE MODD_IO_ll, ONLY : TFILEDATA
 USE MODD_REF
 USE MODD_PARAMETERS
 !
+USE MODE_DATETIME
 USE MODE_THERMO
 USE MODE_FM
 USE MODE_IO_ll
@@ -123,7 +124,6 @@ USE MODE_MSG
 USE MODI_HEIGHT_PRESS  ! interface modules
 USE MODI_PRESS_HEIGHT
 USE MODI_THETAVPU_THETAVPM
-USE MODI_TEMPORAL_LT
 !
 IMPLICIT NONE
 !
@@ -453,7 +453,7 @@ END DO ! End of loop in time
 !
 
 DO JKT = 2,NFRC-1
-  IF (.NOT.TEMPORAL_LT(TDTFRC(JKT-1), TDTFRC(JKT))) THEN
+  IF ( TDTFRC(JKT-1) >= TDTFRC(JKT) ) THEN
     WRITE(ILUOUT,*) &
       "SET_FRC ERROR: sounding", JKT-1, " is given for a later time than", JKT
     WRITE(ILUOUT,*) &
diff --git a/src/MNH/set_relfrc.f90 b/src/MNH/set_relfrc.f90
index 436f71e4f..b794a789f 100644
--- a/src/MNH/set_relfrc.f90
+++ b/src/MNH/set_relfrc.f90
@@ -74,6 +74,7 @@ END MODULE MODI_SET_RELFRC
 !!    -------------
 !!      03/02/10 (Tomasini) USE MODD_RELFRC_n for grid-nesting
 !!      J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1
+!!      P.Wautelet  28/03/2018 : use overloaded comparison operator for date_time
 !!
 !-------------------------------------------------------------------------------
 !
@@ -91,6 +92,7 @@ USE MODD_PARAMETERS, ONLY: JPHEXT
 USE MODD_REF
 USE MODD_RELFRC_n
 ! 
+USE MODE_DATETIME
 USE MODE_FM
 USE MODE_IO_ll
 USE MODE_MSG
@@ -101,7 +103,6 @@ USE MODI_HEIGHT_PRESS
 USE MODI_PRESS_HEIGHT
 USE MODI_READ_ASC_LATPRESS
 USE MODI_READ_ASCP
-USE MODI_TEMPORAL_LT
 USE MODI_THETAVPU_THETAVPM 
 !
 IMPLICIT NONE
@@ -351,7 +352,7 @@ DO JL = 1 , NRELFRC
 END DO
 !
 DO JKT = 2,NRELFRC-1
-  IF (.NOT.TEMPORAL_LT(TDTRELFRC(JKT-1), TDTRELFRC(JKT))) THEN
+  IF ( TDTRELFRC(JKT-1) >= TDTRELFRC(JKT) ) THEN
     WRITE(ILUOUT,*) &
       "SET_FRC ERROR: sounding", JKT-1, " is given for a later time than", JKT
     WRITE(ILUOUT,*) &
diff --git a/src/MNH/temporal_lt.f90 b/src/MNH/temporal_lt.f90
deleted file mode 100644
index c6374dedf..000000000
--- a/src/MNH/temporal_lt.f90
+++ /dev/null
@@ -1,45 +0,0 @@
-!MNH_LIC Copyright 1994-2014 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.
-!-----------------------------------------------------------------
-!--------------- special set of characters for RCS information
-!-----------------------------------------------------------------
-! $Source$ $Revision$
-! MASDEV4_7 operators 2006/05/18 13:07:25
-!-----------------------------------------------------------------
-MODULE MODI_TEMPORAL_LT
-INTERFACE
-FUNCTION TEMPORAL_LT(TPT1, TPT2) RESULT (OLT)
-USE MODD_TIME, ONLY: DATE_TIME
-IMPLICIT NONE
-LOGICAL :: OLT
-TYPE(DATE_TIME), INTENT(IN) :: TPT1, TPT2
-END FUNCTION TEMPORAL_LT
-END INTERFACE
-END MODULE MODI_TEMPORAL_LT
-!
-FUNCTION TEMPORAL_LT(TPT1, TPT2) RESULT (OLT)
-USE MODD_TIME, ONLY: DATE_TIME
-IMPLICIT NONE
-LOGICAL :: OLT
-TYPE(DATE_TIME), INTENT(IN) :: TPT1, TPT2
-!
-! TRUE if TPT1 .LT. TPT2
-!
-!
-IF ( TPT1%TDATE%YEAR .EQ. TPT2%TDATE%YEAR ) THEN
-  IF ( TPT1%TDATE%MONTH .EQ. TPT2%TDATE%MONTH ) THEN
-    IF ( TPT1%TDATE%DAY .EQ. TPT2%TDATE%DAY ) THEN
-      OLT = TPT1%TIME .LT. TPT2%TIME
-    ELSE
-      OLT = TPT1%TDATE%DAY .LT. TPT2%TDATE%DAY
-    END IF
-  ELSE
-   OLT = TPT1%TDATE%MONTH .LT. TPT2%TDATE%MONTH
-  END IF
-ELSE
-  OLT = TPT1%TDATE%YEAR .LT. TPT2%TDATE%YEAR
-ENDIF
-!
-END FUNCTION TEMPORAL_LT
-- 
GitLab