From 30b3fe3d12991c901038a0095e05bf5db5c425bd Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Fri, 13 Jan 2023 16:19:33 +0100
Subject: [PATCH] Philippe 13/01/2023: manage close of backup files outside of
 MODEL_n Useful to close them in reverse model order (child before parent)
 This is needed by WRITE_BALLOON_n (future commit)

---
 src/MNH/kid_model.f90 | 30 +++++++++++--------
 src/MNH/mesonh.f90    | 23 ++++++++++++---
 src/MNH/modeln.f90    | 69 ++++++++++++++++++++++---------------------
 3 files changed, 71 insertions(+), 51 deletions(-)

diff --git a/src/MNH/kid_model.f90 b/src/MNH/kid_model.f90
index 68fdb5dbc..44c18b9eb 100644
--- a/src/MNH/kid_model.f90
+++ b/src/MNH/kid_model.f90
@@ -1,13 +1,8 @@
-!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 1999-2023 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 adiab 2006/05/18 13:07:25
-!-----------------------------------------------------------------
 !####################
 MODULE MODI_KID_MODEL
 !####################
@@ -76,20 +71,23 @@ RECURSIVE SUBROUTINE KID_MODEL(KMODEL,KTEMP_MODEL,OEXIT)
 !!    -------------
 !!
 !!      Original    09/04/99 
-!!
-!!
+!
+!  P. Wautelet 13/01/2023: close backup files outside MODEL_n (to control close order)
+!
 !
 !*       0.     DECLARATIONS
 !               ------------
 !
 USE MODD_CONF
+USE MODD_IO,             ONLY: TFILEDATA
 USE MODD_NESTING
+USE MODD_TYPE_DATE,      ONLY: DATE_TIME
 !
-USE MODI_MODEL_n
+USE MODE_IO_FILE,        ONLY: IO_FILE_CLOSE
 USE MODE_MODELN_HANDLER
-!
 USE MODE_ll
 !
+USE MODI_MODEL_n
 !
 !*       0.1    declarations of arguments
 !
@@ -105,6 +103,8 @@ INTEGER :: JTEMP_KID     ! nested temporal loop for the kid model
 INTEGER :: ITEMP_LOOP    ! number of the temporal iteration for the kid model
 LOGICAL :: GEXIT         ! return value of the EXIT signal from MODEL
 INTEGER :: IINFO_ll      ! return code of // routines
+TYPE(TFILEDATA), POINTER :: TZBAKFILE  ! Backup file
+TYPE(DATE_TIME)          :: TZDTMODELN ! Date/time of current model computation
 !
 !
 !-------------------------------------------------------------------------------
@@ -112,7 +112,7 @@ INTEGER :: IINFO_ll      ! return code of // routines
 !*       1.    INITIALIZATION
 !              --------------
 !
-DO JKID=KMODEL+1,NMODEL   
+DO JKID=KMODEL+1,NMODEL
   !
   IF ( NDAD(JKID)==KMODEL ) THEN
     !
@@ -127,11 +127,15 @@ DO JKID=KMODEL+1,NMODEL
       ! call the model$n corresponding to JKID
       CALL GO_TOMODEL_ll(JKID,IINFO_ll)
       CALL GOTO_MODEL(JKID)
-      CALL MODEL_n(ITEMP_LOOP,GEXIT)
+      CALL MODEL_n( ITEMP_LOOP, TZBAKFILE, TZDTMODELN, GEXIT )
       !
       ! call to the kid models of model JKID
       CALL KID_MODEL(JKID,ITEMP_LOOP,GEXIT)
       !
+      IF ( TZBAKFILE%LOPENED ) THEN
+        CALL IO_FILE_CLOSE( TZBAKFILE, TPDTMODELN = TZDTMODELN )
+        NULLIFY( TZBAKFILE )
+      END IF
     END DO
     !
   END IF
diff --git a/src/MNH/mesonh.f90 b/src/MNH/mesonh.f90
index dd28504bb..a6053e6e9 100644
--- a/src/MNH/mesonh.f90
+++ b/src/MNH/mesonh.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 1994-2023 CNRS, Meteo-France and Universite Paul Sabatier
 !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
 !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
 !MNH_LIC for details. version 1.
