From c0cd6c25a69baa6d0eb74ab2eb387258718b3f93 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@cnrs.fr>
Date: Fri, 25 Oct 2024 11:05:35 +0200
Subject: [PATCH] Philippe 25/10/2024: OUTPUTS: use TFIELDDATA structures
 instead of simple indices for OUTPUT variables (will be necesarry to
 customize outputs per variable)

---
 src/LIB/SURCOUCHE/src/mode_io_field_write.f90 | 14 ++--
 .../SURCOUCHE/src/mode_io_manage_struct.f90   | 83 ++++++++++---------
 src/MNH/modd_outn.f90                         | 14 +++-
 3 files changed, 61 insertions(+), 50 deletions(-)

diff --git a/src/LIB/SURCOUCHE/src/mode_io_field_write.f90 b/src/LIB/SURCOUCHE/src/mode_io_field_write.f90
index 358378245..634715ff4 100644
--- a/src/LIB/SURCOUCHE/src/mode_io_field_write.f90
+++ b/src/LIB/SURCOUCHE/src/mode_io_field_write.f90
@@ -4354,7 +4354,7 @@ end subroutine IO_Ndimlist_reduce
 SUBROUTINE IO_Fieldlist_write(TPOUTPUT)
 
 USE MODD_IO,             ONLY: ISP
-USE MODD_OUT_n,          ONLY: LOUT_BIGBOX_WRITE, NOUT_FIELDLIST, NOUT_NBOXES, TOUT_BOXES
+USE MODD_OUT_n,          ONLY: LOUT_BIGBOX_WRITE, NOUT_NBOXES, TOUT_BOXES, TOUT_FIELDLIST
 USE MODD_PRECISION,      ONLY: CDFINT
 
 IMPLICIT NONE
@@ -4367,8 +4367,8 @@ INTEGER(KIND=CDFINT) :: IGROUPID_ROOT
 TYPE(TFILEDATA)      :: TZOUTPUT
 
 IF ( LOUT_BIGBOX_WRITE ) THEN
-  DO JI = 1, SIZE( NOUT_FIELDLIST )
-    CALL IO_Fieldlist_1field_write( TPOUTPUT, TFIELDLIST(NOUT_FIELDLIST(JI)), TOUT_BOXES(0) )
+  DO JI = 1, SIZE( TOUT_FIELDLIST )
+    CALL IO_Fieldlist_1field_write( TPOUTPUT, TOUT_FIELDLIST(JI), TOUT_BOXES(0) )
   END DO
 END IF
 
@@ -4393,13 +4393,13 @@ IF ( NOUT_NBOXES > 0 ) THEN
     IF ( ISP == TZOUTPUT%NMASTER_RANK ) TZOUTPUT%NNCID = TZOUTPUT%NBOXNCID(JBOX)
 
     ! Write fields common to all boxes
-    DO JI = 1, SIZE( NOUT_FIELDLIST )
-      CALL IO_Fieldlist_1field_write( TZOUTPUT, TFIELDLIST(NOUT_FIELDLIST(JI)), TOUT_BOXES(JBOX) )
+    DO JI = 1, SIZE( TOUT_FIELDLIST )
+      CALL IO_Fieldlist_1field_write( TZOUTPUT, TOUT_FIELDLIST(JI), TOUT_BOXES(JBOX) )
     END DO
 
     ! Write box-specific fields
-    DO JI = 1, SIZE( TOUT_BOXES(JBOX)%NFIELDLIST_SUPP )
-      CALL IO_Fieldlist_1field_write( TZOUTPUT, TFIELDLIST(TOUT_BOXES(JBOX)%NFIELDLIST_SUPP(JI)), TOUT_BOXES(JBOX) )
+    DO JI = 1, SIZE( TOUT_BOXES(JBOX)%TFIELDLIST_SUPP )
+      CALL IO_Fieldlist_1field_write( TZOUTPUT, TOUT_BOXES(JBOX)%TFIELDLIST_SUPP(JI), TOUT_BOXES(JBOX) )
     END DO
 
       ! Restore the root group (not really necessary but cleaner)
