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