From 68ec7005f20ccfc6116a4181cd8cbfac47285af3 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Tue, 23 Mar 2021 13:30:22 +0100
Subject: [PATCH] Philippe 23/03/2021: budgets: CBULIST_* are now allocatable
 and are compacted at the end of the budget initialization

---
 src/MNH/ini_budget.f90  |  94 ++++++++++++++
 src/MNH/modd_budget.f90 |  56 ++++----
 src/MNH/read_desfmn.f90 | 141 +++++++++++----------
 src/MNH/read_exsegn.f90 | 274 +++++++++++++++++++++++++++++-----------
 4 files changed, 391 insertions(+), 174 deletions(-)

diff --git a/src/MNH/ini_budget.f90 b/src/MNH/ini_budget.f90
index a7e3208cd..b4d17c2fd 100644
--- a/src/MNH/ini_budget.f90
+++ b/src/MNH/ini_budget.f90
@@ -4055,6 +4055,19 @@ END IF
 
 call Ini_budget_groups( tbudgets, ibudim1, ibudim2, ibudim3 )
 
+if ( tbudgets(NBUDGET_U)  %lenabled ) call Sourcelist_nml_compact( tbudgets(NBUDGET_U),   cbulist_ru   )
+if ( tbudgets(NBUDGET_V)  %lenabled ) call Sourcelist_nml_compact( tbudgets(NBUDGET_V),   cbulist_rv   )
+if ( tbudgets(NBUDGET_W)  %lenabled ) call Sourcelist_nml_compact( tbudgets(NBUDGET_W),   cbulist_rw   )
+if ( tbudgets(NBUDGET_TH) %lenabled ) call Sourcelist_nml_compact( tbudgets(NBUDGET_TH),  cbulist_rth  )
+if ( tbudgets(NBUDGET_TKE)%lenabled ) call Sourcelist_nml_compact( tbudgets(NBUDGET_TKE), cbulist_rtke )
+if ( tbudgets(NBUDGET_RV) %lenabled ) call Sourcelist_nml_compact( tbudgets(NBUDGET_RV),  cbulist_rrv  )
+if ( tbudgets(NBUDGET_RC) %lenabled ) call Sourcelist_nml_compact( tbudgets(NBUDGET_RC),  cbulist_rrc  )
+if ( tbudgets(NBUDGET_RR) %lenabled ) call Sourcelist_nml_compact( tbudgets(NBUDGET_RR),  cbulist_rrr  )
+if ( tbudgets(NBUDGET_RI) %lenabled ) call Sourcelist_nml_compact( tbudgets(NBUDGET_RI),  cbulist_rri  )
+if ( tbudgets(NBUDGET_RS) %lenabled ) call Sourcelist_nml_compact( tbudgets(NBUDGET_RS),  cbulist_rrs  )
+if ( tbudgets(NBUDGET_RG) %lenabled ) call Sourcelist_nml_compact( tbudgets(NBUDGET_RG),  cbulist_rrg  )
+if ( tbudgets(NBUDGET_RH) %lenabled ) call Sourcelist_nml_compact( tbudgets(NBUDGET_RH),  cbulist_rrh  )
+if ( lbu_rsv )                        call Sourcelist_sv_nml_compact( cbulist_rsv  )
 end subroutine Ini_budget
 
 
@@ -4481,6 +4494,87 @@ subroutine Sourcelist_scan( tpbudget, hbulist )
 end subroutine Sourcelist_scan
 
 