@@ -77,6 +77,7 @@
 !!      J. Pianezze               01/08/2016  add sfxoasis coupling functions
 !!      P. Wautelet          05/2016-04/2018  new data structures and calls for I/O
 !!      P. Wautelet               06/07/2021  use FINALIZE_MNH
+!  P. Wautelet 13/01/2023: close backup files outside MODEL_n (to control close order)
 !-------------------------------------------------------------------------------
 !
 !*       0.     DECLARATIONS
@@ -89,14 +90,17 @@
 #endif
 !
 USE MODD_CONF,             only: CPROGRAM, NMODEL
-USE MODD_NESTING
 USE MODD_CONF_n
+USE MODD_IO,               ONLY: TFILEDATA
+USE MODD_NESTING
+USE MODD_TYPE_DATE,        ONLY: DATE_TIME
 !
 USE MODI_MODEL_n
 USE MODI_KID_MODEL
 !
 USE MODE_FINALIZE_MNH,     only: FINALIZE_MNH
 USE MODE_IO,               only: IO_Init
+USE MODE_IO_FILE,          only: IO_FILE_CLOSE
 USE MODE_ll
 USE MODE_MODELN_HANDLER
 !
@@ -121,6 +125,8 @@ INTEGER       :: ITEMP_MODEL1                 ! loop increment
 LOGICAL       :: GEXIT                        ! flag for the end of the
                                               ! temporal loop       
 INTEGER       :: IINFO_ll                     ! return code of // routines
+TYPE(TFILEDATA), POINTER :: TZBAKFILE         ! Backup file
+TYPE(DATE_TIME)          :: TZDTMODELN        ! Date/time of current model computation
 !
 #ifdef CPLOASIS
   CHARACTER(LEN=28)  :: CNAMELIST
@@ -190,7 +196,11 @@ DO JMODEL=1,NMODEL
   CALL GO_TOMODEL_ll(JMODEL,IINFO_ll)
   CALL GOTO_MODEL(JMODEL)
   CSTORAGE_TYPE='TT'
-  CALL MODEL_n(1,GEXIT)
+  CALL MODEL_n( 1, TZBAKFILE, TZDTMODELN, GEXIT )
+  IF ( TZBAKFILE%LOPENED ) THEN
+    CALL IO_FILE_CLOSE( TZBAKFILE, TPDTMODELN = TZDTMODELN )
+    NULLIFY( TZBAKFILE )
+  END IF
 END DO
 !
 IF(GEXIT) THEN
@@ -205,10 +215,15 @@ DO
   !
   CALL GO_TOMODEL_ll(1,IINFO_ll)
   CALL GOTO_MODEL(1)
-  CALL MODEL_n(ITEMP_MODEL1,GEXIT)
+  CALL MODEL_n( ITEMP_MODEL1, TZBAKFILE, TZDTMODELN, GEXIT )
   !
   CALL KID_MODEL(1,ITEMP_MODEL1,GEXIT)
   !
+  IF ( TZBAKFILE%LOPENED ) THEN
+    CALL IO_FILE_CLOSE( TZBAKFILE, TPDTMODELN = TZDTMODELN )
+    NULLIFY( TZBAKFILE )
+  END IF
+  !
   IF(GEXIT) EXIT
   !
 END DO
diff --git a/src/MNH/modeln.f90 b/src/MNH/modeln.f90
index a0d66c654..e3227e2b5 100644
--- a/src/MNH/modeln.f90
+++ b/src/MNH/modeln.f90
@@ -9,10 +9,15 @@
 !
 INTERFACE
 !
-       SUBROUTINE MODEL_n(KTCOUNT,OEXIT)
+       SUBROUTINE MODEL_n( KTCOUNT, TPBAKFILE, TPDTMODELN, OEXIT )
 !