diff --git a/src/LIB/SURCOUCHE/src/mode_io_manage_struct.f90 b/src/LIB/SURCOUCHE/src/mode_io_manage_struct.f90
index 2a4c4d7ce..64240b11e 100644
--- a/src/LIB/SURCOUCHE/src/mode_io_manage_struct.f90
+++ b/src/LIB/SURCOUCHE/src/mode_io_manage_struct.f90
@@ -495,7 +495,7 @@ DO IMI = 1, NMODEL
 
   IF ( OUT_MODEL(IMI)%NOUT_NUMB > 0 ) THEN
     !Determine the list of the fields to write in each output
-    CALL IO_OUT_FIELDLIST_FILL( COUT_VAR(IMI,:), .TRUE., OUT_MODEL(IMI)%NOUT_FIELDLIST )
+    CALL IO_OUT_FIELDLIST_FILL( COUT_VAR(IMI,:), .TRUE., OUT_MODEL(IMI)%TOUT_FIELDLIST )
 
     ! Treat the boxes (sub-domains) for output files
     CALL IO_BOX_PREPARE( )
@@ -549,11 +549,10 @@ DO IMI = 1, NMODEL
     END IF
 
     IF ( OUT_MODEL(IMI)%NOUT_NUMB > 0 ) THEN
-      IF ( SIZE( OUT_MODEL(IMI)%NOUT_FIELDLIST ) > 0 ) THEN
+      IF ( SIZE( OUT_MODEL(IMI)%TOUT_FIELDLIST ) > 0 ) THEN
         WRITE( *, '( "List of fields:" )' )
-        DO JOUT = 1, SIZE( OUT_MODEL(IMI)%NOUT_FIELDLIST )
-          IDX = OUT_MODEL(IMI)%NOUT_FIELDLIST(JOUT)
-          WRITE(*, '( "  ", A )' ) TRIM(TFIELDLIST(IDX)%CMNHNAME)
+        DO JOUT = 1, SIZE( OUT_MODEL(IMI)%TOUT_FIELDLIST )
+          WRITE(*, '( "  ", A )' ) TRIM(OUT_MODEL(IMI)%TOUT_FIELDLIST(JOUT)%CMNHNAME)
         END DO
       END IF
       WRITE( *, '( "Number of boxes:", I9 )' ) OUT_MODEL(IMI)%NOUT_NBOXES
@@ -561,11 +560,10 @@ DO IMI = 1, NMODEL
         WRITE( *, '( "  List of boxes:" )' )
         DO JI = 1, OUT_MODEL(IMI)%NOUT_NBOXES
           WRITE(*, '( "    ", A )' ) TRIM(OUT_MODEL(IMI)%TOUT_BOXES(JI)%CNAME)
-          IF ( SIZE( OUT_MODEL(IMI)%TOUT_BOXES(JI)%NFIELDLIST_SUPP ) > 0 ) THEN
+          IF ( SIZE( OUT_MODEL(IMI)%TOUT_BOXES(JI)%TFIELDLIST_SUPP ) > 0 ) THEN
             WRITE( *, '( "      Specific fields:" )' )
-            DO JOUT = 1, SIZE( OUT_MODEL(IMI)%TOUT_BOXES(JI)%NFIELDLIST_SUPP )
-              IDX = OUT_MODEL(IMI)%TOUT_BOXES(JI)%NFIELDLIST_SUPP(JOUT)
-              WRITE(*, '( "        ", A )' ) TRIM(TFIELDLIST(IDX)%CMNHNAME)
+            DO JOUT = 1, SIZE( OUT_MODEL(IMI)%TOUT_BOXES(JI)%TFIELDLIST_SUPP )
+              WRITE(*, '( "        ", A )' ) TRIM(OUT_MODEL(IMI)%TOUT_BOXES(JI)%TFIELDLIST_SUPP(JOUT)%CMNHNAME)
             END DO
           END IF
         END DO
@@ -715,18 +713,23 @@ SUBROUTINE SORT_ENTRIES(KNUMB,KSTEPS)
 END SUBROUTINE SORT_ENTRIES
 !
 !#########################################################################