+subroutine Sourcelist_nml_compact( tpbudget, hbulist )
+  !This subroutine reduce the size of the hbulist to the minimum
+  !The list is generated from the group list
+  use modd_budget, only: NBULISTMAXLEN, tbudgetdata
+
+  type(tbudgetdata),                           intent(in)    :: tpbudget
+  character(len=*), dimension(:), allocatable, intent(inout) :: hbulist
+
+  integer :: idx
+  integer :: isource
+  integer :: jg
+  integer :: js
+
+  if ( Allocated( hbulist ) ) Deallocate( hbulist )
+
+  if ( tpbudget%ngroups < 3 ) then
+    call Print_msg( NVERB_ERROR, 'BUD', 'Sourcelist_nml_compact', 'ngroups is too small' )
+    return
+  end if
+
+  Allocate( character(len=NBULISTMAXLEN) :: hbulist(tpbudget%ngroups - 3) )
+  hbulist(:) = ''
+
+  idx = 0
+  do jg = 1, tpbudget%ngroups
+    if ( tpbudget%tgroups(jg)%nsources < 1 ) then
+      call Print_msg( NVERB_ERROR, 'BUD', 'Sourcelist_nml_compact', 'no source for group' )
+      cycle
+    end if
+
+    !Do not put 'INIF', 'ENDF', 'AVEF' in hbulist because their presence is automatic if the corresponding budget is enabled
+    isource = tpbudget%tgroups(jg)%nsourcelist(1)
+    if ( Any( tpbudget%tsources(isource)%cmnhname ==  [ 'INIF', 'ENDF', 'AVEF' ] ) ) cycle
+
+    idx = idx + 1
+#if 0
+    !Do not do this way because the group cmnhname may be truncated (NMNHNAMELGTMAX is smaller than NBULISTMAXLEN)
+    !and the name separator is different ('_')
+    hbulist(idx) = Trim( tpbudget%tgroups(jg)%cmnhname )
+#else
+    do js = 1, tpbudget%tgroups(jg)%nsources
+      isource = tpbudget%tgroups(jg)%nsourcelist(js)
+      hbulist(idx) = Trim( hbulist(idx) ) // Trim( tpbudget%tsources(isource)%cmnhname )
+      if ( js < tpbudget%tgroups(jg)%nsources ) hbulist(idx) = Trim( hbulist(idx) ) // '+'
+    end do
+#endif
+  end do
+end subroutine Sourcelist_nml_compact
+
+
+subroutine Sourcelist_sv_nml_compact( hbulist )
+  !This subroutine reduce the size of the hbulist
+  !For SV variables the reduction is simpler than for other variables
+  !because it is too complex to do this cleanly (the enabled source terms are different for each scalar variable)
+  use modd_budget, only: NBULISTMAXLEN, tbudgetdata
+
+  character(len=*), dimension(:), allocatable, intent(inout) :: hbulist
+
+  character(len=NBULISTMAXLEN), dimension(:), allocatable :: ybulist_new
+  integer :: ilines
+  integer :: ji
+
+  ilines = 0
+  do ji = 1, Size( hbulist )
+    if ( Len_trim(hbulist(ji)) > 0 ) ilines = ilines + 1
+  end do
+
+  Allocate( ybulist_new(ilines) )
+
+  ilines = 0
+  do ji = 1, Size( hbulist )
+    if ( Len_trim(hbulist(ji)) > 0 ) then
+      ilines = ilines + 1
+      ybulist_new(ilines) = Trim( hbulist(ji) )
+    end if
+  end do
+
+  call Move_alloc( from = ybulist_new, to = hbulist )
+end subroutine Sourcelist_sv_nml_compact
+
+
 pure function Source_find( tpbudget, hsource ) result( ipos )
   use modd_budget,     only: tbudgetdata
 
diff --git a/src/MNH/modd_budget.f90 b/src/MNH/modd_budget.f90
index a6081a88c..76f0874ad 100644
--- a/src/MNH/modd_budget.f90
+++ b/src/MNH/modd_budget.f90
@@ -59,8 +59,8 @@ implicit none
 
 public
 
-integer, parameter :: NBULISTMAXLEN   = 512
-integer, parameter :: NBULISTMAXLINES = 40
+integer, parameter :: NBULISTMAXLEN   = 256
+integer, parameter :: NBULISTMAXLINES = 50
 
 integer, parameter :: NBUDGET_RHO = 0  ! Reference number for budget of RhoJ
 integer, parameter :: NBUDGET_U   = 1  ! Reference number for budget of RhoJu  and/or LES budgets with u
@@ -223,105 +223,105 @@ INTEGER, SAVE :: NBUKMAX                   ! dimension along K of the budget
 !     
 !      Allowed processes for the budget of RU (wind component along x)
 !
-! Courant namelist: NAM_BURU
+! Current namelist: NAM_BU_RU
 !
 LOGICAL, SAVE :: LBU_RU = .FALSE. ! True when the budget of RU is performed
 !                         
-CHARACTER(LEN=NBULISTMAXLEN), DIMENSION(NBULISTMAXLINES), SAVE :: CBULIST_RU = ''
+CHARACTER(LEN=NBULISTMAXLEN), DIMENSION(:), ALLOCATABLE :: CBULIST_RU
 !
 !      Allowed processes for the budget of RV (wind component along y)
 !                                                  
-! Courant namelist: NAM_BURV
+! Current namelist: NAM_BU_RV
 !
 LOGICAL, SAVE :: LBU_RV = .FALSE. ! True when the budget of RV is performed
 !
-CHARACTER(LEN=NBULISTMAXLEN), DIMENSION(NBULISTMAXLINES), SAVE :: CBULIST_RV = ''
+CHARACTER(LEN=NBULISTMAXLEN), DIMENSION(:), ALLOCATABLE :: CBULIST_RV
 !
 !      Allowed processes for the budget of RW (wind vertical component)
 !                                                  
-! Courant namelist: NAM_BURW
+! Current namelist: NAM_BU_RW
 !
 LOGICAL, SAVE :: LBU_RW = .FALSE. ! True when the budget of RW is performed
 !                                                  
-CHARACTER(LEN=NBULISTMAXLEN), DIMENSION(NBULISTMAXLINES), SAVE :: CBULIST_RW = ''
+CHARACTER(LEN=NBULISTMAXLEN), DIMENSION(:), ALLOCATABLE :: CBULIST_RW
 !
 !      Allowed processes for the budget of RTH (potential temperature)
 !                                                  
-! Courant namelist: NAM_BURTH
+! Current namelist: NAM_BU_RTH
 !
 LOGICAL, SAVE :: LBU_RTH = .FALSE. ! True when the budget of RTH is performed
 !
-CHARACTER(LEN=NBULISTMAXLEN), DIMENSION(NBULISTMAXLINES), SAVE :: CBULIST_RTH = ''
+CHARACTER(LEN=NBULISTMAXLEN), DIMENSION(:), ALLOCATABLE :: CBULIST_RTH
 !
 !      Allowed processes for the budget of RTKE (kinetic energy)
 !                                                  