-INTEGER, INTENT(IN)   :: KTCOUNT  ! temporal loop index of model KMODEL
-LOGICAL, INTENT(INOUT):: OEXIT    ! switch for the end of the temporal loop
+USE MODD_IO,        ONLY: TFILEDATA
+USE MODD_TYPE_DATE, ONLY: DATE_TIME
+!
+INTEGER,                  INTENT(IN)    :: KTCOUNT    ! Temporal loop index of model KMODEL
+TYPE(TFILEDATA), POINTER, INTENT(OUT)   :: TPBAKFILE  ! Pointer for backup file
+TYPE(DATE_TIME),          INTENT(OUT)   :: TPDTMODELN ! Time of current model computation
+LOGICAL,                  INTENT(INOUT) :: OEXIT      ! Switch for the end of the temporal loop
 !
 END SUBROUTINE MODEL_n
 !
@@ -21,7 +26,7 @@ END INTERFACE
 END MODULE MODI_MODEL_n
 
 !     ################################### 
-      SUBROUTINE MODEL_n(KTCOUNT, OEXIT) 
+      SUBROUTINE MODEL_n( KTCOUNT, TPBAKFILE, TPDTMODELN, OEXIT )
 !     ###################################
 !
 !!****  *MODEL_n * -monitor of the model version _n 
@@ -273,6 +278,8 @@ END MODULE MODI_MODEL_n
 !  P. Wautelet 19/02/2021: add NEGA2 term for SV budgets
 !  J.L. Redelsperger 03/2021: add Call NHOA_COUPLN (coupling O & A LES version)
 !  P. Wautelet 08/12/2022: bugfix if no TDADFILE