-SUBROUTINE IO_OUT_FIELDLIST_FILL( HVARLIST, OMAINBOX, KFIELDLIST )
+SUBROUTINE IO_OUT_FIELDLIST_FILL( HVARLIST, OMAINBOX, TPOUTFIELDLIST )
 !#########################################################################
+  use modd_field, only: tfielddata
+
   use mode_field, only: Find_field_id_from_mnhname
 
-  CHARACTER(LEN=NMNHNAMELGTMAX), DIMENSION(:), INTENT(IN)  :: HVARLIST
-  LOGICAL,                                     INTENT(IN)  :: OMAINBOX
-  INTEGER, DIMENSION(:), ALLOCATABLE,          INTENT(OUT) :: KFIELDLIST
+  CHARACTER(LEN=NMNHNAMELGTMAX), DIMENSION(:),              INTENT(IN)  :: HVARLIST
+  LOGICAL,                                                  INTENT(IN)  :: OMAINBOX
+  TYPE(TFIELDDATA),              DIMENSION(:), ALLOCATABLE, INTENT(OUT) :: TPOUTFIELDLIST
+
+  CHARACTER(LEN=*), PARAMETER :: YISDUPLICATED = '_duplicated'
 
+  CHARACTER(LEN=NMNHNAMELGTMAX)      :: YMNHNAME
   INTEGER                            :: IFIELD
   INTEGER                            :: IVAR   ! Number of variables
   INTEGER                            :: JIDX
-  INTEGER, DIMENSION(:), ALLOCATABLE :: ICOMPACTFIELDLIST
+  TYPE(TFIELDDATA), DIMENSION(:), ALLOCATABLE :: TZCOMPACTFIELDLIST
 
   !Count the number of fields to output
   IVAR = 0
@@ -738,7 +741,7 @@ SUBROUTINE IO_OUT_FIELDLIST_FILL( HVARLIST, OMAINBOX, KFIELDLIST )
   IF ( IVAR == 0 .AND. OMAINBOX .AND. ( NOUT_BOXES(IMI) == 0 .OR. LOUT_MAINDOMAIN_WRITE(IMI) ) ) &
     CALL PRINT_MSG( NVERB_WARNING, 'IO', 'IO_OUT_FIELDLIST_FILL', 'no fields chosen for output' )
 
-  ALLOCATE( KFIELDLIST(IVAR) )
+  ALLOCATE( TPOUTFIELDLIST(IVAR) )
 
   IF ( IVAR > 0 ) THEN
     !Determine the list of the outputs to do (by field number)
@@ -747,7 +750,7 @@ SUBROUTINE IO_OUT_FIELDLIST_FILL( HVARLIST, OMAINBOX, KFIELDLIST )
       IF ( HVARLIST(IPOS) /= '' ) THEN
         IVAR = IVAR + 1
         CALL FIND_FIELD_ID_FROM_MNHNAME( HVARLIST(IPOS), IFIELD, IRESP )