-! Courant namelist: NAM_BURTKE
+! Current namelist: NAM_BU_RTKE
 !
 LOGICAL, SAVE :: LBU_RTKE = .FALSE. ! True when the budget of RTKE is performed
 !
-CHARACTER(LEN=NBULISTMAXLEN), DIMENSION(NBULISTMAXLINES), SAVE :: CBULIST_RTKE = ''
+CHARACTER(LEN=NBULISTMAXLEN), DIMENSION(:), ALLOCATABLE :: CBULIST_RTKE
 !
 !      Allowed processes for the budget of moist variable RRV (water vapor)
 !                                                  
-! Courant namelist: NAM_BURRV
+! Current namelist: NAM_BU_RRV
 !
 LOGICAL, SAVE :: LBU_RRV = .FALSE. ! true when the budget of RRV is performed
 !
-CHARACTER(LEN=NBULISTMAXLEN), DIMENSION(NBULISTMAXLINES), SAVE :: CBULIST_RRV = ''
+CHARACTER(LEN=NBULISTMAXLEN), DIMENSION(:), ALLOCATABLE :: CBULIST_RRV
 !
 !      Allowed processes for the budget of moist variable RRC (cloud water)
 !                                                  
-! Courant namelist: NAM_BURRC
+! Current namelist: NAM_BU_RRC
 !
 LOGICAL, SAVE :: LBU_RRC = .FALSE. ! True when the budget of RRC is performed
 !
-CHARACTER(LEN=NBULISTMAXLEN), DIMENSION(NBULISTMAXLINES), SAVE :: CBULIST_RRC = ''
+CHARACTER(LEN=NBULISTMAXLEN), DIMENSION(:), ALLOCATABLE :: CBULIST_RRC
 !
 !      Allowed processes for the budget of moist variable RRR (rain water)
 !
-! Courant namelist: NAM_BURRR
+! Current namelist: NAM_BU_RRR
 !
 LOGICAL, SAVE :: LBU_RRR = .FALSE. ! True when the budget of RRR is performed
 !
-CHARACTER(LEN=NBULISTMAXLEN), DIMENSION(NBULISTMAXLINES), SAVE :: CBULIST_RRR = ''
+CHARACTER(LEN=NBULISTMAXLEN), DIMENSION(:), ALLOCATABLE :: CBULIST_RRR
 !
 !      Allowed processes for the budget of moist variable RRI (ice)
 !
-! Courant namelist: NAM_BURRI
+! Current namelist: NAM_BU_RRI
 !
 LOGICAL, SAVE :: LBU_RRI = .FALSE. ! True when the budget of RRI is performed
 !
-CHARACTER(LEN=NBULISTMAXLEN), DIMENSION(NBULISTMAXLINES), SAVE :: CBULIST_RRI = ''
+CHARACTER(LEN=NBULISTMAXLEN), DIMENSION(:), ALLOCATABLE :: CBULIST_RRI
 !
 !      Allowed processes for the budget of moist variable RRS (snow)
 !
-! Courant namelist: NAM_BURRS
+! Current namelist: NAM_BU_RRS
 !
 LOGICAL, SAVE :: LBU_RRS = .FALSE. ! True when the budget of RRS is performed
 !
-CHARACTER(LEN=NBULISTMAXLEN), DIMENSION(NBULISTMAXLINES), SAVE :: CBULIST_RRS = ''
+CHARACTER(LEN=NBULISTMAXLEN), DIMENSION(:), ALLOCATABLE :: CBULIST_RRS
 !
 !      Allowed processes for the budget of moist variable RRG (graupel)
 !
-! Courant namelist: NAM_BURRG
+! Current namelist: NAM_BU_RRG
 !
 LOGICAL, SAVE :: LBU_RRG = .FALSE. ! True when the budget of RRG is performed
 !
-CHARACTER(LEN=NBULISTMAXLEN), DIMENSION(NBULISTMAXLINES), SAVE :: CBULIST_RRG = ''
+CHARACTER(LEN=NBULISTMAXLEN), DIMENSION(:), ALLOCATABLE :: CBULIST_RRG
 !
 !      Allowed processes for the budget of moist variable RRH (hail)
 !
-! Courant namelist: NAM_BURRH
+! Current namelist: NAM_BU_RRH
 !
 LOGICAL, SAVE :: LBU_RRH = .FALSE. ! True when the budget of RRH is performed
 !
-CHARACTER(LEN=NBULISTMAXLEN), DIMENSION(NBULISTMAXLINES), SAVE :: CBULIST_RRH = ''
+CHARACTER(LEN=NBULISTMAXLEN), DIMENSION(:), ALLOCATABLE :: CBULIST_RRH
 !
-! Courant namelist: NAM_BURSV
+! Current namelist: NAM_BU_RSV
 !
 LOGICAL, SAVE :: LBU_RSV = .FALSE. ! True when the budget of RSVx is performed
 !
-CHARACTER(LEN=NBULISTMAXLEN), DIMENSION(NBULISTMAXLINES), SAVE :: CBULIST_RSV = ''
+CHARACTER(LEN=NBULISTMAXLEN), DIMENSION(:), ALLOCATABLE :: CBULIST_RSV
 !
 !
 REAL :: XTIME_BU          ! budget time in this time-step
