From 601c33bdd3f5f41141e677cae6e8014bb617a280 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Tue, 8 Dec 2020 10:38:17 +0100
Subject: [PATCH] Philippe 08/12/2020: budgets: modify group_name management
 (in order to merge different times in further commits for netCDF files)

---
 src/MNH/write_budget.f90  | 43 +++++++++++++------------
 src/MNH/write_diachro.f90 | 68 +++++++++++++++++++++++++--------------
 2 files changed, 65 insertions(+), 46 deletions(-)

diff --git a/src/MNH/write_budget.f90 b/src/MNH/write_budget.f90
index 5448dcf9d..c4364f06c 100644
--- a/src/MNH/write_budget.f90
+++ b/src/MNH/write_budget.f90
@@ -380,9 +380,9 @@ subroutine Store_one_budget_rho( tpdiafile, tpdates, tprhodj, kp, knocompress, p
   logical,                                              intent(in)  :: knocompress ! compression for the cart option
   real,            dimension(:,:,:,:,:,:), allocatable, intent(out) :: prhodjn
 
-  character(len=4) :: ybutype
-  character(len=9) :: ygroup_name
-  type(tburhodata) :: tzfield
+  character(len=4)              :: ybutype
+  character(len=:), allocatable :: ygroup_name
+  type(tburhodata)              :: tzfield
 
   call Print_msg( NVERB_DEBUG, 'BUD', 'Store_one_budget_rho', 'called for '//trim( tprhodj%cmnhname ) )
 
@@ -415,16 +415,16 @@ subroutine Store_one_budget_rho( tpdiafile, tpdates, tprhodj, kp, knocompress, p
 
   select case( kp )
     case( NBUDGET_RHO )
-      write( ygroup_name, fmt = "('RJS__',I4.4)" ) nbutshift
+      ygroup_name = 'RJS'
 
     case( NBUDGET_U )
-      write( ygroup_name, fmt = "('RJX__',I4.4)" ) nbutshift
+      ygroup_name = 'RJX'
 
     case( NBUDGET_V )
-      write( ygroup_name, fmt = "('RJY__',I4.4)" ) nbutshift
+      ygroup_name = 'RJY'
 
     case( NBUDGET_W )
-      write( ygroup_name, fmt = "('RJZ__',I4.4)" ) nbutshift
+      ygroup_name = 'RJZ'
 
     case default
       call Print_msg( NVERB_ERROR, 'BUD', 'Store_one_budget_rho', 'unknown budget type' )
@@ -541,7 +541,7 @@ subroutine Store_one_budget( tpdiafile, tpdates, tpbudget, prhodjn, knocompress,
   real,                                                 intent(in) :: ptstep      ! time step
 
   character(len=4)                                        :: ybutype
-  character(len=9)                                        :: ygroup_name
+  character(len=:),                           allocatable :: ygroup_name
   integer                                                 :: igroups
   integer                                                 :: jproc
   integer                                                 :: jsv
@@ -605,44 +605,45 @@ subroutine Store_one_budget( tpdiafile, tpdates, tpbudget, prhodjn, knocompress,
 
   select case( tpbudget%nid )
     case ( NBUDGET_U )
-      write( ygroup_name, fmt = "('UU___',I4.4)" ) nbutshift
+      ygroup_name = 'UU'
 
     case ( NBUDGET_V )
-      write( ygroup_name, fmt = "('VV___',I4.4)" ) nbutshift
+      ygroup_name = 'VV'
 
     case ( NBUDGET_W )
-      write( ygroup_name, fmt = "('WW___',I4.4)" ) nbutshift
+      ygroup_name = 'WW'
 
     case ( NBUDGET_TH )
-      write( ygroup_name, fmt = "('TH___',I4.4)" ) nbutshift
+      ygroup_name = 'TH'
 
     case ( NBUDGET_TKE )
-      write( ygroup_name, fmt = "('TK___',I4.4)" ) nbutshift
+      ygroup_name = 'TK'
 
     case ( NBUDGET_RV )
-      write( ygroup_name, fmt = "('RV___',I4.4)" ) nbutshift
+      ygroup_name = 'RV'
 
     case ( NBUDGET_RC )
-      write( ygroup_name, fmt = "('RC___',I4.4)" ) nbutshift
+      ygroup_name = 'RC'
 
     case ( NBUDGET_RR )
-      write( ygroup_name, fmt = "('RR___',I4.4)" ) nbutshift
+      ygroup_name = 'RR'
 
     case ( NBUDGET_RI )
-      write( ygroup_name, fmt = "('RI___',I4.4)" ) nbutshift
+      ygroup_name = 'RI'
 
     case ( NBUDGET_RS )
-      write( ygroup_name, fmt = "('RS___',I4.4)" ) nbutshift
+      ygroup_name = 'RS'
 
     case ( NBUDGET_RG )
-      write( ygroup_name, fmt = "('RG___',I4.4)" ) nbutshift
+      ygroup_name = 'RG'
 
     case ( NBUDGET_RH )
-      write( ygroup_name, fmt = "('RH___',I4.4)" ) nbutshift
+      ygroup_name = 'RH'
 
     case ( NBUDGET_SV1 : )
       jsv = tpbudget%nid - NBUDGET_SV1 + 1
-      write( ygroup_name, fmt = "('SV',I3.3,I4.4)") jsv, nbutshift
+      Allocate( character(len=5) :: ygroup_name )
+      write( ygroup_name, fmt = "('SV',I3.3)") jsv
 
     case default
       call Print_msg( NVERB_ERROR, 'BUD', 'Store_one_budget', 'unknown budget type' )
diff --git a/src/MNH/write_diachro.f90 b/src/MNH/write_diachro.f90
index d4302b030..9803640e3 100644
--- a/src/MNH/write_diachro.f90
+++ b/src/MNH/write_diachro.f90
@@ -92,7 +92,6 @@ use modd_field,          only: tfield_metadata_base
 use modd_io,             only: tfiledata
 use modd_type_date,      only: date_time
 !
-use mode_menu_diachro,   only: Menu_diachro
 use mode_msg
 !
 IMPLICIT NONE
@@ -150,7 +149,6 @@ if ( tpdiafile%cformat == 'NETCDF4' .or. tpdiafile%cformat == 'LFICDF4' ) &
   call Write_diachro_nc4( tpdiafile, tpfields, hgroup, htype, tpdates, pvar, gicp, gjcp, gkcp, kil, kih, kjl, kjh, kkl, kkh )
 #endif
 
-call Menu_diachro( tpdiafile, hgroup )
 lpack = gpack
 
 end subroutine Write_diachro
@@ -159,7 +157,7 @@ end subroutine Write_diachro
 subroutine Write_diachro_lfi( tpdiafile, tpfields, hgroup, htype, tpdates, pvar, oicp, ojcp, okcp, kil, kih, kjl, kjh, kkl, kkh, &
                               ptrajx, ptrajy, ptrajz )
 
-use modd_budget,         only: nbumask, nbuwrnb
+use modd_budget,         only: nbumask, nbutshift, nbuwrnb
 use modd_field,          only: NMNHDIM_ONE, NMNHDIM_UNKNOWN, NMNHDIM_FLYER_TIME, NMNHDIM_NOTLISTED, NMNHDIM_UNUSED, &
                                TYPECHAR, TYPEINT, TYPEREAL,                                                         &
                                tfield_metadata_base, tfielddata
@@ -171,6 +169,7 @@ use modd_type_date,      only: date_time
 
 use mode_datetime,       only: Datetime_distance
 use mode_io_field_write, only: IO_Field_write, IO_Field_write_box
+use mode_menu_diachro,   only: Menu_diachro
 use mode_msg
 use mode_tools_ll,       only: Get_globaldims_ll
 
@@ -194,6 +193,7 @@ integer, parameter :: LFICOMMENTLGT = 100
 
 CHARACTER(LEN=20) :: YCOMMENT
 CHARACTER(LEN=3)  :: YJ
+character(len=:),                           allocatable :: ygroup
 character(len=LFITITLELGT),   dimension(:), allocatable :: ytitles   !Used to respect LFI fileformat
 character(len=LFIUNITLGT),    dimension(:), allocatable :: yunits    !Used to respect LFI fileformat
 character(len=LFICOMMENTLGT), dimension(:), allocatable :: ycomments !Used to respect LFI fileformat
@@ -221,6 +221,19 @@ tzfile%cformat = 'LFI'
 
 YCOMMENT='NOTHING'
 
+if (      Any( hgroup == [ 'RJS', 'RJX', 'RJY', 'RJZ'] )                                              &
+     .or. Any( hgroup == [ 'UU', 'VV', 'WW', 'TH', 'TK', 'RV', 'RC', 'RR', 'RI', 'RS', 'RG', 'RH' ] ) &
+     .or.  ( hgroup(1:2) == 'SV' .and. Len( hgroup ) == 5 )                                           ) then
+  Allocate( character(len=9) :: ygroup )
+  ygroup(:) = hgroup
+  do ji = Len_trim( hgroup ) + 1, 5
+    ygroup(ji : ji) = '_'
+  end do
+  Write( ygroup(6:9), '( i4.4 )' ) nbutshift
+else
+  ygroup = hgroup
+end if
+
 II = SIZE(PVAR,1)
 IJ = SIZE(PVAR,2)
 IF(HTYPE == 'CART' .AND. .NOT. OICP .AND. .NOT. OJCP) THEN
@@ -290,9 +303,9 @@ ENDIF
 !
 ! 1er enregistrement TYPE
 !
-TZFIELD%CMNHNAME   = TRIM(HGROUP)//'.TYPE'
+TZFIELD%CMNHNAME   = TRIM(ygroup)//'.TYPE'
 TZFIELD%CSTDNAME   = ''
-TZFIELD%CLONGNAME  = TRIM(HGROUP)//'.TYPE'
+TZFIELD%CLONGNAME  = TRIM(ygroup)//'.TYPE'
 TZFIELD%CUNITS     = ''
 TZFIELD%CDIR       = '--'
 TZFIELD%CCOMMENT   = TRIM(YCOMMENT)
@@ -304,9 +317,9 @@ CALL IO_Field_write(tzfile,TZFIELD,HTYPE)
 !
 ! 2eme  enregistrement DIMENSIONS des MATRICES et LONGUEUR des TABLEAUX de CARACTERES et FLAGS de COMPRESSION sur les DIFFERENTS AXES
 !
-TZFIELD%CMNHNAME   = TRIM(HGROUP)//'.DIM'
+TZFIELD%CMNHNAME   = TRIM(ygroup)//'.DIM'
 TZFIELD%CSTDNAME   = ''
-TZFIELD%CLONGNAME  = TRIM(HGROUP)//'.DIM'
+TZFIELD%CLONGNAME  = TRIM(ygroup)//'.DIM'
 TZFIELD%CUNITS     = ''
 TZFIELD%CDIR       = '--'
 TZFIELD%CCOMMENT   = TRIM(YCOMMENT)
@@ -369,9 +382,9 @@ END SELECT
 !
 ! 3eme enregistrement TITRE
 !
-TZFIELD%CMNHNAME   = TRIM(HGROUP)//'.TITRE'
+TZFIELD%CMNHNAME   = TRIM(ygroup)//'.TITRE'
 TZFIELD%CSTDNAME   = ''
-TZFIELD%CLONGNAME  = TRIM(HGROUP)//'.TITRE'
+TZFIELD%CLONGNAME  = TRIM(ygroup)//'.TITRE'
 TZFIELD%CUNITS     = ''
 TZFIELD%CDIR       = '--'
 TZFIELD%CCOMMENT   = TRIM(YCOMMENT)
@@ -386,9 +399,9 @@ deallocate( ytitles )
 !
 ! 4eme enregistrement UNITE
 !
-TZFIELD%CMNHNAME   = TRIM(HGROUP)//'.UNITE'
+TZFIELD%CMNHNAME   = TRIM(ygroup)//'.UNITE'
 TZFIELD%CSTDNAME   = ''
-TZFIELD%CLONGNAME  = TRIM(HGROUP)//'.UNITE'
+TZFIELD%CLONGNAME  = TRIM(ygroup)//'.UNITE'
 TZFIELD%CUNITS     = ''
 TZFIELD%CDIR       = '--'
 TZFIELD%CCOMMENT   = TRIM(YCOMMENT)
@@ -403,9 +416,9 @@ deallocate( yunits )
 !
 ! 5eme enregistrement COMMENT
 !
-TZFIELD%CMNHNAME   = TRIM(HGROUP)//'.COMMENT'
+TZFIELD%CMNHNAME   = TRIM(ygroup)//'.COMMENT'
 TZFIELD%CSTDNAME   = ''
-TZFIELD%CLONGNAME  = TRIM(HGROUP)//'.COMMENT'
+TZFIELD%CLONGNAME  = TRIM(ygroup)//'.COMMENT'
 TZFIELD%CUNITS     = ''
 TZFIELD%CDIR       = '--'
 TZFIELD%CCOMMENT   = TRIM(YCOMMENT)
@@ -445,7 +458,7 @@ DO J = 1,IP
           WRITE(YJ,'(I3)')J
   ENDIF
   IF(HTYPE == 'CART' .AND. .NOT. oicp .AND. .NOT. ojcp) THEN
-    TZFIELD%CMNHNAME   = TRIM(HGROUP)//'.PROC'//YJ
+    TZFIELD%CMNHNAME   = TRIM(ygroup)//'.PROC'//YJ
     TZFIELD%CSTDNAME   = ''
     TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
     TZFIELD%CUNITS     = tpfields(j)%cunits
@@ -459,7 +472,7 @@ DO J = 1,IP
     CALL IO_Field_write_BOX(tzfile,TZFIELD,'BUDGET',PVAR(:,:,:,:,:,J), &
                             KIL+JPHEXT,KIH+JPHEXT,KJL+JPHEXT,KJH+JPHEXT)
   ELSE
-    TZFIELD%CMNHNAME   = TRIM(HGROUP)//'.PROC'//YJ
+    TZFIELD%CMNHNAME   = TRIM(ygroup)//'.PROC'//YJ
     TZFIELD%CSTDNAME   = ''
     TZFIELD%CLONGNAME  = TRIM(TZFIELD%CMNHNAME)
     TZFIELD%CUNITS     = tpfields(j)%cunits
@@ -477,9 +490,9 @@ ENDDO
 !
 ! 7eme enregistrement TRAJT
 !
-TZFIELD%CMNHNAME   = TRIM(HGROUP)//'.TRAJT'
+TZFIELD%CMNHNAME   = TRIM(ygroup)//'.TRAJT'
 TZFIELD%CSTDNAME   = ''
-TZFIELD%CLONGNAME  = TRIM(HGROUP)//'.TRAJT'
+TZFIELD%CLONGNAME  = TRIM(ygroup)//'.TRAJT'
 TZFIELD%CUNITS     = ''
 TZFIELD%CDIR       = '--'
 TZFIELD%CCOMMENT   = TRIM(YCOMMENT)
@@ -516,9 +529,9 @@ deallocate( ztimes )
 ! 8eme enregistrement TRAJX
 !
 IF(PRESENT(PTRAJX))THEN
-  TZFIELD%CMNHNAME   = TRIM(HGROUP)//'.TRAJX'
+  TZFIELD%CMNHNAME   = TRIM(ygroup)//'.TRAJX'
   TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = TRIM(HGROUP)//'.TRAJX'
+  TZFIELD%CLONGNAME  = TRIM(ygroup)//'.TRAJX'
   TZFIELD%CUNITS     = ''
   TZFIELD%CDIR       = '--'
   TZFIELD%CCOMMENT   = TRIM(YCOMMENT)
@@ -532,9 +545,9 @@ ENDIF
 ! 9eme enregistrement TRAJY
 !
 IF(PRESENT(PTRAJY))THEN
-  TZFIELD%CMNHNAME   = TRIM(HGROUP)//'.TRAJY'
+  TZFIELD%CMNHNAME   = TRIM(ygroup)//'.TRAJY'
   TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = TRIM(HGROUP)//'.TRAJY'
+  TZFIELD%CLONGNAME  = TRIM(ygroup)//'.TRAJY'
   TZFIELD%CUNITS     = ''
   TZFIELD%CDIR       = '--'
   TZFIELD%CCOMMENT   = TRIM(YCOMMENT)
@@ -548,9 +561,9 @@ ENDIF
 ! 10eme enregistrement TRAJZ
 !
 IF(PRESENT(PTRAJZ))THEN
-  TZFIELD%CMNHNAME   = TRIM(HGROUP)//'.TRAJZ'
+  TZFIELD%CMNHNAME   = TRIM(ygroup)//'.TRAJZ'
   TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = TRIM(HGROUP)//'.TRAJZ'
+  TZFIELD%CLONGNAME  = TRIM(ygroup)//'.TRAJZ'
   TZFIELD%CUNITS     = ''
   TZFIELD%CDIR       = '--'
   TZFIELD%CCOMMENT   = TRIM(YCOMMENT)
@@ -563,9 +576,9 @@ ENDIF
 !
 ! 11eme enregistrement PDATIME
 !
-TZFIELD%CMNHNAME   = TRIM(HGROUP)//'.DATIM'
+TZFIELD%CMNHNAME   = TRIM(ygroup)//'.DATIM'
 TZFIELD%CSTDNAME   = ''
-TZFIELD%CLONGNAME  = TRIM(HGROUP)//'.DATIM'
+TZFIELD%CLONGNAME  = TRIM(ygroup)//'.DATIM'
 TZFIELD%CUNITS     = ''
 TZFIELD%CDIR       = '--'
 TZFIELD%CCOMMENT   = TRIM(YCOMMENT)
@@ -598,6 +611,8 @@ call IO_Field_write( tzfile, tzfield, zdatime )
 
 deallocate( zdatime )
 
+call Menu_diachro( tzfile, ygroup )
+
 end subroutine Write_diachro_lfi
 !-----------------------------------------------------------------------------
 #ifdef MNH_IOCDF4
@@ -615,6 +630,7 @@ use modd_type_date,    only: date_time
 
 use mode_io_field_write, only: IO_Field_write, IO_Field_write_box
 use mode_io_tools_nc4,   only: IO_Err_handle_nc4
+use mode_menu_diachro,   only: Menu_diachro
 use mode_msg
 
 type(tfiledata),                                     intent(in)           :: tpdiafile        ! File to write
@@ -1787,6 +1803,8 @@ tzfield%ndimlist(:) = NMNHDIM_UNKNOWN
 !Restore id of the file root group ('/' group)
 tzfile%nncid = isavencid
 
+call Menu_diachro( tzfile, hgroup )
+
 end  subroutine Write_diachro_nc4
 #endif
 
-- 
GitLab