From 1b5187c4bf96db205476ae2c434261116db3f491 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Wed, 10 Apr 2024 10:52:31 +0200 Subject: [PATCH] Philippe 10/04/2024: outputs: remove levels below Bottom Absorbing Layer (can be disabled) --- .../SURCOUCHE/src/mode_io_manage_struct.f90 | 28 +++++++++++++++++-- src/LIB/SURCOUCHE/src/mode_io_tools_nc4.f90 | 2 +- src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 | 2 +- src/MNH/modd_bakout.f90 | 7 +++-- src/MNH/modd_outn.f90 | 3 ++ src/MNH/modn_output.f90 | 3 +- 6 files changed, 37 insertions(+), 8 deletions(-) diff --git a/src/LIB/SURCOUCHE/src/mode_io_manage_struct.f90 b/src/LIB/SURCOUCHE/src/mode_io_manage_struct.f90 index 38ba62282..b3af57c57 100644 --- a/src/LIB/SURCOUCHE/src/mode_io_manage_struct.f90 +++ b/src/LIB/SURCOUCHE/src/mode_io_manage_struct.f90 @@ -792,7 +792,7 @@ SUBROUTINE IO_BOX_PREPARE( KMI ) !######################################################################### USE MODD_DIM_n, ONLY: NIMAX_ll, NJMAX_ll, NKMAX - USE MODD_DYN_n, ONLY: NALBOT + USE MODD_DYN_n, ONLY: NALBAS, NALBOT USE MODD_OUT_n, ONLY: CMAINDOMAINNAME INTEGER, INTENT(IN) :: KMI @@ -801,13 +801,20 @@ SUBROUTINE IO_BOX_PREPARE( KMI ) INTEGER :: IVAR INTEGER :: JIDX1, JIDX2 INTEGER, DIMENSION(:), ALLOCATABLE :: ICOMPACTFIELDLIST - LOGICAL :: GKSUP_PROVIDED + LOGICAL :: GKINF_PROVIDED, GKSUP_PROVIDED ! Force the writing of the main domain if there are no boxes ! Remark: default value of LOUT_MAINDOMAIN_WRITE is .FALSE. IF ( NOUT_BOXES(IMI) == 0 ) LOUT_MAINDOMAIN_WRITE(IMI) = .TRUE. OUT_MODEL(IMI)%LOUT_BIGBOX_WRITE = LOUT_MAINDOMAIN_WRITE(IMI) + ! Remove the Bottom Absorbing Layer? + IF ( DYN_MODEL(IMI)%LVE_RELAX_GRD .AND. LOUT_BOTTOM_ABSORBING_LAYER_REMOVE(IMI) ) THEN + OUT_MODEL(IMI)%LOUT_BAL_REMOVE = .TRUE. + ELSE + OUT_MODEL(IMI)%LOUT_BAL_REMOVE = .FALSE. + END IF + ! Remove the Top Absorbing Layer? IF ( DYN_MODEL(IMI)%LVE_RELAX .AND. LOUT_TOP_ABSORBING_LAYER_REMOVE(IMI) ) THEN OUT_MODEL(IMI)%LOUT_TAL_REMOVE = .TRUE. @@ -855,6 +862,11 @@ SUBROUTINE IO_BOX_PREPARE( KMI ) TOUT_BOXES(0)%NKSUP = NKMAX + JPVEXT END IF + IF ( OUT_MODEL(IMI)%LOUT_BAL_REMOVE ) THEN + ! Max to manage case when the BAL is in the unphysical domain (should not happen) + TOUT_BOXES(0)%NKINF = MAX( TOUT_BOXES(0)%NKINF, NALBAS - JPVEXT ) + END IF + IF ( OUT_MODEL(IMI)%LOUT_TAL_REMOVE ) THEN ! Min to manage case when the TAL is in the unphysical domain (should not happen) TOUT_BOXES(0)%NKSUP = MIN( TOUT_BOXES(0)%NKSUP, NALBOT - JPVEXT ) @@ -874,6 +886,12 @@ SUBROUTINE IO_BOX_PREPARE( KMI ) TOUT_BOXES(JI)%NKINF = NOUT_BOX_KINF(IMI,JI) TOUT_BOXES(JI)%NKSUP = NOUT_BOX_KSUP(IMI,JI) + IF ( TOUT_BOXES(JI)%NKINF == NNEGUNDEF ) THEN + GKINF_PROVIDED = .FALSE. + ELSE + GKINF_PROVIDED = .TRUE. + END IF + IF ( TOUT_BOXES(JI)%NKSUP == NNEGUNDEF ) THEN GKSUP_PROVIDED = .FALSE. ELSE @@ -888,6 +906,12 @@ SUBROUTINE IO_BOX_PREPARE( KMI ) IF ( TOUT_BOXES(JI)%NKINF == NNEGUNDEF ) TOUT_BOXES(JI)%NKINF = 1 IF ( TOUT_BOXES(JI)%NKSUP == NNEGUNDEF ) TOUT_BOXES(JI)%NKSUP = NKMAX + IF ( OUT_MODEL(IMI)%LOUT_BAL_REMOVE ) THEN + IF ( GKINF_PROVIDED .AND. TOUT_BOXES(JI)%NKINF < ( NALBAS - JPVEXT ) ) & + CALL Print_msg( NVERB_WARNING, 'GEN', 'IO_BOX_PREPARE', 'provided NKINF increazed after removal of Bottom Absorbing Layer' ) + TOUT_BOXES(JI)%NKINF = MAX( TOUT_BOXES(JI)%NKINF, NALBAS - JPVEXT ) + END IF + IF ( OUT_MODEL(IMI)%LOUT_TAL_REMOVE ) THEN IF ( GKSUP_PROVIDED .AND. TOUT_BOXES(JI)%NKSUP > ( NALBOT - JPVEXT ) ) & CALL Print_msg( NVERB_WARNING, 'GEN', 'IO_BOX_PREPARE', 'provided NKSUP reduced after removal of Top Absorbing Layer' ) diff --git a/src/LIB/SURCOUCHE/src/mode_io_tools_nc4.f90 b/src/LIB/SURCOUCHE/src/mode_io_tools_nc4.f90 index e22aab89d..438a3218c 100644 --- a/src/LIB/SURCOUCHE/src/mode_io_tools_nc4.f90 +++ b/src/LIB/SURCOUCHE/src/mode_io_tools_nc4.f90 @@ -280,7 +280,7 @@ use modd_field, only: NMNHDIM_NI, NMNHDIM_NJ, NMNHDIM_NI_U, NMNHDIM_NJ_U use modd_les, only: lles_pdf, nles_k, npdf, nspectra_k, xles_temp_mean_start, xles_temp_mean_step, xles_temp_mean_end use modd_les_n, only: nles_times, nspectra_ni, nspectra_nj use modd_nsv, only: nsv -use modd_out_n, only: lout_tal_remove, nout_nboxes, tout_boxes +use modd_out_n, only: nout_nboxes, tout_boxes USE MODD_PARAMETERS_ll, ONLY: JPHEXT, JPVEXT use modd_param_n, only: crad use modd_profiler_n, only: lprofiler, tprofilers_time diff --git a/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 b/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 index b43314177..57558dab2 100644 --- a/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 +++ b/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 @@ -1466,7 +1466,7 @@ use modd_les, only: cles_level_type, cspectra_level_type, nlesn_iinf, nle use modd_les_n, only: nles_dtcount, nles_mean_end, nles_mean_start, nles_mean_step, nles_mean_times, & nles_times, nspectra_ni, nspectra_nj, tles_dates, xles_times use modd_netcdf, only: tdimnc -use modd_out_n, only: lout_tal_remove, nout_nboxes, tout_boxes +use modd_out_n, only: nout_nboxes, tout_boxes use modd_parameters, only: jphext, JPVEXT use modd_profiler_n, only: lprofiler, tprofilers_time use modd_series, only: lseries diff --git a/src/MNH/modd_bakout.f90 b/src/MNH/modd_bakout.f90 index c5c133683..30d1f432f 100644 --- a/src/MNH/modd_bakout.f90 +++ b/src/MNH/modd_bakout.f90 @@ -99,9 +99,10 @@ CHARACTER(LEN=NMNHNAMELGTMAX), DIMENSION(:,:,:), ALLOCATABLE :: COUT_BOX_VAR_SUP ! in the different boxes (added to the COUT_VAR) LOGICAL, DIMENSION(JPMODELMAX) :: LOUT_MAINDOMAIN_WRITE = .FALSE. ! True to write the main domain ! (automatically forced to .TRUE. if NOUT_BOXES=0) -LOGICAL, DIMENSION(JPMODELMAX) :: LOUT_TOP_ABSORBING_LAYER_REMOVE = .TRUE. ! Remove the top absorbing layer -LOGICAL, DIMENSION(JPMODELMAX) :: LOUT_UNPHYSICAL_HOR_CELLS_REMOVE = .TRUE. ! Remove the JPHEXT horizontal external points -LOGICAL, DIMENSION(JPMODELMAX) :: LOUT_UNPHYSICAL_VER_CELLS_REMOVE = .TRUE. ! Remove the JPVEXT vertical external points +LOGICAL, DIMENSION(JPMODELMAX) :: LOUT_BOTTOM_ABSORBING_LAYER_REMOVE = .TRUE. ! Remove the bottom absorbing layer +LOGICAL, DIMENSION(JPMODELMAX) :: LOUT_TOP_ABSORBING_LAYER_REMOVE = .TRUE. ! Remove the top absorbing layer +LOGICAL, DIMENSION(JPMODELMAX) :: LOUT_UNPHYSICAL_HOR_CELLS_REMOVE = .TRUE. ! Remove the JPHEXT horizontal external points +LOGICAL, DIMENSION(JPMODELMAX) :: LOUT_UNPHYSICAL_VER_CELLS_REMOVE = .TRUE. ! Remove the JPVEXT vertical external points INTEGER, DIMENSION(:,:), ALLOCATABLE :: NOUT_BOX_IINF ! Box coordinates in physical domain (for each model and for each box) INTEGER, DIMENSION(:,:), ALLOCATABLE :: NOUT_BOX_ISUP diff --git a/src/MNH/modd_outn.f90 b/src/MNH/modd_outn.f90 index 31f28032c..583da788c 100644 --- a/src/MNH/modd_outn.f90 +++ b/src/MNH/modd_outn.f90 @@ -72,6 +72,7 @@ TYPE OUT_t 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 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 LOGICAL :: LOUT_HOR_BORDER_REMOVE = .TRUE. ! Remove the JPHEXT horizontal external points LOGICAL :: LOUT_VER_BORDER_REMOVE = .TRUE. ! Remove the JPVEXT vertical external points @@ -93,6 +94,7 @@ INTEGER, DIMENSION(:), POINTER :: NBAK_STEPLIST => NULL() INTEGER, DIMENSION(:), POINTER :: NOUT_STEPLIST => NULL() INTEGER, DIMENSION(:), POINTER :: NOUT_FIELDLIST => NULL() LOGICAL, POINTER :: LOUT_BIGBOX_WRITE => NULL() +LOGICAL, POINTER :: LOUT_BAL_REMOVE => NULL() LOGICAL, POINTER :: LOUT_TAL_REMOVE => NULL() LOGICAL, POINTER :: LOUT_HOR_BORDER_REMOVE => NULL() LOGICAL, POINTER :: LOUT_VER_BORDER_REMOVE => NULL() @@ -116,6 +118,7 @@ NBAK_STEPLIST => OUT_MODEL(KTO)%NBAK_STEPLIST NOUT_STEPLIST => OUT_MODEL(KTO)%NOUT_STEPLIST NOUT_FIELDLIST => OUT_MODEL(KTO)%NOUT_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 LOUT_HOR_BORDER_REMOVE => OUT_MODEL(KTO)%LOUT_HOR_BORDER_REMOVE LOUT_VER_BORDER_REMOVE => OUT_MODEL(KTO)%LOUT_VER_BORDER_REMOVE diff --git a/src/MNH/modn_output.f90 b/src/MNH/modn_output.f90 index 94b7fc108..8bf8f2e89 100644 --- a/src/MNH/modn_output.f90 +++ b/src/MNH/modn_output.f90 @@ -56,7 +56,8 @@ NAMELIST/NAM_OUTPUT/LOUT_BEG,LOUT_END,& COUT_DIR, & NOUT_BOXES, COUT_BOX_NAME, COUT_BOX_VAR_SUPP, & LOUT_MAINDOMAIN_WRITE, & - LOUT_TOP_ABSORBING_LAYER_REMOVE, LOUT_UNPHYSICAL_HOR_CELLS_REMOVE, LOUT_UNPHYSICAL_VER_CELLS_REMOVE, & + LOUT_BOTTOM_ABSORBING_LAYER_REMOVE, LOUT_TOP_ABSORBING_LAYER_REMOVE, & + LOUT_UNPHYSICAL_HOR_CELLS_REMOVE, LOUT_UNPHYSICAL_VER_CELLS_REMOVE, & NOUT_BOX_IINF, NOUT_BOX_ISUP, NOUT_BOX_JINF, NOUT_BOX_JSUP, NOUT_BOX_KINF, NOUT_BOX_KSUP LOGICAL, SAVE, PRIVATE :: LOUTPUT_NML_ALLOCATED = .FALSE. -- GitLab