diff --git a/src/MNH/read_desfmn.f90 b/src/MNH/read_desfmn.f90
index 294bafd45..b32584f8e 100644
--- a/src/MNH/read_desfmn.f90
+++ b/src/MNH/read_desfmn.f90
@@ -508,34 +508,36 @@ IF (KMI == 1) THEN
     END IF
     READ(UNIT=ILUDES,NML=NAM_OUTPUT)
   END IF
-  CALL POSNAM(ILUDES,'NAM_BUDGET',GFOUND)
-  IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BUDGET)
-  CALL POSNAM(ILUDES,'NAM_BU_RU',GFOUND)
-  IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RU)
-  CALL POSNAM(ILUDES,'NAM_BU_RV',GFOUND)
-  IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RV)
-  CALL POSNAM(ILUDES,'NAM_BU_RW',GFOUND)
-  IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RW)
-  CALL POSNAM(ILUDES,'NAM_BU_RTH',GFOUND)
-  IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RTH)
-  CALL POSNAM(ILUDES,'NAM_BU_RTKE',GFOUND)
-  IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RTKE)
-  CALL POSNAM(ILUDES,'NAM_BU_RRV',GFOUND)
-  IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RRV)
-  CALL POSNAM(ILUDES,'NAM_BU_RRC',GFOUND)
-  IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RRC)
-  CALL POSNAM(ILUDES,'NAM_BU_RRR',GFOUND)
-  IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RRR)
-  CALL POSNAM(ILUDES,'NAM_BU_RRI',GFOUND)
-  IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RRI)
-  CALL POSNAM(ILUDES,'NAM_BU_RRS',GFOUND)
-  IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RRS)
-  CALL POSNAM(ILUDES,'NAM_BU_RRG',GFOUND)
-  IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RRG)
-  CALL POSNAM(ILUDES,'NAM_BU_RRH',GFOUND)
-  IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RRH)
-  CALL POSNAM(ILUDES,'NAM_BU_RSV',GFOUND)
-  IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RSV)
+! Note: it is not useful to read the budget namelists in the .des files
+! The value here (if present in file) don't need to be compared with the ones in the EXSEGn files
+!   CALL POSNAM(ILUDES,'NAM_BUDGET',GFOUND)
+!   IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BUDGET)
+!   CALL POSNAM(ILUDES,'NAM_BU_RU',GFOUND)
+!   IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RU)
+!   CALL POSNAM(ILUDES,'NAM_BU_RV',GFOUND)
+!   IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RV)
+!   CALL POSNAM(ILUDES,'NAM_BU_RW',GFOUND)
+!   IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RW)
+!   CALL POSNAM(ILUDES,'NAM_BU_RTH',GFOUND)
+!   IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RTH)
+!   CALL POSNAM(ILUDES,'NAM_BU_RTKE',GFOUND)
+!   IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RTKE)
+!   CALL POSNAM(ILUDES,'NAM_BU_RRV',GFOUND)
+!   IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RRV)
+!   CALL POSNAM(ILUDES,'NAM_BU_RRC',GFOUND)
+!   IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RRC)
+!   CALL POSNAM(ILUDES,'NAM_BU_RRR',GFOUND)
+!   IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RRR)
+!   CALL POSNAM(ILUDES,'NAM_BU_RRI',GFOUND)
+!   IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RRI)
+!   CALL POSNAM(ILUDES,'NAM_BU_RRS',GFOUND)
+!   IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RRS)
+!   CALL POSNAM(ILUDES,'NAM_BU_RRG',GFOUND)
+!   IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RRG)
+!   CALL POSNAM(ILUDES,'NAM_BU_RRH',GFOUND)
+!   IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RRH)
+!   CALL POSNAM(ILUDES,'NAM_BU_RSV',GFOUND)
+!   IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RSV)
   CALL POSNAM(ILUDES,'NAM_LES',GFOUND)
   IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_LES)
   CALL POSNAM(ILUDES,'NAM_PDF',GFOUND)
@@ -705,47 +707,48 @@ IF (NVERB >= 10) THEN
     WRITE(UNIT=ILUOUT,FMT="('************ DYNAMIC **************************')")
     WRITE(UNIT=ILUOUT,NML=NAM_DYN)
 !    
