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