From 9cdbed203c870a963fb35637ffffa2a18e7a5a57 Mon Sep 17 00:00:00 2001 From: Quentin Rodier <quentin.rodier@meteo.fr> Date: Fri, 14 Jan 2022 19:08:15 +0100 Subject: [PATCH] Quentin 14/01/2022: tke_eps_sources merge with I/O and _ll sources : Arome aux: - get_halo.F90 - argslist_ll for LIST_ll, ADD3DFIELD_ll, CLEANLIST_ll - modd_field.F90 for type TFIELDDATA (MesoNH I/O) - mode_io_field_write.F90 for IO_FIELD_WRITE subroutine - mode_ll.F90 : add UPDATE_HALO_ll - mode_io.F90 : add type TFILEDATA (MesoNH I/O) Known issues: - Budgets merged, it compiles but crashes at run - mesonh subroutine calls (turb, tke_eps_sources) not adapted (see new optionnal args) --- src/arome/aux/get_halo.F90 | 33 +++ src/arome/aux/modd_argslist_ll.F90 | 6 + src/arome/aux/modd_field.F90 | 29 ++ src/arome/aux/mode_argslist_ll.F90 | 21 ++ src/arome/aux/mode_io_field_write.F90 | 15 + src/arome/aux/mode_ll.F90 | 8 + src/arome/micro/modd_parameters.F90 | 14 + src/arome/turb/modi_tke_eps_sources.F90 | 63 +++-- src/arome/turb/modi_turb.F90 | 16 +- src/common/aux/modd_io.F90 | 30 +- .../turb/tke_eps_sources.F90 | 267 ++++++++++-------- src/{arome => common}/turb/turb.F90 | 42 ++- 12 files changed, 378 insertions(+), 166 deletions(-) create mode 100644 src/arome/aux/get_halo.F90 create mode 100644 src/arome/aux/modd_argslist_ll.F90 create mode 100644 src/arome/aux/modd_field.F90 create mode 100644 src/arome/aux/mode_argslist_ll.F90 create mode 100644 src/arome/aux/mode_io_field_write.F90 rename src/{arome => common}/turb/tke_eps_sources.F90 (65%) rename src/{arome => common}/turb/turb.F90 (97%) diff --git a/src/arome/aux/get_halo.F90 b/src/arome/aux/get_halo.F90 new file mode 100644 index 000000000..443d33f13 --- /dev/null +++ b/src/arome/aux/get_halo.F90 @@ -0,0 +1,33 @@ +!MNH_LIC Copyright 1994-2019 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. +!----------------------------------------------------------------- +! Modifications: +! P. Wautelet 20/05/2019: add name argument to ADDnFIELD_ll + new ADD4DFIELD_ll subroutine +!----------------------------------------------------------------- +! #################### + MODULE MODI_GET_HALO +! #################### +! +INTERFACE +! +SUBROUTINE GET_HALO(PSRC) +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSRC ! variable at t +! +END SUBROUTINE GET_HALO +! +END INTERFACE +! +END MODULE MODI_GET_HALO +! +!------------------------------------------------------------------------------- +! ######################### + SUBROUTINE GET_HALO(PSRC) +! ######################### +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSRC ! variable at t +! +END SUBROUTINE GET_HALO +!----------------------------------------------------------------------- diff --git a/src/arome/aux/modd_argslist_ll.F90 b/src/arome/aux/modd_argslist_ll.F90 new file mode 100644 index 000000000..03db23cd5 --- /dev/null +++ b/src/arome/aux/modd_argslist_ll.F90 @@ -0,0 +1,6 @@ +MODULE MODD_ARGSLIST_ll +IMPLICIT NONE +TYPE LIST_ll +END TYPE LIST_ll +CONTAINS +END MODULE MODD_ARGSLIST_ll diff --git a/src/arome/aux/modd_field.F90 b/src/arome/aux/modd_field.F90 new file mode 100644 index 000000000..be5755c73 --- /dev/null +++ b/src/arome/aux/modd_field.F90 @@ -0,0 +1,29 @@ +MODULE MODD_FIELD + USE MODD_PARAMETERS, ONLY: NGRIDUNKNOWN, NMNHNAMELGTMAX, NSTDNAMELGTMAX + INTEGER, PARAMETER :: NMNHDIM_UNKNOWN = -2 + INTEGER, PARAMETER :: NMNHMAXDIMS = 6 ! Cannot be less than 6 + INTEGER,PARAMETER :: TYPEUNDEF = -1, TYPEINT = 1, TYPELOG = 2, TYPEREAL = 3, TYPECHAR = 4, TYPEDATE = 5 +! +TYPE TFIELDDATA + CHARACTER(LEN=NMNHNAMELGTMAX) :: CMNHNAME = '' !Name of the field (for MesoNH, non CF convention) + CHARACTER(LEN=NSTDNAMELGTMAX) :: CSTDNAME = '' !Standard name (CF convention) + CHARACTER(LEN=32) :: CLONGNAME = '' !Long name (CF convention) + CHARACTER(LEN=40) :: CUNITS = '' !Canonical units (CF convention) + CHARACTER(LEN=100) :: CCOMMENT = '' !Comment (for MesoNH, non CF convention) + INTEGER :: NGRID = NGRIDUNKNOWN !Localization on the model grid + INTEGER :: NTYPE = TYPEUNDEF !Datatype + INTEGER :: NDIMS = 0 !Number of dimensions + INTEGER, DIMENSION(NMNHMAXDIMS) :: NDIMLIST = NMNHDIM_UNKNOWN ! List of dimensions of the data field + ! + INTEGER :: NFILLVALUE = -2147483647 !Fill value for integer fields + REAL :: XFILLVALUE = 9.9692099683868690e+36 !Fill value for real fields + INTEGER :: NVALIDMIN = -2147483646 !Minimum valid value for integer fields + INTEGER :: NVALIDMAX = 2147483647 !Maximum valid value for integer fields + REAL :: XVALIDMIN = -1.E36 !Minimum valid value for real fields + REAL :: XVALIDMAX = 1.E36 !Maximum valid value for real fields + CHARACTER(LEN=2) :: CDIR = '' !Type of the data field (XX,XY,--...) + CHARACTER(LEN=4) :: CLBTYPE = 'NONE' !Type of the lateral boundary (LBX,LBY,LBXU,LBYV) + LOGICAL :: LTIMEDEP = .FALSE. !Is the field time-dependent? +END TYPE TFIELDDATA +! +END MODULE MODD_FIELD diff --git a/src/arome/aux/mode_argslist_ll.F90 b/src/arome/aux/mode_argslist_ll.F90 new file mode 100644 index 000000000..42eaf543e --- /dev/null +++ b/src/arome/aux/mode_argslist_ll.F90 @@ -0,0 +1,21 @@ +MODULE MODE_ARGSLIST_ll +USE MODD_ARGSLIST_ll, ONLY : LIST_ll +CONTAINS + +! + SUBROUTINE CLEANLIST_ll(TPLIST) +IMPLICIT NONE + + TYPE(LIST_ll), POINTER :: TPLIST ! List of fields + END SUBROUTINE CLEANLIST_ll +! + SUBROUTINE ADD3DFIELD_ll(TPLIST, PFIELD, HNAME) +IMPLICIT NONE + + TYPE(LIST_ll), POINTER :: TPLIST ! list of fields + REAL, DIMENSION(:,:,:), TARGET :: PFIELD ! field to be added to the list + ! of fields + character(len=*), intent(in) :: HNAME ! Name of the field to be added + ! + END SUBROUTINE ADD3DFIELD_ll +END MODULE MODE_ARGSLIST_ll diff --git a/src/arome/aux/mode_io_field_write.F90 b/src/arome/aux/mode_io_field_write.F90 new file mode 100644 index 000000000..39e6f7fec --- /dev/null +++ b/src/arome/aux/mode_io_field_write.F90 @@ -0,0 +1,15 @@ +MODULE MODE_IO_FIELD_WRITE +USE MODD_IO, ONLY: TFILEDATA +USE MODD_FIELD, ONLY: TFIELDDATA +CONTAINS +SUBROUTINE IO_FIELD_WRITE(TPFILE,TZFIELD,PFIELD) + ! + !* 0.1 Declarations of arguments + ! + TYPE(TFILEDATA), INTENT(IN) :: TPFILE + TYPE(TFIELDDATA), INTENT(IN) :: TZFIELD + REAL, DIMENSION(:,:,:), INTENT(IN) :: PFIELD ! array containing the data field + ! +END SUBROUTINE IO_FIELD_WRITE +END MODULE MODE_IO_FIELD_WRITE + diff --git a/src/arome/aux/mode_ll.F90 b/src/arome/aux/mode_ll.F90 index 790a3acac..030d62931 100644 --- a/src/arome/aux/mode_ll.F90 +++ b/src/arome/aux/mode_ll.F90 @@ -1,4 +1,6 @@ MODULE MODE_ll +use mode_argslist_ll + IMPLICIT NONE CONTAINS SUBROUTINE GET_INDICE_ll(KXOR, KYOR, KXEND, KYEND, KSIZE1, KSIZE2) @@ -11,4 +13,10 @@ CONTAINS KXEND=KSIZE1-JPHEXT KYEND=KSIZE2-JPHEXT END SUBROUTINE GET_INDICE_ll + + SUBROUTINE UPDATE_HALO_ll(TPLIST, KINFO) + USE MODD_ARGSLIST_ll, ONLY : LIST_ll + TYPE(LIST_ll), POINTER :: TPLIST ! pointer to the list of fields to be updated + INTEGER :: KINFO ! return status + END SUBROUTINE UPDATE_HALO_ll END MODULE MODE_ll diff --git a/src/arome/micro/modd_parameters.F90 b/src/arome/micro/modd_parameters.F90 index 4a1ea9860..931c6fb58 100644 --- a/src/arome/micro/modd_parameters.F90 +++ b/src/arome/micro/modd_parameters.F90 @@ -60,7 +60,21 @@ INTEGER, PARAMETER :: JPDUMMY = 20 ! Size of dummy array ! INTEGER, PARAMETER :: JPOUTMAX = 192 ! Maximum allowed number of OUTput files ! +INTEGER, PARAMETER :: NBUNAMELGTMAX = 32 ! Maximum length of a budget name +INTEGER, PARAMETER :: NCOMMENTLGTMAX = 100 ! Maximum length of a comment +INTEGER, PARAMETER :: NMNHNAMELGTMAX = 32 ! Maximum length of a MNH variable name +INTEGER, PARAMETER :: NSTDNAMELGTMAX = 64 ! Maximum length of the standard name of a variable (CF convention) +! +INTEGER, PARAMETER :: NDIRNAMELGTMAX = 512 ! Maximum length of a directory name +INTEGER, PARAMETER :: NFILENAMELGTMAX = 32 ! Maximum length of a file name (must be at least NFILENAMELGTMAXLFI) +INTEGER, PARAMETER :: NFILENAMELGTMAXLFI = 28 ! Maximum length of a file name in LFI file (this is necessary + ! to keep backward compatibility), MUST BE 28 +! +INTEGER, PARAMETER :: NLFIMAXCOMMENTLENGTH = 100 ! Length of comments in LFI files +! INTEGER, PARAMETER :: JPLIMACCNMAX = 10 ! Maximum allowed number of CCN modes in LIMA INTEGER, PARAMETER :: JPLIMAIFNMAX = 10 ! Maximum allowed number of IFN modes in LIMA ! +INTEGER, PARAMETER :: NGRIDUNKNOWN = -1 ! Unknown Arakawa grid number +! END MODULE MODD_PARAMETERS diff --git a/src/arome/turb/modi_tke_eps_sources.F90 b/src/arome/turb/modi_tke_eps_sources.F90 index 6df0247c3..f15aacae1 100644 --- a/src/arome/turb/modi_tke_eps_sources.F90 +++ b/src/arome/turb/modi_tke_eps_sources.F90 @@ -3,22 +3,26 @@ ! ########################### INTERFACE ! - SUBROUTINE TKE_EPS_SOURCES(KKA,KKU,KKL,KMI,PTKEM,PLM,PLEPS,PDP,PTRH, & - & PRHODJ,PDZZ,PDXX,PDYY,PDZX,PDZY,PZZ, & - & PTSTEP,PIMPL,PEXPL, & - & HTURBLEN,HTURBDIM, & - & HFMFILE,HLUOUT,OCLOSE_OUT,OTURB_DIAG, & - & PTP,PRTKES,PRTHLS,PCOEF_DISS,PTDIFF, & - & PTDISS,PEDR,YDDDH, YDLDDH, YDMDDH) + SUBROUTINE TKE_EPS_SOURCES(KKA,KKU,KKL,KMI,PTKEM,PLM,PLEPS,PDP, & + & PTRH,PRHODJ,PDZZ,PDXX,PDYY,PDZX,PDZY,PZZ, & + & PTSTEP,PIMPL,PEXPL, & + & HTURBLEN,HTURBDIM, & + & TPFILE,OTURB_DIAG, & + & PTP,PRTKES,PRTHLS,PCOEF_DISS,PTDIFF,PTDISS,& + & PEDR, YDDDH, YDLDDH, YDMDDH,TBUDGETS, KBUDGETS, & + & PTR,PDISS,PRTKESM ) ! USE DDH_MIX, ONLY : TYP_DDH USE YOMLDDH, ONLY : TLDDH USE YOMMDDH, ONLY : TMDDH +USE MODD_IO, ONLY: TFILEDATA +USE MODD_BUDGET, ONLY : TBUDGETDATA ! -INTEGER, INTENT(IN) :: KKA !near ground array index -INTEGER, INTENT(IN) :: KKU !uppest atmosphere array index -INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=ARO -INTEGER :: KMI ! model index number +INTEGER, INTENT(IN) :: KKA !near ground array index +INTEGER, INTENT(IN) :: KKU !uppest atmosphere array index +INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=ARO + +INTEGER, INTENT(IN) :: KMI ! model index number REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKEM ! TKE at t-deltat REAL, DIMENSION(:,:,:), INTENT(IN) :: PLM ! mixing length REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS ! dissipative length @@ -26,33 +30,32 @@ REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! density * grid volume REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX,PDYY,PDZZ,PDZX,PDZY ! metric coefficients REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! physical height w-pt -REAL, INTENT(IN) :: PTSTEP ! Double Time step ( *.5 for - ! the first time step ) +REAL, INTENT(IN) :: PTSTEP ! Time step REAL, INTENT(IN) :: PEXPL, PIMPL ! Coef. temporal. disc. -CHARACTER*4, INTENT(IN) :: HTURBDIM ! dimensionality of the +CHARACTER(LEN=4), INTENT(IN) :: HTURBDIM ! dimensionality of the ! turbulence scheme -CHARACTER*4, INTENT(IN) :: HTURBLEN ! kind of mixing length -CHARACTER(LEN=*), INTENT(IN) :: HFMFILE ! Name of the output - ! FM-file -CHARACTER(LEN=*), INTENT(IN) :: HLUOUT ! Output-listing name for - ! model n -LOGICAL, INTENT(IN) :: OCLOSE_OUT ! switch for syncronous - ! file opening +CHARACTER(LEN=4), INTENT(IN) :: HTURBLEN ! kind of mixing length +TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file LOGICAL, INTENT(IN) :: OTURB_DIAG ! switch to write some ! diagnostic fields in the syncronous FM-file -REAL, DIMENSION(:,:,:), INTENT(INOUT):: PDP, PTRH ! Dyn. prod. of TKE -REAL, DIMENSION(:,:,:), INTENT(INOUT):: PTP ! Ther. prod. of TKE +REAL, DIMENSION(:,:,:), INTENT(INOUT):: PDP ! Dyn. prod. of TKE +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTRH +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTP ! Ther. prod. of TKE REAL, DIMENSION(:,:,:), INTENT(INOUT):: PRTKES ! RHOD * Jacobian * ! TKE at t+deltat REAL, DIMENSION(:,:,:), INTENT(INOUT):: PRTHLS ! Source of Theta_l REAL, DIMENSION(:,:,:), INTENT(IN) :: PCOEF_DISS ! 1/(Cph*Exner) -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PTDIFF ! Diffusion TKE term -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PTDISS ! Dissipation TKE term - -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PEDR ! eddy dissipation rate -TYPE(TYP_DDH), INTENT(INOUT) :: YDDDH -TYPE(TLDDH), INTENT(IN) :: YDLDDH -TYPE(TMDDH), INTENT(IN) :: YDMDDH +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PTDIFF ! Diffusion TKE term +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PTDISS ! Dissipation TKE term +TYPE(TYP_DDH), INTENT(INOUT) :: YDDDH +TYPE(TLDDH), INTENT(IN) :: YDLDDH +TYPE(TMDDH), INTENT(IN) :: YDMDDH +TYPE(TBUDGETDATA), DIMENSION(KBUDGETS), INTENT(INOUT) :: TBUDGETS +INTEGER, INTENT(IN) :: KBUDGETS +REAL, DIMENSION(:,:,:), INTENT(OUT), OPTIONAL :: PTR ! Transport prod. of TKE +REAL, DIMENSION(:,:,:), INTENT(OUT), OPTIONAL :: PDISS ! Dissipation of TKE +REAL, DIMENSION(:,:,:), INTENT(OUT), OPTIONAL :: PEDR ! EDR +REAL, DIMENSION(:,:,:), INTENT(IN), OPTIONAL :: PRTKESM ! Advection source ! ! ! diff --git a/src/arome/turb/modi_turb.F90 b/src/arome/turb/modi_turb.F90 index 2a15db137..c862c0824 100644 --- a/src/arome/turb/modi_turb.F90 +++ b/src/arome/turb/modi_turb.F90 @@ -22,9 +22,9 @@ INTERFACE & PHGRAD,PSIGS, & & PDRUS_TURB,PDRVS_TURB, & & PDRTHLS_TURB,PDRRTS_TURB,PDRSVS_TURB, & - & PFLXZTHVMF,PWTH,PWRC,PWSV,PDP,PTP,PTPMF,PTDIFF, & - & PTDISS,PEDR,YDDDH,YDLDDH,YDMDDH) - + & PFLXZTHVMF,PWTH,PWRC,PWSV,PDP,PTP,PTPMF,PTDIFF,PTDISS,& + & YDDDH,YDLDDH,YDMDDH, & + & PTR,PDISS,PEDR ) ! USE DDH_MIX, ONLY : TYP_DDH USE YOMLDDH, ONLY : TLDDH @@ -143,17 +143,17 @@ REAL, DIMENSION(:,:,:), INTENT(OUT) :: PTP ! Thermal TKE production REAL, DIMENSION(:,:,:), INTENT(OUT) :: PTPMF ! Thermal TKE production REAL, DIMENSION(:,:,:), INTENT(OUT) :: PTDIFF ! Diffusion TKE term REAL, DIMENSION(:,:,:), INTENT(OUT) :: PTDISS ! Dissipation TKE term - -REAL, DIMENSION(:,:,:),INTENT(OUT) :: PEDR ! eddy dissipation rate - +! REAL, DIMENSION(:,:,:), INTENT(IN) :: PLENGTHM REAL, DIMENSION(:,:,:), INTENT(IN) :: PLENGTHH ! - TYPE(TYP_DDH), INTENT(INOUT) :: YDDDH TYPE(TLDDH), INTENT(IN) :: YDLDDH TYPE(TMDDH), INTENT(IN) :: YDMDDH - +! +REAL, DIMENSION(:,:,:), INTENT(OUT), OPTIONAL :: PTR ! Transport production of TKE +REAL, DIMENSION(:,:,:), INTENT(OUT), OPTIONAL :: PDISS ! Dissipation of TKE +REAL, DIMENSION(:,:,:), INTENT(OUT), OPTIONAL :: PEDR ! EDR ! !------------------------------------------------------------------------------- ! diff --git a/src/common/aux/modd_io.F90 b/src/common/aux/modd_io.F90 index c111e469f..56ae6db2b 100644 --- a/src/common/aux/modd_io.F90 +++ b/src/common/aux/modd_io.F90 @@ -1,6 +1,34 @@ MODULE MODD_IO +USE MODD_PARAMETERS, ONLY: NFILENAMELGTMAX +! IMPLICIT NONE - +! INTEGER, PARAMETER :: NVERB_NO=0, NVERB_FATAL=1, NVERB_ERROR=2, NVERB_WARNING=3, NVERB_INFO=4, NVERB_DEBUG=5 INTEGER, SAVE :: N_ABORT_LEVEL = NVERB_ERROR +! +!Structure describing the characteristics of a file +TYPE TFILEDATA + CHARACTER(LEN=NFILENAMELGTMAX) :: CNAME = '' !Filename + CHARACTER(LEN=:),ALLOCATABLE :: CDIRNAME !Directory name + CHARACTER(LEN=13) :: CTYPE = "UNKNOWN" !Filetype (PGD, MNH, DES, NML...) + CHARACTER(LEN=7) :: CFORMAT = "UNKNOWN" !Fileformat (NETCDF4, LFI, LFICDF4...) + CHARACTER(LEN=7) :: CMODE = "UNKNOWN" !Opening mode (read, write...) + LOGICAL :: LOPENED = .FALSE. !Is the file opened + INTEGER :: NOPEN_CURRENT = 0 !Number of times the file is currently opened (several opens without close are allowed) + INTEGER :: NOPEN = 0 !Number of times the file has been opened (during the current execution) + INTEGER :: NCLOSE = 0 !Number of times the file has been closed (during the current execution) + ! + INTEGER :: NMASTER_RANK = -1 !Rank of the master process (no meaning if LMULTIMASTERS=.T.) + INTEGER :: NMPICOMM = -1 !MPI communicator used for IO on this file + LOGICAL :: LMASTER = .FALSE. !True if process is master of the file (process that open/read/write/close) + LOGICAL :: LMULTIMASTERS = .FALSE. !True if several processes may access the file + INTEGER :: NSUBFILES_IOZ = 0 !Number of sub-files (Z-split files based on this file) + !For example if 2 sub-files and this file is abcd, + !the 2 sub-files are abcd.Z001 and abcd.Z002 +! TYPE(TFILE_ELT),DIMENSION(:),ALLOCATABLE :: TFILES_IOZ !Corresponding Z-split files + ! + INTEGER :: NMODEL = 0 !Model number corresponding to the file (field not always set) + INTEGER,DIMENSION(3) :: NMNHVERSION = (/0,0,0/) !MesoNH version used to create the file + ! +END TYPE TFILEDATA ENDMODULE MODD_IO diff --git a/src/arome/turb/tke_eps_sources.F90 b/src/common/turb/tke_eps_sources.F90 similarity index 65% rename from src/arome/turb/tke_eps_sources.F90 rename to src/common/turb/tke_eps_sources.F90 index 672987f18..72ed8b202 100644 --- a/src/arome/turb/tke_eps_sources.F90 +++ b/src/common/turb/tke_eps_sources.F90 @@ -1,13 +1,17 @@ +!MNH_LIC Copyright 1994-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. +!----------------------------------------------------------------- ! ######spl SUBROUTINE TKE_EPS_SOURCES(KKA,KKU,KKL,KMI,PTKEM,PLM,PLEPS,PDP, & & PTRH,PRHODJ,PDZZ,PDXX,PDYY,PDZX,PDZY,PZZ, & & PTSTEP,PIMPL,PEXPL, & & HTURBLEN,HTURBDIM, & - & HFMFILE,HLUOUT,OCLOSE_OUT,OTURB_DIAG, & - & PTP,PRTKES,PRTHLS,PCOEF_DISS,PTDIFF,PTDISS, & - & PEDR,YDDDH, YDLDDH, YDMDDH) - USE PARKIND1, ONLY : JPRB - USE YOMHOOK , ONLY : LHOOK, DR_HOOK + & TPFILE,OTURB_DIAG, & + & PTP,PRTKES,PRTHLS,PCOEF_DISS,PTDIFF,PTDISS,& + & PEDR, YDDDH, YDLDDH, YDMDDH, TBUDGETS, KBUDGETS, & + & PTR,PDISS,PRTKESM ) ! ################################################################## ! ! @@ -68,7 +72,6 @@ !! 'CART' for cartesian box configuration !! 'MASK' for budget zone defined by a mask !! 'NONE' ' for no budget -!! NBUPROCCTR : process counter used for each budget variable !! LBU_RTKE : logical for budget of RTKE (turbulent kinetic energy) !! .TRUE. = budget of RTKE !! .FALSE. = no budget of RTKE @@ -112,35 +115,48 @@ !! vertical levels !! 2014-11 Y. Seity, add output terms for TKE DDHs budgets !! -------------------------------------------------------------------------- +!! 2015-01 (J. Escobar) missing get_halo(ZRES) for JPHEXT<> 1 +!! J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 +!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O +! P. Wautelet 20/05/2019: add name argument to ADDnFIELD_ll + new ADD4DFIELD_ll subroutine +! P. Wautelet 02/2020: use the new data structures and subroutines for budgets +! -------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ ! -USE MODD_CST +USE PARKIND1, ONLY : JPRB +USE YOMHOOK , ONLY : LHOOK, DR_HOOK +! +USE MODD_ARGSLIST_ll, ONLY: LIST_ll +USE MODD_BUDGET, ONLY: LBUDGET_TKE, LBUDGET_TH, NBUDGET_TKE, NBUDGET_TH, TBUDGETDATA USE MODD_CONF +USE MODD_CST USE MODD_CTURB -USE MODD_PARAMETERS -USE MODD_BUDGET -USE MODD_LES USE MODD_DIAG_IN_RUN, ONLY : LDIAG_IN_RUN, XCURRENT_TKE_DISS +USE MODD_FIELD, ONLY: TFIELDDATA, TYPEREAL +USE MODD_IO, ONLY: TFILEDATA +USE MODD_LES +USE MODD_PARAMETERS +! +USE MODE_BUDGET, ONLY: BUDGET_STORE_ADD, BUDGET_STORE_END, BUDGET_STORE_INIT +USE MODE_IO_FIELD_WRITE, ONLY: IO_FIELD_WRITE +USE MODE_ll ! +USE MODI_GET_HALO USE MODI_GRADIENT_M USE MODI_GRADIENT_U USE MODI_GRADIENT_V USE MODI_GRADIENT_W -USE MODI_SHUMAN , ONLY : DZM, DZF, MZM, MZF -USE MODI_TRIDIAG -USE MODI_TRIDIAG_TKE USE MODI_BUDGET_DDH -USE MODE_FMWRIT USE MODI_LES_MEAN_SUBGRID +USE MODI_TRIDIAG_TKE +USE MODI_SHUMAN , ONLY : DZM, DZF, MZM, MZF ! USE DDH_MIX, ONLY : TYP_DDH USE YOMLDDH, ONLY : TLDDH USE YOMMDDH, ONLY : TMDDH ! -!!!!!AROME!!USE MODE_ll -!!!!!AROME!!USE MODD_ARGSLIST_ll, ONLY : LIST_ll ! IMPLICIT NONE ! @@ -160,32 +176,32 @@ REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! density * grid volume REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX,PDYY,PDZZ,PDZX,PDZY ! metric coefficients REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! physical height w-pt -REAL, INTENT(IN) :: PTSTEP ! Double Time step ( *.5 for - ! the first time step ) +REAL, INTENT(IN) :: PTSTEP ! Time step REAL, INTENT(IN) :: PEXPL, PIMPL ! Coef. temporal. disc. -CHARACTER*4, INTENT(IN) :: HTURBDIM ! dimensionality of the +CHARACTER(LEN=4), INTENT(IN) :: HTURBDIM ! dimensionality of the ! turbulence scheme -CHARACTER*4, INTENT(IN) :: HTURBLEN ! kind of mixing length -CHARACTER(LEN=*), INTENT(IN) :: HFMFILE ! Name of the output - ! FM-file -CHARACTER(LEN=*), INTENT(IN) :: HLUOUT ! Output-listing name for - ! model n -LOGICAL, INTENT(IN) :: OCLOSE_OUT ! switch for syncronous - ! file opening +CHARACTER(LEN=4), INTENT(IN) :: HTURBLEN ! kind of mixing length +TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file LOGICAL, INTENT(IN) :: OTURB_DIAG ! switch to write some ! diagnostic fields in the syncronous FM-file -REAL, DIMENSION(:,:,:), INTENT(INOUT):: PDP, PTRH ! Dyn. prod. of TKE -REAL, DIMENSION(:,:,:), INTENT(INOUT):: PTP ! Ther. prod. of TKE +REAL, DIMENSION(:,:,:), INTENT(INOUT):: PDP ! Dyn. prod. of TKE +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTRH +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTP ! Ther. prod. of TKE REAL, DIMENSION(:,:,:), INTENT(INOUT):: PRTKES ! RHOD * Jacobian * ! TKE at t+deltat REAL, DIMENSION(:,:,:), INTENT(INOUT):: PRTHLS ! Source of Theta_l REAL, DIMENSION(:,:,:), INTENT(IN) :: PCOEF_DISS ! 1/(Cph*Exner) -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PTDIFF ! Diffusion TKE term -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PTDISS ! Dissipation TKE term -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PEDR ! EDR +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PTDIFF ! Diffusion TKE term +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PTDISS ! Dissipation TKE term TYPE(TYP_DDH), INTENT(INOUT) :: YDDDH TYPE(TLDDH), INTENT(IN) :: YDLDDH TYPE(TMDDH), INTENT(IN) :: YDMDDH +TYPE(TBUDGETDATA), DIMENSION(KBUDGETS), INTENT(INOUT) :: TBUDGETS +INTEGER, INTENT(IN) :: KBUDGETS +REAL, DIMENSION(:,:,:), INTENT(OUT), OPTIONAL :: PTR ! Transport prod. of TKE +REAL, DIMENSION(:,:,:), INTENT(OUT), OPTIONAL :: PDISS ! Dissipation of TKE +REAL, DIMENSION(:,:,:), INTENT(OUT), OPTIONAL :: PEDR ! EDR +REAL, DIMENSION(:,:,:), INTENT(IN), OPTIONAL :: PRTKESM ! Advection source ! ! ! @@ -200,45 +216,40 @@ REAL, DIMENSION(SIZE(PTKEM,1),SIZE(PTKEM,2),SIZE(PTKEM,3)):: & ! temporarily store some diagnostics stored in FM file ZFLX, & ! horizontal or vertical flux of the treated variable ZSOURCE, & ! source of evolution for the treated variable - ZTR, & ! turbulent transport of TKE - ZKEFF ! effectif diffusion coeff = LT * SQRT( TKE ) + ZKEFF, & ! effectif diffusion coeff = LT * SQRT( TKE ) + ZTR,ZRTKESM ! Transport term and Advective TKE source LOGICAL,DIMENSION(SIZE(PTKEM,1),SIZE(PTKEM,2),SIZE(PTKEM,3)) :: GTKENEG ! 3D mask .T. if TKE < XTKEMIN INTEGER :: IIB,IIE,IJB,IJE,IKB,IKE ! Index values for the Beginning and End ! mass points of the domain INTEGER :: IIU,IJU,IKU ! array size in the 3 dimensions -INTEGER :: IRESP ! Return code of FM routines -INTEGER :: IGRID ! C-grid indicator in LFIFM file -INTEGER :: ILENCH ! Length of comment string in LFIFM file -CHARACTER (LEN=100) :: YCOMMENT ! comment string in LFIFM file -CHARACTER (LEN=16) :: YRECFM ! Name of the desired field in LFIFM file ! -!!!!!AROME!!TYPE(LIST_ll), POINTER :: TZFIELDDISS_ll ! list of fields to exchange -!!!!!AROME!!INTEGER :: IINFO_ll ! return code of parallel routine +TYPE(LIST_ll), POINTER :: TZFIELDDISS_ll ! list of fields to exchange +INTEGER :: IINFO_ll ! return code of parallel routine +TYPE(TFIELDDATA) :: TZFIELD +REAL(KIND=JPRB) :: ZHOOK_HANDLE ! - !---------------------------------------------------------------------------- -!!!!!AROME!!NULLIFY(TZFIELDDISS_ll) +NULLIFY(TZFIELDDISS_ll) ! !* 1. PRELIMINARY COMPUTATIONS ! ------------------------ ! -! -REAL(KIND=JPRB) :: ZHOOK_HANDLE + IF (LHOOK) CALL DR_HOOK('TKE_EPS_SOURCES',0,ZHOOK_HANDLE) -IIB=1+JPHEXT +! IIU=SIZE(PTKEM,1) -IIE=IIU-JPHEXT -IJB=1+JPHEXT IJU=SIZE(PTKEM,2) -IJE=IJU-JPHEXT +CALL GET_INDICE_ll (IIB,IJB,IIE,IJE,IIU,IJU) IKB=KKA+JPVEXT_TURB*KKL IKE=KKU-JPVEXT_TURB*KKL ! ! compute the effective diffusion coefficient at the mass point ZKEFF(:,:,:) = PLM(:,:,:) * SQRT(PTKEM(:,:,:)) ! +!IF (LBUDGET_TH) CALL BUDGET_STORE_INIT( TBUDGETS(NBUDGET_TH), 'DISSH', PRTHLS(:, :, :) ) +! !---------------------------------------------------------------------------- ! !* 2. TKE EQUATION @@ -259,6 +270,12 @@ END IF ! !* 2.2 Explicit TKE sources except horizontal turbulent transport ! +! Advection source (=0 in AROME) +IF(PRESENT(PRTKESM)) THEN + ZRTKESM=PRTKESM +ELSE + ZRTKESM=0. +END IF ! ! extrapolate the dynamic production with a 1/Z law from its value at the ! W(IKB+1) value stored in PDP(IKB) to the mass localization tke(IKB) @@ -267,7 +284,8 @@ PDP(:,:,IKB) = PDP(:,:,IKB) * (1. + PDZZ(:,:,IKB+KKL)/PDZZ(:,:,IKB)) ! Compute the source terms for TKE: ( ADVECtion + NUMerical DIFFusion + ..) ! + (Dynamical Production) + (Thermal Production) - (dissipation) ZFLX(:,:,:) = XCED * SQRT(PTKEM(:,:,:)) / PLEPS(:,:,:) -ZSOURCE(:,:,:) = PRTKES(:,:,:) / PRHODJ(:,:,:) - PTKEM(:,:,:) / PTSTEP & +ZSOURCE(:,:,:) = ( PRTKES(:,:,:) + ZRTKESM(:,:,:) ) / PRHODJ(:,:,:) & + - PTKEM(:,:,:) / PTSTEP & + PDP(:,:,:) + PTP(:,:,:) + ZTR(:,:,:) - PEXPL * ZFLX(:,:,:) * PTKEM(:,:,:) ! !* 2.2 implicit vertical TKE transport @@ -283,28 +301,30 @@ ZA(:,:,:) = - PTSTEP * XCET * & ! CALL TRIDIAG_TKE(KKA,KKU,KKL,PTKEM,ZA,PTSTEP,PEXPL,PIMPL,PRHODJ,& & ZSOURCE,PTSTEP*ZFLX,ZRES) +CALL GET_HALO(ZRES) ! !* diagnose the dissipation ! IF (LDIAG_IN_RUN) THEN XCURRENT_TKE_DISS = ZFLX(:,:,:) * PTKEM(:,:,:) & *(PEXPL*PTKEM(:,:,:) + PIMPL*ZRES(:,:,:)) -!!!!!AROME!! CALL ADD3DFIELD_ll(TZFIELDDISS_ll,XCURRENT_TKE_DISS) -!!!!!AROME!! CALL UPDATE_HALO_ll(TZFIELDDISS_ll,IINFO_ll) -!!!!!AROME!! CALL CLEANLIST_ll(TZFIELDDISS_ll) + CALL ADD3DFIELD_ll( TZFIELDDISS_ll, XCURRENT_TKE_DISS, 'TKE_EPS_SOURCES::XCURRENT_TKE_DISS' ) + CALL UPDATE_HALO_ll(TZFIELDDISS_ll,IINFO_ll) + CALL CLEANLIST_ll(TZFIELDDISS_ll) ENDIF ! ! TKE must be greater than its minimum value -! -GTKENEG = ZRES <= XTKEMIN -WHERE ( GTKENEG ) - ZRES = XTKEMIN -END WHERE - +! CL : Now done at the end of the time step in ADVECTION_METSV for MesoNH +IF(CPROGRAM/='MESONH') THEN + GTKENEG = ZRES <= XTKEMIN + WHERE ( GTKENEG ) + ZRES = XTKEMIN + END WHERE +END IF PTDISS(:,:,:) = - ZFLX(:,:,:)*(PEXPL*PTKEM(:,:,:) + PIMPL*ZRES(:,:,:)) ! IF ( LLES_CALL .OR. & - (OTURB_DIAG .AND. OCLOSE_OUT) ) THEN + (OTURB_DIAG .AND. TPFILE%LOPENED) ) THEN ! ! Compute the cartesian vertical flux of TKE in ZFLX ! @@ -330,38 +350,37 @@ END IF ! !* 2.4 stores the explicit sources for budget purposes ! -IF (LBUDGET_TKE) THEN -! -! add the dynamical production -! - PRTKES(:,:,:) = PRTKES(:,:,:) + PDP(:,:,:) * PRHODJ(:,:,:) - CALL BUDGET_DDH (PRTKES(:,:,:),5,'DP_BU_RTKE',YDDDH, YDLDDH, YDMDDH) -! -! add the thermal production -! - PRTKES(:,:,:) = PRTKES(:,:,:) + PTP(:,:,:) * PRHODJ(:,:,:) - CALL BUDGET_DDH (PRTKES(:,:,:),5,'TP_BU_RTKE',YDDDH, YDLDDH, YDMDDH) -! -! add the dissipation -! -PRTKES(:,:,:) = PRTKES(:,:,:) - XCED * SQRT(PTKEM(:,:,:)) / PLEPS(:,:,:) * & - (PEXPL*PTKEM(:,:,:) + PIMPL*ZRES(:,:,:)) * PRHODJ(:,:,:) -CALL BUDGET_DDH (PRTKES(:,:,:),5,'DISS_BU_RTKE',YDDDH, YDLDDH, YDMDDH) -END IF +!IF (LBUDGET_TKE) THEN + ! Dynamical production +! CALL BUDGET_STORE_ADD( TBUDGETS(NBUDGET_TKE), 'DP', PDP(:, :, :) * PRHODJ(:, :, :) ) + ! Thermal production +! CALL BUDGET_STORE_ADD( TBUDGETS(NBUDGET_TKE), 'TP', PTP(:, :, :) * PRHODJ(:, :, :) ) + ! Dissipation +! CALL BUDGET_STORE_ADD( TBUDGETS(NBUDGET_TKE), 'DISS',- XCED * SQRT(PTKEM(:,:,:)) / PLEPS(:,:,:) * & +! (PEXPL*PTKEM(:,:,:) + PIMPL*ZRES(:,:,:)) * PRHODJ(:,:,:)) +!END IF ! !* 2.5 computes the final RTKE and stores the whole turbulent transport -! +! with the removal of the advection part for MesoNH + PTDIFF(:,:,:) = ZRES(:,:,:) / PTSTEP - PRTKES(:,:,:)/PRHODJ(:,:,:) & & - PDP(:,:,:)- PTP(:,:,:) - PTDISS(:,:,:) -PRTKES(:,:,:) = ZRES(:,:,:) * PRHODJ(:,:,:) / PTSTEP +IF (LBUDGET_TKE) THEN + !Store the previous source terms in prtkes before initializing the next one + PRTKES(:,:,:) = PRTKES(:,:,:) + PRHODJ(:,:,:) * & + ( PDP(:,:,:) + PTP(:,:,:) & + - XCED * SQRT(PTKEM(:,:,:)) / PLEPS(:,:,:) * ( PEXPL*PTKEM(:,:,:) + PIMPL*ZRES(:,:,:) ) ) + +! CALL BUDGET_STORE_INIT( TBUDGETS(NBUDGET_TKE), 'TR', PRTKES(:, :, :) ) +END IF +PRTKES(:,:,:) = ZRES(:,:,:) * PRHODJ(:,:,:) / PTSTEP - ZRTKESM(:,:,:) ! ! stores the whole turbulent transport ! -IF (LBUDGET_TKE) CALL BUDGET_DDH (PRTKES(:,:,:),5,'TR_BU_RTKE',YDDDH, YDLDDH, YDMDDH) -! -! +!IF (LBUDGET_TKE) CALL BUDGET_STORE_END( TBUDGETS(NBUDGET_TKE), 'TR', PRTKES(:, :, :) ) + !---------------------------------------------------------------------------- ! !* 3. COMPUTE THE DISSIPATIVE HEATING @@ -369,60 +388,84 @@ IF (LBUDGET_TKE) CALL BUDGET_DDH (PRTKES(:,:,:),5,'TR_BU_RTKE',YDDDH, YDLDDH, YD ! PRTHLS(:,:,:) = PRTHLS(:,:,:) + XCED * SQRT(PTKEM(:,:,:)) / PLEPS(:,:,:) * & (PEXPL*PTKEM(:,:,:) + PIMPL*ZRES(:,:,:)) * PRHODJ(:,:,:) * PCOEF_DISS(:,:,:) -! + +!IF (LBUDGET_TH) CALL BUDGET_STORE_END( TBUDGETS(NBUDGET_TH), 'DISSH', PRTHLS(:, :, :) ) + !---------------------------------------------------------------------------- ! !* 4. STORES SOME DIAGNOSTICS ! ----------------------- ! -PEDR(:,:,:)=XCED * (PTKEM(:,:,:)**1.5) / PLEPS(:,:,:) - - - -IF ( OTURB_DIAG .AND. OCLOSE_OUT ) THEN +IF(PRESENT(PDISS)) PDISS(:,:,:) = -XCED * (PTKEM(:,:,:)**1.5) / PLEPS(:,:,:) +IF(PRESENT(PTR)) PTR=ZTR +IF(PRESENT(PEDR)) PEDR = XCED * (PTKEM(:,:,:)**1.5) / PLEPS(:,:,:) +! +IF ( OTURB_DIAG .AND. TPFILE%LOPENED ) THEN ! ! stores the dynamic production ! - YRECFM ='DP' - YCOMMENT='X_Y_Z_DP (M**2/S**3)' - IGRID = 1 - ILENCH=LEN(YCOMMENT) - CALL FMWRIT(HFMFILE,YRECFM,HLUOUT,'XY',PDP,IGRID,ILENCH,YCOMMENT,IRESP) + TZFIELD%CMNHNAME = 'DP' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'DP' + TZFIELD%CUNITS = 'm2 s-3' + TZFIELD%CDIR = 'XY' + TZFIELD%CCOMMENT = 'X_Y_Z_DP' + TZFIELD%NGRID = 1 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .TRUE. + CALL IO_FIELD_WRITE(TPFILE,TZFIELD,PDP) ! ! stores the thermal production ! - YRECFM ='TP' - YCOMMENT='X_Y_Z_TP (M**2/S**3)' - IGRID = 1 - ILENCH=LEN(YCOMMENT) - CALL FMWRIT(HFMFILE,YRECFM,HLUOUT,'XY',PTP,IGRID,ILENCH,YCOMMENT,IRESP) + TZFIELD%CMNHNAME = 'TP' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'TP' + TZFIELD%CUNITS = 'm2 s-3' + TZFIELD%CDIR = 'XY' + TZFIELD%CCOMMENT = 'X_Y_Z_TP' + TZFIELD%NGRID = 1 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .TRUE. + CALL IO_FIELD_WRITE(TPFILE,TZFIELD,PTP) ! ! stores the whole turbulent transport ! - YRECFM ='TR' - YCOMMENT='X_Y_Z_TR (M**2/S**3)' - IGRID = 1 - ILENCH=LEN(YCOMMENT) - CALL FMWRIT(HFMFILE,YRECFM,HLUOUT,'XY',ZTR,IGRID,ILENCH,YCOMMENT,IRESP) + TZFIELD%CMNHNAME = 'TR' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'TR' + TZFIELD%CUNITS = 'm2 s-3' + TZFIELD%CDIR = 'XY' + TZFIELD%CCOMMENT = 'X_Y_Z_TR' + TZFIELD%NGRID = 1 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .TRUE. + CALL IO_FIELD_WRITE(TPFILE,TZFIELD,ZTR) ! ! stores the dissipation of TKE ! - YRECFM ='DISS' - YCOMMENT='X_Y_Z_DISS (M**2/S**3)' - IGRID = 1 - ILENCH=LEN(YCOMMENT) - ZFLX(:,:,:) =-XCED * (PTKEM(:,:,:)**1.5) / PLEPS(:,:,:) - CALL FMWRIT(HFMFILE,YRECFM,HLUOUT,'XY',ZFLX,IGRID,ILENCH,YCOMMENT,IRESP) + TZFIELD%CMNHNAME = 'DISS' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'DISS' + TZFIELD%CUNITS = 'm2 s-3' + TZFIELD%CDIR = 'XY' + TZFIELD%CCOMMENT = 'X_Y_Z_DISS' + TZFIELD%NGRID = 1 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .TRUE. + CALL IO_FIELD_WRITE(TPFILE,TZFIELD,PDISS) END IF ! ! Storage in the LES configuration of the Dynamic Production of TKE and ! the dissipation of TKE ! IF (LLES_CALL ) THEN - ZFLX(:,:,:) =-XCED * (PTKEM(:,:,:)**1.5) / PLEPS(:,:,:) - CALL LES_MEAN_SUBGRID( ZFLX, X_LES_SUBGRID_DISS_Tke ) + CALL LES_MEAN_SUBGRID( PDISS, X_LES_SUBGRID_DISS_Tke ) END IF -! +! !---------------------------------------------------------------------------- ! ! diff --git a/src/arome/turb/turb.F90 b/src/common/turb/turb.F90 similarity index 97% rename from src/arome/turb/turb.F90 rename to src/common/turb/turb.F90 index 68fec59f8..aadb72fca 100644 --- a/src/arome/turb/turb.F90 +++ b/src/common/turb/turb.F90 @@ -17,8 +17,9 @@ & PHGRAD, PSIGS, & & PDRUS_TURB,PDRVS_TURB, & & PDRTHLS_TURB,PDRRTS_TURB,PDRSVS_TURB, & - & PFLXZTHVMF,PWTH,PWRC,PWSV,PDP,PTP,PTPMF,PTDIFF, & - & PTDISS,PEDR,YDDDH,YDLDDH,YDMDDH) + & PFLXZTHVMF,PWTH,PWRC,PWSV,PDP,PTP,PTPMF,PTDIFF,PTDISS,& + & YDDDH,YDLDDH,YDMDDH, & + & PTR,PDISS,PEDR ) USE PARKIND1, ONLY : JPRB USE YOMHOOK , ONLY : LHOOK, DR_HOOK @@ -223,6 +224,7 @@ USE MODD_CST USE MODD_CTURB USE MODD_CONF USE MODD_BUDGET +USE MODD_IO, ONLY: TFILEDATA USE MODD_LES USE MODD_NSV ! @@ -375,17 +377,17 @@ REAL, DIMENSION(:,:,:), INTENT(OUT) :: PTPMF ! Thermal TKE production REAL, DIMENSION(:,:,:), INTENT(OUT) :: PDP ! Dynamic TKE production REAL, DIMENSION(:,:,:), INTENT(OUT) :: PTDIFF ! Diffusion TKE term REAL, DIMENSION(:,:,:), INTENT(OUT) :: PTDISS ! Dissipation TKE term - - -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PEDR ! EDR - -TYPE(TYP_DDH), INTENT(INOUT) :: YDDDH -TYPE(TLDDH), INTENT(IN) :: YDLDDH -TYPE(TMDDH), INTENT(IN) :: YDMDDH +! +TYPE(TYP_DDH), INTENT(INOUT), TARGET :: YDDDH +TYPE(TLDDH), INTENT(IN), TARGET :: YDLDDH +TYPE(TMDDH), INTENT(IN), TARGET :: YDMDDH ! ! length scale from vdfexcu REAL, DIMENSION(:,:,:), INTENT(IN) :: PLENGTHM, PLENGTHH - +! +REAL, DIMENSION(:,:,:), INTENT(OUT), OPTIONAL :: PTR ! Transport production of TKE +REAL, DIMENSION(:,:,:), INTENT(OUT), OPTIONAL :: PDISS ! Dissipation of TKE +REAL, DIMENSION(:,:,:), INTENT(OUT), OPTIONAL :: PEDR ! EDR ! ! !------------------------------------------------------------------------------- @@ -445,6 +447,10 @@ REAL :: ZL0 ! Max. Mixing Length in Blakadar formula REAL :: ZALPHA ! proportionnality constant between Dz/2 and ! ! BL89 mixing length near the surface ! +! +TYPE(TFILEDATA) :: TPFILE ! File type to write fields for MesoNH +TYPE(TBUDGETDATA), DIMENSION(NBUDGET_RH) :: YLBUDGET !NBUDGET_RH is the one with the highest number +! REAL :: ZTIME1, ZTIME2 REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)):: ZSHEAR, ZDUDZ, ZDVDZ ! @@ -463,6 +469,12 @@ IF (LHARAT .AND. LLES_CALL) THEN CALL ABOR1('LHARATU not implemented for option LLES_CALL') ENDIF +DO JRR=1, NBUDGET_RH + YLBUDGET(JRR)%NBUDGET=JRR + YLBUDGET(JRR)%YDDDH=>YDDDH + YLBUDGET(JRR)%YDLDDH=>YDLDDH + YLBUDGET(JRR)%YDMDDH=>YDMDDH +ENDDO IKT=SIZE(PTHLM,3) IKTB=1+JPVEXT_TURB @@ -481,7 +493,7 @@ ZRM(:,:,:,:) = PRM(:,:,:,:) ! !---------------------------------------------------------------------------- ! -!* 2. COMPUTE CONSERVATIVE VARIABLES AND RELATED QUANTITIES +!* 2. COMPUTE CONSERVATIVE VARIABLES AE0___PROC1 et Q0___PROC1ND RELATED QUANTITIES ! ----------------------------------------------------- ! !* 2.1 Cph at t @@ -914,14 +926,14 @@ IF (LBUDGET_RI) CALL BUDGET_DDH (PRRS(:,:,:,4),9,'HTURB_BU_RRI',YDDDH, YDLDDH, Y IF (.NOT. LHARAT) THEN - CALL TKE_EPS_SOURCES(KKA,KKU,KKL,KMI,PTKEM,ZLM,ZLEPS,PDP,ZTRH, & & PRHODJ,PDZZ,PDXX,PDYY,PDZX,PDZY,PZZ, & & PTSTEP_MET,PIMPL,ZEXPL, & & HTURBLEN,HTURBDIM, & - & HFMFILE,HLUOUT,OCLOSE_OUT,OTURB_DIAG, & - & PTP,PRTKES,PRTHLS,ZCOEF_DISS,PTDIFF, & - & PTDISS,PEDR,YDDDH, YDLDDH, YDMDDH) + & TPFILE,OTURB_DIAG, & + & PTP,PRTKES,PRTHLS,ZCOEF_DISS,PTDIFF,PTDISS,& + & PEDR, YDDDH, YDLDDH, YDMDDH, & +TBUDGETS=YLBUDGET, KBUDGETS=SIZE(YLBUDGET)) IF (LBUDGET_TH) THEN IF ( KRRI >= 1 .AND. KRRL >= 1 ) THEN CALL BUDGET_DDH (PRTHLS+ ZLVOCPEXNM * PRRS(:,:,:,2) + ZLSOCPEXNM * PRRS(:,:,:,4),4,'DISSH_BU_RTH',YDDDH, YDLDDH, YDMDDH) -- GitLab