From d14b099b5bb354180f67480fca8b2b8661b63dcd Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Mon, 15 Jan 2018 14:36:45 +0100
Subject: [PATCH] Philippe 15/01/2018: IO: write horizontal dimensions in NC4
 files: improvements + problem corrections

---
 src/LIB/SURCOUCHE/src/mode_netcdf.f90 | 33 +++++++++++++++++----------
 src/MNH/diag.f90                      |  4 ++--
 src/MNH/open_nestpgd_files.f90        |  7 +++---
 src/MNH/pgd_grid_io_init_mnh.f90      |  4 ++++
 src/MNH/prep_nest_pgd.f90             |  2 ++
 src/MNH/prep_real_case.f90            |  7 +++---
 6 files changed, 36 insertions(+), 21 deletions(-)

diff --git a/src/LIB/SURCOUCHE/src/mode_netcdf.f90 b/src/LIB/SURCOUCHE/src/mode_netcdf.f90
index 1c039e8d1..be013b70d 100644
--- a/src/LIB/SURCOUCHE/src/mode_netcdf.f90
+++ b/src/LIB/SURCOUCHE/src/mode_netcdf.f90
@@ -69,6 +69,8 @@ TYPE(IOCDF), POINTER :: NEWIOCDF
 TYPE(IOCDF), POINTER :: TZIOCDF
 INTEGER              :: IRESP
 
+CALL PRINT_MSG(NVERB_DEBUG,'IO','NEWIOCDF','called')
+
 ALLOCATE(TZIOCDF, STAT=IRESP)
 IF (IRESP > 0) THEN 
   CALL PRINT_MSG(NVERB_FATAL,'IO','NEWIOCDF','memory allocation error')
@@ -111,7 +113,7 @@ END SUBROUTINE CLEANIOCDF
 
 SUBROUTINE IO_SET_KNOWNDIMS_NC4(TPFILE)
 
-USE MODD_DIM_ll,        ONLY: NIMAX_ll, NJMAX_ll, NKMAX_ll
+USE MODD_DIM_n,         ONLY: NIMAX_ll, NJMAX_ll, NKMAX
 USE MODD_PARAMETERS_ll, ONLY: JPHEXT, JPVEXT
 
 TYPE(TFILEDATA),INTENT(IN) :: TPFILE
@@ -119,13 +121,13 @@ TYPE(TFILEDATA),INTENT(IN) :: TPFILE
 INTEGER              :: IIU_ll, IJU_ll, IKU
 TYPE(IOCDF), POINTER :: PIOCDF
 
-CALL PRINT_MSG(NVERB_DEBUG,'IO','SET_KNOWN_NC_DIMS','called')
+CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_SET_KNOWNDIMS_NC4','called')
 
 PIOCDF => TPFILE%TNCDIMS
 
 IIU_ll = NIMAX_ll + 2*JPHEXT
 IJU_ll = NJMAX_ll + 2*JPHEXT
-IKU    = NKMAX_ll + 2*JPVEXT
+IKU    = NKMAX    + 2*JPVEXT
 
 IF (.NOT. ASSOCIATED(PIOCDF%DIM_NI))      PIOCDF%DIM_NI      => GETDIMCDF(TPFILE, IIU_ll, 'ni')
 IF (.NOT. ASSOCIATED(PIOCDF%DIM_NJ))      PIOCDF%DIM_NJ      => GETDIMCDF(TPFILE, IJU_ll, 'nj')
@@ -157,16 +159,16 @@ PIOCDF => TPFILE%TNCDIMS
 INCID = TPFILE%NNCID
 
 IF (TPFILE%LMASTER) THEN
-  CALL WRITE_COORD(PIOCDF%DIM_NI,'x-dimension of the grid','x_grid_index','X',0.,JPHEXT)
-  CALL WRITE_COORD(PIOCDF%DIM_NJ,'y-dimension of the grid','y_grid_index','Y',0.,JPHEXT)
-  CALL WRITE_COORD(PIOCDF%DIM_NI_U,'x-dimension of the grid at u location','x_grid_index_at_u_location','X',-0.5,JPHEXT)
-  CALL WRITE_COORD(PIOCDF%DIM_NJ_U,'y-dimension of the grid at u location','y_grid_index_at_u_location','Y', 0., JPHEXT)
-  CALL WRITE_COORD(PIOCDF%DIM_NI_V,'x-dimension of the grid at v location','x_grid_index_at_v_location','X', 0., JPHEXT)
-  CALL WRITE_COORD(PIOCDF%DIM_NJ_V,'y-dimension of the grid at v location','y_grid_index_at_v_location','Y',-0.5,JPHEXT)
+  CALL WRITE_HOR_COORD(PIOCDF%DIM_NI,'x-dimension of the grid','x_grid_index','X',0.,JPHEXT)
+  CALL WRITE_HOR_COORD(PIOCDF%DIM_NJ,'y-dimension of the grid','y_grid_index','Y',0.,JPHEXT)
+  CALL WRITE_HOR_COORD(PIOCDF%DIM_NI_U,'x-dimension of the grid at u location','x_grid_index_at_u_location','X',-0.5,JPHEXT)
+  CALL WRITE_HOR_COORD(PIOCDF%DIM_NJ_U,'y-dimension of the grid at u location','y_grid_index_at_u_location','Y', 0., JPHEXT)
+  CALL WRITE_HOR_COORD(PIOCDF%DIM_NI_V,'x-dimension of the grid at v location','x_grid_index_at_v_location','X', 0., JPHEXT)
+  CALL WRITE_HOR_COORD(PIOCDF%DIM_NJ_V,'y-dimension of the grid at v location','y_grid_index_at_v_location','Y',-0.5,JPHEXT)
 ENDIF
 
 CONTAINS
