From ab14052692bac70e2066093a8c72428c30b3af7b Mon Sep 17 00:00:00 2001 From: Quentin Rodier <quentin.rodier@meteo.fr> Date: Tue, 1 Mar 2022 14:51:36 +0100 Subject: [PATCH] Quentin 01/03/2022: add mesonH/modd_budget.f90 from 5.5.0 --- src/mesonh/aux/modd_budget.f90 | 368 +++++++++++++++++++++++++++++++++ 1 file changed, 368 insertions(+) create mode 100644 src/mesonh/aux/modd_budget.f90 diff --git a/src/mesonh/aux/modd_budget.f90 b/src/mesonh/aux/modd_budget.f90 new file mode 100644 index 000000000..7442dfd3e --- /dev/null +++ b/src/mesonh/aux/modd_budget.f90 @@ -0,0 +1,368 @@ +!MNH_LIC Copyright 1995-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! ################## + MODULE MODD_BUDGET +! ################## +! +!!**** *MODD_BUDGET* - declaration of budget variables +!! +!! PURPOSE +!! ------- +! The purpose of this declarative module is to specify the budget +! variables +! +!! +!!** IMPLICIT ARGUMENTS +!! ------------------ +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH (module MODD_BUDGET) +!! +!! AUTHOR +!! ------ +!! P. Hereil *Meteo France* +!! +!! MODIFICATIONS +!! ------------- +!! Original 23/02/95 +!! J.-P. Lafore 10/02/98 adding of rhodj declaration for budget +!! V. Ducrocq 4/06/99 // +! P. Wautelet 05/2016-04/2018: new data structures and calls for I/O +! P. Wautelet 19/07/2019: parameters to identify budget number +! P. Wautelet 15/11/2019: remove unused CBURECORD variable +! P. Wautelet 17/01/2020: add new budget data types +! P. Wautelet 27/01/2020: use the tfield_metadata_base abstract datatype +! P. Wautelet 28/01/2020: add trhodj in tbudgetdata datatype +! P. Wautelet 09/03/2020: add tburhodj variable +! P. Wautelet 17/04/2020: set default values for budgets switch values +! P. Wautelet 23/04/2020: add nid in tbudgetdata datatype +! P. Wautelet 17/08/2020: add xtmplesstore in tbudgetdata datatype +! P. Wautelet 08/10/2020: add clessource in tbudgetdata datatype +! P. Wautelet 08/12/2020: add nbusubwrite and nbutotwrite +! P. Wautelet 11/01/2021: remove nbuwrnb (replaced by nbusubwrite) +! P. Wautelet 14/01/2021: change xbusurf type to integer (+ rename it to nbusurf) +! P. Wautelet 03/03/2021: add tbudiachrometadata type (useful to pass more information to Write_diachro) +! P. Wautelet 17/03/2021: choose source terms for budgets with character strings instead of multiple integer variables +! P. Wautelet 30/03/2021: budgets: cartesian subdomain limits are defined in the physical domain +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ + +use modd_field, only: tfield_metadata_base +use modd_parameters, only: NBUNAMELGTMAX, NCOMMENTLGTMAX + +implicit none + +public + +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 +integer, parameter :: NBUDGET_V = 2 ! Reference number for budget of RhoJv and/or LES budgets with u +integer, parameter :: NBUDGET_W = 3 ! Reference number for budget of RhoJw and/or LES budgets with u +integer, parameter :: NBUDGET_TH = 4 ! Reference number for budget of RhoJTh and/or LES budgets with th +integer, parameter :: NBUDGET_TKE = 5 ! Reference number for budget of RhoJTke and/or LES budgets with Tke +integer, parameter :: NBUDGET_RV = 6 ! Reference number for budget of RhoJrv and/or LES budgets with rv +integer, parameter :: NBUDGET_RC = 7 ! Reference number for budget of RhoJrc and/or LES budgets with rc +integer, parameter :: NBUDGET_RR = 8 ! Reference number for budget of RhoJrr and/or LES budgets with rr +integer, parameter :: NBUDGET_RI = 9 ! Reference number for budget of RhoJri and/or LES budgets with ri +integer, parameter :: NBUDGET_RS = 10 ! Reference number for budget of RhoJrs and/or LES budgets with rs +integer, parameter :: NBUDGET_RG = 11 ! Reference number for budget of RhoJrg and/or LES budgets with rg +integer, parameter :: NBUDGET_RH = 12 ! Reference number for budget of RhoJrh and/or LES budgets with rh +integer, parameter :: NBUDGET_SV1 = 13 ! Reference number for 1st budget of RhoJsv and/or LES budgets with sv + +integer, parameter :: NMAXLEVELS = 7 +integer, parameter :: NLVL_ROOT = 0 +integer, parameter :: NLVL_CATEGORY = 1 +integer, parameter :: NLVL_SUBCATEGORY = 2 +integer, parameter :: NLVL_GROUP = 3 +integer, parameter :: NLVL_SHAPE = 4 +integer, parameter :: NLVL_TIMEAVG = 5 +integer, parameter :: NLVL_NORM = 6 +integer, parameter :: NLVL_MASK = 7 + +#ifdef MNH_IOCDF4 +character(len=*), dimension(NMAXLEVELS), parameter :: CNCGROUPNAMES = [ & + 'category ', & !Name of the different type of groups/levels in the netCDF file + 'subcategory', & + 'group ', & + 'shape ', & + 'timeavg ', & + 'norm ', & + 'mask ' ] +#endif + +integer :: nbudgets ! Number of budget categories + + +type, extends( tfield_metadata_base ) :: tbusourcedata + integer :: ngroup = 0 ! Number of the source term group in which storing the source term + ! (0: no store, 1: individual store, >1: number of the group) + logical :: lavailable = .false. ! If true, the source is available in the run (conditions to access it are met), + ! but it doesn't mean it is used (see lenabled field) + logical :: lenabled = .false. + logical :: ldonotinit = .false. ! if true, does not need a call to Budget_store_init + ! It may be true only if the source term is in a group not containing other sources + logical :: loverwrite = .false. ! if true, source term values will overwrite the previous ones + ! It may be true only if the source term is in a group not containing other sources +end type tbusourcedata + +type, extends( tfield_metadata_base ) :: tbugroupdata + integer :: nsources = 0 ! Number of source terms composing this group + integer, dimension(:), allocatable :: nsourcelist ! List of the source terms composing this group + real, dimension(:,:,:), allocatable :: xdata ! Array to store the budget data +end type tbugroupdata + +type, extends( tfield_metadata_base ) :: tburhodata + real, dimension(:,:,:), allocatable :: xdata ! Array to store the budget data +end type tburhodata + +type :: tbudiachrometadata + character(len=NBUNAMELGTMAX), dimension(NMAXLEVELS) :: clevels = '' !Name of the different groups/levels in the netCDF file + character(len=NCOMMENTLGTMAX), dimension(NMAXLEVELS) :: ccomments ='' !Comments for the different groups/levels in the netCDF file + character(len=1) :: cdirection = '' !Used for 2pt correlation and spectrum + logical :: lmobile = .false. !Is the domain moving? (ie for aircrafts and balloons) + logical :: licompress = .false. + logical :: ljcompress = .false. + logical :: lkcompress = .false. + logical :: ltcompress = .false. ! true if values are time averaged (can be on multiple time periods) + logical :: lnorm = .false. ! true if values are normalized + logical, dimension(NMAXLEVELS) :: lleveluse = .false. + integer :: nil = -1 !Cartesian box boundaries in physical domain coordinates + integer :: nih = -1 + integer :: njl = -1 + integer :: njh = -1 + integer :: nkl = -1 + integer :: nkh = -1 + integer :: nsv = -1 !Reference number of the corresponding scalar variable +end type tbudiachrometadata + +type tbudgetdata + character(len=NBUNAMELGTMAX) :: cname = '' + character(len=NCOMMENTLGTMAX) :: ccomment = '' + character(len=100) :: clessource = '' ! Last source stored + integer :: nid = -1 !Identifier number (based on parameters NBUDGET_*) + integer :: ngroups = 0 !Number of groups of source terms to store + integer :: nsources = 0 !Number of available source terms + integer :: nsourcesmax = 0 !Maximum number of source terms + integer :: ntmpstoresource = 0 !Reference of the source term using the xtmpstore array + logical :: lenabled = .false. ! True if corresponding budget flag is set to true + real, dimension(:,:,:), allocatable :: xtmpstore ! Array to store temporary data + ! (to allow to store the difference between 2 places) + real, dimension(:,:,:), allocatable :: xtmplesstore ! Array to store temporary data for LES budgets + ! (to allow to store the difference between 2 places) + type(tbusourcedata), dimension(:), allocatable :: tsources ! Full list of source terms (used or not) + type(tbugroupdata), dimension(:), allocatable :: tgroups ! Full list of groups of source terms (to be written) + type(tburhodata), pointer :: trhodj => null() ! Budget array for rhodj +end type tbudgetdata + + +type(tbudgetdata), dimension(:), allocatable, save :: tbudgets +type(tburhodata), pointer, save :: tburhodj => null() ! Budget array for rhodj used inside some tbudgets + + +! General variables +LOGICAL, SAVE :: LBU_ENABLE +! +CHARACTER (LEN=4), SAVE :: CBUTYPE ! type of desired budget 'CART' + ! (cartesian box) or 'MASK' (budget + ! zone defined by a mask) or 'NONE' + ! (no budget) +INTEGER, SAVE :: NBUMOD ! model in which budget is + ! calculated +! +LOGICAL, SAVE :: LBU_BEG ! switch for budget beginning +! +REAL, SAVE :: XBULEN ! length in seconds of the budget + ! temporal average +! +INTEGER, SAVE :: NBUSTEP ! number of model timesteps required + ! for the budget time average +REAL, SAVE :: XBUWRI ! period in seconds between + ! budget writing for budget masks +INTEGER, SAVE :: NBUTSHIFT ! temporal shift for budgets writing +integer, save :: nbusubwrite = 0 ! Number of budget time average periods for each write +integer, save :: nbutotwrite = 0 ! Total number of budget time average periods +! +INTEGER, SAVE :: NBUKL, NBUKH ! lowest and highest K indice values + ! of the budget box in the physical domain +LOGICAL, SAVE :: LBU_KCP ! switch for compression in K + ! direction +! +! Variables used by the cartesian box case ('CART') only +! +INTEGER, SAVE :: NBUIL, NBUIH ! lowest and highest I indice values + ! of the cartesian box in the physical domain +INTEGER, SAVE :: NBUJL, NBUJH ! lowest and highest J indice values + ! of the cartesian box in the physical domain +LOGICAL, SAVE :: LBU_ICP ! switch for compression in I + ! direction +LOGICAL, SAVE :: LBU_JCP ! switch for comppression in J + ! direction +! +! Variables used by the mask case ('MASK') only +! +INTEGER, SAVE :: NBUMASK ! number of MASK zones for which + ! budgets are performed +LOGICAL, SAVE, DIMENSION(:,:,:), & ! define the zone where the MASK + ALLOCATABLE :: LBU_MASK ! is True +! +INTEGER, SAVE, DIMENSION(:,:,:,:), & ! surface for each mask at each + ALLOCATABLE :: NBUSURF ! budget step +! +INTEGER, SAVE :: NBUTIME ! number of budget time periods +! +! Variables for budget storage +! +! General variables +INTEGER, SAVE :: NBUSIL, NBUSIH ! lowest and highest I indices of the intersection + ! of the cartesian box with the sub-domain +INTEGER, SAVE :: NBUSJL, NBUSJH ! lowest and highest J indices of the intersection + ! of the global cartesian box +INTEGER, SAVE :: NBUIMAX_ll ! second dimension of the budget +INTEGER, SAVE :: NBUJMAX_ll ! second dimension of the budget + ! array in the global domain (in CART case) +! +INTEGER, SAVE :: NBUIMAX ! first dimension of the budget + ! tabular +INTEGER, SAVE :: NBUJMAX ! second dimension of the budget + ! tabular +INTEGER, SAVE :: NBUKMAX ! dimension along K of the budget + ! tabular +! +! Allowed processes for the budget of the x scalar variables +! (transport part only) +! +! For each budget, the switches values for budgets +! activation may be set by the user in a namelist. Their default value is 0. +! In the following declaration, the corresponding process names are given +! beside as comments. +! +! Allowed processes for the budget of RU (wind component along x) +! +! Current namelist: NAM_BU_RU +! +LOGICAL, SAVE :: LBU_RU = .FALSE. ! True when the budget of RU is performed +! +CHARACTER(LEN=NBULISTMAXLEN), DIMENSION(:), ALLOCATABLE :: CBULIST_RU +! +! Allowed processes for the budget of RV (wind component along y) +! +! Current namelist: NAM_BU_RV +! +LOGICAL, SAVE :: LBU_RV = .FALSE. ! True when the budget of RV is performed +! +CHARACTER(LEN=NBULISTMAXLEN), DIMENSION(:), ALLOCATABLE :: CBULIST_RV +! +! Allowed processes for the budget of RW (wind vertical component) +! +! Current namelist: NAM_BU_RW +! +LOGICAL, SAVE :: LBU_RW = .FALSE. ! True when the budget of RW is performed +! +CHARACTER(LEN=NBULISTMAXLEN), DIMENSION(:), ALLOCATABLE :: CBULIST_RW +! +! Allowed processes for the budget of RTH (potential temperature) +! +! Current namelist: NAM_BU_RTH +! +LOGICAL, SAVE :: LBU_RTH = .FALSE. ! True when the budget of RTH is performed +! +CHARACTER(LEN=NBULISTMAXLEN), DIMENSION(:), ALLOCATABLE :: CBULIST_RTH +! +! Allowed processes for the budget of RTKE (kinetic energy) +! +! Current namelist: NAM_BU_RTKE +! +LOGICAL, SAVE :: LBU_RTKE = .FALSE. ! True when the budget of RTKE is performed +! +CHARACTER(LEN=NBULISTMAXLEN), DIMENSION(:), ALLOCATABLE :: CBULIST_RTKE +! +! Allowed processes for the budget of moist variable RRV (water vapor) +! +! Current namelist: NAM_BU_RRV +! +LOGICAL, SAVE :: LBU_RRV = .FALSE. ! true when the budget of RRV is performed +! +CHARACTER(LEN=NBULISTMAXLEN), DIMENSION(:), ALLOCATABLE :: CBULIST_RRV +! +! Allowed processes for the budget of moist variable RRC (cloud water) +! +! Current namelist: NAM_BU_RRC +! +LOGICAL, SAVE :: LBU_RRC = .FALSE. ! True when the budget of RRC is performed +! +CHARACTER(LEN=NBULISTMAXLEN), DIMENSION(:), ALLOCATABLE :: CBULIST_RRC +! +! Allowed processes for the budget of moist variable RRR (rain water) +! +! Current namelist: NAM_BU_RRR +! +LOGICAL, SAVE :: LBU_RRR = .FALSE. ! True when the budget of RRR is performed +! +CHARACTER(LEN=NBULISTMAXLEN), DIMENSION(:), ALLOCATABLE :: CBULIST_RRR +! +! Allowed processes for the budget of moist variable RRI (ice) +! +! Current namelist: NAM_BU_RRI +! +LOGICAL, SAVE :: LBU_RRI = .FALSE. ! True when the budget of RRI is performed +! +CHARACTER(LEN=NBULISTMAXLEN), DIMENSION(:), ALLOCATABLE :: CBULIST_RRI +! +! Allowed processes for the budget of moist variable RRS (snow) +! +! Current namelist: NAM_BU_RRS +! +LOGICAL, SAVE :: LBU_RRS = .FALSE. ! True when the budget of RRS is performed +! +CHARACTER(LEN=NBULISTMAXLEN), DIMENSION(:), ALLOCATABLE :: CBULIST_RRS +! +! Allowed processes for the budget of moist variable RRG (graupel) +! +! Current namelist: NAM_BU_RRG +! +LOGICAL, SAVE :: LBU_RRG = .FALSE. ! True when the budget of RRG is performed +! +CHARACTER(LEN=NBULISTMAXLEN), DIMENSION(:), ALLOCATABLE :: CBULIST_RRG +! +! Allowed processes for the budget of moist variable RRH (hail) +! +! Current namelist: NAM_BU_RRH +! +LOGICAL, SAVE :: LBU_RRH = .FALSE. ! True when the budget of RRH is performed +! +CHARACTER(LEN=NBULISTMAXLEN), DIMENSION(:), ALLOCATABLE :: CBULIST_RRH +! +! Current namelist: NAM_BU_RSV +! +LOGICAL, SAVE :: LBU_RSV = .FALSE. ! True when the budget of RSVx is performed +! +CHARACTER(LEN=NBULISTMAXLEN), DIMENSION(:), ALLOCATABLE :: CBULIST_RSV +! +! +REAL :: XTIME_BU ! budget time in this time-step +REAL :: XTIME_BU_PROCESS ! budget time per process for this time-step +! +LOGICAL :: LBUDGET_U ! flag to compute budget of RhoJu and/or LES budgets with u +LOGICAL :: LBUDGET_V ! flag to compute budget of RhoJv and/or LES budgets with u +LOGICAL :: LBUDGET_W ! flag to compute budget of RhoJw and/or LES budgets with u +LOGICAL :: LBUDGET_TH ! flag to compute budget of RhoJTh and/or LES budgets with th +LOGICAL :: LBUDGET_TKE! flag to compute budget of RhoJTke and/or LES budgets with Tke +LOGICAL :: LBUDGET_RV ! flag to compute budget of RhoJrv and/or LES budgets with rv +LOGICAL :: LBUDGET_RC ! flag to compute budget of RhoJrc and/or LES budgets with rc +LOGICAL :: LBUDGET_RR ! flag to compute budget of RhoJrr and/or LES budgets with rr +LOGICAL :: LBUDGET_RI ! flag to compute budget of RhoJri and/or LES budgets with ri +LOGICAL :: LBUDGET_RS ! flag to compute budget of RhoJrs and/or LES budgets with rs +LOGICAL :: LBUDGET_RG ! flag to compute budget of RhoJrg and/or LES budgets with rg +LOGICAL :: LBUDGET_RH ! flag to compute budget of RhoJrh and/or LES budgets with rh +LOGICAL :: LBUDGET_SV ! flag to compute budget of RhoJsv and/or LES budgets with sv +! +END MODULE MODD_BUDGET -- GitLab