-    WRITE(UNIT=ILUOUT,FMT="('************ BUDGET ***************************')")
-    WRITE(UNIT=ILUOUT,NML=NAM_BUDGET)
-!    
-    WRITE(UNIT=ILUOUT,FMT="('************ U BUDGET *************************')")
-    WRITE(UNIT=ILUOUT,NML=NAM_BU_RU)
-!    
-    WRITE(UNIT=ILUOUT,FMT="('************ V BUDGET *************************')")
-    WRITE(UNIT=ILUOUT,NML=NAM_BU_RV)
-!    
-    WRITE(UNIT=ILUOUT,FMT="('************ W BUDGET *************************')")
-    WRITE(UNIT=ILUOUT,NML=NAM_BU_RW)
-!    
-    WRITE(UNIT=ILUOUT,FMT="('************ TH BUDGET ************************')")
-    WRITE(UNIT=ILUOUT,NML=NAM_BU_RTH)
-!    
-    WRITE(UNIT=ILUOUT,FMT="('************ TKE BUDGET ***********************')")
-    WRITE(UNIT=ILUOUT,NML=NAM_BU_RTKE)
-!    
-    WRITE(UNIT=ILUOUT,FMT="('************ RV BUDGET ************************')")
-    WRITE(UNIT=ILUOUT,NML=NAM_BU_RRV)
-!    
-    WRITE(UNIT=ILUOUT,FMT="('************ RC BUDGET ************************')")
-    WRITE(UNIT=ILUOUT,NML=NAM_BU_RRC)
-!    
-    WRITE(UNIT=ILUOUT,FMT="('************ RR BUDGET ************************')")
-    WRITE(UNIT=ILUOUT,NML=NAM_BU_RRR)
-!    
-    WRITE(UNIT=ILUOUT,FMT="('************ RI BUDGET ************************')")
-    WRITE(UNIT=ILUOUT,NML=NAM_BU_RRI)
-!    
-    WRITE(UNIT=ILUOUT,FMT="('************ RS BUDGET ************************')")
-    WRITE(UNIT=ILUOUT,NML=NAM_BU_RRS)
-!    
-    WRITE(UNIT=ILUOUT,FMT="('************ RG BUDGET ************************')")
-    WRITE(UNIT=ILUOUT,NML=NAM_BU_RRG)
-!    
-    WRITE(UNIT=ILUOUT,FMT="('************ RH BUDGET ************************')")
-    WRITE(UNIT=ILUOUT,NML=NAM_BU_RRH)
-!    
-    WRITE(UNIT=ILUOUT,FMT="('************ SVx BUDGET ***********************')")
-    WRITE(UNIT=ILUOUT,NML=NAM_BU_RSV)
+! Budget namelists not read anymore in READ_DESFM_n
+!     WRITE(UNIT=ILUOUT,FMT="('************ BUDGET ***************************')")
+!     WRITE(UNIT=ILUOUT,NML=NAM_BUDGET)
+! !
+!     WRITE(UNIT=ILUOUT,FMT="('************ U BUDGET *************************')")
+!     WRITE(UNIT=ILUOUT,NML=NAM_BU_RU)
+! !
+!     WRITE(UNIT=ILUOUT,FMT="('************ V BUDGET *************************')")
+!     WRITE(UNIT=ILUOUT,NML=NAM_BU_RV)
+! !
+!     WRITE(UNIT=ILUOUT,FMT="('************ W BUDGET *************************')")
+!     WRITE(UNIT=ILUOUT,NML=NAM_BU_RW)
+! !
+!     WRITE(UNIT=ILUOUT,FMT="('************ TH BUDGET ************************')")
+!     WRITE(UNIT=ILUOUT,NML=NAM_BU_RTH)
+! !
+!     WRITE(UNIT=ILUOUT,FMT="('************ TKE BUDGET ***********************')")
+!     WRITE(UNIT=ILUOUT,NML=NAM_BU_RTKE)
+! !
+!     WRITE(UNIT=ILUOUT,FMT="('************ RV BUDGET ************************')")
+!     WRITE(UNIT=ILUOUT,NML=NAM_BU_RRV)
+! !
+!     WRITE(UNIT=ILUOUT,FMT="('************ RC BUDGET ************************')")
+!     WRITE(UNIT=ILUOUT,NML=NAM_BU_RRC)
+! !
+!     WRITE(UNIT=ILUOUT,FMT="('************ RR BUDGET ************************')")
+!     WRITE(UNIT=ILUOUT,NML=NAM_BU_RRR)
+! !
+!     WRITE(UNIT=ILUOUT,FMT="('************ RI BUDGET ************************')")
+!     WRITE(UNIT=ILUOUT,NML=NAM_BU_RRI)
+! !
+!     WRITE(UNIT=ILUOUT,FMT="('************ RS BUDGET ************************')")
+!     WRITE(UNIT=ILUOUT,NML=NAM_BU_RRS)
+! !
+!     WRITE(UNIT=ILUOUT,FMT="('************ RG BUDGET ************************')")
+!     WRITE(UNIT=ILUOUT,NML=NAM_BU_RRG)
+! !
+!     WRITE(UNIT=ILUOUT,FMT="('************ RH BUDGET ************************')")
+!     WRITE(UNIT=ILUOUT,NML=NAM_BU_RRH)
+! !
+!     WRITE(UNIT=ILUOUT,FMT="('************ SVx BUDGET ***********************')")
+!     WRITE(UNIT=ILUOUT,NML=NAM_BU_RSV)
 !    
     WRITE(UNIT=ILUOUT,FMT="('************ LES ******************************')")
     WRITE(UNIT=ILUOUT,NML=NAM_LES)
diff --git a/src/MNH/read_exsegn.f90 b/src/MNH/read_exsegn.f90
index 8ad067298..b8a424d6b 100644
--- a/src/MNH/read_exsegn.f90
+++ b/src/MNH/read_exsegn.f90
@@ -302,91 +302,93 @@ END MODULE MODI_READ_EXSEG_n
 !
 !*       0.    DECLARATIONS
 !              ------------
-USE MODD_PARAMETERS
+USE MODD_BLOWSNOW
+USE MODD_BUDGET
+USE MODD_CH_AEROSOL
+USE MODD_CH_M9_n, ONLY : NEQ
+USE MODD_CONDSAMP
 USE MODD_CONF