-SUBROUTINE WRITE_COORD(TDIM,HLONGNAME,HSTDNAME,HAXIS,PSHIFT,KBOUND)
+SUBROUTINE WRITE_HOR_COORD(TDIM,HLONGNAME,HSTDNAME,HAXIS,PSHIFT,KBOUND)
   TYPE(DIMCDF), POINTER, INTENT(IN) :: TDIM
   CHARACTER(LEN=*),      INTENT(IN) :: HLONGNAME
   CHARACTER(LEN=*),      INTENT(IN) :: HSTDNAME
@@ -221,7 +223,7 @@ SUBROUTINE WRITE_COORD(TDIM,HLONGNAME,HSTDNAME,HAXIS,PSHIFT,KBOUND)
 
   DEALLOCATE(ZTAB)
 
-END SUBROUTINE WRITE_COORD
+END SUBROUTINE WRITE_HOR_COORD
 
 END SUBROUTINE IO_WRITE_COORDVAR_NC4
 
@@ -234,7 +236,7 @@ INTEGER, OPTIONAL,       INTENT(OUT) :: KRESP
 
 CHARACTER(LEN=6) :: YLINE
 
-WRITE(YLINE,*) LINE
+WRITE(YLINE,'( I6 )') LINE
 
 ! Don't stop (by default) the code when KRESP is present
 ! and ensure KRESP is a negative integer
@@ -383,6 +385,8 @@ INTEGER(KIND=IDCDF_KIND) :: STATUS
 LOGICAL                  :: GCHKLEN !Check if KLEN is valid
 TYPE(IOCDF), POINTER     :: PIOCDF
 
+CALL PRINT_MSG(NVERB_DEBUG,'IO','GETDIMCDF','called')
+
 PIOCDF => TPFILE%TNCDIMS
 
 GCHKLEN = .TRUE.
@@ -424,6 +428,7 @@ IF (.NOT. ASSOCIATED(TMP)) THEN
    NULLIFY(TMP%NEXT)
    TMP%NEXT       => PIOCDF%DIMLIST
    PIOCDF%DIMLIST => TMP