+!  P. Wautelet 13/01/2023: manage close of backup files outside of MODEL_n
+!                          (useful to close them in reverse model order (child before parent, needed by WRITE_BALLOON_n)
 !!-------------------------------------------------------------------------------
 !
 !*       0.     DECLARATIONS
@@ -362,6 +369,7 @@ USE MODD_TIME_n
 USE MODD_TIMEZ
 USE MODD_TURB_CLOUD,     ONLY: NMODEL_CLOUD,CTURBLEN_CLOUD,XCEI
 USE MODD_TURB_n
+USE MODD_TYPE_DATE,      ONLY: DATE_TIME
 USE MODD_VISCOSITY
 !
 USE MODE_AIRCRAFT_BALLOON
@@ -460,8 +468,10 @@ IMPLICIT NONE
 !
 !
 !
-INTEGER, INTENT(IN)   :: KTCOUNT
-LOGICAL, INTENT(INOUT):: OEXIT
+INTEGER,                  INTENT(IN)    :: KTCOUNT    ! Temporal loop index of model KMODEL
+TYPE(TFILEDATA), POINTER, INTENT(OUT)   :: TPBAKFILE  ! Pointer for backup file
+TYPE(DATE_TIME),          INTENT(OUT)   :: TPDTMODELN ! Time of current model computation
+LOGICAL,                  INTENT(INOUT) :: OEXIT      ! Switch for the end of the temporal loop
 !
 !*       0.2   declarations of local variables
 !
@@ -551,16 +561,16 @@ LOGICAL :: GCLD                     ! conditionnal call for dust wet deposition
 LOGICAL :: GCLOUD_ONLY              ! conditionnal radiation computations for
                                 !      the only cloudy columns
 REAL, DIMENSION(SIZE(XRSVS,1), SIZE(XRSVS,2), SIZE(XRSVS,3), NSV_AER)  :: ZWETDEPAER
-
-
 !
-TYPE(TFILEDATA),POINTER :: TZBAKFILE, TZOUTFILE
+TYPE(TFILEDATA),POINTER :: TZOUTFILE
 ! TYPE(TFILEDATA),SAVE    :: TZDIACFILE
 !-------------------------------------------------------------------------------
 !
-TZBAKFILE=> NULL()
+TPBAKFILE=> NULL()
 TZOUTFILE=> NULL()
 !
+TPDTMODELN = TDTCUR
+!
 !*       0.    MICROPHYSICAL SCHEME
 !              ------------------- 
 SELECT CASE(CCLOUD)
@@ -968,12 +978,12 @@ IF ( nfile_backup_current < NBAK_NUMB ) THEN
   IF ( KTCOUNT == TBACKUPN(nfile_backup_current + 1)%NSTEP ) THEN
     nfile_backup_current = nfile_backup_current + 1
     !
-    TZBAKFILE => TBACKUPN(nfile_backup_current)%TFILE
-    IVERB    = TZBAKFILE%NLFIVERB
+    TPBAKFILE => TBACKUPN(nfile_backup_current)%TFILE
+    IVERB    = TPBAKFILE%NLFIVERB
     !
-    CALL IO_File_open(TZBAKFILE)
+    CALL IO_File_open(TPBAKFILE)
     !
-    CALL WRITE_DESFM_n(IMI,TZBAKFILE)
+    CALL WRITE_DESFM_n(IMI,TPBAKFILE)
     CALL IO_Header_write( TBACKUPN(nfile_backup_current)%TFILE )
     IF ( ASSOCIATED( TBACKUPN(nfile_backup_current)%TFILE%TDADFILE ) ) THEN
       YDADNAME = TBACKUPN(nfile_backup_current)%TFILE%TDADFILE%CNAME
@@ -982,10 +992,10 @@ IF ( nfile_backup_current < NBAK_NUMB ) THEN
       YDADNAME = 'DUMMY'
     END IF
     CALL WRITE_LFIFM_n( TBACKUPN(nfile_backup_current)%TFILE, TRIM( YDADNAME ) )
-    TOUTDATAFILE => TZBAKFILE
-    CALL MNHWRITE_ZS_DUMMY_n(TZBAKFILE)
+    TOUTDATAFILE => TPBAKFILE
+    CALL MNHWRITE_ZS_DUMMY_n(TPBAKFILE)
     IF (CSURF=='EXTE') THEN
-      TFILE_SURFEX => TZBAKFILE
+      TFILE_SURFEX => TPBAKFILE
       CALL GOTO_SURFEX(IMI)
       CALL WRITE_SURF_ATM_n(YSURF_CUR,'MESONH','ALL',.FALSE.)
       IF ( KTCOUNT > 1) THEN
@@ -1000,7 +1010,7 @@ IF ( nfile_backup_current < NBAK_NUMB ) THEN
       CALL INI_LG( XXHATM, XYHATM, XZZ, XSVT, XLBXSVM, XLBYSVM )
       IF (IVERB>=5) THEN
         WRITE(UNIT=ILUOUT,FMT=*) '************************************'
-        WRITE(UNIT=ILUOUT,FMT=*) '*** Lagrangian variables refreshed after ',TRIM(TZBAKFILE%CNAME),' backup'
+        WRITE(UNIT=ILUOUT,FMT=*) '*** Lagrangian variables refreshed after ',TRIM(TPBAKFILE%CNAME),' backup'
         WRITE(UNIT=ILUOUT,FMT=*) '************************************'
       END IF
     END IF
@@ -1011,11 +1021,11 @@ IF ( nfile_backup_current < NBAK_NUMB ) THEN
 !
   ELSE
     !Necessary to have a 'valid' CNAME when calling some subroutines
-    TZBAKFILE => TFILE_DUMMY
+    TPBAKFILE => TFILE_DUMMY
   END IF
 ELSE
   !Necessary to have a 'valid' CNAME when calling some subroutines
-  TZBAKFILE => TFILE_DUMMY
+  TPBAKFILE => TFILE_DUMMY
 END IF
 !
 IF ( nfile_output_current < NOUT_NUMB ) THEN
@@ -1434,7 +1444,7 @@ XT_RELAX = XT_RELAX + ZTIME2 - ZTIME1 &
 !
 ZTIME1 = ZTIME2
 !
-CALL PHYS_PARAM_n( KTCOUNT, TZBAKFILE,                            &
+CALL PHYS_PARAM_n( KTCOUNT, TPBAKFILE,                            &
                    XT_RAD,  XT_SHADOWS, XT_DCONV, XT_GROUND,      &
                    XT_MAFL, XT_DRAG, XT_EOL, XT_TURB,  XT_TRACER, &
                    ZTIME, ZWETDEPAER, GMASKkids, GCLOUD_ONLY      )
@@ -1609,7 +1619,7 @@ XTIME_LES_BU_PROCESS = 0.
 !
 CALL MPPDB_CHECK3DM("before ADVEC_METSV:XU/V/W/TH/TKE/T,XRHODJ",PRECISION,&
                    &  XUT, XVT, XWT, XTHT, XTKET,XRHODJ)
- CALL ADVECTION_METSV ( TZBAKFILE, CUVW_ADV_SCHEME,                    &
+ CALL ADVECTION_METSV ( TPBAKFILE, CUVW_ADV_SCHEME,                    &
                  CMET_ADV_SCHEME, CSV_ADV_SCHEME, CCLOUD, NSPLIT,      &
                  LSPLIT_CFL, XSPLIT_CFL, LCFL_WRIT,                    &
                  CLBCX, CLBCY, NRR, NSV, TDTCUR, XTSTEP,               &
@@ -1711,7 +1721,7 @@ XT_ADVUVW = XT_ADVUVW + ZTIME2 - ZTIME1 - XTIME_LES_BU_PROCESS - XTIME_BU_PROCES
 !-------------------------------------------------------------------------------
 !
 IF (NMODEL_CLOUD==IMI .AND. CTURBLEN_CLOUD/='NONE') THEN
-  CALL TURB_CLOUD_INDEX( XTSTEP, TZBAKFILE,                               &
+  CALL TURB_CLOUD_INDEX( XTSTEP, TPBAKFILE,                               &
                          LTURB_DIAG, NRRI,                                &
                          XRRS, XRT, XRHODJ, XDXX, XDYY, XDZZ, XDZX, XDZY, &
                          XCEI                                             )
@@ -1898,7 +1908,7 @@ IF (CCLOUD /= 'NONE' .AND. CELEC == 'NONE') THEN
     CALL MNHGET_SURF_PARAM_n (PSEA=ZSEA(:,:),PTOWN=ZTOWN(:,:))
     CALL RESOLVED_CLOUD ( CCLOUD, CACTCCN, CSCONV, CMF_CLOUD, NRR, NSPLITR,    &
                           NSPLITG, IMI, KTCOUNT,                               &
-                          CLBCX,CLBCY,TZBAKFILE, CRAD, CTURBDIM,               &
+                          CLBCX,CLBCY,TPBAKFILE, CRAD, CTURBDIM,               &
                           LSUBG_COND,LSIGMAS,CSUBG_AUCV,XTSTEP,                &
                           XZZ, XRHODJ, XRHODREF, XEXNREF,                      &
                           ZPABST, XTHT,XRT,XSIGS,VSIGQSAT,XMFCONV,XTHM,XRCM,   &
@@ -1918,7 +1928,7 @@ IF (CCLOUD /= 'NONE' .AND. CELEC == 'NONE') THEN
   ELSE
     CALL RESOLVED_CLOUD ( CCLOUD, CACTCCN, CSCONV, CMF_CLOUD, NRR, NSPLITR,    &
                           NSPLITG, IMI, KTCOUNT,                               &
-                          CLBCX,CLBCY,TZBAKFILE, CRAD, CTURBDIM,               &
+                          CLBCX,CLBCY,TPBAKFILE, CRAD, CTURBDIM,               &
                           LSUBG_COND,LSIGMAS,CSUBG_AUCV,                       &
                           XTSTEP,XZZ, XRHODJ, XRHODREF, XEXNREF,               &
                           ZPABST, XTHT,XRT,XSIGS,VSIGQSAT,XMFCONV,XTHM,XRCM,   &
@@ -2192,15 +2202,6 @@ XT_STEP_BUD = XT_STEP_BUD + ZTIME2 - ZTIME1 + XTIME_BU
 !
 !-------------------------------------------------------------------------------
 !
-!*       26.    FM FILE CLOSURE
-!               ---------------
-!
-IF ( tzbakfile%lopened ) THEN
-  CALL IO_File_close(TZBAKFILE)
-END IF
-!
-!-------------------------------------------------------------------------------
-!
 !*       27.    CURRENT TIME REFRESH
 !               --------------------
 !
-- 
GitLab