-USE MODD_CONFZ
 USE MODD_CONF_n,  ONLY: CSTORAGE_TYPE
+USE MODD_CONFZ
+USE MODD_DRAG_n
+USE MODD_DUST
+USE MODD_DYN
+USE MODD_DYN_n, ONLY : LHORELAX_SVLIMA
+#ifdef MNH_FOREFIRE
+USE MODD_FOREFIRE
+#endif
+USE MODD_GET_n
+USE MODD_GR_FIELD_n
 USE MODD_IO,   ONLY: TFILEDATA
 USE MODD_LUNIT_n, ONLY: TLUOUT
+USE MODD_NSV,NSV_USER_n=>NSV_USER
+USE MODD_PARAMETERS
+USE MODD_PASPOL
+USE MODD_SALT
 USE MODD_VAR_ll,  ONLY: NPROC
-!
+USE MODD_VISCOSITY
+
+USE MODE_MSG
+USE MODE_POS
+
+USE MODI_INI_NSV
+USE MODI_TEST_NAM_VAR
+
+USE MODN_2D_FRC
+USE MODN_ADV_n      ! The final filling of these modules for the model n is
 USE MODN_BACKUP
+USE MODN_BLANK
+USE MODN_BLOWSNOW
+USE MODN_BLOWSNOW_n
 USE MODN_BUDGET
-USE MODN_LES
+USE MODN_CH_MNHC_n
+USE MODN_CH_ORILAM
+USE MODN_CH_SOLVER_n
+USE MODN_CONDSAMP
 USE MODN_CONF
+USE MODN_CONF_n
 USE MODN_CONFZ
-USE MODN_FRC
+USE MODN_DRAGBLDG_n
+USE MODN_DRAG_n
+USE MODN_DRAGTREE_n
+USE MODN_DUST
 USE MODN_DYN
-USE MODN_NESTING
-USE MODN_OUTPUT
-USE MODN_CONF_n
-USE MODN_LBC_n      ! routine is used for each nested model. This has been done 
 USE MODN_DYN_n      ! to avoid the duplication of this routine for each model.
-USE MODN_ADV_n      ! The final filling of these modules for the model n is
-USE MODN_PARAM_n    ! realized in subroutine ini_model n
-USE MODN_PARAM_RAD_n
-USE MODN_PARAM_ECRAD_n
-USE MODN_PARAM_KAFR_n
-USE MODN_PARAM_MFSHALL_n
-USE MODN_PARAM_ICE
+USE MODN_ELEC
+#ifdef MNH_FOREFIRE
+USE MODN_FOREFIRE
+#endif
+USE MODN_FRC
+USE MODN_LATZ_EDFLX
+USE MODN_LBC_n      ! routine is used for each nested model. This has been done
+USE MODN_LES
 USE MODN_LUNIT_n
+USE MODN_MEAN
+USE MODN_NESTING
 USE MODN_NUDGING_n
-USE MODN_TURB_n
-USE MODN_DRAG_n
-USE MODN_BLANK
-USE MODN_CH_MNHC_n
-USE MODN_CH_SOLVER_n
-USE MODN_PARAM_C2R2, ONLY : EPARAM_CCN=>HPARAM_CCN, EINI_CCN=>HINI_CCN, &
-                            WNUC=>XNUC, WALPHAC=>XALPHAC, NAM_PARAM_C2R2
+USE MODN_OUTPUT
 USE MODN_PARAM_C1R3, ONLY : NAM_PARAM_C1R3, CPRISTINE_ICE_C1R3,    &
                             CHEVRIMED_ICE_C1R3
+USE MODN_PARAM_C2R2, ONLY : EPARAM_CCN=>HPARAM_CCN, EINI_CCN=>HINI_CCN, &
+                            WNUC=>XNUC, WALPHAC=>XALPHAC, NAM_PARAM_C2R2
+USE MODN_PARAM_ECRAD_n
+USE MODN_PARAM_ICE
+USE MODN_PARAM_KAFR_n
 USE MODN_PARAM_LIMA, ONLY : FINI_CCN=>HINI_CCN,NAM_PARAM_LIMA,NMOD_CCN,LSCAV, &
                             CPRISTINE_ICE_LIMA, CHEVRIMED_ICE_LIMA, NMOD_IFN, &
                             LCOLD, LACTI, LNUCL, XALPHAC, XNUC, LMEYERS, LHAIL
-USE MODN_ELEC
+USE MODN_PARAM_MFSHALL_n
+USE MODN_PARAM_n    ! realized in subroutine ini_model n
+USE MODN_PARAM_RAD_n
+USE MODN_PASPOL
+USE MODN_SALT
 USE MODN_SERIES
-USE MODN_SERIES_n 
-USE MODN_TURB_CLOUD
+USE MODN_SERIES_n
 USE MODN_TURB