+CALL PRINT_MSG(NVERB_DEBUG,'IO','GETDIMCDF','new dimension: '//TRIM(TMP%NAME))
 END IF
 
 GETDIMCDF => TMP
@@ -441,6 +446,8 @@ CHARACTER(LEN=8)      :: YDIMNAME
 CHARACTER(LEN=20)     :: YLEN
 INTEGER(KIND=IDCDF_KIND) :: STATUS
 
+CALL PRINT_MSG(NVERB_DEBUG,'IO','GETSTRDIMID','called')
+
 IF (KLEN < 1) THEN
   WRITE(YLEN,*) KLEN
   CALL PRINT_MSG(NVERB_FATAL,'IO','GETSTRDIMID','KLEN='//TRIM(YLEN))
@@ -481,6 +488,8 @@ INTEGER :: II
 TYPE(DIMCDF), POINTER :: PTDIM
 TYPE(IOCDF),  POINTER :: PIOCDF
 
+CALL PRINT_MSG(NVERB_DEBUG,'IO','FILLVDIMS','called')
+
 IF (SIZE(KSHAPE) < 1) CALL PRINT_MSG(NVERB_FATAL,'IO','FILLVDIMS','empty KSHAPE')
 
 PIOCDF => TPFILE%TNCDIMS
diff --git a/src/MNH/diag.f90 b/src/MNH/diag.f90
index a6882d355..cf7926b09 100644
--- a/src/MNH/diag.f90
+++ b/src/MNH/diag.f90
@@ -434,8 +434,6 @@ INPRAR = 24 +2*(4+NRR+NSV)
 !
 CALL IO_FILE_ADD2LIST(TOUTDATAFILE,TRIM(CINIFILE)//YSUFFIX,'DIAG','WRITE',KLFINPRAR=INPRAR,KLFITYPE=1,KLFIVERB=NVERB)
 !
-CALL IO_FILE_OPEN_ll(TOUTDATAFILE)
-!
 CALL SECOND_MNH2(ZTIME2)
 ZSTART=ZTIME2-ZTIME1
 ZTIME1=ZTIME2
@@ -480,6 +478,8 @@ ENDIF
 !
 !*       4.0    Stores the fields in MESONH files if necessary
 !
+CALL IO_FILE_OPEN_ll(TOUTDATAFILE)
+!
 CALL WRITE_LFIFM1_FOR_DIAG(TOUTDATAFILE,CDAD_NAME(1))
 !
 WRITE(ILUOUT0,*) ' '
diff --git a/src/MNH/open_nestpgd_files.f90 b/src/MNH/open_nestpgd_files.f90
index f76445939..cde53086b 100644
--- a/src/MNH/open_nestpgd_files.f90
+++ b/src/MNH/open_nestpgd_files.f90
@@ -319,12 +319,13 @@ END DO
 CALL IO_FILE_CLOSE_ll(TZPRE_NEST_PGD)
 !-------------------------------------------------------------------------------
 !
-!*       7.    OPENING OF INPUT AND OUTPUT PGD FILES
-!              -------------------------------------
+!*       7.    OPENING OF INPUT PGD FILES
+!              --------------------------
+!
+!Remark: output PGD files are opened later when the mesh dimensions are known
 !
 DO JPGD=1,NMODEL
   CALL IO_FILE_OPEN_ll(TPFILEPGD(JPGD)    %TZFILE,OPARALLELIO=.FALSE.)
-  CALL IO_FILE_OPEN_ll(TPFILENESTPGD(JPGD)%TZFILE,OPARALLELIO=.FALSE.)
 END DO
 !
 !-------------------------------------------------------------------------------
diff --git a/src/MNH/pgd_grid_io_init_mnh.f90 b/src/MNH/pgd_grid_io_init_mnh.f90
index 93f379cff..bf3dce484 100644
--- a/src/MNH/pgd_grid_io_init_mnh.f90
+++ b/src/MNH/pgd_grid_io_init_mnh.f90
@@ -143,6 +143,7 @@ USE MODE_ll
 USE MODE_FM
 USE MODD_PARAMETERS, ONLY : JPHEXT, JPVEXT, JPMODELMAX
 USE MODD_CONF,       ONLY : CPROGRAM, L1D, L2D, LPACK
+USE MODD_DIM_n,      ONLY : NIMAX_ll, NJMAX_ll, NKMAX
 !
 !JUANZ
 USE MODE_SPLITTINGZ_ll
@@ -225,6 +226,9 @@ LPACK=L1D.OR.L2D
 CALL SET_FMPACK_ll(L1D,L2D,LPACK)
 CALL SET_JP_ll(JPMODELMAX,JPHEXT,JPVEXT,JPHEXT)
 CALL SET_DAD0_ll()
+NIMAX_ll = IIMAX
+NJMAX_ll = IJMAX
+NKMAX    = 1
 CALL SET_DIM_ll(IIMAX, IJMAX, 1)
 CALL SET_LBX_ll('OPEN',1)
 CALL SET_LBY_ll('OPEN', 1)
diff --git a/src/MNH/prep_nest_pgd.f90 b/src/MNH/prep_nest_pgd.f90
index c23ec43fa..0bbe9f542 100644
--- a/src/MNH/prep_nest_pgd.f90
+++ b/src/MNH/prep_nest_pgd.f90
@@ -336,6 +336,8 @@ DO JPGD=1,NMODEL
   TPGDFILE     => TZFILEPGD(JPGD)%TZFILE
   TOUTDATAFILE => TZFILENESTPGD(JPGD)%TZFILE
   CALL GOTO_MODEL(JPGD)
+  !Open done here because grid dimensions have to be known
+  CALL IO_FILE_OPEN_ll(TZFILENESTPGD(JPGD)%TZFILE,OPARALLELIO=.FALSE.)
   CALL GOTO_SURFEX(JPGD)
   TFILE_SURFEX => TZFILENESTPGD(JPGD)%TZFILE
   CALL WRITE_PGD_SURF_ATM_n(YSURF_CUR,'MESONH')
diff --git a/src/MNH/prep_real_case.f90 b/src/MNH/prep_real_case.f90
index 4d459f06c..0d15c94ea 100644
--- a/src/MNH/prep_real_case.f90
+++ b/src/MNH/prep_real_case.f90
@@ -580,10 +580,6 @@ TLUOUT => TLUOUT0
 !
 TPGDFILE => TZPGDFILE
 !
-CALL IO_FILE_ADD2LIST(TINIFILE,CINIFILE,'PREPREALCASE','WRITE',KLFITYPE=1,KLFIVERB=NVERB)
-!
-CALL IO_FILE_OPEN_ll(TINIFILE)
-!
 IF (YATMFILETYPE=='MESONH') THEN
   LSHIFT = .FALSE.
 ELSE IF (YATMFILETYPE=='GRIBEX') THEN
@@ -757,6 +753,9 @@ CALL SECOND_MNH(ZTIME2)
 ZREAD = ZTIME2 - ZTIME1 - ZHORI
 !-------------------------------------------------------------------------------
 !
+CALL IO_FILE_ADD2LIST(TINIFILE,CINIFILE,'PREPREALCASE','WRITE',KLFITYPE=1,KLFIVERB=NVERB)
+CALL IO_FILE_OPEN_ll(TINIFILE)
+!
 ZTIME1=ZTIME2
 !
 !*       6.    CONFIGURATION VARIABLES
-- 
GitLab