-        KFIELDLIST(IVAR) = IFIELD
+        TPOUTFIELDLIST(IVAR) = TFIELDLIST(IFIELD)
         IF ( IRESP /= 0 ) THEN
           CALL PRINT_MSG( NVERB_FATAL, 'IO', 'IO_OUT_FIELDLIST_FILL', 'unknown field for output: ' // TRIM(HVARLIST(IPOS)) )
           !MNH is killed to prevent problems with wrong values in fieldlist
@@ -758,40 +761,42 @@ SUBROUTINE IO_OUT_FIELDLIST_FILL( HVARLIST, OMAINBOX, KFIELDLIST )
   END IF
 
   !Find and remove duplicated entries
-  DO IPOS = 1, SIZE( KFIELDLIST )
-    IFIELD = KFIELDLIST(IPOS)
-    IF ( IFIELD == -1 ) CYCLE
-    DO JIDX = IPOS + 1, SIZE( KFIELDLIST )
-      IF ( KFIELDLIST(JIDX) == IFIELD ) THEN
-        KFIELDLIST(JIDX) = -1
+  DO IPOS = 1, SIZE( TPOUTFIELDLIST )
+    YMNHNAME = TPOUTFIELDLIST(IPOS)%CMNHNAME
+    IF ( YMNHNAME == YISDUPLICATED ) CYCLE
+    DO JIDX = IPOS + 1, SIZE( TPOUTFIELDLIST )
+      IF ( TPOUTFIELDLIST(JIDX)%CMNHNAME == YMNHNAME ) THEN
+        TPOUTFIELDLIST(JIDX)%CMNHNAME = YISDUPLICATED
         IVAR = IVAR - 1
       END IF
     END DO
   END DO
 
   ! Compact the fieldlist (if some entries were duplicated and removed)
-  IF ( IVAR < SIZE( KFIELDLIST ) ) THEN
+  IF ( IVAR < SIZE( TFIELDLIST ) ) THEN
     CALL PRINT_MSG( NVERB_WARNING, 'IO', 'IO_OUT_FIELDLIST_FILL', 'some output variable entries were duplicated => removed' )
 
-    ALLOCATE( ICOMPACTFIELDLIST(IVAR) )
+    ALLOCATE( TZCOMPACTFIELDLIST(IVAR) )
     JIDX = 1
-    DO IPOS = 1, SIZE( KFIELDLIST )
-      IF ( KFIELDLIST(IPOS) /= -1 ) THEN
-        ICOMPACTFIELDLIST(JIDX) = KFIELDLIST(IPOS)
+    DO IPOS = 1, SIZE( TPOUTFIELDLIST )
+      IF ( TPOUTFIELDLIST(IPOS)%CMNHNAME /= YISDUPLICATED ) THEN
+        TZCOMPACTFIELDLIST(JIDX) = TPOUTFIELDLIST(IPOS)
         JIDX = JIDX + 1
       END IF
     END DO
-    CALL MOVE_ALLOC( FROM = ICOMPACTFIELDLIST, TO = KFIELDLIST )
+    CALL MOVE_ALLOC( FROM = TZCOMPACTFIELDLIST, TO = TPOUTFIELDLIST )
   END IF
 
 END SUBROUTINE IO_OUT_FIELDLIST_FILL
 
+
 !#########################################################################
 SUBROUTINE IO_BOX_PREPARE( )
 !#########################################################################
 
   USE MODD_DIM_n, ONLY: DIM_MODEL
   USE MODD_DYN_n, ONLY: DYN_MODEL
+  USE MODD_FIELD, ONLY: TFIELDDATA
   USE MODD_OUT_n, ONLY: CMAINDOMAINNAME
 
   INTEGER                            :: IFIELD
@@ -799,6 +804,7 @@ SUBROUTINE IO_BOX_PREPARE( )
   INTEGER                            :: JIDX1, JIDX2
   INTEGER, DIMENSION(:), ALLOCATABLE :: ICOMPACTFIELDLIST
   LOGICAL                            :: GKINF_PROVIDED, GKSUP_PROVIDED
+  TYPE(TFIELDDATA), DIMENSION(:), ALLOCATABLE :: TZCOMPACTFIELDLIST
 
   ! Force the writing of the main domain if there are no boxes
   ! Remark: default value of LOUT_MAINDOMAIN_WRITE is .FALSE.
@@ -838,7 +844,7 @@ SUBROUTINE IO_BOX_PREPARE( )
   TOUT_BOXES(0)%CNAME = CMAINDOMAINNAME
   TOUT_BOXES(0)%NID = 0
 
-  ALLOCATE( TOUT_BOXES(0)%NFIELDLIST_SUPP(0) )
+  ALLOCATE( TOUT_BOXES(0)%TFIELDLIST_SUPP(0) )
 
   IF ( OUT_MODEL(IMI)%LOUT_HOR_BORDER_REMOVE ) THEN
     TOUT_BOXES(0)%NIINF = 1
@@ -948,25 +954,24 @@ SUBROUTINE IO_BOX_PREPARE( )
                                     CALL Print_msg( NVERB_ERROR, 'GEN', 'IO_BOX_PREPARE', 'NOUT_BOX_KSUP < NOUT_BOX_KINF' )
 
     ! Field the list of variables to write for each box (in addition to the NOUTFIELDLIST which is common to all the boxes)
-    CALL IO_OUT_FIELDLIST_FILL( COUT_BOX_VAR_SUPP(IMI,JI,:), .FALSE., TOUT_BOXES(JI)%NFIELDLIST_SUPP )
+    CALL IO_OUT_FIELDLIST_FILL( COUT_BOX_VAR_SUPP(IMI,JI,:), .FALSE., TOUT_BOXES(JI)%TFIELDLIST_SUPP )
 
     ! Check for duplicated entries between the general list and the box-specific one
-    IVAR = SIZE( TOUT_BOXES(JI)%NFIELDLIST_SUPP )
-    DO JIDX1 = 1, SIZE( OUT_MODEL(IMI)%NOUT_FIELDLIST )
-      IFIELD = OUT_MODEL(IMI)%NOUT_FIELDLIST(JIDX1)
-      DO JIDX2 = 1, SIZE( TOUT_BOXES(JI)%NFIELDLIST_SUPP )
-        IF ( TOUT_BOXES(JI)%NFIELDLIST_SUPP(JIDX2) == IFIELD ) THEN
-          TOUT_BOXES(JI)%NFIELDLIST_SUPP(JIDX2) = TOUT_BOXES(JI)%NFIELDLIST_SUPP(SIZE(TOUT_BOXES(JI)%NFIELDLIST_SUPP))
+    IVAR = SIZE( TOUT_BOXES(JI)%TFIELDLIST_SUPP )
+    DO JIDX1 = 1, SIZE( OUT_MODEL(IMI)%TOUT_FIELDLIST )
+      DO JIDX2 = 1, SIZE( TOUT_BOXES(JI)%TFIELDLIST_SUPP )
+        IF ( TOUT_BOXES(JI)%TFIELDLIST_SUPP(JIDX2)%CMNHNAME == OUT_MODEL(IMI)%TOUT_FIELDLIST(JIDX1)%CMNHNAME ) THEN
+          TOUT_BOXES(JI)%TFIELDLIST_SUPP(JIDX2) = TOUT_BOXES(JI)%TFIELDLIST_SUPP(SIZE(TOUT_BOXES(JI)%TFIELDLIST_SUPP))
           IVAR = IVAR - 1
         END IF
       END DO
     END DO
 
     ! Compact the fieldlist (if some entries were duplicated and removed)
-    IF ( IVAR < SIZE( TOUT_BOXES(JI)%NFIELDLIST_SUPP ) ) THEN
+    IF ( IVAR < SIZE( TOUT_BOXES(JI)%TFIELDLIST_SUPP ) ) THEN
       CALL Print_msg( NVERB_WARNING, 'IO', 'IO_BOX_PREPARE', 'some box-specific output variables already in main list => removed' )
-      ICOMPACTFIELDLIST = TOUT_BOXES(JI)%NFIELDLIST_SUPP(1:IVAR)
-      CALL MOVE_ALLOC( FROM = ICOMPACTFIELDLIST, TO = TOUT_BOXES(JI)%NFIELDLIST_SUPP )
+      TZCOMPACTFIELDLIST = TOUT_BOXES(JI)%TFIELDLIST_SUPP(1:IVAR)
+      CALL MOVE_ALLOC( FROM = TZCOMPACTFIELDLIST, TO = TOUT_BOXES(JI)%TFIELDLIST_SUPP )
     END IF
   END DO
 END SUBROUTINE IO_BOX_PREPARE
diff --git a/src/MNH/modd_outn.f90 b/src/MNH/modd_outn.f90
index f14ebbd36..acf976501 100644
--- a/src/MNH/modd_outn.f90
+++ b/src/MNH/modd_outn.f90
@@ -40,18 +40,24 @@
 !             ------------
 !
 !
+USE MODD_FIELD,      ONLY: TFIELDDATA
 USE MODD_PARAMETERS, ONLY: JPMODELMAX, NMNHNAMELGTMAX, NNEGUNDEF
 
 IMPLICIT NONE
 
 SAVE
 
+
+!PW: renommer le module car aussi pour backups!!! + renommage dans le module aussi...
+!PW:restructurer?: en faisant 1 type avec les numeros, listes, frequences.
+!PW:               a utiliser pour les backups et les outputs => permettrait de dedupliquer certaines choses ?
+
 CHARACTER(LEN=NMNHNAMELGTMAX), PARAMETER :: CMAINDOMAINNAME = 'MAINDOMAIN'
 
 TYPE TOUTBOXMETADATA
   CHARACTER(LEN=NMNHNAMELGTMAX):: CNAME = '' ! Name of the box
   INTEGER :: NID = NNEGUNDEF ! Id of the box
-  INTEGER, DIMENSION(:), ALLOCATABLE :: NFIELDLIST_SUPP ! Lists of fields to write (added to the NOUT_FIELDLIST)
+  TYPE(TFIELDDATA), DIMENSION(:), ALLOCATABLE :: TFIELDLIST_SUPP ! Lists of fields to write (added to the TOUT_FIELDLIST)
   INTEGER :: NIINF = NNEGUNDEF ! Box coordinates in physical domain
   INTEGER :: NISUP = NNEGUNDEF
   INTEGER :: NJINF = NNEGUNDEF
@@ -92,7 +98,7 @@ TYPE OUT_t
   INTEGER                            :: NOUT_STEPFREQFIRST = NNEGUNDEF ! First output (if regular)
   INTEGER, DIMENSION(:), ALLOCATABLE :: NBAK_STEPLIST                  ! List of time steps to do backups (except regular series)
   INTEGER, DIMENSION(:), ALLOCATABLE :: NOUT_STEPLIST                  ! List of time steps to do outputs (except regular series)
-  INTEGER, DIMENSION(:), ALLOCATABLE :: NOUT_FIELDLIST                 ! List of fields to write in outputs
+  TYPE(TFIELDDATA), DIMENSION(:), ALLOCATABLE :: TOUT_FIELDLIST        ! List of fields to write in outputs
   LOGICAL                            :: LOUT_BIGBOX_WRITE      = .TRUE. ! Write the main box/domain (if there are boxes)
   LOGICAL                            :: LOUT_BAL_REMOVE        = .TRUE. ! Remove the bottom absorbing layer
   LOGICAL                            :: LOUT_TAL_REMOVE        = .TRUE. ! Remove the top absorbing layer
@@ -114,7 +120,7 @@ INTEGER,               POINTER :: NBAK_STEPFREQFIRST        => NULL()
 INTEGER,               POINTER :: NOUT_STEPFREQFIRST        => NULL()
 INTEGER, DIMENSION(:), POINTER :: NBAK_STEPLIST             => NULL()
 INTEGER, DIMENSION(:), POINTER :: NOUT_STEPLIST             => NULL()
-INTEGER, DIMENSION(:), POINTER :: NOUT_FIELDLIST            => NULL()
+TYPE(TFIELDDATA), DIMENSION(:), POINTER :: TOUT_FIELDLIST   => NULL()
 LOGICAL,               POINTER :: LOUT_BIGBOX_WRITE         => NULL()
 LOGICAL,               POINTER :: LOUT_BAL_REMOVE           => NULL()
 LOGICAL,               POINTER :: LOUT_TAL_REMOVE           => NULL()
@@ -138,7 +144,7 @@ NBAK_STEPFREQFIRST     => OUT_MODEL(KTO)%NBAK_STEPFREQFIRST
 NOUT_STEPFREQFIRST     => OUT_MODEL(KTO)%NOUT_STEPFREQFIRST
 NBAK_STEPLIST          => OUT_MODEL(KTO)%NBAK_STEPLIST
 NOUT_STEPLIST          => OUT_MODEL(KTO)%NOUT_STEPLIST
-NOUT_FIELDLIST         => OUT_MODEL(KTO)%NOUT_FIELDLIST
+TOUT_FIELDLIST         => OUT_MODEL(KTO)%TOUT_FIELDLIST
 LOUT_BIGBOX_WRITE      => OUT_MODEL(KTO)%LOUT_BIGBOX_WRITE
 LOUT_BAL_REMOVE        => OUT_MODEL(KTO)%LOUT_BAL_REMOVE
 LOUT_TAL_REMOVE        => OUT_MODEL(KTO)%LOUT_TAL_REMOVE
-- 
GitLab