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