From 1dc08bf3a1f7514e4ba636851b86cb83f06cf86d Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Fri, 13 Sep 2019 10:57:20 +0200 Subject: [PATCH] Philippe 13/09/2019: budget: simplify and modernize date/time management --- src/MNH/aircraft_balloon.f90 | 133 +++------ src/MNH/aircraft_balloon_evol.f90 | 74 ++--- src/MNH/diag.f90 | 12 +- src/MNH/ini_aircraft_balloon.f90 | 22 +- src/MNH/ini_lesn.f90 | 13 +- src/MNH/ini_modeln.f90 | 13 +- src/MNH/ini_posprofilern.f90 | 14 +- src/MNH/ini_seriesn.f90 | 47 ++-- src/MNH/ini_surfstationn.f90 | 15 +- src/MNH/les_ini_timestepn.f90 | 32 +-- src/MNH/les_masksn.f90 | 40 +-- src/MNH/modd_aircraft_balloon.f90 | 10 +- src/MNH/modd_les.f90 | 11 +- src/MNH/modd_lesn.f90 | 19 +- src/MNH/modd_seriesn.f90 | 24 +- src/MNH/modd_type_profiler.f90 | 25 +- src/MNH/modd_type_station.f90 | 17 +- src/MNH/mode_les_diachro.f90 | 382 ++++++++++++------------- src/MNH/modeln.f90 | 4 +- src/MNH/profilern.f90 | 74 ++--- src/MNH/seriesn.f90 | 37 +-- src/MNH/stationn.f90 | 76 ++--- src/MNH/write_aircraft_balloon.f90 | 67 +++-- src/MNH/write_budget.f90 | 434 ++++++++++++++--------------- src/MNH/write_diachro.f90 | 129 +++++---- src/MNH/write_lesn.f90 | 16 +- src/MNH/write_profilern.f90 | 46 ++- src/MNH/write_seriesn.f90 | 33 +-- src/MNH/write_stationn.f90 | 61 ++-- 29 files changed, 813 insertions(+), 1067 deletions(-) diff --git a/src/MNH/aircraft_balloon.f90 b/src/MNH/aircraft_balloon.f90 index fa1872b0a..5e48b0481 100644 --- a/src/MNH/aircraft_balloon.f90 +++ b/src/MNH/aircraft_balloon.f90 @@ -10,18 +10,12 @@ MODULE MODI_AIRCRAFT_BALLOON INTERFACE ! SUBROUTINE AIRCRAFT_BALLOON(PTSTEP, & - TPDTEXP, TPDTMOD, TPDTSEG, TPDTCUR, & PXHAT, PYHAT, PZ, & PMAP, PLONOR, PLATOR, & PU, PV, PW, PP, PTH, PR, PSV, PTKE, & PTS, PRHODREF, PCIT, PSEA) ! -USE MODD_TYPE_DATE REAL, INTENT(IN) :: PTSTEP ! time step -TYPE(DATE_TIME), INTENT(IN) :: TPDTEXP! experiment date and time -TYPE(DATE_TIME), INTENT(IN) :: TPDTMOD! model start date and time -TYPE(DATE_TIME), INTENT(IN) :: TPDTSEG! segment date and time -TYPE(DATE_TIME), INTENT(IN) :: TPDTCUR! current date and time REAL, DIMENSION(:), INTENT(IN) :: PXHAT ! x coordinate REAL, DIMENSION(:), INTENT(IN) :: PYHAT ! y coordinate REAL, DIMENSION(:,:,:), INTENT(IN) :: PZ ! z @@ -53,7 +47,6 @@ END MODULE MODI_AIRCRAFT_BALLOON ! ! ################################################################### SUBROUTINE AIRCRAFT_BALLOON(PTSTEP, & - TPDTEXP, TPDTMOD, TPDTSEG, TPDTCUR, & PXHAT, PYHAT, PZ, & PMAP, PLONOR, PLATOR, & PU, PV, PW, PP, PTH, PR, PSV, PTKE, & @@ -90,8 +83,9 @@ END MODULE MODI_AIRCRAFT_BALLOON !! Original 15/05/2000 !! !! March, 2008 (P.Lacarrere) Add 3D fluxes -!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O -!! -------------------------------------------------------------------------- +! P. Wautelet 05/2016-04/2018: new data structures and calls for I/O +! P. Wautelet 13/09/2019: budget: simplify and modernize date/time management +! -------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ @@ -111,10 +105,6 @@ IMPLICIT NONE ! ! REAL, INTENT(IN) :: PTSTEP ! time step -TYPE(DATE_TIME), INTENT(IN) :: TPDTEXP! experiment date and time -TYPE(DATE_TIME), INTENT(IN) :: TPDTMOD! model start date and time -TYPE(DATE_TIME), INTENT(IN) :: TPDTSEG! segment date and time -TYPE(DATE_TIME), INTENT(IN) :: TPDTCUR! current date and time REAL, DIMENSION(:), INTENT(IN) :: PXHAT ! x coordinate REAL, DIMENSION(:), INTENT(IN) :: PYHAT ! y coordinate REAL, DIMENSION(:,:,:), INTENT(IN) :: PZ ! z array @@ -148,237 +138,198 @@ IF(.NOT. ALLOCATED(XSVW_FLUX)) & ALLOCATE(XSVW_FLUX(SIZE(PSV,1),SIZE(PSV,2),SIZE(PSV,3),SIZE(PSV,4))) ! IF (TBALLOON1%NMODEL /= 0) THEN -CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, TPDTEXP, TPDTMOD, TPDTSEG, TPDTCUR, & - PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & +CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT, & TBALLOON1, PSEA ) ENDIF IF (TBALLOON2%NMODEL /= 0) THEN -CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, TPDTEXP, TPDTMOD, TPDTSEG, TPDTCUR, & - PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & +CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT, & TBALLOON2, PSEA ) ENDIF IF (TBALLOON3%NMODEL /= 0) THEN -CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, TPDTEXP, TPDTMOD, TPDTSEG, TPDTCUR, & - PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & +CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT, & TBALLOON3, PSEA ) ENDIF IF (TBALLOON4%NMODEL /= 0) THEN -CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, TPDTEXP, TPDTMOD, TPDTSEG, TPDTCUR, & - PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & +CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT, & TBALLOON4, PSEA ) ENDIF IF (TBALLOON5%NMODEL /= 0) THEN -CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, TPDTEXP, TPDTMOD, TPDTSEG, TPDTCUR, & - PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & +CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT, & TBALLOON5, PSEA ) ENDIF IF (TBALLOON6%NMODEL /= 0) THEN -CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, TPDTEXP, TPDTMOD, TPDTSEG, TPDTCUR, & - PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & +CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT, & TBALLOON6, PSEA ) ENDIF IF (TBALLOON7%NMODEL /= 0) THEN -CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, TPDTEXP, TPDTMOD, TPDTSEG, TPDTCUR, & - PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & +CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT, & TBALLOON7, PSEA ) ENDIF IF (TBALLOON8%NMODEL /= 0) THEN -CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, TPDTEXP, TPDTMOD, TPDTSEG, TPDTCUR, & - PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & +CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT, & TBALLOON8, PSEA ) ENDIF IF (TBALLOON9%NMODEL /= 0) THEN -CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, TPDTEXP, TPDTMOD, TPDTSEG, TPDTCUR, & - PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & +CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT, & TBALLOON9, PSEA ) ENDIF ! IF (TAIRCRAFT1%NMODEL /= 0) THEN -CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, TPDTEXP, TPDTMOD, TPDTSEG, TPDTCUR, & - PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & +CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT, & TAIRCRAFT1, PSEA ) ENDIF IF (TAIRCRAFT2%NMODEL /= 0) THEN -CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, TPDTEXP, TPDTMOD, TPDTSEG, TPDTCUR, & - PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & +CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT, & TAIRCRAFT2, PSEA ) ENDIF IF (TAIRCRAFT3%NMODEL /= 0) THEN -CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, TPDTEXP, TPDTMOD, TPDTSEG, TPDTCUR, & - PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & +CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT, & TAIRCRAFT3, PSEA ) ENDIF IF (TAIRCRAFT4%NMODEL /= 0) THEN -CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, TPDTEXP, TPDTMOD, TPDTSEG, TPDTCUR, & - PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & +CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT, & TAIRCRAFT4, PSEA ) ENDIF IF (TAIRCRAFT5%NMODEL /= 0) THEN -CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, TPDTEXP, TPDTMOD, TPDTSEG, TPDTCUR, & - PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & +CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT, & TAIRCRAFT5, PSEA ) ENDIF IF (TAIRCRAFT6%NMODEL /= 0) THEN -CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, TPDTEXP, TPDTMOD, TPDTSEG, TPDTCUR, & - PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & +CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT, & TAIRCRAFT6, PSEA ) ENDIF IF (TAIRCRAFT7%NMODEL /= 0) THEN -CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, TPDTEXP, TPDTMOD, TPDTSEG, TPDTCUR, & - PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & +CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT, & TAIRCRAFT7, PSEA ) ENDIF IF (TAIRCRAFT8%NMODEL /= 0) THEN -CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, TPDTEXP, TPDTMOD, TPDTSEG, TPDTCUR, & - PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & +CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT, & TAIRCRAFT8, PSEA ) ENDIF IF (TAIRCRAFT9%NMODEL /= 0) THEN -CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, TPDTEXP, TPDTMOD, TPDTSEG, TPDTCUR, & - PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & +CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT, & TAIRCRAFT9, PSEA ) ENDIF IF (TAIRCRAFT10%NMODEL /= 0) THEN -CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, TPDTEXP, TPDTMOD, TPDTSEG, TPDTCUR, & - PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & +CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT, & TAIRCRAFT10, PSEA ) ENDIF IF (TAIRCRAFT11%NMODEL /= 0) THEN -CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, TPDTEXP, TPDTMOD, TPDTSEG, TPDTCUR, & - PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & +CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT, & TAIRCRAFT11, PSEA ) ENDIF IF (TAIRCRAFT12%NMODEL /= 0) THEN -CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, TPDTEXP, TPDTMOD, TPDTSEG, TPDTCUR, & - PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & +CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT, & TAIRCRAFT12, PSEA ) ENDIF IF (TAIRCRAFT13%NMODEL /= 0) THEN -CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, TPDTEXP, TPDTMOD, TPDTSEG, TPDTCUR, & - PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & +CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT, & TAIRCRAFT13, PSEA ) ENDIF IF (TAIRCRAFT14%NMODEL /= 0) THEN -CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, TPDTEXP, TPDTMOD, TPDTSEG, TPDTCUR, & - PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & +CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT, & TAIRCRAFT14, PSEA ) ENDIF IF (TAIRCRAFT15%NMODEL /= 0) THEN -CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, TPDTEXP, TPDTMOD, TPDTSEG, TPDTCUR, & - PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & +CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT, & TAIRCRAFT15, PSEA ) ENDIF IF (TAIRCRAFT16%NMODEL /= 0) THEN -CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, TPDTEXP, TPDTMOD, TPDTSEG, TPDTCUR, & - PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & +CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT, & TAIRCRAFT16, PSEA ) ENDIF IF (TAIRCRAFT17%NMODEL /= 0) THEN -CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, TPDTEXP, TPDTMOD, TPDTSEG, TPDTCUR, & - PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & +CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT, & TAIRCRAFT17, PSEA ) ENDIF IF (TAIRCRAFT18%NMODEL /= 0) THEN -CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, TPDTEXP, TPDTMOD, TPDTSEG, TPDTCUR, & - PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & +CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT, & TAIRCRAFT18, PSEA ) ENDIF IF (TAIRCRAFT19%NMODEL /= 0) THEN -CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, TPDTEXP, TPDTMOD, TPDTSEG, TPDTCUR, & - PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & +CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT, & TAIRCRAFT19, PSEA ) ENDIF IF (TAIRCRAFT20%NMODEL /= 0) THEN -CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, TPDTEXP, TPDTMOD, TPDTSEG, TPDTCUR, & - PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & +CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT, & TAIRCRAFT20, PSEA ) ENDIF IF (TAIRCRAFT21%NMODEL /= 0) THEN -CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, TPDTEXP, TPDTMOD, TPDTSEG, TPDTCUR, & - PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & +CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT, & TAIRCRAFT21, PSEA ) ENDIF IF (TAIRCRAFT22%NMODEL /= 0) THEN -CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, TPDTEXP, TPDTMOD, TPDTSEG, TPDTCUR, & - PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & +CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT, & TAIRCRAFT22, PSEA ) ENDIF IF (TAIRCRAFT23%NMODEL /= 0) THEN -CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, TPDTEXP, TPDTMOD, TPDTSEG, TPDTCUR, & - PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & +CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT, & TAIRCRAFT23, PSEA ) ENDIF IF (TAIRCRAFT24%NMODEL /= 0) THEN -CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, TPDTEXP, TPDTMOD, TPDTSEG, TPDTCUR, & - PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & +CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT, & TAIRCRAFT24, PSEA ) ENDIF IF (TAIRCRAFT25%NMODEL /= 0) THEN -CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, TPDTEXP, TPDTMOD, TPDTSEG, TPDTCUR, & - PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & +CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT, & TAIRCRAFT25, PSEA ) ENDIF IF (TAIRCRAFT26%NMODEL /= 0) THEN -CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, TPDTEXP, TPDTMOD, TPDTSEG, TPDTCUR, & - PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & +CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT, & TAIRCRAFT26, PSEA ) ENDIF IF (TAIRCRAFT27%NMODEL /= 0) THEN -CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, TPDTEXP, TPDTMOD, TPDTSEG, TPDTCUR, & - PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & +CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT, & TAIRCRAFT27, PSEA ) ENDIF IF (TAIRCRAFT28%NMODEL /= 0) THEN -CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, TPDTEXP, TPDTMOD, TPDTSEG, TPDTCUR, & - PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & +CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT, & TAIRCRAFT28, PSEA ) ENDIF IF (TAIRCRAFT29%NMODEL /= 0) THEN -CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, TPDTEXP, TPDTMOD, TPDTSEG, TPDTCUR, & - PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & +CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT, & TAIRCRAFT29, PSEA ) ENDIF IF (TAIRCRAFT30%NMODEL /= 0) THEN -CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, TPDTEXP, TPDTMOD, TPDTSEG, TPDTCUR, & - PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & +CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT, & TAIRCRAFT30, PSEA ) ENDIF diff --git a/src/MNH/aircraft_balloon_evol.f90 b/src/MNH/aircraft_balloon_evol.f90 index 12f4f595d..73d2b1294 100644 --- a/src/MNH/aircraft_balloon_evol.f90 +++ b/src/MNH/aircraft_balloon_evol.f90 @@ -10,20 +10,14 @@ MODULE MODI_AIRCRAFT_BALLOON_EVOL INTERFACE ! SUBROUTINE AIRCRAFT_BALLOON_EVOL(PTSTEP, & - TPDTEXP, TPDTMOD, TPDTSEG, TPDTCUR, & PXHAT, PYHAT, PZ, & PMAP, PLONOR, PLATOR, & PU, PV, PW, PP, PTH, PR, PSV, PTKE, & PTS, PRHODREF, PCIT,TPFLYER, PSEA ) ! -USE MODD_TYPE_DATE USE MODD_AIRCRAFT_BALLOON ! REAL, INTENT(IN) :: PTSTEP ! time step -TYPE(DATE_TIME), INTENT(IN) :: TPDTEXP! experiment date and time -TYPE(DATE_TIME), INTENT(IN) :: TPDTMOD! model start date and time -TYPE(DATE_TIME), INTENT(IN) :: TPDTSEG! segment date and time -TYPE(DATE_TIME), INTENT(IN) :: TPDTCUR! current date and time REAL, DIMENSION(:), INTENT(IN) :: PXHAT ! x coordinate REAL, DIMENSION(:), INTENT(IN) :: PYHAT ! y coordinate REAL, DIMENSION(:,:,:), INTENT(IN) :: PZ ! z array @@ -55,7 +49,6 @@ END MODULE MODI_AIRCRAFT_BALLOON_EVOL ! ! ######################################################## SUBROUTINE AIRCRAFT_BALLOON_EVOL(PTSTEP, & - TPDTEXP, TPDTMOD, TPDTSEG, TPDTCUR, & PXHAT, PYHAT, PZ, & PMAP, PLONOR, PLATOR, & PU, PV, PW, PP, PTH, PR, PSV, PTKE, & @@ -128,7 +121,8 @@ END MODULE MODI_AIRCRAFT_BALLOON_EVOL !! October, 2016 (G.DELAUTIER) LIMA !! March,28, 2018 (P. Wautelet) replace TEMPORAL_DIST by DATETIME_DISTANCE !! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O -!! +! P. Wautelet 13/09/2019: budget: simplify and modernize date/time management +! !! -------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -167,9 +161,9 @@ USE MODD_RAIN_ICE_DESCR, ONLY: XALPHAR_I=>XALPHAR,XNUR_I=>XNUR,XLBEXR_I=>XLBEX XLBI_I=>XLBI,XAI_I=>XAI,XBI_I=>XBI,XC_I_I=>XC_I,& XRTMIN_I=>XRTMIN,XCONC_LAND,XCONC_SEA USE MODD_REF_n, ONLY: XRHODREF -USE MODD_TIME +USE MODD_TIME, only: tdtexp +USE MODD_TIME_n, only: tdtcur USE MODD_TURB_FLUX_AIRCRAFT_BALLOON -USE MODD_TYPE_DATE ! USE MODE_DATETIME USE MODE_FGAU, ONLY: GAULAG @@ -188,10 +182,6 @@ IMPLICIT NONE ! ! REAL, INTENT(IN) :: PTSTEP ! time step -TYPE(DATE_TIME), INTENT(IN) :: TPDTEXP! experiment date and time -TYPE(DATE_TIME), INTENT(IN) :: TPDTMOD! model start date and time -TYPE(DATE_TIME), INTENT(IN) :: TPDTSEG! segment date and time -TYPE(DATE_TIME), INTENT(IN) :: TPDTCUR! current date and time REAL, DIMENSION(:), INTENT(IN) :: PXHAT ! x coordinate REAL, DIMENSION(:), INTENT(IN) :: PYHAT ! y coordinate REAL, DIMENSION(:,:,:), INTENT(IN) :: PZ ! z array @@ -220,7 +210,6 @@ REAL, DIMENSION(:,:), INTENT(IN) :: PSEA ! INTEGER :: IMI ! model index REAL :: ZTHIS_PROC ! 1 if balloon is currently treated by this proc., else 0 -REAL :: ZTIMEEXP ! elpased time between start of experiment and segment ! INTEGER :: IIB ! current processor domain sizes INTEGER :: IJB @@ -398,7 +387,7 @@ ZYHATM( IJU )=1.5*PYHAT( IJU )-0.5*PYHAT( IJU-1) !* 2.3 Compute time until launch by comparison of dates and times ! ---------------------------------------------------------- ! -CALL DATETIME_DISTANCE(TPFLYER%LAUNCH,TPDTCUR,ZTDIST) +CALL DATETIME_DISTANCE(TPFLYER%LAUNCH,TDTCUR,ZTDIST) ! !* 3. LAUNCH ! ------ @@ -412,7 +401,7 @@ IF (.NOT. TPFLYER%FLY) THEN !* 3.1 comparison of dates and times ! ----------------------------- ! -! CALL DATETIME_DISTANCE(TPFLYER%LAUNCH,TPDTCUR,ZTDIST) +! CALL DATETIME_DISTANCE(TPFLYER%LAUNCH,TDTCUR,ZTDIST) ! !* 3.2 launch/takeoff is effective ! --------------------------- @@ -446,8 +435,8 @@ IF (.NOT. TPFLYER%FLY) THEN IF (ZTDIST <= PTSTEP ) THEN WRITE(ILUOUT,*) '-------------------------------------------------------------------' WRITE(ILUOUT,*) 'Aircraft ',TPFLYER%TITLE,' takes off the ', & - TPDTCUR%TDATE%DAY,'/',TPDTCUR%TDATE%MONTH,'/', & - TPDTCUR%TDATE%YEAR,' at ',NINT(TPDTCUR%TIME),' sec.' + TDTCUR%TDATE%DAY,'/',TDTCUR%TDATE%MONTH,'/', & + TDTCUR%TDATE%YEAR,' at ',NINT(TDTCUR%TIME),' sec.' WRITE(ILUOUT,*) '-------------------------------------------------------------------' ENDIF ENDIF @@ -456,8 +445,8 @@ IF (.NOT. TPFLYER%FLY) THEN GLAUNCH = .TRUE. WRITE(ILUOUT,*) '-------------------------------------------------------------------' WRITE(ILUOUT,*) 'Balloon ',TPFLYER%TITLE,' is launched the ', & - TPDTCUR%TDATE%DAY,'/',TPDTCUR%TDATE%MONTH,'/', & - TPDTCUR%TDATE%YEAR,' at ',NINT(TPDTCUR%TIME),' sec.' + TDTCUR%TDATE%DAY,'/',TDTCUR%TDATE%MONTH,'/', & + TDTCUR%TDATE%YEAR,' at ',NINT(TDTCUR%TIME),' sec.' WRITE(ILUOUT,*) '-------------------------------------------------------------------' END IF ! @@ -502,25 +491,14 @@ END IF ! IF (GSTORE) THEN IN = TPFLYER%N_CUR - CALL DATETIME_DISTANCE(TDTEXP,TDTSEG,ZTIMEEXP) - ! - TPFLYER%TIME(IN) = (IN-1) * TPFLYER%STEP + ZTIMEEXP - TPFLYER%DATIME( 1,IN) = TPDTEXP%TDATE%YEAR - TPFLYER%DATIME( 2,IN) = TPDTEXP%TDATE%MONTH - TPFLYER%DATIME( 3,IN) = TPDTEXP%TDATE%DAY - TPFLYER%DATIME( 4,IN) = TPDTEXP%TIME - TPFLYER%DATIME( 5,IN) = TPDTSEG%TDATE%YEAR - TPFLYER%DATIME( 6,IN) = TPDTSEG%TDATE%MONTH - TPFLYER%DATIME( 7,IN) = TPDTSEG%TDATE%DAY - TPFLYER%DATIME( 8,IN) = TPDTSEG%TIME - TPFLYER%DATIME( 9,IN) = TPDTMOD%TDATE%YEAR - TPFLYER%DATIME(10,IN) = TPDTMOD%TDATE%MONTH - TPFLYER%DATIME(11,IN) = TPDTMOD%TDATE%DAY - TPFLYER%DATIME(12,IN) = TPDTMOD%TIME - TPFLYER%DATIME(13,IN) = TPDTCUR%TDATE%YEAR - TPFLYER%DATIME(14,IN) = TPDTCUR%TDATE%MONTH - TPFLYER%DATIME(15,IN) = TPDTCUR%TDATE%DAY - TPFLYER%DATIME(16,IN) = TPDTCUR%TIME +#if 0 + tpflyer%tpdates(in)%date%year = tdtexp%date%year + tpflyer%tpdates(in)%date%month = tdtexp%date%month + tpflyer%tpdates(in)%date%day = tdtexp%date%day + tpflyer%tpdates(in)%time = tdtexp%time + ( in - 1 ) * tpflyer%step +#else + tpflyer%tpdates(in) = tdtcur +#endif END IF ! IF ( TPFLYER%FLY) THEN @@ -829,19 +807,19 @@ IF ( TPFLYER%FLY) THEN TPFLYER%FLY = .FALSE. IF (TPFLYER%TYPE=='AIRCRA' .AND. .NOT. GLAUNCH ) THEN WRITE(ILUOUT,*) 'Aircraft ',TPFLYER%TITLE,' flew out of the domain the ', & - TPDTCUR%TDATE%DAY,'/',TPDTCUR%TDATE%MONTH,'/', & - TPDTCUR%TDATE%YEAR,' at ',TPDTCUR%TIME,' sec.' + TDTCUR%TDATE%DAY,'/',TDTCUR%TDATE%MONTH,'/', & + TDTCUR%TDATE%YEAR,' at ',TDTCUR%TIME,' sec.' ELSE IF (TPFLYER%TYPE /= 'AIRCRA') THEN WRITE(ILUOUT,*) 'Balloon ',TPFLYER%TITLE,' crashed the ', & - TPDTCUR%TDATE%DAY,'/',TPDTCUR%TDATE%MONTH,'/', & - TPDTCUR%TDATE%YEAR,' at ',TPDTCUR%TIME,' sec.' + TDTCUR%TDATE%DAY,'/',TDTCUR%TDATE%MONTH,'/', & + TDTCUR%TDATE%YEAR,' at ',TDTCUR%TIME,' sec.' END IF ELSE IF (TPFLYER%TYPE=='AIRCRA' .AND. .NOT. GLAUNCH .AND. ZTDIST > PTSTEP ) THEN WRITE(ILUOUT,*) '-------------------------------------------------------------------' WRITE(ILUOUT,*) 'Aircraft ',TPFLYER%TITLE,' flies in leg',TPFLYER%SEGCURN ,' the ', & - TPDTCUR%TDATE%DAY,'/',TPDTCUR%TDATE%MONTH,'/', & - TPDTCUR%TDATE%YEAR,' at ',NINT(TPDTCUR%TIME),' sec.' + TDTCUR%TDATE%DAY,'/',TDTCUR%TDATE%MONTH,'/', & + TDTCUR%TDATE%YEAR,' at ',NINT(TDTCUR%TIME),' sec.' WRITE(ILUOUT,*) '-------------------------------------------------------------------' ENDIF ! @@ -1708,12 +1686,12 @@ IF (TPFLYER%NMODEL /= IMODEL) THEN IF (NDAD(IMODEL) == TPFLYER%NMODEL) THEN WRITE(ILUOUT,*) '-------------------------------------------------------------------' WRITE(ILUOUT,*) TPFLYER%TITLE,' comes from model ',IMODEL,' in model ',& - TPFLYER%NMODEL,' at ',NINT(TPDTCUR%TIME),' sec.' + TPFLYER%NMODEL,' at ',NINT(TDTCUR%TIME),' sec.' WRITE(ILUOUT,*) '-------------------------------------------------------------------' ELSE WRITE(ILUOUT,*) '-------------------------------------------------------------------' WRITE(ILUOUT,*) TPFLYER%TITLE,' goes from model ',IMODEL,' to model ',& - TPFLYER%NMODEL,' at ',NINT(TPDTCUR%TIME),' sec.' + TPFLYER%NMODEL,' at ',NINT(TDTCUR%TIME),' sec.' WRITE(ILUOUT,*) '-------------------------------------------------------------------' ENDIF ENDIF diff --git a/src/MNH/diag.f90 b/src/MNH/diag.f90 index b68caaebd..af19ea567 100644 --- a/src/MNH/diag.f90 +++ b/src/MNH/diag.f90 @@ -92,6 +92,7 @@ ! P. Wautelet 11/02/2019: added missing use of MODI_CH_MONITOR_n ! P. Wautelet 28/03/2019: use MNHTIME for time measurement variables ! P. Wautelet 26/07/2019: bug correction: deallocate of zsea and ztown done too early +! P. Wautelet 13/09/2019: budget: simplify and modernize date/time management !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -177,6 +178,7 @@ IMPLICIT NONE !* 0.1 declarations of local variables ! TYPE(DATE_TIME) :: TXDTBAL ! current time and date for BALLOON and AIRCRAFT trajectories +TYPE(DATE_TIME) :: TPDTCUR_SAVE CHARACTER (LEN=28), DIMENSION(1) :: YINIFILE ! names of the INPUT FM-file CHARACTER (LEN=28), DIMENSION(1) :: YINIFILEPGD ! names of the INPUT FM-file CHARACTER (LEN=5) :: YSUFFIX ! character string for the OUTPUT FM-file number @@ -532,12 +534,15 @@ IF ( LAIRCRAFT_BALLOON ) THEN WRITE(ILUOUT0,*) ' ' WRITE(ILUOUT0,*) 'DIAG AFTER OPEN DIACHRONIC FILE' WRITE(ILUOUT0,*) ' ' +! + TPDTCUR_SAVE = TDTCUR ! TXDTBAL%TDATE%YEAR = TDTCUR%TDATE%YEAR TXDTBAL%TDATE%MONTH = TDTCUR%TDATE%MONTH TXDTBAL%TDATE%DAY = TDTCUR%TDATE%DAY TXDTBAL%TIME = TDTCUR%TIME - NTIME_AIRCRAFT_BALLOON/2. CALL DATETIME_CORRECTDATE(TXDTBAL) + TDTCUR = TXDTBAL !TDTCUR is used in AIRCRAFT_BALLOON ! ALLOCATE (ZSEA(SIZE(XRHODJ,1),SIZE(XRHODJ,2))) ALLOCATE (ZTOWN(SIZE(XRHODJ,1),SIZE(XRHODJ,2))) @@ -546,15 +551,18 @@ IF ( LAIRCRAFT_BALLOON ) THEN CALL MNHGET_SURF_PARAM_n (PSEA=ZSEA(:,:),PTOWN=ZTOWN(:,:)) DO ISTEPBAL=1,NTIME_AIRCRAFT_BALLOON,INT(XSTEP_AIRCRAFT_BALLOON) CALL AIRCRAFT_BALLOON(XSTEP_AIRCRAFT_BALLOON, & - TDTEXP, TDTMOD, TDTCUR, TXDTBAL, & XXHAT, XYHAT, XZZ, XMAP, XLONORI, XLATORI, & XUT, XVT, XWT, XPABST, XTHT, XRT, XSVT, & XTKET, XTSRAD, XRHODREF,XCIT,ZSEA) -! + TXDTBAL%TIME=TXDTBAL%TIME + XSTEP_AIRCRAFT_BALLOON CALL DATETIME_CORRECTDATE(TXDTBAL) + TDTCUR = TXDTBAL !TDTCUR is used in AIRCRAFT_BALLOON ENDDO DEALLOCATE (ZSEA,ZTOWN) +! + TDTCUR = TPDTCUR_SAVE +! CALL IO_Header_write(TZDIACFILE) CALL WRITE_LFIFMN_FORDIACHRO_n(TZDIACFILE) CALL WRITE_AIRCRAFT_BALLOON(TZDIACFILE) diff --git a/src/MNH/ini_aircraft_balloon.f90 b/src/MNH/ini_aircraft_balloon.f90 index 2d5cc4fb3..42f1e14a0 100644 --- a/src/MNH/ini_aircraft_balloon.f90 +++ b/src/MNH/ini_aircraft_balloon.f90 @@ -74,6 +74,7 @@ END MODULE MODI_INI_AIRCRAFT_BALLOON !! March, 2013 : O.Caumont, C.Lac : add vertical profiles !! OCT,2016 : G.Delautier LIMA !! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O +! P. Wautelet 13/09/2019: budget: simplify and modernize date/time management !! !! -------------------------------------------------------------------------- ! @@ -355,7 +356,7 @@ IF (TPFLYER%NMODEL > 0) THEN ENDIF ! ! -ALLOCATE(TPFLYER%TIME(ISTORE)) +allocate( tpflyer%tpdates(istore) ) ALLOCATE(TPFLYER%X (ISTORE)) ALLOCATE(TPFLYER%Y (ISTORE)) ALLOCATE(TPFLYER%Z (ISTORE)) @@ -390,13 +391,11 @@ END IF ALLOCATE(TPFLYER%TKE_DISS(ISTORE)) ALLOCATE(TPFLYER%TSRAD (ISTORE)) ALLOCATE(TPFLYER%ZS (ISTORE)) -ALLOCATE(TPFLYER%DATIME(16,ISTORE)) ! ALLOCATE(TPFLYER%THW_FLUX (ISTORE)) ALLOCATE(TPFLYER%RCW_FLUX (ISTORE)) ALLOCATE(TPFLYER%SVW_FLUX (ISTORE,KSV)) ! -TPFLYER%TIME = XUNDEF TPFLYER%X = XUNDEF TPFLYER%Y = XUNDEF TPFLYER%Z = XUNDEF @@ -428,23 +427,6 @@ TPFLYER%TKE = XUNDEF TPFLYER%TSRAD = XUNDEF TPFLYER%ZS = XUNDEF TPFLYER%TKE_DISS = XUNDEF -TPFLYER%DATIME( 1,1:ISTORE) = TPDTSEG%TDATE%YEAR -TPFLYER%DATIME( 2,1:ISTORE) = TPDTSEG%TDATE%MONTH -TPFLYER%DATIME( 3,1:ISTORE) = TPDTSEG%TDATE%DAY -TPFLYER%DATIME( 4,1:ISTORE) = TPDTSEG%TIME -TPFLYER%DATIME( 5,1:ISTORE) = TPDTSEG%TDATE%YEAR -TPFLYER%DATIME( 6,1:ISTORE) = TPDTSEG%TDATE%MONTH -TPFLYER%DATIME( 7,1:ISTORE) = TPDTSEG%TDATE%DAY -TPFLYER%DATIME( 8,1:ISTORE) = TPDTSEG%TIME -TPFLYER%DATIME( 9,1:ISTORE) = TPDTSEG%TDATE%YEAR -TPFLYER%DATIME(10,1:ISTORE) = TPDTSEG%TDATE%MONTH -TPFLYER%DATIME(11,1:ISTORE) = TPDTSEG%TDATE%DAY -TPFLYER%DATIME(12,1:ISTORE) = TPDTSEG%TIME -TPFLYER%DATIME(13,1:ISTORE) = TPDTSEG%TDATE%YEAR -TPFLYER%DATIME(14,1:ISTORE) = TPDTSEG%TDATE%MONTH -TPFLYER%DATIME(15,1:ISTORE) = TPDTSEG%TDATE%DAY -TPFLYER%DATIME(16,1:ISTORE) = XUNDEF - ! TPFLYER%THW_FLUX = XUNDEF TPFLYER%RCW_FLUX = XUNDEF diff --git a/src/MNH/ini_lesn.f90 b/src/MNH/ini_lesn.f90 index c2a225683..f29666f7e 100644 --- a/src/MNH/ini_lesn.f90 +++ b/src/MNH/ini_lesn.f90 @@ -35,6 +35,7 @@ !! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O !! 02/2019 (C. Lac) Add rain fraction as a LES diagnostic ! P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg +! P. Wautelet 13/09/2019: budget: simplify and modernize date/time management !! -------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -338,17 +339,13 @@ NLES_TIMES = ( INT( (XSEGLEN-XTSTEP+1.E-6) / XTSTEP ) ) / NLES_DTCOUNT ! NLES_TCOUNT = 0 ! -!* 3.6 date array for diachro +!* 3.6 dates array for diachro ! ---------------------- ! -ALLOCATE(XLES_DATIME(16,NLES_TIMES)) +allocate( xles_dates( nles_times ) ) +allocate( xles_times( nles_times ) ) ! -!* 3.7 sampling times array for diachro -! -------------------------------- -! -ALLOCATE(XLES_TRAJT(NLES_TIMES,1)) -! -!* 3.8 No data +!* 3.7 No data ! ------- ! IF (NLES_TIMES==0) THEN diff --git a/src/MNH/ini_modeln.f90 b/src/MNH/ini_modeln.f90 index a7ff5457c..a60f92ef3 100644 --- a/src/MNH/ini_modeln.f90 +++ b/src/MNH/ini_modeln.f90 @@ -287,6 +287,7 @@ END MODULE MODI_INI_MODEL_n ! P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg ! P. Wautelet 19/04/2019: removed unused dummy arguments and variables ! P. Wautelet 07/06/2019: allocate lookup tables for optical properties only when needed +! P. Wautelet 13/09/2019: budget: simplify and modernize date/time management !--------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -2397,18 +2398,18 @@ CALL INI_AIRCRAFT_BALLOON(TPINIFILE,XTSTEP, TDTSEG, XSEGLEN, NRR, NSV, & !* 24. STATION initializations ! ----------------------- ! -CALL INI_SURFSTATION_n(XTSTEP, TDTSEG, XSEGLEN, NRR, NSV, & - CTURB=="TKEL" , & - XLATORI, XLONORI ) +CALL INI_SURFSTATION_n(XTSTEP, XSEGLEN, NRR, NSV, & + CTURB=="TKEL" , & + XLATORI, XLONORI ) ! !------------------------------------------------------------------------------- ! !* 25. PROFILER initializations ! ------------------------ ! -CALL INI_POSPROFILER_n(XTSTEP, TDTSEG, XSEGLEN, NRR, NSV, & - CTURB=="TKEL", & - XLATORI, XLONORI ) +CALL INI_POSPROFILER_n(XTSTEP, XSEGLEN, NRR, NSV, & + CTURB=="TKEL", & + XLATORI, XLONORI ) ! !------------------------------------------------------------------------------- ! diff --git a/src/MNH/ini_posprofilern.f90 b/src/MNH/ini_posprofilern.f90 index 88b86c3cb..21894be24 100644 --- a/src/MNH/ini_posprofilern.f90 +++ b/src/MNH/ini_posprofilern.f90 @@ -9,14 +9,11 @@ MODULE MODI_INI_POSPROFILER_n ! INTERFACE ! - SUBROUTINE INI_POSPROFILER_n(PTSTEP, TPDTSEG, PSEGLEN, & + SUBROUTINE INI_POSPROFILER_n(PTSTEP, PSEGLEN, & KRR, KSV, OUSETKE, & PLATOR, PLONOR ) ! -USE MODD_TYPE_DATE -! REAL, INTENT(IN) :: PTSTEP ! time step -TYPE(DATE_TIME), INTENT(IN) :: TPDTSEG ! segment date and time REAL, INTENT(IN) :: PSEGLEN ! segment length INTEGER, INTENT(IN) :: KRR ! number of moist variables INTEGER, INTENT(IN) :: KSV ! number of scalar variables @@ -33,7 +30,7 @@ END INTERFACE END MODULE MODI_INI_POSPROFILER_n ! ! ######################################################## - SUBROUTINE INI_POSPROFILER_n(PTSTEP, TPDTSEG, PSEGLEN, & + SUBROUTINE INI_POSPROFILER_n(PTSTEP, PSEGLEN, & KRR, KSV, OUSETKE, & PLATOR, PLONOR ) ! ######################################################## @@ -67,6 +64,7 @@ END MODULE MODI_INI_POSPROFILER_n !! P. Tulet 15/01/2002 !! C.Lac 10/2016 Add visibility diagnostic !! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O +! P. Wautelet 13/09/2019: budget: simplify and modernize date/time management !! -------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -81,7 +79,6 @@ USE MODD_PARAMETERS USE MODD_PROFILER_n USE MODD_RADIATIONS_n, ONLY: NAER USE MODD_TYPE_PROFILER -USE MODD_TYPE_DATE ! USE MODE_GRIDPROJ USE MODE_ll @@ -96,7 +93,6 @@ IMPLICIT NONE ! ! REAL, INTENT(IN) :: PTSTEP ! time step -TYPE(DATE_TIME), INTENT(IN) :: TPDTSEG ! segment date and time REAL, INTENT(IN) :: PSEGLEN ! segment length INTEGER, INTENT(IN) :: KRR ! number of moist variables INTEGER, INTENT(IN) :: KSV ! number of scalar variables @@ -161,7 +157,7 @@ TYPE(PROFILER), INTENT(INOUT) :: TPROFILER ! ISTORE = INT ( (PSEGLEN-XTSTEP) / TPROFILER%STEP ) + 1 ! -ALLOCATE(TPROFILER%TIME (ISTORE)) +allocate( tprofiler%tpdates( istore ) ) ALLOCATE(TPROFILER%ERROR (NUMBPROFILER)) ALLOCATE(TPROFILER%X (NUMBPROFILER)) ALLOCATE(TPROFILER%Y (NUMBPROFILER)) @@ -186,7 +182,6 @@ IF (OUSETKE) THEN ELSE ALLOCATE(TPROFILER%TKE (0,IKU,0)) END IF -ALLOCATE(TPROFILER%DATIME(16,ISTORE)) ALLOCATE(TPROFILER%T2M (ISTORE,NUMBPROFILER)) ALLOCATE(TPROFILER%Q2M (ISTORE,NUMBPROFILER)) ALLOCATE(TPROFILER%HU2M (ISTORE,NUMBPROFILER)) @@ -209,7 +204,6 @@ ALLOCATE(TPROFILER%TKE_DISS(ISTORE,IKU,NUMBPROFILER)) ! ! TPROFILER%ERROR= .FALSE. -TPROFILER%TIME = XUNDEF TPROFILER%ZON = XUNDEF TPROFILER%MER = XUNDEF TPROFILER%FF = XUNDEF diff --git a/src/MNH/ini_seriesn.f90 b/src/MNH/ini_seriesn.f90 index cff938ace..dbb003018 100644 --- a/src/MNH/ini_seriesn.f90 +++ b/src/MNH/ini_seriesn.f90 @@ -42,30 +42,29 @@ !! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O ! P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg ! P. Wautelet 12/04/2019: use standard measurement units -!! +! P. Wautelet 13/09/2019: budget: simplify and modernize date/time management +! !------------------------------------------------------------------------------- ! !* 0. Declaration ! -------------- ! -USE MODE_ll -USE MODE_MSG -USE MODE_MODELN_HANDLER -! -USE MODD_TIME ! Experiment and segment times (TDTEXP and TDTSEG) USE MODD_CONF -USE MODD_DYN, ONLY: XSEGLEN +USE MODD_CONF_n, ONLY: LUSERV, LUSERC, LUSERR, LUSERI, LUSERS, LUSERG, LUSERH +USE MODD_DIM_n, ONLY: NKMAX +USE MODD_DYN, ONLY: XSEGLEN +USE MODD_DYN_n, ONLY: XTSTEP, NSTOP +USE MODD_LUNIT_n, ONLY: TLUOUT +USE MODD_PARAMETERS +USE MODD_PARAM_n, ONLY: CSURF +USE MODD_PRECIP_n, ONLY: XINPRR, XINPRS, XINPRG USE MODD_SERIES USE MODD_SERIES_n -USE MODD_PARAMETERS -USE MODD_CONF_n, ONLY: LUSERV,LUSERC,LUSERR,LUSERI,LUSERS,LUSERG,LUSERH -USE MODD_DIM_n, ONLY: NKMAX -USE MODD_DYN_n, ONLY: XTSTEP,NSTOP -USE MODD_LUNIT_n, ONLY: TLUOUT -USE MODD_PARAM_n, ONLY: CSURF -USE MODD_PRECIP_n, ONLY: XINPRR,XINPRS,XINPRG -USE MODD_TIME_n -! +! +USE MODE_ll +USE MODE_MODELN_HANDLER +USE MODE_MSG +! USE MODI_MNHGET_SURF_PARAM_n ! IMPLICIT NONE @@ -276,8 +275,7 @@ ALLOCATE( CSCOMMENT1 (NSTEMP_SERIE1) ) ALLOCATE( CSCOMMENT2 (NSTEMP_SERIE2) ) ALLOCATE( CSCOMMENT3 (NSTEMP_SERIE3) ) ! -ALLOCATE( XSTRAJT (NSNBSTEPT,1) ) -ALLOCATE( XSDATIME (16,NSNBSTEPT) ) +allocate( tpsdates( nsnbstept ) ) ! XSSERIES1(:,:,:,:,:,:)=0. XSSERIES2(:,:,:,:,:,:)=0. @@ -473,17 +471,4 @@ end if ! NSCOUNTD=0 ! Counting the nb of temporal series outputs ! -XSDATIME( 1,:)= TDTEXP%TDATE%YEAR -XSDATIME( 2,:)= TDTEXP%TDATE%MONTH -XSDATIME( 3,:)= TDTEXP%TDATE%DAY -XSDATIME( 4,:)= TDTEXP%TIME -XSDATIME( 5,:)= TDTSEG%TDATE%YEAR -XSDATIME( 6,:)= TDTSEG%TDATE%MONTH -XSDATIME( 7,:)= TDTSEG%TDATE%DAY -XSDATIME( 8,:)= TDTSEG%TIME -XSDATIME( 9,:)= TDTMOD%TDATE%YEAR -XSDATIME(10,:)= TDTMOD%TDATE%MONTH -XSDATIME(11,:)= TDTMOD%TDATE%DAY -XSDATIME(12,:)= TDTMOD%TIME -! END SUBROUTINE INI_SERIES_n diff --git a/src/MNH/ini_surfstationn.f90 b/src/MNH/ini_surfstationn.f90 index 3d8f08596..8b2b47e73 100644 --- a/src/MNH/ini_surfstationn.f90 +++ b/src/MNH/ini_surfstationn.f90 @@ -9,13 +9,12 @@ MODULE MODI_INI_SURFSTATION_n ! INTERFACE ! - SUBROUTINE INI_SURFSTATION_n(PTSTEP, TPDTSEG, PSEGLEN, & + SUBROUTINE INI_SURFSTATION_n(PTSTEP, PSEGLEN, & KRR, KSV, OUSETKE, & PLATOR, PLONOR ) ! USE MODD_TYPE_DATE REAL, INTENT(IN) :: PTSTEP ! time step -TYPE(DATE_TIME), INTENT(IN) :: TPDTSEG ! segment date and time REAL, INTENT(IN) :: PSEGLEN ! segment length INTEGER, INTENT(IN) :: KRR ! number of moist variables INTEGER, INTENT(IN) :: KSV ! number of scalar variables @@ -32,7 +31,7 @@ END INTERFACE END MODULE MODI_INI_SURFSTATION_n ! ! ######################################################## - SUBROUTINE INI_SURFSTATION_n(PTSTEP, TPDTSEG, PSEGLEN, & + SUBROUTINE INI_SURFSTATION_n(PTSTEP, PSEGLEN, & KRR, KSV, OUSETKE, & PLATOR, PLONOR ) ! ######################################################## @@ -66,7 +65,8 @@ END MODULE MODI_INI_SURFSTATION_n !! P. Tulet 15/01/2002 !! A. Lemonsu 19/11/2002 !! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O -!! +! P. Wautelet 13/09/2019: budget: simplify and modernize date/time management +! !! -------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -94,7 +94,6 @@ IMPLICIT NONE ! ! REAL, INTENT(IN) :: PTSTEP ! time step -TYPE(DATE_TIME), INTENT(IN) :: TPDTSEG ! segment date and time REAL, INTENT(IN) :: PSEGLEN ! segment length INTEGER, INTENT(IN) :: KRR ! number of moist variables INTEGER, INTENT(IN) :: KSV ! number of scalar variables @@ -158,16 +157,13 @@ TYPE(STATION), INTENT(INOUT) :: TSTATION ! ! ISTORE = INT ( (PSEGLEN-XTSTEP) / TSTATION%STEP ) + 1 ! -! -! -ALLOCATE(TSTATION%TIME(ISTORE)) +allocate( tstation%tpdates( istore ) ) ALLOCATE(TSTATION%ERROR (NUMBSTAT)) ALLOCATE(TSTATION%X (NUMBSTAT)) ALLOCATE(TSTATION%Y (NUMBSTAT)) ALLOCATE(TSTATION%SV (ISTORE,NUMBSTAT,KSV)) ALLOCATE(TSTATION%TSRAD (ISTORE,NUMBSTAT)) ALLOCATE(TSTATION%ZS (NUMBSTAT)) -ALLOCATE(TSTATION%DATIME(16,ISTORE)) ALLOCATE(TSTATION%ZON (ISTORE,NUMBSTAT)) ALLOCATE(TSTATION%MER (ISTORE,NUMBSTAT)) ALLOCATE(TSTATION%W (ISTORE,NUMBSTAT)) @@ -197,7 +193,6 @@ ALLOCATE(TSTATION%DSTAOD (ISTORE,NUMBSTAT)) ALLOCATE(TSTATION%SFCO2 (ISTORE,NUMBSTAT)) ! TSTATION%ERROR = .FALSE. -TSTATION%TIME = XUNDEF TSTATION%ZON = XUNDEF TSTATION%MER = XUNDEF TSTATION%W = XUNDEF diff --git a/src/MNH/les_ini_timestepn.f90 b/src/MNH/les_ini_timestepn.f90 index 9ab794369..505067d9d 100644 --- a/src/MNH/les_ini_timestepn.f90 +++ b/src/MNH/les_ini_timestepn.f90 @@ -1,13 +1,8 @@ -!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2002-2019 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 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 les 2006/08/30 18:38:45 -!----------------------------------------------------------------- ! ####################### MODULE MODI_LES_INI_TIMESTEP_n ! ####################### @@ -53,6 +48,7 @@ END MODULE MODI_LES_INI_TIMESTEP_n !! MODIFICATIONS !! ------------- !! Original 06/11/02 +! P. Wautelet 13/09/2019: budget: simplify and modernize date/time management !! !! -------------------------------------------------------------------------- ! @@ -73,6 +69,7 @@ USE MODD_TIME USE MODD_CONF USE MODD_LES_BUDGET ! +use mode_datetime, only: Datetime_distance USE MODE_ll USE MODE_MODELN_HANDLER ! @@ -148,25 +145,8 @@ NLES_TCOUNT = NLES_TCOUNT + 1 ! NLES_CURRENT_TCOUNT = NLES_TCOUNT ! -! -XLES_DATIME( 1,NLES_TCOUNT) = TDTEXP%TDATE%YEAR -XLES_DATIME( 2,NLES_TCOUNT) = TDTEXP%TDATE%MONTH -XLES_DATIME( 3,NLES_TCOUNT) = TDTEXP%TDATE%DAY -XLES_DATIME( 4,NLES_TCOUNT) = TDTEXP%TIME -XLES_DATIME( 5,NLES_TCOUNT) = TDTSEG%TDATE%YEAR -XLES_DATIME( 6,NLES_TCOUNT) = TDTSEG%TDATE%MONTH -XLES_DATIME( 7,NLES_TCOUNT) = TDTSEG%TDATE%DAY -XLES_DATIME( 8,NLES_TCOUNT) = TDTSEG%TIME -XLES_DATIME( 9,NLES_TCOUNT) = TDTMOD%TDATE%YEAR -XLES_DATIME(10,NLES_TCOUNT) = TDTMOD%TDATE%MONTH -XLES_DATIME(11,NLES_TCOUNT) = TDTMOD%TDATE%DAY -XLES_DATIME(12,NLES_TCOUNT) = TDTMOD%TIME -XLES_DATIME(13,NLES_TCOUNT) = TDTCUR%TDATE%YEAR -XLES_DATIME(14,NLES_TCOUNT) = TDTCUR%TDATE%MONTH -XLES_DATIME(15,NLES_TCOUNT) = TDTCUR%TDATE%DAY -XLES_DATIME(16,NLES_TCOUNT) = TDTCUR%TIME -! -XLES_TRAJT(NLES_TCOUNT,1) = (KTCOUNT-1) * XTSTEP +xles_dates(nles_tcount ) = tdtcur +call Datetime_distance( tdtseg, tdtcur, xles_times(nles_tcount ) ) ! !* forward-in-time time-step ! diff --git a/src/MNH/les_masksn.f90 b/src/MNH/les_masksn.f90 index 4add46bb6..eeb310b83 100644 --- a/src/MNH/les_masksn.f90 +++ b/src/MNH/les_masksn.f90 @@ -1,13 +1,8 @@ -!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2000-2019 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 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 les 2006/08/30 18:38:57 -!----------------------------------------------------------------- ! ################ MODULE MODI_LES_MASKS_n ! ################ @@ -55,19 +50,21 @@ END MODULE MODI_LES_MASKS_n !! ------------- !! Original 07/02/00 !! +! P. Wautelet 13/09/2019: budget: simplify and modernize date/time management !! -------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ ! -USE MODD_LES -USE MODD_LES_n -USE MODD_FIELD_n USE MODD_CONF_n -USE MODD_TIME_n USE MODD_DYN_n +USE MODD_FIELD_n +USE MODD_LES +USE MODD_LES_n USE MODD_TIME +USE MODD_TIME_n ! +use mode_datetime, only: Datetime_distance USE MODE_ll USE MODE_MODELN_HANDLER ! @@ -121,25 +118,8 @@ NLES_TCOUNT = NLES_TCOUNT + 1 ! NLES_CURRENT_TCOUNT = NLES_TCOUNT ! -! -XLES_DATIME( 1,NLES_TCOUNT) = TDTEXP%TDATE%YEAR -XLES_DATIME( 2,NLES_TCOUNT) = TDTEXP%TDATE%MONTH -XLES_DATIME( 3,NLES_TCOUNT) = TDTEXP%TDATE%DAY -XLES_DATIME( 4,NLES_TCOUNT) = TDTEXP%TIME -XLES_DATIME( 5,NLES_TCOUNT) = TDTSEG%TDATE%YEAR -XLES_DATIME( 6,NLES_TCOUNT) = TDTSEG%TDATE%MONTH -XLES_DATIME( 7,NLES_TCOUNT) = TDTSEG%TDATE%DAY -XLES_DATIME( 8,NLES_TCOUNT) = TDTSEG%TIME -XLES_DATIME( 9,NLES_TCOUNT) = TDTMOD%TDATE%YEAR -XLES_DATIME(10,NLES_TCOUNT) = TDTMOD%TDATE%MONTH -XLES_DATIME(11,NLES_TCOUNT) = TDTMOD%TDATE%DAY -XLES_DATIME(12,NLES_TCOUNT) = TDTMOD%TIME -XLES_DATIME(13,NLES_TCOUNT) = TDTCUR%TDATE%YEAR -XLES_DATIME(14,NLES_TCOUNT) = TDTCUR%TDATE%MONTH -XLES_DATIME(15,NLES_TCOUNT) = TDTCUR%TDATE%DAY -XLES_DATIME(16,NLES_TCOUNT) = TDTCUR%TIME -! -XLES_TRAJT(NLES_TCOUNT,1) = (KTCOUNT-1) * XTSTEP +xles_dates(nles_tcount ) = tdtcur +call Datetime_distance( tdtseg, tdtcur, xles_times(nles_tcount ) ) ! !------------------------------------------------------------------------------- ! diff --git a/src/MNH/modd_aircraft_balloon.f90 b/src/MNH/modd_aircraft_balloon.f90 index 9ff02772f..33d6f973f 100644 --- a/src/MNH/modd_aircraft_balloon.f90 +++ b/src/MNH/modd_aircraft_balloon.f90 @@ -33,14 +33,17 @@ !! March, 2013 : O.Caumont, C.Lac : add vertical profiles !! Oct,2016 : G.DELAUTIER LIMA ! P. Wautelet 08/02/2019: add missing NULL association for pointers +! P. Wautelet 13/09/2019: budget: simplify and modernize date/time management !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ ! ! -USE MODD_TYPE_DATE -! +use modd_type_date, only: date_time + +implicit none + TYPE FLYER ! ! @@ -109,7 +112,7 @@ REAL :: P_CUR ! current p (if 'AIRCRA' and 'ALTDEF' ! !* data records ! -REAL, DIMENSION(:), POINTER :: TIME => NULL() ! t(n) (n: recording instants) +type(date_time), dimension(:), pointer :: tpdates => NULL() ! dates(n) (n: recording instants) REAL, DIMENSION(:), POINTER :: X => NULL() ! X(n) REAL, DIMENSION(:), POINTER :: Y => NULL() ! Y(n) REAL, DIMENSION(:), POINTER :: Z => NULL() ! Z(n) @@ -140,7 +143,6 @@ REAL, DIMENSION(:,:), POINTER :: AER => NULL() ! Extinction at 550 nm REAL, DIMENSION(:,:), POINTER :: DST_WL => NULL() ! Extinction by wavelength REAL, DIMENSION(:), POINTER :: ZS => NULL() ! zs(n) REAL, DIMENSION(:), POINTER :: TSRAD => NULL() ! Ts(n) -REAL, DIMENSION(:,:), POINTER :: DATIME => NULL() ! record for diachro ! REAL, DIMENSION(:) , POINTER :: THW_FLUX => NULL() ! thw_flux(n) REAL, DIMENSION(:) , POINTER :: RCW_FLUX => NULL() ! rcw_flux(n) diff --git a/src/MNH/modd_les.f90 b/src/MNH/modd_les.f90 index c30666b2e..e830ed1a4 100644 --- a/src/MNH/modd_les.f90 +++ b/src/MNH/modd_les.f90 @@ -1,6 +1,6 @@ -!MNH_LIC Copyright 1995-2018 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1995-2019 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 version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. !----------------------------------------------------------------- ! ############### @@ -42,6 +42,7 @@ !! P. Aumond Oct ,2009 User multimaskS + 4th order !! C.Lac Oct ,2014 Correction on user masks !! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O +! P. Wautelet 13/09/2019: budget: simplify and modernize date/time management !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -136,9 +137,6 @@ INTEGER :: NLES_CURRENT_TCOUNT INTEGER :: NLES_CURRENT_TIMES ! current model NLES_TIMES (number of LES samplings) ! -REAL, DIMENSION(:,:), ALLOCATABLE :: XLES_CURRENT_TRAJT -! trajt array for write_diachro routine -! INTEGER :: NLES_CURRENT_IINF, NLES_CURRENT_ISUP, NLES_CURRENT_JINF, NLES_CURRENT_JSUP ! coordinates for write_diachro, set to NLESn_IINF(current model), etc... ! @@ -151,9 +149,6 @@ CHARACTER(LEN=4), DIMENSION(2) :: CLES_CURRENT_LBCX CHARACTER(LEN=4), DIMENSION(2) :: CLES_CURRENT_LBCY ! current model Y boundary conditions for 2 points correlations computations ! -REAL, DIMENSION(:,:), ALLOCATABLE :: XLES_CURRENT_DATIME -! date array for diachro -! REAL, DIMENSION(:), ALLOCATABLE :: XLES_CURRENT_Z ! altitudes for diachro ! diff --git a/src/MNH/modd_lesn.f90 b/src/MNH/modd_lesn.f90 index 9fe76c3f8..88ac14cce 100644 --- a/src/MNH/modd_lesn.f90 +++ b/src/MNH/modd_lesn.f90 @@ -40,7 +40,8 @@ !! O.Thouron June, 2008 New radiation diagnostics !! 10/2016 (C.Lac) Add droplet deposition ! P. Wautelet 08/02/2019: add missing NULL association for pointers -!! 02/2019 (C. Lac) Add rain fraction as a LES diagnostic +! C. Lac 02/2019: add rain fraction as a LES diagnostic +! P. Wautelet 13/09/2019: budget: simplify and modernize date/time management !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -63,8 +64,8 @@ TYPE LES_t INTEGER :: NSPECTRA_NI ! number of wave lengths in I direction INTEGER :: NSPECTRA_NJ ! number of wave lengths in J direction ! - REAL, DIMENSION(:,:), POINTER :: XLES_DATIME=>NULL() ! date array for diachro - REAL, DIMENSION(:,:), POINTER :: XLES_TRAJT=>NULL() ! sampling times array for diachro + type(date_time), dimension(:), pointer :: xles_dates => null() !Dates array + real, dimension(:), pointer :: xles_times => null() !Times from the start of the segment ! REAL, DIMENSION(:), POINTER :: XLES_Z=>NULL() ! altitudes REAL :: XLES_ZS ! mean orography @@ -670,8 +671,8 @@ INTEGER, POINTER :: NLES_DTCOUNT=>NULL() INTEGER, POINTER :: NLES_TCOUNT=>NULL() INTEGER, POINTER :: NSPECTRA_NI=>NULL() INTEGER, POINTER :: NSPECTRA_NJ=>NULL() -REAL, DIMENSION(:,:), POINTER :: XLES_DATIME=>NULL() -REAL, DIMENSION(:,:), POINTER :: XLES_TRAJT=>NULL() +type(date_time), dimension(:), pointer :: xles_dates => null() +real, dimension(:), pointer :: xles_times => null() REAL, DIMENSION(:), POINTER :: XLES_Z=>NULL() REAL, POINTER :: XLES_ZS=>NULL() REAL, DIMENSION(:,:,:), POINTER :: XCOEFLIN_LES=>NULL() @@ -1099,8 +1100,8 @@ SUBROUTINE LES_GOTO_MODEL(KFROM, KTO) INTEGER, INTENT(IN) :: KFROM, KTO ! ! Save current state for allocated arrays -LES_MODEL(KFROM)%XLES_DATIME=>XLES_DATIME -LES_MODEL(KFROM)%XLES_TRAJT=>XLES_TRAJT +les_model(kfrom)%xles_dates=>xles_dates +les_model(kfrom)%xles_times=>xles_times LES_MODEL(KFROM)%XLES_Z=>XLES_Z LES_MODEL(KFROM)%XCOEFLIN_LES=>XCOEFLIN_LES LES_MODEL(KFROM)%NKLIN_LES=>NKLIN_LES @@ -1527,8 +1528,8 @@ NLES_DTCOUNT=>LES_MODEL(KTO)%NLES_DTCOUNT NLES_TCOUNT=>LES_MODEL(KTO)%NLES_TCOUNT NSPECTRA_NI=>LES_MODEL(KTO)%NSPECTRA_NI NSPECTRA_NJ=>LES_MODEL(KTO)%NSPECTRA_NJ -XLES_DATIME=>LES_MODEL(KTO)%XLES_DATIME -XLES_TRAJT=>LES_MODEL(KTO)%XLES_TRAJT +xles_dates=>les_model(kto)%xles_dates +xles_times=>les_model(kto)%xles_times XLES_Z=>LES_MODEL(KTO)%XLES_Z XLES_ZS=>LES_MODEL(KTO)%XLES_ZS XCOEFLIN_LES=>LES_MODEL(KTO)%XCOEFLIN_LES diff --git a/src/MNH/modd_seriesn.f90 b/src/MNH/modd_seriesn.f90 index 0078ed222..03ab9f206 100644 --- a/src/MNH/modd_seriesn.f90 +++ b/src/MNH/modd_seriesn.f90 @@ -1,13 +1,8 @@ -!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1998-2019 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 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$ -! NEC0 masdev4_7 2007/06/16 01:41:59 -!----------------------------------------------------------------- ! #################### MODULE MODD_SERIES_n ! #################### @@ -37,12 +32,15 @@ !! Original 29/01/98 !! Oct. 10,1998 (Lafore) adaptation of Diagnostics !! to the sequential nesting version +! P. Wautelet 13/09/2019: budget: simplify and modernize date/time management !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ ! USE MODD_PARAMETERS, ONLY: JPMODELMAX +use modd_type_date, only: date_time + IMPLICIT NONE TYPE SERIES_t @@ -68,8 +66,7 @@ TYPE SERIES_t REAL, DIMENSION(:,:,:,:,:,:), POINTER :: XSSERIES1=>NULL() ! 1st group: temporal serie (t) REAL, DIMENSION(:,:,:,:,:,:), POINTER :: XSSERIES2=>NULL() ! 2nd group:temporal serie (z,t) REAL, DIMENSION(:,:,:,:,:,:), POINTER :: XSSERIES3=>NULL() ! 3rd group:temporal serie (x,t) - REAL, DIMENSION(:,:) , POINTER :: XSTRAJT=>NULL() ! time trajectory - REAL, DIMENSION(:,:), POINTER :: XSDATIME=>NULL() ! Dates of exp, seg and current + type(date_time), dimension(:), pointer :: tpsdates => NULL() ! dates CHARACTER(LEN=50),DIMENSION(:),POINTER :: CSCOMMENT1=>NULL() ! strings ! associated with the 1st group CHARACTER(LEN=50),DIMENSION(:),POINTER :: CSCOMMENT2=>NULL() ! with the 2nd @@ -128,8 +125,7 @@ INTEGER, POINTER :: NSTEMP_SERIE3=>NULL() REAL, DIMENSION(:,:,:,:,:,:), POINTER :: XSSERIES1=>NULL() REAL, DIMENSION(:,:,:,:,:,:), POINTER :: XSSERIES2=>NULL() REAL, DIMENSION(:,:,:,:,:,:), POINTER :: XSSERIES3=>NULL() -REAL, DIMENSION(:,:), POINTER :: XSTRAJT=>NULL() -REAL, DIMENSION(:,:), POINTER :: XSDATIME=>NULL() +type(date_time), dimension(:), pointer :: tpsdates => NULL() CHARACTER(LEN=50),DIMENSION(:),POINTER :: CSCOMMENT1=>NULL() CHARACTER(LEN=50),DIMENSION(:),POINTER :: CSCOMMENT2=>NULL() CHARACTER(LEN=50),DIMENSION(:),POINTER :: CSCOMMENT3=>NULL() @@ -175,8 +171,7 @@ ENDIF SERIES_MODEL(KFROM)%XSSERIES1=>XSSERIES1 SERIES_MODEL(KFROM)%XSSERIES2=>XSSERIES2 SERIES_MODEL(KFROM)%XSSERIES3=>XSSERIES3 -SERIES_MODEL(KFROM)%XSTRAJT=>XSTRAJT -SERIES_MODEL(KFROM)%XSDATIME=>XSDATIME +series_model(kfrom)%tpsdates=>tpsdates SERIES_MODEL(KFROM)%CSCOMMENT1=>CSCOMMENT1 SERIES_MODEL(KFROM)%CSCOMMENT2=>CSCOMMENT2 SERIES_MODEL(KFROM)%CSCOMMENT3=>CSCOMMENT3 @@ -215,8 +210,7 @@ NSTEMP_SERIE3=>SERIES_MODEL(KTO)%NSTEMP_SERIE3 XSSERIES1=>SERIES_MODEL(KTO)%XSSERIES1 XSSERIES2=>SERIES_MODEL(KTO)%XSSERIES2 XSSERIES3=>SERIES_MODEL(KTO)%XSSERIES3 -XSTRAJT=>SERIES_MODEL(KTO)%XSTRAJT -XSDATIME=>SERIES_MODEL(KTO)%XSDATIME +tpsdates=>series_model(kto)%tpsdates CSCOMMENT1=>SERIES_MODEL(KTO)%CSCOMMENT1 CSCOMMENT2=>SERIES_MODEL(KTO)%CSCOMMENT2 CSCOMMENT3=>SERIES_MODEL(KTO)%CSCOMMENT3 diff --git a/src/MNH/modd_type_profiler.f90 b/src/MNH/modd_type_profiler.f90 index 944e44307..ed00d4799 100644 --- a/src/MNH/modd_type_profiler.f90 +++ b/src/MNH/modd_type_profiler.f90 @@ -1,13 +1,8 @@ -!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2002-2019 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 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: /home/cvsroot/MNH-VX-Y-Z/src/MNH/modd_type_profiler.f90,v $ $Revision: 1.2.4.1.2.1.10.2.2.1 $ -! MASDEV4_7 modd 2006/06/27 12:27:06 -!----------------------------------------------------------------- ! ############################ MODULE MODD_TYPE_PROFILER ! ############################ @@ -22,9 +17,7 @@ !! !!** IMPLICIT ARGUMENTS !! ------------------ -!! NONE !! -IMPLICIT NONE !! !! REFERENCE !! --------- @@ -37,13 +30,16 @@ IMPLICIT NONE !! ------------- !! Original 15/01/02 !! C.Lac 10/2016 Add visibility diagnostic +! P. Wautelet 13/09/2019: budget: simplify and modernize date/time management !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ ! -! -! +use modd_type_date, only: date_time + +implicit none + TYPE PROFILER ! ! @@ -61,8 +57,8 @@ REAL :: STEP ! storage time step CHARACTER(LEN=8),DIMENSION(:), POINTER :: NAME=>NULL() ! station name CHARACTER(LEN=8),DIMENSION(:), POINTER :: TYPE=>NULL() ! station type ! -REAL, DIMENSION(:), POINTER :: TIME=>NULL() ! t(n) (n: recording instants) -LOGICAL, DIMENSION(:), POINTER :: ERROR=>NULL() +type(date_time), dimension(:), pointer :: tpdates => NULL() ! dates(n) (n: recording instants) +LOGICAL, DIMENSION(:), POINTER :: ERROR=>NULL() REAL, DIMENSION(:), POINTER :: X=>NULL() ! X(n) REAL, DIMENSION(:), POINTER :: Y=>NULL() ! Y(n) REAL, DIMENSION(:), POINTER :: LON=>NULL() ! longitude(n) @@ -70,7 +66,7 @@ REAL, DIMENSION(:), POINTER :: LAT=>NULL() ! latitude (n) REAL, DIMENSION(:), POINTER :: ALT=>NULL() ! altitude (n) REAL, DIMENSION(:,:,:), POINTER :: ZON=>NULL() ! zonal wind(n) REAL, DIMENSION(:,:,:), POINTER :: MER=>NULL() ! meridian wind(n) -REAL, DIMENSION(:,:,:), POINTER :: FF=>NULL() ! wind intensity +REAL, DIMENSION(:,:,:), POINTER :: FF=>NULL() ! wind intensity REAL, DIMENSION(:,:,:), POINTER :: DD=>NULL() ! wind direction REAL, DIMENSION(:,:,:), POINTER :: W=>NULL() ! w(n) (air vertical speed) REAL, DIMENSION(:,:,:), POINTER :: P=>NULL() ! p(n) @@ -85,7 +81,6 @@ REAL, DIMENSION(:,:,:), POINTER :: RHOD=>NULL() ! density of dry air/moist REAL, DIMENSION(:,:,:,:), POINTER :: R=>NULL() ! r*(n) REAL, DIMENSION(:,:,:,:), POINTER :: SV=>NULL() ! Sv*(n) REAL, DIMENSION(:,:,:,:), POINTER :: AER=>NULL() ! AER*(n) aerosol extinction -REAL, DIMENSION(:,:), POINTER :: DATIME=>NULL() ! record for diachro ! REAL, DIMENSION(:,:), POINTER :: T2M=>NULL() ! 2 m air temperature (°C) REAL, DIMENSION(:,:), POINTER :: Q2M=>NULL() ! 2 m humidity (kg/kg) diff --git a/src/MNH/modd_type_station.f90 b/src/MNH/modd_type_station.f90 index 462358f2d..3456ac2d2 100644 --- a/src/MNH/modd_type_station.f90 +++ b/src/MNH/modd_type_station.f90 @@ -1,8 +1,9 @@ -!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2002-2019 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 version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. -! ######spl +!----------------------------------------------------------------- +! ############################ MODULE MODD_TYPE_STATION ! ############################ ! @@ -28,12 +29,17 @@ !! MODIFICATIONS !! ------------- !! Original 15/01/02 +! P. Wautelet 13/09/2019: budget: simplify and modernize date/time management !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ ! ! +use modd_type_date, only: date_time + +implicit none + TYPE STATION ! ! @@ -50,8 +56,8 @@ REAL :: STEP ! storage time step ! CHARACTER(LEN=8),DIMENSION(:), POINTER :: NAME=>NULL() ! station name CHARACTER(LEN=8),DIMENSION(:), POINTER :: TYPE=>NULL() ! station type -REAL, DIMENSION(:), POINTER :: TIME=>NULL() ! t(n) (n: recording instants) -LOGICAL, DIMENSION(:), POINTER :: ERROR=>NULL() ! +type(date_time), dimension(:), pointer :: tpdates => NULL() ! dates(n) (n: recording instants) +LOGICAL, DIMENSION(:), POINTER :: ERROR=>NULL() ! REAL, DIMENSION(:), POINTER :: X=>NULL() ! X(n) REAL, DIMENSION(:), POINTER :: Y=>NULL() ! Y(n) REAL, DIMENSION(:), POINTER :: Z=>NULL() ! Z(n) @@ -67,7 +73,6 @@ REAL, DIMENSION(:,:,:), POINTER :: R=>NULL() ! r*(n) REAL, DIMENSION(:,:,:), POINTER :: SV=>NULL() ! Sv*(n) REAL, DIMENSION(:), POINTER :: ZS=>NULL() ! zs(n) REAL, DIMENSION(:,:), POINTER :: TSRAD=>NULL() ! Ts(n) -REAL, DIMENSION(:,:), POINTER :: DATIME=>NULL() ! record for diachro ! REAL, DIMENSION(:,:), POINTER :: T2M=>NULL() ! REAL, DIMENSION(:,:), POINTER :: Q2M=>NULL() ! diff --git a/src/MNH/mode_les_diachro.f90 b/src/MNH/mode_les_diachro.f90 index 225d99041..ec13c0303 100644 --- a/src/MNH/mode_les_diachro.f90 +++ b/src/MNH/mode_les_diachro.f90 @@ -6,13 +6,22 @@ ! Modifications ! G. TANGUY 19/05/2014 : correctoin DATIME in case of time average ! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O +! P. Wautelet 13/09/2019: budget: simplify and modernize date/time management !----------------------------------------------------------------- !####################### MODULE MODE_LES_DIACHRO !####################### -! + USE MODD_LUNIT -! +use modd_les_n, only: xles_dates, xles_times + +implicit none + +private + +public :: LES_DIACHRO, LES_DIACHRO_2PT, LES_DIACHRO_MASKS, LES_DIACHRO_SPEC, & + LES_DIACHRO_SURF, LES_DIACHRO_SURF_SV, LES_DIACHRO_SV, LES_DIACHRO_SV_MASKS + CONTAINS ! !--------------------------------------------------------------------- @@ -477,8 +486,9 @@ SUBROUTINE LES_Z_NORM(OAVG,PTRAJZ,PWORK6) !* this subroutine interpolates the normalized field PWORK6 to the ! vertical normalized coordinate. ! -USE MODD_PARAMETERS, ONLY : XUNDEF, JPVEXT USE MODD_LES +USE MODD_PARAMETERS, ONLY: XUNDEF, JPVEXT +use modd_time, only: tdtseg ! USE MODI_COEF_VER_INTERP_LIN USE MODI_VER_INTERP_LIN @@ -515,8 +525,10 @@ REAL :: ZMAX_NORM_M !* normalization height (usually maximum BL height) ! IF (OAVG) THEN - ITEMP_MEAN_START = COUNT( XLES_CURRENT_TRAJT(:,1)<=XLES_TEMP_MEAN_START ) + 1 - ITEMP_MEAN_END = COUNT( XLES_CURRENT_TRAJT(:,1)<=XLES_TEMP_MEAN_END ) + + ITEMP_MEAN_START = COUNT( xles_times(:)<=XLES_TEMP_MEAN_START ) + 1 + ITEMP_MEAN_END = COUNT( xles_times(:)<=XLES_TEMP_MEAN_END ) + IF (ITEMP_MEAN_START > ITEMP_MEAN_END) THEN ITEMP_MEAN_START = 1 ITEMP_MEAN_END = NLES_CURRENT_TIMES @@ -596,7 +608,7 @@ END SUBROUTINE LES_Z_NORM !------------------------------------------------------------------------------ ! !######################################################## -SUBROUTINE LES_TIME_AVG(PTRAJT,PWORK6,KRESP,PDATIME_AVG) +SUBROUTINE LES_TIME_AVG(PWORK6,tpdates,KRESP) !######################################################## ! ! this routine computes time averaging @@ -604,16 +616,16 @@ SUBROUTINE LES_TIME_AVG(PTRAJT,PWORK6,KRESP,PDATIME_AVG) ! Modifications: ! 03/2018 (P.Wautelet) replace ADD_FORECAST_TO_DATE by DATETIME_CORRECTDATE ! +use modd_time, only: tdtseg USE MODD_LES -USE MODD_TYPE_DATE +USE MODD_TYPE_DATE, only: date_time ! -USE MODE_DATETIME +use mode_datetime, only: Datetime_correctdate ! IMPLICIT NONE ! -REAL, DIMENSION(:,:), POINTER :: PTRAJT ! time -REAL, DIMENSION(:,:), POINTER :: PDATIME_AVG ! date REAL, DIMENSION(:,:,:,:,:,:), POINTER :: PWORK6 ! contains physical field +type(date_time), dimension(:), allocatable, intent(inout) :: tpdates INTEGER, INTENT(OUT) :: KRESP ! return code (0 is OK) !------------------------------------------------------------------------------ INTEGER :: JT ! time counter @@ -628,8 +640,6 @@ INTEGER :: JP ! process loop counter INTEGER :: JSV ! scalar loop counter INTEGER :: JX ! first spatial or spectral coordinate loop counter INTEGER :: JY ! second spatial or spectral coordinate loop counter -REAL, DIMENSION(16) :: ZDATIME_SAVE ! date -TYPE(DATE_TIME) :: TZDATE !------------------------------------------------------------------------------ ! IF ( XLES_TEMP_MEAN_END==XUNDEF & @@ -645,29 +655,13 @@ IF (IAVG<=0) THEN RETURN END IF ! -ZDATIME_SAVE(:)=PDATIME_AVG(:,1) -DEALLOCATE(PTRAJT) -DEALLOCATE(PDATIME_AVG) +deallocate( tpdates ) ! -ALLOCATE (PTRAJT(IAVG,1)) -ALLOCATE (PDATIME_AVG(16,IAVG)) +allocate( tpdates( iavg ) ) ALLOCATE (ZWORK6(SIZE(PWORK6,1),SIZE(PWORK6,2),NLES_K,IAVG,SIZE(PWORK6,5),SIZE(PWORK6,6))) ! ZWORK6(:,:,:,:,:,:) = 0. ! -PDATIME_AVG(1,:)=ZDATIME_SAVE(1) -PDATIME_AVG(2,:)=ZDATIME_SAVE(2) -PDATIME_AVG(3,:)=ZDATIME_SAVE(3) -PDATIME_AVG(4,:)=ZDATIME_SAVE(4) -PDATIME_AVG(5,:)=ZDATIME_SAVE(5) -PDATIME_AVG(6,:)=ZDATIME_SAVE(6) -PDATIME_AVG(7,:)=ZDATIME_SAVE(7) -PDATIME_AVG(8,:)=ZDATIME_SAVE(8) -PDATIME_AVG(9,:)=ZDATIME_SAVE(9) -PDATIME_AVG(10,:)=ZDATIME_SAVE(10) -PDATIME_AVG(11,:)=ZDATIME_SAVE(11) -PDATIME_AVG(12,:)=ZDATIME_SAVE(12) -! DO JAVG=1,IAVG ZLES_TEMP_MEAN_START=XLES_TEMP_MEAN_START + (JAVG-1) * XLES_TEMP_MEAN_STEP ZLES_TEMP_MEAN_END =MIN(XLES_TEMP_MEAN_END, ZLES_TEMP_MEAN_START + XLES_TEMP_MEAN_STEP) @@ -679,8 +673,8 @@ DO JAVG=1,IAVG DO JX=1,SIZE(PWORK6,1) ITIME=0 DO JT=1,NLES_CURRENT_TIMES - IF ( XLES_CURRENT_TRAJT(JT,1) >= ZLES_TEMP_MEAN_START .AND. & - XLES_CURRENT_TRAJT(JT,1) <= ZLES_TEMP_MEAN_END) THEN + IF ( xles_times(JT) >= ZLES_TEMP_MEAN_START .AND. & + xles_times(JT) <= ZLES_TEMP_MEAN_END ) THEN IF (PWORK6(JX,JY,JK,JT,JSV,JP) /= XUNDEF) THEN ZWORK6(JX,JY,JK,JAVG,JSV,JP) = ZWORK6(JX,JY,JK,JAVG,JSV,JP) & + PWORK6(JX,JY,JK,JT,JSV,JP) @@ -693,23 +687,19 @@ DO JAVG=1,IAVG ZWORK6(JX,JY,JK,JAVG,JSV,JP) / ITIME END IF IF (ITIME == 0) THEN - ZWORK6(JX,JY,JK,JAVG,JSV,JP)= XUNDEF + ZWORK6(JX,JY,JK,JAVG,JSV,JP)= XUNDEF END IF END DO END DO END DO END DO END DO - PTRAJT(JAVG,1)=(ZLES_TEMP_MEAN_START+ZLES_TEMP_MEAN_END)/2. - TZDATE%TDATE%YEAR = PDATIME_AVG(5,JAVG) - TZDATE%TDATE%MONTH = PDATIME_AVG(6,JAVG) - TZDATE%TDATE%DAY = PDATIME_AVG(7,JAVG) - TZDATE%TIME = PDATIME_AVG(8,JAVG)+PTRAJT(JAVG,1) - CALL DATETIME_CORRECTDATE(TZDATE) - PDATIME_AVG(13,JAVG) = TZDATE%TDATE%YEAR - PDATIME_AVG(14,JAVG) = TZDATE%TDATE%MONTH - PDATIME_AVG(15,JAVG) = TZDATE%TDATE%DAY - PDATIME_AVG(16,JAVG) = TZDATE%TIME + + tpdates(javg )%tdate%year = tdtseg%tdate%year + tpdates(javg )%tdate%month = tdtseg%tdate%month + tpdates(javg )%tdate%day = tdtseg%tdate%day + tpdates(javg )%time = tdtseg%time + ( zles_temp_mean_start + zles_temp_mean_end ) / 2. + call Datetime_correctdate( tpdates(javg ) ) END DO ! DEALLOCATE(PWORK6) @@ -726,9 +716,11 @@ END SUBROUTINE LES_TIME_AVG SUBROUTINE LES_DIACHRO(TPDIAFILE,HGROUP,HCOMMENT,HUNIT,PFIELD,HAVG) !######################################################## ! -USE MODD_IO, ONLY: TFILEDATA -USE MODD_LES USE MODD_GRID +USE MODD_IO, ONLY: TFILEDATA +USE MODD_LES +use modd_type_date, only: date_time + USE MODE_WRITE_DIACHRO, only: WRITE_DIACHRO ! IMPLICIT NONE @@ -748,8 +740,6 @@ CHARACTER(LEN=1), INTENT(IN) :: HAVG ! flag to compute avg. REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTRAJX ! localization of the temporal REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTRAJY ! series in x,y and z. remark: REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTRAJZ ! x and y are not used for LES -REAL, DIMENSION(:,:), POINTER :: ZTRAJT ! time -REAL, DIMENSION(:,:), POINTER :: ZDATIME ! date ! INTEGER, DIMENSION(1) :: IGRID ! grid indicator CHARACTER(LEN= 10) :: YGROUP ! group title @@ -769,6 +759,7 @@ INTEGER :: JK ! vertical loop counter ! LOGICAL :: GAVG ! flag to compute time averagings LOGICAL :: GNORM ! flag to compute normalizations +type(date_time), dimension(:), allocatable :: tzdates ! !------------------------------------------------------------------------------- ! @@ -788,8 +779,7 @@ ALLOCATE (ZTRAJY(1,1,1)) ALLOCATE (ZTRAJZ(NLES_K,1,1)) ! ALLOCATE(ZWORK6(1,1,NLES_K,NLES_CURRENT_TIMES,1,1)) -ALLOCATE(ZTRAJT(NLES_CURRENT_TIMES,1)) -ALLOCATE(ZDATIME(16,NLES_CURRENT_TIMES)) +allocate( tzdates( NLES_CURRENT_TIMES ) ) ! IIL = NLES_CURRENT_IINF IIH = NLES_CURRENT_ISUP @@ -809,8 +799,7 @@ YUNIT (1) = HUNIT YGROUP = HGROUP ! ZWORK6(1,1,:,:,1,1) = ZFIELD (:,:) -ZTRAJT(:,:) = XLES_CURRENT_TRAJT(:,:) -ZDATIME(:,:)=XLES_CURRENT_DATIME(:,:) +tzdates(:) = xles_dates(:) ! !* normalization of vertical dimension ! @@ -822,7 +811,7 @@ END IF !* time average ! IRESP = 0 -IF (GAVG) CALL LES_TIME_AVG(ZTRAJT,ZWORK6,IRESP,ZDATIME) +IF (GAVG) CALL LES_TIME_AVG( ZWORK6, tzdates, IRESP ) ! IF (HAVG/=' ') YGROUP=HAVG//'_'//YGROUP YTITLE(1) = YGROUP @@ -831,10 +820,11 @@ YTITLE(1) = YGROUP ! ---------------------- ! IF (IRESP==0 .AND. ANY(ZWORK6/=XUNDEF)) & -CALL WRITE_DIACHRO(TPDIAFILE,TLUOUT0,YGROUP,"SSOL",IGRID,ZDATIME, ZWORK6, & - ZTRAJT,YTITLE,YUNIT,YCOMMENT,.FALSE.,.FALSE.,.FALSE., & - IIL,IIH,IJL,IJH,IKL,IKH, & - PTRAJX=ZTRAJX,PTRAJY=ZTRAJY,PTRAJZ=ZTRAJZ ) +CALL WRITE_DIACHRO( TPDIAFILE, TLUOUT0, YGROUP, "SSOL", IGRID, tzdates, & + ZWORK6, YTITLE, YUNIT, YCOMMENT, & + OICP = .FALSE., OJCP = .FALSE., OKCP = .FALSE., & + KIL = IIL, KIH = IIH, KJL = IJL, KJH = IJH, KKL = IKL, KKH = IKH, & + PTRAJX = ZTRAJX, PTRAJY = ZTRAJY, PTRAJZ = ZTRAJZ ) ! ! !* 3.0 Deallocations @@ -843,9 +833,8 @@ CALL WRITE_DIACHRO(TPDIAFILE,TLUOUT0,YGROUP,"SSOL",IGRID,ZDATIME, ZWORK6, & DEALLOCATE (ZTRAJX) DEALLOCATE (ZTRAJY) DEALLOCATE (ZTRAJZ) -DEALLOCATE (ZTRAJT) DEALLOCATE (ZWORK6) -DEALLOCATE (ZDATIME) +deallocate( tzdates ) ! !------------------------------------------------------------------------------- END SUBROUTINE LES_DIACHRO @@ -854,10 +843,12 @@ END SUBROUTINE LES_DIACHRO SUBROUTINE LES_DIACHRO_SV(TPDIAFILE,HGROUP,HCOMMENT,HUNIT,PFIELD,HAVG) !########################################################### ! -USE MODD_IO, ONLY: TFILEDATA -USE MODD_LES USE MODD_GRID -USE MODI_WRITE_DIACHRO +USE MODD_IO, ONLY: TFILEDATA +USE MODD_LES +use modd_type_date, only: date_time + +USE MODE_WRITE_DIACHRO ! IMPLICIT NONE ! @@ -876,8 +867,6 @@ CHARACTER(LEN=1), INTENT(IN) :: HAVG ! flag to compute avg. REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTRAJX ! localization of the temporal REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTRAJY ! series in x,y and z. remark: REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTRAJZ ! x and y are not used for LES -REAL, DIMENSION(:,:), POINTER :: ZTRAJT ! time -REAL, DIMENSION(:,:), POINTER :: ZDATIME ! date ! INTEGER, DIMENSION(1) :: IGRID ! grid indicator CHARACTER(LEN= 10) :: YGROUP ! group title @@ -897,6 +886,7 @@ INTEGER :: JSV ! scalar loop counter ! LOGICAL :: GAVG ! flag to compute time averagings LOGICAL :: GNORM ! flag to compute normalizations +type(date_time), dimension(:), allocatable :: tzdates ! !------------------------------------------------------------------------------- ! @@ -915,8 +905,7 @@ ALLOCATE (ZTRAJX(1,1,SIZE(PFIELD,3))) ALLOCATE (ZTRAJY(1,1,SIZE(PFIELD,3))) ALLOCATE (ZTRAJZ(NLES_K,1,SIZE(PFIELD,3))) ALLOCATE(ZWORK6(1,1,NLES_K,NLES_CURRENT_TIMES,SIZE(PFIELD,3),1)) -ALLOCATE(ZTRAJT(NLES_CURRENT_TIMES,1)) -ALLOCATE(ZDATIME(16,NLES_CURRENT_TIMES)) +allocate( tzdates( NLES_CURRENT_TIMES ) ) ! IIL = NLES_CURRENT_IINF IIH = NLES_CURRENT_ISUP @@ -936,8 +925,7 @@ YUNIT (1) = HUNIT YGROUP = HGROUP ! ZWORK6(1,1,:,:,:,1) = ZFIELD (:,:,:) -ZTRAJT(:,:) = XLES_CURRENT_TRAJT(:,:) -ZDATIME(:,:)=XLES_CURRENT_DATIME(:,:) +tzdates(:) = xles_dates(:) ! IF (GNORM) THEN IF (HUNIT(1:1)/=' ') YUNIT='-' @@ -947,7 +935,7 @@ END IF !* time average ! IRESP = 0 -IF (GAVG) CALL LES_TIME_AVG(ZTRAJT,ZWORK6,IRESP,ZDATIME) +IF (GAVG) CALL LES_TIME_AVG( ZWORK6, tzdates, IRESP ) ! IF (HAVG/=' ') YGROUP=HAVG//'_'//YGROUP YTITLE(1) = YGROUP @@ -957,10 +945,11 @@ YTITLE(1) = YGROUP ! ! IF (IRESP==0 .AND. ANY(ZWORK6/=XUNDEF)) & -CALL WRITE_DIACHRO(TPDIAFILE,TLUOUT0,YGROUP,"SSOL",IGRID,ZDATIME, ZWORK6, & - ZTRAJT,YTITLE,YUNIT,YCOMMENT,.FALSE.,.FALSE.,.FALSE., & - IIL,IIH,IJL,IJH,IKL,IKH, & - PTRAJX=ZTRAJX,PTRAJY=ZTRAJY,PTRAJZ=ZTRAJZ ) +CALL WRITE_DIACHRO( TPDIAFILE, TLUOUT0, YGROUP, "SSOL", IGRID, tzdates, & + ZWORK6, YTITLE, YUNIT, YCOMMENT, & + OICP = .FALSE., OJCP = .FALSE., OKCP = .FALSE., & + KIL = IIL, KIH = IIH, KJL = IJL, KJH = IJH, KKL = IKL, KKH = IKH, & + PTRAJX = ZTRAJX, PTRAJY = ZTRAJY, PTRAJZ = ZTRAJZ ) ! ! !* 3.0 Deallocations @@ -969,9 +958,8 @@ CALL WRITE_DIACHRO(TPDIAFILE,TLUOUT0,YGROUP,"SSOL",IGRID,ZDATIME, ZWORK6, & DEALLOCATE (ZTRAJX) DEALLOCATE (ZTRAJY) DEALLOCATE (ZTRAJZ) -DEALLOCATE (ZTRAJT) DEALLOCATE(ZWORK6) -DEALLOCATE(ZDATIME) +deallocate( tzdates ) ! !------------------------------------------------------------------------------- END SUBROUTINE LES_DIACHRO_SV @@ -980,10 +968,12 @@ END SUBROUTINE LES_DIACHRO_SV SUBROUTINE LES_DIACHRO_MASKS(TPDIAFILE,HGROUP,HTITLE,HCOMMENT,HUNIT,PFIELD,HAVG) !##################################################################### ! +USE MODD_GRID USE MODD_IO, ONLY: TFILEDATA USE MODD_LES -USE MODD_GRID -USE MODI_WRITE_DIACHRO +use modd_type_date, only: date_time + +USE MODE_WRITE_DIACHRO ! IMPLICIT NONE ! @@ -1003,8 +993,6 @@ CHARACTER(LEN=1), INTENT(IN) :: HAVG ! flag to compute avg REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTRAJX ! localization of the temporal REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTRAJY ! series in x,y and z. remark: REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTRAJZ ! x and y are not used for LES -REAL, DIMENSION(:,:), POINTER :: ZTRAJT ! time -REAL, DIMENSION(:,:), POINTER :: ZDATIME ! date ! INTEGER, DIMENSION(SIZE(PFIELD,3)) :: IGRID ! grid indicator CHARACTER(LEN= 10) :: YGROUP ! group title @@ -1024,6 +1012,7 @@ INTEGER :: JMASK ! Mask loop counter ! LOGICAL :: GAVG ! flag to compute time averagings LOGICAL :: GNORM ! flag to compute normalizations +type(date_time), dimension(:), allocatable :: tzdates ! !------------------------------------------------------------------------------- ! @@ -1042,9 +1031,7 @@ ALLOCATE (ZTRAJX(1,1,1)) ALLOCATE (ZTRAJY(1,1,1)) ALLOCATE (ZTRAJZ(NLES_K,1,1)) ALLOCATE(ZWORK6(1,1,NLES_K,NLES_CURRENT_TIMES,1,SIZE(PFIELD,3))) -ALLOCATE(ZTRAJT(NLES_CURRENT_TIMES,1)) -ALLOCATE(ZDATIME(16,NLES_CURRENT_TIMES)) - +allocate( tzdates( NLES_CURRENT_TIMES ) ) ! IIL = NLES_CURRENT_IINF IIH = NLES_CURRENT_ISUP @@ -1065,9 +1052,7 @@ YUNIT (:) = HUNIT YGROUP = HGROUP ! ZWORK6(1,1,:,:,1,:) = ZFIELD (:,:,:) -ZTRAJT(:,:) = XLES_CURRENT_TRAJT(:,:) -ZDATIME(:,:)= XLES_CURRENT_DATIME(:,:) - +tzdates(:) = xles_dates(:) ! IF (GNORM) THEN IF (HUNIT(1:1)/=' ') YUNIT='-' @@ -1078,7 +1063,7 @@ END IF !* time average ! IRESP = 0 -IF (GAVG) CALL LES_TIME_AVG(ZTRAJT,ZWORK6,IRESP,ZDATIME) +IF (GAVG) CALL LES_TIME_AVG( ZWORK6, tzdates, IRESP ) ! IF (HAVG/=' ') YGROUP=HAVG//'_'//YGROUP YTITLE (:) = YGROUP//HTITLE(:) @@ -1088,10 +1073,11 @@ YTITLE (:) = YGROUP//HTITLE(:) ! ---------------------- ! IF (IRESP==0 .AND. ANY(ZWORK6/=XUNDEF)) & -CALL WRITE_DIACHRO(TPDIAFILE,TLUOUT0,YGROUP,"SSOL",IGRID,ZDATIME, ZWORK6, & - ZTRAJT,YTITLE,YUNIT,YCOMMENT,.FALSE.,.FALSE.,.FALSE., & - IIL,IIH,IJL,IJH,IKL,IKH, & - PTRAJX=ZTRAJX,PTRAJY=ZTRAJY,PTRAJZ=ZTRAJZ ) +CALL WRITE_DIACHRO( TPDIAFILE, TLUOUT0, YGROUP, "SSOL", IGRID, tzdates, & + ZWORK6, YTITLE, YUNIT, YCOMMENT, & + OICP = .FALSE., OJCP = .FALSE., OKCP = .FALSE., & + KIL = IIL, KIH = IIH, KJL = IJL, KJH = IJH, KKL = IKL, KKH = IKH, & + PTRAJX = ZTRAJX, PTRAJY = ZTRAJY, PTRAJZ = ZTRAJZ ) ! ! !* 3.0 Deallocations @@ -1100,9 +1086,8 @@ CALL WRITE_DIACHRO(TPDIAFILE,TLUOUT0,YGROUP,"SSOL",IGRID,ZDATIME, ZWORK6, & DEALLOCATE (ZTRAJX) DEALLOCATE (ZTRAJY) DEALLOCATE (ZTRAJZ) -DEALLOCATE (ZTRAJT) DEALLOCATE(ZWORK6) -DEALLOCATE(ZDATIME) +deallocate( tzdates ) ! !------------------------------------------------------------------------------- END SUBROUTINE LES_DIACHRO_MASKS @@ -1111,10 +1096,12 @@ END SUBROUTINE LES_DIACHRO_MASKS SUBROUTINE LES_DIACHRO_SV_MASKS(TPDIAFILE,HGROUP,HTITLE,HCOMMENT,HUNIT,PFIELD,HAVG) !######################################################################## ! -USE MODD_IO, ONLY: TFILEDATA -USE MODD_LES USE MODD_GRID -USE MODI_WRITE_DIACHRO +USE MODD_IO, ONLY: TFILEDATA +USE MODD_LES +use modd_type_date, only: date_time + +USE MODE_WRITE_DIACHRO ! IMPLICIT NONE ! @@ -1134,8 +1121,6 @@ CHARACTER(LEN=1), INTENT(IN) :: HAVG ! flag to compute a REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTRAJX ! localization of the temporal REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTRAJY ! series in x,y and z. remark: REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTRAJZ ! x and y are not used for LES -REAL, DIMENSION(:,:), POINTER :: ZTRAJT ! time -REAL, DIMENSION(:,:), POINTER :: ZDATIME! date ! INTEGER, DIMENSION(SIZE(PFIELD,3)) :: IGRID ! grid indicator CHARACTER(LEN= 10) :: YGROUP ! group title @@ -1157,6 +1142,7 @@ INTEGER :: JMASK ! mask loop counter ! LOGICAL :: GAVG ! flag to compute time averagings LOGICAL :: GNORM ! flag to compute normalizations +type(date_time), dimension(:), allocatable :: tzdates ! !------------------------------------------------------------------------------- ! @@ -1175,8 +1161,7 @@ ALLOCATE (ZTRAJX(1,1,SIZE(PFIELD,4))) ALLOCATE (ZTRAJY(1,1,SIZE(PFIELD,4))) ALLOCATE (ZTRAJZ(NLES_K,1,SIZE(PFIELD,4))) ALLOCATE(ZWORK6(1,1,NLES_K,NLES_CURRENT_TIMES,SIZE(PFIELD,4),SIZE(PFIELD,3))) -ALLOCATE(ZTRAJT(NLES_CURRENT_TIMES,1)) -ALLOCATE(ZDATIME(16,NLES_CURRENT_TIMES)) +allocate( tzdates( NLES_CURRENT_TIMES ) ) ! IIL = NLES_CURRENT_IINF IIH = NLES_CURRENT_ISUP @@ -1201,8 +1186,7 @@ DO JSV=1,SIZE(PFIELD,4) ZWORK6(1,1,:,:,JSV,JP) = ZFIELD (:,:,JP,JSV) END DO END DO -ZTRAJT(:,:) = XLES_CURRENT_TRAJT(:,:) -ZDATIME(:,:)= XLES_CURRENT_DATIME(:,:) +tzdates(:) = xles_dates(:) ! IF (GNORM) THEN IF (HUNIT(1:1)/=' ') YUNIT='-' @@ -1213,7 +1197,7 @@ END IF !* time average ! IRESP = 0 -IF (GAVG) CALL LES_TIME_AVG(ZTRAJT,ZWORK6,IRESP,ZDATIME) +IF (GAVG) CALL LES_TIME_AVG( ZWORK6, tzdates, IRESP ) ! IF (HAVG/=' ') YGROUP=HAVG//'_'//YGROUP YTITLE (:) = YGROUP//HTITLE(:) @@ -1223,10 +1207,11 @@ YTITLE (:) = YGROUP//HTITLE(:) ! ! IF (IRESP==0 .AND. ANY(ZWORK6/=XUNDEF)) & -CALL WRITE_DIACHRO(TPDIAFILE,TLUOUT0,YGROUP,"SSOL",IGRID,ZDATIME, ZWORK6, & - ZTRAJT,YTITLE,YUNIT,YCOMMENT,.FALSE.,.FALSE.,.FALSE., & - IIL,IIH,IJL,IJH,IKL,IKH, & - PTRAJX=ZTRAJX,PTRAJY=ZTRAJY,PTRAJZ=ZTRAJZ ) +CALL WRITE_DIACHRO( TPDIAFILE, TLUOUT0, YGROUP, "SSOL", IGRID, tzdates, & + ZWORK6, YTITLE, YUNIT, YCOMMENT, & + OICP = .FALSE., OJCP = .FALSE., OKCP = .FALSE., & + KIL = IIL, KIH = IIH, KJL = IJL, KJH = IJH, KKL = IKL, KKH = IKH, & + PTRAJX = ZTRAJX, PTRAJY = ZTRAJY, PTRAJZ = ZTRAJZ ) ! ! !* 3.0 Deallocations @@ -1235,9 +1220,8 @@ CALL WRITE_DIACHRO(TPDIAFILE,TLUOUT0,YGROUP,"SSOL",IGRID,ZDATIME, ZWORK6, & DEALLOCATE (ZTRAJX) DEALLOCATE (ZTRAJY) DEALLOCATE (ZTRAJZ) -DEALLOCATE (ZTRAJT) DEALLOCATE(ZWORK6) -DEALLOCATE(ZDATIME) +deallocate( tzdates ) ! !------------------------------------------------------------------------------- END SUBROUTINE LES_DIACHRO_SV_MASKS @@ -1247,10 +1231,12 @@ END SUBROUTINE LES_DIACHRO_SV_MASKS SUBROUTINE LES_DIACHRO_SURF(TPDIAFILE,HGROUP,HCOMMENT,HUNIT,PFIELD,HAVG) !############################################################# ! -USE MODD_IO, ONLY: TFILEDATA -USE MODD_LES USE MODD_GRID -USE MODI_WRITE_DIACHRO +USE MODD_IO, ONLY: TFILEDATA +USE MODD_LES +use modd_type_date, only: date_time + +USE MODE_WRITE_DIACHRO ! IMPLICIT NONE ! @@ -1270,8 +1256,6 @@ CHARACTER(LEN=1), INTENT(IN) :: HAVG ! flag to compute avg. REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTRAJX ! localization of the temporal REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTRAJY ! series in x,y and z. remark: REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTRAJZ ! x and y are not used for LES -REAL, DIMENSION(:,:), POINTER :: ZTRAJT ! time -REAL, DIMENSION(:,:), POINTER :: ZDATIME ! DATE ! INTEGER, DIMENSION(1) :: IGRID ! grid indicator CHARACTER(LEN= 10) :: YGROUP ! group title @@ -1287,6 +1271,7 @@ INTEGER :: IIL, IIH, IJL, IJH, IKL, IKH ! cartesian area relatively to the ! LOGICAL :: GAVG ! flag to compute time averagings LOGICAL :: GNORM ! flag to compute normalizations +type(date_time), dimension(:), allocatable :: tzdates !------------------------------------------------------------------------------- ! GAVG =(HAVG=='A' .OR. HAVG=='H') @@ -1304,8 +1289,7 @@ ALLOCATE (ZTRAJX(1,1,1)) ALLOCATE (ZTRAJY(1,1,1)) ALLOCATE (ZTRAJZ(1,1,1)) ALLOCATE(ZWORK6(1,1,1,NLES_CURRENT_TIMES,1,1)) -ALLOCATE(ZTRAJT(NLES_CURRENT_TIMES,1)) -ALLOCATE(ZDATIME(16,NLES_CURRENT_TIMES)) +allocate( tzdates( NLES_CURRENT_TIMES ) ) ! IIL = NLES_CURRENT_IINF IIH = NLES_CURRENT_ISUP @@ -1323,13 +1307,12 @@ YUNIT (1) = HUNIT YGROUP = HGROUP ! ZWORK6(1,1,1,:,1,1) = PFIELD (:) -ZTRAJT(:,:) = XLES_CURRENT_TRAJT(:,:) -ZDATIME(:,:)=XLES_CURRENT_DATIME(:,:) +tzdates(:) = xles_dates(:) ! !* time average ! IRESP = 0 -IF (GAVG) CALL LES_TIME_AVG(ZTRAJT,ZWORK6,IRESP,ZDATIME) +IF (GAVG) CALL LES_TIME_AVG( ZWORK6, tzdates, IRESP ) ! IF (HAVG/=' ') YGROUP=HAVG//'_'//YGROUP YTITLE(1) = HGROUP @@ -1338,10 +1321,11 @@ YTITLE(1) = HGROUP ! ---------------------- ! IF (IRESP==0) & -CALL WRITE_DIACHRO(TPDIAFILE,TLUOUT0,YGROUP,"SSOL",IGRID,ZDATIME, ZWORK6, & - ZTRAJT,YTITLE,YUNIT,YCOMMENT,.FALSE.,.FALSE.,.FALSE., & - IIL,IIH,IJL,IJH,IKL,IKH, & - PTRAJX=ZTRAJX,PTRAJY=ZTRAJY,PTRAJZ=ZTRAJZ ) +CALL WRITE_DIACHRO( TPDIAFILE, TLUOUT0, YGROUP, "SSOL", IGRID, tzdates, & + ZWORK6, YTITLE, YUNIT, YCOMMENT, & + OICP = .FALSE., OJCP = .FALSE., OKCP = .FALSE., & + KIL = IIL, KIH = IIH, KJL = IJL, KJH = IJH, KKL = IKL, KKH = IKH, & + PTRAJX = ZTRAJX, PTRAJY = ZTRAJY, PTRAJZ = ZTRAJZ ) ! ! !* 3.0 Deallocations @@ -1350,9 +1334,8 @@ CALL WRITE_DIACHRO(TPDIAFILE,TLUOUT0,YGROUP,"SSOL",IGRID,ZDATIME, ZWORK6, & DEALLOCATE (ZTRAJX) DEALLOCATE (ZTRAJY) DEALLOCATE (ZTRAJZ) -DEALLOCATE (ZTRAJT) DEALLOCATE(ZWORK6) -DEALLOCATE(ZDATIME) +deallocate( tzdates ) ! !------------------------------------------------------------------------------- END SUBROUTINE LES_DIACHRO_SURF @@ -1361,10 +1344,12 @@ END SUBROUTINE LES_DIACHRO_SURF SUBROUTINE LES_DIACHRO_SURF_SV(TPDIAFILE,HGROUP,HCOMMENT,HUNIT,PFIELD,HAVG) !################################################################ ! -USE MODD_IO, ONLY: TFILEDATA -USE MODD_LES USE MODD_GRID -USE MODI_WRITE_DIACHRO +USE MODD_IO, ONLY: TFILEDATA +USE MODD_LES +use modd_type_date, only: date_time + +USE MODE_WRITE_DIACHRO ! IMPLICIT NONE ! @@ -1383,8 +1368,6 @@ CHARACTER(LEN=1), INTENT(IN) :: HAVG ! flag to compute avg. REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTRAJX ! localization of the temporal REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTRAJY ! series in x,y and z. remark: REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTRAJZ ! x and y are not used for LES -REAL, DIMENSION(:,:), POINTER :: ZTRAJT ! time -REAL, DIMENSION(:,:), POINTER :: ZDATIME ! date INTEGER, DIMENSION(1) :: IGRID ! grid indicator CHARACTER(LEN= 10) :: YGROUP ! group title CHARACTER(LEN=100), DIMENSION(1) :: YCOMMENT ! comment string @@ -1399,6 +1382,7 @@ INTEGER :: IIL, IIH, IJL, IJH, IKL, IKH ! cartesian area relatively to the ! LOGICAL :: GAVG ! flag to compute time averagings LOGICAL :: GNORM ! flag to compute normalizations +type(date_time), dimension(:), allocatable :: tzdates !------------------------------------------------------------------------------- ! GAVG =(HAVG=='A' .OR. HAVG=='H') @@ -1415,9 +1399,7 @@ ALLOCATE (ZTRAJX(1,1,SIZE(PFIELD,2))) ALLOCATE (ZTRAJY(1,1,SIZE(PFIELD,2))) ALLOCATE (ZTRAJZ(1,1,SIZE(PFIELD,2))) ALLOCATE(ZWORK6(1,1,1,NLES_CURRENT_TIMES,SIZE(PFIELD,2),1)) -ALLOCATE(ZTRAJT(NLES_CURRENT_TIMES,1)) -ALLOCATE(ZDATIME(16,NLES_CURRENT_TIMES)) - +allocate( tzdates( NLES_CURRENT_TIMES ) ) ! IIL = NLES_CURRENT_IINF IIH = NLES_CURRENT_ISUP @@ -1436,14 +1418,11 @@ YGROUP = HGROUP ! IRESP = 0 ZWORK6(1,1,1,:,:,1) = PFIELD (:,:) -ZTRAJT(:,:) = XLES_CURRENT_TRAJT(:,:) -ZDATIME(:,:)=XLES_CURRENT_DATIME(:,:) -! - +tzdates(:) = xles_dates(:) ! !* time average ! -IF (GAVG) CALL LES_TIME_AVG(ZTRAJT,ZWORK6,IRESP,ZDATIME) +IF (GAVG) CALL LES_TIME_AVG( ZWORK6, tzdates, IRESP ) ! ! IF (HAVG/=' ') YGROUP=HAVG//'_'//YGROUP @@ -1453,10 +1432,11 @@ YTITLE(1) = HGROUP ! ---------------------- ! IF (IRESP==0) & -CALL WRITE_DIACHRO(TPDIAFILE,TLUOUT0,YGROUP,"SSOL",IGRID,ZDATIME, ZWORK6, & - ZTRAJT,YTITLE,YUNIT,YCOMMENT,.FALSE.,.FALSE.,.FALSE., & - IIL,IIH,IJL,IJH,IKL,IKH, & - PTRAJX=ZTRAJX,PTRAJY=ZTRAJY,PTRAJZ=ZTRAJZ ) +CALL WRITE_DIACHRO( TPDIAFILE, TLUOUT0, YGROUP, "SSOL", IGRID, tzdates, & + ZWORK6, YTITLE, YUNIT, YCOMMENT, & + OICP = .FALSE., OJCP = .FALSE., OKCP = .FALSE., & + KIL = IIL, KIH = IIH, KJL = IJL, KJH = IJH, KKL = IKL, KKH = IKH, & + PTRAJX = ZTRAJX, PTRAJY = ZTRAJY, PTRAJZ = ZTRAJZ ) ! ! !* 3.0 Deallocations @@ -1465,9 +1445,8 @@ CALL WRITE_DIACHRO(TPDIAFILE,TLUOUT0,YGROUP,"SSOL",IGRID,ZDATIME, ZWORK6, & DEALLOCATE (ZTRAJX) DEALLOCATE (ZTRAJY) DEALLOCATE (ZTRAJZ) -DEALLOCATE (ZTRAJT) DEALLOCATE(ZWORK6) -DEALLOCATE(ZDATIME) +deallocate( tzdates ) ! !------------------------------------------------------------------------------- END SUBROUTINE LES_DIACHRO_SURF_SV @@ -1479,11 +1458,13 @@ SUBROUTINE LES_DIACHRO_2PT(TPDIAFILE,HGROUP,HCOMMENT,HUNIT,PFIELDX,PFIELDY,HAVG) !* Modification 01/04/03 (V. Masson) safer use of ZWORK6 with loops ! ! -USE MODD_IO, ONLY: TFILEDATA -USE MODD_LES -USE MODD_GRID USE MODD_CONF -USE MODI_WRITE_DIACHRO +USE MODD_GRID +USE MODD_IO, ONLY: TFILEDATA +USE MODD_LES +use modd_type_date, only: date_time + +USE MODE_WRITE_DIACHRO ! IMPLICIT NONE ! @@ -1511,9 +1492,6 @@ REAL, DIMENSION(SIZE(PFIELDY,1),SIZE(PFIELDY,2)) :: ZAVG_FIELDY INTEGER :: JT ! time counter INTEGER :: JK ! level counter INTEGER :: IRESP ! return code -REAL, DIMENSION(:,:),POINTER :: ZTRAJT ! time -REAL, DIMENSION(:,:),POINTER :: ZDATIME ! date - ! REAL, DIMENSION(:,:,:,:,:,:), POINTER :: ZWORK6 ! contains physical field ! @@ -1523,6 +1501,7 @@ INTEGER :: IIL, IIH, IJL, IJH, IKL, IKH ! cartesian area relatively to the CHARACTER(len=6) :: YSTRING ! LOGICAL :: GAVG ! flag to compute time averagings +type(date_time), dimension(:), allocatable :: tzdates !------------------------------------------------------------------------------- ! IF (HAVG/=' '.AND. HAVG/='A') RETURN @@ -1535,8 +1514,7 @@ IF (GAVG .AND. (XLES_TEMP_MEAN_START==XUNDEF .OR. XLES_TEMP_MEAN_END==XUNDEF)) R ! ---------------------------------------------------------- ! ALLOCATE(ZWORK6(SIZE(PFIELDX,1),1,NSPECTRA_K,NLES_CURRENT_TIMES,2,1)) -ALLOCATE(ZTRAJT(NLES_CURRENT_TIMES,1)) -ALLOCATE(ZDATIME(16,NLES_CURRENT_TIMES)) +allocate( tzdates( NLES_CURRENT_TIMES ) ) ! IGRID(:)=1 ! @@ -1562,12 +1540,13 @@ DO JT=1,SIZE(PFIELDX,3) ZWORK6(:,1,JK,JT,2,1) = 0. END DO END DO -ZTRAJT(:,:) = XLES_CURRENT_TRAJT(:,:) -ZDATIME(:,:)= XLES_CURRENT_DATIME(:,:) + +tzdates(:) = xles_dates(:) + !* time average ! IF (GAVG) THEN - CALL LES_TIME_AVG(ZTRAJT,ZWORK6,IRESP,ZDATIME) + CALL LES_TIME_AVG( ZWORK6, tzdates, IRESP ) YGROUP = 'T_'//YGROUP END IF ! @@ -1576,20 +1555,19 @@ END IF ! ---------------------- ! IF (IRESP==0) & -CALL WRITE_DIACHRO(TPDIAFILE,TLUOUT0,YGROUP,"SPXY",IGRID,ZDATIME, ZWORK6, & - ZTRAJT,YTITLE,YUNIT,YCOMMENT,.FALSE.,.FALSE.,.FALSE., & - IIL,IIH,IJL,IJH,IKL,IKH ) +CALL WRITE_DIACHRO( TPDIAFILE, TLUOUT0, YGROUP, "SPXY", IGRID, tzdates, & + ZWORK6, YTITLE, YUNIT, YCOMMENT, & + OICP = .FALSE., OJCP = .FALSE., OKCP = .FALSE., & + KIL = IIL, KIH = IIH, KJL = IJL, KJH = IJH, KKL = IKL, KKH = IKH ) ! ! -DEALLOCATE (ZTRAJT) -DEALLOCATE(ZDATIME) +deallocate( tzdates ) DEALLOCATE(ZWORK6) ! IF (L2D) RETURN ! ALLOCATE(ZWORK6(1,SIZE(PFIELDY,1),NSPECTRA_K,NLES_CURRENT_TIMES,2,1)) -ALLOCATE(ZTRAJT(NLES_CURRENT_TIMES,1)) -ALLOCATE(ZDATIME(16,NLES_CURRENT_TIMES)) +allocate( tzdates( NLES_CURRENT_TIMES ) ) ! IIL = 1 IIH = 1 @@ -1602,8 +1580,8 @@ DO JT=1,SIZE(PFIELDY,3) ZWORK6(1,:,JK,JT,2,1) = 0. END DO END DO -ZTRAJT(:,:) = XLES_CURRENT_TRAJT(:,:) -ZDATIME(:,:)= XLES_CURRENT_DATIME(:,:) + +tzdates(:) = xles_dates(:) ! YGROUP = 'CJ_'//HGROUP YTITLE(:) = YGROUP @@ -1614,18 +1592,17 @@ YCOMMENT(:) = " DOMEGAY="//YSTRING//' '//HCOMMENT !* time average ! IF (GAVG) THEN - CALL LES_TIME_AVG(ZTRAJT,ZWORK6,IRESP,ZDATIME) + CALL LES_TIME_AVG( ZWORK6, tzdates, IRESP ) YGROUP = 'T_'//YGROUP END IF ! -CALL WRITE_DIACHRO(TPDIAFILE,TLUOUT0,YGROUP,"SPXY",IGRID,ZDATIME, ZWORK6, & - ZTRAJT,YTITLE,YUNIT,YCOMMENT,.FALSE.,.FALSE.,.FALSE., & - IIL,IIH,IJL,IJH,IKL,IKH ) +CALL WRITE_DIACHRO( TPDIAFILE, TLUOUT0, YGROUP, "SPXY", IGRID, tzdates, & + ZWORK6, YTITLE, YUNIT, YCOMMENT, & + OICP = .FALSE., OJCP = .FALSE., OKCP = .FALSE., & + KIL = IIL, KIH = IIH, KJL = IJL, KJH = IJH, KKL = IKL, KKH = IKH ) ! -DEALLOCATE (ZTRAJT) DEALLOCATE(ZWORK6) -DEALLOCATE(ZDATIME) - +deallocate( tzdates ) ! !------------------------------------------------------------------------------- END SUBROUTINE LES_DIACHRO_2PT @@ -1638,11 +1615,13 @@ SUBROUTINE LES_DIACHRO_SPEC(TPDIAFILE,HGROUP,HCOMMENT,HUNIT,PSPECTRAX,PSPECTRAY) !* Modification 01/04/03 (V. Masson) safer use of ZWORK6 with loops ! ! -USE MODD_IO, ONLY: TFILEDATA -USE MODD_LES -USE MODD_GRID USE MODD_CONF -USE MODI_WRITE_DIACHRO +USE MODD_GRID +USE MODD_IO, ONLY: TFILEDATA +USE MODD_LES +use modd_type_date, only: date_time + +USE MODE_WRITE_DIACHRO ! IMPLICIT NONE ! @@ -1667,8 +1646,6 @@ CHARACTER(LEN=100), DIMENSION(1) :: YUNIT ! physical unit INTEGER :: IRESP ! return code ! REAL, DIMENSION(:,:,:,:,:,:), POINTER :: ZWORK6 ! contains physical field -REAL, DIMENSION(:,:), POINTER :: ZTRAJT ! time -REAL, DIMENSION(:,:), POINTER :: ZDATIME ! date ! INTEGER :: IIL, IIH, IJL, IJH, IKL, IKH ! cartesian area relatively to the @@ -1677,6 +1654,7 @@ INTEGER :: IIL, IIH, IJL, IJH, IKL, IKH ! cartesian area relatively to the CHARACTER(len=6) :: YSTRING INTEGER :: JT ! time counter INTEGER :: JK ! level counter +type(date_time), dimension(:), allocatable :: tzdates ! !------------------------------------------------------------------------------- ! @@ -1695,12 +1673,9 @@ IKH=NSPECTRA_K !* spectra in X direction ! ALLOCATE(ZWORK6(SIZE(PSPECTRAX,1),1,NSPECTRA_K,NLES_CURRENT_TIMES,2,1)) -ALLOCATE(ZTRAJT(NLES_CURRENT_TIMES,1)) -ALLOCATE(ZDATIME(16,NLES_CURRENT_TIMES)) - +allocate( tzdates( NLES_CURRENT_TIMES ) ) ! -ZTRAJT(:,:) = XLES_CURRENT_TRAJT(:,:) -ZDATIME(:,:)= XLES_CURRENT_DATIME(:,:) +tzdates(:) = xles_dates(:) ! IIL = NLES_CURRENT_IINF IIH = NLES_CURRENT_ISUP @@ -1720,24 +1695,25 @@ WRITE(YSTRING,FMT="(I6.6)") NINT( XLES_CURRENT_DOMEGAX ) YCOMMENT(:) = " DOMEGAX="//YSTRING//' '//HCOMMENT ! ! -CALL WRITE_DIACHRO(TPDIAFILE,TLUOUT0,YGROUP,"SPXY",IGRID,ZDATIME, ZWORK6, & - ZTRAJT,YTITLE,YUNIT,YCOMMENT,.FALSE.,.FALSE.,.FALSE., & - IIL,IIH,IJL,IJH,IKL,IKH ) +CALL WRITE_DIACHRO( TPDIAFILE, TLUOUT0, YGROUP, "SPXY", IGRID, tzdates, & + ZWORK6, YTITLE, YUNIT, YCOMMENT, & + OICP = .FALSE., OJCP = .FALSE., OKCP = .FALSE., & + KIL = IIL, KIH = IIH, KJL = IJL, KJH = IJH, KKL = IKL, KKH = IKH ) ! ! !* time average ! IRESP=0 -CALL LES_TIME_AVG(ZTRAJT,ZWORK6,IRESP,ZDATIME) +CALL LES_TIME_AVG( ZWORK6, tzdates, IRESP ) YGROUP = 'T_'//YGROUP ! IF (IRESP==0) & -CALL WRITE_DIACHRO(TPDIAFILE,TLUOUT0,YGROUP,"SPXY",IGRID,ZDATIME, ZWORK6, & - ZTRAJT,YTITLE,YUNIT,YCOMMENT,.FALSE.,.FALSE.,.FALSE., & - IIL,IIH,IJL,IJH,IKL,IKH ) +CALL WRITE_DIACHRO( TPDIAFILE, TLUOUT0, YGROUP, "SPXY", IGRID, tzdates, & + ZWORK6, YTITLE, YUNIT, YCOMMENT, & + OICP = .FALSE., OJCP = .FALSE., OKCP = .FALSE., & + KIL = IIL, KIH = IIH, KJL = IJL, KJH = IJH, KKL = IKL, KKH = IKH ) DEALLOCATE(ZWORK6) -DEALLOCATE(ZTRAJT) -DEALLOCATE(ZDATIME) +deallocate( tzdates ) ! !* spectra in Y direction ! @@ -1745,11 +1721,9 @@ DEALLOCATE(ZDATIME) IF (L2D) RETURN ! ALLOCATE(ZWORK6(1,SIZE(PSPECTRAY,1),NSPECTRA_K,NLES_CURRENT_TIMES,2,1)) -ALLOCATE(ZTRAJT(NLES_CURRENT_TIMES,1)) -ALLOCATE(ZDATIME(16,NLES_CURRENT_TIMES)) +allocate( tzdates( NLES_CURRENT_TIMES ) ) ! -ZTRAJT(:,:) = XLES_CURRENT_TRAJT(:,:) -ZDATIME(:,:)= XLES_CURRENT_DATIME(:,:) +tzdates(:) = xles_dates(:) ! IIL = 1 IIH = 1 @@ -1768,25 +1742,25 @@ YTITLE(:) = YGROUP WRITE(YSTRING,FMT="(I6.6)") NINT( XLES_CURRENT_DOMEGAY ) YCOMMENT(:) = " DOMEGAY="//YSTRING//' '//HCOMMENT ! -CALL WRITE_DIACHRO(TPDIAFILE,TLUOUT0,YGROUP,"SPXY",IGRID,ZDATIME, ZWORK6, & - ZTRAJT,YTITLE,YUNIT,YCOMMENT,.FALSE.,.FALSE.,.FALSE., & - IIL,IIH,IJL,IJH,IKL,IKH ) +CALL WRITE_DIACHRO( TPDIAFILE, TLUOUT0, YGROUP, "SPXY", IGRID, tzdates, & + ZWORK6, YTITLE, YUNIT, YCOMMENT, & + OICP = .FALSE., OJCP = .FALSE., OKCP = .FALSE., & + KIL = IIL, KIH = IIH, KJL = IJL, KJH = IJH, KKL = IKL, KKH = IKH ) ! ! !* time average ! -CALL LES_TIME_AVG(ZTRAJT,ZWORK6,IRESP,ZDATIME) +CALL LES_TIME_AVG( ZWORK6, tzdates, IRESP ) YGROUP = 'T_'//YGROUP ! IF (IRESP==0) & -CALL WRITE_DIACHRO(TPDIAFILE,TLUOUT0,YGROUP,"SPXY",IGRID,ZDATIME, ZWORK6, & - ZTRAJT,YTITLE,YUNIT,YCOMMENT,.FALSE.,.FALSE.,.FALSE., & - IIL,IIH,IJL,IJH,IKL,IKH ) +CALL WRITE_DIACHRO( TPDIAFILE, TLUOUT0, YGROUP, "SPXY", IGRID, tzdates, & + ZWORK6, YTITLE, YUNIT, YCOMMENT, & + OICP = .FALSE., OJCP = .FALSE., OKCP = .FALSE., & + KIL = IIL, KIH = IIH, KJL = IJL, KJH = IJH, KKL = IKL, KKH = IKH ) ! DEALLOCATE(ZWORK6) -DEALLOCATE(ZTRAJT) -DEALLOCATE(ZDATIME) - +deallocate( tzdates ) ! !------------------------------------------------------------------------------- END SUBROUTINE LES_DIACHRO_SPEC diff --git a/src/MNH/modeln.f90 b/src/MNH/modeln.f90 index 644c8855f..3089ca505 100644 --- a/src/MNH/modeln.f90 +++ b/src/MNH/modeln.f90 @@ -264,6 +264,7 @@ END MODULE MODI_MODEL_n ! P. Wautelet 20/05/2019: add name argument to ADDnFIELD_ll + new ADD4DFIELD_ll subroutine ! J. Escobar 09/07/2019: norme Doctor -> Rename Module Type variable TZ -> T ! J. Escobar 09/07/2019: for bug in management of XLSZWSM variable, add/use specific 2D TLSFIELD2D_ll pointer +! P. Wautelet 13/09/2019: budget: simplify and modernize date/time management !!------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -1975,7 +1976,6 @@ ZTIME1 = ZTIME2 ! IF (LFLYER) & CALL AIRCRAFT_BALLOON(XTSTEP, & - TDTEXP, TDTMOD, TDTSEG, TDTCUR, & XXHAT, XYHAT, XZZ, XMAP, XLONORI, XLATORI, & XUT, XVT, XWT, XPABST, XTHT, XRT, XSVT, XTKET, XTSRAD, & XRHODREF,XCIT,PSEA=ZSEA(:,:)) @@ -1988,7 +1988,6 @@ IF (LFLYER) & ! IF (LSTATION) & CALL STATION_n(XTSTEP, & - TDTEXP, TDTMOD, TDTSEG, TDTCUR, & XXHAT, XYHAT, XZZ, & XUT, XVT, XWT, XTHT, XRT, XSVT, XTKET, XTSRAD, XPABST ) ! @@ -1999,7 +1998,6 @@ IF (LSTATION) & ! IF (LPROFILER) & CALL PROFILER_n(XTSTEP, & - TDTEXP, TDTMOD, TDTSEG, TDTCUR, & XXHAT, XYHAT, XZZ,XRHODREF, & XUT, XVT, XWT, XTHT, XRT, XSVT, XTKET, XTSRAD, XPABST, & XAER, XCLDFR, XCIT) diff --git a/src/MNH/profilern.f90 b/src/MNH/profilern.f90 index a463a4ad7..ce7a3f0b7 100644 --- a/src/MNH/profilern.f90 +++ b/src/MNH/profilern.f90 @@ -1,6 +1,6 @@ -!MNH_LIC Copyright 2002-2018 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2002-2019 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 version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. !----------------------------------------------------------------- ! ########################## @@ -10,18 +10,11 @@ MODULE MODI_PROFILER_n INTERFACE ! SUBROUTINE PROFILER_n(PTSTEP, & - TPDTEXP, TPDTMOD, TPDTSEG, TPDTCUR, & PXHAT, PYHAT, PZ,PRHODREF, & PU, PV, PW, PTH, PR, PSV, PTKE, & PTS,PP, PAER, PCLDFR, PCIT) ! -USE MODD_TYPE_DATE -! REAL, INTENT(IN) :: PTSTEP ! time step -TYPE(DATE_TIME), INTENT(IN) :: TPDTEXP! experiment date and time -TYPE(DATE_TIME), INTENT(IN) :: TPDTMOD! model start date and time -TYPE(DATE_TIME), INTENT(IN) :: TPDTSEG! segment date and time -TYPE(DATE_TIME), INTENT(IN) :: TPDTCUR! current date and time REAL, DIMENSION(:), INTENT(IN) :: PXHAT ! x coordinate REAL, DIMENSION(:), INTENT(IN) :: PYHAT ! y coordinate REAL, DIMENSION(:,:,:), INTENT(IN) :: PZ ! z array @@ -49,7 +42,6 @@ END MODULE MODI_PROFILER_n ! ! ######################################################## SUBROUTINE PROFILER_n(PTSTEP, & - TPDTEXP, TPDTMOD, TPDTSEG, TPDTCUR, & PXHAT, PYHAT, PZ,PRHODREF, & PU, PV, PW, PTH, PR, PSV, PTKE, & PTS, PP, PAER, PCLDFR, PCIT) @@ -90,33 +82,31 @@ END MODULE MODI_PROFILER_n !! C.Lac 10/2016 Add visibility diagnostic !! March,28, 2018 (P. Wautelet) replace TEMPORAL_DIST by DATETIME_DISTANCE !! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O -!! -!! -------------------------------------------------------------------------- +! P. Wautelet 13/09/2019: budget: simplify and modernize date/time management +! +! -------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ ! -USE MODD_TYPE_DATE -USE MODD_PROFILER_n -USE MODD_SUB_PROFILER_n -USE MODD_TIME -USE MODD_PARAMETERS +USE MODD_CONF USE MODD_CST -USE MODD_GRID USE MODD_DIAG_IN_RUN -USE MODD_CONF +USE MODD_GRID +USE MODD_SUB_PROFILER_n USE MODD_NSV +USE MODD_PARAMETERS +USE MODD_PARAM_n, ONLY : CCLOUD +USE MODD_PROFILER_n +USE MODD_TIME, only: tdtexp +USE MODD_TIME_n, only: tdtcur ! -USE MODE_DATETIME USE MODE_ll ! -USE MODI_WATER_SUM -USE MODI_RADAR_RAIN_ICE +USE MODI_GPS_ZENITH_GRID USE MODI_LIDAR +USE MODI_RADAR_RAIN_ICE USE MODI_WATER_SUM -USE MODI_GPS_ZENITH_GRID -USE MODD_PARAM_n, ONLY : CCLOUD -! ! IMPLICIT NONE ! @@ -125,10 +115,6 @@ IMPLICIT NONE ! ! REAL, INTENT(IN) :: PTSTEP ! time step -TYPE(DATE_TIME), INTENT(IN) :: TPDTEXP! experiment date and time -TYPE(DATE_TIME), INTENT(IN) :: TPDTMOD! model start date and time -TYPE(DATE_TIME), INTENT(IN) :: TPDTSEG! segment date and time -TYPE(DATE_TIME), INTENT(IN) :: TPDTCUR! current date and time REAL, DIMENSION(:), INTENT(IN) :: PXHAT ! x coordinate REAL, DIMENSION(:), INTENT(IN) :: PYHAT ! y coordinate REAL, DIMENSION(:,:,:), INTENT(IN) :: PZ ! z array @@ -160,7 +146,6 @@ INTEGER :: IKE INTEGER :: IIU INTEGER :: IJU INTEGER :: IKU -REAL :: ZTIMEEXP ! ! REAL, DIMENSION(SIZE(PXHAT)) :: ZXHATM ! mass point coordinates @@ -257,7 +242,6 @@ IF ( TPROFILER%T_CUR == XUNDEF ) TPROFILER%T_CUR = TPROFILER%STEP - PTSTEP ! TPROFILER%T_CUR = TPROFILER%T_CUR + PTSTEP ! -CALL DATETIME_DISTANCE(TDTEXP,TDTSEG,ZTIMEEXP) IF ( TPROFILER%T_CUR >= TPROFILER%STEP - 1.E-10 ) THEN GSTORE = .TRUE. TPROFILER%T_CUR = TPROFILER%T_CUR - TPROFILER%STEP @@ -268,23 +252,14 @@ ELSE END IF ! IF (GSTORE) THEN - TPROFILER%TIME(IN) = (IN-1) * TPROFILER%STEP + ZTIMEEXP - TPROFILER%DATIME( 1,IN) = TPDTEXP%TDATE%YEAR - TPROFILER%DATIME( 2,IN) = TPDTEXP%TDATE%MONTH - TPROFILER%DATIME( 3,IN) = TPDTEXP%TDATE%DAY - TPROFILER%DATIME( 4,IN) = TPDTEXP%TIME - TPROFILER%DATIME( 5,IN) = TPDTSEG%TDATE%YEAR - TPROFILER%DATIME( 6,IN) = TPDTSEG%TDATE%MONTH - TPROFILER%DATIME( 7,IN) = TPDTSEG%TDATE%DAY - TPROFILER%DATIME( 8,IN) = TPDTSEG%TIME - TPROFILER%DATIME( 9,IN) = TPDTMOD%TDATE%YEAR - TPROFILER%DATIME(10,IN) = TPDTMOD%TDATE%MONTH - TPROFILER%DATIME(11,IN) = TPDTMOD%TDATE%DAY - TPROFILER%DATIME(12,IN) = TPDTMOD%TIME - TPROFILER%DATIME(13,IN) = TPDTCUR%TDATE%YEAR - TPROFILER%DATIME(14,IN) = TPDTCUR%TDATE%MONTH - TPROFILER%DATIME(15,IN) = TPDTCUR%TDATE%DAY - TPROFILER%DATIME(16,IN) = TPDTCUR%TIME +#if 0 + tprofiler%tpdates(in)%date%year = tdtexp%date%year + tprofiler%tpdates(in)%date%month = tdtexp%date%month + tprofiler%tpdates(in)%date%day = tdtexp%date%day + tprofiler%tpdates(in)%time = tdtexp%time + ( in - 1 ) * tprofiler%step +#else + tprofiler%tpdates(in) = tdtcur +#endif END IF ! ! @@ -410,7 +385,6 @@ IF ((SIZE(PR,4) >= 2) .AND. NSV_C2R2END /= 0 ) THEN END IF ! IF (GSTORE) THEN - IF (TPROFILER%TIME(IN) /= XUNDEF) THEN DO I=1,NUMBPROFILER IF ((ZTHIS_PROCS(I)==1.).AND.(.NOT. TPROFILER%ERROR(I))) THEN ! @@ -608,8 +582,6 @@ ENDDO ! END IF ! -END IF -! !---------------------------------------------------------------------------- !---------------------------------------------------------------------------- ! diff --git a/src/MNH/seriesn.f90 b/src/MNH/seriesn.f90 index c592e4b54..96487fcaa 100644 --- a/src/MNH/seriesn.f90 +++ b/src/MNH/seriesn.f90 @@ -40,33 +40,31 @@ !! 01/2018 (G.Delautier) SURFEX 8.1 !! 03/2018 (P.Wautelet) replace TEMPORAL_DIST by DATETIME_DISTANCE !! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O +! P. Wautelet 13/09/2019: budget: simplify and modernize date/time management !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ ! +USE MODD_CONF, ONLY: NVERB +USE MODD_CONF_n, ONLY: LUSERV,LUSERC,LUSERR,LUSERI,LUSERS,LUSERG,LUSERH +USE MODD_FIELD_n, ONLY: XTHT,XWT,XUT,XPABST,XRT +USE MODD_GRID_n, ONLY: XZZ +USE MODD_LUNIT_n, ONLY: TLUOUT +USE MODD_MNH_SURFEX_n +USE MODD_PARAMETERS +USE MODD_PRECIP_n, ONLY: XINPRC,XINPRR,XINPRS,XINPRG,XINPRH, & + XACPRC,XACPRR,XACPRS,XACPRG,XACPRH +USE MODD_REF, ONLY: XRHODREFZ USE MODD_SERIES USE MODD_SERIES_n -USE MODD_PARAMETERS -USE MODD_CONF, ONLY: NVERB -USE MODD_REF, ONLY: XRHODREFZ -USE MODD_TIME, ONLY: TDTEXP +USE MODD_TIME_n, ONLY: TDTCUR USE MODD_TYPE_DATE -USE MODD_CONF_n, ONLY: LUSERV,LUSERC,LUSERR,LUSERI,LUSERS,LUSERG,LUSERH -USE MODD_FIELD_n, ONLY: XTHT,XWT,XUT,XPABST,XRT -USE MODD_GRID_n, ONLY: XZZ -USE MODD_LUNIT_n, ONLY: TLUOUT -USE MODD_PRECIP_n, ONLY: XINPRC,XINPRR,XINPRS,XINPRG,XINPRH, & - XACPRC,XACPRR,XACPRS,XACPRG,XACPRH -USE MODD_TIME_n, ONLY: TDTCUR -! SURFACE FIELDS -USE MODI_GET_SURF_VAR_n ! -USE MODE_DATETIME USE MODE_ll USE MODE_MSG ! -USE MODD_MNH_SURFEX_n +USE MODI_GET_SURF_VAR_n ! IMPLICIT NONE ! @@ -92,7 +90,6 @@ INTEGER :: IRESP ! Return code of FM-routines INTEGER :: ISER CHARACTER (LEN=5), DIMENSION(3) :: YSUF LOGICAL, DIMENSION(SIZE(LINBOX,1),SIZE(LINBOX,2),3) :: GINBOX -TYPE (DATE_TIME) :: TZDTCUR ! current date and time !SURFACE FIELDS REAL, DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2)) :: ZTS, ZTMNW, ZTBOT, ZCT,ZHML INTEGER :: ILOOP, JLOOP, KI @@ -168,13 +165,7 @@ IF(NVERB>=5) WRITE(ILUOUT,*) & ! NSCOUNTD=NSCOUNTD+1 ! -TZDTCUR=TDTCUR -! -CALL DATETIME_DISTANCE(TDTEXP,TZDTCUR,XSTRAJT(NSCOUNTD,1)) -XSDATIME(13,NSCOUNTD)= TZDTCUR%TDATE%YEAR -XSDATIME(14,NSCOUNTD)= TZDTCUR%TDATE%MONTH -XSDATIME(15,NSCOUNTD)= TZDTCUR%TDATE%DAY -XSDATIME(16,NSCOUNTD)= TZDTCUR%TIME +tpsdates(nscountd) = tdtcur ! !------------------------------------------------------------------------------- ! diff --git a/src/MNH/stationn.f90 b/src/MNH/stationn.f90 index 2fa1ab92c..33f1fa4a9 100644 --- a/src/MNH/stationn.f90 +++ b/src/MNH/stationn.f90 @@ -1,6 +1,6 @@ -!MNH_LIC Copyright 2002-2018 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2002-2019 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 version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. !----------------------------------------------------------------- ! ########################## @@ -10,18 +10,11 @@ MODULE MODI_STATION_n INTERFACE ! SUBROUTINE STATION_n(PTSTEP, & - TPDTEXP, TPDTMOD, TPDTSEG, TPDTCUR, & PXHAT, PYHAT, PZ, & PU, PV, PW, PTH, PR, PSV, PTKE, & PTS,PP ) ! -USE MODD_TYPE_DATE -! REAL, INTENT(IN) :: PTSTEP ! time step -TYPE(DATE_TIME), INTENT(IN) :: TPDTEXP! experiment date and time -TYPE(DATE_TIME), INTENT(IN) :: TPDTMOD! model start date and time -TYPE(DATE_TIME), INTENT(IN) :: TPDTSEG! segment date and time -TYPE(DATE_TIME), INTENT(IN) :: TPDTCUR! current date and time REAL, DIMENSION(:), INTENT(IN) :: PXHAT ! x coordinate REAL, DIMENSION(:), INTENT(IN) :: PYHAT ! y coordinate REAL, DIMENSION(:,:,:), INTENT(IN) :: PZ ! z array @@ -45,9 +38,8 @@ END MODULE MODI_STATION_n ! ! ######################################################## SUBROUTINE STATION_n(PTSTEP, & - TPDTEXP, TPDTMOD, TPDTSEG, TPDTCUR, & PXHAT, PYHAT, PZ, & - PU, PV, PW, PTH, PR, PSV, PTKE, & + PU, PV, PW, PTH, PR, PSV, PTKE, & PTS, PP ) ! ######################################################## ! @@ -86,23 +78,24 @@ END MODULE MODI_STATION_n !! C.Lac 04/2013 : Add I/J positioning !! P.Wautelet 28/03/2018 : Replace TEMPORAL_DIST by DATETIME_DISTANCE !! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O -!! -!! -------------------------------------------------------------------------- -! +! P. Wautelet 13/09/2019: budget: simplify and modernize date/time management +! +! -------------------------------------------------------------------------- +! !* 0. DECLARATIONS ! ------------ ! -USE MODD_TYPE_DATE -USE MODD_STATION_n -USE MODD_SUB_STATION_n -USE MODD_DIAG_IN_RUN -USE MODD_PARAMETERS +USE MODD_CONF USE MODD_CST +USE MODD_DIAG_IN_RUN USE MODD_GRID -USE MODD_TIME -USE MODD_CONF +USE MODD_PARAMETERS +USE MODD_STATION_n +USE MODD_SUB_STATION_n +use modd_time, only: tdtexp +use modd_time_n, only: tdtcur +USE MODD_TYPE_DATE ! -USE MODE_DATETIME USE MODE_ll ! USE MODI_WATER_SUM @@ -116,10 +109,6 @@ IMPLICIT NONE ! ! REAL, INTENT(IN) :: PTSTEP ! time step -TYPE(DATE_TIME), INTENT(IN) :: TPDTEXP! experiment date and time -TYPE(DATE_TIME), INTENT(IN) :: TPDTMOD! model start date and time -TYPE(DATE_TIME), INTENT(IN) :: TPDTSEG! segment date and time -TYPE(DATE_TIME), INTENT(IN) :: TPDTCUR! current date and time REAL, DIMENSION(:), INTENT(IN) :: PXHAT ! x coordinate REAL, DIMENSION(:), INTENT(IN) :: PYHAT ! y coordinate REAL, DIMENSION(:,:,:), INTENT(IN) :: PZ ! z array @@ -144,7 +133,6 @@ INTEGER :: IIE ! INTEGER :: IJE ! INTEGER :: IIU ! INTEGER :: IJU ! -REAL :: ZTIMEEXP ! ! REAL, DIMENSION(SIZE(PXHAT)) :: ZXHATM ! mass point coordinates REAL, DIMENSION(SIZE(PYHAT)) :: ZYHATM ! mass point coordinates @@ -199,7 +187,6 @@ IF ( TSTATION%T_CUR == XUNDEF ) TSTATION%T_CUR = TSTATION%STEP - PTSTEP ! TSTATION%T_CUR = TSTATION%T_CUR + PTSTEP ! -CALL DATETIME_DISTANCE(TDTEXP,TDTSEG,ZTIMEEXP) IF ( TSTATION%T_CUR >= TSTATION%STEP - 1.E-10 ) THEN GSTORE = .TRUE. TSTATION%T_CUR = TSTATION%T_CUR - TSTATION%STEP @@ -210,24 +197,14 @@ ELSE END IF ! IF (GSTORE) THEN - ! - TSTATION%TIME(IN) = (IN-1) * TSTATION%STEP + ZTIMEEXP - TSTATION%DATIME( 1,IN) = TPDTEXP%TDATE%YEAR - TSTATION%DATIME( 2,IN) = TPDTEXP%TDATE%MONTH - TSTATION%DATIME( 3,IN) = TPDTEXP%TDATE%DAY - TSTATION%DATIME( 4,IN) = TPDTEXP%TIME - TSTATION%DATIME( 5,IN) = TPDTSEG%TDATE%YEAR - TSTATION%DATIME( 6,IN) = TPDTSEG%TDATE%MONTH - TSTATION%DATIME( 7,IN) = TPDTSEG%TDATE%DAY - TSTATION%DATIME( 8,IN) = TPDTSEG%TIME - TSTATION%DATIME( 9,IN) = TPDTMOD%TDATE%YEAR - TSTATION%DATIME(10,IN) = TPDTMOD%TDATE%MONTH - TSTATION%DATIME(11,IN) = TPDTMOD%TDATE%DAY - TSTATION%DATIME(12,IN) = TPDTMOD%TIME - TSTATION%DATIME(13,IN) = TPDTCUR%TDATE%YEAR - TSTATION%DATIME(14,IN) = TPDTCUR%TDATE%MONTH - TSTATION%DATIME(15,IN) = TPDTCUR%TDATE%DAY - TSTATION%DATIME(16,IN) = TPDTCUR%TIME +#if 0 + tstation%tpdates(in)%date%year = tdtexp%date%year + tstation%tpdates(in)%date%month = tdtexp%date%month + tstation%tpdates(in)%date%day = tdtexp%date%day + tstation%tpdates(in)%time = tdtexp%time + ( in - 1 ) * tstation%step +#else + tstation%tpdates(in) = tdtcur +#endif END IF ! ! @@ -339,10 +316,7 @@ END IF ! -------------- ! IF (GSTORE) THEN - - IF (TSTATION%TIME(IN) /= XUNDEF) THEN - - DO I=1,NUMBSTAT + DO I=1,NUMBSTAT ! IF ((ZTHIS_PROCS(I)==1.).AND.(.NOT. TSTATION%ERROR(I))) THEN IF (TSTATION%K(I)/= XUNDEF) THEN @@ -498,8 +472,6 @@ IF (GSTORE) THEN ! ENDDO ! - END IF - ! END IF ! !---------------------------------------------------------------------------- diff --git a/src/MNH/write_aircraft_balloon.f90 b/src/MNH/write_aircraft_balloon.f90 index 591807663..39f17c64e 100644 --- a/src/MNH/write_aircraft_balloon.f90 +++ b/src/MNH/write_aircraft_balloon.f90 @@ -63,9 +63,10 @@ END MODULE MODI_WRITE_AIRCRAFT_BALLOON !! Oct 2016 : G.Delautier LIMA !! August 2016 (M.Leriche) Add mass concentration of aerosol species !! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O -!! P. Wautelet 29/01/2019: bug: moved an instruction later (to prevent access to a not allocated array) -!! -!! -------------------------------------------------------------------------- +! P. Wautelet 29/01/2019: bug: moved an instruction later (to prevent access to a not allocated array) +! P. Wautelet 13/09/2019: budget: simplify and modernize date/time management +! +! -------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ @@ -173,7 +174,6 @@ TYPE(FLYER), INTENT(IN) :: TPFLYER ! !* 0.2 declaration of local variables for diachro ! -REAL, DIMENSION(:,:), ALLOCATABLE :: ZTRAJT ! localization of the REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTRAJX ! temporal series REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTRAJY ! in t,x,y and z. REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTRAJZ ! @@ -231,23 +231,21 @@ IF (LORILAM) IPROC = IPROC + JPMODE*3 IF (LDUST) IPROC = IPROC + NMODE_DST*3 IF (SIZE(TPFLYER%TSRAD)>0) IPROC = IPROC + 1 ! -ALLOCATE (ZTRAJT( SIZE(TPFLYER%TIME),1)) -ALLOCATE (ZTRAJX(1,SIZE(TPFLYER%TIME),1)) -ALLOCATE (ZTRAJY(1,SIZE(TPFLYER%TIME),1)) -ALLOCATE (ZTRAJZ(1,SIZE(TPFLYER%TIME),1)) -ALLOCATE (ZWORK6(1,1,1,SIZE(TPFLYER%TIME),1,IPROC)) +ALLOCATE (ZTRAJX(1,size(tpflyer%tpdates),1)) +ALLOCATE (ZTRAJY(1,size(tpflyer%tpdates),1)) +ALLOCATE (ZTRAJZ(1,size(tpflyer%tpdates),1)) +ALLOCATE (ZWORK6(1,1,1,size(tpflyer%tpdates),1,IPROC)) ALLOCATE (YCOMMENT(IPROC)) ALLOCATE (YTITLE (IPROC)) ALLOCATE (YUNIT (IPROC)) ALLOCATE (IGRID (IPROC)) -ALLOCATE (ZWORKZ6(1,1,IKU,SIZE(TPFLYER%TIME),1,IPROCZ)) +ALLOCATE (ZWORKZ6(1,1,IKU,size(tpflyer%tpdates),1,IPROCZ)) ALLOCATE (YCOMMENTZ(IPROCZ)) ALLOCATE (YTITLEZ (IPROCZ)) ALLOCATE (YUNITZ (IPROCZ)) ALLOCATE (IGRIDZ (IPROCZ)) ! -ZTRAJT (:,1) = TPFLYER%TIME ZTRAJX(1,:,1) = TPFLYER%X ZTRAJY(1,:,1) = TPFLYER%Y ZTRAJZ(1,:,1) = TPFLYER%Z @@ -347,7 +345,7 @@ END DO ! !add cloud liquid water content in g/m3 to compare to measurements from FSSP !IF (.NOT.(ANY(TPFLYER%P(:) == 0.))) THEN -ALLOCATE (ZRHO(1,1,SIZE(TPFLYER%TIME))) +ALLOCATE (ZRHO(1,1,size(tpflyer%tpdates))) IF (SIZE(TPFLYER%R,2) >1) THEN !cloud water is present ZRHO(1,1,:) = 0. DO JRR=1,SIZE(TPFLYER%R,2) @@ -355,7 +353,7 @@ IF (SIZE(TPFLYER%R,2) >1) THEN !cloud water is present ENDDO ZRHO(1,1,:) = TPFLYER%TH(:) * ( 1. + XRV/XRD*TPFLYER%R(:,1) ) & / ( 1. + ZRHO(1,1,:) ) - DO JPT=1,SIZE(TPFLYER%TIME) + DO JPT=1,size(tpflyer%tpdates) IF (TPFLYER%P(JPT) == 0.) THEN ZRHO(1,1,JPT) = 0. ELSE @@ -503,12 +501,12 @@ IF (SIZE(TPFLYER%SV,2)>=1) THEN END DO IF ((LORILAM).AND. .NOT.(ANY(TPFLYER%P(:) == 0.))) THEN - ALLOCATE (ZSV(1,1,SIZE(TPFLYER%TIME),NSV_AER)) - ALLOCATE (ZRHO(1,1,SIZE(TPFLYER%TIME))) - ALLOCATE (ZN0(1,1,SIZE(TPFLYER%TIME),JPMODE)) - ALLOCATE (ZRG(1,1,SIZE(TPFLYER%TIME),JPMODE)) - ALLOCATE (ZSIG(1,1,SIZE(TPFLYER%TIME),JPMODE)) - ALLOCATE (ZPTOTA(1,1,SIZE(TPFLYER%TIME),NSP+NCARB+NSOA,JPMODE)) + ALLOCATE (ZSV(1,1,size(tpflyer%tpdates),NSV_AER)) + ALLOCATE (ZRHO(1,1,size(tpflyer%tpdates))) + ALLOCATE (ZN0(1,1,size(tpflyer%tpdates),JPMODE)) + ALLOCATE (ZRG(1,1,size(tpflyer%tpdates),JPMODE)) + ALLOCATE (ZSIG(1,1,size(tpflyer%tpdates),JPMODE)) + ALLOCATE (ZPTOTA(1,1,size(tpflyer%tpdates),NSP+NCARB+NSOA,JPMODE)) ZSV(1,1,:,1:NSV_AER) = TPFLYER%SV(:,NSV_AERBEG:NSV_AEREND) IF (SIZE(TPFLYER%R,2) >0) THEN ZRHO(1,1,:) = 0. @@ -526,7 +524,7 @@ IF (SIZE(TPFLYER%SV,2)>=1) THEN ZRG = 0. ZN0 = 0. ZPTOTA = 0. - DO JPT=1,SIZE(TPFLYER%TIME) ! prevent division by zero if ZSV = 0. + DO JPT=1,size(tpflyer%tpdates) ! prevent division by zero if ZSV = 0. IF (ALL(ZSV(1,1,JPT,:)/=0.)) THEN CALL PPP2AERO(ZSV,ZRHO, PSIG3D=ZSIG, PRG3D=ZRG, PN3D=ZN0, PCTOTA=ZPTOTA) ENDIF @@ -668,11 +666,11 @@ IF (SIZE(TPFLYER%SV,2)>=1) THEN ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%SV(:,JSV) * 1.E9 END DO IF ((LDUST).AND. .NOT.(ANY(TPFLYER%P(:) == 0.))) THEN - ALLOCATE (ZSV(1,1,SIZE(TPFLYER%TIME),NSV_DST)) - ALLOCATE (ZRHO(1,1,SIZE(TPFLYER%TIME))) - ALLOCATE (ZN0(1,1,SIZE(TPFLYER%TIME),NMODE_DST)) - ALLOCATE (ZRG(1,1,SIZE(TPFLYER%TIME),NMODE_DST)) - ALLOCATE (ZSIG(1,1,SIZE(TPFLYER%TIME),NMODE_DST)) + ALLOCATE (ZSV(1,1,size(tpflyer%tpdates),NSV_DST)) + ALLOCATE (ZRHO(1,1,size(tpflyer%tpdates))) + ALLOCATE (ZN0(1,1,size(tpflyer%tpdates),NMODE_DST)) + ALLOCATE (ZRG(1,1,size(tpflyer%tpdates),NMODE_DST)) + ALLOCATE (ZSIG(1,1,size(tpflyer%tpdates),NMODE_DST)) ZSV(1,1,:,1:NSV_DST) = TPFLYER%SV(:,NSV_DSTBEG:NSV_DSTEND) IF (SIZE(TPFLYER%R,2) >0) THEN ZRHO(1,1,:) = 0. @@ -833,23 +831,22 @@ DO IK=1, IKU END DO !---------------------------------------------------------------------------- ! -ALLOCATE (ZW6(1,1,1,SIZE(TPFLYER%TIME),1,JPROC)) +ALLOCATE (ZW6(1,1,1,size(tpflyer%tpdates),1,JPROC)) ZW6 = ZWORK6(:,:,:,:,:,:JPROC) DEALLOCATE(ZWORK6) -ALLOCATE (ZWZ6(1,1,IKU,SIZE(TPFLYER%TIME),1,JPROCZ)) +ALLOCATE (ZWZ6(1,1,IKU,size(tpflyer%tpdates),1,JPROCZ)) ZWZ6 = ZWORKZ6(:,:,:,:,:,:JPROCZ) DEALLOCATE(ZWORKZ6) ! -CALL WRITE_DIACHRO(TPDIAFILE,TLUOUT0,YGROUP,"RSPL",IGRID, TPFLYER%DATIME, ZW6, & - ZTRAJT,YTITLE,YUNIT,YCOMMENT, & - PTRAJX=ZTRAJX, PTRAJY=ZTRAJY, PTRAJZ=ZTRAJZ ) +CALL WRITE_DIACHRO( TPDIAFILE, TLUOUT0, YGROUP, "RSPL", IGRID, tpflyer%tpdates, & + ZW6, YTITLE(:), YUNIT(:), YCOMMENT(:), & + PTRAJX = ZTRAJX, PTRAJY = ZTRAJY, PTRAJZ = ZTRAJZ ) ! -CALL WRITE_DIACHRO(TPDIAFILE,TLUOUT0,YGROUPZ,"CART",IGRIDZ, TPFLYER%DATIME, & - ZWZ6,ZTRAJT,YTITLEZ,YUNITZ,YCOMMENTZ, & - .TRUE.,.TRUE.,.FALSE., & - KIL=1,KIH=1,KJL=1,KJH=1,KKL=1,KKH=IKU ) +CALL WRITE_DIACHRO( TPDIAFILE, TLUOUT0, YGROUPZ, "CART", IGRIDZ, tpflyer%tpdates, & + ZWZ6, YTITLEZ(:), YUNITZ(:), YCOMMENTZ(:), & + OICP = .TRUE., OJCP = .TRUE., OKCP = .FALSE., & + KIL = 1, KIH = 1, KJL = 1, KJH = 1, KKL = 1, KKH = IKU ) -DEALLOCATE (ZTRAJT) DEALLOCATE (ZTRAJX) DEALLOCATE (ZTRAJY) DEALLOCATE (ZTRAJZ) diff --git a/src/MNH/write_budget.f90 b/src/MNH/write_budget.f90 index b92c33c18..0457f183e 100644 --- a/src/MNH/write_budget.f90 +++ b/src/MNH/write_budget.f90 @@ -125,14 +125,16 @@ END MODULE MODI_WRITE_BUDGET !! 11/09/2015 (C.Lac) Correction due to FIT temporal scheme !! 28/03/2018 (P.Wautelet) Replace TEMPORAL_DIST by DATETIME_DISTANCE !! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O -!! +! P. Wautelet 13/09/2019: budget: simplify and modernize date/time management +! !------------------------------------------------------------------------------- ! -!* 0. +!* 0. ! ------------ USE MODD_BUDGET USE MODD_IO, ONLY: TFILEDATA USE MODD_LUNIT_n, ONLY: TLUOUT +use modd_type_date, only: date_time ! USE MODE_DATETIME USE MODE_FIELD, ONLY: TFIELDDATA, TYPEREAL @@ -167,20 +169,19 @@ REAL, ALLOCATABLE , DIMENSION(:,:,:,:,:,:) :: ZWORK, ZWORKT, ZWORKMASK ! loca ! and for the masks LOGICAL :: GNOCOMPRESS ! If TRUE : no compress along x and y direction in the CART option REAL, ALLOCATABLE , DIMENSION(:) :: ZCONVERT ! unit conversion coefficient -REAL, ALLOCATABLE , DIMENSION(:,:):: ZWORKTEMP ! time +REAL, ALLOCATABLE , DIMENSION(:) :: ZWORKTEMP ! time INTEGER, ALLOCATABLE , DIMENSION(:) :: IWORKGRID ! grid label CHARACTER (LEN=99), ALLOCATABLE , DIMENSION(:) :: YBUCOMMENT ! comment CHARACTER (LEN=100), ALLOCATABLE , DIMENSION(:) :: YWORKCOMMENT ! comment CHARACTER (LEN=100), ALLOCATABLE , DIMENSION(:) :: YWORKUNIT ! comment CHARACTER (LEN=9) :: YGROUP_NAME ! group name CHARACTER(LEN=28) :: YFILEDIA -REAL, ALLOCATABLE , DIMENSION(:,:):: ZWORKDATIME ! global time - ! info INTEGER :: JSV ! loop index ! over the ! KSV SVx INTEGER :: IP TYPE(TFIELDDATA) :: TZFIELD +type(date_time), dimension(:), allocatable :: tzdates ! !------------------------------------------------------------------------------- ! @@ -231,30 +232,19 @@ SELECT CASE (CBUTYPE) ! !* 2.1 Initialization ! - ALLOCATE(ZWORKTEMP(1,1)) - ALLOCATE(ZWORKDATIME(16,1)) + ALLOCATE( ZWORKTEMP( 1 ) ) + allocate( tzdates( 1 ) ) ! - ZWORKDATIME(1,1)=TDTEXP%TDATE%YEAR - ZWORKDATIME(2,1)=TDTEXP%TDATE%MONTH - ZWORKDATIME(3,1)=TDTEXP%TDATE%DAY - ZWORKDATIME(4,1)=TDTEXP%TIME - ZWORKDATIME(5,1)=TDTSEG%TDATE%YEAR - ZWORKDATIME(6,1)=TDTSEG%TDATE%MONTH - ZWORKDATIME(7,1)=TDTSEG%TDATE%DAY - ZWORKDATIME(8,1)=TDTSEG%TIME - ZWORKDATIME(9,1)=TPDTMOD%TDATE%YEAR - ZWORKDATIME(10,1)=TPDTMOD%TDATE%MONTH - ZWORKDATIME(11,1)=TPDTMOD%TDATE%DAY - ZWORKDATIME(12,1)=TPDTMOD%TIME + !Compute time at the middle of the temporally-averaged budget timestep + !This time is computed from the beginning of the experiment + CALL DATETIME_DISTANCE(TDTEXP,TPDTCUR,ZWORKTEMP(1)) ! - CALL DATETIME_DISTANCE(TDTEXP,TPDTCUR,ZWORKTEMP(1,1)) + ZWORKTEMP(1)=ZWORKTEMP(1)+(1.-NBUSTEP*0.5)*PTSTEP ! - ZWORKTEMP(1,1)=ZWORKTEMP(1,1)+(1.-NBUSTEP*0.5)*PTSTEP -! - ZWORKDATIME(13,1)=TDTEXP%TDATE%YEAR - ZWORKDATIME(14,1)=TDTEXP%TDATE%MONTH - ZWORKDATIME(15,1)=TDTEXP%TDATE%DAY - ZWORKDATIME(16,1)=TDTEXP%TIME+ZWORKTEMP(1,1) + tzdates(1)%tdate%year = tdtexp%tdate%year + tzdates(1)%tdate%month = tdtexp%tdate%month + tzdates(1)%tdate%day = tdtexp%tdate%day + tzdates(1)%time = tdtexp%time + zworktemp(1) ! !* 2.2 storage of the budgets array ! @@ -301,11 +291,11 @@ SELECT CASE (CBUTYPE) WRITE(YGROUP_NAME,FMT="('UU___',I4.4)") NBUTSHIFT ! - CALL WRITE_DIACHRO(TPDIAFILE, TLUOUT, YGROUP_NAME, 'CART', IWORKGRID, & - ZWORKDATIME, ZWORKT, ZWORKTEMP, CBUCOMMENT(1, :), & - YWORKUNIT, YWORKCOMMENT, & - LBU_ICP, LBU_JCP, LBU_KCP, & - NBUIL, NBUIH, NBUJL, NBUJH, NBUKL, NBUKH ) + CALL WRITE_DIACHRO( TPDIAFILE, TLUOUT, YGROUP_NAME, 'CART', IWORKGRID, & + tzdates, ZWORKT, CBUCOMMENT(1, :), & + YWORKUNIT, YWORKCOMMENT, & + OICP = LBU_ICP, OJCP = LBU_JCP, OKCP = LBU_KCP, & + KIL = NBUIL, KIH = NBUIH, KJL = NBUJL, KJH = NBUJH, KKL = NBUKL, KKH = NBUKH ) DEALLOCATE(ZWORKT, YWORKUNIT, YWORKCOMMENT, IWORKGRID) ! ! XBURHODJU storage @@ -324,11 +314,11 @@ SELECT CASE (CBUTYPE) IWORKGRID(1) = 2 WRITE(YGROUP_NAME,FMT="('RJX__',I4.4)") NBUTSHIFT ! - CALL WRITE_DIACHRO(TPDIAFILE, TLUOUT, YGROUP_NAME,'CART', IWORKGRID, & - ZWORKDATIME, ZWORK, ZWORKTEMP, YBUCOMMENT, & - YWORKUNIT, YWORKCOMMENT, & - LBU_ICP, LBU_JCP, LBU_KCP, & - NBUIL, NBUIH, NBUJL, NBUJH, NBUKL, NBUKH ) + CALL WRITE_DIACHRO( TPDIAFILE, TLUOUT, YGROUP_NAME, 'CART', IWORKGRID, & + tzdates, ZWORK, YBUCOMMENT, & + YWORKUNIT, YWORKCOMMENT, & + OICP = LBU_ICP, OJCP = LBU_JCP, OKCP = LBU_KCP, & + KIL = NBUIL, KIH = NBUIH, KJL = NBUJL, KJH = NBUJH, KKL = NBUKL, KKH = NBUKH ) DEALLOCATE(ZWORK, YBUCOMMENT, YWORKUNIT, YWORKCOMMENT, IWORKGRID) END IF ! @@ -373,11 +363,11 @@ SELECT CASE (CBUTYPE) IWORKGRID(:) = 3 WRITE(YGROUP_NAME,FMT="('VV___',I4.4)") NBUTSHIFT ! - CALL WRITE_DIACHRO(TPDIAFILE, TLUOUT, YGROUP_NAME, 'CART', IWORKGRID, & - ZWORKDATIME, ZWORKT, ZWORKTEMP, CBUCOMMENT(IP, :), & - YWORKUNIT, YWORKCOMMENT, & - LBU_ICP, LBU_JCP, LBU_KCP, & - NBUIL, NBUIH, NBUJL, NBUJH, NBUKL, NBUKH ) + CALL WRITE_DIACHRO( TPDIAFILE, TLUOUT, YGROUP_NAME, 'CART', IWORKGRID, & + tzdates, ZWORKT, CBUCOMMENT(IP, :), & + YWORKUNIT, YWORKCOMMENT, & + OICP = LBU_ICP, OJCP = LBU_JCP, OKCP = LBU_KCP, & + KIL = NBUIL, KIH = NBUIH, KJL = NBUJL, KJH = NBUJH, KKL = NBUKL, KKH = NBUKH ) DEALLOCATE(ZWORKT, YWORKUNIT, YWORKCOMMENT, IWORKGRID) ! XBURHODJV storage IF (GNOCOMPRESS) THEN @@ -395,11 +385,11 @@ SELECT CASE (CBUTYPE) IWORKGRID(1) = 3 WRITE(YGROUP_NAME,FMT="('RJY__',I4.4)") NBUTSHIFT ! - CALL WRITE_DIACHRO(TPDIAFILE, TLUOUT, YGROUP_NAME,'CART', IWORKGRID, & - ZWORKDATIME, ZWORK, ZWORKTEMP, YBUCOMMENT, & - YWORKUNIT, YWORKCOMMENT, & - LBU_ICP, LBU_JCP, LBU_KCP, & - NBUIL, NBUIH, NBUJL, NBUJH, NBUKL, NBUKH ) + CALL WRITE_DIACHRO( TPDIAFILE, TLUOUT, YGROUP_NAME, 'CART', IWORKGRID, & + tzdates, ZWORK, YBUCOMMENT, & + YWORKUNIT, YWORKCOMMENT, & + OICP = LBU_ICP, OJCP = LBU_JCP, OKCP = LBU_KCP, & + KIL = NBUIL, KIH = NBUIH, KJL = NBUJL, KJH = NBUJH, KKL = NBUKL, KKH = NBUKH ) DEALLOCATE(YBUCOMMENT, YWORKUNIT, YWORKCOMMENT, IWORKGRID) DEALLOCATE(ZWORK) END IF @@ -444,11 +434,11 @@ SELECT CASE (CBUTYPE) YWORKCOMMENT(:) = 'Budget of momentum along Z axis' IWORKGRID(:) = 4 WRITE(YGROUP_NAME,FMT="('WW___',I4.4)") NBUTSHIFT - CALL WRITE_DIACHRO(TPDIAFILE, TLUOUT, YGROUP_NAME, 'CART', IWORKGRID, & - ZWORKDATIME, ZWORKT, ZWORKTEMP, CBUCOMMENT(IP, :), & - YWORKUNIT, YWORKCOMMENT, & - LBU_ICP, LBU_JCP, LBU_KCP, & - NBUIL, NBUIH, NBUJL, NBUJH, NBUKL, NBUKH ) + CALL WRITE_DIACHRO( TPDIAFILE, TLUOUT, YGROUP_NAME, 'CART', IWORKGRID, & + tzdates, ZWORKT, CBUCOMMENT(IP, :), & + YWORKUNIT, YWORKCOMMENT, & + OICP = LBU_ICP, OJCP = LBU_JCP, OKCP = LBU_KCP, & + KIL = NBUIL, KIH = NBUIH, KJL = NBUJL, KJH = NBUJH, KKL = NBUKL, KKH = NBUKH ) DEALLOCATE(ZWORKT, YWORKUNIT, YWORKCOMMENT, IWORKGRID) ! XBURHODJW storage IF (GNOCOMPRESS) THEN @@ -465,16 +455,15 @@ SELECT CASE (CBUTYPE) YWORKCOMMENT(1) = 'RhodJ for momentum along Z axis' IWORKGRID(1) = 4 WRITE(YGROUP_NAME,FMT="('RJZ__',I4.4)") NBUTSHIFT -! - CALL WRITE_DIACHRO(TPDIAFILE, TLUOUT, YGROUP_NAME,'CART', IWORKGRID, & - ZWORKDATIME, ZWORK, ZWORKTEMP, YBUCOMMENT, & - YWORKUNIT, YWORKCOMMENT, & - LBU_ICP, LBU_JCP, LBU_KCP, & - NBUIL, NBUIH, NBUJL, NBUJH, NBUKL, NBUKH ) +! + CALL WRITE_DIACHRO( TPDIAFILE, TLUOUT, YGROUP_NAME, 'CART', IWORKGRID, & + tzdates, ZWORK, YBUCOMMENT, & + YWORKUNIT, YWORKCOMMENT, & + OICP = LBU_ICP, OJCP = LBU_JCP, OKCP = LBU_KCP, & + KIL = NBUIL, KIH = NBUIH, KJL = NBUJL, KJH = NBUJH, KKL = NBUKL, KKH = NBUKH ) DEALLOCATE(YBUCOMMENT, YWORKUNIT, YWORKCOMMENT, IWORKGRID) DEALLOCATE(ZWORK) END IF - ! !* 2.2.3' XBURHODJ storage for Scalars ! @@ -499,11 +488,11 @@ SELECT CASE (CBUTYPE) IWORKGRID(1) = 1 WRITE(YGROUP_NAME,FMT="('RJS__',I4.4)") NBUTSHIFT ! - CALL WRITE_DIACHRO(TPDIAFILE, TLUOUT, YGROUP_NAME, 'CART', IWORKGRID, & - ZWORKDATIME, ZWORK, ZWORKTEMP, YBUCOMMENT, & - YWORKUNIT, YWORKCOMMENT, & - LBU_ICP, LBU_JCP, LBU_KCP, & - NBUIL, NBUIH, NBUJL, NBUJH, NBUKL, NBUKH ) + CALL WRITE_DIACHRO( TPDIAFILE, TLUOUT, YGROUP_NAME, 'CART', IWORKGRID, & + tzdates, ZWORK, YBUCOMMENT, & + YWORKUNIT, YWORKCOMMENT, & + OICP = LBU_ICP, OJCP = LBU_JCP, OKCP = LBU_KCP, & + KIL = NBUIL, KIH = NBUIH, KJL = NBUJL, KJH = NBUJH, KKL = NBUKL, KKH = NBUKH ) IF (GNOCOMPRESS) THEN DEALLOCATE(ZWORK, YBUCOMMENT, YWORKUNIT, YWORKCOMMENT, IWORKGRID) ELSE @@ -549,11 +538,11 @@ SELECT CASE (CBUTYPE) IWORKGRID(:) = 1 WRITE(YGROUP_NAME,FMT="('TH___',I4.4)") NBUTSHIFT ! - CALL WRITE_DIACHRO(TPDIAFILE, TLUOUT, YGROUP_NAME, 'CART', IWORKGRID, & - ZWORKDATIME, ZWORKT, ZWORKTEMP, CBUCOMMENT(IP, :), & - YWORKUNIT, YWORKCOMMENT, & - LBU_ICP, LBU_JCP, LBU_KCP, & - NBUIL, NBUIH, NBUJL, NBUJH, NBUKL, NBUKH ) + CALL WRITE_DIACHRO( TPDIAFILE, TLUOUT, YGROUP_NAME, 'CART', IWORKGRID, & + tzdates, ZWORKT, CBUCOMMENT(IP, :), & + YWORKUNIT, YWORKCOMMENT, & + OICP = LBU_ICP, OJCP = LBU_JCP, OKCP = LBU_KCP, & + KIL = NBUIL, KIH = NBUIH, KJL = NBUJL, KJH = NBUJH, KKL = NBUKL, KKH = NBUKH ) DEALLOCATE(ZWORKT, YWORKUNIT, YWORKCOMMENT, IWORKGRID) ! END IF @@ -595,11 +584,11 @@ SELECT CASE (CBUTYPE) IWORKGRID(:) = 1 WRITE(YGROUP_NAME,FMT="('TK___',I4.4)") NBUTSHIFT ! - CALL WRITE_DIACHRO(TPDIAFILE, TLUOUT, YGROUP_NAME, 'CART', IWORKGRID, & - ZWORKDATIME, ZWORKT, ZWORKTEMP, CBUCOMMENT(IP, :), & - YWORKUNIT, YWORKCOMMENT, & - LBU_ICP, LBU_JCP, LBU_KCP, & - NBUIL, NBUIH, NBUJL, NBUJH, NBUKL, NBUKH ) + CALL WRITE_DIACHRO( TPDIAFILE, TLUOUT, YGROUP_NAME, 'CART', IWORKGRID, & + tzdates, ZWORKT, CBUCOMMENT(IP, :), & + YWORKUNIT, YWORKCOMMENT, & + OICP = LBU_ICP, OJCP = LBU_JCP, OKCP = LBU_KCP, & + KIL = NBUIL, KIH = NBUIH, KJL = NBUJL, KJH = NBUJH, KKL = NBUKL, KKH = NBUKH ) DEALLOCATE(ZWORKT, YWORKUNIT, YWORKCOMMENT, IWORKGRID) ! END IF @@ -641,11 +630,11 @@ SELECT CASE (CBUTYPE) IWORKGRID(:) = 1 WRITE(YGROUP_NAME,FMT="('RV___',I4.4)") NBUTSHIFT ! - CALL WRITE_DIACHRO(TPDIAFILE, TLUOUT, YGROUP_NAME, 'CART', IWORKGRID, & - ZWORKDATIME, ZWORKT, ZWORKTEMP, CBUCOMMENT(IP, :), & - YWORKUNIT, YWORKCOMMENT, & - LBU_ICP, LBU_JCP, LBU_KCP, & - NBUIL, NBUIH, NBUJL, NBUJH, NBUKL, NBUKH ) + CALL WRITE_DIACHRO( TPDIAFILE, TLUOUT, YGROUP_NAME, 'CART', IWORKGRID, & + tzdates, ZWORKT, CBUCOMMENT(IP, :), & + YWORKUNIT, YWORKCOMMENT, & + OICP = LBU_ICP, OJCP = LBU_JCP, OKCP = LBU_KCP, & + KIL = NBUIL, KIH = NBUIH, KJL = NBUJL, KJH = NBUJH, KKL = NBUKL, KKH = NBUKH ) DEALLOCATE(ZWORKT, YWORKUNIT, YWORKCOMMENT, IWORKGRID) ! END IF @@ -687,11 +676,11 @@ SELECT CASE (CBUTYPE) IWORKGRID(:) = 1 WRITE(YGROUP_NAME,FMT="('RC___',I4.4)") NBUTSHIFT ! - CALL WRITE_DIACHRO(TPDIAFILE, TLUOUT, YGROUP_NAME, 'CART', IWORKGRID, & - ZWORKDATIME, ZWORKT, ZWORKTEMP, CBUCOMMENT(IP, :), & - YWORKUNIT, YWORKCOMMENT, & - LBU_ICP, LBU_JCP, LBU_KCP, & - NBUIL, NBUIH, NBUJL, NBUJH, NBUKL, NBUKH ) + CALL WRITE_DIACHRO( TPDIAFILE, TLUOUT, YGROUP_NAME, 'CART', IWORKGRID, & + tzdates, ZWORKT, CBUCOMMENT(IP, :), & + YWORKUNIT, YWORKCOMMENT, & + OICP = LBU_ICP, OJCP = LBU_JCP, OKCP = LBU_KCP, & + KIL = NBUIL, KIH = NBUIH, KJL = NBUJL, KJH = NBUJH, KKL = NBUKL, KKH = NBUKH ) DEALLOCATE(ZWORKT, YWORKUNIT, YWORKCOMMENT, IWORKGRID) ! END IF @@ -732,11 +721,11 @@ SELECT CASE (CBUTYPE) IWORKGRID(:) = 1 WRITE(YGROUP_NAME,FMT="('RR___',I4.4)") NBUTSHIFT ! - CALL WRITE_DIACHRO(TPDIAFILE, TLUOUT, YGROUP_NAME, 'CART', IWORKGRID, & - ZWORKDATIME, ZWORKT, ZWORKTEMP, CBUCOMMENT(IP, :), & - YWORKUNIT, YWORKCOMMENT, & - LBU_ICP, LBU_JCP, LBU_KCP, & - NBUIL, NBUIH, NBUJL, NBUJH, NBUKL, NBUKH ) + CALL WRITE_DIACHRO( TPDIAFILE, TLUOUT, YGROUP_NAME, 'CART', IWORKGRID, & + tzdates, ZWORKT, CBUCOMMENT(IP, :), & + YWORKUNIT, YWORKCOMMENT, & + OICP = LBU_ICP, OJCP = LBU_JCP, OKCP = LBU_KCP, & + KIL = NBUIL, KIH = NBUIH, KJL = NBUJL, KJH = NBUJH, KKL = NBUKL, KKH = NBUKH ) DEALLOCATE(ZWORKT, YWORKUNIT, YWORKCOMMENT, IWORKGRID) ! END IF @@ -777,11 +766,11 @@ SELECT CASE (CBUTYPE) IWORKGRID(:) = 1 WRITE(YGROUP_NAME,FMT="('RI___',I4.4)") NBUTSHIFT ! - CALL WRITE_DIACHRO(TPDIAFILE, TLUOUT, YGROUP_NAME, 'CART', IWORKGRID, & - ZWORKDATIME, ZWORKT, ZWORKTEMP, CBUCOMMENT(IP, :), & - YWORKUNIT, YWORKCOMMENT, & - LBU_ICP, LBU_JCP, LBU_KCP, & - NBUIL, NBUIH, NBUJL, NBUJH, NBUKL, NBUKH ) + CALL WRITE_DIACHRO( TPDIAFILE, TLUOUT, YGROUP_NAME, 'CART', IWORKGRID, & + tzdates, ZWORKT, CBUCOMMENT(IP, :), & + YWORKUNIT, YWORKCOMMENT, & + OICP = LBU_ICP, OJCP = LBU_JCP, OKCP = LBU_KCP, & + KIL = NBUIL, KIH = NBUIH, KJL = NBUJL, KJH = NBUJH, KKL = NBUKL, KKH = NBUKH ) DEALLOCATE(ZWORKT, YWORKUNIT, YWORKCOMMENT, IWORKGRID) ! END IF @@ -822,11 +811,11 @@ SELECT CASE (CBUTYPE) IWORKGRID(:) = 1 WRITE(YGROUP_NAME,FMT="('RS___',I4.4)") NBUTSHIFT ! - CALL WRITE_DIACHRO(TPDIAFILE, TLUOUT, YGROUP_NAME, 'CART', IWORKGRID, & - ZWORKDATIME, ZWORKT, ZWORKTEMP, CBUCOMMENT(IP, :), & - YWORKUNIT, YWORKCOMMENT, & - LBU_ICP, LBU_JCP, LBU_KCP, & - NBUIL, NBUIH, NBUJL, NBUJH, NBUKL, NBUKH ) + CALL WRITE_DIACHRO( TPDIAFILE, TLUOUT, YGROUP_NAME, 'CART', IWORKGRID, & + tzdates, ZWORKT, CBUCOMMENT(IP, :), & + YWORKUNIT, YWORKCOMMENT, & + OICP = LBU_ICP, OJCP = LBU_JCP, OKCP = LBU_KCP, & + KIL = NBUIL, KIH = NBUIH, KJL = NBUJL, KJH = NBUJH, KKL = NBUKL, KKH = NBUKH ) DEALLOCATE(ZWORKT, YWORKUNIT, YWORKCOMMENT, IWORKGRID) ! END IF @@ -867,11 +856,11 @@ SELECT CASE (CBUTYPE) IWORKGRID(:) = 1 WRITE(YGROUP_NAME,FMT="('RG___',I4.4)") NBUTSHIFT ! - CALL WRITE_DIACHRO(TPDIAFILE, TLUOUT, YGROUP_NAME, 'CART', IWORKGRID, & - ZWORKDATIME, ZWORKT, ZWORKTEMP, CBUCOMMENT(IP, :), & - YWORKUNIT, YWORKCOMMENT, & - LBU_ICP, LBU_JCP, LBU_KCP, & - NBUIL, NBUIH, NBUJL, NBUJH, NBUKL, NBUKH ) + CALL WRITE_DIACHRO( TPDIAFILE, TLUOUT, YGROUP_NAME, 'CART', IWORKGRID, & + tzdates, ZWORKT, CBUCOMMENT(IP, :), & + YWORKUNIT, YWORKCOMMENT, & + OICP = LBU_ICP, OJCP = LBU_JCP, OKCP = LBU_KCP, & + KIL = NBUIL, KIH = NBUIH, KJL = NBUJL, KJH = NBUJH, KKL = NBUKL, KKH = NBUKH ) DEALLOCATE(ZWORKT, YWORKUNIT, YWORKCOMMENT, IWORKGRID) ! END IF @@ -912,11 +901,11 @@ SELECT CASE (CBUTYPE) IWORKGRID(:) = 1 WRITE(YGROUP_NAME,FMT="('RH___',I4.4)") NBUTSHIFT ! - CALL WRITE_DIACHRO(TPDIAFILE, TLUOUT, YGROUP_NAME, 'CART', IWORKGRID, & - ZWORKDATIME, ZWORKT, ZWORKTEMP, CBUCOMMENT(IP, :), & - YWORKUNIT, YWORKCOMMENT, & - LBU_ICP, LBU_JCP, LBU_KCP, & - NBUIL, NBUIH, NBUJL, NBUJH, NBUKL, NBUKH ) + CALL WRITE_DIACHRO( TPDIAFILE, TLUOUT, YGROUP_NAME, 'CART', IWORKGRID, & + tzdates, ZWORKT, CBUCOMMENT(IP, :), & + YWORKUNIT, YWORKCOMMENT, & + OICP = LBU_ICP, OJCP = LBU_JCP, OKCP = LBU_KCP, & + KIL = NBUIL, KIH = NBUIH, KJL = NBUJL, KJH = NBUJH, KKL = NBUKL, KKH = NBUKH ) DEALLOCATE(ZWORKT, YWORKUNIT, YWORKCOMMENT, IWORKGRID) ! END IF @@ -961,26 +950,27 @@ SELECT CASE (CBUTYPE) IWORKGRID(:) = 1 WRITE(YGROUP_NAME,FMT="('SV',I3.3,I4.4)") JSV,NBUTSHIFT ! - CALL WRITE_DIACHRO(TPDIAFILE, TLUOUT, YGROUP_NAME, 'CART', IWORKGRID, & - ZWORKDATIME, ZWORKT, ZWORKTEMP, CBUCOMMENT(IP, :), & - YWORKUNIT, YWORKCOMMENT, & - LBU_ICP, LBU_JCP, LBU_KCP, & - NBUIL, NBUIH, NBUJL, NBUJH, NBUKL, NBUKH ) + CALL WRITE_DIACHRO( TPDIAFILE, TLUOUT, YGROUP_NAME, 'CART', IWORKGRID, & + tzdates, ZWORKT, CBUCOMMENT(IP, :), & + YWORKUNIT, YWORKCOMMENT, & + OICP = LBU_ICP, OJCP = LBU_JCP, OKCP = LBU_KCP, & + KIL = NBUIL, KIH = NBUIH, KJL = NBUJL, KJH = NBUJH, KKL = NBUKL, KKH = NBUKH ) DEALLOCATE(ZWORKT, YWORKUNIT, YWORKCOMMENT, IWORKGRID) ! END DO END IF ! IF (ALLOCATED(ZWORK)) DEALLOCATE(ZWORK) - DEALLOCATE (ZWORKTEMP, ZWORKDATIME) + DEALLOCATE (ZWORKTEMP) + deallocate( tzdates ) !------------------------------------------------------------------------------- ! !* 3. 'MASK' CASE ! ----------- ! CASE('MASK') - ALLOCATE(ZWORKTEMP(NBUWRNB,1)) - ALLOCATE(ZWORKDATIME(16,NBUWRNB)) + ALLOCATE(ZWORKTEMP(NBUWRNB)) + allocate( tzdates( NBUWRNB ) ) ALLOCATE(ZWORKMASK(SIZE(XBUSURF,1),SIZE(XBUSURF,2),1,NBUWRNB,NBUMASK,1)) ! ! local array @@ -990,33 +980,20 @@ SELECT CASE (CBUTYPE) END DO END DO ! - ZWORKDATIME(1,:)=TDTEXP%TDATE%YEAR - ZWORKDATIME(2,:)=TDTEXP%TDATE%MONTH - ZWORKDATIME(3,:)=TDTEXP%TDATE%DAY - ZWORKDATIME(4,:)=TDTEXP%TIME - ZWORKDATIME(5,:)=TDTSEG%TDATE%YEAR - ZWORKDATIME(6,:)=TDTSEG%TDATE%MONTH - ZWORKDATIME(7,:)=TDTSEG%TDATE%DAY - ZWORKDATIME(8,:)=TDTSEG%TIME - ZWORKDATIME(9,:)=TPDTMOD%TDATE%YEAR - ZWORKDATIME(10,:)=TPDTMOD%TDATE%MONTH - ZWORKDATIME(11,:)=TPDTMOD%TDATE%DAY - ZWORKDATIME(12,:)=TPDTMOD%TIME -! - CALL DATETIME_DISTANCE(TDTEXP,TPDTCUR,ZWORKTEMP(NBUWRNB,1)) -! - ZWORKTEMP(NBUWRNB,1)=ZWORKTEMP(NBUWRNB,1)+(1.-NBUSTEP*0.5)*PTSTEP -! - ZWORKDATIME(13,NBUWRNB)=TDTEXP%TDATE%YEAR - ZWORKDATIME(14,NBUWRNB)=TDTEXP%TDATE%MONTH - ZWORKDATIME(15,NBUWRNB)=TDTEXP%TDATE%DAY - ZWORKDATIME(16,NBUWRNB)=TDTEXP%TIME+ZWORKTEMP(NBUWRNB,1) + CALL DATETIME_DISTANCE(TDTEXP,TPDTCUR,ZWORKTEMP(NBUWRNB)) +! + ZWORKTEMP(NBUWRNB)=ZWORKTEMP(NBUWRNB)+(1.-NBUSTEP*0.5)*PTSTEP +! + tzdates(NBUWRNB )%tdate%year = tdtexp%tdate%year + tzdates(NBUWRNB )%tdate%month = tdtexp%tdate%month + tzdates(NBUWRNB )%tdate%day = tdtexp%tdate%day + tzdates(NBUWRNB )%time = tdtexp%time + zworktemp(NBUWRNB ) DO JT=1,NBUWRNB-1 - ZWORKTEMP(JT,1) = ZWORKTEMP(NBUWRNB,1)-NBUSTEP*PTSTEP*(NBUWRNB-JT) - ZWORKDATIME(13,JT)=TDTEXP%TDATE%YEAR - ZWORKDATIME(14,JT)=TDTEXP%TDATE%MONTH - ZWORKDATIME(15,JT)=TDTEXP%TDATE%DAY - ZWORKDATIME(16,JT)=TDTEXP%TIME + ZWORKTEMP(JT,1) + ZWORKTEMP(JT) = ZWORKTEMP(NBUWRNB)-NBUSTEP*PTSTEP*(NBUWRNB-JT) + tzdates(jt )%tdate%year = tdtexp%tdate%year + tzdates(jt )%tdate%month = tdtexp%tdate%month + tzdates(jt )%tdate%day = tdtexp%tdate%day + tzdates(jt )%time = tdtexp%time + zworktemp(jt ) END DO ! !* 3.1 storage of the masks array @@ -1057,11 +1034,11 @@ SELECT CASE (CBUTYPE) IWORKGRID(:) = 2 WRITE(YGROUP_NAME,FMT="('RJX__',I4.4)") NBUTSHIFT ! - CALL WRITE_DIACHRO(TPDIAFILE, TLUOUT, YGROUP_NAME, CBUTYPE, IWORKGRID, & - ZWORKDATIME, ZWORK, ZWORKTEMP, CBUCOMMENT(1, :), & - YWORKUNIT, YWORKCOMMENT, & - LBU_ICP, LBU_JCP, LBU_KCP, & - NBUIL, NBUIH, NBUJL, NBUJH, NBUKL, NBUKH ) + CALL WRITE_DIACHRO( TPDIAFILE, TLUOUT, YGROUP_NAME, CBUTYPE, IWORKGRID, & + tzdates, ZWORK, CBUCOMMENT(1, :), & + YWORKUNIT, YWORKCOMMENT, & + OICP = LBU_ICP, OJCP = LBU_JCP, OKCP = LBU_KCP, & + KIL = NBUIL, KIH = NBUIH, KJL = NBUJL, KJH = NBUJH, KKL = NBUKL, KKH = NBUKH ) DEALLOCATE( YWORKUNIT, YWORKCOMMENT, IWORKGRID) ! ! unit conversion of RU budgets and storage @@ -1088,11 +1065,11 @@ SELECT CASE (CBUTYPE) IWORKGRID(:) = 2 WRITE(YGROUP_NAME,FMT="('UU___',I4.4)") NBUTSHIFT ! - CALL WRITE_DIACHRO(TPDIAFILE, TLUOUT, YGROUP_NAME, CBUTYPE, IWORKGRID, & - ZWORKDATIME, ZWORKT, ZWORKTEMP, CBUCOMMENT(1, :), & - YWORKUNIT, YWORKCOMMENT, & - LBU_ICP, LBU_JCP, LBU_KCP, & - NBUIL, NBUIH, NBUJL, NBUJH, NBUKL, NBUKH ) + CALL WRITE_DIACHRO( TPDIAFILE, TLUOUT, YGROUP_NAME, CBUTYPE, IWORKGRID, & + tzdates, ZWORKT, CBUCOMMENT(1, :), & + YWORKUNIT, YWORKCOMMENT, & + OICP = LBU_ICP, OJCP = LBU_JCP, OKCP = LBU_KCP, & + KIL = NBUIL, KIH = NBUIH, KJL = NBUJL, KJH = NBUJH, KKL = NBUKL, KKH = NBUKH ) DEALLOCATE(ZWORKT, YWORKUNIT, YWORKCOMMENT, IWORKGRID) END IF ! @@ -1115,11 +1092,11 @@ SELECT CASE (CBUTYPE) IWORKGRID(:) = 3 WRITE(YGROUP_NAME,FMT="('RJY__',I4.4)") NBUTSHIFT ! - CALL WRITE_DIACHRO(TPDIAFILE, TLUOUT, YGROUP_NAME, CBUTYPE, IWORKGRID, & - ZWORKDATIME, ZWORK, ZWORKTEMP, CBUCOMMENT(1, :), & - YWORKUNIT, YWORKCOMMENT, & - LBU_ICP, LBU_JCP, LBU_KCP, & - NBUIL, NBUIH, NBUJL, NBUJH, NBUKL, NBUKH ) + CALL WRITE_DIACHRO( TPDIAFILE, TLUOUT, YGROUP_NAME, CBUTYPE, IWORKGRID, & + tzdates, ZWORK, CBUCOMMENT(1, :), & + YWORKUNIT, YWORKCOMMENT, & + OICP = LBU_ICP, OJCP = LBU_JCP, OKCP = LBU_KCP, & + KIL = NBUIL, KIH = NBUIH, KJL = NBUJL, KJH = NBUJH, KKL = NBUKL, KKH = NBUKH ) DEALLOCATE( YWORKUNIT, YWORKCOMMENT, IWORKGRID) ! ! unit conversion of RU budgets and storage @@ -1144,11 +1121,11 @@ SELECT CASE (CBUTYPE) IWORKGRID(:) = 3 WRITE(YGROUP_NAME,FMT="('VV___',I4.4)") NBUTSHIFT ! - CALL WRITE_DIACHRO(TPDIAFILE, TLUOUT, YGROUP_NAME, CBUTYPE, IWORKGRID, & - ZWORKDATIME, ZWORKT, ZWORKTEMP, CBUCOMMENT(2, :), & - YWORKUNIT, YWORKCOMMENT, & - LBU_ICP, LBU_JCP, LBU_KCP, & - NBUIL, NBUIH, NBUJL, NBUJH, NBUKL, NBUKH ) + CALL WRITE_DIACHRO( TPDIAFILE, TLUOUT, YGROUP_NAME, CBUTYPE, IWORKGRID, & + tzdates, ZWORKT, CBUCOMMENT(2, :), & + YWORKUNIT, YWORKCOMMENT, & + OICP = LBU_ICP, OJCP = LBU_JCP, OKCP = LBU_KCP, & + KIL = NBUIL, KIH = NBUIH, KJL = NBUJL, KJH = NBUJH, KKL = NBUKL, KKH = NBUKH ) DEALLOCATE(ZWORKT, YWORKUNIT, YWORKCOMMENT, IWORKGRID) END IF ! @@ -1171,11 +1148,11 @@ SELECT CASE (CBUTYPE) IWORKGRID(:) = 4 WRITE(YGROUP_NAME,FMT="('RJZ__',I4.4)") NBUTSHIFT ! - CALL WRITE_DIACHRO(TPDIAFILE, TLUOUT, YGROUP_NAME, CBUTYPE, IWORKGRID, & - ZWORKDATIME, ZWORK, ZWORKTEMP, CBUCOMMENT(1, :), & - YWORKUNIT, YWORKCOMMENT, & - LBU_ICP, LBU_JCP, LBU_KCP, & - NBUIL, NBUIH, NBUJL, NBUJH, NBUKL, NBUKH ) + CALL WRITE_DIACHRO( TPDIAFILE, TLUOUT, YGROUP_NAME, CBUTYPE, IWORKGRID, & + tzdates, ZWORK, CBUCOMMENT(1, :), & + YWORKUNIT, YWORKCOMMENT, & + OICP = LBU_ICP, OJCP = LBU_JCP, OKCP = LBU_KCP, & + KIL = NBUIL, KIH = NBUIH, KJL = NBUJL, KJH = NBUJH, KKL = NBUKL, KKH = NBUKH ) DEALLOCATE( YWORKUNIT, YWORKCOMMENT, IWORKGRID) ! ! unit conversion of RU budgets and storage @@ -1200,11 +1177,11 @@ SELECT CASE (CBUTYPE) IWORKGRID(:) = 4 WRITE(YGROUP_NAME,FMT="('WW___',I4.4)") NBUTSHIFT ! - CALL WRITE_DIACHRO(TPDIAFILE, TLUOUT, YGROUP_NAME, CBUTYPE, IWORKGRID, & - ZWORKDATIME, ZWORKT, ZWORKTEMP, CBUCOMMENT(3, :), & - YWORKUNIT, YWORKCOMMENT, & - LBU_ICP, LBU_JCP, LBU_KCP, & - NBUIL, NBUIH, NBUJL, NBUJH, NBUKL, NBUKH ) + CALL WRITE_DIACHRO( TPDIAFILE, TLUOUT, YGROUP_NAME, CBUTYPE, IWORKGRID, & + tzdates, ZWORKT, CBUCOMMENT(3, :), & + YWORKUNIT, YWORKCOMMENT, & + OICP = LBU_ICP, OJCP = LBU_JCP, OKCP = LBU_KCP, & + KIL = NBUIL, KIH = NBUIH, KJL = NBUJL, KJH = NBUJH, KKL = NBUKL, KKH = NBUKH ) DEALLOCATE(ZWORKT, YWORKUNIT, YWORKCOMMENT, IWORKGRID) END IF ! @@ -1227,11 +1204,11 @@ SELECT CASE (CBUTYPE) IWORKGRID(:) = 1 WRITE(YGROUP_NAME,FMT="('RJS__',I4.4)") NBUTSHIFT ! - CALL WRITE_DIACHRO(TPDIAFILE, TLUOUT, YGROUP_NAME, CBUTYPE, IWORKGRID, & - ZWORKDATIME, ZWORK, ZWORKTEMP, CBUCOMMENT(1, :), & - YWORKUNIT, YWORKCOMMENT, & - LBU_ICP, LBU_JCP, LBU_KCP, & - NBUIL, NBUIH, NBUJL, NBUJH, NBUKL, NBUKH ) + CALL WRITE_DIACHRO( TPDIAFILE, TLUOUT, YGROUP_NAME, CBUTYPE, IWORKGRID, & + tzdates, ZWORK, CBUCOMMENT(1, :), & + YWORKUNIT, YWORKCOMMENT, & + OICP = LBU_ICP, OJCP = LBU_JCP, OKCP = LBU_KCP, & + KIL = NBUIL, KIH = NBUIH, KJL = NBUJL, KJH = NBUJH, KKL = NBUKL, KKH = NBUKH ) DEALLOCATE( YWORKUNIT, YWORKCOMMENT, IWORKGRID) END IF ! @@ -1258,11 +1235,11 @@ SELECT CASE (CBUTYPE) IWORKGRID(:) = 1 WRITE(YGROUP_NAME,FMT="('TH___',I4.4)") NBUTSHIFT ! - CALL WRITE_DIACHRO(TPDIAFILE, TLUOUT, YGROUP_NAME, CBUTYPE, IWORKGRID, & - ZWORKDATIME, ZWORKT, ZWORKTEMP, CBUCOMMENT(4, :), & - YWORKUNIT, YWORKCOMMENT, & - LBU_ICP, LBU_JCP, LBU_KCP, & - NBUIL, NBUIH, NBUJL, NBUJH, NBUKL, NBUKH ) + CALL WRITE_DIACHRO( TPDIAFILE, TLUOUT, YGROUP_NAME, CBUTYPE, IWORKGRID, & + tzdates, ZWORKT, CBUCOMMENT(4, :), & + YWORKUNIT, YWORKCOMMENT, & + OICP = LBU_ICP, OJCP = LBU_JCP, OKCP = LBU_KCP, & + KIL = NBUIL, KIH = NBUIH, KJL = NBUJL, KJH = NBUJH, KKL = NBUKL, KKH = NBUKH ) DEALLOCATE(ZWORKT, YWORKUNIT, YWORKCOMMENT, IWORKGRID) END IF ! @@ -1289,11 +1266,11 @@ SELECT CASE (CBUTYPE) IWORKGRID(:) = 1 WRITE(YGROUP_NAME,FMT="('TK___',I4.4)") NBUTSHIFT ! - CALL WRITE_DIACHRO(TPDIAFILE, TLUOUT, YGROUP_NAME, CBUTYPE, IWORKGRID, & - ZWORKDATIME, ZWORKT, ZWORKTEMP, CBUCOMMENT(5, :), & - YWORKUNIT, YWORKCOMMENT, & - LBU_ICP, LBU_JCP, LBU_KCP, & - NBUIL, NBUIH, NBUJL, NBUJH, NBUKL, NBUKH ) + CALL WRITE_DIACHRO( TPDIAFILE, TLUOUT, YGROUP_NAME, CBUTYPE, IWORKGRID, & + tzdates, ZWORKT, CBUCOMMENT(5, :), & + YWORKUNIT, YWORKCOMMENT, & + OICP = LBU_ICP, OJCP = LBU_JCP, OKCP = LBU_KCP, & + KIL = NBUIL, KIH = NBUIH, KJL = NBUJL, KJH = NBUJH, KKL = NBUKL, KKH = NBUKH ) DEALLOCATE(ZWORKT, YWORKUNIT, YWORKCOMMENT, IWORKGRID) END IF ! @@ -1320,11 +1297,11 @@ SELECT CASE (CBUTYPE) IWORKGRID(:) = 1 WRITE(YGROUP_NAME,FMT="('RV___',I4.4)") NBUTSHIFT ! - CALL WRITE_DIACHRO(TPDIAFILE, TLUOUT, YGROUP_NAME, CBUTYPE, IWORKGRID, & - ZWORKDATIME, ZWORKT, ZWORKTEMP, CBUCOMMENT(6, :), & - YWORKUNIT, YWORKCOMMENT, & - LBU_ICP, LBU_JCP, LBU_KCP, & - NBUIL, NBUIH, NBUJL, NBUJH, NBUKL, NBUKH ) + CALL WRITE_DIACHRO( TPDIAFILE, TLUOUT, YGROUP_NAME, CBUTYPE, IWORKGRID, & + tzdates, ZWORKT, CBUCOMMENT(6, :), & + YWORKUNIT, YWORKCOMMENT, & + OICP = LBU_ICP, OJCP = LBU_JCP, OKCP = LBU_KCP, & + KIL = NBUIL, KIH = NBUIH, KJL = NBUJL, KJH = NBUJH, KKL = NBUKL, KKH = NBUKH ) DEALLOCATE(ZWORKT, YWORKUNIT, YWORKCOMMENT, IWORKGRID) END IF ! @@ -1351,11 +1328,11 @@ SELECT CASE (CBUTYPE) IWORKGRID(:) = 1 WRITE(YGROUP_NAME,FMT="('RC___',I4.4)") NBUTSHIFT ! - CALL WRITE_DIACHRO(TPDIAFILE, TLUOUT, YGROUP_NAME, CBUTYPE, IWORKGRID, & - ZWORKDATIME, ZWORKT, ZWORKTEMP, CBUCOMMENT(7, :), & - YWORKUNIT, YWORKCOMMENT, & - LBU_ICP, LBU_JCP, LBU_KCP, & - NBUIL, NBUIH, NBUJL, NBUJH, NBUKL, NBUKH ) + CALL WRITE_DIACHRO( TPDIAFILE, TLUOUT, YGROUP_NAME, CBUTYPE, IWORKGRID, & + tzdates, ZWORKT, CBUCOMMENT(7, :), & + YWORKUNIT, YWORKCOMMENT, & + OICP = LBU_ICP, OJCP = LBU_JCP, OKCP = LBU_KCP, & + KIL = NBUIL, KIH = NBUIH, KJL = NBUJL, KJH = NBUJH, KKL = NBUKL, KKH = NBUKH ) DEALLOCATE(ZWORKT, YWORKUNIT, YWORKCOMMENT, IWORKGRID) END IF ! @@ -1382,11 +1359,11 @@ SELECT CASE (CBUTYPE) IWORKGRID(:) = 1 WRITE(YGROUP_NAME,FMT="('RR___',I4.4)") NBUTSHIFT ! - CALL WRITE_DIACHRO(TPDIAFILE, TLUOUT, YGROUP_NAME, CBUTYPE, IWORKGRID, & - ZWORKDATIME, ZWORKT, ZWORKTEMP, CBUCOMMENT(8, :), & - YWORKUNIT, YWORKCOMMENT, & - LBU_ICP, LBU_JCP, LBU_KCP, & - NBUIL, NBUIH, NBUJL, NBUJH, NBUKL, NBUKH ) + CALL WRITE_DIACHRO( TPDIAFILE, TLUOUT, YGROUP_NAME, CBUTYPE, IWORKGRID, & + tzdates, ZWORKT, CBUCOMMENT(8, :), & + YWORKUNIT, YWORKCOMMENT, & + OICP = LBU_ICP, OJCP = LBU_JCP, OKCP = LBU_KCP, & + KIL = NBUIL, KIH = NBUIH, KJL = NBUJL, KJH = NBUJH, KKL = NBUKL, KKH = NBUKH ) DEALLOCATE(ZWORKT, YWORKUNIT, YWORKCOMMENT, IWORKGRID) END IF ! @@ -1413,11 +1390,11 @@ SELECT CASE (CBUTYPE) IWORKGRID(:) = 1 WRITE(YGROUP_NAME,FMT="('RI___',I4.4)") NBUTSHIFT ! - CALL WRITE_DIACHRO(TPDIAFILE, TLUOUT, YGROUP_NAME, CBUTYPE, IWORKGRID, & - ZWORKDATIME, ZWORKT, ZWORKTEMP, CBUCOMMENT(9, :), & - YWORKUNIT, YWORKCOMMENT, & - LBU_ICP, LBU_JCP, LBU_KCP, & - NBUIL, NBUIH, NBUJL, NBUJH, NBUKL, NBUKH ) + CALL WRITE_DIACHRO( TPDIAFILE, TLUOUT, YGROUP_NAME, CBUTYPE, IWORKGRID, & + tzdates, ZWORKT, CBUCOMMENT(9, :), & + YWORKUNIT, YWORKCOMMENT, & + OICP = LBU_ICP, OJCP = LBU_JCP, OKCP = LBU_KCP, & + KIL = NBUIL, KIH = NBUIH, KJL = NBUJL, KJH = NBUJH, KKL = NBUKL, KKH = NBUKH ) DEALLOCATE(ZWORKT, YWORKUNIT, YWORKCOMMENT, IWORKGRID) END IF ! @@ -1444,11 +1421,11 @@ SELECT CASE (CBUTYPE) IWORKGRID(:) = 1 WRITE(YGROUP_NAME,FMT="('RS___',I4.4)") NBUTSHIFT ! - CALL WRITE_DIACHRO(TPDIAFILE, TLUOUT, YGROUP_NAME, CBUTYPE, IWORKGRID, & - ZWORKDATIME, ZWORKT, ZWORKTEMP, CBUCOMMENT(10, :), & - YWORKUNIT, YWORKCOMMENT, & - LBU_ICP, LBU_JCP, LBU_KCP, & - NBUIL, NBUIH, NBUJL, NBUJH, NBUKL, NBUKH ) + CALL WRITE_DIACHRO( TPDIAFILE, TLUOUT, YGROUP_NAME, CBUTYPE, IWORKGRID, & + tzdates, ZWORKT, CBUCOMMENT(10, :), & + YWORKUNIT, YWORKCOMMENT, & + OICP = LBU_ICP, OJCP = LBU_JCP, OKCP = LBU_KCP, & + KIL = NBUIL, KIH = NBUIH, KJL = NBUJL, KJH = NBUJH, KKL = NBUKL, KKH = NBUKH ) DEALLOCATE(ZWORKT, YWORKUNIT, YWORKCOMMENT, IWORKGRID) END IF ! @@ -1475,11 +1452,11 @@ SELECT CASE (CBUTYPE) IWORKGRID(:) = 1 WRITE(YGROUP_NAME,FMT="('RG___',I4.4)") NBUTSHIFT ! - CALL WRITE_DIACHRO(TPDIAFILE, TLUOUT, YGROUP_NAME, CBUTYPE, IWORKGRID, & - ZWORKDATIME, ZWORKT, ZWORKTEMP, CBUCOMMENT(11, :), & - YWORKUNIT, YWORKCOMMENT, & - LBU_ICP, LBU_JCP, LBU_KCP, & - NBUIL, NBUIH, NBUJL, NBUJH, NBUKL, NBUKH ) + CALL WRITE_DIACHRO( TPDIAFILE, TLUOUT, YGROUP_NAME, CBUTYPE, IWORKGRID, & + tzdates, ZWORKT, CBUCOMMENT(11, :), & + YWORKUNIT, YWORKCOMMENT, & + OICP = LBU_ICP, OJCP = LBU_JCP, OKCP = LBU_KCP, & + KIL = NBUIL, KIH = NBUIH, KJL = NBUJL, KJH = NBUJH, KKL = NBUKL, KKH = NBUKH ) DEALLOCATE(ZWORKT, YWORKUNIT, YWORKCOMMENT, IWORKGRID) END IF ! @@ -1506,11 +1483,11 @@ SELECT CASE (CBUTYPE) IWORKGRID(:) = 1 WRITE(YGROUP_NAME,FMT="('RH___',I4.4)") NBUTSHIFT ! - CALL WRITE_DIACHRO(TPDIAFILE, TLUOUT, YGROUP_NAME, CBUTYPE, IWORKGRID, & - ZWORKDATIME, ZWORKT, ZWORKTEMP, CBUCOMMENT(12, :), & - YWORKUNIT, YWORKCOMMENT, & - LBU_ICP, LBU_JCP, LBU_KCP, & - NBUIL, NBUIH, NBUJL, NBUJH, NBUKL, NBUKH ) + CALL WRITE_DIACHRO( TPDIAFILE, TLUOUT, YGROUP_NAME, CBUTYPE, IWORKGRID, & + tzdates, ZWORKT, CBUCOMMENT(12, :), & + YWORKUNIT, YWORKCOMMENT, & + OICP = LBU_ICP, OJCP = LBU_JCP, OKCP = LBU_KCP, & + KIL = NBUIL, KIH = NBUIH, KJL = NBUJL, KJH = NBUJH, KKL = NBUKL, KKH = NBUKH ) DEALLOCATE(ZWORKT, YWORKUNIT, YWORKCOMMENT, IWORKGRID) END IF ! @@ -1540,11 +1517,11 @@ SELECT CASE (CBUTYPE) IWORKGRID(:) = 1 WRITE(YGROUP_NAME,FMT="('SV',I3.3,I4.4)") JSV,NBUTSHIFT ! - CALL WRITE_DIACHRO(TPDIAFILE, TLUOUT, YGROUP_NAME, CBUTYPE, IWORKGRID, & - ZWORKDATIME, ZWORKT, ZWORKTEMP, CBUCOMMENT(12+JSV,:),& - YWORKUNIT, YWORKCOMMENT, & - LBU_ICP, LBU_JCP, LBU_KCP, & - NBUIL, NBUIH, NBUJL, NBUJH, NBUKL, NBUKH ) + CALL WRITE_DIACHRO( TPDIAFILE, TLUOUT, YGROUP_NAME, CBUTYPE, IWORKGRID, & + tzdates, ZWORKT, CBUCOMMENT(12 + JSV, :), & + YWORKUNIT, YWORKCOMMENT, & + OICP = LBU_ICP, OJCP = LBU_JCP, OKCP = LBU_KCP, & + KIL = NBUIL, KIH = NBUIH, KJL = NBUJL, KJH = NBUJH, KKL = NBUKL, KKH = NBUKH ) DEALLOCATE(ZWORKT, YWORKUNIT, YWORKCOMMENT, IWORKGRID) END DO END IF @@ -1554,7 +1531,8 @@ SELECT CASE (CBUTYPE) DEALLOCATE(ZWORK) END IF ! - DEALLOCATE (ZWORKTEMP, ZWORKDATIME) + DEALLOCATE (ZWORKTEMP) + deallocate( tzdates ) ! END SELECT ! diff --git a/src/MNH/write_diachro.f90 b/src/MNH/write_diachro.f90 index 05288a972..aa5f6d406 100644 --- a/src/MNH/write_diachro.f90 +++ b/src/MNH/write_diachro.f90 @@ -77,6 +77,7 @@ contains !! P. Wautelet 09/06/2017: name of the variable added to the name of the written field !! and better comment (true comment + units) !! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O +! P. Wautelet 13/09/2019: budget: simplify and modernize date/time management !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -86,7 +87,11 @@ USE MODD_BUDGET USE MODD_CONF USE MODD_IO, ONLY: TFILEDATA USE MODD_PARAMETERS, ONLY: JPHEXT +use modd_time, only: tdtexp, tdtseg +use modd_time_n, only: tdtmod +use modd_type_date, only: date_time ! +use mode_datetime, only: Datetime_distance USE MODE_FIELD USE MODE_IO_FIELD_WRITE, only: IO_Field_write, IO_Field_write_box USE MODE_ll @@ -100,9 +105,8 @@ TYPE(TFILEDATA), INTENT(IN) :: TPDIAFILE ! file to writ TYPE(TFILEDATA), INTENT(IN) :: TPLUOUTDIA CHARACTER(LEN=*), INTENT(IN) :: HGROUP, HTYPE INTEGER,DIMENSION(:), INTENT(IN) :: KGRID -REAL,DIMENSION(:,:), INTENT(IN) :: PDATIME +type(date_time), dimension(:), intent(in) :: tpdates REAL,DIMENSION(:,:,:,:,:,:), INTENT(IN) :: PVAR -REAL,DIMENSION(:,:), INTENT(IN) :: PTRAJT CHARACTER(LEN=*),DIMENSION(:),INTENT(IN) :: HTITRE, HUNITE, HCOMMENT LOGICAL, INTENT(IN),OPTIONAL :: OICP, OJCP, OKCP INTEGER, INTENT(IN),OPTIONAL :: KIL, KIH @@ -126,43 +130,52 @@ INTEGER :: INTRAJX, INTRAJY, INTRAJZ INTEGER :: IIMASK, IJMASK, IKMASK, ITMASK, INMASK, IPMASK INTEGER :: ICOMPX, ICOMPY, ICOMPZ INTEGER :: IIMAX_ll, IJMAX_ll ! size of the physical global domain +integer :: ji INTEGER,DIMENSION(:),ALLOCATABLE :: ITABCHAR +logical :: gicp, gjcp, gkcp LOGICAL :: GPACK +real, dimension(:,:), allocatable :: ztimes +real, dimension(:,:), allocatable :: zdatime TYPE(TFIELDDATA) :: TZFIELD !------------------------------------------------------------------------------ -! + +if ( present( oicp ) ) then + gicp = oicp +else + gicp = .false. +end if + +if ( present( ojcp ) ) then + gjcp = ojcp +else + gjcp = .false. +end if + +if ( present( okcp ) ) then + gkcp = okcp +else + gkcp = .false. +end if + GPACK=LPACK LPACK=.FALSE. YCOMMENT='NOTHING' ! ILUOUTDIA = TPLUOUTDIA%NLU ! -! BUG ...ca passe que si PRESENT(OICP) sinon OICP non defini -! Question: doit-on mettre condition comme: -! IF(HTYPE == 'CART' .AND. .NOT. PRESENT(OICP) .AND. .NOT. PRESENT(OJCP)) THEN - -! en attendant correction on debranche avec un IF Present. ENDIF av -! RETURN -IF (PRESENT(OICP) .AND. PRESENT(OJCP)) THEN - IF(HTYPE == 'CART' .AND. .NOT. OICP .AND. .NOT. OJCP) THEN +II = SIZE(PVAR,1) +IJ = SIZE(PVAR,2) +IF(HTYPE == 'CART' .AND. .NOT. GICP .AND. .NOT. GJCP) THEN !for parallel execution, PVAR is distributed on several proc - II=KIH-KIL+1 - IJ=KJH-KJL+1 - ELSE - II = SIZE(PVAR,1) - IJ = SIZE(PVAR,2) - ENDIF -ELSE - II = SIZE(PVAR,1) - IJ = SIZE(PVAR,2) - + II=KIH-KIL+1 + IJ=KJH-KJL+1 ENDIF IK = SIZE(PVAR,3) IT = SIZE(PVAR,4) IN = SIZE(PVAR,5) IP = SIZE(PVAR,6) -INTRAJT=SIZE(PTRAJT,2) +INTRAJT=SIZE(tpdates) IKTRAJX=0; IKTRAJY=0; IKTRAJZ=0 ITTRAJX=0; ITTRAJY=0; ITTRAJZ=0 @@ -208,16 +221,20 @@ ILENUNITE = LEN(HUNITE) ILENCOMMENT = LEN(HCOMMENT) ICOMPX=0; ICOMPY=0; ICOMPZ=0 -IF(PRESENT(OICP))THEN -IF(OICP)THEN - ICOMPX=1 +IF ( GICP ) THEN + ICOMPX = 1 +ELSE + ICOMPX = 0 ENDIF -IF(OJCP)THEN - ICOMPY=1 +IF ( GJCP ) THEN + ICOMPY = 1 +ELSE + ICOMPY = 0 ENDIF -IF(OKCP)THEN +IF ( GKCP ) THEN ICOMPZ=1 -ENDIF +ELSE + ICOMPZ = 0 ENDIF ! IF (NVERB>=5) THEN @@ -377,9 +394,7 @@ DO J = 1,IP ELSE IF(J >= 100 .AND. J < 1000) THEN WRITE(YJ,'(I3)')J ENDIF -! BUG ...ca passe que si PRESENT(OICP) sinon OICP non defini -IF (PRESENT(OICP) .AND. PRESENT(OJCP)) THEN - IF(HTYPE == 'CART' .AND. .NOT. OICP .AND. .NOT. OJCP) THEN + IF(HTYPE == 'CART' .AND. .NOT. GICP .AND. .NOT. GJCP) THEN TZFIELD%CMNHNAME = TRIM(HGROUP)//'.PROC'//YJ TZFIELD%CSTDNAME = '' TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) @@ -405,19 +420,6 @@ IF (PRESENT(OICP) .AND. PRESENT(OJCP)) THEN TZFIELD%LTIMEDEP = .FALSE. CALL IO_Field_write(TPDIAFILE,TZFIELD,PVAR(:,:,:,:,:,J)) ENDIF -ELSE - TZFIELD%CMNHNAME = TRIM(HGROUP)//'.PROC'//YJ - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = TRIM(HUNITE(J)) - TZFIELD%CDIR = '--' - TZFIELD%CCOMMENT = TRIM(HTITRE(J))//' - '//TRIM(HCOMMENT(J))//' ('//TRIM(HUNITE(J))//')' - TZFIELD%NGRID = KGRID(J) - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 5 - TZFIELD%LTIMEDEP = .FALSE. - CALL IO_Field_write(TPDIAFILE,TZFIELD,PVAR(:,:,:,:,:,J)) -END IF IF (NVERB>=5) THEN WRITE(ILUOUTDIA,*)J,TRIM(TZFIELD%CMNHNAME) ENDIF @@ -438,7 +440,17 @@ TZFIELD%NGRID = KGRID(1) TZFIELD%NTYPE = TYPEREAL TZFIELD%NDIMS = 2 TZFIELD%LTIMEDEP = .FALSE. -CALL IO_Field_write(TPDIAFILE,TZFIELD,PTRAJT) + +!Reconstitute old diachro format +allocate( ztimes( size( tpdates ), 1 ) ) + +do ji=1,size(tpdates) + call Datetime_distance( tdtexp, tpdates(ji ), ztimes(ji, 1 ) ) +end do + +call IO_Field_write( tpdiafile, tzfield, ztimes ) + +deallocate( ztimes ) IF (NVERB>=5) THEN WRITE(ILUOUTDIA,*)' 7th record (',TRIM(TZFIELD%CMNHNAME),'): OK' @@ -523,7 +535,30 @@ TZFIELD%NGRID = KGRID(1) TZFIELD%NTYPE = TYPEREAL TZFIELD%NDIMS = 2 TZFIELD%LTIMEDEP = .FALSE. -CALL IO_Field_write(TPDIAFILE,TZFIELD,PDATIME) + +!Reconstitute old diachro format +allocate( zdatime( 16, size(tpdates) ) ) + +zdatime(1, : ) = tdtexp%tdate%year +zdatime(2, : ) = tdtexp%tdate%month +zdatime(3, : ) = tdtexp%tdate%day +zdatime(4, : ) = tdtexp%time +zdatime(5, : ) = tdtseg%tdate%year +zdatime(6, : ) = tdtseg%tdate%month +zdatime(7, : ) = tdtseg%tdate%day +zdatime(8, : ) = tdtseg%time +zdatime(9, : ) = tdtmod%tdate%year +zdatime(10, : ) = tdtmod%tdate%month +zdatime(11, : ) = tdtmod%tdate%day +zdatime(12, : ) = tdtmod%time +zdatime(13, : ) = tpdates(:)%tdate%year +zdatime(14, : ) = tpdates(:)%tdate%month +zdatime(15, : ) = tpdates(:)%tdate%day +zdatime(16, : ) = tpdates(:)%time + +call IO_Field_write( tpdiafile, tzfield, zdatime ) + +deallocate( zdatime ) ! CALL MENU_DIACHRO(TPDIAFILE,HGROUP) LPACK=GPACK diff --git a/src/MNH/write_lesn.f90 b/src/MNH/write_lesn.f90 index 1ae4ad90c..172b5210e 100644 --- a/src/MNH/write_lesn.f90 +++ b/src/MNH/write_lesn.f90 @@ -55,11 +55,11 @@ END MODULE MODI_WRITE_LES_n !! 10/10/09 (P. Aumond) Add user multimaskS !! 11/15 (C.Lac) Add production terms of TKE !! 10/2016 (C.Lac) Add droplet deposition -!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O -!!!! 02/2019 (C. Lac) Add rain fraction as a LES diagnostic - -!! -------------------------------------------------------------------------- -! +! P. Wautelet 05/2016-04/2018: new data structures and calls for I/O +! C. Lac 02/2019: add rain fraction as a LES diagnostic +! P. Wautelet 13/09/2019: budget: simplify and modernize date/time management +! -------------------------------------------------------------------------- +! !* 0. DECLARATIONS ! ------------ ! @@ -217,12 +217,8 @@ END IF ! NLES_CURRENT_TIMES=NLES_TIMES ! -ALLOCATE(XLES_CURRENT_TRAJT(NLES_TIMES,1)) -XLES_CURRENT_TRAJT(:,:) = XLES_TRAJT(:,:) ALLOCATE(XLES_CURRENT_Z(NLES_K)) XLES_CURRENT_Z(:) = XLES_Z(:) -ALLOCATE(XLES_CURRENT_DATIME(16,NLES_TIMES)) -XLES_CURRENT_DATIME(:,:) = XLES_DATIME(:,:) ! XLES_CURRENT_ZS = XLES_ZS ! @@ -1488,9 +1484,7 @@ IF (HLES_AVG==' ') CALL LES_SPEC_n(TPDIAFILE) !* 7. deallocations ! ------------- ! -DEALLOCATE(XLES_CURRENT_TRAJT ) DEALLOCATE(XLES_CURRENT_Z ) -DEALLOCATE(XLES_CURRENT_DATIME) IF (CLES_NORM_TYPE/='NONE' ) THEN DEALLOCATE(XLES_NORM_M ) diff --git a/src/MNH/write_profilern.f90 b/src/MNH/write_profilern.f90 index 5e618958c..507f7483f 100644 --- a/src/MNH/write_profilern.f90 +++ b/src/MNH/write_profilern.f90 @@ -60,9 +60,10 @@ END MODULE MODI_WRITE_PROFILER_n !! Oct, 2016 (C.Lac) Add visibility diagnostics for fog !! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O !! J. Escobar : 16/08/2018: From Pierre & Maud , correction use CNAMES(JSV-NSV_CHEMBEG+1) -!! -!! -------------------------------------------------------------------------- -! +! P. Wautelet 13/09/2019: budget: simplify and modernize date/time management +! +! -------------------------------------------------------------------------- +! !* 0. DECLARATIONS ! ------------ ! @@ -130,7 +131,6 @@ INTEGER, INTENT(IN) :: II ! REAL, DIMENSION(:,:,:,:,:,:), ALLOCATABLE :: ZWORK6 ! contains temporal serie REAL, DIMENSION(:,:,:,:,:,:), ALLOCATABLE :: ZW6 ! contains temporal serie to write -REAL, DIMENSION(:,:), ALLOCATABLE :: ZTRAJT ! localization of the REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZSV, ZN0, ZSIG, ZRG REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRHO ! @@ -161,15 +161,12 @@ IF (LDUST) IPROC = IPROC + NMODE_DST*3 IF (LDUST .OR. LORILAM .OR. LSALT) IPROC=IPROC+NAER IF (SIZE(TPROFILER%TKE )>0) IPROC = IPROC + 1 ! -ALLOCATE (ZTRAJT( SIZE(TPROFILER%TIME),1)) -ALLOCATE (ZWORK6(1,1,IKU,SIZE(TPROFILER%TIME),1,IPROC)) +ALLOCATE (ZWORK6(1,1,IKU,size(tprofiler%tpdates),1,IPROC)) ALLOCATE (YCOMMENT(IPROC)) ALLOCATE (YTITLE (IPROC)) ALLOCATE (YUNIT (IPROC)) ALLOCATE (IGRID (IPROC)) ! -ZTRAJT (:,1) = TPROFILER%TIME(:) -! IGRID = 1 YGROUP = TPROFILER%NAME(II) ! @@ -507,11 +504,11 @@ IF (SIZE(TPROFILER%SV,4)>=1) THEN ZWORK6 (1,1,IK,:,1,JPROC) = TPROFILER%SV(:,IK,II,JSV) * 1.E9 END DO IF ((LORILAM).AND. .NOT.(ANY(TPROFILER%P(:,IK,II) == 0.))) THEN - ALLOCATE (ZSV(1,1,SIZE(TPROFILER%TIME),NSV_AER)) - ALLOCATE (ZRHO(1,1,SIZE(TPROFILER%TIME))) - ALLOCATE (ZN0(1,1,SIZE(TPROFILER%TIME),JPMODE)) - ALLOCATE (ZRG(1,1,SIZE(TPROFILER%TIME),JPMODE)) - ALLOCATE (ZSIG(1,1,SIZE(TPROFILER%TIME),JPMODE)) + ALLOCATE (ZSV(1,1,size(tprofiler%tpdates),NSV_AER)) + ALLOCATE (ZRHO(1,1,size(tprofiler%tpdates))) + ALLOCATE (ZN0(1,1,size(tprofiler%tpdates),JPMODE)) + ALLOCATE (ZRG(1,1,size(tprofiler%tpdates),JPMODE)) + ALLOCATE (ZSIG(1,1,size(tprofiler%tpdates),JPMODE)) ZSV(1,1,:,1:NSV_AER) = TPROFILER%SV(:,IK,II,NSV_AERBEG:NSV_AEREND) IF (SIZE(TPROFILER%R,4) >0) THEN ZRHO(1,1,:) = 0. @@ -558,11 +555,11 @@ IF (SIZE(TPROFILER%SV,4)>=1) THEN ZWORK6 (1,1,IK,:,1,JPROC) = TPROFILER%SV(:,IK,II,JSV) * 1.E9 END DO IF ((LDUST).AND. .NOT.(ANY(TPROFILER%P(:,IK,II) == 0.))) THEN - ALLOCATE (ZSV(1,1,SIZE(TPROFILER%TIME),NSV_DST)) - ALLOCATE (ZRHO(1,1,SIZE(TPROFILER%TIME))) - ALLOCATE (ZN0(1,1,SIZE(TPROFILER%TIME),NMODE_DST)) - ALLOCATE (ZRG(1,1,SIZE(TPROFILER%TIME),NMODE_DST)) - ALLOCATE (ZSIG(1,1,SIZE(TPROFILER%TIME),NMODE_DST)) + ALLOCATE (ZSV(1,1,size(tprofiler%tpdates),NSV_DST)) + ALLOCATE (ZRHO(1,1,size(tprofiler%tpdates))) + ALLOCATE (ZN0(1,1,size(tprofiler%tpdates),NMODE_DST)) + ALLOCATE (ZRG(1,1,size(tprofiler%tpdates),NMODE_DST)) + ALLOCATE (ZSIG(1,1,size(tprofiler%tpdates),NMODE_DST)) ZSV(1,1,:,1:NSV_DST) = TPROFILER%SV(:,IK,II,NSV_DSTBEG:NSV_DSTEND) IF (SIZE(TPROFILER%R,4) >0) THEN ZRHO(1,1,:) = 0. @@ -624,16 +621,15 @@ END DO !---------------------------------------------------------------------------- ! -ALLOCATE (ZW6(1,1,IKU,SIZE(TPROFILER%TIME),1,JPROC)) +ALLOCATE (ZW6(1,1,IKU,size(tprofiler%tpdates),1,JPROC)) ZW6 = ZWORK6(:,:,:,:,:,:JPROC) DEALLOCATE(ZWORK6) -CALL WRITE_DIACHRO(TPDIAFILE,TLUOUT0,YGROUP,"CART",IGRID(:JPROC), TPROFILER%DATIME,& - ZW6,ZTRAJT,YTITLE(:JPROC),YUNIT(:JPROC),YCOMMENT(:JPROC), & - .TRUE.,.TRUE.,.FALSE., & - KIL=1,KIH=1,KJL=1,KJH=1,KKL=1,KKH=IKU ) -! -DEALLOCATE (ZTRAJT ) +CALL WRITE_DIACHRO( TPDIAFILE, TLUOUT0, YGROUP, "CART", IGRID(:JPROC), tprofiler%tpdates, & + ZW6, YTITLE(:JPROC), YUNIT(:JPROC), YCOMMENT(:JPROC), & + OICP = .TRUE., OJCP = .TRUE., OKCP = .FALSE., & + KIL = 1, KIH = 1, KJL = 1, KJH = 1, KKL = 1, KKH = IKU ) + DEALLOCATE (ZW6 ) DEALLOCATE (YCOMMENT) DEALLOCATE (YTITLE ) diff --git a/src/MNH/write_seriesn.f90 b/src/MNH/write_seriesn.f90 index 76ff9507c..186188824 100644 --- a/src/MNH/write_seriesn.f90 +++ b/src/MNH/write_seriesn.f90 @@ -60,7 +60,8 @@ END MODULE MODI_WRITE_SERIES_n !! J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 !! P.Wautelet: 11/07/2016 : removed MNH_NCWRIT define !! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O -!! +! P. Wautelet 13/09/2019: budget: simplify and modernize date/time management +! !------------------------------------------------------------------------------- ! ! @@ -235,11 +236,11 @@ ENDIF !* 2.3 Write in diachro file ! GICP=.TRUE. ; GJCP=.TRUE. ; GKCP=.TRUE. -CALL WRITE_DIACHRO(TPDIAFILE,TLUOUT,'TSERIES','CART',NSGRIDD1,XSDATIME(:,1:NSNBSTEPT), & - XSSERIES1(1:1,1:1,1:1,1:NSNBSTEPT,:,:), & - XSTRAJT(1:NSNBSTEPT,:),CSTITLE1,CSUNIT1,CSCOMMENT1, & - GICP,GJCP,GKCP, & - KIL=1,KIH=1,KJL=1,KJH=1,KKL=1,KKH=1) +CALL WRITE_DIACHRO( TPDIAFILE, TLUOUT, 'TSERIES', 'CART', NSGRIDD1, tpsdates(1:nsnbstept), & + XSSERIES1(1:1,1:1,1:1,1:NSNBSTEPT,:,:), & + CSTITLE1(:), CSUNIT1(:), CSCOMMENT1(:), & + OICP = GICP, OJCP = GJCP, OKCP = GKCP, & + KIL = 1, KIH = 1, KJL = 1, KJH = 1, KKL = 1, KKH = 1 ) ! !---------------------------------------------------------------------------- ! @@ -289,11 +290,11 @@ DEALLOCATE(ZVAR3D) !* 3.2 Write in diachro file ! GICP=.TRUE. ; GJCP=.TRUE. ; GKCP=.FALSE. -CALL WRITE_DIACHRO(TPDIAFILE,TLUOUT,'ZTSERIES','CART',NSGRIDD2,XSDATIME(:,1:NSNBSTEPT), & - XSSERIES2(1:1,1:1,1:IKMAX,1:NSNBSTEPT,:,:), & - XSTRAJT(1:NSNBSTEPT,:),CSTITLE2,CSUNIT2,CSCOMMENT2, & - GICP,GJCP,GKCP, & - KIL=1,KIH=1,KJL=1,KJH=1,KKL=IKB,KKH=IKE) +CALL WRITE_DIACHRO( TPDIAFILE, TLUOUT, 'ZTSERIES', 'CART', NSGRIDD2, tpsdates(1:nsnbstept), & + XSSERIES2(1:1,1:1,1:1,1:NSNBSTEPT,:,:), & + CSTITLE2(:), CSUNIT2(:), CSCOMMENT2(:), & + OICP = GICP, OJCP = GJCP, OKCP = GKCP, & + KIL = 1, KIH = 1, KJL = 1, KJH = 1, KKL = IKB, KKH = IKE ) ! !---------------------------------------------------------------------------- ! @@ -347,11 +348,11 @@ DO JS=1,NBJSLICE YSTITLE3S(JT)=ADJUSTL(ADJUSTR(CSTITLE3(JT))//'Y'//YSL//'-'//YSH) END DO GICP=.FALSE. ; GJCP=.TRUE. ; GKCP=.TRUE. - CALL WRITE_DIACHRO(TPDIAFILE,TLUOUT,YGROUP,'CART',NSGRIDD3,XSDATIME(:,1:NSNBSTEPT), & - ZSERIES3_ll(1:IIU_ll,1:1,1:1,1:NSNBSTEPT,1:1,ISB1:ISB2),& - XSTRAJT(1:NSNBSTEPT,:),YSTITLE3S,CSUNIT3,CSCOMMENT3, & - GICP,GJCP,GKCP, & - KIL=1,KIH=IIU_ll,KJL=1,KJH=1,KKL=1,KKH=1) + CALL WRITE_DIACHRO( TPDIAFILE, TLUOUT, YGROUP, 'CART', NSGRIDD3, tpsdates(1:nsnbstept), & + ZSERIES3_ll(1:IIU_ll,1:1,1:1,1:NSNBSTEPT,1:1,ISB1:ISB2), & + YSTITLE3S(:), CSUNIT3(:), CSCOMMENT3(:), & + OICP = GICP, OJCP = GJCP, OKCP = GKCP, & + KIL = 1, KIH = IIU_ll, KJL = 1, KJH = 1, KKL = 1, KKH = 1 ) END DO DEALLOCATE(ZVAR3D,ZWORK2D,ZSERIES3_ll) ! diff --git a/src/MNH/write_stationn.f90 b/src/MNH/write_stationn.f90 index c85c58f26..4361a9a91 100644 --- a/src/MNH/write_stationn.f90 +++ b/src/MNH/write_stationn.f90 @@ -57,9 +57,10 @@ END MODULE MODI_WRITE_STATION_n !! ------------- !! Original 15/02/2002 !! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O -!! -!! -------------------------------------------------------------------------- -! +! P. Wautelet 13/09/2019: budget: simplify and modernize date/time management +! +! -------------------------------------------------------------------------- +! !* 0. DECLARATIONS ! ------------ ! @@ -124,9 +125,8 @@ INTEGER, INTENT(IN) :: II ! !* 0.2 declaration of local variables for diachro ! -REAL, DIMENSION(:,:,:,:,:,:), ALLOCATABLE :: ZWORK6 ! contains temporal serie -REAL, DIMENSION(:,:,:,:,:,:), ALLOCATABLE :: ZW6 ! contains temporal serie to write -REAL, DIMENSION(:,:), ALLOCATABLE :: ZTRAJT ! localization of the +REAL, DIMENSION(:,:,:,:,:,:), ALLOCATABLE :: ZWORK6 ! contains temporal series +REAL, DIMENSION(:,:,:,:,:,:), ALLOCATABLE :: ZW6 ! contains temporal series to write REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZSV, ZN0, ZSIG, ZRG REAL, DIMENSION(:,:,:,:,:), ALLOCATABLE :: ZPTOTA REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRHO @@ -158,16 +158,12 @@ IF (LSALT) IPROC = IPROC + NMODE_SLT*3 IF (SIZE(TSTATION%TSRAD)>0) IPROC = IPROC + 1 IF (SIZE(TSTATION%SFCO2,1)>0) IPROC = IPROC +1 ! -ALLOCATE (ZTRAJT( SIZE(TSTATION%TIME),1)) -ALLOCATE (ZWORK6(1,1,1,SIZE(TSTATION%TIME),1,IPROC)) +ALLOCATE (ZWORK6(1,1,1,SIZE(tstation%tpdates),1,IPROC)) ALLOCATE (YCOMMENT(IPROC)) ALLOCATE (YTITLE (IPROC)) ALLOCATE (YUNIT (IPROC)) ALLOCATE (IGRID (IPROC)) ! -ZTRAJT (:,1) = TSTATION%TIME(:) -! -! IGRID = 1 YGROUP = TSTATION%NAME(II) JPROC = 0 @@ -422,12 +418,12 @@ IF (SIZE(TSTATION%SV,3)>=1) THEN END DO IF ((LORILAM).AND. .NOT.(ANY(TSTATION%P(:,II) == 0.))) THEN - ALLOCATE (ZSV(1,1,SIZE(TSTATION%TIME),NSV_AER)) - ALLOCATE (ZRHO(1,1,SIZE(TSTATION%TIME))) - ALLOCATE (ZN0(1,1,SIZE(TSTATION%TIME),JPMODE)) - ALLOCATE (ZRG(1,1,SIZE(TSTATION%TIME),JPMODE)) - ALLOCATE (ZSIG(1,1,SIZE(TSTATION%TIME),JPMODE)) - ALLOCATE (ZPTOTA(1,1,SIZE(TSTATION%TIME),NSP+NCARB+NSOA,JPMODE)) + ALLOCATE (ZSV(1,1,SIZE(tstation%tpdates),NSV_AER)) + ALLOCATE (ZRHO(1,1,SIZE(tstation%tpdates))) + ALLOCATE (ZN0(1,1,SIZE(tstation%tpdates),JPMODE)) + ALLOCATE (ZRG(1,1,SIZE(tstation%tpdates),JPMODE)) + ALLOCATE (ZSIG(1,1,SIZE(tstation%tpdates),JPMODE)) + ALLOCATE (ZPTOTA(1,1,SIZE(tstation%tpdates),NSP+NCARB+NSOA,JPMODE)) ZSV(1,1,:,1:NSV_AER) = TSTATION%SV(:,II,NSV_AERBEG:NSV_AEREND) IF (SIZE(TSTATION%R,3) >0) THEN ZRHO(1,1,:) = 0. @@ -570,11 +566,11 @@ IF (SIZE(TSTATION%SV,3)>=1) THEN ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%SV(:,II,JSV) *1.E9 END DO IF ((LDUST).AND. .NOT.(ANY(TSTATION%P(:,II) == 0.))) THEN - ALLOCATE (ZSV(1,1,SIZE(TSTATION%TIME),NSV_DST)) - ALLOCATE (ZRHO(1,1,SIZE(TSTATION%TIME))) - ALLOCATE (ZN0(1,1,SIZE(TSTATION%TIME),NMODE_DST)) - ALLOCATE (ZRG(1,1,SIZE(TSTATION%TIME),NMODE_DST)) - ALLOCATE (ZSIG(1,1,SIZE(TSTATION%TIME),NMODE_DST)) + ALLOCATE (ZSV(1,1,SIZE(tstation%tpdates),NSV_DST)) + ALLOCATE (ZRHO(1,1,SIZE(tstation%tpdates))) + ALLOCATE (ZN0(1,1,SIZE(tstation%tpdates),NMODE_DST)) + ALLOCATE (ZRG(1,1,SIZE(tstation%tpdates),NMODE_DST)) + ALLOCATE (ZSIG(1,1,SIZE(tstation%tpdates),NMODE_DST)) ZSV(1,1,:,1:NSV_DST) = TSTATION%SV(:,II,NSV_DSTBEG:NSV_DSTEND) IF (SIZE(TSTATION%R,3) >0) THEN ZRHO(1,1,:) = 0. @@ -623,11 +619,11 @@ IF (SIZE(TSTATION%SV,3)>=1) THEN ENDIF ! IF ((LSALT).AND. .NOT.(ANY(TSTATION%P(:,II) == 0.))) THEN - ALLOCATE (ZSV(1,1,SIZE(TSTATION%TIME),NSV_SLT)) - ALLOCATE (ZRHO(1,1,SIZE(TSTATION%TIME))) - ALLOCATE (ZN0(1,1,SIZE(TSTATION%TIME),NMODE_SLT)) - ALLOCATE (ZRG(1,1,SIZE(TSTATION%TIME),NMODE_SLT)) - ALLOCATE (ZSIG(1,1,SIZE(TSTATION%TIME),NMODE_SLT)) + ALLOCATE (ZSV(1,1,SIZE(tstation%tpdates),NSV_SLT)) + ALLOCATE (ZRHO(1,1,SIZE(tstation%tpdates))) + ALLOCATE (ZN0(1,1,SIZE(tstation%tpdates),NMODE_SLT)) + ALLOCATE (ZRG(1,1,SIZE(tstation%tpdates),NMODE_SLT)) + ALLOCATE (ZSIG(1,1,SIZE(tstation%tpdates),NMODE_SLT)) ZSV(1,1,:,1:NSV_SLT) = TSTATION%SV(:,II,NSV_SLTBEG:NSV_SLTEND) IF (SIZE(TSTATION%R,3) >0) THEN ZRHO(1,1,:) = 0. @@ -685,16 +681,15 @@ END IF !---------------------------------------------------------------------------- ! ! -ALLOCATE (ZW6(1,1,1,SIZE(TSTATION%TIME),1,JPROC)) +ALLOCATE (ZW6(1,1,1,SIZE(tstation%tpdates),1,JPROC)) ZW6 = ZWORK6(:,:,:,:,:,:JPROC) DEALLOCATE(ZWORK6) ! - CALL WRITE_DIACHRO(TPDIAFILE,TLUOUT0,YGROUP,"CART",IGRID, TSTATION%DATIME,& - ZW6,ZTRAJT,YTITLE,YUNIT,YCOMMENT,& - .TRUE.,.TRUE.,.FALSE., & - KIL=1,KIH=1,KJL=1,KJH=1,KKL=1,KKH=1 ) +CALL WRITE_DIACHRO( TPDIAFILE, TLUOUT0, YGROUP, "CART", IGRID, tstation%tpdates, & + ZW6(:,:,:,:,:,:), YTITLE(:), YUNIT(:), YCOMMENT(:), & + OICP = .TRUE., OJCP = .TRUE., OKCP = .FALSE., & + KIL = 1, KIH = 1, KJL = 1, KJH = 1, KKL = 1, KKH = 1 ) ! -DEALLOCATE (ZTRAJT) DEALLOCATE (ZW6) DEALLOCATE (YCOMMENT) DEALLOCATE (YTITLE ) -- GitLab