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