-USE MODN_MEAN
-USE MODN_DRAGTREE_n
-USE MODN_DRAGBLDG_n
-USE MODN_LATZ_EDFLX
-!
-USE MODD_NSV,NSV_USER_n=>NSV_USER
-USE MODD_DYN
-USE MODD_DYN_n, ONLY : LHORELAX_SVLIMA
-USE MODD_GET_n
-USE MODD_GR_FIELD_n
-!
-USE MODE_POS
-USE MODE_MSG
-!
-USE MODI_TEST_NAM_VAR
-USE MODI_INI_NSV
-USE MODN_CH_ORILAM
-USE MODD_CH_AEROSOL
-USE MODD_DUST
-USE MODD_SALT
-USE MODD_PASPOL
-#ifdef MNH_FOREFIRE
-USE MODD_FOREFIRE
-USE MODN_FOREFIRE
-#endif
-USE MODD_CONDSAMP
-USE MODD_BLOWSNOW
-USE MODN_DUST
-USE MODN_SALT
-USE MODD_CH_M9_n, ONLY : NEQ
-USE MODN_PASPOL
-USE MODN_CONDSAMP
-USE MODN_BLOWSNOW
-USE MODN_BLOWSNOW_n
-USE MODN_2D_FRC
+USE MODN_TURB_CLOUD
+USE MODN_TURB_n
 USE MODN_VISCOSITY
-USE MODD_VISCOSITY
-USE MODD_DRAG_n
-!
+
 IMPLICIT NONE
 !
 !*       0.1   declarations of arguments
@@ -593,32 +595,150 @@ IF (KMI == 1) THEN
   END IF
   CALL POSNAM(ILUSEG,'NAM_BUDGET',GFOUND,ILUOUT)
   IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_BUDGET)
+
   CALL POSNAM(ILUSEG,'NAM_BU_RU',GFOUND,ILUOUT)
-  IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_BU_RU)
+  IF (GFOUND) THEN
+    IF ( ALLOCATED( CBULIST_RU ) ) THEN
+      CALL Print_msg( NVERB_WARNING, 'IO', 'READ_EXSEG_n', 'unexpected: CBULIST_RU was already allocated' )
+      DEALLOCATE( CBULIST_RU )
+    END IF
+    ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RU(NBULISTMAXLINES) )
+    CBULIST_RU(:) = ''
+    READ(UNIT=ILUSEG,NML=NAM_BU_RU)
+  END IF
+
   CALL POSNAM(ILUSEG,'NAM_BU_RV',GFOUND,ILUOUT)
-  IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_BU_RV)
+  IF (GFOUND) THEN
+    IF ( ALLOCATED( CBULIST_RV ) ) THEN
+      CALL Print_msg( NVERB_WARNING, 'IO', 'READ_EXSEG_n', 'unexpected: CBULIST_RV was already allocated' )
+      DEALLOCATE( CBULIST_RV )
+    END IF
+    ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RV(NBULISTMAXLINES) )
+    CBULIST_RV(:) = ''
+    READ(UNIT=ILUSEG,NML=NAM_BU_RV)
+  END IF
+
   CALL POSNAM(ILUSEG,'NAM_BU_RW',GFOUND,ILUOUT)
-  IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_BU_RW)
+  IF (GFOUND) THEN
+    IF ( ALLOCATED( CBULIST_RW ) ) THEN
+      CALL Print_msg( NVERB_WARNING, 'IO', 'READ_EXSEG_n', 'unexpected: CBULIST_RW was already allocated' )
+      DEALLOCATE( CBULIST_RW )
+    END IF
+    ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RW(NBULISTMAXLINES) )
+    CBULIST_RW(:) = ''
+    READ(UNIT=ILUSEG,NML=NAM_BU_RW)
+  END IF
+
   CALL POSNAM(ILUSEG,'NAM_BU_RTH',GFOUND,ILUOUT)
-  IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_BU_RTH)
+  IF (GFOUND) THEN
+    IF ( ALLOCATED( CBULIST_RTH ) ) THEN
+      CALL Print_msg( NVERB_WARNING, 'IO', 'READ_EXSEG_n', 'unexpected: CBULIST_RTH was already allocated' )
+      DEALLOCATE( CBULIST_RTH )
+    END IF
+    ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RTH(NBULISTMAXLINES) )
+    CBULIST_RTH(:) = ''
+    READ(UNIT=ILUSEG,NML=NAM_BU_RTH)
+  END IF
+
   CALL POSNAM(ILUSEG,'NAM_BU_RTKE',GFOUND,ILUOUT)
-  IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_BU_RTKE)
+  IF (GFOUND) THEN
+    IF ( ALLOCATED( CBULIST_RTKE ) ) THEN
+      CALL Print_msg( NVERB_WARNING, 'IO', 'READ_EXSEG_n', 'unexpected: CBULIST_RTKE was already allocated' )
+      DEALLOCATE( CBULIST_RTKE )
+    END IF
+    ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RTKE(NBULISTMAXLINES) )
+    CBULIST_RTKE(:) = ''
+    READ(UNIT=ILUSEG,NML=NAM_BU_RTKE)
+  END IF
+
   CALL POSNAM(ILUSEG,'NAM_BU_RRV',GFOUND,ILUOUT)
-  IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_BU_RRV)
+  IF (GFOUND) THEN
+    IF ( ALLOCATED( CBULIST_RRV ) ) THEN
+      CALL Print_msg( NVERB_WARNING, 'IO', 'READ_EXSEG_n', 'unexpected: CBULIST_RRV was already allocated' )
+      DEALLOCATE( CBULIST_RRV )
+    END IF
+    ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RRV(NBULISTMAXLINES) )
+    CBULIST_RRV(:) = ''
+    READ(UNIT=ILUSEG,NML=NAM_BU_RRV)
+  END IF
+
   CALL POSNAM(ILUSEG,'NAM_BU_RRC',GFOUND,ILUOUT)
-  IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_BU_RRC)
+  IF (GFOUND) THEN
+    IF ( ALLOCATED( CBULIST_RRC ) ) THEN
+      CALL Print_msg( NVERB_WARNING, 'IO', 'READ_EXSEG_n', 'unexpected: CBULIST_RRC was already allocated' )
+      DEALLOCATE( CBULIST_RRC )
+    END IF
+    ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RRC(NBULISTMAXLINES) )
+    CBULIST_RRC(:) = ''
+    READ(UNIT=ILUSEG,NML=NAM_BU_RRC)
+  END IF
+
   CALL POSNAM(ILUSEG,'NAM_BU_RRR',GFOUND,ILUOUT)
-  IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_BU_RRR)
+  IF (GFOUND) THEN
+    IF ( ALLOCATED( CBULIST_RRR ) ) THEN
+      CALL Print_msg( NVERB_WARNING, 'IO', 'READ_EXSEG_n', 'unexpected: CBULIST_RRR was already allocated' )
+      DEALLOCATE( CBULIST_RRR )
+    END IF
+    ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RRR(NBULISTMAXLINES) )
+    CBULIST_RRR(:) = ''
+    READ(UNIT=ILUSEG,NML=NAM_BU_RRR)
+  END IF
+
   CALL POSNAM(ILUSEG,'NAM_BU_RRI',GFOUND,ILUOUT)
-  IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_BU_RRI)
+  IF (GFOUND) THEN
+    IF ( ALLOCATED( CBULIST_RRI ) ) THEN
+      CALL Print_msg( NVERB_WARNING, 'IO', 'READ_EXSEG_n', 'unexpected: CBULIST_RRI was already allocated' )
+      DEALLOCATE( CBULIST_RRI )
+    END IF
+    ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RRI(NBULISTMAXLINES) )
+    CBULIST_RRI(:) = ''
+    READ(UNIT=ILUSEG,NML=NAM_BU_RRI)
+  END IF
+
   CALL POSNAM(ILUSEG,'NAM_BU_RRS',GFOUND,ILUOUT)
-  IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_BU_RRS)
+  IF (GFOUND) THEN
+    IF ( ALLOCATED( CBULIST_RRS ) ) THEN
+      CALL Print_msg( NVERB_WARNING, 'IO', 'READ_EXSEG_n', 'unexpected: CBULIST_RRS was already allocated' )
+      DEALLOCATE( CBULIST_RRS )
+    END IF
+    ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RRS(NBULISTMAXLINES) )
+    CBULIST_RRS(:) = ''
+    READ(UNIT=ILUSEG,NML=NAM_BU_RRS)
+  END IF
+
   CALL POSNAM(ILUSEG,'NAM_BU_RRG',GFOUND,ILUOUT)
-  IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_BU_RRG)
+  IF (GFOUND) THEN
+    IF ( ALLOCATED( CBULIST_RRG ) ) THEN
+      CALL Print_msg( NVERB_WARNING, 'IO', 'READ_EXSEG_n', 'unexpected: CBULIST_RRG was already allocated' )
+      DEALLOCATE( CBULIST_RRG )
+    END IF
+    ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RRG(NBULISTMAXLINES) )
+    CBULIST_RRG(:) = ''
+    READ(UNIT=ILUSEG,NML=NAM_BU_RRG)
+  END IF
+
   CALL POSNAM(ILUSEG,'NAM_BU_RRH',GFOUND,ILUOUT)
-  IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_BU_RRH)
+  IF (GFOUND) THEN
+    IF ( ALLOCATED( CBULIST_RRH ) ) THEN
+      CALL Print_msg( NVERB_WARNING, 'IO', 'READ_EXSEG_n', 'unexpected: CBULIST_RRH was already allocated' )
+      DEALLOCATE( CBULIST_RRH )
+    END IF
+    ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RRH(NBULISTMAXLINES) )
+    CBULIST_RRH(:) = ''
+    READ(UNIT=ILUSEG,NML=NAM_BU_RRH)
+  END IF
+
   CALL POSNAM(ILUSEG,'NAM_BU_RSV',GFOUND,ILUOUT)
-  IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_BU_RSV)
+  IF (GFOUND) THEN
+    IF ( ALLOCATED( CBULIST_RSV ) ) THEN
+      CALL Print_msg( NVERB_WARNING, 'IO', 'READ_EXSEG_n', 'unexpected: CBULIST_RSV was already allocated' )
+      DEALLOCATE( CBULIST_RSV )
+    END IF
+    ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RSV(NBULISTMAXLINES) )
+    CBULIST_RSV(:) = ''
+    READ(UNIT=ILUSEG,NML=NAM_BU_RSV)
+  END IF
+
   CALL POSNAM(ILUSEG,'NAM_LES',GFOUND,ILUOUT)
   IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_LES)
   CALL POSNAM(ILUSEG,'NAM_MEAN',GFOUND,ILUOUT)
-- 
GitLab