diff --git a/LIBTOOLS/tools/lfi2cdf/src/lfi2cdf.f90 b/LIBTOOLS/tools/lfi2cdf/src/lfi2cdf.f90 index 39bb56a69b1e50141bc39db8f2236a956355faac..1068048830601efb23f77363874bc2d493a6f58f 100644 --- a/LIBTOOLS/tools/lfi2cdf/src/lfi2cdf.f90 +++ b/LIBTOOLS/tools/lfi2cdf/src/lfi2cdf.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1994-2020 CNRS, Meteo-France and Universite Paul Sabatier +!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. @@ -91,7 +91,7 @@ program LFI2CDF CALL IO_Config_set() END IF - CALL INI_FIELD_LIST(1) + CALL INI_FIELD_LIST() CALL OPEN_FILES(infiles, outfiles, nfiles_out, hinfile, houtfile, nbvar_infile, options, runmode) IF (options(OPTLIST)%set) STOP diff --git a/LIBTOOLS/tools/lfi2cdf/src/mode_util.f90 b/LIBTOOLS/tools/lfi2cdf/src/mode_util.f90 index 5bca2401c4b91d7ce1ea9902cdcf70e017a85c74..d60a7fc7915b113d992c374768bf389b3c719d82 100644 --- a/LIBTOOLS/tools/lfi2cdf/src/mode_util.f90 +++ b/LIBTOOLS/tools/lfi2cdf/src/mode_util.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1994-2020 CNRS, Meteo-France and Universite Paul Sabatier +!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. @@ -15,7 +15,7 @@ ! P. Wautelet 10/11/2020: new data structures for netCDF dimensions !----------------------------------------------------------------- MODULE mode_util - use modd_field, only: tfielddata, tfieldlist + use modd_field, only: tfieldmetadata, tfieldlist USE MODD_IO, ONLY: TFILEDATA, TFILE_ELT USE MODD_NETCDF, ONLY: CDFINT, tdimnc USE MODD_PARAMETERS, ONLY: NLFIMAXCOMMENTLENGTH, NMNHNAMELGTMAX @@ -56,7 +56,7 @@ MODULE mode_util INTEGER(kind=CDFINT) :: NTYPE_FILE ! netCDF datatype (NF90_CHAR, NF90_INT...) (as present in input file) INTEGER,DIMENSION(MAXRAW) :: src ! List of variables used to compute the variable (needed only if calc=.true.) INTEGER :: tgt ! Target: id of the variable that use it (calc variable) - TYPE(TFIELDDATA) :: TFIELD ! Metadata about the field + TYPE(TFIELDMETADATA) :: TFIELD ! Metadata about the field TYPE(tdimnc),DIMENSION(:),ALLOCATABLE :: TDIMS ! Dimensions of the field END TYPE workfield @@ -388,7 +388,7 @@ END DO ELSE CALL FIND_FIELD_ID_FROM_MNHNAME(tpreclist(ji)%name,IID,IRESP,ONOWARNING=.TRUE.) IF (IRESP==0) THEN - tpreclist(ji)%TFIELD = TFIELDLIST(IID) + tpreclist(ji)%TFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) ! Determine TDIMS IF (runmode==MODELFI2CDF) THEN ALLOCATE(tpreclist(ji)%TDIMS(tpreclist(ji)%TFIELD%NDIMS)) diff --git a/bin/spl b/bin/spl index 7d6e4158a71aa63d389d478fddea810e60155cdd..9497c5b36db85b558539f03e36940ab7843ccfe7 100755 --- a/bin/spl +++ b/bin/spl @@ -1,7 +1,7 @@ #!/bin/bash -#MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +#MNH_LIC Copyright 1995-2022 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 version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt #MNH_LIC for details. version 1. #set -x # HP-UX 10 @@ -83,6 +83,7 @@ fi # #modified by C. Fischer to split fortran 77 (26/04/95) #modified by C. Fischer to correct a bug PROGRAM-CONTAINS (16/02/96) +#modified by P. Wautelet to add support for PURE and ELEMENTAL functions and subroutines (30/11/2022) # #.SH COPYRIGHT # @@ -153,7 +154,55 @@ awk ' } { if((i_conta) != "open") { - { if((substr(u1,1,9)) == "RECURSIVE") + { if((substr(u1,1,9)) == "ELEMENTAL") + { if((substr(u2,1,10)) == "SUBROUTINE") + { split(u3,p_name,"("); + l_name=(tolower(p_name[1])); + split((l_name),e_name,"$"); + f_name=(e_name[1]) (e_name[2]) ".f90"; + print (f_name); i_flag="bof"; + print "! ######spl" > (f_name); + n_unit=(n_unit) + 0 + } + } + } + { if((substr(u1,1,9)) == "ELEMENTAL") + { if((substr(u2,1,8)) == "FUNCTION") + { split(u3,p_name,"("); + l_name=(tolower(p_name[1])); + split((l_name),e_name,"$"); + f_name=(e_name[1]) (e_name[2]) ".f90"; + print (f_name); i_flag="bof"; + print "! ######spl" > (f_name); + n_unit=(n_unit) + 0 + } + } + } + { if((substr(u1,1,4)) == "PURE") + { if((substr(u2,1,10)) == "SUBROUTINE") + { split(u3,p_name,"("); + l_name=(tolower(p_name[1])); + split((l_name),e_name,"$"); + f_name=(e_name[1]) (e_name[2]) ".f90"; + print (f_name); i_flag="bof"; + print "! ######spl" > (f_name); + n_unit=(n_unit) + 0 + } + } + } + { if((substr(u1,1,4)) == "PURE") + { if((substr(u2,1,8)) == "FUNCTION") + { split(u3,p_name,"("); + l_name=(tolower(p_name[1])); + split((l_name),e_name,"$"); + f_name=(e_name[1]) (e_name[2]) ".f90"; + print (f_name); i_flag="bof"; + print "! ######spl" > (f_name); + n_unit=(n_unit) + 0 + } + } + } + { if((substr(u1,1,9)) == "RECURSIVE") { if((substr(u2,1,10)) == "SUBROUTINE") { split(u3,p_name,"("); l_name=(tolower(p_name[1])); @@ -164,8 +213,8 @@ awk ' n_unit=(n_unit) + 0 } } - } - { if((substr(u1,1,9)) == "RECURSIVE") + } + { if((substr(u1,1,9)) == "RECURSIVE") { if((substr(u2,1,8)) == "FUNCTION") { split(u3,p_name,"("); l_name=(tolower(p_name[1])); @@ -176,7 +225,7 @@ awk ' n_unit=(n_unit) + 0 } } - } + } { if((substr(u1,1,10)) == "SUBROUTINE") { split(u2,p_name,"("); l_name=(tolower(p_name[1])); @@ -200,12 +249,32 @@ awk ' } else { - { if((substr(u1,1,9)) == "RECURSIVE") + { if((substr(u1,1,9)) == "ELEMENTAL") + { if((substr(u2,1,10)) == "SUBROUTINE") + { n_unit=(n_unit) + 1 } + } + } + { if((substr(u1,1,9)) == "ELEMENTAL") + { if((substr(u2,1,8)) == "FUNCTION") + { n_unit=(n_unit) + 1 } + } + } + { if((substr(u1,1,4)) == "PURE") + { if((substr(u2,1,10)) == "SUBROUTINE") + { n_unit=(n_unit) + 1 } + } + } + { if((substr(u1,1,4)) == "PURE") + { if((substr(u2,1,8)) == "FUNCTION") + { n_unit=(n_unit) + 1 } + } + } + { if((substr(u1,1,9)) == "RECURSIVE") { if((substr(u2,1,10)) == "SUBROUTINE") { n_unit=(n_unit) + 1 } } } - { if((substr(u1,1,9)) == "RECURSIVE") + { if((substr(u1,1,9)) == "RECURSIVE") { if((substr(u2,1,8)) == "FUNCTION") { n_unit=(n_unit) + 1 } } diff --git a/src/LIB/FOREFIRE/coupling_forefiren.f90 b/src/LIB/FOREFIRE/coupling_forefiren.f90 index 8d5dde80b6873f4caa1f040cbe0233a4a72d1e72..0791f7f1cca1272e036f8a3d32cfd1ea5bec888d 100644 --- a/src/LIB/FOREFIRE/coupling_forefiren.f90 +++ b/src/LIB/FOREFIRE/coupling_forefiren.f90 @@ -1,8 +1,9 @@ -!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1994-2022 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 version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. -!############################## +!----------------------------------------------------------------- +!############################## MODULE MODI_COUPLING_FOREFIRE_n !############################## @@ -82,20 +83,20 @@ INTEGER :: JSV PSFTQ(:, :) = PSFTQ(:, :) + FF_VAPORFLUX(:, :) DO JSV = 1, NSV_FF - CALL MNH_GET_DOUBLEARRAY(sScalarVariables(JSV), FF_SVFLUXES(:, :, JSV), FF_MATRIXSIZE, 1) + CALL MNH_GET_DOUBLEARRAY(sScalarVariables(JSV), FF_SVFLUXES(:, :, JSV), FF_MATRIXSIZE, 1) PSFSV(:, :, NSV_FFBEG-1+JSV) = PSFSV(:, :, NSV_FFBEG-1+JSV) + FF_SVFLUXES(:, :, JSV) END DO - + IF ( LFFCHEM ) THEN DO JSV = 1, NFFCHEMVAR - CALL MNH_GET_DOUBLEARRAY(sChemicalVariables(JSV), FF_CVFLUXES(:, :, JSV), FF_MATRIXSIZE, 1) + CALL MNH_GET_DOUBLEARRAY(sChemicalVariables(JSV), FF_CVFLUXES(:, :, JSV), FF_MATRIXSIZE, 1) PSFSV(:, :, FF_CHEMINDICES(JSV)) = PSFSV(:, :, FF_CHEMINDICES(JSV)) + FF_CVFLUXES(:, :, JSV) END DO ENDIF END SUBROUTINE COUPLING_FOREFIRE_n - + !############################################## SUBROUTINE SEND_GROUND_WIND_n (U, V, KG, IINFO) !############################################## @@ -138,7 +139,7 @@ TYPE(LIST_ll), POINTER :: FOREFIREFIELD_ll ! list of fields to exc FFOUTERWINDV(2,JFF) = V(3,JFF,KG) FFOUTERWINDV(FF_NX-1,JFF) = V(FF_NX-2,JFF,KG) END DO - + VAL1 = INT(U(2,3,KG)*FFMULT+0.5) VAL2 = INT(U(3,3,KG)*FFMULT+0.5) VAL3 = INT(U(3,2,KG)*FFMULT+0.5) @@ -176,8 +177,8 @@ TYPE(LIST_ll), POINTER :: FOREFIREFIELD_ll ! list of fields to exc FFOUTERWINDV(FF_NX-1,FF_NY-1) = VAL1*FFMULT*FFMULT*100 + VAL2*FFMULT*10 + VAL3 NULLIFY(FOREFIREFIELD_ll) - CALL ADD2DFIELD_ll(FOREFIREFIELD_ll,FFOUTERWINDU) - CALL ADD2DFIELD_ll(FOREFIREFIELD_ll,FFOUTERWINDV) + CALL ADD2DFIELD_ll( FOREFIREFIELD_ll, FFOUTERWINDU, 'SEND_GROUND_WIND_n::FFOUTERWINDU' ) + CALL ADD2DFIELD_ll( FOREFIREFIELD_ll, FFOUTERWINDV, 'SEND_GROUND_WIND_n::FFOUTERWINDV' ) CALL UPDATE_HALO_ll(FOREFIREFIELD_ll,IINFO) CALL CLEANLIST_ll(FOREFIREFIELD_ll) CALL MNH_PUT_DOUBLEARRAY(sOutWindU, FF_TIME, FFOUTERWINDU, FF_MATRIXSIZE, 1) @@ -185,7 +186,7 @@ TYPE(LIST_ll), POINTER :: FOREFIREFIELD_ll ! list of fields to exc END SUBROUTINE SEND_GROUND_WIND_n - + !##################################### SUBROUTINE FOREFIRE_RECEIVE_PARAL_n () !##################################### @@ -208,7 +209,7 @@ IMPLICIT NONE END SUBROUTINE FOREFIRE_RECEIVE_PARAL_n - + !####################################### SUBROUTINE FOREFIRE_SEND_PARAL_n (IINFO) !####################################### @@ -238,18 +239,18 @@ TYPE(LIST_ll), POINTER :: FOREFIREFIELD_ll ! list of fields to exch !* Calling the MNH parallel routines for the forefire-related variables ! NULLIFY(FOREFIREFIELD_ll) - CALL ADD3DFIELD_ll(FOREFIREFIELD_ll, FFNODES_POSX) - CALL ADD3DFIELD_ll(FOREFIREFIELD_ll, FFNODES_POSY) - CALL ADD3DFIELD_ll(FOREFIREFIELD_ll, FFNODES_VELX) - CALL ADD3DFIELD_ll(FOREFIREFIELD_ll, FFNODES_VELY) - CALL ADD3DFIELD_ll(FOREFIREFIELD_ll, FFNODES_TIME) - CALL ADD3DFIELD_ll(FOREFIREFIELD_ll, FFNODES_ID) + CALL ADD3DFIELD_ll(FOREFIREFIELD_ll, FFNODES_POSX, 'FOREFIRE_SEND_PARAL_n::FFNODES_POSX' ) + CALL ADD3DFIELD_ll(FOREFIREFIELD_ll, FFNODES_POSY, 'FOREFIRE_SEND_PARAL_n::FFNODES_POSY' ) + CALL ADD3DFIELD_ll(FOREFIREFIELD_ll, FFNODES_VELX, 'FOREFIRE_SEND_PARAL_n::FFNODES_VELX' ) + CALL ADD3DFIELD_ll(FOREFIREFIELD_ll, FFNODES_VELY, 'FOREFIRE_SEND_PARAL_n::FFNODES_VELY' ) + CALL ADD3DFIELD_ll(FOREFIREFIELD_ll, FFNODES_TIME, 'FOREFIRE_SEND_PARAL_n::FFNODES_TIME' ) + CALL ADD3DFIELD_ll(FOREFIREFIELD_ll, FFNODES_ID, 'FOREFIRE_SEND_PARAL_n::FFNODES_ID' ) CALL UPDATE_HALO_ll(FOREFIREFIELD_ll, IINFO) CALL CLEANLIST_ll(FOREFIREFIELD_ll) END SUBROUTINE FOREFIRE_SEND_PARAL_n - - + + !##################################################### SUBROUTINE FOREFIRE_DUMP_FIELDS_n(U, V, W, MNHSV, TH & , R, PABS, TKE, NX, NY, NZ) @@ -280,7 +281,7 @@ INTEGER :: JSV FF3DOUT = 1 FFNUMOUT = FFNUMOUT + 1 END IF - + IF ( FF3DOUTPUTSFLOW .AND. FF3DOUT.EQ.1 ) THEN CALL MNH_DUMP_DOUBLEARRAY(FFNMODEL, PROCID, sU, FF_TIME, U, NX*NY*NZ, NX, NY, NZ, 1) CALL MNH_DUMP_DOUBLEARRAY(FFNMODEL, PROCID, sV, FF_TIME, V, NX*NY*NZ, NX, NY, NZ, 1) @@ -290,14 +291,14 @@ INTEGER :: JSV , FF_TIME, MNHSV(:, :, :, NSV_FFBEG-1+JSV), NX*NY*NZ, NX, NY, NZ, 1) END DO END IF - + IF ( FF3DOUTPUTSPHYS .AND. FF3DOUT.EQ.1 ) THEN CALL MNH_DUMP_DOUBLEARRAY(FFNMODEL, PROCID, sT, FF_TIME, TH, NX*NY*NZ, NX, NY, NZ, 1) CALL MNH_DUMP_DOUBLEARRAY(FFNMODEL, PROCID, sMoist, FF_TIME, R, NX*NY*NZ, NX, NY, NZ, 1) CALL MNH_DUMP_DOUBLEARRAY(FFNMODEL, PROCID, sP, FF_TIME, PABS, NX*NY*NZ, NX, NY, NZ, 1) CALL MNH_DUMP_DOUBLEARRAY(FFNMODEL, PROCID, sTKE, FF_TIME, TKE, NX*NY*NZ, NX, NY, NZ, 1) END IF - + IF ( LFFCHEM .AND. FF3DOUTPUTSCHEM .AND. FF3DOUT.EQ.1 ) THEN DO JSV = 1, NFFCHEMVAR CALL MNH_DUMP_DOUBLEARRAY(FFNMODEL, PROCID, cast_char_to_c(CNAMES(FF_CHEMINDICES(JSV))) & @@ -308,7 +309,7 @@ INTEGER :: JSV , FF_TIME, MNHSV(:, :, :, FF_CHEMINDOUT(JSV)), NX*NY*NZ, NX, NY, NZ, 1) END DO END IF - + FF3DOUT = 0 END SUBROUTINE FOREFIRE_DUMP_FIELDS_n diff --git a/src/LIB/SURCOUCHE/src/modd_field.f90 b/src/LIB/SURCOUCHE/src/modd_field.f90 index cf3e014068caca76b99fbcba63b96680894a39d6..2c91243c5e593f0286efda9ca9543def70cd5a76 100644 --- a/src/LIB/SURCOUCHE/src/modd_field.f90 +++ b/src/LIB/SURCOUCHE/src/modd_field.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2016-2020 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2016-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. @@ -9,14 +9,17 @@ ! P. Wautelet 12/04/2019: added pointers for C1D, L1D, N1D, X5D and X6D structures in TFIELDDATA ! P. Wautelet 12/07/2019: add pointers for T1D structure in TFIELDDATA ! P. Wautelet 23/01/2020: split in modd_field.f90 and mode_field.f90 -! P. Wautelet 27/01/2020: create the tfield_metadata_base abstract datatype -! P. Wautelet 14/09/2020: add ndimlist field to tfield_metadata_base +! P. Wautelet 27/01/2020: create the tfieldmetadata_base abstract datatype +! P. Wautelet 14/09/2020: add ndimlist field to tfieldmetadata_base ! P. Wautelet 10/11/2020: new data structures for netCDF dimensions +! P. Wautelet 24/09/2021: add Fill_tfielddata and use it as a custom constructor for tfielddata type ! P. Wautelet 08/10/2021: add 2 new dimensions: LW_bands (NMNHDIM_NLWB) and SW_bands (NMNHDIM_NSWB) +! P. Wautelet 14/10/2021: dynamically allocate tfieldlist (+ reallocate if necessary) +! P. Wautelet 04/11/2021: add TFIELDMETADATA type !----------------------------------------------------------------- module modd_field -use modd_parameters, only: NGRIDUNKNOWN, NMNHNAMELGTMAX, NSTDNAMELGTMAX +use modd_parameters, only: NGRIDUNKNOWN, NMNHNAMELGTMAX, NSTDNAMELGTMAX, NLONGNAMELGTMAX, NUNITLGTMAX, NCOMMENTLGTMAX use modd_type_date, only: date_time #ifdef MNH_IOCDF4 use NETCDF, only: NF90_FILL_INT, NF90_FILL_REAL @@ -25,9 +28,11 @@ use NETCDF, only: NF90_FILL_INT, NF90_FILL_REAL implicit none integer, parameter :: NMNHMAXDIMS = 6 ! Cannot be less than 6 -INTEGER,PARAMETER :: MAXFIELDS = 250 INTEGER,PARAMETER :: TYPEUNDEF = -1, TYPEINT = 1, TYPELOG = 2, TYPEREAL = 3, TYPECHAR = 4, TYPEDATE = 5 ! +INTEGER, PARAMETER :: NMAXFIELDINIT = 200 !Initial maximum number of fields in tfieldlist +INTEGER, PARAMETER :: NMAXFIELDSTEP = 50 !Number of fields to add each time tfieldlist is too small + integer, parameter :: NMNHDIM_UNKNOWN = -2 !For efficient use of memory, it is better that all values for real dimensions be contiguous @@ -114,6 +119,8 @@ integer, dimension(0:8,3), parameter :: NMNHDIM_ARAKAWA = reshape( [ & NMNHDIM_NI_U, NMNHDIM_NJ_V, NMNHDIM_LEVEL_W] & ! fw point (=uvw point) , shape = [ 9, 3 ], order = [ 2, 1 ] ) +INTEGER, SAVE :: NMAXFIELDS !Maximum number of fields in tfieldlist (value is automatically increased if too small) + TYPE TFIELDPTR_C0D CHARACTER(LEN=:), POINTER :: DATA => NULL() END TYPE TFIELDPTR_C0D @@ -182,12 +189,12 @@ TYPE TFIELDPTR_T1D TYPE(DATE_TIME), DIMENSION(:), POINTER :: DATA => NULL() END TYPE TFIELDPTR_T1D ! -type :: tfield_metadata_base - 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) +type :: tfieldmetadata_base + CHARACTER(LEN=NMNHNAMELGTMAX) :: CMNHNAME = '' !Name of the field (for MesoNH, non CF convention) + CHARACTER(LEN=NSTDNAMELGTMAX) :: CSTDNAME = '' !Standard name (CF convention) + CHARACTER(LEN=NLONGNAMELGTMAX) :: CLONGNAME = '' !Long name (CF convention) + CHARACTER(LEN=NUNITLGTMAX) :: CUNITS = '' !Canonical units (CF convention) + CHARACTER(LEN=NCOMMENTLGTMAX) :: 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 @@ -207,13 +214,17 @@ type :: tfield_metadata_base 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 -end type tfield_metadata_base +end type tfieldmetadata_base -!Structure describing the characteristics of a field -TYPE, extends( tfield_metadata_base ) :: TFIELDDATA +TYPE, extends( tfieldmetadata_base ) :: TFIELDMETADATA 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 TFIELDMETADATA + +!Structure describing the characteristics of a field +TYPE, EXTENDS( TFIELDMETADATA ) :: TFIELDDATA + INTEGER :: NMODELMAX = -1 !Number of models for which the field has been allocated (default value must be negative) ! TYPE(TFIELDPTR_C0D),DIMENSION(:),ALLOCATABLE :: TFIELD_C0D !Pointer to the character string fields (one per nested mesh) TYPE(TFIELDPTR_C1D),DIMENSION(:),ALLOCATABLE :: TFIELD_C1D !Pointer to the character string 1D fields (one per nested mesh) @@ -238,8 +249,358 @@ TYPE, extends( tfield_metadata_base ) :: TFIELDDATA TYPE(TFIELDPTR_T1D),DIMENSION(:),ALLOCATABLE :: TFIELD_T1D !Pointer to the date/time 1D fields (one per nested mesh) END TYPE TFIELDDATA ! -integer, save :: NMODEL_ALLOCATED +integer, save :: NFIELDS_USED = 0 LOGICAL, SAVE :: LFIELDLIST_ISINIT = .FALSE. -TYPE(TFIELDDATA),DIMENSION(MAXFIELDS),SAVE :: TFIELDLIST +TYPE(TFIELDDATA), ALLOCATABLE, DIMENSION(:), SAVE :: TFIELDLIST + +interface TFIELDMETADATA + module procedure :: Fill_tfieldmetadata + module procedure :: Fill_tfieldmetadata_from_tfielddata +end interface TFIELDMETADATA + +interface TFIELDDATA + module procedure :: Fill_tfielddata +end interface TFIELDDATA + +contains + +type(tfieldmetadata) function Fill_tfieldmetadata( cmnhname, cstdname, clongname, cunits, ccomment, & + ngrid, ntype, ndims, ndimlist, & + nfillvalue, xfillvalue, nvalidmin, nvalidmax, xvalidmin, xvalidmax, & + cdir, clbtype, ltimedep ) result(tpfield) + + use mode_msg + + character(len=*), optional, intent(in) :: cmnhname + character(len=*), optional, intent(in) :: cstdname + character(len=*), optional, intent(in) :: clongname + character(len=*), optional, intent(in) :: cunits + character(len=*), optional, intent(in) :: ccomment + integer, optional, intent(in) :: ngrid + integer, intent(in) :: ntype + integer, optional, intent(in) :: ndims + integer, dimension(:), optional, intent(in) :: ndimlist + integer, optional, intent(in) :: nfillvalue + real, optional, intent(in) :: xfillvalue + integer, optional, intent(in) :: nvalidmin + integer, optional, intent(in) :: nvalidmax + real, optional, intent(in) :: xvalidmin + real, optional, intent(in) :: xvalidmax + + character(len=*), optional, intent(in) :: cdir + character(len=*), optional, intent(in) :: clbtype + logical, optional, intent(in) :: ltimedep + + character(len=:), allocatable :: ymnhname + + ! cmnhname + if ( Present( cmnhname ) ) then + tpfield%cmnhname = cmnhname + if ( Len_trim(cmnhname) > NMNHNAMELGTMAX ) & + call Print_msg( NVERB_WARNING, 'GEN', 'Fill_tfielddata', & + 'cmnhname was truncated to ' // Trim( tpfield%cmnhname ) // ' from ' // Trim( cmnhname ) ) + ymnhname = Trim( cmnhname ) + else + ymnhname = 'unknown mnhname' + end if + + ! cstdname + if ( Present( cstdname ) ) then + tpfield%cstdname = cstdname + if ( Len_trim(cstdname) > NSTDNAMELGTMAX ) & + call Print_msg( NVERB_WARNING, 'GEN', 'Fill_tfielddata', & + 'cstdname was truncated to ' // Trim( tpfield%cstdname ) // ' from ' // Trim( cstdname ) & + // ' for variable ' // Trim( ymnhname ) ) + end if + + ! clongname + if ( Present( clongname ) ) then + tpfield%clongname = clongname + if ( Len_trim(clongname) > NLONGNAMELGTMAX ) & + call Print_msg( NVERB_WARNING, 'GEN', 'Fill_tfielddata', & + 'clongname was truncated to ' // Trim( tpfield%clongname ) // ' from ' // Trim( clongname ) & + // ' for variable ' // Trim( ymnhname ) ) + end if + + ! cunits + if ( Present( cunits ) ) then + tpfield%cunits = cunits + if ( Len_trim(cunits) > NUNITLGTMAX ) & + call Print_msg( NVERB_WARNING, 'GEN', 'Fill_tfielddata', & + 'cunits was truncated to ' // Trim( tpfield%cunits ) // ' from ' // Trim( cunits ) & + // ' for variable ' // Trim( ymnhname ) ) + end if + + ! ccomment + if ( Present( ccomment ) ) then + tpfield%ccomment = ccomment + if ( Len_trim(ccomment) > NCOMMENTLGTMAX ) & + call Print_msg( NVERB_WARNING, 'GEN', 'Fill_tfielddata', & + 'ccomment was truncated to ' // Trim( tpfield%ccomment ) // ' from ' // Trim( ccomment ) ) + end if + + ! ngrid + if ( Present( ngrid ) ) then + if ( ngrid /= NGRIDUNKNOWN .and. ngrid < 0 .and. ngrid > 8 ) then + call Print_msg( NVERB_ERROR, 'GEN', 'Fill_tfielddata', & + 'invalid value of ngrid for variable ' // Trim( ymnhname ) ) + else + tpfield%ngrid = ngrid + end if + end if + + ! ntype + if ( All( ntype /= [ TYPEINT, TYPELOG, TYPEREAL, TYPECHAR, TYPEDATE ] ) ) & + call Print_msg( NVERB_ERROR, 'GEN', 'Fill_tfielddata', & + 'invalid value of ntype for variable ' // Trim( ymnhname ) ) + tpfield%ntype = ntype + + ! ndims + if ( Present( ndims ) ) then + select case ( ntype ) + case ( TYPECHAR ) + if ( ndims < 0 .or. ndims > 1 ) & + call Print_msg( NVERB_ERROR, 'GEN', 'Fill_tfielddata', 'invalid value of ndims for variable ' & + // Trim( ymnhname ) // ' of type TYPECHAR' ) + case ( TYPELOG ) + if ( ndims < 0 .or. ndims > 1 ) & + call Print_msg( NVERB_ERROR, 'GEN', 'Fill_tfielddata', 'invalid value of ndims for variable ' & + // Trim( ymnhname ) // ' of type TYPELOG' ) + case ( TYPEINT ) + if ( ndims < 0 .or. ndims > 3 ) & + call Print_msg( NVERB_ERROR, 'GEN', 'Fill_tfielddata', 'invalid value of ndims for variable ' & + // Trim( ymnhname ) // ' of type TYPEINT' ) + case ( TYPEREAL ) + if ( ndims < 0 .or. ndims > 6 ) & + call Print_msg( NVERB_ERROR, 'GEN', 'Fill_tfielddata', 'invalid value of ndims for variable ' & + // Trim( ymnhname ) // ' of type TYPEREAL' ) + case ( TYPEDATE ) + if ( ndims < 0 .or. ndims > 1 ) & + call Print_msg( NVERB_ERROR, 'GEN', 'Fill_tfielddata', 'invalid value of ndims for variable ' & + // Trim( ymnhname ) // ' of type TYPEDATE' ) + case default + call Print_msg( NVERB_ERROR, 'GEN', 'Fill_tfielddata', & + 'invalid value of ntype for variable ' // Trim( ymnhname ) ) + + end select + tpfield%ndims = ndims + end if + + ! ndimlist + if ( Present( ndimlist ) ) then + if ( Size( ndimlist ) /= ndims ) & + call Print_msg( NVERB_ERROR, 'GEN', 'Fill_tfielddata', 'ndimlist size different of ndims for variable ' // Trim( ymnhname ) ) + + tpfield%ndimlist(1:ndims) = ndimlist(:) + tpfield%ndimlist(ndims+1:) = NMNHDIM_UNUSED + else + !If ndimlist is not provided, it is possible to fill it if some information is available + if ( Present( cdir ) ) then + if ( cdir == 'XY' ) then + if ( ndims == 2 ) then + tpfield%ndimlist(1:2) = NMNHDIM_ARAKAWA(ngrid,1:2) + else if ( ndims == 3 ) then + tpfield%ndimlist(1:3) = NMNHDIM_ARAKAWA(ngrid,1:3) + else + call Print_msg( NVERB_DEBUG, 'GEN', 'Fill_tfielddata', 'ndimlist not filled for variable ' // Trim( ymnhname ) ) + end if + else + call Print_msg( NVERB_DEBUG, 'GEN', 'Fill_tfielddata', 'ndimlist not filled for variable ' // Trim( ymnhname ) ) + end if + else + call Print_msg( NVERB_DEBUG, 'GEN', 'Fill_tfielddata', 'ndimlist not filled for variable ' // Trim( ymnhname ) ) + end if + end if + if ( Present( ltimedep ) ) then + if ( ltimedep ) then + if ( ndims == NMNHMAXDIMS ) & + call Print_msg( NVERB_ERROR, 'GEN', 'Fill_tfielddata', & + 'ltimedep=T not possible if ndims=NMNHMAXDIMS for variable ' // Trim( ymnhname ) ) + !Set this dimension only if ndimlist already filled up or ndims = 0 + if ( ndims == 0 ) then + tpfield%ndimlist( ndims + 1 ) = NMNHDIM_TIME + else if ( tpfield%ndimlist(ndims) /= NMNHDIM_UNKNOWN ) then + tpfield%ndimlist( ndims + 1 ) = NMNHDIM_TIME + end if + end if + end if + + ! nfillvalue + if ( Present( nfillvalue ) ) then + if ( ntype /= TYPEINT ) & + call Print_msg( NVERB_WARNING, 'GEN', 'Fill_tfielddata', & + 'nfillvalue provided for the non-integer variable ' // Trim( ymnhname ) ) + tpfield%nfillvalue = nfillvalue + end if + + ! xfillvalue + if ( Present( xfillvalue ) ) then + if ( ntype /= TYPEREAL ) & + call Print_msg( NVERB_WARNING, 'GEN', 'Fill_tfielddata', & + 'xfillvalue provided for the non-real variable ' // Trim( ymnhname ) ) + tpfield%xfillvalue = xfillvalue + end if + + ! nvalidmin + if ( Present( nvalidmin ) ) then + if ( ntype /= TYPEINT ) & + call Print_msg( NVERB_WARNING, 'GEN', 'Fill_tfielddata', & + 'nvalidmin provided for the non-integer variable ' // Trim( ymnhname ) ) + tpfield%nvalidmin = nvalidmin + end if + + ! nvalidmax + if ( Present( nvalidmax ) ) then + if ( ntype /= TYPEINT ) & + call Print_msg( NVERB_WARNING, 'GEN', 'Fill_tfielddata', & + 'nvalidmax provided for the non-integer variable ' // Trim( ymnhname ) ) + if ( Present( nvalidmin ) ) then + if ( nvalidmax < nvalidmin ) & + call Print_msg( NVERB_WARNING, 'GEN', 'Fill_tfielddata', 'nvalidmax < nvalidmin for variable ' // Trim( ymnhname ) ) + end if + tpfield%nvalidmax = nvalidmax + end if + + ! xvalidmin + if ( Present( xvalidmin ) ) then + if ( ntype /= TYPEREAL ) & + call Print_msg( NVERB_WARNING, 'GEN', 'Fill_tfielddata', & + 'xvalidmin provided for the non-real variable ' // Trim( ymnhname ) ) + tpfield%xvalidmin = xvalidmin + end if + + ! xvalidmax + if ( Present( xvalidmax ) ) then + if ( ntype /= TYPEREAL ) & + call Print_msg( NVERB_WARNING, 'GEN', 'Fill_tfielddata', & + 'xvalidmax provided for the non-real variable ' // Trim( ymnhname ) ) + if ( Present( xvalidmin ) ) then + if ( xvalidmax < xvalidmin ) & + call Print_msg( NVERB_WARNING, 'GEN', 'Fill_tfielddata', 'xvalidmax < xvalidmin for variable ' // Trim( ymnhname ) ) + end if + tpfield%xvalidmax = xvalidmax + end if + + ! cdir + if ( Present( cdir ) ) then + if ( Any( cdir == [ ' ', '--', 'XX', 'XY', 'YY', 'ZZ' ] ) ) then + tpfield%cdir = cdir + else + call Print_msg( NVERB_ERROR, 'GEN', 'Fill_tfielddata', & + 'invalid value of cdir (' // Trim( cdir ) // ') for variable ' // Trim( ymnhname ) ) + end if + end if + + ! clbtype + if ( Present( clbtype ) ) then + if ( Any( clbtype == [ 'NONE', 'LBX ', 'LBXU', 'LBY ', 'LBYV' ] ) ) then + tpfield%clbtype = clbtype + else + call Print_msg( NVERB_ERROR, 'GEN', 'Fill_tfielddata', & + 'invalid value of clbtype (' // Trim( clbtype ) // ') for variable ' // Trim( ymnhname ) ) + end if + end if + + ! ltimedep + if ( Present( ltimedep ) ) tpfield%ltimedep = ltimedep +end function Fill_tfieldmetadata + + +type(tfieldmetadata) function Fill_tfieldmetadata_from_tfielddata( tpfieldin ) result(tpfield) + type(tfielddata), intent(in) :: tpfieldin + + tpfield%CMNHNAME = tpfieldin%CMNHNAME + tpfield%CSTDNAME = tpfieldin%CSTDNAME + tpfield%CLONGNAME = tpfieldin%CLONGNAME + tpfield%CUNITS = tpfieldin%CUNITS + tpfield%CCOMMENT = tpfieldin%CCOMMENT + tpfield%NGRID = tpfieldin%NGRID + tpfield%NTYPE = tpfieldin%NTYPE + tpfield%NDIMS = tpfieldin%NDIMS + tpfield%NDIMLIST = tpfieldin%NDIMLIST + tpfield%NFILLVALUE = tpfieldin%NFILLVALUE + tpfield%XFILLVALUE = tpfieldin%XFILLVALUE + tpfield%NVALIDMIN = tpfieldin%NVALIDMIN + tpfield%NVALIDMAX = tpfieldin%NVALIDMAX + tpfield%XVALIDMIN = tpfieldin%XVALIDMIN + tpfield%XVALIDMAX = tpfieldin%XVALIDMAX + tpfield%CDIR = tpfieldin%CDIR + tpfield%CLBTYPE = tpfieldin%CLBTYPE + tpfield%LTIMEDEP = tpfieldin%LTIMEDEP + +end function Fill_tfieldmetadata_from_tfielddata + + +type(tfielddata) function Fill_tfielddata( cmnhname, cstdname, clongname, cunits, ccomment, & + ngrid, ntype, ndims, ndimlist, & + nfillvalue, xfillvalue, nvalidmin, nvalidmax, xvalidmin, xvalidmax, & + cdir, clbtype, ltimedep ) result(tpfield) + + use mode_msg + + character(len=*), optional, intent(in) :: cmnhname + character(len=*), optional, intent(in) :: cstdname + character(len=*), optional, intent(in) :: clongname + character(len=*), optional, intent(in) :: cunits + character(len=*), optional, intent(in) :: ccomment + integer, optional, intent(in) :: ngrid + integer, intent(in) :: ntype + integer, optional, intent(in) :: ndims + integer, dimension(:), optional, intent(in) :: ndimlist + integer, optional, intent(in) :: nfillvalue + real, optional, intent(in) :: xfillvalue + integer, optional, intent(in) :: nvalidmin + integer, optional, intent(in) :: nvalidmax + real, optional, intent(in) :: xvalidmin + real, optional, intent(in) :: xvalidmax + + character(len=*), optional, intent(in) :: cdir + character(len=*), optional, intent(in) :: clbtype + logical, optional, intent(in) :: ltimedep + + + !Use the tfieldmetadata custom constructor and modify nmodelmax + !The data structures tfield_xyd are not set (null) + tpfield = tfielddata ( tfieldmetadata = tfieldmetadata( & + cmnhname = cmnhname, & + cstdname = cstdname, & + clongname = clongname, & + cunits = cunits, & + ccomment = ccomment, & + ngrid = ngrid, & + ntype = ntype, & + ndims = ndims, & + ndimlist = ndimlist, & + nfillvalue = nfillvalue, & + xfillvalue = xfillvalue, & + nvalidmin = nvalidmin, & + nvalidmax = nvalidmax, & + xvalidmin = xvalidmin, & + xvalidmax = xvalidmax, & + cdir = cdir, & + clbtype = clbtype, & + ltimedep = ltimedep ) ,& +! Set nmodelmax to 0 instead of -1 by default. +! This value can therefore be used to determine if the field was initialized by calling this constructor. + nmodelmax = 0, & + tfield_c0d = null(), & + tfield_c1d = null(), & + tfield_l0d = null(), & + tfield_l1d = null(), & + tfield_n0d = null(), & + tfield_n1d = null(), & + tfield_n2d = null(), & + tfield_n3d = null(), & + tfield_x0d = null(), & + tfield_x1d = null(), & + tfield_x2d = null(), & + tfield_x3d = null(), & + tfield_x4d = null(), & + tfield_x5d = null(), & + tfield_x6d = null(), & + tfield_t0d = null(), & + tfield_t1d = null() ) + +end function Fill_tfielddata end module modd_field diff --git a/src/LIB/SURCOUCHE/src/mode_field.f90 b/src/LIB/SURCOUCHE/src/mode_field.f90 index 3d7da524d8fa664a82373c9459c3e2cdf358edca..d6c458c9125e34bc4578d4575d7df55e1f9b2c53 100644 --- a/src/LIB/SURCOUCHE/src/mode_field.f90 +++ b/src/LIB/SURCOUCHE/src/mode_field.f90 @@ -15,6 +15,8 @@ ! P. Wautelet 19/06/2019: add Fieldlist_nmodel_resize subroutine + provide KMODEL to INI_FIELD_LIST when known ! P. Wautelet 23/01/2020: split in modd_field.f90 and mode_field.f90 ! JL Redelsperger 03/2021: add variables for Ocean LES and auto-coupled version +! P. Wautelet 08/10/2021: add Goto_model_1field + Add_field2list procedures + remove Fieldlist_nmodel_resize +! P. Wautelet 14/10/2021: dynamically allocate tfieldlist (+ reallocate if necessary) ! A. Costes 12/2021: add Blaze fire model variables !----------------------------------------------------------------- module mode_field @@ -35,28 +37,39 @@ public :: Ini_field_list public :: Find_field_id_from_mnhname public :: Alloc_field_scalars public :: Fieldlist_goto_model -public :: Fieldlist_nmodel_resize public :: Ini_field_scalars +interface Goto_model_1field + module procedure :: Goto_model_1field_c0d + module procedure :: Goto_model_1field_c1d + module procedure :: Goto_model_1field_l0d + module procedure :: Goto_model_1field_l1d + module procedure :: Goto_model_1field_n0d + module procedure :: Goto_model_1field_n1d + module procedure :: Goto_model_1field_n2d + module procedure :: Goto_model_1field_n3d + module procedure :: Goto_model_1field_t0d + module procedure :: Goto_model_1field_t1d + module procedure :: Goto_model_1field_x0d + module procedure :: Goto_model_1field_x1d + module procedure :: Goto_model_1field_x2d + module procedure :: Goto_model_1field_x3d + module procedure :: Goto_model_1field_x4d + module procedure :: Goto_model_1field_x5d + module procedure :: Goto_model_1field_x6d +end interface + + contains -SUBROUTINE INI_FIELD_LIST(KMODEL) +SUBROUTINE INI_FIELD_LIST() ! Modif ! J.Escobar 25/04/2018: missing def of FRC !------------------------------------------------ -USE MODD_CONF, ONLY: NMODEL -! -INTEGER, INTENT(IN), OPTIONAL :: KMODEL -! -INTEGER :: IDX, IMODEL -CHARACTER(LEN=42) :: YMSG + +CHARACTER(LEN=64) :: YMSG CHARACTER(LEN=3) :: YFIREDIMX, YFIREDIMY -! -!F90/95: TFIELDLIST(1) = TFIELDDATA('UT','x_wind','m s-1','XY','X_Y_Z_U component of wind',2) -!F2003: -!TFIELDLIST(1) = TFIELDDATA(CMNHNAME='UT',CSTDNAME='x_wind',CUNITS='m s-1',CDIR='XY',& -! CCOMMENT='X_Y_Z_U component of wind',NGRID=2) -! + CALL PRINT_MSG(NVERB_DEBUG,'GEN','INI_FIELD_LIST','called') IF (LFIELDLIST_ISINIT) THEN CALL PRINT_MSG(NVERB_ERROR,'GEN','INI_FIELD_LIST','already called') @@ -64,3741 +77,3359 @@ IF (LFIELDLIST_ISINIT) THEN END IF LFIELDLIST_ISINIT = .TRUE. -! -IF (PRESENT(KMODEL)) THEN - IMODEL = KMODEL -ELSE - !NMODEL is not necessary known here => allocating for max allowed number of models - !WARNING: if known, the value could change after this subroutine (ie for a restart - ! with more models) because READ_DESFM_n is called before READ_EXSEG_n - !Structures can be resized with a call to Fieldlist_nmodel_resize - IMODEL = JPMODELMAX -END IF -! -IF (IMODEL==0) CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_FIELD_LIST','allocating fields for zero models not allowed') -if ( imodel > JPMODELMAX ) & - call Print_msg( NVERB_FATAL, 'GEN', 'INI_FIELD_LIST', 'allocating fields for more than JPMODELMAX models not allowed' ) -! -WRITE(YMSG,'("allocating fields for up to ",I4," model(s)")') IMODEL -CALL PRINT_MSG(NVERB_DEBUG,'GEN','INI_FIELD_LIST',YMSG) -! -NMODEL_ALLOCATED = IMODEL -! -IDX = 1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'MNHVERSION' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'MesoNH version' -TFIELDLIST(IDX)%CUNITS = '' -TFIELDLIST(IDX)%CDIR = '--' -TFIELDLIST(IDX)%CCOMMENT = '' -TFIELDLIST(IDX)%NGRID = 0 -TFIELDLIST(IDX)%NTYPE = TYPEINT -TFIELDLIST(IDX)%NDIMS = 1 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'MASDEV' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'MesoNH version (without bugfix)' -TFIELDLIST(IDX)%CUNITS = '' -TFIELDLIST(IDX)%CDIR = '--' -TFIELDLIST(IDX)%CCOMMENT = '' -TFIELDLIST(IDX)%NGRID = 0 -TFIELDLIST(IDX)%NTYPE = TYPEINT -TFIELDLIST(IDX)%NDIMS = 0 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'BUGFIX' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'MesoNH bugfix number' -TFIELDLIST(IDX)%CUNITS = '' -TFIELDLIST(IDX)%CDIR = '--' -TFIELDLIST(IDX)%CCOMMENT = '' -TFIELDLIST(IDX)%NGRID = 0 -TFIELDLIST(IDX)%NTYPE = TYPEINT -TFIELDLIST(IDX)%NDIMS = 0 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'BIBUSER' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'MesoNH: user binary library' -TFIELDLIST(IDX)%CUNITS = '' -TFIELDLIST(IDX)%CDIR = '--' -TFIELDLIST(IDX)%CCOMMENT = '' -TFIELDLIST(IDX)%NGRID = 0 -TFIELDLIST(IDX)%NTYPE = TYPECHAR -TFIELDLIST(IDX)%NDIMS = 0 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'VERSION' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'SURFEX version (without BUG)' -TFIELDLIST(IDX)%CUNITS = '' -TFIELDLIST(IDX)%CDIR = '--' -TFIELDLIST(IDX)%CCOMMENT = '' -TFIELDLIST(IDX)%NGRID = 0 -TFIELDLIST(IDX)%NTYPE = TYPEINT -TFIELDLIST(IDX)%NDIMS = 0 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'BUG' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'SURFEX bugfix number' -TFIELDLIST(IDX)%CUNITS = '' -TFIELDLIST(IDX)%CDIR = '--' -TFIELDLIST(IDX)%CCOMMENT = '' -TFIELDLIST(IDX)%NGRID = 0 -TFIELDLIST(IDX)%NTYPE = TYPEINT -TFIELDLIST(IDX)%NDIMS = 0 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'PROGRAM' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'MesoNH family: used program' -TFIELDLIST(IDX)%CUNITS = '' -TFIELDLIST(IDX)%CDIR = '--' -TFIELDLIST(IDX)%CCOMMENT = '' -TFIELDLIST(IDX)%NGRID = 0 -TFIELDLIST(IDX)%NTYPE = TYPECHAR -TFIELDLIST(IDX)%NDIMS = 0 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'FILETYPE' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'type of this file' -TFIELDLIST(IDX)%CUNITS = '' -TFIELDLIST(IDX)%CDIR = '--' -TFIELDLIST(IDX)%CCOMMENT = '' -TFIELDLIST(IDX)%NGRID = 0 -TFIELDLIST(IDX)%NTYPE = TYPECHAR -TFIELDLIST(IDX)%NDIMS = 0 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'MY_NAME' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'filename (no extension)' -TFIELDLIST(IDX)%CUNITS = '' -TFIELDLIST(IDX)%CDIR = '--' -TFIELDLIST(IDX)%CCOMMENT = '' -TFIELDLIST(IDX)%NGRID = 0 -TFIELDLIST(IDX)%NTYPE = TYPECHAR -TFIELDLIST(IDX)%NDIMS = 0 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'DAD_NAME' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'filename of the dad file' -TFIELDLIST(IDX)%CUNITS = '' -TFIELDLIST(IDX)%CDIR = '--' -TFIELDLIST(IDX)%CCOMMENT = '' -TFIELDLIST(IDX)%NGRID = 0 -TFIELDLIST(IDX)%NTYPE = TYPECHAR -TFIELDLIST(IDX)%NDIMS = 0 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'DXRATIO' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'DXRATIO' -TFIELDLIST(IDX)%CUNITS = '' -TFIELDLIST(IDX)%CDIR = '--' -TFIELDLIST(IDX)%CCOMMENT = 'Resolution ratio between this mesh and its father in x-direction' -TFIELDLIST(IDX)%NGRID = 0 -TFIELDLIST(IDX)%NTYPE = TYPEINT -TFIELDLIST(IDX)%NDIMS = 0 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'DYRATIO' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'DYRATIO' -TFIELDLIST(IDX)%CUNITS = '' -TFIELDLIST(IDX)%CDIR = '--' -TFIELDLIST(IDX)%CCOMMENT = 'Resolution ratio between this mesh and its father in y-direction' -TFIELDLIST(IDX)%NGRID = 0 -TFIELDLIST(IDX)%NTYPE = TYPEINT -TFIELDLIST(IDX)%NDIMS = 0 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'XSIZE' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'XSIZE' -TFIELDLIST(IDX)%CUNITS = '' -TFIELDLIST(IDX)%CDIR = '--' -TFIELDLIST(IDX)%CCOMMENT = 'Number of model 1 grid points in x-direction in the model 2 physical domain' -TFIELDLIST(IDX)%NGRID = 0 -TFIELDLIST(IDX)%NTYPE = TYPEINT -TFIELDLIST(IDX)%NDIMS = 0 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'YSIZE' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'YSIZE' -TFIELDLIST(IDX)%CUNITS = '' -TFIELDLIST(IDX)%CDIR = '--' -TFIELDLIST(IDX)%CCOMMENT = 'Number of model 1 grid points in y-direction in the model 2 physical domain' -TFIELDLIST(IDX)%NGRID = 0 -TFIELDLIST(IDX)%NTYPE = TYPEINT -TFIELDLIST(IDX)%NDIMS = 0 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'XOR' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'XOR' -TFIELDLIST(IDX)%CUNITS = '' -TFIELDLIST(IDX)%CDIR = '--' -TFIELDLIST(IDX)%CCOMMENT = 'Horizontal position of this mesh relative to its father' -TFIELDLIST(IDX)%NGRID = 0 -TFIELDLIST(IDX)%NTYPE = TYPEINT -TFIELDLIST(IDX)%NDIMS = 0 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'YOR' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'YOR' -TFIELDLIST(IDX)%CUNITS = '' -TFIELDLIST(IDX)%CDIR = '--' -TFIELDLIST(IDX)%CCOMMENT = 'Vertical position of this mesh relative to its father' -TFIELDLIST(IDX)%NGRID = 0 -TFIELDLIST(IDX)%NTYPE = TYPEINT -TFIELDLIST(IDX)%NDIMS = 0 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'STORAGE_TYPE' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'STORAGE_TYPE' -TFIELDLIST(IDX)%CUNITS = '' -TFIELDLIST(IDX)%CDIR = '--' -TFIELDLIST(IDX)%CCOMMENT = 'Storage type for the information written in the FM files' -TFIELDLIST(IDX)%NGRID = 0 -TFIELDLIST(IDX)%NTYPE = TYPECHAR -TFIELDLIST(IDX)%NDIMS = 0 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'IMAX' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'IMAX' -TFIELDLIST(IDX)%CUNITS = '' -TFIELDLIST(IDX)%CDIR = '--' -TFIELDLIST(IDX)%CCOMMENT = 'x-dimension of the physical domain' -TFIELDLIST(IDX)%NGRID = 0 -TFIELDLIST(IDX)%NTYPE = TYPEINT -TFIELDLIST(IDX)%NDIMS = 0 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'JMAX' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'JMAX' -TFIELDLIST(IDX)%CUNITS = '' -TFIELDLIST(IDX)%CDIR = '--' -TFIELDLIST(IDX)%CCOMMENT = 'y-dimension of the physical domain' -TFIELDLIST(IDX)%NGRID = 0 -TFIELDLIST(IDX)%NTYPE = TYPEINT -TFIELDLIST(IDX)%NDIMS = 0 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'KMAX' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'KMAX' -TFIELDLIST(IDX)%CUNITS = '' -TFIELDLIST(IDX)%CDIR = '--' -TFIELDLIST(IDX)%CCOMMENT = 'z-dimension of the physical domain' -TFIELDLIST(IDX)%NGRID = 0 -TFIELDLIST(IDX)%NTYPE = TYPEINT -TFIELDLIST(IDX)%NDIMS = 0 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'JPHEXT' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'JPHEXT' -TFIELDLIST(IDX)%CUNITS = '' -TFIELDLIST(IDX)%CDIR = '--' -TFIELDLIST(IDX)%CCOMMENT = 'Number of horizontal external points on each side' -TFIELDLIST(IDX)%NGRID = 0 -TFIELDLIST(IDX)%NTYPE = TYPEINT -TFIELDLIST(IDX)%NDIMS = 0 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'RPK' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'RPK' -TFIELDLIST(IDX)%CUNITS = '' -TFIELDLIST(IDX)%CDIR = '--' -TFIELDLIST(IDX)%CCOMMENT = 'Projection parameter for conformal projection' -TFIELDLIST(IDX)%NGRID = 0 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 0 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'LONORI' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'LONORI' -TFIELDLIST(IDX)%CUNITS = 'degree' -TFIELDLIST(IDX)%CDIR = '--' -TFIELDLIST(IDX)%CCOMMENT = 'Longitude of the point of coordinates x=0, y=0 for conformal projection' -TFIELDLIST(IDX)%NGRID = 0 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 0 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'LATORI' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'LATORI' -TFIELDLIST(IDX)%CUNITS = 'degree' -TFIELDLIST(IDX)%CDIR = '--' -TFIELDLIST(IDX)%CCOMMENT = 'Latitude of the point of coordinates x=0, y=0 for conformal projection' -TFIELDLIST(IDX)%NGRID = 0 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 0 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'LONOR' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'LONOR' -TFIELDLIST(IDX)%CUNITS = 'degree' -TFIELDLIST(IDX)%CDIR = '--' -TFIELDLIST(IDX)%CCOMMENT = 'Longitude of 1st mass point' -TFIELDLIST(IDX)%NGRID = 0 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 0 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'LATOR' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'LATOR' -TFIELDLIST(IDX)%CUNITS = 'degree' -TFIELDLIST(IDX)%CDIR = '--' -TFIELDLIST(IDX)%CCOMMENT = 'Latitude of 1st mass point' -TFIELDLIST(IDX)%NGRID = 0 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 0 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'THINSHELL' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'THINSHELL' -TFIELDLIST(IDX)%CUNITS = '' -TFIELDLIST(IDX)%CDIR = '--' -TFIELDLIST(IDX)%CCOMMENT = 'Logical for thinshell approximation' -TFIELDLIST(IDX)%NGRID = 0 -TFIELDLIST(IDX)%NTYPE = TYPELOG -TFIELDLIST(IDX)%NDIMS = 0 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'LAT0' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'LAT0' -TFIELDLIST(IDX)%CUNITS = 'degree' -TFIELDLIST(IDX)%CDIR = '--' -TFIELDLIST(IDX)%CCOMMENT = 'Reference latitude for conformal projection' -TFIELDLIST(IDX)%NGRID = 0 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 0 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'LON0' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'LON0' -TFIELDLIST(IDX)%CUNITS = 'degree' -TFIELDLIST(IDX)%CDIR = '--' -TFIELDLIST(IDX)%CCOMMENT = 'Reference longitude for conformal projection' -TFIELDLIST(IDX)%NGRID = 0 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 0 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'BETA' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'BETA' -TFIELDLIST(IDX)%CUNITS = 'degree' -TFIELDLIST(IDX)%CDIR = '--' -TFIELDLIST(IDX)%CCOMMENT = 'Rotation angle for conformal projection' -TFIELDLIST(IDX)%NGRID = 0 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 0 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'XHAT' -!TODO: check stdname -TFIELDLIST(IDX)%CSTDNAME = 'projection_x_coordinate' -TFIELDLIST(IDX)%CLONGNAME = 'XHAT' -TFIELDLIST(IDX)%CUNITS = 'm' -TFIELDLIST(IDX)%CDIR = 'XX' -TFIELDLIST(IDX)%CCOMMENT = 'Position x in the conformal or cartesian plane' -TFIELDLIST(IDX)%NGRID = 2 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 1 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X1D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'YHAT' -!TODO: check stdname -TFIELDLIST(IDX)%CSTDNAME = 'projection_y_coordinate' -TFIELDLIST(IDX)%CLONGNAME = 'YHAT' -TFIELDLIST(IDX)%CUNITS = 'm' -TFIELDLIST(IDX)%CDIR = 'YY' -TFIELDLIST(IDX)%CCOMMENT = 'Position y in the conformal or cartesian plane' -TFIELDLIST(IDX)%NGRID = 3 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 1 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X1D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'ZHAT' + +Allocate( tfieldlist(NMAXFIELDINIT) ) +NMAXFIELDS = NMAXFIELDINIT + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'MNHVERSION', & + CSTDNAME = '', & + CLONGNAME = 'MesoNH version', & + CUNITS = '', & + CDIR = '--', & + CCOMMENT = '', & + NGRID = 0, & + NTYPE = TYPEINT, & + NDIMS = 1, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'MASDEV', & + CSTDNAME = '', & + CLONGNAME = 'MesoNH version (without bugfix)', & + CUNITS = '', & + CDIR = '--', & + CCOMMENT = '', & + NGRID = 0, & + NTYPE = TYPEINT, & + NDIMS = 0, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'BUGFIX', & + CSTDNAME = '', & + CLONGNAME = 'MesoNH bugfix number', & + CUNITS = '', & + CDIR = '--', & + CCOMMENT = '', & + NGRID = 0, & + NTYPE = TYPEINT, & + NDIMS = 0, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'BIBUSER', & + CSTDNAME = '', & + CLONGNAME = 'MesoNH: user binary library', & + CUNITS = '', & + CDIR = '--', & + CCOMMENT = '', & + NGRID = 0, & + NTYPE = TYPECHAR, & + NDIMS = 0, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'VERSION', & + CSTDNAME = '', & + CLONGNAME = 'SURFEX version (without BUG)', & + CUNITS = '', & + CDIR = '--', & + CCOMMENT = '', & + NGRID = 0, & + NTYPE = TYPEINT, & + NDIMS = 0, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'BUG', & + CSTDNAME = '', & + CLONGNAME = 'SURFEX bugfix number', & + CUNITS = '', & + CDIR = '--', & + CCOMMENT = '', & + NGRID = 0, & + NTYPE = TYPEINT, & + NDIMS = 0, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'PROGRAM', & + CSTDNAME = '', & + CLONGNAME = 'MesoNH family: used program', & + CUNITS = '', & + CDIR = '--', & + CCOMMENT = '', & + NGRID = 0, & + NTYPE = TYPECHAR, & + NDIMS = 0, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'FILETYPE', & + CSTDNAME = '', & + CLONGNAME = 'type of this file', & + CUNITS = '', & + CDIR = '--', & + CCOMMENT = '', & + NGRID = 0, & + NTYPE = TYPECHAR, & + NDIMS = 0, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'MY_NAME', & + CSTDNAME = '', & + CLONGNAME = 'filename (no extension)', & + CUNITS = '', & + CDIR = '--', & + CCOMMENT = '', & + NGRID = 0, & + NTYPE = TYPECHAR, & + NDIMS = 0, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'DAD_NAME', & + CSTDNAME = '', & + CLONGNAME = 'filename of the dad file', & + CUNITS = '', & + CDIR = '--', & + CCOMMENT = '', & + NGRID = 0, & + NTYPE = TYPECHAR, & + NDIMS = 0, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'DXRATIO', & + CSTDNAME = '', & + CLONGNAME = 'DXRATIO', & + CUNITS = '', & + CDIR = '--', & + CCOMMENT = 'Resolution ratio between this mesh and its father in x-direction', & + NGRID = 0, & + NTYPE = TYPEINT, & + NDIMS = 0, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'DYRATIO', & + CSTDNAME = '', & + CLONGNAME = 'DYRATIO', & + CUNITS = '', & + CDIR = '--', & + CCOMMENT = 'Resolution ratio between this mesh and its father in y-direction', & + NGRID = 0, & + NTYPE = TYPEINT, & + NDIMS = 0, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'XSIZE', & + CSTDNAME = '', & + CLONGNAME = 'XSIZE', & + CUNITS = '', & + CDIR = '--', & + CCOMMENT = 'Number of model 1 grid points in x-direction in the model 2 physical domain', & + NGRID = 0, & + NTYPE = TYPEINT, & + NDIMS = 0, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'YSIZE', & + CSTDNAME = '', & + CLONGNAME = 'YSIZE', & + CUNITS = '', & + CDIR = '--', & + CCOMMENT = 'Number of model 1 grid points in y-direction in the model 2 physical domain', & + NGRID = 0, & + NTYPE = TYPEINT, & + NDIMS = 0, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'XOR', & + CSTDNAME = '', & + CLONGNAME = 'XOR', & + CUNITS = '', & + CDIR = '--', & + CCOMMENT = 'Horizontal position of this mesh relative to its father', & + NGRID = 0, & + NTYPE = TYPEINT, & + NDIMS = 0, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'YOR', & + CSTDNAME = '', & + CLONGNAME = 'YOR', & + CUNITS = '', & + CDIR = '--', & + CCOMMENT = 'Vertical position of this mesh relative to its father', & + NGRID = 0, & + NTYPE = TYPEINT, & + NDIMS = 0, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'STORAGE_TYPE', & + CSTDNAME = '', & + CLONGNAME = 'STORAGE_TYPE', & + CUNITS = '', & + CDIR = '--', & + CCOMMENT = 'Storage type for the information written in the FM files', & + NGRID = 0, & + NTYPE = TYPECHAR, & + NDIMS = 0, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'IMAX', & + CSTDNAME = '', & + CLONGNAME = 'IMAX', & + CUNITS = '', & + CDIR = '--', & + CCOMMENT = 'x-dimension of the physical domain', & + NGRID = 0, & + NTYPE = TYPEINT, & + NDIMS = 0, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'JMAX', & + CSTDNAME = '', & + CLONGNAME = 'JMAX', & + CUNITS = '', & + CDIR = '--', & + CCOMMENT = 'y-dimension of the physical domain', & + NGRID = 0, & + NTYPE = TYPEINT, & + NDIMS = 0, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'KMAX', & + CSTDNAME = '', & + CLONGNAME = 'KMAX', & + CUNITS = '', & + CDIR = '--', & + CCOMMENT = 'z-dimension of the physical domain', & + NGRID = 0, & + NTYPE = TYPEINT, & + NDIMS = 0, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'JPHEXT', & + CSTDNAME = '', & + CLONGNAME = 'JPHEXT', & + CUNITS = '', & + CDIR = '--', & + CCOMMENT = 'Number of horizontal external points on each side', & + NGRID = 0, & + NTYPE = TYPEINT, & + NDIMS = 0, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'RPK', & + CSTDNAME = '', & + CLONGNAME = 'RPK', & + CUNITS = '', & + CDIR = '--', & + CCOMMENT = 'Projection parameter for conformal projection', & + NGRID = 0, & + NTYPE = TYPEREAL, & + NDIMS = 0, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'LONORI', & + CSTDNAME = '', & + CLONGNAME = 'LONORI', & + CUNITS = 'degree', & + CDIR = '--', & + CCOMMENT = 'Longitude of the point of coordinates x=0, y=0 for conformal projection', & + NGRID = 0, & + NTYPE = TYPEREAL, & + NDIMS = 0, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'LATORI', & + CSTDNAME = '', & + CLONGNAME = 'LATORI', & + CUNITS = 'degree', & + CDIR = '--', & + CCOMMENT = 'Latitude of the point of coordinates x=0, y=0 for conformal projection', & + NGRID = 0, & + NTYPE = TYPEREAL, & + NDIMS = 0, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'LONOR', & + CSTDNAME = '', & + CLONGNAME = 'LONOR', & + CUNITS = 'degree', & + CDIR = '--', & + CCOMMENT = 'Longitude of 1st mass point', & + NGRID = 0, & + NTYPE = TYPEREAL, & + NDIMS = 0, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'LATOR', & + CSTDNAME = '', & + CLONGNAME = 'LATOR', & + CUNITS = 'degree', & + CDIR = '--', & + CCOMMENT = 'Latitude of 1st mass point', & + NGRID = 0, & + NTYPE = TYPEREAL, & + NDIMS = 0, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'THINSHELL', & + CSTDNAME = '', & + CLONGNAME = 'THINSHELL', & + CUNITS = '', & + CDIR = '--', & + CCOMMENT = 'Logical for thinshell approximation', & + NGRID = 0, & + NTYPE = TYPELOG, & + NDIMS = 0, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'LAT0', & + CSTDNAME = '', & + CLONGNAME = 'LAT0', & + CUNITS = 'degree', & + CDIR = '--', & + CCOMMENT = 'Reference latitude for conformal projection', & + NGRID = 0, & + NTYPE = TYPEREAL, & + NDIMS = 0, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'LON0', & + CSTDNAME = '', & + CLONGNAME = 'LON0', & + CUNITS = 'degree', & + CDIR = '--', & + CCOMMENT = 'Reference longitude for conformal projection', & + NGRID = 0, & + NTYPE = TYPEREAL, & + NDIMS = 0, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'BETA', & + CSTDNAME = '', & + CLONGNAME = 'BETA', & + CUNITS = 'degree', & + CDIR = '--', & + CCOMMENT = 'Rotation angle for conformal projection', & + NGRID = 0, & + NTYPE = TYPEREAL, & + NDIMS = 0, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'XHAT', & + CSTDNAME = 'projection_x_coordinate', & + CLONGNAME = 'XHAT', & + CUNITS = 'm', & + CDIR = 'XX', & + CCOMMENT = 'Position x in the conformal or cartesian plane', & + NGRID = 2, & + NTYPE = TYPEREAL, & + NDIMS = 1, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'YHAT', & + CSTDNAME = 'projection_y_coordinate', & + CLONGNAME = 'YHAT', & + CUNITS = 'm', & + CDIR = 'YY', & + CCOMMENT = 'Position y in the conformal or cartesian plane', & + NGRID = 3, & + NTYPE = TYPEREAL, & + NDIMS = 1, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'XHATM', & + CSTDNAME = 'projection_x_coordinate', & + CLONGNAME = 'XHATM', & + CUNITS = 'm', & + CDIR = 'XX', & + CCOMMENT = 'Position x in the conformal or cartesian plane at mass points', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 1, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'YHATM', & + CSTDNAME = 'projection_y_coordinate', & + CLONGNAME = 'YHATM', & + CUNITS = 'm', & + CDIR = 'YY', & + CCOMMENT = 'Position y in the conformal or cartesian plane at mass points', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 1, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'ZHAT', & !TODO: check stdname -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'ZHAT' -TFIELDLIST(IDX)%CUNITS = 'm' -TFIELDLIST(IDX)%CDIR = 'ZZ' -TFIELDLIST(IDX)%CCOMMENT = 'Height level without orography' -TFIELDLIST(IDX)%NGRID = 4 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 1 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X1D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'ZTOP' -TFIELDLIST(IDX)%CSTDNAME = 'altitude_at_top_of_atmosphere_model' -TFIELDLIST(IDX)%CLONGNAME = 'ZTOP' -TFIELDLIST(IDX)%CUNITS = 'm' -TFIELDLIST(IDX)%CDIR = '--' -TFIELDLIST(IDX)%CCOMMENT = 'Height of top level' -TFIELDLIST(IDX)%NGRID = 4 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 0 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X0D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'DXHAT' + CSTDNAME = '', & + CLONGNAME = 'ZHAT', & + CUNITS = 'm', & + CDIR = 'ZZ', & + CCOMMENT = 'Height level without orography', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 1, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'ZHATM', & !TODO: check stdname -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'DXHAT' -TFIELDLIST(IDX)%CUNITS = 'm' -TFIELDLIST(IDX)%CDIR = 'XX' -TFIELDLIST(IDX)%CCOMMENT = 'Horizontal stretching in x' -TFIELDLIST(IDX)%NGRID = 2 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 1 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X1D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'DYHAT' + CSTDNAME = '', & + CLONGNAME = 'ZHATM', & + CUNITS = 'm', & + CDIR = 'ZZ', & + CCOMMENT = 'Height level without orography at mass point', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 1, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'HAT_BOUND', & + CSTDNAME = '', & + CLONGNAME = 'HAT_BOUND', & + CUNITS = 'm', & + CDIR = '--', & + CCOMMENT = 'Boundaries of domain in the conformal or cartesian plane at u and v points', & + NGRID = 0, & + NTYPE = TYPEREAL, & + NDIMS = 1, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'HATM_BOUND', & + CSTDNAME = '', & + CLONGNAME = 'HATM_BOUND', & + CUNITS = 'm', & + CDIR = '--', & + CCOMMENT = 'Boundaries of domain in the conformal or cartesian plane at mass points', & + NGRID = 0, & + NTYPE = TYPEREAL, & + NDIMS = 1, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'ZTOP', & + CSTDNAME = 'altitude_at_top_of_atmosphere_model', & + CLONGNAME = 'ZTOP', & + CUNITS = 'm', & + CDIR = '--', & + CCOMMENT = 'Height of top level', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 0, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'DXHAT', & !TODO: check stdname -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'DYHAT' -TFIELDLIST(IDX)%CUNITS = 'm' -TFIELDLIST(IDX)%CDIR = 'YY' -TFIELDLIST(IDX)%CCOMMENT = 'Horizontal stretching in y' -TFIELDLIST(IDX)%NGRID = 3 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 1 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X1D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'ALT' -TFIELDLIST(IDX)%CSTDNAME = 'altitude' -TFIELDLIST(IDX)%CLONGNAME = 'ALT' -TFIELDLIST(IDX)%CUNITS = 'm' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_Z_ALTitude' -TFIELDLIST(IDX)%NGRID = 4 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'DIRCOSXW' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'DIRCOSXW' -TFIELDLIST(IDX)%CUNITS = '' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X director cosinus of the normal to the ground surface' -TFIELDLIST(IDX)%NGRID = 4 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 2 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'DIRCOSYW' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'DIRCOSYW' -TFIELDLIST(IDX)%CUNITS = '' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'Y director cosinus of the normal to the ground surface' -TFIELDLIST(IDX)%NGRID = 4 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 2 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'DIRCOSZW' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'DIRCOSZW' -TFIELDLIST(IDX)%CUNITS = '' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'Z director cosinus of the normal to the ground surface' -TFIELDLIST(IDX)%NGRID = 4 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 2 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'COSSLOPE' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'COSSLOPE' -TFIELDLIST(IDX)%CUNITS = '' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'cosinus of the angle between i and the slope vector' -TFIELDLIST(IDX)%NGRID = 4 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 2 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'SINSLOPE' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'SINSLOPE' -TFIELDLIST(IDX)%CUNITS = '' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'sinus of the angle between i and the slope vector' -TFIELDLIST(IDX)%NGRID = 4 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 2 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'MAP' + CSTDNAME = '', & + CLONGNAME = 'DXHAT', & + CUNITS = 'm', & + CDIR = 'XX', & + CCOMMENT = 'Horizontal stretching in x', & + NGRID = 2, & + NTYPE = TYPEREAL, & + NDIMS = 1, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'DYHAT', & !TODO: check stdname -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'MAP' -TFIELDLIST(IDX)%CUNITS = '' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'Map factor' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 2 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'latitude' -TFIELDLIST(IDX)%CSTDNAME = 'latitude' -TFIELDLIST(IDX)%CLONGNAME = 'latitude' -TFIELDLIST(IDX)%CUNITS = 'degrees_north' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_latitude at mass point' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 2 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'longitude' -TFIELDLIST(IDX)%CSTDNAME = 'longitude' -TFIELDLIST(IDX)%CLONGNAME = 'longitude' -TFIELDLIST(IDX)%CUNITS = 'degrees_east' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_longitude at mass point' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 2 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'latitude_u' -TFIELDLIST(IDX)%CSTDNAME = 'latitude_at_u_location' -TFIELDLIST(IDX)%CLONGNAME = 'latitude at u location' -TFIELDLIST(IDX)%CUNITS = 'degrees_north' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_latitude at u point' -TFIELDLIST(IDX)%NGRID = 2 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 2 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'longitude_u' -TFIELDLIST(IDX)%CSTDNAME = 'longitude_at_u_location' -TFIELDLIST(IDX)%CLONGNAME = 'longitude at u location' -TFIELDLIST(IDX)%CUNITS = 'degrees_east' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_longitude at u point' -TFIELDLIST(IDX)%NGRID = 2 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 2 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'latitude_v' -TFIELDLIST(IDX)%CSTDNAME = 'latitude_at_v_location' -TFIELDLIST(IDX)%CLONGNAME = 'latitude at v location' -TFIELDLIST(IDX)%CUNITS = 'degrees_north' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_latitude at v point' -TFIELDLIST(IDX)%NGRID = 3 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 2 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'longitude_v' -TFIELDLIST(IDX)%CSTDNAME = 'longitude_at_v_location' -TFIELDLIST(IDX)%CLONGNAME = 'longitude at v location' -TFIELDLIST(IDX)%CUNITS = 'degrees_east' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_longitude at v point' -TFIELDLIST(IDX)%NGRID = 3 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 2 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'latitude_f' -TFIELDLIST(IDX)%CSTDNAME = 'latitude_at_f_location' -TFIELDLIST(IDX)%CLONGNAME = 'latitude at f location' -TFIELDLIST(IDX)%CUNITS = 'degrees_north' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_latitude at f point' -TFIELDLIST(IDX)%NGRID = 5 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 2 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'longitude_f' -TFIELDLIST(IDX)%CSTDNAME = 'longitude_at_f_location' -TFIELDLIST(IDX)%CLONGNAME = 'longitude at f location' -TFIELDLIST(IDX)%CUNITS = 'degrees_east' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_longitude at f point' -TFIELDLIST(IDX)%NGRID = 5 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 2 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'LAT' -! TFIELDLIST(IDX)%CSTDNAME = 'latitude' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'LAT' -TFIELDLIST(IDX)%CUNITS = 'degrees_north' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_latitude' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 2 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'LON' -! TFIELDLIST(IDX)%CSTDNAME = 'longitude' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'LON' -TFIELDLIST(IDX)%CUNITS = 'degrees_east' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_longitude' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 2 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'ZS' -TFIELDLIST(IDX)%CSTDNAME = 'surface_altitude' -TFIELDLIST(IDX)%CLONGNAME = 'ZS' -TFIELDLIST(IDX)%CUNITS = 'm' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'orography' -TFIELDLIST(IDX)%NGRID = 4 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 2 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'ZWS' -TFIELDLIST(IDX)%CSTDNAME = 'sea_surface_wave_significant_height' -TFIELDLIST(IDX)%CLONGNAME = 'ZWS' -TFIELDLIST(IDX)%CUNITS = 'm' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'sea wave height' -TFIELDLIST(IDX)%NGRID = 4 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 2 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'ZSMT' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'ZSMT' -TFIELDLIST(IDX)%CUNITS = 'm' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'smooth orography' -TFIELDLIST(IDX)%NGRID = 4 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 2 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'SLEVE' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'SLEVE' -TFIELDLIST(IDX)%CUNITS = '' -TFIELDLIST(IDX)%CDIR = '--' -TFIELDLIST(IDX)%CCOMMENT = 'Logical for SLEVE coordinate' -TFIELDLIST(IDX)%NGRID = 4 -TFIELDLIST(IDX)%NTYPE = TYPELOG -TFIELDLIST(IDX)%NDIMS = 0 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_L0D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'LEN1' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'LEN1' -TFIELDLIST(IDX)%CUNITS = '' -TFIELDLIST(IDX)%CDIR = '--' -TFIELDLIST(IDX)%CCOMMENT = 'Decay scale for smooth topography' -TFIELDLIST(IDX)%NGRID = 4 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 0 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X0D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'LEN2' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'LEN2' -TFIELDLIST(IDX)%CUNITS = '' -TFIELDLIST(IDX)%CDIR = '--' -TFIELDLIST(IDX)%CCOMMENT = 'Decay scale for small-scale topography deviation' -TFIELDLIST(IDX)%NGRID = 4 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 0 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X0D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'DTMOD' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'DTMOD' -TFIELDLIST(IDX)%CUNITS = 'seconds since YYYY-MM-DD HH:MM:SS.S' -TFIELDLIST(IDX)%CDIR = '--' -TFIELDLIST(IDX)%CCOMMENT = 'Time and date of model beginning' -TFIELDLIST(IDX)%NGRID = 0 -TFIELDLIST(IDX)%NTYPE = TYPEDATE -TFIELDLIST(IDX)%NDIMS = 0 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_T0D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'DTCUR' -TFIELDLIST(IDX)%CSTDNAME = 'time' -TFIELDLIST(IDX)%CLONGNAME = 'DTCUR' -TFIELDLIST(IDX)%CUNITS = 'seconds since YYYY-MM-DD HH:MM:SS.S' -TFIELDLIST(IDX)%CDIR = '--' -TFIELDLIST(IDX)%CCOMMENT = 'Current time and date' -TFIELDLIST(IDX)%NGRID = 0 -TFIELDLIST(IDX)%NTYPE = TYPEDATE -TFIELDLIST(IDX)%NDIMS = 0 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_T0D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'DTRAD_FULL' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'DTRAD_FULL' -TFIELDLIST(IDX)%CUNITS = 'seconds since YYYY-MM-DD HH:MM:SS.S' -TFIELDLIST(IDX)%CDIR = '--' -TFIELDLIST(IDX)%CCOMMENT = 'Time and date of last full radiation call' -TFIELDLIST(IDX)%NGRID = 0 -TFIELDLIST(IDX)%NTYPE = TYPEDATE -TFIELDLIST(IDX)%NDIMS = 0 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_T0D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'DTRAD_CLLY' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'DTRAD_CLLY' -TFIELDLIST(IDX)%CUNITS = 'seconds since YYYY-MM-DD HH:MM:SS.S' -TFIELDLIST(IDX)%CDIR = '--' -TFIELDLIST(IDX)%CCOMMENT = 'Time and date of last radiation call for only cloudy verticals' -TFIELDLIST(IDX)%NGRID = 0 -TFIELDLIST(IDX)%NTYPE = TYPEDATE -TFIELDLIST(IDX)%NDIMS = 0 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_T0D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'DTDCONV' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'DTDCONV' -TFIELDLIST(IDX)%CUNITS = 'seconds since YYYY-MM-DD HH:MM:SS.S' -TFIELDLIST(IDX)%CDIR = '--' -TFIELDLIST(IDX)%CCOMMENT = 'Time and date of the last deep convection call' -TFIELDLIST(IDX)%NGRID = 0 -TFIELDLIST(IDX)%NTYPE = TYPEDATE -TFIELDLIST(IDX)%NDIMS = 0 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_T0D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'DTEXP' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'DTEXP' -TFIELDLIST(IDX)%CUNITS = 'seconds since YYYY-MM-DD HH:MM:SS.S' -TFIELDLIST(IDX)%CDIR = '--' -TFIELDLIST(IDX)%CCOMMENT = 'Time and date of experiment beginning' -TFIELDLIST(IDX)%NGRID = 0 -TFIELDLIST(IDX)%NTYPE = TYPEDATE -TFIELDLIST(IDX)%NDIMS = 0 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'DTSEG' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'DTSEG' -TFIELDLIST(IDX)%CUNITS = 'seconds since YYYY-MM-DD HH:MM:SS.S' -TFIELDLIST(IDX)%CDIR = '--' -TFIELDLIST(IDX)%CCOMMENT = 'Time and date of segment beginning' -TFIELDLIST(IDX)%NGRID = 0 -TFIELDLIST(IDX)%NTYPE = TYPEDATE -TFIELDLIST(IDX)%NDIMS = 0 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'L1D' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'L1D' -TFIELDLIST(IDX)%CUNITS = '' -TFIELDLIST(IDX)%CDIR = '--' -TFIELDLIST(IDX)%CCOMMENT = 'Logical for 1D model version' -TFIELDLIST(IDX)%NGRID = 0 -TFIELDLIST(IDX)%NTYPE = TYPELOG -TFIELDLIST(IDX)%NDIMS = 0 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'L2D' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'L2D' -TFIELDLIST(IDX)%CUNITS = '' -TFIELDLIST(IDX)%CDIR = '--' -TFIELDLIST(IDX)%CCOMMENT = 'Logical for 2D model version' -TFIELDLIST(IDX)%NGRID = 0 -TFIELDLIST(IDX)%NTYPE = TYPELOG -TFIELDLIST(IDX)%NDIMS = 0 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'PACK' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'PACK' -TFIELDLIST(IDX)%CUNITS = '' -TFIELDLIST(IDX)%CDIR = '--' -TFIELDLIST(IDX)%CCOMMENT = 'Logical to compress 1D or 2D FM files' -TFIELDLIST(IDX)%NGRID = 0 -TFIELDLIST(IDX)%NTYPE = TYPELOG -TFIELDLIST(IDX)%NDIMS = 0 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'CARTESIAN' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'CARTESIAN' -TFIELDLIST(IDX)%CUNITS = '' -TFIELDLIST(IDX)%CDIR = '--' -TFIELDLIST(IDX)%CCOMMENT = 'Logical for cartesian geometry' -TFIELDLIST(IDX)%NGRID = 0 -TFIELDLIST(IDX)%NTYPE = TYPELOG -TFIELDLIST(IDX)%NDIMS = 0 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'LBOUSS' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'LBOUSS' -TFIELDLIST(IDX)%CUNITS = '' -TFIELDLIST(IDX)%CDIR = '--' -TFIELDLIST(IDX)%CCOMMENT = 'Logical for Boussinesq approximation' -TFIELDLIST(IDX)%NGRID = 0 -TFIELDLIST(IDX)%NTYPE = TYPELOG -TFIELDLIST(IDX)%NDIMS = 0 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'LOCEAN' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'LOCEAN' -TFIELDLIST(IDX)%CUNITS = '' -TFIELDLIST(IDX)%CDIR = '--' -TFIELDLIST(IDX)%CCOMMENT = 'Logical for Ocean MesoNH' -TFIELDLIST(IDX)%NGRID = 0 -TFIELDLIST(IDX)%NTYPE = TYPELOG -TFIELDLIST(IDX)%NDIMS = 0 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'LCOUPLES' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'LCOUPLES' -TFIELDLIST(IDX)%CUNITS = '' -TFIELDLIST(IDX)%CDIR = '--' -TFIELDLIST(IDX)%CCOMMENT = 'Logical for coupling O-A LES' -TFIELDLIST(IDX)%NGRID = 0 -TFIELDLIST(IDX)%NTYPE = TYPELOG -TFIELDLIST(IDX)%NDIMS = 0 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'SURF' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'SURF' -TFIELDLIST(IDX)%CUNITS = '' -TFIELDLIST(IDX)%CDIR = '--' -TFIELDLIST(IDX)%CCOMMENT = 'Kind of surface processes parameterization' -TFIELDLIST(IDX)%NGRID = 0 -TFIELDLIST(IDX)%NTYPE = TYPECHAR -TFIELDLIST(IDX)%NDIMS = 0 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_C0D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'CPL_AROME' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'CPL_AROME' -TFIELDLIST(IDX)%CUNITS = '' -TFIELDLIST(IDX)%CDIR = '--' -TFIELDLIST(IDX)%CCOMMENT = 'Logical for AROME coupling file' -TFIELDLIST(IDX)%NGRID = 0 -TFIELDLIST(IDX)%NTYPE = TYPELOG -TFIELDLIST(IDX)%NDIMS = 0 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'COUPLING' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'COUPLING' -TFIELDLIST(IDX)%CUNITS = '' -TFIELDLIST(IDX)%CDIR = '--' -TFIELDLIST(IDX)%CCOMMENT = 'Logical for coupling file' -TFIELDLIST(IDX)%NGRID = 0 -TFIELDLIST(IDX)%NTYPE = TYPELOG -TFIELDLIST(IDX)%NDIMS = 0 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'UT' -TFIELDLIST(IDX)%CSTDNAME = 'x_wind' -TFIELDLIST(IDX)%CLONGNAME = 'UT' -TFIELDLIST(IDX)%CUNITS = 'm s-1' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_Z_U component of wind' -TFIELDLIST(IDX)%NGRID = 2 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'VT' -TFIELDLIST(IDX)%CSTDNAME = 'y_wind' -TFIELDLIST(IDX)%CLONGNAME = 'VT' -TFIELDLIST(IDX)%CUNITS = 'm s-1' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_Z_V component of wind' -TFIELDLIST(IDX)%NGRID = 3 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'WT' -TFIELDLIST(IDX)%CSTDNAME = 'upward_air_velocity' -TFIELDLIST(IDX)%CLONGNAME = 'WT' -TFIELDLIST(IDX)%CUNITS = 'm s-1' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_Z_vertical wind' -TFIELDLIST(IDX)%NGRID = 4 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'THT' -TFIELDLIST(IDX)%CSTDNAME = 'air_potential_temperature' -TFIELDLIST(IDX)%CLONGNAME = 'THT' -TFIELDLIST(IDX)%CUNITS = 'K' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_Z_potential temperature' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'UM' -TFIELDLIST(IDX)%CSTDNAME = 'x_wind' -TFIELDLIST(IDX)%CLONGNAME = 'UM' -TFIELDLIST(IDX)%CUNITS = 'm s-1' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_Z_U component of wind' -TFIELDLIST(IDX)%NGRID = 2 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'VM' -TFIELDLIST(IDX)%CSTDNAME = 'y_wind' -TFIELDLIST(IDX)%CLONGNAME = 'VM' -TFIELDLIST(IDX)%CUNITS = 'm s-1' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_Z_V component of wind' -TFIELDLIST(IDX)%NGRID = 3 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'WM' -TFIELDLIST(IDX)%CSTDNAME = 'upward_air_velocity' -TFIELDLIST(IDX)%CLONGNAME = 'WM' -TFIELDLIST(IDX)%CUNITS = 'm s-1' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_Z_vertical wind' -TFIELDLIST(IDX)%NGRID = 4 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'DUM' -TFIELDLIST(IDX)%CSTDNAME = 'x_wind' -TFIELDLIST(IDX)%CLONGNAME = 'DUM' -TFIELDLIST(IDX)%CUNITS = 'm s-1' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_Z_U component of wind' -TFIELDLIST(IDX)%NGRID = 2 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'DVM' -TFIELDLIST(IDX)%CSTDNAME = 'y_wind' -TFIELDLIST(IDX)%CLONGNAME = 'DVM' -TFIELDLIST(IDX)%CUNITS = 'm s-1' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_Z_V component of wind' -TFIELDLIST(IDX)%NGRID = 3 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'DWM' -TFIELDLIST(IDX)%CSTDNAME = 'upward_air_velocity' -TFIELDLIST(IDX)%CLONGNAME = 'DWM' -TFIELDLIST(IDX)%CUNITS = 'm s-1' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_Z_vertical wind' -TFIELDLIST(IDX)%NGRID = 4 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'TKET' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'TKET' -TFIELDLIST(IDX)%CUNITS = 'm2 s-2' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_Z_Turbulent Kinetic Energy' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'TKEMS' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'TKEMS' -TFIELDLIST(IDX)%CUNITS = 'm2 s-3' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_Z_Turbulent Kinetic Energy adv source' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'PABST' -TFIELDLIST(IDX)%CSTDNAME = 'air_pressure' -TFIELDLIST(IDX)%CLONGNAME = 'PABST' -TFIELDLIST(IDX)%CUNITS = 'Pa' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_Z_ABSolute Pressure' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'PHIT' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'PHIT' -TFIELDLIST(IDX)%CUNITS = 'Pa' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_Z_Reduced Pressure Oce/Shallow conv' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'RT' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'RT' -TFIELDLIST(IDX)%CUNITS = 'kg kg-1' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'Moist variables (rho Rn)' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 4 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X4D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'RVT' + CSTDNAME = '', & + CLONGNAME = 'DYHAT', & + CUNITS = 'm', & + CDIR = 'YY', & + CCOMMENT = 'Horizontal stretching in y', & + NGRID = 3, & + NTYPE = TYPEREAL, & + NDIMS = 1, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'ALT', & + CSTDNAME = 'altitude', & + CLONGNAME = 'ALT', & + CUNITS = 'm', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_ALTitude', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'DIRCOSXW', & + CSTDNAME = '', & + CLONGNAME = 'DIRCOSXW', & + CUNITS = '', & + CDIR = 'XY', & + CCOMMENT = 'X director cosinus of the normal to the ground surface', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'DIRCOSYW', & + CSTDNAME = '', & + CLONGNAME = 'DIRCOSYW', & + CUNITS = '', & + CDIR = 'XY', & + CCOMMENT = 'Y director cosinus of the normal to the ground surface', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'DIRCOSZW', & + CSTDNAME = '', & + CLONGNAME = 'DIRCOSZW', & + CUNITS = '', & + CDIR = 'XY', & + CCOMMENT = 'Z director cosinus of the normal to the ground surface', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'COSSLOPE', & + CSTDNAME = '', & + CLONGNAME = 'COSSLOPE', & + CUNITS = '', & + CDIR = 'XY', & + CCOMMENT = 'cosinus of the angle between i and the slope vector', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'SINSLOPE', & + CSTDNAME = '', & + CLONGNAME = 'SINSLOPE', & + CUNITS = '', & + CDIR = 'XY', & + CCOMMENT = 'sinus of the angle between i and the slope vector', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'MAP', & !TODO: check stdname -TFIELDLIST(IDX)%CSTDNAME = 'humidity_mixing_ratio' -TFIELDLIST(IDX)%CLONGNAME = 'RVT' -TFIELDLIST(IDX)%CUNITS = 'kg kg-1' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_Z_Vapor mixing Ratio' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'RCT' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'RCT' -TFIELDLIST(IDX)%CUNITS = 'kg kg-1' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_Z_Cloud mixing Ratio' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'RRT' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'RRT' -TFIELDLIST(IDX)%CUNITS = 'kg kg-1' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_Z_Rain mixing Ratio' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'RIT' + CSTDNAME = '', & + CLONGNAME = 'MAP', & + CUNITS = '', & + CDIR = 'XY', & + CCOMMENT = 'Map factor', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'latitude', & + CSTDNAME = 'latitude', & + CLONGNAME = 'latitude', & + CUNITS = 'degrees_north', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_latitude at mass point', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'longitude', & + CSTDNAME = 'longitude', & + CLONGNAME = 'longitude', & + CUNITS = 'degrees_east', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_longitude at mass point', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'latitude_u', & + CSTDNAME = 'latitude_at_u_location', & + CLONGNAME = 'latitude at u location', & + CUNITS = 'degrees_north', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_latitude at u point', & + NGRID = 2, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'longitude_u', & + CSTDNAME = 'longitude_at_u_location', & + CLONGNAME = 'longitude at u location', & + CUNITS = 'degrees_east', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_longitude at u point', & + NGRID = 2, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'latitude_v', & + CSTDNAME = 'latitude_at_v_location', & + CLONGNAME = 'latitude at v location', & + CUNITS = 'degrees_north', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_latitude at v point', & + NGRID = 3, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'longitude_v', & + CSTDNAME = 'longitude_at_v_location', & + CLONGNAME = 'longitude at v location', & + CUNITS = 'degrees_east', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_longitude at v point', & + NGRID = 3, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'latitude_f', & + CSTDNAME = 'latitude_at_f_location', & + CLONGNAME = 'latitude at f location', & + CUNITS = 'degrees_north', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_latitude at f point', & + NGRID = 5, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'longitude_f', & + CSTDNAME = 'longitude_at_f_location', & + CLONGNAME = 'longitude at f location', & + CUNITS = 'degrees_east', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_longitude at f point', & + NGRID = 5, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'LAT', & +! CSTDNAME = 'latitude', & + CSTDNAME = '', & + CLONGNAME = 'LAT', & + CUNITS = 'degrees_north', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_latitude', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'LON', & +! CSTDNAME = 'longitude', & + CSTDNAME = '', & + CLONGNAME = 'LON', & + CUNITS = 'degrees_east', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_longitude', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .FALSE. ) ) + +!Note: do not use XHAT_ll in I/O (use XHAT instead) +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'XHAT_ll', & + CSTDNAME = 'projection_x_coordinate', & + CLONGNAME = 'XHAT_ll', & + CUNITS = 'm', & +!PW:BUG?: CDIR=XX => correct? variable is NOT distributed (same value on all processes) (see alse YHAT_ll...) +!PW:BUG?: NGRID=2 => correct? variable is NOT distributed (same value on all processes) +!PW:TODO?: create a new field to say if the variable is distributed? and how (X,Y,XY...)? + CDIR = 'XX', & + CCOMMENT = 'Position x in the conformal or cartesian plane (all domain)', & + NGRID = 2, & + NTYPE = TYPEREAL, & + NDIMS = 1, & + LTIMEDEP = .FALSE. ) ) + +!Note: do not use YHAT_ll in I/O (use YHAT instead) +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'YHAT_ll', & + CSTDNAME = 'projection_y_coordinate', & + CLONGNAME = 'YHAT_ll', & + CUNITS = 'm', & + CDIR = 'YY', & + CCOMMENT = 'Position y in the conformal or cartesian plane (all domain)', & + NGRID = 3, & + NTYPE = TYPEREAL, & + NDIMS = 1, & + LTIMEDEP = .FALSE. ) ) + +!Note: do not use XHATM_ll in I/O (use XHATM instead) +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'XHATM_ll', & + CSTDNAME = 'projection_x_coordinate', & + CLONGNAME = 'XHATL_ll', & + CUNITS = 'm', & + CDIR = 'XX', & + CCOMMENT = 'Position x in the conformal or cartesian plane at mass points (all domain)', & + NGRID = 2, & + NTYPE = TYPEREAL, & + NDIMS = 1, & + LTIMEDEP = .FALSE. ) ) + +!Note: do not use YHATM_ll in I/O (use YHATM instead) +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'YHATM_ll', & + CSTDNAME = 'projection_y_coordinate', & + CLONGNAME = 'YHATM_ll', & + CUNITS = 'm', & + CDIR = 'YY', & + CCOMMENT = 'Position y in the conformal or cartesian plane at mass points (all domain)', & + NGRID = 3, & + NTYPE = TYPEREAL, & + NDIMS = 1, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'ZS', & + CSTDNAME = 'surface_altitude', & + CLONGNAME = 'ZS', & + CUNITS = 'm', & + CDIR = 'XY', & + CCOMMENT = 'orography', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'ZWS', & + CSTDNAME = 'sea_surface_wave_significant_height', & + CLONGNAME = 'ZWS', & + CUNITS = 'm', & + CDIR = 'XY', & + CCOMMENT = 'sea wave height', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'ZSMT', & + CSTDNAME = '', & + CLONGNAME = 'ZSMT', & + CUNITS = 'm', & + CDIR = 'XY', & + CCOMMENT = 'smooth orography', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'SLEVE', & + CSTDNAME = '', & + CLONGNAME = 'SLEVE', & + CUNITS = '', & + CDIR = '--', & + CCOMMENT = 'Logical for SLEVE coordinate', & + NGRID = 4, & + NTYPE = TYPELOG, & + NDIMS = 0, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'LEN1', & + CSTDNAME = '', & + CLONGNAME = 'LEN1', & + CUNITS = '', & + CDIR = '--', & + CCOMMENT = 'Decay scale for smooth topography', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 0, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'LEN2', & + CSTDNAME = '', & + CLONGNAME = 'LEN2', & + CUNITS = '', & + CDIR = '--', & + CCOMMENT = 'Decay scale for small-scale topography deviation', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 0, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'DTMOD', & + CSTDNAME = '', & + CLONGNAME = 'DTMOD', & + CUNITS = 'seconds since YYYY-MM-DD HH:MM:SS.S', & + CDIR = '--', & + CCOMMENT = 'Time and date of model beginning', & + NGRID = 0, & + NTYPE = TYPEDATE, & + NDIMS = 0, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'DTCUR', & + CSTDNAME = 'time', & + CLONGNAME = 'DTCUR', & + CUNITS = 'seconds since YYYY-MM-DD HH:MM:SS.S', & + CDIR = '--', & + CCOMMENT = 'Current time and date', & + NGRID = 0, & + NTYPE = TYPEDATE, & + NDIMS = 0, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'DTRAD_FULL', & + CSTDNAME = '', & + CLONGNAME = 'DTRAD_FULL', & + CUNITS = 'seconds since YYYY-MM-DD HH:MM:SS.S', & + CDIR = '--', & + CCOMMENT = 'Time and date of last full radiation call', & + NGRID = 0, & + NTYPE = TYPEDATE, & + NDIMS = 0, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'DTRAD_CLLY', & + CSTDNAME = '', & + CLONGNAME = 'DTRAD_CLLY', & + CUNITS = 'seconds since YYYY-MM-DD HH:MM:SS.S', & + CDIR = '--', & + CCOMMENT = 'Time and date of last radiation call for only cloudy verticals', & + NGRID = 0, & + NTYPE = TYPEDATE, & + NDIMS = 0, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'DTDCONV', & + CSTDNAME = '', & + CLONGNAME = 'DTDCONV', & + CUNITS = 'seconds since YYYY-MM-DD HH:MM:SS.S', & + CDIR = '--', & + CCOMMENT = 'Time and date of the last deep convection call', & + NGRID = 0, & + NTYPE = TYPEDATE, & + NDIMS = 0, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'DTEXP', & + CSTDNAME = '', & + CLONGNAME = 'DTEXP', & + CUNITS = 'seconds since YYYY-MM-DD HH:MM:SS.S', & + CDIR = '--', & + CCOMMENT = 'Time and date of experiment beginning', & + NGRID = 0, & + NTYPE = TYPEDATE, & + NDIMS = 0, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'DTSEG', & + CSTDNAME = '', & + CLONGNAME = 'DTSEG', & + CUNITS = 'seconds since YYYY-MM-DD HH:MM:SS.S', & + CDIR = '--', & + CCOMMENT = 'Time and date of segment beginning', & + NGRID = 0, & + NTYPE = TYPEDATE, & + NDIMS = 0, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'L1D', & + CSTDNAME = '', & + CLONGNAME = 'L1D', & + CUNITS = '', & + CDIR = '--', & + CCOMMENT = 'Logical for 1D model version', & + NGRID = 0, & + NTYPE = TYPELOG, & + NDIMS = 0, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'L2D', & + CSTDNAME = '', & + CLONGNAME = 'L2D', & + CUNITS = '', & + CDIR = '--', & + CCOMMENT = 'Logical for 2D model version', & + NGRID = 0, & + NTYPE = TYPELOG, & + NDIMS = 0, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'PACK', & + CSTDNAME = '', & + CLONGNAME = 'PACK', & + CUNITS = '', & + CDIR = '--', & + CCOMMENT = 'Logical to compress 1D or 2D FM files', & + NGRID = 0, & + NTYPE = TYPELOG, & + NDIMS = 0, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'CARTESIAN', & + CSTDNAME = '', & + CLONGNAME = 'CARTESIAN', & + CUNITS = '', & + CDIR = '--', & + CCOMMENT = 'Logical for cartesian geometry', & + NGRID = 0, & + NTYPE = TYPELOG, & + NDIMS = 0, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'LBOUSS', & + CSTDNAME = '', & + CLONGNAME = 'LBOUSS', & + CUNITS = '', & + CDIR = '--', & + CCOMMENT = 'Logical for Boussinesq approximation', & + NGRID = 0, & + NTYPE = TYPELOG, & + NDIMS = 0, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'LOCEAN', & + CSTDNAME = '', & + CLONGNAME = 'LOCEAN', & + CUNITS = '', & + CDIR = '--', & + CCOMMENT = 'Logical for Ocean MesoNH', & + NGRID = 0, & + NTYPE = TYPELOG, & + NDIMS = 0, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'LCOUPLES', & + CSTDNAME = '', & + CLONGNAME = 'LCOUPLES', & + CUNITS = '', & + CDIR = '--', & + CCOMMENT = 'Logical for coupling O-A LES', & + NGRID = 0, & + NTYPE = TYPELOG, & + NDIMS = 0, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'SURF', & + CSTDNAME = '', & + CLONGNAME = 'SURF', & + CUNITS = '', & + CDIR = '--', & + CCOMMENT = 'Kind of surface processes parameterization', & + NGRID = 0, & + NTYPE = TYPECHAR, & + NDIMS = 0, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'CPL_AROME', & + CSTDNAME = '', & + CLONGNAME = 'CPL_AROME', & + CUNITS = '', & + CDIR = '--', & + CCOMMENT = 'Logical for AROME coupling file', & + NGRID = 0, & + NTYPE = TYPELOG, & + NDIMS = 0, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'COUPLING', & + CSTDNAME = '', & + CLONGNAME = 'COUPLING', & + CUNITS = '', & + CDIR = '--', & + CCOMMENT = 'Logical for coupling file', & + NGRID = 0, & + NTYPE = TYPELOG, & + NDIMS = 0, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'UT', & + CSTDNAME = 'x_wind', & + CLONGNAME = 'UT', & + CUNITS = 'm s-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_U component of wind', & + NGRID = 2, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'VT', & + CSTDNAME = 'y_wind', & + CLONGNAME = 'VT', & + CUNITS = 'm s-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_V component of wind', & + NGRID = 3, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'WT', & + CSTDNAME = 'upward_air_velocity', & + CLONGNAME = 'WT', & + CUNITS = 'm s-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_vertical wind', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'THT', & + CSTDNAME = 'air_potential_temperature', & + CLONGNAME = 'THT', & + CUNITS = 'K', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_potential temperature', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'UM', & + CSTDNAME = 'x_wind', & + CLONGNAME = 'UM', & + CUNITS = 'm s-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_U component of wind', & + NGRID = 2, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'VM', & + CSTDNAME = 'y_wind', & + CLONGNAME = 'VM', & + CUNITS = 'm s-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_V component of wind', & + NGRID = 3, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'WM', & + CSTDNAME = 'upward_air_velocity', & + CLONGNAME = 'WM', & + CUNITS = 'm s-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_vertical wind', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'DUM', & + CSTDNAME = 'x_wind', & + CLONGNAME = 'DUM', & + CUNITS = 'm s-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_U component of wind', & + NGRID = 2, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'DVM', & + CSTDNAME = 'y_wind', & + CLONGNAME = 'DVM', & + CUNITS = 'm s-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_V component of wind', & + NGRID = 3, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'DWM', & + CSTDNAME = 'upward_air_velocity', & + CLONGNAME = 'DWM', & + CUNITS = 'm s-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_vertical wind', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'TKET', & + CSTDNAME = '', & + CLONGNAME = 'TKET', & + CUNITS = 'm2 s-2', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_Turbulent Kinetic Energy', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'TKEMS', & + CSTDNAME = '', & + CLONGNAME = 'TKEMS', & + CUNITS = 'm2 s-3', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_Turbulent Kinetic Energy adv source', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'PABST', & + CSTDNAME = 'air_pressure', & + CLONGNAME = 'PABST', & + CUNITS = 'Pa', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_ABSolute Pressure', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'PHIT', & + CSTDNAME = '', & + CLONGNAME = 'PHIT', & + CUNITS = 'Pa', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_Reduced Pressure Oce/Shallow conv', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'RT', & + CSTDNAME = '', & + CLONGNAME = 'RT', & + CUNITS = 'kg kg-1', & + CDIR = 'XY', & + CCOMMENT = 'Moist variables (rho Rn)', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 4, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'RVT', & !TODO: check stdname -TFIELDLIST(IDX)%CSTDNAME = 'cloud_ice_mixing_ratio' -TFIELDLIST(IDX)%CLONGNAME = 'RIT' -TFIELDLIST(IDX)%CUNITS = 'kg kg-1' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_Z_Ice mixing Ratio' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'RST' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'RST' -TFIELDLIST(IDX)%CUNITS = 'kg kg-1' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_Z_Snow mixing Ratio' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'RGT' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'RGT' -TFIELDLIST(IDX)%CUNITS = 'kg kg-1' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_Z_Graupel mixing Ratio' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'RHT' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'RHT' -TFIELDLIST(IDX)%CUNITS = 'kg kg-1' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_Z_Hail mixing Ratio' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -TFIELDLIST(IDX)%NDIMS = 3 -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'SUPSATMAX' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'SUPSATMAX' -TFIELDLIST(IDX)%CUNITS = '' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_Z_Supersaturation' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'NACT' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'NACT' -TFIELDLIST(IDX)%CUNITS = '' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_Z_Nact' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'SSPRO' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'SSPRO' -TFIELDLIST(IDX)%CUNITS = '' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_Z_Supersaturation' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'NPRO' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'NPRO' -TFIELDLIST(IDX)%CUNITS = '' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_Z_Nact' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'INPAP' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'INPAP' -TFIELDLIST(IDX)%CUNITS = 'kg m-2 s-1' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_INstantaneous Precipitating Aerosol Rate' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 2 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'ACPAP' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'ACPAP' -TFIELDLIST(IDX)%CUNITS = 'kg m-2' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_ACcumulated Precipitating Aerosol Rate' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 2 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'EFIELDU' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'EFIELDU' -TFIELDLIST(IDX)%CUNITS = 'V m-1' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_Z_EFIELDU' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'EFIELDV' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'EFIELDV' -TFIELDLIST(IDX)%CUNITS = 'V m-1' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_Z_EFIELDV' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'EFIELDW' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'EFIELDW' -TFIELDLIST(IDX)%CUNITS = 'V m-1' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_Z_EFIELDW' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'NI_IAGGS' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'NI_IAGGS' -TFIELDLIST(IDX)%CUNITS = 'C m-3 s-1' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_Z_NI_IAGGS' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'NI_IDRYG' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'NI_IDRYG' -TFIELDLIST(IDX)%CUNITS = 'C m-3 s-1' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_Z_NI_IDRYG' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'NI_SDRYG' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'NI_SDRYG' -TFIELDLIST(IDX)%CUNITS = 'C m-3 s-1' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_Z_NI_SDRYG' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'INDUC_CG' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'INDUC_CG' -TFIELDLIST(IDX)%CUNITS = 'C m-3 s-1' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_Z_INDUC_CG' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'TRIG_IC' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'TRIG_IC' -TFIELDLIST(IDX)%CUNITS = '1' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_FLASH_MAP_TRIG_IC' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEINT -TFIELDLIST(IDX)%NDIMS = 2 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'IMPACT_CG' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'IMPACT_CG' -TFIELDLIST(IDX)%CUNITS = '1' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_FLASH_MAP_IMPACT_CG' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEINT -TFIELDLIST(IDX)%NDIMS = 2 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'AREA_CG' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'AREA_CG' -TFIELDLIST(IDX)%CUNITS = '1' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_FLASH_MAP_2DAREA_CG' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEINT -TFIELDLIST(IDX)%NDIMS = 2 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'AREA_IC' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'AREA_IC' -TFIELDLIST(IDX)%CUNITS = '1' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_FLASH_MAP_2DAREA_IC' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEINT -TFIELDLIST(IDX)%NDIMS = 2 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'FLASH_3DCG' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'FLASH_3DCG' -TFIELDLIST(IDX)%CUNITS = '1' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_Z_FLASH_MAP_3DCG' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEINT -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'FLASH_3DIC' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'FLASH_3DIC' -TFIELDLIST(IDX)%CUNITS = '1' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_Z_FLASH_MAP_3DIC' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEINT -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'PHC' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'PHC' -TFIELDLIST(IDX)%CUNITS = '1' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'pH in cloud' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'PHR' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'PHR' -TFIELDLIST(IDX)%CUNITS = '1' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'pH in rain' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'LSUM' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'LSUM' -TFIELDLIST(IDX)%CUNITS = 'm s-1' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_Z_Large Scale U component' -TFIELDLIST(IDX)%NGRID = 2 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'LSVM' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'LSVM' -TFIELDLIST(IDX)%CUNITS = 'm s-1' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_Z_Large Scale V component' -TFIELDLIST(IDX)%NGRID = 3 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'LSWM' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'LSWM' -TFIELDLIST(IDX)%CUNITS = 'm s-1' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_Z_Large Scale vertical wind' -TFIELDLIST(IDX)%NGRID = 4 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'LSTHM' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'LSTHM' -TFIELDLIST(IDX)%CUNITS = 'K' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_Z_Large Scale potential Temperature' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'LSRVM' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'LSRVM' -TFIELDLIST(IDX)%CUNITS = 'kg kg-1' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_Z_Large Scale Vapor Mixing Ratio' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'RIMX' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'RIMX' -TFIELDLIST(IDX)%CUNITS = '' -TFIELDLIST(IDX)%CDIR = '--' -TFIELDLIST(IDX)%CCOMMENT = 'Number of points in the lateral absorbing layer in the x direction' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEINT -TFIELDLIST(IDX)%NDIMS = 0 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_N0D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'RIMY' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'RIMY' -TFIELDLIST(IDX)%CUNITS = '' -TFIELDLIST(IDX)%CDIR = '--' -TFIELDLIST(IDX)%CCOMMENT = 'Number of points in the lateral absorbing layer in the y direction' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEINT -TFIELDLIST(IDX)%NDIMS = 0 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_N0D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'HORELAX_UVWTH' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'HORELAX_UVWTH' -TFIELDLIST(IDX)%CUNITS = '' -TFIELDLIST(IDX)%CDIR = '--' -TFIELDLIST(IDX)%CCOMMENT = 'Switch to activate the HOrizontal RELAXation' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPELOG -TFIELDLIST(IDX)%NDIMS = 0 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_L0D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'LBXUM' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'LBXUM' -TFIELDLIST(IDX)%CUNITS = 'm s-1' -! TFIELDLIST(IDX)%CDIR = '' -TFIELDLIST(IDX)%CLBTYPE = 'LBXU' -TFIELDLIST(IDX)%CCOMMENT = '2_Y_Z_LBXUM' -TFIELDLIST(IDX)%NGRID = 2 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'LBXVM' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'LBXVM' -TFIELDLIST(IDX)%CUNITS = 'm s-1' -! TFIELDLIST(IDX)%CDIR = '' -TFIELDLIST(IDX)%CLBTYPE = 'LBX' -TFIELDLIST(IDX)%CCOMMENT = '2_Y_Z_LBXVM' -TFIELDLIST(IDX)%NGRID = 3 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'LBXWM' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'LBXWM' -TFIELDLIST(IDX)%CUNITS = 'm s-1' -! TFIELDLIST(IDX)%CDIR = '' -TFIELDLIST(IDX)%CLBTYPE = 'LBX' -TFIELDLIST(IDX)%CCOMMENT = '2_Y_Z_LBXWM' -TFIELDLIST(IDX)%NGRID = 4 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'LBYUM' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'LBYUM' -TFIELDLIST(IDX)%CUNITS = 'm s-1' -! TFIELDLIST(IDX)%CDIR = '' -TFIELDLIST(IDX)%CLBTYPE = 'LBY' -TFIELDLIST(IDX)%CCOMMENT = '2_Y_Z_LBYUM' -TFIELDLIST(IDX)%NGRID = 2 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'LBYVM' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'LBYVM' -TFIELDLIST(IDX)%CUNITS = 'm s-1' -! TFIELDLIST(IDX)%CDIR = '' -TFIELDLIST(IDX)%CLBTYPE = 'LBYV' -TFIELDLIST(IDX)%CCOMMENT = '2_Y_Z_LBYVM' -TFIELDLIST(IDX)%NGRID = 3 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'LBYWM' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'LBYWM' -TFIELDLIST(IDX)%CUNITS = 'm s-1' -! TFIELDLIST(IDX)%CDIR = '' -TFIELDLIST(IDX)%CLBTYPE = 'LBY' -TFIELDLIST(IDX)%CCOMMENT = '2_Y_Z_LBYWM' -TFIELDLIST(IDX)%NGRID = 4 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'LBXTHM' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'LBXTHM' -TFIELDLIST(IDX)%CUNITS = 'K' -! TFIELDLIST(IDX)%CDIR = '' -TFIELDLIST(IDX)%CLBTYPE = 'LBX' -TFIELDLIST(IDX)%CCOMMENT = '2_Y_Z_LBXTHM' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'LBYTHM' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'LBYTHM' -TFIELDLIST(IDX)%CUNITS = 'K' -! TFIELDLIST(IDX)%CDIR = '' -TFIELDLIST(IDX)%CLBTYPE = 'LBY' -TFIELDLIST(IDX)%CCOMMENT = '2_Y_Z_LBYTHM' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'HORELAX_TKE' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'HORELAX_TKE' -TFIELDLIST(IDX)%CUNITS = '' -TFIELDLIST(IDX)%CDIR = '--' -TFIELDLIST(IDX)%CCOMMENT = 'Switch to activate the HOrizontal RELAXation' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPELOG -TFIELDLIST(IDX)%NDIMS = 0 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_L0D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'LBXTKEM' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'LBXTKEM' -TFIELDLIST(IDX)%CUNITS = 'm2 s-2' -! TFIELDLIST(IDX)%CDIR = '' -TFIELDLIST(IDX)%CLBTYPE = 'LBX' -TFIELDLIST(IDX)%CCOMMENT = '2_Y_Z_LBXTKEM' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'LBYTKEM' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'LBYTKEM' -TFIELDLIST(IDX)%CUNITS = 'm2 s-2' -! TFIELDLIST(IDX)%CDIR = '' -TFIELDLIST(IDX)%CLBTYPE = 'LBY' -TFIELDLIST(IDX)%CCOMMENT = '2_Y_Z_LBYTKEM' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'DRYMASST' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'DRYMASST' -TFIELDLIST(IDX)%CUNITS = 'kg' -TFIELDLIST(IDX)%CDIR = '--' -TFIELDLIST(IDX)%CCOMMENT = 'Total Dry Mass' -TFIELDLIST(IDX)%NGRID = 0 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 0 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X0D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'DRYMASSS' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'DRYMASSS' -TFIELDLIST(IDX)%CUNITS = 'kg' -TFIELDLIST(IDX)%CDIR = '--' -TFIELDLIST(IDX)%CCOMMENT = 'Total Dry Mass Source' -TFIELDLIST(IDX)%NGRID = 0 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 0 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X0D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'BL_DEPTH' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'BL_DEPTH' -TFIELDLIST(IDX)%CUNITS = 'm' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_BL_DEPTH' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 2 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'SBL_DEPTH' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'SBL_DEPTH' -TFIELDLIST(IDX)%CUNITS = 'm' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_BL_SDEPTH' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 2 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'WTHVMF' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'WTHVMF' -TFIELDLIST(IDX)%CUNITS = 'm K s-1' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_WTHVMF' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'SRCT' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'SRCT' -TFIELDLIST(IDX)%CUNITS = 'kg kg-2' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_Z_normalized 2nd_order moment s_r_c/2Sigma_s2' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'SIGS' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'SIGS' -TFIELDLIST(IDX)%CUNITS = 'kg kg-2' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_Z_Sigma_s from turbulence scheme' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'RHOREFZ' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'RHOREFZ' -TFIELDLIST(IDX)%CUNITS = 'kg m-3' -TFIELDLIST(IDX)%CDIR = 'ZZ' -TFIELDLIST(IDX)%CCOMMENT = 'rhodz for reference state without orography' -TFIELDLIST(IDX)%NGRID = 4 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 1 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X1D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'THVREFZ' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'THVREFZ' -TFIELDLIST(IDX)%CUNITS = 'K' -TFIELDLIST(IDX)%CDIR = 'ZZ' -TFIELDLIST(IDX)%CCOMMENT = 'thetavz for reference state without orography' -TFIELDLIST(IDX)%NGRID = 4 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 1 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X1D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'EXNTOP' -TFIELDLIST(IDX)%CSTDNAME = 'dimensionless_exner_function' -TFIELDLIST(IDX)%CLONGNAME = 'EXNTOP' -TFIELDLIST(IDX)%CUNITS = '' -TFIELDLIST(IDX)%CDIR = '--' -TFIELDLIST(IDX)%CCOMMENT = 'Exner function at model top' -TFIELDLIST(IDX)%NGRID = 4 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 0 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -IDX = IDX+1 -! -! -IF (TRIM(CPROGRAM) == 'MESONH' .OR. TRIM(CPROGRAM) == 'DIAG' .OR. TRIM(CPROGRAM) == 'LFICDF') THEN -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'US_PRES' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'US_PRES' + CSTDNAME = 'humidity_mixing_ratio', & + CLONGNAME = 'RVT', & + CUNITS = 'kg kg-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_Vapor mixing Ratio', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'RCT', & + CSTDNAME = '', & + CLONGNAME = 'RCT', & + CUNITS = 'kg kg-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_Cloud mixing Ratio', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'RRT', & + CSTDNAME = '', & + CLONGNAME = 'RRT', & + CUNITS = 'kg kg-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_Rain mixing Ratio', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'RIT', & +!TODO: check stdname + CSTDNAME = 'cloud_ice_mixing_ratio', & + CLONGNAME = 'RIT', & + CUNITS = 'kg kg-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_Ice mixing Ratio', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'RST', & + CSTDNAME = '', & + CLONGNAME = 'RST', & + CUNITS = 'kg kg-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_Snow mixing Ratio', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'RGT', & + CSTDNAME = '', & + CLONGNAME = 'RGT', & + CUNITS = 'kg kg-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_Graupel mixing Ratio', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'RHT', & + CSTDNAME = '', & + CLONGNAME = 'RHT', & + CUNITS = 'kg kg-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_Hail mixing Ratio', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'SUPSATMAX', & + CSTDNAME = '', & + CLONGNAME = 'SUPSATMAX', & + CUNITS = '', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_Supersaturation', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'NACT', & + CSTDNAME = '', & + CLONGNAME = 'NACT', & + CUNITS = '', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_Nact', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'SSPRO', & + CSTDNAME = '', & + CLONGNAME = 'SSPRO', & + CUNITS = '', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_Supersaturation', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'NPRO', & + CSTDNAME = '', & + CLONGNAME = 'NPRO', & + CUNITS = '', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_NPRO', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'INPAP', & + CSTDNAME = '', & + CLONGNAME = 'INPAP', & + CUNITS = 'kg m-2 s-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_INstantaneous Precipitating Aerosol Rate', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'ACPAP', & + CSTDNAME = '', & + CLONGNAME = 'ACPAP', & + CUNITS = 'kg m-2', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_ACcumulated Precipitating Aerosol Rate', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'EFIELDU', & + CSTDNAME = '', & + CLONGNAME = 'EFIELDU', & + CUNITS = 'V m-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_EFIELDU', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'EFIELDV', & + CSTDNAME = '', & + CLONGNAME = 'EFIELDV', & + CUNITS = 'V m-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_EFIELDV', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'EFIELDW', & + CSTDNAME = '', & + CLONGNAME = 'EFIELDW', & + CUNITS = 'V m-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_EFIELDW', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'NI_IAGGS', & + CSTDNAME = '', & + CLONGNAME = 'NI_IAGGS', & + CUNITS = 'C m-3 s-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_NI_IAGGS', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'NI_IDRYG', & + CSTDNAME = '', & + CLONGNAME = 'NI_IDRYG', & + CUNITS = 'C m-3 s-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_NI_IDRYG', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'NI_SDRYG', & + CSTDNAME = '', & + CLONGNAME = 'NI_SDRYG', & + CUNITS = 'C m-3 s-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_NI_SDRYG', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'INDUC_CG', & + CSTDNAME = '', & + CLONGNAME = 'INDUC_CG', & + CUNITS = 'C m-3 s-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_INDUC_CG', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'TRIG_IC', & + CSTDNAME = '', & + CLONGNAME = 'TRIG_IC', & + CUNITS = '1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_FLASH_MAP_TRIG_IC', & + NGRID = 1, & + NTYPE = TYPEINT, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'IMPACT_CG', & + CSTDNAME = '', & + CLONGNAME = 'IMPACT_CG', & + CUNITS = '1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_FLASH_MAP_IMPACT_CG', & + NGRID = 1, & + NTYPE = TYPEINT, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'AREA_CG', & + CSTDNAME = '', & + CLONGNAME = 'AREA_CG', & + CUNITS = '1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_FLASH_MAP_2DAREA_CG', & + NGRID = 1, & + NTYPE = TYPEINT, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'AREA_IC', & + CSTDNAME = '', & + CLONGNAME = 'AREA_IC', & + CUNITS = '1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_FLASH_MAP_2DAREA_IC', & + NGRID = 1, & + NTYPE = TYPEINT, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'FLASH_3DCG', & + CSTDNAME = '', & + CLONGNAME = 'FLASH_3DCG', & + CUNITS = '1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_FLASH_MAP_3DCG', & + NGRID = 1, & + NTYPE = TYPEINT, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'FLASH_3DIC', & + CSTDNAME = '', & + CLONGNAME = 'FLASH_3DIC', & + CUNITS = '1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_FLASH_MAP_3DIC', & + NGRID = 1, & + NTYPE = TYPEINT, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'PHC', & + CSTDNAME = '', & + CLONGNAME = 'PHC', & + CUNITS = '1', & + CDIR = 'XY', & + CCOMMENT = 'pH in cloud', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'PHR', & + CSTDNAME = '', & + CLONGNAME = 'PHR', & + CUNITS = '1', & + CDIR = 'XY', & + CCOMMENT = 'pH in rain', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'LSUM', & + CSTDNAME = '', & + CLONGNAME = 'LSUM', & + CUNITS = 'm s-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_Large Scale U component', & + NGRID = 2, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'LSVM', & + CSTDNAME = '', & + CLONGNAME = 'LSVM', & + CUNITS = 'm s-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_Large Scale V component', & + NGRID = 3, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'LSWM', & + CSTDNAME = '', & + CLONGNAME = 'LSWM', & + CUNITS = 'm s-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_Large Scale vertical wind', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'LSTHM', & + CSTDNAME = '', & + CLONGNAME = 'LSTHM', & + CUNITS = 'K', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_Large Scale potential Temperature', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'LSRVM', & + CSTDNAME = '', & + CLONGNAME = 'LSRVM', & + CUNITS = 'kg kg-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_Large Scale Vapor Mixing Ratio', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'RIMX', & + CSTDNAME = '', & + CLONGNAME = 'RIMX', & + CUNITS = '', & + CDIR = '--', & + CCOMMENT = 'Number of points in the lateral absorbing layer in the x direction', & + NGRID = 1, & + NTYPE = TYPEINT, & + NDIMS = 0, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'RIMY', & + CSTDNAME = '', & + CLONGNAME = 'RIMY', & + CUNITS = '', & + CDIR = '--', & + CCOMMENT = 'Number of points in the lateral absorbing layer in the y direction', & + NGRID = 1, & + NTYPE = TYPEINT, & + NDIMS = 0, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'HORELAX_UVWTH', & + CSTDNAME = '', & + CLONGNAME = 'HORELAX_UVWTH', & + CUNITS = '', & + CDIR = '--', & + CCOMMENT = 'Switch to activate the HOrizontal RELAXation', & + NGRID = 1, & + NTYPE = TYPELOG, & + NDIMS = 0, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'LBXUM', & + CSTDNAME = '', & + CLONGNAME = 'LBXUM', & + CUNITS = 'm s-1', & +! CDIR = '' + CLBTYPE = 'LBXU', & + CCOMMENT = '2_Y_Z_LBXUM', & + NGRID = 2, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'LBXVM', & + CSTDNAME = '', & + CLONGNAME = 'LBXVM', & + CUNITS = 'm s-1', & +! CDIR = '' + CLBTYPE = 'LBX', & + CCOMMENT = '2_Y_Z_LBXVM', & + NGRID = 3, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'LBXWM', & + CSTDNAME = '', & + CLONGNAME = 'LBXWM', & + CUNITS = 'm s-1', & +! CDIR = '' + CLBTYPE = 'LBX', & + CCOMMENT = '2_Y_Z_LBXWM', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'LBYUM', & + CSTDNAME = '', & + CLONGNAME = 'LBYUM', & + CUNITS = 'm s-1', & +! CDIR = '' + CLBTYPE = 'LBY', & + CCOMMENT = '2_Y_Z_LBYUM', & + NGRID = 2, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'LBYVM', & + CSTDNAME = '', & + CLONGNAME = 'LBYVM', & + CUNITS = 'm s-1', & +! CDIR = '' + CLBTYPE = 'LBYV', & + CCOMMENT = '2_Y_Z_LBYVM', & + NGRID = 3, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'LBYWM', & + CSTDNAME = '', & + CLONGNAME = 'LBYWM', & + CUNITS = 'm s-1', & +! CDIR = '' + CLBTYPE = 'LBY', & + CCOMMENT = '2_Y_Z_LBYWM', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'LBXTHM', & + CSTDNAME = '', & + CLONGNAME = 'LBXTHM', & + CUNITS = 'K', & +! CDIR = '' + CLBTYPE = 'LBX', & + CCOMMENT = '2_Y_Z_LBXTHM', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'LBYTHM', & + CSTDNAME = '', & + CLONGNAME = 'LBYTHM', & + CUNITS = 'K', & +! CDIR = '' + CLBTYPE = 'LBY', & + CCOMMENT = '2_Y_Z_LBYTHM', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'HORELAX_TKE', & + CSTDNAME = '', & + CLONGNAME = 'HORELAX_TKE', & + CUNITS = '', & + CDIR = '--', & + CCOMMENT = 'Switch to activate the HOrizontal RELAXation', & + NGRID = 1, & + NTYPE = TYPELOG, & + NDIMS = 0, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'LBXTKEM', & + CSTDNAME = '', & + CLONGNAME = 'LBXTKEM', & + CUNITS = 'm2 s-2', & +! CDIR = '' + CLBTYPE = 'LBX', & + CCOMMENT = '2_Y_Z_LBXTKEM', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'LBYTKEM', & + CSTDNAME = '', & + CLONGNAME = 'LBYTKEM', & + CUNITS = 'm2 s-2', & +! CDIR = '' + CLBTYPE = 'LBY', & + CCOMMENT = '2_Y_Z_LBYTKEM', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'DRYMASST', & + CSTDNAME = '', & + CLONGNAME = 'DRYMASST', & + CUNITS = 'kg', & + CDIR = '--', & + CCOMMENT = 'Total Dry Mass', & + NGRID = 0, & + NTYPE = TYPEREAL, & + NDIMS = 0, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'DRYMASSS', & + CSTDNAME = '', & + CLONGNAME = 'DRYMASSS', & + CUNITS = 'kg', & + CDIR = '--', & + CCOMMENT = 'Total Dry Mass Source', & + NGRID = 0, & + NTYPE = TYPEREAL, & + NDIMS = 0, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'BL_DEPTH', & + CSTDNAME = '', & + CLONGNAME = 'BL_DEPTH', & + CUNITS = 'm', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_BL_DEPTH', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'SBL_DEPTH', & + CSTDNAME = '', & + CLONGNAME = 'SBL_DEPTH', & + CUNITS = 'm', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_BL_SDEPTH', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'WTHVMF', & + CSTDNAME = '', & + CLONGNAME = 'WTHVMF', & + CUNITS = 'm K s-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_WTHVMF', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'SRCT', & + CSTDNAME = '', & + CLONGNAME = 'SRCT', & + CUNITS = 'kg kg-2', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_normalized 2nd_order moment s_r_c/2Sigma_s2', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'SIGS', & + CSTDNAME = '', & + CLONGNAME = 'SIGS', & + CUNITS = 'kg kg-2', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_Sigma_s from turbulence scheme', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'RHOREFZ', & + CSTDNAME = '', & + CLONGNAME = 'RHOREFZ', & + CUNITS = 'kg m-3', & + CDIR = 'ZZ', & + CCOMMENT = 'rhodz for reference state without orography', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 1, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'THVREFZ', & + CSTDNAME = '', & + CLONGNAME = 'THVREFZ', & + CUNITS = 'K', & + CDIR = 'ZZ', & + CCOMMENT = 'thetavz for reference state without orography', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 1, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'EXNTOP', & + CSTDNAME = 'dimensionless_exner_function', & + CLONGNAME = 'EXNTOP', & + CUNITS = '', & + CDIR = '--', & + CCOMMENT = 'Exner function at model top', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 0, & + LTIMEDEP = .FALSE. ) ) + + IF (TRIM(CPROGRAM) == 'MESONH' .OR. TRIM(CPROGRAM) == 'DIAG' .OR. TRIM(CPROGRAM) == 'LFICDF') THEN + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'US_PRES', & + CSTDNAME = '', & + CLONGNAME = 'US_PRES', & !TODO: units? -TFIELDLIST(IDX)%CUNITS = '' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_Z_US_PRES' -TFIELDLIST(IDX)%NGRID = 2 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'VS_PRES' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'VS_PRES' + CUNITS = '', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_US_PRES', & + NGRID = 2, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'VS_PRES', & + CSTDNAME = '', & + CLONGNAME = 'VS_PRES', & !TODO: units? -TFIELDLIST(IDX)%CUNITS = '' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_Z_VS_PRES' -TFIELDLIST(IDX)%NGRID = 3 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'WS_PRES' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'WS_PRES' + CUNITS = '', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_VS_PRES', & + NGRID = 3, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'WS_PRES', & + CSTDNAME = '', & + CLONGNAME = 'WS_PRES', & !TODO: units? -TFIELDLIST(IDX)%CUNITS = '' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_Z_WS_PRES' -TFIELDLIST(IDX)%NGRID = 4 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'THS_CLD' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'THS_CLD' + CUNITS = '', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_WS_PRES', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'THS_CLD', & + CSTDNAME = '', & + CLONGNAME = 'THS_CLD', & !TODO: units? -TFIELDLIST(IDX)%CUNITS = '' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_Z_THS_CLD' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'RS_CLD' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'RS_CLD' -TFIELDLIST(IDX)%CUNITS = '' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'Source of Moist variables' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 4 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X4D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'RVS_CLD' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'RVS_CLD' -TFIELDLIST(IDX)%CUNITS = '' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_Z_RVS_CLD' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'RCS_CLD' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'RCS_CLD' -TFIELDLIST(IDX)%CUNITS = '' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_Z_RCS_CLD' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'RRS_CLD' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'RRS_CLD' -TFIELDLIST(IDX)%CUNITS = '' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_Z_RRS_CLD' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'RIS_CLD' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'RIS_CLD' -TFIELDLIST(IDX)%CUNITS = '' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_Z_RIS_CLD' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'RSS_CLD' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'RSS_CLD' -TFIELDLIST(IDX)%CUNITS = '' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_Z_RSS_CLD' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'RGS_CLD' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'RGS_CLD' -TFIELDLIST(IDX)%CUNITS = '' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_Z_RGS_CLD' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'RHS_CLD' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'RHS_CLD' -TFIELDLIST(IDX)%CUNITS = '' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_Z_RHS_CLD' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'CLDFR' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'CLDFR' -TFIELDLIST(IDX)%CUNITS = '1' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_Z_CLouD FRaction' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'ICEFR' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'ICEFR' -TFIELDLIST(IDX)%CUNITS = '1' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_Z_ICE cloud FRaction' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'CIT' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'CIT' -TFIELDLIST(IDX)%CUNITS = 'm-3' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_Z_Cloud Ice concentration' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'RAINFR' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'RAINFR' -TFIELDLIST(IDX)%CUNITS = '1' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_Z_Rain FRaction' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 + CUNITS = '', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_THS_CLD', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'RS_CLD', & + CSTDNAME = '', & + CLONGNAME = 'RS_CLD', & + CUNITS = '', & + CDIR = 'XY', & + CCOMMENT = 'Source of Moist variables', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 4, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'RVS_CLD', & + CSTDNAME = '', & + CLONGNAME = 'RVS_CLD', & + CUNITS = '', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_RVS_CLD', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'RCS_CLD', & + CSTDNAME = '', & + CLONGNAME = 'RCS_CLD', & + CUNITS = '', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_RCS_CLD', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'RRS_CLD', & + CSTDNAME = '', & + CLONGNAME = 'RRS_CLD', & + CUNITS = '', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_RRS_CLD', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'RIS_CLD', & + CSTDNAME = '', & + CLONGNAME = 'RIS_CLD', & + CUNITS = '', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_RIS_CLD', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'RSS_CLD', & + CSTDNAME = '', & + CLONGNAME = 'RSS_CLD', & + CUNITS = '', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_RSS_CLD', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'RGS_CLD', & + CSTDNAME = '', & + CLONGNAME = 'RGS_CLD', & + CUNITS = '', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_RGS_CLD', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'RHS_CLD', & + CSTDNAME = '', & + CLONGNAME = 'RHS_CLD', & + CUNITS = '', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_RHS_CLD', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'CLDFR', & + CSTDNAME = '', & + CLONGNAME = 'CLDFR', & + CUNITS = '1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_CLouD FRaction', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'ICEFR', & + CSTDNAME = '', & + CLONGNAME = 'ICEFR', & + CUNITS = '1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_ICE cloud FRaction', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'CIT', & + CSTDNAME = '', & + CLONGNAME = 'CIT', & + CUNITS = 'm-3', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_Cloud Ice concentration', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'RAINFR', & + CSTDNAME = '', & + CLONGNAME = 'RAINFR', & + CUNITS = '1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_Rain FRaction', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ) ! END IF ! CPROGRAM=MESONH .OR. DIAG .OR. LFICDF ! ! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'RHODREF' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'RHODREF' -TFIELDLIST(IDX)%CUNITS = 'kg m-3' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'Dry density for reference state with orography' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'THVREF' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'THVREF' -TFIELDLIST(IDX)%CUNITS = 'K' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'Thetav for reference state with orography' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'RHODREF', & + CSTDNAME = '', & + CLONGNAME = 'RHODREF', & + CUNITS = 'kg m-3', & + CDIR = 'XY', & + CCOMMENT = 'Dry density for reference state with orography', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'THVREF', & + CSTDNAME = '', & + CLONGNAME = 'THVREF', & + CUNITS = 'K', & + CDIR = 'XY', & + CCOMMENT = 'Thetav for reference state with orography', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .FALSE. ) ) ! ! IF ( TRIM(CPROGRAM) =='MESONH' .OR. TRIM(CPROGRAM) == 'DIAG' & .OR. TRIM(CPROGRAM) == 'LFICDF'.OR. TRIM(CPROGRAM) == 'SPAWN' ) THEN ! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'DTHRAD' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'DTHRAD' -TFIELDLIST(IDX)%CUNITS = 'K s-1' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_Z_RADiative heating/cooling rate' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'FLALWD' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'FLALWD' -TFIELDLIST(IDX)%CUNITS = 'W m-2' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_Downward Long Waves on FLAT surface' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 2 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'DIRFLASWD' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'DIRFLASWD' -TFIELDLIST(IDX)%CUNITS = 'W m-2' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_DIRect Downward Short Waves on FLAT surface' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'SCAFLASWD' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'SCAFLASWD' -TFIELDLIST(IDX)%CUNITS = 'W m-2' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_SCAttered Downward Short Waves on FLAT surface' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'DIRSRFSWD' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'DIRSRFSWD' -TFIELDLIST(IDX)%CUNITS = 'W m-2' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_DIRect Downward Short Waves' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'CLEARCOL_TM1' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'CLEARCOL_TM1' -TFIELDLIST(IDX)%CUNITS = '' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'TRACE OF CLOUD' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEINT -TFIELDLIST(IDX)%NDIMS = 2 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_N2D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'ZENITH' -TFIELDLIST(IDX)%CSTDNAME = 'zenith_angle' -TFIELDLIST(IDX)%CLONGNAME = 'ZENITH' -TFIELDLIST(IDX)%CUNITS = 'rad' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_ZENITH' -TFIELDLIST(IDX)%NGRID = 4 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 2 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'AZIM' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'AZIM' -TFIELDLIST(IDX)%CUNITS = 'rad' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_AZIMuth' -TFIELDLIST(IDX)%NGRID = 4 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 2 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'DIR_ALB' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'DIR_ALB' -TFIELDLIST(IDX)%CUNITS = '1' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_DIRect ALBedo' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'SCA_ALB' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'SCA_ALB' -TFIELDLIST(IDX)%CUNITS = '1' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_SCAttered ALBedo' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'EMIS' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'EMIS' -TFIELDLIST(IDX)%CUNITS = '1' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_EMISsivity' -TFIELDLIST(IDX)%NGRID = 4 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'TSRAD' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'TSRAD' -TFIELDLIST(IDX)%CUNITS = 'K' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_RADiative Surface Temperature' -TFIELDLIST(IDX)%NGRID = 4 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 2 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL)) -IDX = IDX+1 +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'DTHRAD', & + CSTDNAME = '', & + CLONGNAME = 'DTHRAD', & + CUNITS = 'K s-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_RADiative heating/cooling rate', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'FLALWD', & + CSTDNAME = '', & + CLONGNAME = 'FLALWD', & + CUNITS = 'W m-2', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Downward Long Waves on FLAT surface', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'DIRFLASWD', & + CSTDNAME = '', & + CLONGNAME = 'DIRFLASWD', & + CUNITS = 'W m-2', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_DIRect Downward Short Waves on FLAT surface', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + NDIMLIST = [ NMNHDIM_NI, NMNHDIM_NJ, NMNHDIM_NSWB ], & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'SCAFLASWD', & + CSTDNAME = '', & + CLONGNAME = 'SCAFLASWD', & + CUNITS = 'W m-2', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_SCAttered Downward Short Waves on FLAT surface', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + NDIMLIST = [ NMNHDIM_NI, NMNHDIM_NJ, NMNHDIM_NSWB ], & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'DIRSRFSWD', & + CSTDNAME = '', & + CLONGNAME = 'DIRSRFSWD', & + CUNITS = 'W m-2', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_DIRect Downward Short Waves', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + NDIMLIST = [ NMNHDIM_NI, NMNHDIM_NJ, NMNHDIM_NSWB ], & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'CLEARCOL_TM1', & + CSTDNAME = '', & + CLONGNAME = 'CLEARCOL_TM1', & + CUNITS = '', & + CDIR = 'XY', & + CCOMMENT = 'TRACE OF CLOUD', & + NGRID = 1, & + NTYPE = TYPEINT, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'ZENITH', & + CSTDNAME = 'zenith_angle', & + CLONGNAME = 'ZENITH', & + CUNITS = 'rad', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_ZENITH', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'AZIM', & + CSTDNAME = '', & + CLONGNAME = 'AZIM', & + CUNITS = 'rad', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_AZIMuth', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'DIR_ALB', & + CSTDNAME = '', & + CLONGNAME = 'DIR_ALB', & + CUNITS = '1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_DIRect ALBedo', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + NDIMLIST = [ NMNHDIM_NI, NMNHDIM_NJ, NMNHDIM_NSWB ], & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'SCA_ALB', & + CSTDNAME = '', & + CLONGNAME = 'SCA_ALB', & + CUNITS = '1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_SCAttered ALBedo', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + NDIMLIST = [ NMNHDIM_NI, NMNHDIM_NJ, NMNHDIM_NSWB ], & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'EMIS', & + CSTDNAME = '', & + CLONGNAME = 'EMIS', & + CUNITS = '1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_EMISsivity', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + NDIMLIST = [ NMNHDIM_NI, NMNHDIM_NJ, NMNHDIM_NLWB ], & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'TSRAD', & + CSTDNAME = '', & + CLONGNAME = 'TSRAD', & + CUNITS = 'K', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_RADiative Surface Temperature', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) ) + +END IF !CPROGRAM=MESONH .OR. DIAG .OR. LFICDF .OR. SPAWN + +IF ( TRIM(CPROGRAM) == 'MESONH' .OR. TRIM(CPROGRAM) == 'DIAG' .OR. TRIM(CPROGRAM) == 'REAL' & + .OR. TRIM(CPROGRAM) == 'LFICDF' .OR. TRIM(CPROGRAM) == 'SPAWN' ) THEN ! ! ! Blaze fire model fields ! ! get string of fire refinement ratio -WRITE(YFIREDIMX, '(I3)') NREFINX -WRITE(YFIREDIMY, '(I3)') NREFINY -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'LSPHI' -TFIELDLIST(IDX)%CSTDNAME = 'level_set_function' -TFIELDLIST(IDX)%CLONGNAME = 'LSPHI' -TFIELDLIST(IDX)%CUNITS = '' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_F Blaze fire model level set function | fire grid ('//YFIREDIMX//','//YFIREDIMY//')' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'BMAP' -TFIELDLIST(IDX)%CSTDNAME = 'fire_burning_map' -TFIELDLIST(IDX)%CLONGNAME = 'BMAP' -TFIELDLIST(IDX)%CUNITS = 's' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_F Blaze fire model burning map, i.e. arrival time matrix | & - fire grid ('//YFIREDIMX//','//YFIREDIMY//')' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'FMASE' -TFIELDLIST(IDX)%CSTDNAME = 'fire_model_available_sensible_energy' -TFIELDLIST(IDX)%CLONGNAME = 'FMASE' -TFIELDLIST(IDX)%CUNITS = 'kJ m-2' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_F Blaze fire model available sensible energy of vegetation | & - fire grid ('//YFIREDIMX//','//YFIREDIMY//')' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'FMAWC' -TFIELDLIST(IDX)%CSTDNAME = 'fire_model_available_water_content' -TFIELDLIST(IDX)%CLONGNAME = 'FMAWC' -TFIELDLIST(IDX)%CUNITS = 'kg m-2' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_F Blaze fire model available liquid water of vegetation | & - fire grid ('//YFIREDIMX//','//YFIREDIMY//')' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'FMWINDU' -TFIELDLIST(IDX)%CSTDNAME = 'fire_model_filtered_wind_u' -TFIELDLIST(IDX)%CLONGNAME = 'FMWINDU' -TFIELDLIST(IDX)%CUNITS = 'm s-1' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_F Blaze fire model EWAM filtered u wind | & - fire grid ('//YFIREDIMX//','//YFIREDIMY//')' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'FMWINDV' -TFIELDLIST(IDX)%CSTDNAME = 'fire_model_filtered_wind_v' -TFIELDLIST(IDX)%CLONGNAME = 'FMWINDV' -TFIELDLIST(IDX)%CUNITS = 'm s-1' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_F Blaze fire model EWAM filtered v wind & - | fire grid ('//YFIREDIMX//','//YFIREDIMY//')' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'FMWINDW' -TFIELDLIST(IDX)%CSTDNAME = 'fire_model_filtered_wind_w' -TFIELDLIST(IDX)%CLONGNAME = 'FMWINDW' -TFIELDLIST(IDX)%CUNITS = 'm s-1' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_F Blaze fire model EWAM filtered w wind & - | fire grid ('//YFIREDIMX//','//YFIREDIMY//')' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'FMHWS' -TFIELDLIST(IDX)%CSTDNAME = 'fire_model_filtered_horizontal_wind_speed' -TFIELDLIST(IDX)%CLONGNAME = 'FMHWS' -TFIELDLIST(IDX)%CUNITS = 'm s-1' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_F Blaze filtered horizontal wind speed & - | fire grid ('//YFIREDIMX//','//YFIREDIMY//')' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'FIRERW' -TFIELDLIST(IDX)%CSTDNAME = 'fire_rate_of_spread' -TFIELDLIST(IDX)%CLONGNAME = 'FIRERW' -TFIELDLIST(IDX)%CUNITS = 'm s-1' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_F Blaze fire model rate of spread & - | fire grid ('//YFIREDIMX//','//YFIREDIMY//')' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'FMR0' -TFIELDLIST(IDX)%CSTDNAME = 'fire_rate_of_spread_no_wind' -TFIELDLIST(IDX)%CLONGNAME = 'FMR0' -TFIELDLIST(IDX)%CUNITS = 'm s-1' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_F Blaze fire model rate of spread without wind and slope & - | fire grid ('//YFIREDIMX//','//YFIREDIMY//')' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'FMFLUXHDH' -TFIELDLIST(IDX)%CSTDNAME = 'fire_sensible_heat_flux' -TFIELDLIST(IDX)%CLONGNAME = 'FMFLUXHDH' -TFIELDLIST(IDX)%CUNITS = 'W m-2' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_F Blaze fire model sensible heat flux & - | fire grid ('//YFIREDIMX//','//YFIREDIMY//')' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'FMFLUXHDW' -TFIELDLIST(IDX)%CSTDNAME = 'fire_latent_heat_flux' -TFIELDLIST(IDX)%CLONGNAME = 'FMFLUXHDW' -TFIELDLIST(IDX)%CUNITS = 'kg m-2 s-1' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_F Blaze fire model latent heat flux & - | fire grid ('//YFIREDIMX//','//YFIREDIMY//')' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'FMGRADOROX' -TFIELDLIST(IDX)%CSTDNAME = 'orographic gradient on x direction on fire mesh' -TFIELDLIST(IDX)%CLONGNAME = 'FMGRADOROX' -TFIELDLIST(IDX)%CUNITS = '' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_F Blaze fire model orographic gradient on x direction on fire mesh & - | fire grid ('//YFIREDIMX//','//YFIREDIMY//')' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'FMGRADOROY' -TFIELDLIST(IDX)%CSTDNAME = 'orographic gradient on y direction on fire mesh' -TFIELDLIST(IDX)%CLONGNAME = 'FMGRADOROY' -TFIELDLIST(IDX)%CUNITS = '' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_F Blaze fire model orographic gradient on y direction on fire mesh & - | fire grid ('//YFIREDIMX//','//YFIREDIMY//')' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 +IF ( NREFINX > 999 .OR. NREFINY > 999 ) CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'INI_FIELD_LIST', 'NREFINX or NREFINY > 999' ) +WRITE( YFIREDIMX, '(I3)' ) NREFINX +WRITE( YFIREDIMY, '(I3)' ) NREFINY + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'LSPHI', & + CSTDNAME = '', & + CLONGNAME = 'level set function', & + CUNITS = '', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_F Blaze fire model level set function | fire grid ('//YFIREDIMX//','//YFIREDIMY//')', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'BMAP', & + CSTDNAME = '', & + CLONGNAME = 'fire burning map', & + CUNITS = 's', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_F Blaze fire model burning map, i.e. arrival time matrix | fire grid ('//YFIREDIMX//','//YFIREDIMY//')', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'FMASE', & + CSTDNAME = '', & + CLONGNAME = 'fire model available sensible energy', & + CUNITS = 'kJ m-2', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_F Blaze fire model available sensible energy of vegetation | fire grid ('//YFIREDIMX//','//YFIREDIMY//')', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'FMAWC', & + CSTDNAME = '', & + CLONGNAME = 'fire model available water content', & + CUNITS = 'kg m-2', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_F Blaze fire model available liquid water of vegetation | fire grid ('//YFIREDIMX//','//YFIREDIMY//')', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'FMWINDU', & + CSTDNAME = '', & + CLONGNAME = 'fire model filtered wind u', & + CUNITS = 'm s-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_F Blaze fire model EWAM filtered u wind | fire grid ('//YFIREDIMX//','//YFIREDIMY//')', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'FMWINDV', & + CSTDNAME = '', & + CLONGNAME = 'fire model filtered wind v', & + CUNITS = 'm s-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_F Blaze fire model EWAM filtered v wind | fire grid ('//YFIREDIMX//','//YFIREDIMY//')', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'FMWINDW', & + CSTDNAME = '', & + CLONGNAME = 'fire model filtered wind w', & + CUNITS = 'm s-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_F Blaze fire model EWAM filtered w wind | fire grid ('//YFIREDIMX//','//YFIREDIMY//')', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'FMHWS', & + CSTDNAME = '', & + CLONGNAME = 'fire model filtered horizontal wind speed', & + CUNITS = 'm s-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_F Blaze filtered horizontal wind speed | fire grid ('//YFIREDIMX//','//YFIREDIMY//')', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'FIRERW', & + CSTDNAME = '', & + CLONGNAME = 'fire rate of spread', & + CUNITS = 'm s-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_F Blaze fire model rate of spread | fire grid ('//YFIREDIMX//','//YFIREDIMY//')', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'FMR0', & + CSTDNAME = '', & + CLONGNAME = 'fire rate of spread no wind', & + CUNITS = 'm s-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_F Blaze fire model rate of spread without wind and slope | fire grid ('//YFIREDIMX//','//YFIREDIMY//')', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'FMFLUXHDH', & + CSTDNAME = '', & + CLONGNAME = 'fire sensible heat flux', & + CUNITS = 'W m-2', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_F Blaze fire model sensible heat flux | fire grid ('//YFIREDIMX//','//YFIREDIMY//')', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'FMFLUXHDW', & + CSTDNAME = '', & + CLONGNAME = 'fire latent heat flux', & + CUNITS = 'kg m-2 s-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_F Blaze fire model latent heat flux | fire grid ('//YFIREDIMX//','//YFIREDIMY//')', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'FMGRADOROX', & + CSTDNAME = '', & + CLONGNAME = 'orographic gradient on x direction on fire mesh', & + CUNITS = '', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_F Blaze fire model orographic gradient on x direction on fire mesh | fire grid (' & + //YFIREDIMX//','//YFIREDIMY//')', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'FMGRADOROY', & + CSTDNAME = '', & + CLONGNAME = 'orographic gradient on y direction on fire mesh', & + CUNITS = '', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_F Blaze fire model orographic gradient on y direction on fire mesh | fire grid (' & + //YFIREDIMX//','//YFIREDIMY//')', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ) ! ! end of Blaze fields ! -END IF !CPROGRAM=MESONH .OR. DIAG .OR. LFICDF .OR. SPAWN +END IF !CPROGRAM=MESONH .OR. DIAG .OR. LFICDF .OR. SPAWN .OR. REAL ! ! IF ( TRIM(CPROGRAM) /= 'PGD' .AND. TRIM(CPROGRAM) /= 'NESPGD' ) THEN ! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'COUNTCONV' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'COUNTCONV' -TFIELDLIST(IDX)%CUNITS = '' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_COUNTCONV' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEINT -TFIELDLIST(IDX)%NDIMS = 2 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_N2D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'DTHCONV' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'DTHCONV' -TFIELDLIST(IDX)%CUNITS = 'K s-1' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_Z_CONVective heating/cooling rate' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'DRVCONV' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'DRVCONV' -TFIELDLIST(IDX)%CUNITS = 's-1' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_Z_CONVective R_v tendency' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'DRCCONV' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'DRCCONV' -TFIELDLIST(IDX)%CUNITS = 's-1' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_Z_CONVective R_c tendency' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'DRICONV' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'DRICONV' -TFIELDLIST(IDX)%CUNITS = 's-1' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_Z_CONVective R_i tendency' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'PRCONV' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'PRCONV' -TFIELDLIST(IDX)%CUNITS = 'm s-1' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_CONVective instantaneous Precipitation Rate' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 2 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'PACCONV' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'PACCONV' -TFIELDLIST(IDX)%CUNITS = 'm' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_CONVective ACcumulated Precipitation rate' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 2 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'PRSCONV' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'PRSCONV' -TFIELDLIST(IDX)%CUNITS = 'm s-1' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_CONVective instantaneous Precipitation Rate for Snow' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 2 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'DSVCONV' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'DSVCONV' -TFIELDLIST(IDX)%CUNITS = 's-1' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'Tracer tendencies' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 4 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X4D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'PRLFLXCONV' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'PRLFLXCONV' -TFIELDLIST(IDX)%CUNITS = 'm s-1' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_Liquid Precipitation Convective Flux' -TFIELDLIST(IDX)%NGRID = 4 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'PRSFLXCONV' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'PRSFLXCONV' -TFIELDLIST(IDX)%CUNITS = 'm s-1' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_Solid Precipitation Convective Flux' -TFIELDLIST(IDX)%NGRID = 4 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'UMFCONV' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'UMFCONV' -TFIELDLIST(IDX)%CUNITS = 'kg s-1 m-2' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_Updraft Convective Mass Flux' -TFIELDLIST(IDX)%NGRID = 4 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'DMFCONV' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'DMFCONV' -TFIELDLIST(IDX)%CUNITS = 'kg s-1 m-2' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_Downdraft Convective Mass Flux' -TFIELDLIST(IDX)%NGRID = 4 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'MFCONV' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'MFCONV' -TFIELDLIST(IDX)%CUNITS = 'kg s-1 m-2' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_Convective Mass Flux' -TFIELDLIST(IDX)%NGRID = 4 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'CAPE' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'CAPE' -TFIELDLIST(IDX)%CUNITS = 'J kg-1' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_Convective Available Potentiel Energy' -TFIELDLIST(IDX)%NGRID = 4 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 2 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'CLTOPCONV_LVL' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'CLTOPCONV_LVL' -TFIELDLIST(IDX)%CUNITS = '1' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'Convective cloud top level' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEINT -TFIELDLIST(IDX)%NDIMS = 2 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_N2D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'CLBASCONV_LVL' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'CLBASCONV_LVL' -TFIELDLIST(IDX)%CUNITS = '1' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'Convective cloud base level' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEINT -TFIELDLIST(IDX)%NDIMS = 2 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_N2D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'IC_RATE' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'IC_RATE' -TFIELDLIST(IDX)%CUNITS = 's-1' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_IntraCloud lightning Rate' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 2 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'CG_RATE' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'CG_RATE' -TFIELDLIST(IDX)%CUNITS = 's-1' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_CloudGround lightning Rate' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 2 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'IC_TOTAL_NB' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'IC_TOTAL_NB' -TFIELDLIST(IDX)%CUNITS = '1' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_IntraCloud lightning Number' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 2 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'CG_TOTAL_NB' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'CG_TOTAL_NB' -TFIELDLIST(IDX)%CUNITS = '1' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_CloudGround lightning Number' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 2 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL)) -IDX = IDX+1 +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'COUNTCONV', & + CSTDNAME = '', & + CLONGNAME = 'COUNTCONV', & + CUNITS = '', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_COUNTCONV', & + NGRID = 1, & + NTYPE = TYPEINT, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'DTHCONV', & + CSTDNAME = '', & + CLONGNAME = 'DTHCONV', & + CUNITS = 'K s-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_CONVective heating/cooling rate', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'DRVCONV', & + CSTDNAME = '', & + CLONGNAME = 'DRVCONV', & + CUNITS = 's-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_CONVective R_v tendency', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'DRCCONV', & + CSTDNAME = '', & + CLONGNAME = 'DRCCONV', & + CUNITS = 's-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_CONVective R_c tendency', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'DRICONV', & + CSTDNAME = '', & + CLONGNAME = 'DRICONV', & + CUNITS = 's-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_CONVective R_i tendency', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'PRCONV', & + CSTDNAME = '', & + CLONGNAME = 'PRCONV', & + CUNITS = 'm s-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_CONVective instantaneous Precipitation Rate', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'PACCONV', & + CSTDNAME = '', & + CLONGNAME = 'PACCONV', & + CUNITS = 'm', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_CONVective ACcumulated Precipitation rate', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'PRSCONV', & + CSTDNAME = '', & + CLONGNAME = 'PRSCONV', & + CUNITS = 'm s-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_CONVective instantaneous Precipitation Rate for Snow', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'DSVCONV', & + CSTDNAME = '', & + CLONGNAME = 'DSVCONV', & + CUNITS = 's-1', & + CDIR = 'XY', & + CCOMMENT = 'Tracer tendencies', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 4, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'PRLFLXCONV', & + CSTDNAME = '', & + CLONGNAME = 'PRLFLXCONV', & + CUNITS = 'm s-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Liquid Precipitation Convective Flux', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'PRSFLXCONV', & + CSTDNAME = '', & + CLONGNAME = 'PRSFLXCONV', & + CUNITS = 'm s-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Solid Precipitation Convective Flux', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'UMFCONV', & + CSTDNAME = '', & + CLONGNAME = 'UMFCONV', & + CUNITS = 'kg s-1 m-2', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Updraft Convective Mass Flux', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'DMFCONV', & + CSTDNAME = '', & + CLONGNAME = 'DMFCONV', & + CUNITS = 'kg s-1 m-2', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Downdraft Convective Mass Flux', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'MFCONV', & + CSTDNAME = '', & + CLONGNAME = 'MFCONV', & + CUNITS = 'kg s-1 m-2', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Convective Mass Flux', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'CAPE', & + CSTDNAME = '', & + CLONGNAME = 'CAPE', & + CUNITS = 'J kg-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Convective Available Potentiel Energy', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'CLTOPCONV_LVL', & + CSTDNAME = '', & + CLONGNAME = 'CLTOPCONV_LVL', & + CUNITS = '1', & + CDIR = 'XY', & + CCOMMENT = 'Convective cloud top level', & + NGRID = 1, & + NTYPE = TYPEINT, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'CLBASCONV_LVL', & + CSTDNAME = '', & + CLONGNAME = 'CLBASCONV_LVL', & + CUNITS = '1', & + CDIR = 'XY', & + CCOMMENT = 'Convective cloud base level', & + NGRID = 1, & + NTYPE = TYPEINT, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'IC_RATE', & + CSTDNAME = '', & + CLONGNAME = 'IC_RATE', & + CUNITS = 's-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_IntraCloud lightning Rate', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'CG_RATE', & + CSTDNAME = '', & + CLONGNAME = 'CG_RATE', & + CUNITS = 's-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_CloudGround lightning Rate', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'IC_TOTAL_NB', & + CSTDNAME = '', & + CLONGNAME = 'IC_TOTAL_NB', & + CUNITS = '1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_IntraCloud lightning Number', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'CG_TOTAL_NB', & + CSTDNAME = '', & + CLONGNAME = 'CG_TOTAL_NB', & + CUNITS = '1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_CloudGround lightning Number', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) ) ! END IF !CPROGRAM/=PGD , NESPGD ! ! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'SSO_ANIS' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'SSO_ANIS' -TFIELDLIST(IDX)%CUNITS = 'm' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_SSO_ANISOTROPY' -TFIELDLIST(IDX)%NGRID = 4 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 2 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'SSO_SLOPE' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'SSO_SLOPE' -TFIELDLIST(IDX)%CUNITS = '' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_SSO_SLOPE' -TFIELDLIST(IDX)%NGRID = 4 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 2 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'SSO_DIR' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'SSO_DIR' -TFIELDLIST(IDX)%CUNITS = 'degree' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_SSO_DIR' -TFIELDLIST(IDX)%NGRID = 4 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 2 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'AVG_ZS' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'AVG_ZS' -TFIELDLIST(IDX)%CUNITS = 'm' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_AVG_ZS' -TFIELDLIST(IDX)%NGRID = 4 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 2 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'SIL_ZS' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'SIL_ZS' -TFIELDLIST(IDX)%CUNITS = 'm' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_SIL_ZS' -TFIELDLIST(IDX)%NGRID = 4 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 2 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'MAX_ZS' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'MAX_ZS' -TFIELDLIST(IDX)%CUNITS = 'm' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_MAX_ZS' -TFIELDLIST(IDX)%NGRID = 4 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 2 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'MIN_ZS' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'MIN_ZS' -TFIELDLIST(IDX)%CUNITS = 'm' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_MIN_ZS' -TFIELDLIST(IDX)%NGRID = 4 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 2 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'SSO_STDEV' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'SSO_STDEV' -TFIELDLIST(IDX)%CUNITS = 'm' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_SSO_STDEV' -TFIELDLIST(IDX)%NGRID = 4 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 2 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'INPRC' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'INPRC' -TFIELDLIST(IDX)%CUNITS = 'm s-1' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_INstantaneous Cloud Precipitation Rate' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 2 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'ACPRC' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'ACPRC' -TFIELDLIST(IDX)%CUNITS = 'm' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_ACcumulated Cloud Precipitation Rate' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 2 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'INDEP' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'INDEP' -TFIELDLIST(IDX)%CUNITS = 'm s-1' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_INstantaneous Cloud Deposition Rate' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 2 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'ACDEP' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'ACDEP' -TFIELDLIST(IDX)%CUNITS = 'm' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_ACcumulated Cloud Deposition Rate' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 2 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'INPRR' -TFIELDLIST(IDX)%CSTDNAME = 'rainfall_rate' -TFIELDLIST(IDX)%CLONGNAME = 'INPRR' -TFIELDLIST(IDX)%CUNITS = 'm s-1' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_INstantaneous Precipitation Rain Rate' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 2 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'INPRR3D' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'INPRR3D' -TFIELDLIST(IDX)%CUNITS = 'm s-1' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_INstantaneous 3D Rain Precipitation flux' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'EVAP3D' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'EVAP3D' -TFIELDLIST(IDX)%CUNITS = 'kg kg-1 s-1' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_INstantaneous 3D Rain Evaporation flux' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'ACPRR' -TFIELDLIST(IDX)%CSTDNAME = 'thickness_of_rainfall_amount' -TFIELDLIST(IDX)%CLONGNAME = 'ACPRR' -TFIELDLIST(IDX)%CUNITS = 'm' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_ACcumulated Precipitation Rain Rate' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 2 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'INPRS' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'INPRS' -TFIELDLIST(IDX)%CUNITS = 'm s-1' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_INstantaneous PRecipitation Snow Rate' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 2 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'ACPRS' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'ACPRS' -TFIELDLIST(IDX)%CUNITS = 'm' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_ACcumulated PRecipitation Snow Rate' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 2 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'INPRG' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'INPRG' -TFIELDLIST(IDX)%CUNITS = 'm s-1' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_INstantaneous PRecipitation Graupel Rate' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 2 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'ACPRG' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'ACPRG' -TFIELDLIST(IDX)%CUNITS = 'm' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_ACcumulated PRecipitation Graupel Rate' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 2 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'INPRH' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'INPRH' -TFIELDLIST(IDX)%CUNITS = 'm s-1' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_INstantaneous PRecipitation Hail Rate' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 2 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'ACPRH' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'ACPRH' -TFIELDLIST(IDX)%CUNITS = 'm' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_ACcumulated PRecipitation Hail Rate' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 2 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'INPRT' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'INPRT' -TFIELDLIST(IDX)%CUNITS = 'm s-1' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_Total INstantaneaous PRecipitation rate' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 2 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'SSO_ANIS', & + CSTDNAME = '', & + CLONGNAME = 'SSO_ANIS', & + CUNITS = 'm', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_SSO_ANISOTROPY', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'SSO_SLOPE', & + CSTDNAME = '', & + CLONGNAME = 'SSO_SLOPE', & + CUNITS = '', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_SSO_SLOPE', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'SSO_DIR', & + CSTDNAME = '', & + CLONGNAME = 'SSO_DIR', & + CUNITS = 'degree', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_SSO_DIR', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'AVG_ZS', & + CSTDNAME = '', & + CLONGNAME = 'AVG_ZS', & + CUNITS = 'm', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_AVG_ZS', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'SIL_ZS', & + CSTDNAME = '', & + CLONGNAME = 'SIL_ZS', & + CUNITS = 'm', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_SIL_ZS', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'MAX_ZS', & + CSTDNAME = '', & + CLONGNAME = 'MAX_ZS', & + CUNITS = 'm', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_MAX_ZS', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'MIN_ZS', & + CSTDNAME = '', & + CLONGNAME = 'MIN_ZS', & + CUNITS = 'm', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_MIN_ZS', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'SSO_STDEV', & + CSTDNAME = '', & + CLONGNAME = 'SSO_STDEV', & + CUNITS = 'm', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_SSO_STDEV', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'INPRC', & + CSTDNAME = '', & + CLONGNAME = 'INPRC', & + CUNITS = 'm s-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_INstantaneous Cloud Precipitation Rate', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'ACPRC', & + CSTDNAME = '', & + CLONGNAME = 'ACPRC', & + CUNITS = 'm', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_ACcumulated Cloud Precipitation Rate', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'INDEP', & + CSTDNAME = '', & + CLONGNAME = 'INDEP', & + CUNITS = 'm s-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_INstantaneous Cloud Deposition Rate', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'ACDEP', & + CSTDNAME = '', & + CLONGNAME = 'ACDEP', & + CUNITS = 'm', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_ACcumulated Cloud Deposition Rate', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'INPRR', & + CSTDNAME = 'rainfall_rate', & + CLONGNAME = 'INPRR', & + CUNITS = 'm s-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_INstantaneous Precipitation Rain Rate', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'INPRR3D', & + CSTDNAME = '', & + CLONGNAME = 'INPRR3D', & + CUNITS = 'm s-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_INstantaneous 3D Rain Precipitation flux', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'EVAP3D', & + CSTDNAME = '', & + CLONGNAME = 'EVAP3D', & + CUNITS = 'kg kg-1 s-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_INstantaneous 3D Rain Evaporation flux', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'ACPRR', & + CSTDNAME = 'thickness_of_rainfall_amount', & + CLONGNAME = 'ACPRR', & + CUNITS = 'm', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_ACcumulated Precipitation Rain Rate', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'INPRS', & + CSTDNAME = '', & + CLONGNAME = 'INPRS', & + CUNITS = 'm s-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_INstantaneous PRecipitation Snow Rate', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'ACPRS', & + CSTDNAME = '', & + CLONGNAME = 'ACPRS', & + CUNITS = 'm', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_ACcumulated PRecipitation Snow Rate', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'INPRG', & + CSTDNAME = '', & + CLONGNAME = 'INPRG', & + CUNITS = 'm s-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_INstantaneous PRecipitation Graupel Rate', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'ACPRG', & + CSTDNAME = '', & + CLONGNAME = 'ACPRG', & + CUNITS = 'm', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_ACcumulated PRecipitation Graupel Rate', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'INPRH', & + CSTDNAME = '', & + CLONGNAME = 'INPRH', & + CUNITS = 'm s-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_INstantaneous PRecipitation Hail Rate', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'ACPRH', & + CSTDNAME = '', & + CLONGNAME = 'ACPRH', & + CUNITS = 'm', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_ACcumulated PRecipitation Hail Rate', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'INPRT', & + CSTDNAME = '', & + CLONGNAME = 'INPRT', & + CUNITS = 'm s-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Total INstantaneaous PRecipitation rate', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) ) !No permanent variable associated to this field -!ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'ACPRT' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'ACPRT' -TFIELDLIST(IDX)%CUNITS = 'm' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_Total ACcumulated PRecipitation rate' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 2 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'ACPRT', & + CSTDNAME = '', & + CLONGNAME = 'ACPRT', & + CUNITS = 'm', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Total ACcumulated PRecipitation rate', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) ) !No permanent variable associated to this field -!ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'VT_FLX' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'VT_FLX' -TFIELDLIST(IDX)%CUNITS = 'K m s-1' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = '' -TFIELDLIST(IDX)%NGRID = 2 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'WT_FLX' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'WT_FLX' -TFIELDLIST(IDX)%CUNITS = 'K m s-1' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = '' -TFIELDLIST(IDX)%NGRID = 4 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'RTHS_EDDY_FLUX' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'RTHS_EDDY_FLUX' + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'VT_FLX', & + CSTDNAME = '', & + CLONGNAME = 'VT_FLX', & + CUNITS = 'K m s-1', & + CDIR = 'XY', & + CCOMMENT = '', & + NGRID = 2, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'WT_FLX', & + CSTDNAME = '', & + CLONGNAME = 'WT_FLX', & + CUNITS = 'K m s-1', & + CDIR = 'XY', & + CCOMMENT = '', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'RTHS_EDDY_FLUX', & + CSTDNAME = '', & + CLONGNAME = 'RTHS_EDDY_FLUX', & !TODO PW: units? -TFIELDLIST(IDX)%CUNITS = '' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = '' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'VU_FLX' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'VU_FLX' -TFIELDLIST(IDX)%CUNITS = 'm s-2' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = '' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'RVS_EDDY_FLUX' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'RVS_EDDY_FLUX' + CUNITS = '', & + CDIR = 'XY', & + CCOMMENT = '', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'VU_FLX', & + CSTDNAME = '', & + CLONGNAME = 'VU_FLX', & + CUNITS = 'm s-2', & + CDIR = 'XY', & + CCOMMENT = '', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'RVS_EDDY_FLUX', & + CSTDNAME = '', & + CLONGNAME = 'RVS_EDDY_FLUX', & !TODO PW: units? -TFIELDLIST(IDX)%CUNITS = '' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = '' -TFIELDLIST(IDX)%NGRID = 3 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .TRUE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'FRC' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'FRC' -TFIELDLIST(IDX)%CUNITS = '' -TFIELDLIST(IDX)%CDIR = '--' -TFIELDLIST(IDX)%CCOMMENT = 'Number of forcing profiles' -TFIELDLIST(IDX)%NGRID = 0 -TFIELDLIST(IDX)%NTYPE = TYPEINT -TFIELDLIST(IDX)%NDIMS = 0 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -IDX = IDX+1 + CUNITS = '', & + CDIR = 'XY', & + CCOMMENT = '', & + NGRID = 3, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'FRC', & + CSTDNAME = '', & + CLONGNAME = 'FRC', & + CUNITS = '', & + CDIR = '--', & + CCOMMENT = 'Number of forcing profiles', & + NGRID = 0, & + NTYPE = TYPEINT, & + NDIMS = 0, & + LTIMEDEP = .FALSE. ) ) ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! IF (TRIM(CPROGRAM)=='REAL' .OR. TRIM(CPROGRAM) == 'LFICDF') THEN !PW: not yet known: IF (LFILTERING) THEN ! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'UT15' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'UT15' -TFIELDLIST(IDX)%CUNITS = 'm s-1' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_Z_U component of Total wind' -TFIELDLIST(IDX)%NGRID = 2 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'VT15' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'VT15' -TFIELDLIST(IDX)%CUNITS = 'm s-1' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_Z_V component of Total wind' -TFIELDLIST(IDX)%NGRID = 3 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'TEMPTOT' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'TEMPTOT' -TFIELDLIST(IDX)%CUNITS = 'K' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_Z_TOTal TEMPerature' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'PRESTOT' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'PRESTOT' -TFIELDLIST(IDX)%CUNITS = 'Pa' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_Z_TOTal PRESsure' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 2 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'HUMTOT' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'HUMTOT' -TFIELDLIST(IDX)%CUNITS = 'kg kg-1' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_Z_TOTal specific HUMidity' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'UT16' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'UT16' -TFIELDLIST(IDX)%CUNITS = 'm s-1' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_Z_U component of Environmental wind' -TFIELDLIST(IDX)%NGRID = 2 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'VT16' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'VT16' -TFIELDLIST(IDX)%CUNITS = 'm s-1' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_Z_V component of Environmental wind' -TFIELDLIST(IDX)%NGRID = 3 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'TEMPENV' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'TEMPENV' -TFIELDLIST(IDX)%CUNITS = 'K' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_Z_ENVironmental TEMPerature' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'PRESENV' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'PRESENV' -TFIELDLIST(IDX)%CUNITS = 'Pa' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_Z_ENVironmental PRESsure' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 2 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'HUMENV' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'HUMENV' -TFIELDLIST(IDX)%CUNITS = 'kg kg-1' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_Z_ENVironmental specific HUMidity' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'UT17' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'UT17' -TFIELDLIST(IDX)%CUNITS = 'm s-1' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_Z_U component of Basic wind' -TFIELDLIST(IDX)%NGRID = 2 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'VT17' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'VT17' -TFIELDLIST(IDX)%CUNITS = 'm s-1' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_Z_V component of Basic wind' -TFIELDLIST(IDX)%NGRID = 3 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'TEMPBAS' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'TEMPBAS' -TFIELDLIST(IDX)%CUNITS = 'K' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_Z_BASic TEMPerature' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'PRESBAS' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'PRESBAS' -TFIELDLIST(IDX)%CUNITS = 'Pa' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_Z_BASic PRESsure' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'HUMBAS' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'HUMBAS' -TFIELDLIST(IDX)%CUNITS = 'kg kg-1' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_Z_BASic specific HUMidity' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 -! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'VTDIS' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'VTDIS' -TFIELDLIST(IDX)%CUNITS = 'm s-1' -TFIELDLIST(IDX)%CDIR = 'XY' -TFIELDLIST(IDX)%CCOMMENT = 'X_Y_Z_Total disturbance tangential wind' -TFIELDLIST(IDX)%NGRID = 1 -TFIELDLIST(IDX)%NTYPE = TYPEREAL -TFIELDLIST(IDX)%NDIMS = 3 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL)) -IDX = IDX+1 +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'UT15', & + CSTDNAME = '', & + CLONGNAME = 'UT15', & + CUNITS = 'm s-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_U component of Total wind', & + NGRID = 2, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'VT15', & + CSTDNAME = '', & + CLONGNAME = 'VT15', & + CUNITS = 'm s-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_V component of Total wind', & + NGRID = 3, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'TEMPTOT', & + CSTDNAME = '', & + CLONGNAME = 'TEMPTOT', & + CUNITS = 'K', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_TOTal TEMPerature', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'PRESTOT', & + CSTDNAME = '', & + CLONGNAME = 'PRESTOT', & + CUNITS = 'Pa', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_TOTal PRESsure', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'HUMTOT', & + CSTDNAME = '', & + CLONGNAME = 'HUMTOT', & + CUNITS = 'kg kg-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_TOTal specific HUMidity', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'UT16', & + CSTDNAME = '', & + CLONGNAME = 'UT16', & + CUNITS = 'm s-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_U component of Environmental wind', & + NGRID = 2, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'VT16', & + CSTDNAME = '', & + CLONGNAME = 'VT16', & + CUNITS = 'm s-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_V component of Environmental wind', & + NGRID = 3, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'TEMPENV', & + CSTDNAME = '', & + CLONGNAME = 'TEMPENV', & + CUNITS = 'K', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_ENVironmental TEMPerature', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'PRESENV', & + CSTDNAME = '', & + CLONGNAME = 'PRESENV', & + CUNITS = 'Pa', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_ENVironmental PRESsure', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'HUMENV', & + CSTDNAME = '', & + CLONGNAME = 'HUMENV', & + CUNITS = 'kg kg-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_ENVironmental specific HUMidity', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'UT17', & + CSTDNAME = '', & + CLONGNAME = 'UT17', & + CUNITS = 'm s-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_U component of Basic wind', & + NGRID = 2, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'VT17', & + CSTDNAME = '', & + CLONGNAME = 'VT17', & + CUNITS = 'm s-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_V component of Basic wind', & + NGRID = 3, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'TEMPBAS', & + CSTDNAME = '', & + CLONGNAME = 'TEMPBAS', & + CUNITS = 'K', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_BASic TEMPerature', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'PRESBAS', & + CSTDNAME = '', & + CLONGNAME = 'PRESBAS', & + CUNITS = 'Pa', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_BASic PRESsure', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'HUMBAS', & + CSTDNAME = '', & + CLONGNAME = 'HUMBAS', & + CUNITS = 'kg kg-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_BASic specific HUMidity', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'VTDIS', & + CSTDNAME = '', & + CLONGNAME = 'VTDIS', & + CUNITS = 'm s-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_Total disturbance tangential wind', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .FALSE. ) ) ! !END IF !LFILTERING END IF !CPROGRAM==REAL .OR. LFICDF ! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'NFRCLT' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'NFRCLT' -TFIELDLIST(IDX)%CUNITS = '1' -TFIELDLIST(IDX)%CDIR = '--' -TFIELDLIST(IDX)%CCOMMENT = 'number of sea surface forcings + 1' -TFIELDLIST(IDX)%NGRID = 0 -TFIELDLIST(IDX)%NTYPE = TYPEINT -TFIELDLIST(IDX)%NDIMS = 0 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -IDX = IDX+1 -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = 'NINFRT' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = 'NINFRT' -TFIELDLIST(IDX)%CUNITS = 's' -TFIELDLIST(IDX)%CDIR = '--' -TFIELDLIST(IDX)%CCOMMENT = 'Interval in seconds between forcings' -TFIELDLIST(IDX)%NGRID = 0 -TFIELDLIST(IDX)%NTYPE = TYPEINT -TFIELDLIST(IDX)%NDIMS = 0 -TFIELDLIST(IDX)%LTIMEDEP = .FALSE. -IDX = IDX+1 -! -! -WRITE(YMSG,'("number of used fields=",I4," out of ",I4)') IDX-1,MAXFIELDS +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'NFRCLT', & + CSTDNAME = '', & + CLONGNAME = 'NFRCLT', & + CUNITS = '1', & + CDIR = '--', & + CCOMMENT = 'number of sea surface forcings + 1', & + NGRID = 0, & + NTYPE = TYPEINT, & + NDIMS = 0, & + LTIMEDEP = .FALSE. ) ) + +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'NINFRT', & + CSTDNAME = '', & + CLONGNAME = 'NINFRT', & + CUNITS = 's', & + CDIR = '--', & + CCOMMENT = 'Interval in seconds between forcings', & + NGRID = 0, & + NTYPE = TYPEINT, & + NDIMS = 0, & + LTIMEDEP = .FALSE. ) ) +! +! +WRITE(YMSG,'("number of used fields=",I4," out of ",I4)') nfields_used-1,NMAXFIELDS CALL PRINT_MSG(NVERB_INFO,'GEN','INI_FIELD_LIST',TRIM(YMSG)) ! #if 0 ! -IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() -TFIELDLIST(IDX)%CMNHNAME = '' -TFIELDLIST(IDX)%CSTDNAME = '' -TFIELDLIST(IDX)%CLONGNAME = '' -TFIELDLIST(IDX)%CUNITS = '' -TFIELDLIST(IDX)%CDIR = '' -TFIELDLIST(IDX)%CLBTYPE = '' -TFIELDLIST(IDX)%CCOMMENT = '' -TFIELDLIST(IDX)%NGRID = -TFIELDLIST(IDX)%NTYPE = -TFIELDLIST(IDX)%NDIMS = -TFIELDLIST(IDX)%LTIMEDEP = -ALLOCATE(TFIELDLIST(IDX)%TFIELD_xxxD(IMODEL)) -IDX = IDX+1 +call Add_field2list( TFIELDDATA( & + CMNHNAME = '', & + CSTDNAME = '', & + CLONGNAME = '', & + CUNITS = '', & + CDIR = '', & + CLBTYPE = '', & + CCOMMENT = '', & + NGRID = , & + NTYPE = , & + NDIMS = , & + LTIMEDEP = , ) ) #endif ! -CONTAINS -SUBROUTINE ERR_INI_FIELD_LIST() - WRITE(YMSG,'( "IDX>MAXFIELDS (",I5,")" )') MAXFIELDS - CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_FIELD_LIST',TRIM(YMSG)) -END SUBROUTINE ERR_INI_FIELD_LIST -! END SUBROUTINE INI_FIELD_LIST ! SUBROUTINE FIND_FIELD_ID_FROM_MNHNAME(HMNHNAME,KID,KRESP,ONOWARNING) ! CHARACTER(LEN=*), INTENT(IN) :: HMNHNAME !Name of the field to find INTEGER, INTENT(OUT):: KID !Index of the field -INTEGER, INTENT(OUT):: KRESP !Return-code +INTEGER, INTENT(OUT):: KRESP !Return-code LOGICAL, OPTIONAL, INTENT(IN) :: ONOWARNING !If true, do not print warning ! INTEGER :: IDX,JI @@ -3828,14 +3459,12 @@ END IF ! DO ICOUNT = ICOUNT + 1 - IF (TRIM(TFIELDLIST(IDX)%CMNHNAME)=='') THEN !Last entry - IDX = 1 - ELSE IF (TRIM(TFIELDLIST(IDX)%CMNHNAME)==TRIM(HMNHNAME)) THEN + IF (TRIM(TFIELDLIST(IDX)%CMNHNAME)==TRIM(HMNHNAME)) THEN KID = IDX EXIT ELSE IDX = IDX + 1 - IF (IDX>MAXFIELDS) IDX = 1 + IF ( IDX > nfields_used ) IDX = 1 END IF IF (IDX == IFIRSTGUESS) EXIT !All entries have been tested END DO @@ -3849,8 +3478,8 @@ IF (KID==0) THEN CALL PRINT_MSG(NVERB_DEBUG,'GEN','FIND_FIELD_ID_FROM_MNHNAME','field '//TRIM(HMNHNAME)//' not known (not unexpected)') END IF ELSE - IFIRSTGUESS = IDX+1 - IF (IFIRSTGUESS>MAXFIELDS) IFIRSTGUESS = 1 + IFIRSTGUESS = IDX + 1 + IF ( IFIRSTGUESS > nfields_used ) IFIRSTGUESS = 1 WRITE(YMSG,'( "field ",A16," found after ",I4," attempt(s)" )') TRIM(HMNHNAME),ICOUNT CALL PRINT_MSG(NVERB_DEBUG,'GEN','FIND_FIELD_ID_FROM_MNHNAME',TRIM(YMSG)) END IF @@ -3915,1472 +3544,1643 @@ END IF IF (.NOT.ASSOCIATED(XZTOP)) THEN CALL PRINT_MSG(NVERB_DEBUG,'GEN','INI_FIELD_SCALARS',' XZTOP was not associated') ALLOCATE(XZTOP) - CALL FIND_FIELD_ID_FROM_MNHNAME('ZTOP',IID,IRESP) - TFIELDLIST(IID)%TFIELD_X0D(1)%DATA=>XZTOP + call Goto_model_1field( 'ZTOP', 1, 1, XZTOP ) END IF ! IF (.NOT.ASSOCIATED(LSLEVE)) THEN CALL PRINT_MSG(NVERB_DEBUG,'GEN','INI_FIELD_SCALARS',' LSLEVE was not associated') ALLOCATE(LSLEVE) - CALL FIND_FIELD_ID_FROM_MNHNAME('SLEVE',IID,IRESP) - TFIELDLIST(IID)%TFIELD_L0D(1)%DATA=>LSLEVE + call Goto_model_1field( 'SLEVE', 1, 1, LSLEVE ) END IF ! IF (.NOT.ASSOCIATED(XLEN1)) THEN CALL PRINT_MSG(NVERB_DEBUG,'GEN','INI_FIELD_SCALARS',' XLEN1 was not associated') ALLOCATE(XLEN1) - CALL FIND_FIELD_ID_FROM_MNHNAME('LEN1',IID,IRESP) - TFIELDLIST(IID)%TFIELD_X0D(1)%DATA=>XLEN1 + call Goto_model_1field( 'LEN1', 1, 1, XLEN1 ) END IF ! IF (.NOT.ASSOCIATED(XLEN2)) THEN - CALL PRINT_MSG(NVERB_DEBUG,'GEN','INI_FIELD_SCALARS',' XLEN2 was not associated') - ALLOCATE(XLEN2) - CALL FIND_FIELD_ID_FROM_MNHNAME('LEN2',IID,IRESP) - TFIELDLIST(IID)%TFIELD_X0D(1)%DATA=>XLEN2 -END IF -! -IF (.NOT.ASSOCIATED(TDTMOD)) THEN - CALL PRINT_MSG(NVERB_DEBUG,'GEN','INI_FIELD_SCALARS',' TDTMOD was not associated') - ALLOCATE(TDTMOD) - CALL FIND_FIELD_ID_FROM_MNHNAME('DTMOD',IID,IRESP) - TFIELDLIST(IID)%TFIELD_T0D(1)%DATA=>TDTMOD -END IF -! -IF (.NOT.ASSOCIATED(TDTCUR)) THEN - CALL PRINT_MSG(NVERB_DEBUG,'GEN','INI_FIELD_SCALARS',' TDTCUR was not associated') - ALLOCATE(TDTCUR) - CALL FIND_FIELD_ID_FROM_MNHNAME('DTCUR',IID,IRESP) - TFIELDLIST(IID)%TFIELD_T0D(1)%DATA=>TDTCUR -END IF -! -IF (.NOT.ASSOCIATED(TDTRAD_FULL)) THEN - CALL PRINT_MSG(NVERB_DEBUG,'GEN','INI_FIELD_SCALARS',' TDTRAD_FULL was not associated') - ALLOCATE(TDTRAD_FULL) - CALL FIND_FIELD_ID_FROM_MNHNAME('DTRAD_FULL',IID,IRESP) - TFIELDLIST(IID)%TFIELD_T0D(1)%DATA=>TDTRAD_FULL -END IF -! -IF (.NOT.ASSOCIATED(TDTRAD_CLONLY)) THEN - CALL PRINT_MSG(NVERB_DEBUG,'GEN','INI_FIELD_SCALARS',' TDTRAD_CLONLY was not associated') - ALLOCATE(TDTRAD_CLONLY) - CALL FIND_FIELD_ID_FROM_MNHNAME('DTRAD_CLLY',IID,IRESP) - TFIELDLIST(IID)%TFIELD_T0D(1)%DATA=>TDTRAD_CLONLY -END IF -! -IF (.NOT.ASSOCIATED(TDTDCONV)) THEN - CALL PRINT_MSG(NVERB_DEBUG,'GEN','INI_FIELD_SCALARS',' TDTDCONV was not associated') - ALLOCATE(TDTDCONV) - CALL FIND_FIELD_ID_FROM_MNHNAME('DTDCONV',IID,IRESP) - TFIELDLIST(IID)%TFIELD_T0D(1)%DATA=>TDTDCONV -END IF -! -IF (.NOT.ASSOCIATED(CSURF)) THEN - CALL PRINT_MSG(NVERB_DEBUG,'GEN','INI_FIELD_SCALARS',' CSURF was not associated') - ALLOCATE(CHARACTER(LEN=4) :: CSURF) - CSURF = '' -END IF -CALL FIND_FIELD_ID_FROM_MNHNAME('SURF',IID,IRESP) -TFIELDLIST(IID)%TFIELD_C0D(1)%DATA=>CSURF -! -IF (.NOT.ASSOCIATED(XDRYMASST)) THEN - CALL PRINT_MSG(NVERB_DEBUG,'GEN','INI_FIELD_SCALARS',' XDRYMASST was not associated') - ALLOCATE(XDRYMASST) - CALL FIND_FIELD_ID_FROM_MNHNAME('DRYMASST',IID,IRESP) - TFIELDLIST(IID)%TFIELD_X0D(1)%DATA=>XDRYMASST -END IF -! -IF (.NOT.ASSOCIATED(XDRYMASSS)) THEN - CALL PRINT_MSG(NVERB_DEBUG,'GEN','INI_FIELD_SCALARS',' XDRYMASSS was not associated') - ALLOCATE(XDRYMASSS) - CALL FIND_FIELD_ID_FROM_MNHNAME('DRYMASSS',IID,IRESP) - TFIELDLIST(IID)%TFIELD_X0D(1)%DATA=>XDRYMASSS -END IF -! -IF (.NOT.ASSOCIATED(NRIMX)) THEN - CALL PRINT_MSG(NVERB_DEBUG,'GEN','INI_FIELD_SCALARS',' NRIMX was not associated') - ALLOCATE(NRIMX) -END IF -! -CALL FIND_FIELD_ID_FROM_MNHNAME('RIMX',IID,IRESP) -TFIELDLIST(IID)%TFIELD_N0D(1)%DATA=>NRIMX -IF (.NOT.ASSOCIATED(NRIMY)) THEN - CALL PRINT_MSG(NVERB_DEBUG,'GEN','INI_FIELD_SCALARS',' NRIMY was not associated') - ALLOCATE(NRIMY) -END IF -! -CALL FIND_FIELD_ID_FROM_MNHNAME('RIMY',IID,IRESP) -TFIELDLIST(IID)%TFIELD_N0D(1)%DATA=>NRIMY -! -IF (.NOT.ASSOCIATED(LHORELAX_UVWTH)) THEN - CALL PRINT_MSG(NVERB_DEBUG,'GEN','INI_FIELD_SCALARS',' LHORELAX_UVWTH was not associated') - ALLOCATE(LHORELAX_UVWTH) -END IF -CALL FIND_FIELD_ID_FROM_MNHNAME('HORELAX_UVWTH',IID,IRESP) -TFIELDLIST(IID)%TFIELD_L0D(1)%DATA=>LHORELAX_UVWTH -! -IF (.NOT.ASSOCIATED(LHORELAX_TKE)) THEN - CALL PRINT_MSG(NVERB_DEBUG,'GEN','INI_FIELD_SCALARS',' LHORELAX_TKE was not associated') - ALLOCATE(LHORELAX_TKE) -END IF -CALL FIND_FIELD_ID_FROM_MNHNAME('HORELAX_TKE',IID,IRESP) -TFIELDLIST(IID)%TFIELD_L0D(1)%DATA=>LHORELAX_TKE -! -END SUBROUTINE INI_FIELD_SCALARS -! -! -SUBROUTINE FIELDLIST_GOTO_MODEL(KFROM, KTO) -! -USE MODD_REF -! -USE MODD_ADV_n -USE MODD_CONF_n -USE MODD_DEEP_CONVECTION_n -USE MODD_DEF_EDDY_FLUX_n -USE MODD_DEF_EDDYUV_FLUX_n -USE MODD_DYN_n -USE MODD_ELEC_n -USE MODD_FIELD_n -USE MODD_GR_FIELD_n -USE MODD_GRID_n -USE MODD_HURR_FIELD_n -USE MODD_LIMA_PRECIP_SCAVENGING_n -USE MODD_LSFIELD_n -USE MODD_OCEANH -USE MODD_PARAM_n -USE MODD_PAST_FIELD_n -USE MODD_CH_PH_n -USE MODD_PRECIP_n -USE MODD_RADIATIONS_n -USE MODD_REF_n -USE MODD_TIME_n -USE MODD_TURB_n -! -INTEGER, INTENT(IN) :: KFROM, KTO -! -!LOGICAL,SAVE :: GFIRST_CALL=.TRUE. -INTEGER :: IID,IID2,IRESP -CHARACTER(LEN=64) :: YMSG -! -WRITE(YMSG,'( I4,"->",I4 )') KFROM,KTO -CALL PRINT_MSG(NVERB_DEBUG,'GEN','FIELDLIST_GOTO_MODEL',TRIM(YMSG)) -! -! IF (GFIRST_CALL) THEN -! !This is necessary because the first time this subroutine is called -! !the TFIELDLIST is not yet initialized. -! !The use of this subroutine is not useful the first timebecause the -! !data for the fields has not yet been allocated. -! GFIRST_CALL = .FALSE. -! RETURN -! END IF -! -IF (.NOT.LFIELDLIST_ISINIT) THEN - CALL PRINT_MSG(NVERB_WARNING,'GEN','FIELDLIST_GOTO_MODEL','TFIELDLIST not yet initialized') - RETURN -END IF -! -if (kfrom > nmodel_allocated .or. kto > nmodel_allocated ) & - call Print_msg( NVERB_FATAL, 'GEN', 'FIELDLIST_GOTO_MODEL', 'kfrom or kto > nmodel_allocated' ) -! -! Initialize some pointers -! -!PW: TODO: check if still necessary as XRHODREFZ and XTHVREFZ are now initialiazed in ini_modeln even for KMI/=1 (29/01/2019) -IF (KFROM == KTO) THEN - IF ( CPROGRAM/='NESPGD' .AND. CPROGRAM/='PGD' ) THEN - IF (.NOT.ALLOCATED(XRHODREFZ)) CALL PRINT_MSG(NVERB_FATAL,'GEN','FIELDLIST_GOTO_MODEL','XRHODREFZ not yet allocated') - CALL FIND_FIELD_ID_FROM_MNHNAME('RHOREFZ',IID,IRESP) - TFIELDLIST(IID)%TFIELD_X1D(KFROM)%DATA=>XRHODREFZ - ! - IF (.NOT.ALLOCATED(XTHVREFZ)) CALL PRINT_MSG(NVERB_FATAL,'GEN','FIELDLIST_GOTO_MODEL','XTHVREFZ not yet allocated') - CALL FIND_FIELD_ID_FROM_MNHNAME('THVREFZ',IID,IRESP) - TFIELDLIST(IID)%TFIELD_X1D(KFROM)%DATA=>XTHVREFZ - END IF -END IF -! -! -! -! -! Save current state for allocated arrays -! -! -! -! -! -! MODD_FIELD_n variables -! -CALL FIND_FIELD_ID_FROM_MNHNAME('ZWS', IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XZWS -CALL FIND_FIELD_ID_FROM_MNHNAME('UT', IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XUT -CALL FIND_FIELD_ID_FROM_MNHNAME('VT', IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XVT -CALL FIND_FIELD_ID_FROM_MNHNAME('WT', IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XWT -CALL FIND_FIELD_ID_FROM_MNHNAME('THT', IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XTHT -CALL FIND_FIELD_ID_FROM_MNHNAME('TKET', IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XTKET -CALL FIND_FIELD_ID_FROM_MNHNAME('PABST',IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XPABST -CALL FIND_FIELD_ID_FROM_MNHNAME('PHIT', IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XPHIT -CALL FIND_FIELD_ID_FROM_MNHNAME('RT', IID,IRESP); TFIELDLIST(IID)%TFIELD_X4D(KFROM)%DATA => XRT -! -IF (ASSOCIATED(XRT)) THEN - IF (CONF_MODEL(KFROM)%IDX_RVT>0) THEN - CALL FIND_FIELD_ID_FROM_MNHNAME('RVT', IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA=>XRT(:,:,:,CONF_MODEL(KFROM)%IDX_RVT) - END IF - IF (CONF_MODEL(KFROM)%IDX_RCT>0) THEN - CALL FIND_FIELD_ID_FROM_MNHNAME('RCT', IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA=>XRT(:,:,:,CONF_MODEL(KFROM)%IDX_RCT) - END IF - IF (CONF_MODEL(KFROM)%IDX_RRT>0) THEN - CALL FIND_FIELD_ID_FROM_MNHNAME('RRT', IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA=>XRT(:,:,:,CONF_MODEL(KFROM)%IDX_RRT) - END IF - IF (CONF_MODEL(KFROM)%IDX_RIT>0) THEN - CALL FIND_FIELD_ID_FROM_MNHNAME('RIT', IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA=>XRT(:,:,:,CONF_MODEL(KFROM)%IDX_RIT) - END IF - IF (CONF_MODEL(KFROM)%IDX_RST>0) THEN - CALL FIND_FIELD_ID_FROM_MNHNAME('RST', IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA=>XRT(:,:,:,CONF_MODEL(KFROM)%IDX_RST) - END IF - IF (CONF_MODEL(KFROM)%IDX_RGT>0) THEN - CALL FIND_FIELD_ID_FROM_MNHNAME('RGT', IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA=>XRT(:,:,:,CONF_MODEL(KFROM)%IDX_RGT) - END IF - IF (CONF_MODEL(KFROM)%IDX_RHT>0) THEN - CALL FIND_FIELD_ID_FROM_MNHNAME('RHT', IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA=>XRT(:,:,:,CONF_MODEL(KFROM)%IDX_RHT) - END IF -ELSE - IF (CONF_MODEL(KFROM)%IDX_RVT>0) THEN - CALL FIND_FIELD_ID_FROM_MNHNAME('RVT', IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA=>NULL() - END IF - IF (CONF_MODEL(KFROM)%IDX_RCT>0) THEN - CALL FIND_FIELD_ID_FROM_MNHNAME('RCT', IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA=>NULL() - END IF - IF (CONF_MODEL(KFROM)%IDX_RRT>0) THEN - CALL FIND_FIELD_ID_FROM_MNHNAME('RRT', IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA=>NULL() - END IF - IF (CONF_MODEL(KFROM)%IDX_RIT>0) THEN - CALL FIND_FIELD_ID_FROM_MNHNAME('RIT', IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA=>NULL() - END IF - IF (CONF_MODEL(KFROM)%IDX_RST>0) THEN - CALL FIND_FIELD_ID_FROM_MNHNAME('RST', IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA=>NULL() - END IF - IF (CONF_MODEL(KFROM)%IDX_RGT>0) THEN - CALL FIND_FIELD_ID_FROM_MNHNAME('RGT', IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA=>NULL() - END IF - IF (CONF_MODEL(KFROM)%IDX_RHT>0) THEN - CALL FIND_FIELD_ID_FROM_MNHNAME('RHT', IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA=>NULL() - END IF - -END IF -! -CALL FIND_FIELD_ID_FROM_MNHNAME('SUPSATMAX',IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XSUPSAT -CALL FIND_FIELD_ID_FROM_MNHNAME('NACT', IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XNACT -CALL FIND_FIELD_ID_FROM_MNHNAME('SSPRO', IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XSSPRO -CALL FIND_FIELD_ID_FROM_MNHNAME('NPRO', IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XNPRO -CALL FIND_FIELD_ID_FROM_MNHNAME('SRCT', IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XSRCT -CALL FIND_FIELD_ID_FROM_MNHNAME('SIGS', IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XSIGS -! -IF (CPROGRAM == 'MESONH') THEN - ! - CALL FIND_FIELD_ID_FROM_MNHNAME('US_PRES',IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XRUS_PRES - CALL FIND_FIELD_ID_FROM_MNHNAME('VS_PRES',IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XRVS_PRES - CALL FIND_FIELD_ID_FROM_MNHNAME('WS_PRES',IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XRWS_PRES - CALL FIND_FIELD_ID_FROM_MNHNAME('THS_CLD',IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XRTHS_CLD - ! - CALL FIND_FIELD_ID_FROM_MNHNAME('RS_CLD',IID,IRESP); TFIELDLIST(IID)%TFIELD_X4D(KFROM)%DATA => XRRS_CLD - ! - IF (CONF_MODEL(KFROM)%IDX_RVT>0) THEN - CALL FIND_FIELD_ID_FROM_MNHNAME('RVS_CLD',IID,IRESP) - TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XRRS_CLD(:,:,:,CONF_MODEL(KFROM)%IDX_RVT) - END IF - IF (CONF_MODEL(KFROM)%IDX_RCT>0) THEN - CALL FIND_FIELD_ID_FROM_MNHNAME('RCS_CLD',IID,IRESP) - TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XRRS_CLD(:,:,:,CONF_MODEL(KFROM)%IDX_RCT) - END IF - IF (CONF_MODEL(KFROM)%IDX_RRT>0) THEN - CALL FIND_FIELD_ID_FROM_MNHNAME('RRS_CLD',IID,IRESP) - TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XRRS_CLD(:,:,:,CONF_MODEL(KFROM)%IDX_RRT) - END IF - IF (CONF_MODEL(KFROM)%IDX_RIT>0) THEN - CALL FIND_FIELD_ID_FROM_MNHNAME('RIS_CLD',IID,IRESP) - TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XRRS_CLD(:,:,:,CONF_MODEL(KFROM)%IDX_RIT) - END IF - IF (CONF_MODEL(KFROM)%IDX_RST>0) THEN - CALL FIND_FIELD_ID_FROM_MNHNAME('RSS_CLD',IID,IRESP) - TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XRRS_CLD(:,:,:,CONF_MODEL(KFROM)%IDX_RST) - END IF - IF (CONF_MODEL(KFROM)%IDX_RGT>0) THEN - CALL FIND_FIELD_ID_FROM_MNHNAME('RGS_CLD',IID,IRESP) - TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XRRS_CLD(:,:,:,CONF_MODEL(KFROM)%IDX_RGT) - END IF - IF (CONF_MODEL(KFROM)%IDX_RHT>0) THEN - CALL FIND_FIELD_ID_FROM_MNHNAME('RHS_CLD',IID,IRESP) - TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XRRS_CLD(:,:,:,CONF_MODEL(KFROM)%IDX_RHT) - END IF - CALL FIND_FIELD_ID_FROM_MNHNAME('CLDFR',IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XCLDFR - CALL FIND_FIELD_ID_FROM_MNHNAME('ICEFR',IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XICEFR - CALL FIND_FIELD_ID_FROM_MNHNAME('CIT', IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XCIT - CALL FIND_FIELD_ID_FROM_MNHNAME('RAINFR',IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XRAINFR - ! -END IF -! -! MODD_PAST_FIELD_n variables -! -CALL FIND_FIELD_ID_FROM_MNHNAME('UM', IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XUM -CALL FIND_FIELD_ID_FROM_MNHNAME('VM', IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XVM -CALL FIND_FIELD_ID_FROM_MNHNAME('WM', IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XWM -CALL FIND_FIELD_ID_FROM_MNHNAME('DUM',IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XDUM -CALL FIND_FIELD_ID_FROM_MNHNAME('DVM',IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XDVM -CALL FIND_FIELD_ID_FROM_MNHNAME('DWM',IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XDWM -! -! MODD_LIMA_PRECIP_SCAVENGING_n variables -! -CALL FIND_FIELD_ID_FROM_MNHNAME('INPAP',IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XINPAP -CALL FIND_FIELD_ID_FROM_MNHNAME('ACPAP',IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XACPAP -! -! MODD_ELEC_n variables -! -CALL FIND_FIELD_ID_FROM_MNHNAME('EFIELDU',IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XEFIELDU -CALL FIND_FIELD_ID_FROM_MNHNAME('EFIELDV',IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XEFIELDV -CALL FIND_FIELD_ID_FROM_MNHNAME('EFIELDW',IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XEFIELDW -CALL FIND_FIELD_ID_FROM_MNHNAME('NI_IAGGS',IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XNI_IAGGS -CALL FIND_FIELD_ID_FROM_MNHNAME('NI_IDRYG',IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XNI_IDRYG -CALL FIND_FIELD_ID_FROM_MNHNAME('NI_SDRYG',IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XNI_SDRYG -CALL FIND_FIELD_ID_FROM_MNHNAME('INDUC_CG',IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XIND_RATE -! -! MODD_CH_PH_n variables -! -CALL FIND_FIELD_ID_FROM_MNHNAME('PHC',IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XPHC -CALL FIND_FIELD_ID_FROM_MNHNAME('PHR',IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XPHR -! -! MODD_LSFIELD_n variables -! -CALL FIND_FIELD_ID_FROM_MNHNAME('LSUM', IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XLSUM -CALL FIND_FIELD_ID_FROM_MNHNAME('LSVM', IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XLSVM -CALL FIND_FIELD_ID_FROM_MNHNAME('LSWM', IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XLSWM -CALL FIND_FIELD_ID_FROM_MNHNAME('LSTHM',IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XLSTHM -IF (LUSERV) THEN - CALL FIND_FIELD_ID_FROM_MNHNAME('LSRVM',IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XLSRVM -END IF -CALL FIND_FIELD_ID_FROM_MNHNAME('LBXUM', IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XLBXUM -CALL FIND_FIELD_ID_FROM_MNHNAME('LBXVM', IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XLBXVM -CALL FIND_FIELD_ID_FROM_MNHNAME('LBXWM', IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XLBXWM -CALL FIND_FIELD_ID_FROM_MNHNAME('LBYUM', IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XLBYUM -CALL FIND_FIELD_ID_FROM_MNHNAME('LBYVM', IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XLBYVM -CALL FIND_FIELD_ID_FROM_MNHNAME('LBYWM', IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XLBYWM -CALL FIND_FIELD_ID_FROM_MNHNAME('LBXTHM',IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XLBXTHM -CALL FIND_FIELD_ID_FROM_MNHNAME('LBYTHM',IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XLBYTHM -! -! MODD_DYN_n variables -! -!***NONE*** -! -! MODD_ADV_n variables -! -CALL FIND_FIELD_ID_FROM_MNHNAME('TKEMS',IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XRTKEMS -! -! MODD_GRID_n variables -! -CALL FIND_FIELD_ID_FROM_MNHNAME('ZS', IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XZS -CALL FIND_FIELD_ID_FROM_MNHNAME('ZSMT', IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XZSMT -CALL FIND_FIELD_ID_FROM_MNHNAME('XHAT', IID,IRESP); TFIELDLIST(IID)%TFIELD_X1D(KFROM)%DATA => XXHAT -CALL FIND_FIELD_ID_FROM_MNHNAME('YHAT', IID,IRESP); TFIELDLIST(IID)%TFIELD_X1D(KFROM)%DATA => XYHAT -CALL FIND_FIELD_ID_FROM_MNHNAME('ZHAT', IID,IRESP); TFIELDLIST(IID)%TFIELD_X1D(KFROM)%DATA => XZHAT -CALL FIND_FIELD_ID_FROM_MNHNAME('ZTOP', IID,IRESP); TFIELDLIST(IID)%TFIELD_X0D(KFROM)%DATA => XZTOP -CALL FIND_FIELD_ID_FROM_MNHNAME('DXHAT',IID,IRESP); TFIELDLIST(IID)%TFIELD_X1D(KFROM)%DATA => XDXHAT -CALL FIND_FIELD_ID_FROM_MNHNAME('DYHAT',IID,IRESP); TFIELDLIST(IID)%TFIELD_X1D(KFROM)%DATA => XDYHAT -CALL FIND_FIELD_ID_FROM_MNHNAME('ALT', IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XZZ -CALL FIND_FIELD_ID_FROM_MNHNAME('DIRCOSXW',IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XDIRCOSXW -CALL FIND_FIELD_ID_FROM_MNHNAME('DIRCOSYW',IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XDIRCOSYW -CALL FIND_FIELD_ID_FROM_MNHNAME('DIRCOSZW',IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XDIRCOSZW -CALL FIND_FIELD_ID_FROM_MNHNAME('COSSLOPE',IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XCOSSLOPE -CALL FIND_FIELD_ID_FROM_MNHNAME('SINSLOPE',IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XSINSLOPE -CALL FIND_FIELD_ID_FROM_MNHNAME('MAP', IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XMAP -CALL FIND_FIELD_ID_FROM_MNHNAME('LAT', IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XLAT -CALL FIND_FIELD_ID_FROM_MNHNAME('LON', IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XLON -! -! MODD_TIME_n variables -! -!***NONE*** -! -! MODD_PARAM_n variables -! -!***NONE*** -! -! MODD_TURB_n variables -! -CALL FIND_FIELD_ID_FROM_MNHNAME('BL_DEPTH', IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XBL_DEPTH -CALL FIND_FIELD_ID_FROM_MNHNAME('SBL_DEPTH',IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XSBL_DEPTH -CALL FIND_FIELD_ID_FROM_MNHNAME('WTHVMF', IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XWTHVMF -! -! MODD_REF_n variables -! -CALL FIND_FIELD_ID_FROM_MNHNAME('RHODREF',IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XRHODREF -CALL FIND_FIELD_ID_FROM_MNHNAME('THVREF', IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XTHVREF -! -! MODD_RADIATIONS_n variables -! -IF (CPROGRAM=='MESONH') THEN - CALL FIND_FIELD_ID_FROM_MNHNAME('DTHRAD', IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XDTHRAD - CALL FIND_FIELD_ID_FROM_MNHNAME('FLALWD', IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XFLALWD - CALL FIND_FIELD_ID_FROM_MNHNAME('DIRFLASWD', IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XDIRFLASWD - CALL FIND_FIELD_ID_FROM_MNHNAME('SCAFLASWD', IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XSCAFLASWD - CALL FIND_FIELD_ID_FROM_MNHNAME('DIRSRFSWD', IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XDIRSRFSWD - CALL FIND_FIELD_ID_FROM_MNHNAME('CLEARCOL_TM1',IID,IRESP); TFIELDLIST(IID)%TFIELD_N2D(KFROM)%DATA => NCLEARCOL_TM1 - CALL FIND_FIELD_ID_FROM_MNHNAME('ZENITH', IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XZENITH - CALL FIND_FIELD_ID_FROM_MNHNAME('AZIM', IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XAZIM - CALL FIND_FIELD_ID_FROM_MNHNAME('DIR_ALB', IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XDIR_ALB - CALL FIND_FIELD_ID_FROM_MNHNAME('SCA_ALB', IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XSCA_ALB - CALL FIND_FIELD_ID_FROM_MNHNAME('EMIS', IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XEMIS - CALL FIND_FIELD_ID_FROM_MNHNAME('TSRAD', IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XTSRAD + CALL PRINT_MSG(NVERB_DEBUG,'GEN','INI_FIELD_SCALARS',' XLEN2 was not associated') + ALLOCATE(XLEN2) + call Goto_model_1field( 'LEN2', 1, 1, XLEN2 ) END IF ! -! MODD_DEEP_CONVECTION_n variables +IF (.NOT.ASSOCIATED(TDTMOD)) THEN + CALL PRINT_MSG(NVERB_DEBUG,'GEN','INI_FIELD_SCALARS',' TDTMOD was not associated') + ALLOCATE(TDTMOD) + call Goto_model_1field( 'DTMOD', 1, 1, TDTMOD ) +END IF ! -IF (TRIM(CPROGRAM) /= 'PGD' .AND. TRIM(CPROGRAM) /= 'NESPGD' .AND. TRIM(CPROGRAM) /= 'SPAWN') THEN - CALL FIND_FIELD_ID_FROM_MNHNAME('COUNTCONV', IID,IRESP); TFIELDLIST(IID)%TFIELD_N2D(KFROM)%DATA => NCOUNTCONV - CALL FIND_FIELD_ID_FROM_MNHNAME('DTHCONV', IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XDTHCONV - CALL FIND_FIELD_ID_FROM_MNHNAME('DRVCONV', IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XDRVCONV - CALL FIND_FIELD_ID_FROM_MNHNAME('DRCCONV', IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XDRCCONV - CALL FIND_FIELD_ID_FROM_MNHNAME('DRICONV', IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XDRICONV - CALL FIND_FIELD_ID_FROM_MNHNAME('PRCONV', IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XPRCONV - CALL FIND_FIELD_ID_FROM_MNHNAME('PACCONV', IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XPACCONV - CALL FIND_FIELD_ID_FROM_MNHNAME('PRSCONV', IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XPRSCONV - CALL FIND_FIELD_ID_FROM_MNHNAME('DSVCONV', IID,IRESP); TFIELDLIST(IID)%TFIELD_X4D(KFROM)%DATA => XDSVCONV - CALL FIND_FIELD_ID_FROM_MNHNAME('PRLFLXCONV', IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XPRLFLXCONV - CALL FIND_FIELD_ID_FROM_MNHNAME('PRSFLXCONV', IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XPRSFLXCONV - CALL FIND_FIELD_ID_FROM_MNHNAME('UMFCONV', IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XUMFCONV - CALL FIND_FIELD_ID_FROM_MNHNAME('DMFCONV', IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XDMFCONV - CALL FIND_FIELD_ID_FROM_MNHNAME('MFCONV', IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XMFCONV - CALL FIND_FIELD_ID_FROM_MNHNAME('CAPE', IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XCAPE - CALL FIND_FIELD_ID_FROM_MNHNAME('CLTOPCONV_LVL',IID,IRESP); TFIELDLIST(IID)%TFIELD_N2D(KFROM)%DATA => NCLTOPCONV - CALL FIND_FIELD_ID_FROM_MNHNAME('CLBASCONV_LVL',IID,IRESP); TFIELDLIST(IID)%TFIELD_N2D(KFROM)%DATA => NCLBASCONV - CALL FIND_FIELD_ID_FROM_MNHNAME('IC_RATE', IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XIC_RATE - CALL FIND_FIELD_ID_FROM_MNHNAME('CG_RATE', IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XCG_RATE - CALL FIND_FIELD_ID_FROM_MNHNAME('IC_TOTAL_NB',IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XIC_TOTAL_NUMBER - CALL FIND_FIELD_ID_FROM_MNHNAME('CG_TOTAL_NB',IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XCG_TOTAL_NUMBER +IF (.NOT.ASSOCIATED(TDTCUR)) THEN + CALL PRINT_MSG(NVERB_DEBUG,'GEN','INI_FIELD_SCALARS',' TDTCUR was not associated') + ALLOCATE(TDTCUR) + call Goto_model_1field( 'DTCUR', 1, 1, TDTCUR ) END IF ! -! MODD_GR_FIELD_n variables +IF (.NOT.ASSOCIATED(TDTRAD_FULL)) THEN + CALL PRINT_MSG(NVERB_DEBUG,'GEN','INI_FIELD_SCALARS',' TDTRAD_FULL was not associated') + ALLOCATE(TDTRAD_FULL) + call Goto_model_1field( 'DTRAD_FULL', 1, 1, TDTRAD_FULL ) +END IF ! -CALL FIND_FIELD_ID_FROM_MNHNAME('SSO_ANIS', IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XSSO_ANISOTROPY -CALL FIND_FIELD_ID_FROM_MNHNAME('SSO_SLOPE',IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XSSO_SLOPE -CALL FIND_FIELD_ID_FROM_MNHNAME('SSO_DIR', IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XSSO_DIRECTION -CALL FIND_FIELD_ID_FROM_MNHNAME('AVG_ZS', IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XAVG_ZS -CALL FIND_FIELD_ID_FROM_MNHNAME('SIL_ZS', IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XSIL_ZS -CALL FIND_FIELD_ID_FROM_MNHNAME('MAX_ZS', IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XMAX_ZS -CALL FIND_FIELD_ID_FROM_MNHNAME('MIN_ZS', IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XMIN_ZS -CALL FIND_FIELD_ID_FROM_MNHNAME('SSO_STDEV',IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XSSO_STDEV +IF (.NOT.ASSOCIATED(TDTRAD_CLONLY)) THEN + CALL PRINT_MSG(NVERB_DEBUG,'GEN','INI_FIELD_SCALARS',' TDTRAD_CLONLY was not associated') + ALLOCATE(TDTRAD_CLONLY) + call Goto_model_1field( 'DTRAD_CLLY', 1, 1, TDTRAD_CLONLY ) +END IF ! -! MODD_PRECIP_n variables +IF (.NOT.ASSOCIATED(TDTDCONV)) THEN + CALL PRINT_MSG(NVERB_DEBUG,'GEN','INI_FIELD_SCALARS',' TDTDCONV was not associated') + ALLOCATE(TDTDCONV) + call Goto_model_1field( 'DTDCONV', 1, 1, TDTDCONV ) +END IF ! -CALL FIND_FIELD_ID_FROM_MNHNAME('INPRC', IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XINPRC -CALL FIND_FIELD_ID_FROM_MNHNAME('ACPRC', IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XACPRC -CALL FIND_FIELD_ID_FROM_MNHNAME('INDEP', IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XINDEP -CALL FIND_FIELD_ID_FROM_MNHNAME('ACDEP', IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XACDEP -CALL FIND_FIELD_ID_FROM_MNHNAME('INPRR', IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XINPRR -CALL FIND_FIELD_ID_FROM_MNHNAME('INPRR3D',IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XINPRR3D -CALL FIND_FIELD_ID_FROM_MNHNAME('EVAP3D', IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XEVAP3D -CALL FIND_FIELD_ID_FROM_MNHNAME('ACPRR', IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XACPRR -CALL FIND_FIELD_ID_FROM_MNHNAME('INPRS', IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XINPRS -CALL FIND_FIELD_ID_FROM_MNHNAME('ACPRS', IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XACPRS -CALL FIND_FIELD_ID_FROM_MNHNAME('INPRG', IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XINPRG -CALL FIND_FIELD_ID_FROM_MNHNAME('ACPRG', IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XACPRG -CALL FIND_FIELD_ID_FROM_MNHNAME('INPRH', IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XINPRH -CALL FIND_FIELD_ID_FROM_MNHNAME('ACPRH', IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XACPRH +IF (.NOT.ASSOCIATED(CSURF)) THEN + CALL PRINT_MSG(NVERB_DEBUG,'GEN','INI_FIELD_SCALARS',' CSURF was not associated') + ALLOCATE(CHARACTER(LEN=4) :: CSURF) + CSURF = '' + call Goto_model_1field( 'SURF', 1, 1, CSURF ) +END IF ! -! MODD_DEF_EDDY_FLUX_n variables +IF (.NOT.ASSOCIATED(XDRYMASST)) THEN + CALL PRINT_MSG(NVERB_DEBUG,'GEN','INI_FIELD_SCALARS',' XDRYMASST was not associated') + ALLOCATE(XDRYMASST) + call Goto_model_1field( 'DRYMASST', 1, 1, XDRYMASST ) +END IF ! -CALL FIND_FIELD_ID_FROM_MNHNAME('VT_FLX',IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XVTH_FLUX_M -CALL FIND_FIELD_ID_FROM_MNHNAME('WT_FLX',IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XWTH_FLUX_M -CALL FIND_FIELD_ID_FROM_MNHNAME('RTHS_EDDY_FLUX',IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XRTHS_EDDY_FLUX +IF (.NOT.ASSOCIATED(XDRYMASSS)) THEN + CALL PRINT_MSG(NVERB_DEBUG,'GEN','INI_FIELD_SCALARS',' XDRYMASSS was not associated') + ALLOCATE(XDRYMASSS) + call Goto_model_1field( 'DRYMASSS', 1, 1, XDRYMASSS ) +END IF ! -! MODD_DEF_EDDYUV_FLUX_n variables +IF (.NOT.ASSOCIATED(NRIMX)) THEN + CALL PRINT_MSG(NVERB_DEBUG,'GEN','INI_FIELD_SCALARS',' NRIMX was not associated') + ALLOCATE(NRIMX) + call Goto_model_1field( 'RIMX', 1, 1, NRIMX ) +END IF ! -CALL FIND_FIELD_ID_FROM_MNHNAME('VU_FLX',IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XVU_FLUX_M -CALL FIND_FIELD_ID_FROM_MNHNAME('RVS_EDDY_FLUX',IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XRVS_EDDY_FLUX +IF (.NOT.ASSOCIATED(NRIMY)) THEN + CALL PRINT_MSG(NVERB_DEBUG,'GEN','INI_FIELD_SCALARS',' NRIMY was not associated') + ALLOCATE(NRIMY) + call Goto_model_1field( 'RIMY', 1, 1, NRIMY ) +END IF ! -! MODD_HURR_FIELD_n variables +IF (.NOT.ASSOCIATED(LHORELAX_UVWTH)) THEN + CALL PRINT_MSG(NVERB_DEBUG,'GEN','INI_FIELD_SCALARS',' LHORELAX_UVWTH was not associated') + ALLOCATE(LHORELAX_UVWTH) + call Goto_model_1field( 'HORELAX_UVWTH', 1, 1, LHORELAX_UVWTH ) +END IF ! -IF (CPROGRAM=='REAL') THEN - CALL FIND_FIELD_ID_FROM_MNHNAME('UT15', IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XUTOT - CALL FIND_FIELD_ID_FROM_MNHNAME('VT15', IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XVTOT - CALL FIND_FIELD_ID_FROM_MNHNAME('TEMPTOT',IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XTTOT - CALL FIND_FIELD_ID_FROM_MNHNAME('PRESTOT',IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XPTOT - CALL FIND_FIELD_ID_FROM_MNHNAME('HUMTOT', IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XQTOT - CALL FIND_FIELD_ID_FROM_MNHNAME('UT16', IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XUENV - CALL FIND_FIELD_ID_FROM_MNHNAME('VT16', IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XVENV - CALL FIND_FIELD_ID_FROM_MNHNAME('TEMPENV',IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XTENV - CALL FIND_FIELD_ID_FROM_MNHNAME('PRESENV',IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XPENV - CALL FIND_FIELD_ID_FROM_MNHNAME('HUMENV', IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XQENV - CALL FIND_FIELD_ID_FROM_MNHNAME('UT17', IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XUBASIC - CALL FIND_FIELD_ID_FROM_MNHNAME('VT17', IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XVBASIC - CALL FIND_FIELD_ID_FROM_MNHNAME('TEMPBAS',IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XTBASIC - CALL FIND_FIELD_ID_FROM_MNHNAME('PRESBAS',IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XPBASIC - CALL FIND_FIELD_ID_FROM_MNHNAME('HUMBAS', IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XQBASIC - CALL FIND_FIELD_ID_FROM_MNHNAME('VTDIS', IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XVTDIS +IF (.NOT.ASSOCIATED(LHORELAX_TKE)) THEN + CALL PRINT_MSG(NVERB_DEBUG,'GEN','INI_FIELD_SCALARS',' LHORELAX_TKE was not associated') + ALLOCATE(LHORELAX_TKE) + call Goto_model_1field( 'HORELAX_TKE', 1, 1, LHORELAX_TKE ) END IF ! -! MODD_FIRE variables +END SUBROUTINE INI_FIELD_SCALARS ! -IF (CPROGRAM=='MESONH') THEN -CALL FIND_FIELD_ID_FROM_MNHNAME('LSPHI', IID,IRESP); -IF (IRESP == 0) TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XLSPHI -CALL FIND_FIELD_ID_FROM_MNHNAME('BMAP', IID,IRESP); -IF (IRESP == 0) TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XBMAP -!CALL FIND_FIELD_ID_FROM_MNHNAME('FMRFA', IID,IRESP); -!IF (IRESP == 0) TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XFMRFA -!CALL FIND_FIELD_ID_FROM_MNHNAME('FMWF0', IID,IRESP); -!IF (IRESP == 0) TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XFMWF0 -CALL FIND_FIELD_ID_FROM_MNHNAME('FMR0', IID,IRESP); -IF (IRESP == 0) TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XFMR0 -!CALL FIND_FIELD_ID_FROM_MNHNAME('FMR00', IID,IRESP); -!IF (IRESP == 0) TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XFMR00 -!CALL FIND_FIELD_ID_FROM_MNHNAME('FMIGNITION', IID,IRESP); -!IF (IRESP == 0) TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XFMIGNITION -!CALL FIND_FIELD_ID_FROM_MNHNAME('FMFUELTYPE', IID,IRESP); -!IF (IRESP == 0) TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XFMFUELTYPE -!CALL FIND_FIELD_ID_FROM_MNHNAME('FIRETAU', IID,IRESP); -!IF (IRESP == 0) TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XFIRETAU -!CALL FIND_FIELD_ID_FROM_MNHNAME('FLUXPARAMH', IID,IRESP); -!IF (IRESP == 0) TFIELDLIST(IID)%TFIELD_X4D(KFROM)%DATA => XFLUXPARAMH -!CALL FIND_FIELD_ID_FROM_MNHNAME('FLUXPARAMW', IID,IRESP); -!IF (IRESP == 0) TFIELDLIST(IID)%TFIELD_X4D(KFROM)%DATA => XFLUXPARAMW -CALL FIND_FIELD_ID_FROM_MNHNAME('FIRERW', IID,IRESP); -IF (IRESP == 0) TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XFIRERW -CALL FIND_FIELD_ID_FROM_MNHNAME('FMASE', IID,IRESP); -IF (IRESP == 0) TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XFMASE -CALL FIND_FIELD_ID_FROM_MNHNAME('FMAWC', IID,IRESP); -IF (IRESP == 0) TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XFMAWC -!CALL FIND_FIELD_ID_FROM_MNHNAME('FMWALKIG', IID,IRESP); -!IF (IRESP == 0) TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XFMWALKIG -CALL FIND_FIELD_ID_FROM_MNHNAME('FMFLUXHDH', IID,IRESP); -IF (IRESP == 0) TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XFMFLUXHDH -CALL FIND_FIELD_ID_FROM_MNHNAME('FMFLUXHDW', IID,IRESP); -IF (IRESP == 0) TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XFMFLUXHDW -CALL FIND_FIELD_ID_FROM_MNHNAME('FMHWS', IID,IRESP); -IF (IRESP == 0) TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XFMHWS -CALL FIND_FIELD_ID_FROM_MNHNAME('FMWINDU', IID,IRESP); -IF (IRESP == 0) TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XFMWINDU -CALL FIND_FIELD_ID_FROM_MNHNAME('FMWINDV', IID,IRESP); -IF (IRESP == 0) TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XFMWINDV -CALL FIND_FIELD_ID_FROM_MNHNAME('FMWINDW', IID,IRESP); -IF (IRESP == 0) TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XFMWINDW -CALL FIND_FIELD_ID_FROM_MNHNAME('FMGRADOROX', IID,IRESP); -IF (IRESP == 0) TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XFMGRADOROX -CALL FIND_FIELD_ID_FROM_MNHNAME('FMGRADOROY', IID,IRESP); -IF (IRESP == 0) TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XFMGRADOROY -END IF ! +SUBROUTINE FIELDLIST_GOTO_MODEL(KFROM, KTO) ! +USE MODD_REF ! +USE MODD_ADV_n +USE MODD_CONF_n +USE MODD_DEEP_CONVECTION_n +USE MODD_DEF_EDDY_FLUX_n +USE MODD_DEF_EDDYUV_FLUX_n +USE MODD_DYN_n +USE MODD_ELEC_n +USE MODD_FIELD_n +USE MODD_GR_FIELD_n +USE MODD_GRID_n +USE MODD_HURR_FIELD_n +USE MODD_LIMA_PRECIP_SCAVENGING_n +USE MODD_LSFIELD_n +USE MODD_OCEANH +USE MODD_PARAM_n +USE MODD_PAST_FIELD_n +USE MODD_CH_PH_n +USE MODD_PRECIP_n +USE MODD_RADIATIONS_n +USE MODD_REF_n +USE MODD_TIME_n +USE MODD_TURB_n ! -! Current model is set to model KTO +INTEGER, INTENT(IN) :: KFROM, KTO ! +!LOGICAL,SAVE :: GFIRST_CALL=.TRUE. +INTEGER :: IID,IID2,IRESP +CHARACTER(LEN=64) :: YMSG ! +WRITE(YMSG,'( I4,"->",I4 )') KFROM,KTO +CALL PRINT_MSG(NVERB_DEBUG,'GEN','FIELDLIST_GOTO_MODEL',TRIM(YMSG)) ! +! IF (GFIRST_CALL) THEN +! !This is necessary because the first time this subroutine is called +! !the TFIELDLIST is not yet initialized. +! !The use of this subroutine is not useful the first timebecause the +! !data for the fields has not yet been allocated. +! GFIRST_CALL = .FALSE. +! RETURN +! END IF ! -IF( KFROM/=KTO) THEN +IF (.NOT.LFIELDLIST_ISINIT) THEN + CALL PRINT_MSG(NVERB_WARNING,'GEN','FIELDLIST_GOTO_MODEL','TFIELDLIST not yet initialized') + RETURN +END IF ! ! MODD_FIELD_n variables ! -CALL FIND_FIELD_ID_FROM_MNHNAME('ZWS', IID,IRESP); XZWS => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA -CALL FIND_FIELD_ID_FROM_MNHNAME('UT', IID,IRESP); XUT => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA -CALL FIND_FIELD_ID_FROM_MNHNAME('VT', IID,IRESP); XVT => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA -CALL FIND_FIELD_ID_FROM_MNHNAME('WT', IID,IRESP); XWT => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA -CALL FIND_FIELD_ID_FROM_MNHNAME('THT', IID,IRESP); XTHT => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA -CALL FIND_FIELD_ID_FROM_MNHNAME('TKET', IID,IRESP); XTKET => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA -CALL FIND_FIELD_ID_FROM_MNHNAME('PABST',IID,IRESP); XPABST => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA -CALL FIND_FIELD_ID_FROM_MNHNAME('PHIT', IID,IRESP); XPHIT => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA -CALL FIND_FIELD_ID_FROM_MNHNAME('RT', IID,IRESP); XRT => TFIELDLIST(IID)%TFIELD_X4D(KTO)%DATA -! -IF (ASSOCIATED(XRT)) THEN - IF (CONF_MODEL(KTO)%IDX_RVT>0) THEN - CALL FIND_FIELD_ID_FROM_MNHNAME('RVT',IID2,IRESP) - TFIELDLIST(IID2)%TFIELD_X3D(KTO)%DATA => TFIELDLIST(IID)%TFIELD_X4D(KTO)%DATA(:,:,:,CONF_MODEL(KTO)%IDX_RVT) - END IF - IF (CONF_MODEL(KTO)%IDX_RCT>0) THEN - CALL FIND_FIELD_ID_FROM_MNHNAME('RCT',IID2,IRESP) - TFIELDLIST(IID2)%TFIELD_X3D(KTO)%DATA => TFIELDLIST(IID)%TFIELD_X4D(KTO)%DATA(:,:,:,CONF_MODEL(KTO)%IDX_RCT) - END IF - IF (CONF_MODEL(KTO)%IDX_RRT>0) THEN - CALL FIND_FIELD_ID_FROM_MNHNAME('RRT',IID2,IRESP) - TFIELDLIST(IID2)%TFIELD_X3D(KTO)%DATA => TFIELDLIST(IID)%TFIELD_X4D(KTO)%DATA(:,:,:,CONF_MODEL(KTO)%IDX_RRT) - END IF - IF (CONF_MODEL(KTO)%IDX_RIT>0) THEN - CALL FIND_FIELD_ID_FROM_MNHNAME('RIT',IID2,IRESP) - TFIELDLIST(IID2)%TFIELD_X3D(KTO)%DATA => TFIELDLIST(IID)%TFIELD_X4D(KTO)%DATA(:,:,:,CONF_MODEL(KTO)%IDX_RIT) - END IF - IF (CONF_MODEL(KTO)%IDX_RST>0) THEN - CALL FIND_FIELD_ID_FROM_MNHNAME('RST',IID2,IRESP) - TFIELDLIST(IID2)%TFIELD_X3D(KTO)%DATA => TFIELDLIST(IID)%TFIELD_X4D(KTO)%DATA(:,:,:,CONF_MODEL(KTO)%IDX_RST) - END IF - IF (CONF_MODEL(KTO)%IDX_RGT>0) THEN - CALL FIND_FIELD_ID_FROM_MNHNAME('RGT',IID2,IRESP) - TFIELDLIST(IID2)%TFIELD_X3D(KTO)%DATA => TFIELDLIST(IID)%TFIELD_X4D(KTO)%DATA(:,:,:,CONF_MODEL(KTO)%IDX_RGT) - END IF - IF (CONF_MODEL(KTO)%IDX_RHT>0) THEN - CALL FIND_FIELD_ID_FROM_MNHNAME('RHT',IID2,IRESP) - TFIELDLIST(IID2)%TFIELD_X3D(KTO)%DATA => TFIELDLIST(IID)%TFIELD_X4D(KTO)%DATA(:,:,:,CONF_MODEL(KTO)%IDX_RHT) - END IF -ELSE - IF (CONF_MODEL(KTO)%IDX_RVT>0) THEN - CALL FIND_FIELD_ID_FROM_MNHNAME('RVT',IID2,IRESP) - TFIELDLIST(IID2)%TFIELD_X3D(KTO)%DATA => NULL() - END IF - IF (CONF_MODEL(KTO)%IDX_RCT>0) THEN - CALL FIND_FIELD_ID_FROM_MNHNAME('RCT',IID2,IRESP) - TFIELDLIST(IID2)%TFIELD_X3D(KTO)%DATA => NULL() - END IF - IF (CONF_MODEL(KTO)%IDX_RRT>0) THEN - CALL FIND_FIELD_ID_FROM_MNHNAME('RRT',IID2,IRESP) - TFIELDLIST(IID2)%TFIELD_X3D(KTO)%DATA => NULL() - END IF - IF (CONF_MODEL(KTO)%IDX_RIT>0) THEN - CALL FIND_FIELD_ID_FROM_MNHNAME('RIT',IID2,IRESP) - TFIELDLIST(IID2)%TFIELD_X3D(KTO)%DATA => NULL() - END IF - IF (CONF_MODEL(KTO)%IDX_RST>0) THEN - CALL FIND_FIELD_ID_FROM_MNHNAME('RST',IID2,IRESP) - TFIELDLIST(IID2)%TFIELD_X3D(KTO)%DATA => NULL() - END IF - IF (CONF_MODEL(KTO)%IDX_RGT>0) THEN - CALL FIND_FIELD_ID_FROM_MNHNAME('RGT',IID2,IRESP) - TFIELDLIST(IID2)%TFIELD_X3D(KTO)%DATA => NULL() - END IF - IF (CONF_MODEL(KTO)%IDX_RHT>0) THEN - CALL FIND_FIELD_ID_FROM_MNHNAME('RHT',IID2,IRESP) - TFIELDLIST(IID2)%TFIELD_X3D(KTO)%DATA => NULL() - END IF +call Goto_model_1field( 'ZWS', kfrom, kto, xzws ) +call Goto_model_1field( 'UT', kfrom, kto, xut ) +call Goto_model_1field( 'VT', kfrom, kto, xvt ) +call Goto_model_1field( 'WT', kfrom, kto, xwt ) +call Goto_model_1field( 'THT', kfrom, kto, xtht ) +call Goto_model_1field( 'TKET', kfrom, kto, xtket ) +call Goto_model_1field( 'PABST', kfrom, kto, xpabst ) +call Goto_model_1field( 'PHIT', kfrom, kto, xphit ) +call Goto_model_1field( 'RT', kfrom, kto, xrt ) +! +CALL FIND_FIELD_ID_FROM_MNHNAME( 'RT', IID2, IRESP ) + +IF (CONF_MODEL(KFROM)%IDX_RVT>0) THEN + CALL FIND_FIELD_ID_FROM_MNHNAME( 'RVT', IID, IRESP ) + call Extend_1field_x3d( tfieldlist(iid), Max( kfrom, kto ) ) + if ( Associated( TFIELDLIST(IID2)%TFIELD_X4D(KFROM)%DATA ) ) & + TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => TFIELDLIST(IID2)%TFIELD_X4D(KFROM)%DATA(:,:,:,CONF_MODEL(KFROM)%IDX_RVT) + if ( kfrom /= kto .and. Associated( TFIELDLIST(IID2)%TFIELD_X4D(KTO)%DATA ) ) & + TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA => TFIELDLIST(IID2)%TFIELD_X4D(KTO)%DATA(:,:,:,CONF_MODEL(KTO)%IDX_RVT) +END IF +IF (CONF_MODEL(KFROM)%IDX_RCT>0) THEN + CALL FIND_FIELD_ID_FROM_MNHNAME( 'RCT', IID, IRESP ) + call Extend_1field_x3d( tfieldlist(iid), Max( kfrom, kto ) ) + if ( Associated( TFIELDLIST(IID2)%TFIELD_X4D(KFROM)%DATA ) ) & + TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => TFIELDLIST(IID2)%TFIELD_X4D(KFROM)%DATA(:,:,:,CONF_MODEL(KFROM)%IDX_RCT) + if ( kfrom /= kto .and. Associated( TFIELDLIST(IID2)%TFIELD_X4D(KTO)%DATA ) ) & + TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA => TFIELDLIST(IID2)%TFIELD_X4D(KTO)%DATA(:,:,:,CONF_MODEL(KTO)%IDX_RCT) +END IF +IF (CONF_MODEL(KFROM)%IDX_RRT>0) THEN + CALL FIND_FIELD_ID_FROM_MNHNAME( 'RRT', IID, IRESP ) + call Extend_1field_x3d( tfieldlist(iid), Max( kfrom, kto ) ) + if ( Associated( TFIELDLIST(IID2)%TFIELD_X4D(KFROM)%DATA ) ) & + TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => TFIELDLIST(IID2)%TFIELD_X4D(KFROM)%DATA(:,:,:,CONF_MODEL(KFROM)%IDX_RRT) + if ( kfrom /= kto .and. Associated( TFIELDLIST(IID2)%TFIELD_X4D(KTO)%DATA ) ) & + TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA => TFIELDLIST(IID2)%TFIELD_X4D(KTO)%DATA(:,:,:,CONF_MODEL(KTO)%IDX_RRT) +END IF +IF (CONF_MODEL(KFROM)%IDX_RIT>0) THEN + CALL FIND_FIELD_ID_FROM_MNHNAME( 'RIT', IID, IRESP ) + call Extend_1field_x3d( tfieldlist(iid), Max( kfrom, kto ) ) + if ( Associated( TFIELDLIST(IID2)%TFIELD_X4D(KFROM)%DATA ) ) & + TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => TFIELDLIST(IID2)%TFIELD_X4D(KFROM)%DATA(:,:,:,CONF_MODEL(KFROM)%IDX_RIT) + if ( kfrom /= kto .and. Associated( TFIELDLIST(IID2)%TFIELD_X4D(KTO)%DATA ) ) & + TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA => TFIELDLIST(IID2)%TFIELD_X4D(KTO)%DATA(:,:,:,CONF_MODEL(KTO)%IDX_RIT) +END IF +IF (CONF_MODEL(KFROM)%IDX_RST>0) THEN + CALL FIND_FIELD_ID_FROM_MNHNAME( 'RST', IID, IRESP ) + call Extend_1field_x3d( tfieldlist(iid), Max( kfrom, kto ) ) + if ( Associated( TFIELDLIST(IID2)%TFIELD_X4D(KFROM)%DATA ) ) & + TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => TFIELDLIST(IID2)%TFIELD_X4D(KFROM)%DATA(:,:,:,CONF_MODEL(KFROM)%IDX_RST) + if ( kfrom /= kto .and. Associated( TFIELDLIST(IID2)%TFIELD_X4D(KTO)%DATA ) ) & + TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA => TFIELDLIST(IID2)%TFIELD_X4D(KTO)%DATA(:,:,:,CONF_MODEL(KTO)%IDX_RST) +END IF +IF (CONF_MODEL(KFROM)%IDX_RGT>0) THEN + CALL FIND_FIELD_ID_FROM_MNHNAME( 'RGT', IID, IRESP ) + call Extend_1field_x3d( tfieldlist(iid), Max( kfrom, kto ) ) + if ( Associated( TFIELDLIST(IID2)%TFIELD_X4D(KFROM)%DATA ) ) & + TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => TFIELDLIST(IID2)%TFIELD_X4D(KFROM)%DATA(:,:,:,CONF_MODEL(KFROM)%IDX_RGT) + if ( kfrom /= kto .and. Associated( TFIELDLIST(IID2)%TFIELD_X4D(KTO)%DATA ) ) & + TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA => TFIELDLIST(IID2)%TFIELD_X4D(KTO)%DATA(:,:,:,CONF_MODEL(KTO)%IDX_RGT) +END IF +IF (CONF_MODEL(KFROM)%IDX_RHT>0) THEN + CALL FIND_FIELD_ID_FROM_MNHNAME( 'RHT', IID, IRESP ) + call Extend_1field_x3d( tfieldlist(iid), Max( kfrom, kto ) ) + if ( Associated( TFIELDLIST(IID2)%TFIELD_X4D(KFROM)%DATA ) ) & + TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => TFIELDLIST(IID2)%TFIELD_X4D(KFROM)%DATA(:,:,:,CONF_MODEL(KFROM)%IDX_RHT) + if ( kfrom /= kto .and. Associated( TFIELDLIST(IID2)%TFIELD_X4D(KTO)%DATA ) ) & + TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA => TFIELDLIST(IID2)%TFIELD_X4D(KTO)%DATA(:,:,:,CONF_MODEL(KTO)%IDX_RHT) END IF ! -CALL FIND_FIELD_ID_FROM_MNHNAME('SUPSATMAX',IID,IRESP); XSUPSAT => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA -CALL FIND_FIELD_ID_FROM_MNHNAME('NACT', IID,IRESP); XNACT => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA -CALL FIND_FIELD_ID_FROM_MNHNAME('SSPRO', IID,IRESP); XSSPRO => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA -CALL FIND_FIELD_ID_FROM_MNHNAME('NPRO', IID,IRESP); XNPRO => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA -CALL FIND_FIELD_ID_FROM_MNHNAME('SRCT', IID,IRESP); XSRCT => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA -CALL FIND_FIELD_ID_FROM_MNHNAME('SIGS', IID,IRESP); XSIGS => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA +call Goto_model_1field( 'SUPSATMAX', kfrom, kto, XSUPSAT ) +call Goto_model_1field( 'NACT', kfrom, kto, XNACT ) +call Goto_model_1field( 'SSPRO', kfrom, kto, XSSPRO ) +call Goto_model_1field( 'NPRO', kfrom, kto, XNPRO ) +call Goto_model_1field( 'SRCT', kfrom, kto, XSRCT ) +call Goto_model_1field( 'SIGS', kfrom, kto, XSIGS ) ! IF (CPROGRAM == 'MESONH') THEN + call Goto_model_1field( 'US_PRES', kfrom, kto, XRUS_PRES ) + call Goto_model_1field( 'VS_PRES', kfrom, kto, XRVS_PRES ) + call Goto_model_1field( 'WS_PRES', kfrom, kto, XRWS_PRES ) + call Goto_model_1field( 'THS_CLD', kfrom, kto, XRTHS_CLD ) + + call Goto_model_1field( 'RS_CLD', kfrom, kto, XRRS_CLD ) ! - CALL FIND_FIELD_ID_FROM_MNHNAME('RS_CLD',IID,IRESP); XRRS_CLD => TFIELDLIST(IID)%TFIELD_X4D(KTO)%DATA - ! - IF (CONF_MODEL(KTO)%IDX_RVT>0) THEN - CALL FIND_FIELD_ID_FROM_MNHNAME('RVS_CLD',IID2,IRESP) - TFIELDLIST(IID2)%TFIELD_X3D(KTO)%DATA => TFIELDLIST(IID)%TFIELD_X4D(KTO)%DATA(:,:,:,CONF_MODEL(KTO)%IDX_RVT) + CALL FIND_FIELD_ID_FROM_MNHNAME( 'RS_CLD', IID2, IRESP ) + + IF (CONF_MODEL(KFROM)%IDX_RVT>0) THEN + CALL FIND_FIELD_ID_FROM_MNHNAME('RVS_CLD',IID,IRESP) + call Extend_1field_x3d( tfieldlist(iid), Max( kfrom, kto ) ) + if ( Associated( TFIELDLIST(IID2)%TFIELD_X4D(KFROM)%DATA ) ) & + TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => TFIELDLIST(IID2)%TFIELD_X4D(KFROM)%DATA(:,:,:,CONF_MODEL(KFROM)%IDX_RVT) + if ( kfrom /= kto .and. Associated( TFIELDLIST(IID2)%TFIELD_X4D(KTO)%DATA ) ) & + TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA => TFIELDLIST(IID2)%TFIELD_X4D(KTO)%DATA(:,:,:,CONF_MODEL(KTO)%IDX_RVT) END IF - IF (CONF_MODEL(KTO)%IDX_RCT>0) THEN - CALL FIND_FIELD_ID_FROM_MNHNAME('RCS_CLD',IID2,IRESP) - TFIELDLIST(IID2)%TFIELD_X3D(KTO)%DATA => TFIELDLIST(IID)%TFIELD_X4D(KTO)%DATA(:,:,:,CONF_MODEL(KTO)%IDX_RCT) + IF (CONF_MODEL(KFROM)%IDX_RCT>0) THEN + CALL FIND_FIELD_ID_FROM_MNHNAME('RCS_CLD',IID,IRESP) + call Extend_1field_x3d( tfieldlist(iid), Max( kfrom, kto ) ) + if ( Associated( TFIELDLIST(IID2)%TFIELD_X4D(KFROM)%DATA ) ) & + TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => TFIELDLIST(IID2)%TFIELD_X4D(KFROM)%DATA(:,:,:,CONF_MODEL(KFROM)%IDX_RCT) + if ( kfrom /= kto .and. Associated( TFIELDLIST(IID2)%TFIELD_X4D(KTO)%DATA ) ) & + TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA => TFIELDLIST(IID2)%TFIELD_X4D(KTO)%DATA(:,:,:,CONF_MODEL(KTO)%IDX_RCT) END IF - IF (CONF_MODEL(KTO)%IDX_RRT>0) THEN - CALL FIND_FIELD_ID_FROM_MNHNAME('RRS_CLD',IID2,IRESP) - TFIELDLIST(IID2)%TFIELD_X3D(KTO)%DATA => TFIELDLIST(IID)%TFIELD_X4D(KTO)%DATA(:,:,:,CONF_MODEL(KTO)%IDX_RRT) + IF (CONF_MODEL(KFROM)%IDX_RRT>0) THEN + CALL FIND_FIELD_ID_FROM_MNHNAME('RRS_CLD',IID,IRESP) + call Extend_1field_x3d( tfieldlist(iid), Max( kfrom, kto ) ) + if ( Associated( TFIELDLIST(IID2)%TFIELD_X4D(KFROM)%DATA ) ) & + TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => TFIELDLIST(IID2)%TFIELD_X4D(KFROM)%DATA(:,:,:,CONF_MODEL(KFROM)%IDX_RRT) + if ( kfrom /= kto .and. Associated( TFIELDLIST(IID2)%TFIELD_X4D(KTO)%DATA ) ) & + TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA => TFIELDLIST(IID2)%TFIELD_X4D(KTO)%DATA(:,:,:,CONF_MODEL(KTO)%IDX_RRT) END IF - IF (CONF_MODEL(KTO)%IDX_RIT>0) THEN - CALL FIND_FIELD_ID_FROM_MNHNAME('RIS_CLD',IID2,IRESP) - TFIELDLIST(IID2)%TFIELD_X3D(KTO)%DATA => TFIELDLIST(IID)%TFIELD_X4D(KTO)%DATA(:,:,:,CONF_MODEL(KTO)%IDX_RIT) + IF (CONF_MODEL(KFROM)%IDX_RIT>0) THEN + CALL FIND_FIELD_ID_FROM_MNHNAME('RIS_CLD',IID,IRESP) + call Extend_1field_x3d( tfieldlist(iid), Max( kfrom, kto ) ) + if ( Associated( TFIELDLIST(IID2)%TFIELD_X4D(KFROM)%DATA ) ) & + TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => TFIELDLIST(IID2)%TFIELD_X4D(KFROM)%DATA(:,:,:,CONF_MODEL(KFROM)%IDX_RIT) + if ( kfrom /= kto .and. Associated( TFIELDLIST(IID2)%TFIELD_X4D(KTO)%DATA ) ) & + TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA => TFIELDLIST(IID2)%TFIELD_X4D(KTO)%DATA(:,:,:,CONF_MODEL(KTO)%IDX_RIT) END IF - IF (CONF_MODEL(KTO)%IDX_RST>0) THEN - CALL FIND_FIELD_ID_FROM_MNHNAME('RSS_CLD',IID2,IRESP) - TFIELDLIST(IID2)%TFIELD_X3D(KTO)%DATA => TFIELDLIST(IID)%TFIELD_X4D(KTO)%DATA(:,:,:,CONF_MODEL(KTO)%IDX_RST) + IF (CONF_MODEL(KFROM)%IDX_RST>0) THEN + CALL FIND_FIELD_ID_FROM_MNHNAME('RSS_CLD',IID,IRESP) + call Extend_1field_x3d( tfieldlist(iid), Max( kfrom, kto ) ) + if ( Associated( TFIELDLIST(IID2)%TFIELD_X4D(KFROM)%DATA ) ) & + TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => TFIELDLIST(IID2)%TFIELD_X4D(KFROM)%DATA(:,:,:,CONF_MODEL(KFROM)%IDX_RST) + if ( kfrom /= kto .and. Associated( TFIELDLIST(IID2)%TFIELD_X4D(KTO)%DATA ) ) & + TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA => TFIELDLIST(IID2)%TFIELD_X4D(KTO)%DATA(:,:,:,CONF_MODEL(KTO)%IDX_RST) END IF - IF (CONF_MODEL(KTO)%IDX_RGT>0) THEN - CALL FIND_FIELD_ID_FROM_MNHNAME('RGS_CLD',IID2,IRESP) - TFIELDLIST(IID2)%TFIELD_X3D(KTO)%DATA => TFIELDLIST(IID)%TFIELD_X4D(KTO)%DATA(:,:,:,CONF_MODEL(KTO)%IDX_RGT) + IF (CONF_MODEL(KFROM)%IDX_RGT>0) THEN + CALL FIND_FIELD_ID_FROM_MNHNAME('RGS_CLD',IID,IRESP) + call Extend_1field_x3d( tfieldlist(iid), Max( kfrom, kto ) ) + if ( Associated( TFIELDLIST(IID2)%TFIELD_X4D(KFROM)%DATA ) ) & + TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => TFIELDLIST(IID2)%TFIELD_X4D(KFROM)%DATA(:,:,:,CONF_MODEL(KFROM)%IDX_RGT) + if ( kfrom /= kto .and. Associated( TFIELDLIST(IID2)%TFIELD_X4D(KTO)%DATA ) ) & + TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA => TFIELDLIST(IID2)%TFIELD_X4D(KTO)%DATA(:,:,:,CONF_MODEL(KTO)%IDX_RGT) END IF - IF (CONF_MODEL(KTO)%IDX_RHT>0) THEN - CALL FIND_FIELD_ID_FROM_MNHNAME('RHS_CLD',IID2,IRESP) - TFIELDLIST(IID2)%TFIELD_X3D(KTO)%DATA => TFIELDLIST(IID)%TFIELD_X4D(KTO)%DATA(:,:,:,CONF_MODEL(KTO)%IDX_RHT) + IF (CONF_MODEL(KFROM)%IDX_RHT>0) THEN + CALL FIND_FIELD_ID_FROM_MNHNAME('RHS_CLD',IID,IRESP) + call Extend_1field_x3d( tfieldlist(iid), Max( kfrom, kto ) ) + if ( Associated( TFIELDLIST(IID2)%TFIELD_X4D(KFROM)%DATA ) ) & + TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => TFIELDLIST(IID2)%TFIELD_X4D(KFROM)%DATA(:,:,:,CONF_MODEL(KFROM)%IDX_RHT) + if ( kfrom /= kto .and. Associated( TFIELDLIST(IID2)%TFIELD_X4D(KTO)%DATA ) ) & + TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA => TFIELDLIST(IID2)%TFIELD_X4D(KTO)%DATA(:,:,:,CONF_MODEL(KTO)%IDX_RHT) END IF - ! - CALL FIND_FIELD_ID_FROM_MNHNAME('US_PRES',IID,IRESP); XRUS_PRES => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA - CALL FIND_FIELD_ID_FROM_MNHNAME('VS_PRES',IID,IRESP); XRVS_PRES => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA - CALL FIND_FIELD_ID_FROM_MNHNAME('WS_PRES',IID,IRESP); XRWS_PRES => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA - CALL FIND_FIELD_ID_FROM_MNHNAME('THS_CLD',IID,IRESP); XRTHS_CLD => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA - CALL FIND_FIELD_ID_FROM_MNHNAME('CLDFR', IID,IRESP); XCLDFR => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA - CALL FIND_FIELD_ID_FROM_MNHNAME('ICEFR', IID,IRESP); XICEFR => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA - CALL FIND_FIELD_ID_FROM_MNHNAME('CIT', IID,IRESP); XCIT => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA - CALL FIND_FIELD_ID_FROM_MNHNAME('RAINFR', IID,IRESP); XRAINFR => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA + + call Goto_model_1field( 'CLDFR', kfrom, kto, XCLDFR ) + call Goto_model_1field( 'ICEFR', kfrom, kto, XICEFR ) + call Goto_model_1field( 'CIT', kfrom, kto, XCIT ) + call Goto_model_1field( 'RAINFR', kfrom, kto, XRAINFR ) END IF ! ! MODD_PAST_FIELD_n variables ! -CALL FIND_FIELD_ID_FROM_MNHNAME('UM', IID,IRESP); XUM => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA -CALL FIND_FIELD_ID_FROM_MNHNAME('VM', IID,IRESP); XVM => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA -CALL FIND_FIELD_ID_FROM_MNHNAME('WM', IID,IRESP); XWM => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA -CALL FIND_FIELD_ID_FROM_MNHNAME('DUM',IID,IRESP); XDUM => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA -CALL FIND_FIELD_ID_FROM_MNHNAME('DVM',IID,IRESP); XDVM => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA -CALL FIND_FIELD_ID_FROM_MNHNAME('DWM',IID,IRESP); XDWM => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA +call Goto_model_1field( 'UM', kfrom, kto, XUM ) +call Goto_model_1field( 'VM', kfrom, kto, XVM ) +call Goto_model_1field( 'WM', kfrom, kto, XWM ) +call Goto_model_1field( 'DUM', kfrom, kto, XDUM ) +call Goto_model_1field( 'DVM', kfrom, kto, XDVM ) +call Goto_model_1field( 'DWM', kfrom, kto, XDWM ) ! ! MODD_LIMA_PRECIP_SCAVENGING_n variables ! -CALL FIND_FIELD_ID_FROM_MNHNAME('INPAP',IID,IRESP); XINPAP => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA -CALL FIND_FIELD_ID_FROM_MNHNAME('ACPAP',IID,IRESP); XACPAP => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA +call Goto_model_1field( 'INPAP', kfrom, kto, XINPAP ) +call Goto_model_1field( 'ACPAP', kfrom, kto, XACPAP ) ! ! MODD_ELEC_n variables ! -CALL FIND_FIELD_ID_FROM_MNHNAME('EFIELDU',IID,IRESP); XEFIELDU => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA -CALL FIND_FIELD_ID_FROM_MNHNAME('EFIELDV',IID,IRESP); XEFIELDV => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA -CALL FIND_FIELD_ID_FROM_MNHNAME('EFIELDW',IID,IRESP); XEFIELDW => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA -CALL FIND_FIELD_ID_FROM_MNHNAME('NI_IAGGS',IID,IRESP); XNI_IAGGS => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA -CALL FIND_FIELD_ID_FROM_MNHNAME('NI_IDRYG',IID,IRESP); XNI_IDRYG => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA -CALL FIND_FIELD_ID_FROM_MNHNAME('NI_SDRYG',IID,IRESP); XNI_SDRYG => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA -CALL FIND_FIELD_ID_FROM_MNHNAME('INDUC_CG',IID,IRESP); XIND_RATE => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA +call Goto_model_1field( 'EFIELDU', kfrom, kto, XEFIELDU ) +call Goto_model_1field( 'EFIELDV', kfrom, kto, XEFIELDV ) +call Goto_model_1field( 'EFIELDW', kfrom, kto, XEFIELDW ) +call Goto_model_1field( 'NI_IAGGS', kfrom, kto, XNI_IAGGS ) +call Goto_model_1field( 'NI_IDRYG', kfrom, kto, XNI_IDRYG ) +call Goto_model_1field( 'NI_SDRYG', kfrom, kto, XNI_SDRYG ) +call Goto_model_1field( 'INDUC_CG', kfrom, kto, XIND_RATE ) ! ! MODD_CH_PH_n variables ! -CALL FIND_FIELD_ID_FROM_MNHNAME('PHC',IID,IRESP); XPHC => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA -CALL FIND_FIELD_ID_FROM_MNHNAME('PHR',IID,IRESP); XPHR => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA +call Goto_model_1field( 'PHC', kfrom, kto, XPHC ) +call Goto_model_1field( 'PHR', kfrom, kto, XPHR ) ! ! MODD_LSFIELD_n variables ! -CALL FIND_FIELD_ID_FROM_MNHNAME('LSUM', IID,IRESP); XLSUM => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA -CALL FIND_FIELD_ID_FROM_MNHNAME('LSVM', IID,IRESP); XLSVM => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA -CALL FIND_FIELD_ID_FROM_MNHNAME('LSWM', IID,IRESP); XLSWM => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA -CALL FIND_FIELD_ID_FROM_MNHNAME('LSTHM',IID,IRESP); XLSTHM => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA +call Goto_model_1field( 'LSUM', kfrom, kto, XLSUM ) +call Goto_model_1field( 'LSVM', kfrom, kto, XLSVM ) +call Goto_model_1field( 'LSWM', kfrom, kto, XLSWM ) +call Goto_model_1field( 'LSTHM', kfrom, kto, XLSTHM ) IF (LUSERV) THEN - CALL FIND_FIELD_ID_FROM_MNHNAME('LSRVM',IID,IRESP); XLSRVM => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA -END IF -CALL FIND_FIELD_ID_FROM_MNHNAME('LBXUM', IID,IRESP); XLBXUM => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA -CALL FIND_FIELD_ID_FROM_MNHNAME('LBXVM', IID,IRESP); XLBXVM => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA -CALL FIND_FIELD_ID_FROM_MNHNAME('LBXWM', IID,IRESP); XLBXWM => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA -CALL FIND_FIELD_ID_FROM_MNHNAME('LBYUM', IID,IRESP); XLBYUM => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA -CALL FIND_FIELD_ID_FROM_MNHNAME('LBYVM', IID,IRESP); XLBYVM => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA -CALL FIND_FIELD_ID_FROM_MNHNAME('LBYWM', IID,IRESP); XLBYWM => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA -CALL FIND_FIELD_ID_FROM_MNHNAME('LBXTHM',IID,IRESP); XLBXTHM => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA -CALL FIND_FIELD_ID_FROM_MNHNAME('LBYTHM',IID,IRESP); XLBYTHM => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA -! -CALL FIND_FIELD_ID_FROM_MNHNAME('DRYMASST',IID,IRESP) -IF (.NOT.ASSOCIATED(TFIELDLIST(IID)%TFIELD_X0D(KTO)%DATA)) THEN - CALL PRINT_MSG(NVERB_DEBUG,'GEN','FIELDLIST_GOTO_MODEL',& - 'TFIELDLIST(IID)%TFIELD_X0D(KTO)%DATA was not associated for '//TFIELDLIST(IID)%CMNHNAME) - ALLOCATE(TFIELDLIST(IID)%TFIELD_X0D(KTO)%DATA) -END IF -XDRYMASST => TFIELDLIST(IID)%TFIELD_X0D(KTO)%DATA -! -CALL FIND_FIELD_ID_FROM_MNHNAME('DRYMASSS',IID,IRESP) -IF (.NOT.ASSOCIATED(TFIELDLIST(IID)%TFIELD_X0D(KTO)%DATA)) THEN - CALL PRINT_MSG(NVERB_DEBUG,'GEN','FIELDLIST_GOTO_MODEL',& - 'TFIELDLIST(IID)%TFIELD_X0D(KTO)%DATA was not associated for '//TFIELDLIST(IID)%CMNHNAME) - ALLOCATE(TFIELDLIST(IID)%TFIELD_X0D(KTO)%DATA) + call Goto_model_1field( 'LSRVM', kfrom, kto, XLSRVM ) END IF -XDRYMASSS => TFIELDLIST(IID)%TFIELD_X0D(KTO)%DATA +call Goto_model_1field( 'LBXUM', kfrom, kto, XLBXUM ) +call Goto_model_1field( 'LBXVM', kfrom, kto, XLBXVM ) +call Goto_model_1field( 'LBXWM', kfrom, kto, XLBXWM ) +call Goto_model_1field( 'LBYUM', kfrom, kto, XLBYUM ) +call Goto_model_1field( 'LBYVM', kfrom, kto, XLBYVM ) +call Goto_model_1field( 'LBYWM', kfrom, kto, XLBYWM ) +call Goto_model_1field( 'LBXTHM', kfrom, kto, XLBXTHM ) +call Goto_model_1field( 'LBYTHM', kfrom, kto, XLBYTHM ) + +call Goto_model_1field( 'DRYMASST', kfrom, kto, XDRYMASST ) +call Goto_model_1field( 'DRYMASSS', kfrom, kto, XDRYMASSS ) ! ! MODD_DYN_n variables ! -CALL FIND_FIELD_ID_FROM_MNHNAME('RIMX',IID,IRESP) -IF (.NOT.ASSOCIATED(TFIELDLIST(IID)%TFIELD_N0D(KTO)%DATA)) THEN - CALL PRINT_MSG(NVERB_DEBUG,'GEN','FIELDLIST_GOTO_MODEL',& - 'TFIELDLIST(IID)%TFIELD_N0D(KTO)%DATA was not associated for '//TFIELDLIST(IID)%CMNHNAME) - ALLOCATE(TFIELDLIST(IID)%TFIELD_N0D(KTO)%DATA) -END IF -NRIMX => TFIELDLIST(IID)%TFIELD_N0D(KTO)%DATA -! -CALL FIND_FIELD_ID_FROM_MNHNAME('RIMY',IID,IRESP) -IF (.NOT.ASSOCIATED(TFIELDLIST(IID)%TFIELD_N0D(KTO)%DATA)) THEN - CALL PRINT_MSG(NVERB_DEBUG,'GEN','FIELDLIST_GOTO_MODEL',& - 'TFIELDLIST(IID)%TFIELD_N0D(KTO)%DATA was not associated for '//TFIELDLIST(IID)%CMNHNAME) - ALLOCATE(TFIELDLIST(IID)%TFIELD_N0D(KTO)%DATA) -END IF -NRIMY => TFIELDLIST(IID)%TFIELD_N0D(KTO)%DATA -! -CALL FIND_FIELD_ID_FROM_MNHNAME('HORELAX_UVWTH',IID,IRESP) -IF (.NOT.ASSOCIATED(TFIELDLIST(IID)%TFIELD_L0D(KTO)%DATA)) THEN - CALL PRINT_MSG(NVERB_DEBUG,'GEN','FIELDLIST_GOTO_MODEL',& - 'TFIELDLIST(IID)%TFIELD_L0D(KTO)%DATA was not associated for '//TFIELDLIST(IID)%CMNHNAME) - ALLOCATE(TFIELDLIST(IID)%TFIELD_L0D(KTO)%DATA) -END IF -LHORELAX_UVWTH => TFIELDLIST(IID)%TFIELD_L0D(KTO)%DATA -! -CALL FIND_FIELD_ID_FROM_MNHNAME('HORELAX_TKE',IID,IRESP) -IF (.NOT.ASSOCIATED(TFIELDLIST(IID)%TFIELD_L0D(KTO)%DATA)) THEN - CALL PRINT_MSG(NVERB_DEBUG,'GEN','FIELDLIST_GOTO_MODEL',& - 'TFIELDLIST(IID)%TFIELD_L0D(KTO)%DATA was not associated for '//TFIELDLIST(IID)%CMNHNAME) - ALLOCATE(TFIELDLIST(IID)%TFIELD_L0D(KTO)%DATA) -END IF -LHORELAX_TKE => TFIELDLIST(IID)%TFIELD_L0D(KTO)%DATA +call Goto_model_1field( 'RIMX', kfrom, kto, NRIMX ) +call Goto_model_1field( 'RIMY', kfrom, kto, NRIMY ) +call Goto_model_1field( 'HORELAX_UVWTH', kfrom, kto, LHORELAX_UVWTH ) +call Goto_model_1field( 'HORELAX_TKE', kfrom, kto, LHORELAX_TKE ) ! ! MODD_ADV_n variables ! -CALL FIND_FIELD_ID_FROM_MNHNAME('TKEMS',IID,IRESP); XRTKEMS=>TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA +call Goto_model_1field( 'TKEMS', kfrom, kto, XRTKEMS ) ! ! MODD_GRID_n variables ! -CALL FIND_FIELD_ID_FROM_MNHNAME('ZS', IID,IRESP); XZS => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA -CALL FIND_FIELD_ID_FROM_MNHNAME('ZSMT', IID,IRESP); XZSMT => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA -CALL FIND_FIELD_ID_FROM_MNHNAME('XHAT', IID,IRESP); XXHAT => TFIELDLIST(IID)%TFIELD_X1D(KTO)%DATA -CALL FIND_FIELD_ID_FROM_MNHNAME('YHAT', IID,IRESP); XYHAT => TFIELDLIST(IID)%TFIELD_X1D(KTO)%DATA -CALL FIND_FIELD_ID_FROM_MNHNAME('ZHAT', IID,IRESP); XZHAT => TFIELDLIST(IID)%TFIELD_X1D(KTO)%DATA -! -CALL FIND_FIELD_ID_FROM_MNHNAME('ZTOP', IID,IRESP) -IF (.NOT.ASSOCIATED(TFIELDLIST(IID)%TFIELD_X0D(KTO)%DATA)) THEN - CALL PRINT_MSG(NVERB_DEBUG,'GEN','FIELDLIST_GOTO_MODEL',& - 'TFIELDLIST(IID)%TFIELD_X0D(KTO)%DATA was not associated for '//TFIELDLIST(IID)%CMNHNAME) - ALLOCATE(TFIELDLIST(IID)%TFIELD_X0D(KTO)%DATA) -END IF -XZTOP => TFIELDLIST(IID)%TFIELD_X0D(KTO)%DATA -! -CALL FIND_FIELD_ID_FROM_MNHNAME('DXHAT',IID,IRESP); XDXHAT => TFIELDLIST(IID)%TFIELD_X1D(KTO)%DATA -CALL FIND_FIELD_ID_FROM_MNHNAME('DYHAT',IID,IRESP); XDYHAT => TFIELDLIST(IID)%TFIELD_X1D(KTO)%DATA -! -CALL FIND_FIELD_ID_FROM_MNHNAME('SLEVE',IID,IRESP) -IF (.NOT.ASSOCIATED(TFIELDLIST(IID)%TFIELD_L0D(KTO)%DATA)) THEN - CALL PRINT_MSG(NVERB_DEBUG,'GEN','FIELDLIST_GOTO_MODEL',& - 'TFIELDLIST(IID)%TFIELD_L0D(KTO)%DATA was not associated for '//TFIELDLIST(IID)%CMNHNAME) - ALLOCATE(TFIELDLIST(IID)%TFIELD_L0D(KTO)%DATA) -END IF -LSLEVE => TFIELDLIST(IID)%TFIELD_L0D(KTO)%DATA -! -CALL FIND_FIELD_ID_FROM_MNHNAME('LEN1',IID,IRESP) -IF (.NOT.ASSOCIATED(TFIELDLIST(IID)%TFIELD_X0D(KTO)%DATA)) THEN - CALL PRINT_MSG(NVERB_DEBUG,'GEN','FIELDLIST_GOTO_MODEL',& - 'TFIELDLIST(IID)%TFIELD_X0D(KTO)%DATA was not associated for '//TFIELDLIST(IID)%CMNHNAME) - ALLOCATE(TFIELDLIST(IID)%TFIELD_X0D(KTO)%DATA) -END IF -XLEN1 => TFIELDLIST(IID)%TFIELD_X0D(KTO)%DATA -! -CALL FIND_FIELD_ID_FROM_MNHNAME('LEN2',IID,IRESP) -IF (.NOT.ASSOCIATED(TFIELDLIST(IID)%TFIELD_X0D(KTO)%DATA)) THEN - CALL PRINT_MSG(NVERB_DEBUG,'GEN','FIELDLIST_GOTO_MODEL',& - 'TFIELDLIST(IID)%TFIELD_X0D(KTO)%DATA was not associated for '//TFIELDLIST(IID)%CMNHNAME) - ALLOCATE(TFIELDLIST(IID)%TFIELD_X0D(KTO)%DATA) -END IF -XLEN2 => TFIELDLIST(IID)%TFIELD_X0D(KTO)%DATA -! -CALL FIND_FIELD_ID_FROM_MNHNAME('ALT', IID,IRESP); XZZ => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA -CALL FIND_FIELD_ID_FROM_MNHNAME('DIRCOSXW',IID,IRESP); XDIRCOSXW => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA -CALL FIND_FIELD_ID_FROM_MNHNAME('DIRCOSYW',IID,IRESP); XDIRCOSYW => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA -CALL FIND_FIELD_ID_FROM_MNHNAME('DIRCOSZW',IID,IRESP); XDIRCOSZW => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA -CALL FIND_FIELD_ID_FROM_MNHNAME('COSSLOPE',IID,IRESP); XCOSSLOPE => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA -CALL FIND_FIELD_ID_FROM_MNHNAME('SINSLOPE',IID,IRESP); XSINSLOPE => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA -CALL FIND_FIELD_ID_FROM_MNHNAME('MAP', IID,IRESP); XMAP => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA -CALL FIND_FIELD_ID_FROM_MNHNAME('LAT', IID,IRESP); XLAT => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA -CALL FIND_FIELD_ID_FROM_MNHNAME('LON', IID,IRESP); XLON => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA +call Goto_model_1field( 'ZS' , kfrom, kto, XZS ) +call Goto_model_1field( 'ZSMT', kfrom, kto, XZSMT ) +call Goto_model_1field( 'XHAT', kfrom, kto, XXHAT ) +call Goto_model_1field( 'YHAT', kfrom, kto, XYHAT ) +call Goto_model_1field( 'XHATM', kfrom, kto, XXHATM ) +call Goto_model_1field( 'YHATM', kfrom, kto, XYHATM ) +call Goto_model_1field( 'ZHAT', kfrom, kto, XZHAT ) +call Goto_model_1field( 'ZHATM', kfrom, kto, XZHATM ) +call Goto_model_1field( 'HAT_BOUND', kfrom, kto, XHAT_BOUND ) +call Goto_model_1field( 'HATM_BOUND', kfrom, kto, XHATM_BOUND ) +call Goto_model_1field( 'ZTOP', kfrom, kto, XZTOP ) +call Goto_model_1field( 'DXHAT', kfrom, kto, XDXHAT ) +call Goto_model_1field( 'DYHAT', kfrom, kto, XDYHAT ) +call Goto_model_1field( 'SLEVE', kfrom, kto, LSLEVE ) +call Goto_model_1field( 'LEN1', kfrom, kto, XLEN1 ) +call Goto_model_1field( 'LEN2', kfrom, kto, XLEN2 ) +call Goto_model_1field( 'ALT', kfrom, kto, XZZ ) +call Goto_model_1field( 'DIRCOSXW', kfrom, kto, XDIRCOSXW ) +call Goto_model_1field( 'DIRCOSYW', kfrom, kto, XDIRCOSYW ) +call Goto_model_1field( 'DIRCOSZW', kfrom, kto, XDIRCOSZW ) +call Goto_model_1field( 'COSSLOPE', kfrom, kto, XCOSSLOPE ) +call Goto_model_1field( 'SINSLOPE', kfrom, kto, XSINSLOPE ) +call Goto_model_1field( 'MAP', kfrom, kto, XMAP ) +call Goto_model_1field( 'LAT', kfrom, kto, XLAT ) +call Goto_model_1field( 'LON', kfrom, kto, XLON ) +call Goto_model_1field( 'XHAT_ll', kfrom, kto, XXHAT_ll ) +call Goto_model_1field( 'YHAT_ll', kfrom, kto, XYHAT_ll ) +call Goto_model_1field( 'XHATM_ll', kfrom, kto, XXHATM_ll ) +call Goto_model_1field( 'YHATM_ll', kfrom, kto, XYHATM_ll ) ! ! MODD_TIME_n variables ! -CALL FIND_FIELD_ID_FROM_MNHNAME('DTMOD',IID,IRESP) -IF (.NOT.ASSOCIATED(TFIELDLIST(IID)%TFIELD_T0D(KTO)%DATA)) THEN - CALL PRINT_MSG(NVERB_DEBUG,'GEN','FIELDLIST_GOTO_MODEL',& - 'TFIELDLIST(IID)%TFIELD_T0D(KTO)%DATA was not associated for '//TFIELDLIST(IID)%CMNHNAME) - ALLOCATE(TFIELDLIST(IID)%TFIELD_T0D(KTO)%DATA) -END IF -TDTMOD => TFIELDLIST(IID)%TFIELD_T0D(KTO)%DATA -! -CALL FIND_FIELD_ID_FROM_MNHNAME('DTCUR',IID,IRESP) -IF (.NOT.ASSOCIATED(TFIELDLIST(IID)%TFIELD_T0D(KTO)%DATA)) THEN - CALL PRINT_MSG(NVERB_DEBUG,'GEN','FIELDLIST_GOTO_MODEL',& - 'TFIELDLIST(IID)%TFIELD_T0D(KTO)%DATA was not associated for '//TFIELDLIST(IID)%CMNHNAME) - ALLOCATE(TFIELDLIST(IID)%TFIELD_T0D(KTO)%DATA) -END IF -TDTCUR => TFIELDLIST(IID)%TFIELD_T0D(KTO)%DATA -! -CALL FIND_FIELD_ID_FROM_MNHNAME('DTRAD_FULL',IID,IRESP) -IF (.NOT.ASSOCIATED(TFIELDLIST(IID)%TFIELD_T0D(KTO)%DATA)) THEN - CALL PRINT_MSG(NVERB_DEBUG,'GEN','FIELDLIST_GOTO_MODEL',& - 'TFIELDLIST(IID)%TFIELD_T0D(KTO)%DATA was not associated for '//TFIELDLIST(IID)%CMNHNAME) - ALLOCATE(TFIELDLIST(IID)%TFIELD_T0D(KTO)%DATA) -END IF -TDTRAD_FULL => TFIELDLIST(IID)%TFIELD_T0D(KTO)%DATA -! -CALL FIND_FIELD_ID_FROM_MNHNAME('DTRAD_CLLY',IID,IRESP) -IF (.NOT.ASSOCIATED(TFIELDLIST(IID)%TFIELD_T0D(KTO)%DATA)) THEN - CALL PRINT_MSG(NVERB_DEBUG,'GEN','FIELDLIST_GOTO_MODEL',& - 'TFIELDLIST(IID)%TFIELD_T0D(KTO)%DATA was not associated for '//TFIELDLIST(IID)%CMNHNAME) - ALLOCATE(TFIELDLIST(IID)%TFIELD_T0D(KTO)%DATA) -END IF -TDTRAD_CLONLY => TFIELDLIST(IID)%TFIELD_T0D(KTO)%DATA -! -CALL FIND_FIELD_ID_FROM_MNHNAME('DTDCONV',IID,IRESP) -IF (.NOT.ASSOCIATED(TFIELDLIST(IID)%TFIELD_T0D(KTO)%DATA)) THEN - CALL PRINT_MSG(NVERB_DEBUG,'GEN','FIELDLIST_GOTO_MODEL',& - 'TFIELDLIST(IID)%TFIELD_T0D(KTO)%DATA was not associated for '//TFIELDLIST(IID)%CMNHNAME) - ALLOCATE(TFIELDLIST(IID)%TFIELD_T0D(KTO)%DATA) -END IF -TDTDCONV => TFIELDLIST(IID)%TFIELD_T0D(KTO)%DATA +call Goto_model_1field( 'DTMOD', kfrom, kto, TDTMOD ) +call Goto_model_1field( 'DTCUR', kfrom, kto, TDTCUR ) +call Goto_model_1field( 'DTRAD_FULL', kfrom, kto, TDTRAD_FULL ) +call Goto_model_1field( 'DTRAD_CLLY', kfrom, kto, TDTRAD_CLONLY ) +call Goto_model_1field( 'DTDCONV', kfrom, kto, TDTDCONV ) ! ! MODD_PARAM_n variables ! -CALL FIND_FIELD_ID_FROM_MNHNAME('SURF',IID,IRESP) -IF (.NOT.ASSOCIATED(TFIELDLIST(IID)%TFIELD_C0D(KTO)%DATA)) THEN - CALL PRINT_MSG(NVERB_DEBUG,'GEN','FIELDLIST_GOTO_MODEL',& - 'TFIELDLIST(IID)%TFIELD_C0D(KTO)%DATA was not associated for '//TFIELDLIST(IID)%CMNHNAME) - ALLOCATE(CHARACTER(LEN=4) :: TFIELDLIST(IID)%TFIELD_C0D(KTO)%DATA) - TFIELDLIST(IID)%TFIELD_C0D(KTO)%DATA='' -END IF -CSURF => TFIELDLIST(IID)%TFIELD_C0D(KTO)%DATA +call Goto_model_1field( 'SURF', kfrom, kto, CSURF ) ! ! MODD_TURB_n variables ! -CALL FIND_FIELD_ID_FROM_MNHNAME('BL_DEPTH', IID,IRESP); XBL_DEPTH => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA -CALL FIND_FIELD_ID_FROM_MNHNAME('SBL_DEPTH',IID,IRESP); XSBL_DEPTH => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA -CALL FIND_FIELD_ID_FROM_MNHNAME('WTHVMF', IID,IRESP); XWTHVMF => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA +call Goto_model_1field( 'BL_DEPTH', kfrom, kto, XBL_DEPTH ) +call Goto_model_1field( 'SBL_DEPTH', kfrom, kto, XSBL_DEPTH ) +call Goto_model_1field( 'WTHVMF', kfrom, kto, XWTHVMF ) ! ! MODD_REF_n variables ! -CALL FIND_FIELD_ID_FROM_MNHNAME('RHODREF',IID,IRESP); XRHODREF => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA -CALL FIND_FIELD_ID_FROM_MNHNAME('THVREF', IID,IRESP); XTHVREF => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA +call Goto_model_1field( 'RHODREF', kfrom, kto, XRHODREF ) +call Goto_model_1field( 'THVREF', kfrom, kto, XTHVREF ) ! ! MODD_RADIATIONS_n variables ! IF (CPROGRAM=='MESONH') THEN - CALL FIND_FIELD_ID_FROM_MNHNAME('DTHRAD', IID,IRESP); XDTHRAD => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA - CALL FIND_FIELD_ID_FROM_MNHNAME('FLALWD', IID,IRESP); XFLALWD => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA - CALL FIND_FIELD_ID_FROM_MNHNAME('DIRFLASWD', IID,IRESP); XDIRFLASWD => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA - CALL FIND_FIELD_ID_FROM_MNHNAME('SCAFLASWD', IID,IRESP); XSCAFLASWD => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA - CALL FIND_FIELD_ID_FROM_MNHNAME('DIRSRFSWD', IID,IRESP); XDIRSRFSWD => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA - CALL FIND_FIELD_ID_FROM_MNHNAME('CLEARCOL_TM1',IID,IRESP); NCLEARCOL_TM1 => TFIELDLIST(IID)%TFIELD_N2D(KTO)%DATA - CALL FIND_FIELD_ID_FROM_MNHNAME('ZENITH', IID,IRESP); XZENITH => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA - CALL FIND_FIELD_ID_FROM_MNHNAME('AZIM', IID,IRESP); XAZIM => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA - CALL FIND_FIELD_ID_FROM_MNHNAME('DIR_ALB', IID,IRESP); XDIR_ALB => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA - CALL FIND_FIELD_ID_FROM_MNHNAME('SCA_ALB', IID,IRESP); XSCA_ALB => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA - CALL FIND_FIELD_ID_FROM_MNHNAME('EMIS', IID,IRESP); XEMIS => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA - CALL FIND_FIELD_ID_FROM_MNHNAME('TSRAD', IID,IRESP); XTSRAD => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA + call Goto_model_1field( 'DTHRAD', kfrom, kto, XDTHRAD ) + call Goto_model_1field( 'FLALWD', kfrom, kto, XFLALWD ) + call Goto_model_1field( 'DIRFLASWD', kfrom, kto, XDIRFLASWD ) + call Goto_model_1field( 'SCAFLASWD', kfrom, kto, XSCAFLASWD ) + call Goto_model_1field( 'DIRSRFSWD', kfrom, kto, XDIRSRFSWD ) + call Goto_model_1field( 'CLEARCOL_TM1', kfrom, kto, NCLEARCOL_TM1 ) + call Goto_model_1field( 'ZENITH', kfrom, kto, XZENITH ) + call Goto_model_1field( 'AZIM', kfrom, kto, XAZIM ) + call Goto_model_1field( 'DIR_ALB', kfrom, kto, XDIR_ALB ) + call Goto_model_1field( 'SCA_ALB', kfrom, kto, XSCA_ALB ) + call Goto_model_1field( 'EMIS', kfrom, kto, XEMIS ) + call Goto_model_1field( 'TSRAD', kfrom, kto, XTSRAD ) +END IF +! +! MODD_FIRE variables +! +IF ( TRIM(CPROGRAM) == 'MESONH' .OR. TRIM(CPROGRAM) == 'DIAG' .OR. TRIM(CPROGRAM) == 'REAL' & + .OR. TRIM(CPROGRAM) == 'LFICDF' .OR. TRIM(CPROGRAM) == 'SPAWN' ) THEN + call Goto_model_1field( 'LSPHI', kfrom, kto, XLSPHI ) + call Goto_model_1field( 'BMAP', kfrom, kto, XBMAP ) + call Goto_model_1field( 'FMASE', kfrom, kto, XFMASE ) + call Goto_model_1field( 'FMAWC', kfrom, kto, XFMAWC ) + call Goto_model_1field( 'FMWINDU', kfrom, kto, XFMWINDU ) + call Goto_model_1field( 'FMWINDV', kfrom, kto, XFMWINDV ) + call Goto_model_1field( 'FMWINDW', kfrom, kto, XFMWINDW ) + call Goto_model_1field( 'FMHWS', kfrom, kto, XFMHWS ) + call Goto_model_1field( 'FIRERW', kfrom, kto, XFIRERW ) + call Goto_model_1field( 'FMR0', kfrom, kto, XFMR0 ) + call Goto_model_1field( 'FMFLUXHDH', kfrom, kto, XFMFLUXHDH ) + call Goto_model_1field( 'FMFLUXHDW', kfrom, kto, XFMFLUXHDW ) + call Goto_model_1field( 'FMGRADOROX', kfrom, kto, XFMGRADOROX ) + call Goto_model_1field( 'FMGRADOROY', kfrom, kto, XFMGRADOROY ) END IF ! ! MODD_DEEP_CONVECTION_n variables ! IF (TRIM(CPROGRAM) /= 'PGD' .AND. TRIM(CPROGRAM) /= 'NESPGD' .AND. TRIM(CPROGRAM) /= 'SPAWN') THEN - CALL FIND_FIELD_ID_FROM_MNHNAME('COUNTCONV', IID,IRESP); NCOUNTCONV => TFIELDLIST(IID)%TFIELD_N2D(KTO)%DATA - CALL FIND_FIELD_ID_FROM_MNHNAME('DTHCONV', IID,IRESP); XDTHCONV => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA - CALL FIND_FIELD_ID_FROM_MNHNAME('DRVCONV', IID,IRESP); XDRVCONV => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA - CALL FIND_FIELD_ID_FROM_MNHNAME('DRCCONV', IID,IRESP); XDRCCONV => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA - CALL FIND_FIELD_ID_FROM_MNHNAME('DRICONV', IID,IRESP); XDRICONV => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA - CALL FIND_FIELD_ID_FROM_MNHNAME('PRCONV', IID,IRESP); XPRCONV => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA - CALL FIND_FIELD_ID_FROM_MNHNAME('PACCONV', IID,IRESP); XPACCONV => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA - CALL FIND_FIELD_ID_FROM_MNHNAME('PRSCONV', IID,IRESP); XPRSCONV => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA - CALL FIND_FIELD_ID_FROM_MNHNAME('DSVCONV', IID,IRESP); XDSVCONV => TFIELDLIST(IID)%TFIELD_X4D(KTO)%DATA - CALL FIND_FIELD_ID_FROM_MNHNAME('PRLFLXCONV', IID,IRESP); XPRLFLXCONV => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA - CALL FIND_FIELD_ID_FROM_MNHNAME('PRSFLXCONV', IID,IRESP); XPRSFLXCONV => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA - CALL FIND_FIELD_ID_FROM_MNHNAME('UMFCONV', IID,IRESP); XUMFCONV => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA - CALL FIND_FIELD_ID_FROM_MNHNAME('DMFCONV', IID,IRESP); XDMFCONV => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA - CALL FIND_FIELD_ID_FROM_MNHNAME('MFCONV', IID,IRESP); XMFCONV => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA - CALL FIND_FIELD_ID_FROM_MNHNAME('CAPE', IID,IRESP); XCAPE => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA - CALL FIND_FIELD_ID_FROM_MNHNAME('CLTOPCONV_LVL',IID,IRESP); NCLTOPCONV => TFIELDLIST(IID)%TFIELD_N2D(KTO)%DATA - CALL FIND_FIELD_ID_FROM_MNHNAME('CLBASCONV_LVL',IID,IRESP); NCLBASCONV => TFIELDLIST(IID)%TFIELD_N2D(KTO)%DATA - CALL FIND_FIELD_ID_FROM_MNHNAME('IC_RATE', IID,IRESP); XIC_RATE => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA - CALL FIND_FIELD_ID_FROM_MNHNAME('CG_RATE', IID,IRESP); XCG_RATE => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA - CALL FIND_FIELD_ID_FROM_MNHNAME('IC_TOTAL_NB',IID,IRESP); XIC_TOTAL_NUMBER => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA - CALL FIND_FIELD_ID_FROM_MNHNAME('CG_TOTAL_NB',IID,IRESP); XCG_TOTAL_NUMBER => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA + call Goto_model_1field( 'COUNTCONV', kfrom, kto, NCOUNTCONV ) + call Goto_model_1field( 'DTHCONV', kfrom, kto, XDTHCONV ) + call Goto_model_1field( 'DRVCONV', kfrom, kto, XDRVCONV ) + call Goto_model_1field( 'DRCCONV', kfrom, kto, XDRCCONV ) + call Goto_model_1field( 'DRICONV', kfrom, kto, XDRICONV ) + call Goto_model_1field( 'PRCONV', kfrom, kto, XPRCONV ) + call Goto_model_1field( 'PACCONV', kfrom, kto, XPACCONV ) + call Goto_model_1field( 'PRSCONV', kfrom, kto, XPRSCONV ) + call Goto_model_1field( 'DSVCONV', kfrom, kto, XDSVCONV ) + call Goto_model_1field( 'PRLFLXCONV', kfrom, kto, XPRLFLXCONV ) + call Goto_model_1field( 'PRSFLXCONV', kfrom, kto, XPRSFLXCONV ) + call Goto_model_1field( 'UMFCONV', kfrom, kto, XUMFCONV ) + call Goto_model_1field( 'DMFCONV', kfrom, kto, XDMFCONV ) + call Goto_model_1field( 'MFCONV', kfrom, kto, XMFCONV ) + call Goto_model_1field( 'CAPE', kfrom, kto, XCAPE ) + call Goto_model_1field( 'CLTOPCONV_LVL', kfrom, kto, NCLTOPCONV ) + call Goto_model_1field( 'CLBASCONV_LVL', kfrom, kto, NCLBASCONV ) + call Goto_model_1field( 'IC_RATE', kfrom, kto, XIC_RATE ) + call Goto_model_1field( 'CG_RATE', kfrom, kto, XCG_RATE ) + call Goto_model_1field( 'IC_TOTAL_NB', kfrom, kto, XIC_TOTAL_NUMBER ) + call Goto_model_1field( 'CG_TOTAL_NB', kfrom, kto, XCG_TOTAL_NUMBER ) END IF ! ! MODD_GR_FIELD_n variables ! -CALL FIND_FIELD_ID_FROM_MNHNAME('SSO_ANIS', IID,IRESP); XSSO_ANISOTROPY => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA -CALL FIND_FIELD_ID_FROM_MNHNAME('SSO_SLOPE',IID,IRESP); XSSO_SLOPE => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA -CALL FIND_FIELD_ID_FROM_MNHNAME('SSO_DIR', IID,IRESP); XSSO_DIRECTION => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA -CALL FIND_FIELD_ID_FROM_MNHNAME('AVG_ZS', IID,IRESP); XAVG_ZS => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA -CALL FIND_FIELD_ID_FROM_MNHNAME('SIL_ZS', IID,IRESP); XSIL_ZS => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA -CALL FIND_FIELD_ID_FROM_MNHNAME('MAX_ZS', IID,IRESP); XMAX_ZS => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA -CALL FIND_FIELD_ID_FROM_MNHNAME('MIN_ZS', IID,IRESP); XMIN_ZS => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA -CALL FIND_FIELD_ID_FROM_MNHNAME('SSO_STDEV',IID,IRESP); XSSO_STDEV => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA +call Goto_model_1field( 'SSO_ANIS', kfrom, kto, XSSO_ANISOTROPY ) +call Goto_model_1field( 'SSO_SLOPE', kfrom, kto, XSSO_SLOPE ) +call Goto_model_1field( 'SSO_DIR', kfrom, kto, XSSO_DIRECTION ) +call Goto_model_1field( 'AVG_ZS', kfrom, kto, XAVG_ZS ) +call Goto_model_1field( 'SIL_ZS', kfrom, kto, XSIL_ZS ) +call Goto_model_1field( 'MAX_ZS', kfrom, kto, XMAX_ZS ) +call Goto_model_1field( 'MIN_ZS', kfrom, kto, XMIN_ZS ) +call Goto_model_1field( 'SSO_STDEV', kfrom, kto, XSSO_STDEV ) ! ! MODD_PRECIP_n variables ! -CALL FIND_FIELD_ID_FROM_MNHNAME('INPRC', IID,IRESP); XINPRC => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA -CALL FIND_FIELD_ID_FROM_MNHNAME('ACPRC', IID,IRESP); XACPRC => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA -CALL FIND_FIELD_ID_FROM_MNHNAME('INDEP', IID,IRESP); XINDEP => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA -CALL FIND_FIELD_ID_FROM_MNHNAME('ACDEP', IID,IRESP); XACDEP => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA -CALL FIND_FIELD_ID_FROM_MNHNAME('INPRR', IID,IRESP); XINPRR => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA -CALL FIND_FIELD_ID_FROM_MNHNAME('INPRR3D',IID,IRESP); XINPRR3D => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA -CALL FIND_FIELD_ID_FROM_MNHNAME('EVAP3D', IID,IRESP); XEVAP3D => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA -CALL FIND_FIELD_ID_FROM_MNHNAME('ACPRR', IID,IRESP); XACPRR => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA -CALL FIND_FIELD_ID_FROM_MNHNAME('INPRS', IID,IRESP); XINPRS => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA -CALL FIND_FIELD_ID_FROM_MNHNAME('ACPRS', IID,IRESP); XACPRS => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA -CALL FIND_FIELD_ID_FROM_MNHNAME('INPRG', IID,IRESP); XINPRG => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA -CALL FIND_FIELD_ID_FROM_MNHNAME('ACPRG', IID,IRESP); XACPRG => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA -CALL FIND_FIELD_ID_FROM_MNHNAME('INPRH', IID,IRESP); XINPRH => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA -CALL FIND_FIELD_ID_FROM_MNHNAME('ACPRH', IID,IRESP); XACPRH => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA -! +call Goto_model_1field( 'INPRC', kfrom, kto, XINPRC ) +call Goto_model_1field( 'ACPRC', kfrom, kto, XACPRC ) +call Goto_model_1field( 'INDEP', kfrom, kto, XINDEP ) +call Goto_model_1field( 'ACDEP', kfrom, kto, XACDEP ) +call Goto_model_1field( 'INPRR', kfrom, kto, XINPRR ) +call Goto_model_1field( 'INPRR3D', kfrom, kto, XINPRR3D ) +call Goto_model_1field( 'EVAP3D', kfrom, kto, XEVAP3D ) +call Goto_model_1field( 'ACPRR', kfrom, kto, XACPRR ) +call Goto_model_1field( 'INPRS', kfrom, kto, XINPRS ) +call Goto_model_1field( 'ACPRS', kfrom, kto, XACPRS ) +call Goto_model_1field( 'INPRG', kfrom, kto, XINPRG ) +call Goto_model_1field( 'ACPRG', kfrom, kto, XACPRG ) +call Goto_model_1field( 'INPRH', kfrom, kto, XINPRH ) +call Goto_model_1field( 'ACPRH', kfrom, kto, XACPRH ) ! ! MODD_DEF_EDDY_FLUX_n variables ! -CALL FIND_FIELD_ID_FROM_MNHNAME('VT_FLX', IID,IRESP); XVTH_FLUX_M => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA -CALL FIND_FIELD_ID_FROM_MNHNAME('WT_FLX', IID,IRESP); XWTH_FLUX_M => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA -CALL FIND_FIELD_ID_FROM_MNHNAME('RTHS_EDDY_FLUX',IID,IRESP); XRTHS_EDDY_FLUX => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA +call Goto_model_1field( 'VT_FLX', kfrom, kto, XVTH_FLUX_M ) +call Goto_model_1field( 'WT_FLX', kfrom, kto, XWTH_FLUX_M ) +call Goto_model_1field( 'RTHS_EDDY_FLUX', kfrom, kto, XRTHS_EDDY_FLUX ) ! ! MODD_DEF_EDDYUV_FLUX_n variables ! -CALL FIND_FIELD_ID_FROM_MNHNAME('VU_FLX', IID,IRESP); XVU_FLUX_M => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA -CALL FIND_FIELD_ID_FROM_MNHNAME('RVS_EDDY_FLUX',IID,IRESP); XRVS_EDDY_FLUX => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA -! +call Goto_model_1field( 'VU_FLX', kfrom, kto, XVU_FLUX_M ) +call Goto_model_1field( 'RVS_EDDY_FLUX', kfrom, kto, XRVS_EDDY_FLUX ) ! ! MODD_HURR_FIELD_n variables ! IF (CPROGRAM=='REAL') THEN - CALL FIND_FIELD_ID_FROM_MNHNAME('UT15', IID,IRESP); XUTOT => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA - CALL FIND_FIELD_ID_FROM_MNHNAME('VT15', IID,IRESP); XVTOT => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA - CALL FIND_FIELD_ID_FROM_MNHNAME('TEMPTOT',IID,IRESP); XTTOT => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA - CALL FIND_FIELD_ID_FROM_MNHNAME('PRESTOT',IID,IRESP); XPTOT => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA - CALL FIND_FIELD_ID_FROM_MNHNAME('HUMTOT', IID,IRESP); XQTOT => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA - CALL FIND_FIELD_ID_FROM_MNHNAME('UT16', IID,IRESP); XUENV => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA - CALL FIND_FIELD_ID_FROM_MNHNAME('VT16', IID,IRESP); XVENV => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA - CALL FIND_FIELD_ID_FROM_MNHNAME('TEMPENV',IID,IRESP); XTENV => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA - CALL FIND_FIELD_ID_FROM_MNHNAME('PRESENV',IID,IRESP); XPENV => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA - CALL FIND_FIELD_ID_FROM_MNHNAME('HUMENV', IID,IRESP); XQENV => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA - CALL FIND_FIELD_ID_FROM_MNHNAME('UT17', IID,IRESP); XUBASIC => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA - CALL FIND_FIELD_ID_FROM_MNHNAME('VT17', IID,IRESP); XVBASIC => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA - CALL FIND_FIELD_ID_FROM_MNHNAME('TEMPBAS',IID,IRESP); XTBASIC => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA - CALL FIND_FIELD_ID_FROM_MNHNAME('PRESBAS',IID,IRESP); XPBASIC => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA - CALL FIND_FIELD_ID_FROM_MNHNAME('HUMBAS', IID,IRESP); XQBASIC => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA - CALL FIND_FIELD_ID_FROM_MNHNAME('VTDIS', IID,IRESP); XVTDIS => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA -END IF -! -! -! MODD_FIRE variables -! -IF (CPROGRAM=='MESONH') THEN -CALL FIND_FIELD_ID_FROM_MNHNAME('LSPHI', IID,IRESP); XLSPHI => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA -CALL FIND_FIELD_ID_FROM_MNHNAME('BMAP', IID,IRESP); XBMAP => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA -!CALL FIND_FIELD_ID_FROM_MNHNAME('FMRFA', IID,IRESP); XFMRFA => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA -!CALL FIND_FIELD_ID_FROM_MNHNAME('FMWF0', IID,IRESP); XFMWF0 => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA -CALL FIND_FIELD_ID_FROM_MNHNAME('FMR0', IID,IRESP); XFMR0 => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA -!CALL FIND_FIELD_ID_FROM_MNHNAME('FMR00', IID,IRESP); XFMR00 => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA -!CALL FIND_FIELD_ID_FROM_MNHNAME('FMIGNITION', IID,IRESP); XFMIGNITION => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA -!CALL FIND_FIELD_ID_FROM_MNHNAME('FMFUELTYPE', IID,IRESP); XFMFUELTYPE => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA -!CALL FIND_FIELD_ID_FROM_MNHNAME('FIRETAU', IID,IRESP); XFIRETAU => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA -!CALL FIND_FIELD_ID_FROM_MNHNAME('FLUXPARAMH', IID,IRESP); XFLUXPARAMH => TFIELDLIST(IID)%TFIELD_X4D(KTO)%DATA -!CALL FIND_FIELD_ID_FROM_MNHNAME('FLUXPARAMW', IID,IRESP); XFLUXPARAMW => TFIELDLIST(IID)%TFIELD_X4D(KTO)%DATA -CALL FIND_FIELD_ID_FROM_MNHNAME('FIRERW', IID,IRESP); XFIRERW => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA -CALL FIND_FIELD_ID_FROM_MNHNAME('FMASE', IID,IRESP); XFMASE => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA -CALL FIND_FIELD_ID_FROM_MNHNAME('FMAWC', IID,IRESP); XFMAWC => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA -!CALL FIND_FIELD_ID_FROM_MNHNAME('FMWALKIG', IID,IRESP); XFMWALKIG => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA -CALL FIND_FIELD_ID_FROM_MNHNAME('FMFLUXHDH', IID,IRESP); XFMFLUXHDH => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA -CALL FIND_FIELD_ID_FROM_MNHNAME('FMFLUXHDW', IID,IRESP); XFMFLUXHDW => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA -CALL FIND_FIELD_ID_FROM_MNHNAME('FMHWS', IID,IRESP); XFMHWS => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA -CALL FIND_FIELD_ID_FROM_MNHNAME('FMWINDU', IID,IRESP); XFMWINDU => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA -CALL FIND_FIELD_ID_FROM_MNHNAME('FMWINDV', IID,IRESP); XFMWINDV => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA -CALL FIND_FIELD_ID_FROM_MNHNAME('FMWINDW', IID,IRESP); XFMWINDW => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA -CALL FIND_FIELD_ID_FROM_MNHNAME('FMGRADOROX', IID,IRESP); XFMGRADOROX => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA -CALL FIND_FIELD_ID_FROM_MNHNAME('FMGRADOROY', IID,IRESP); XFMGRADOROY => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA + call Goto_model_1field( 'UT15', kfrom, kto, XUTOT ) + call Goto_model_1field( 'VT15', kfrom, kto, XVTOT ) + call Goto_model_1field( 'TEMPTOT', kfrom, kto, XTTOT ) + call Goto_model_1field( 'PRESTOT', kfrom, kto, XPTOT ) + call Goto_model_1field( 'HUMTOT', kfrom, kto, XQTOT ) + call Goto_model_1field( 'UT16', kfrom, kto, XUENV ) + call Goto_model_1field( 'VT16', kfrom, kto, XVENV ) + call Goto_model_1field( 'TEMPENV', kfrom, kto, XTENV ) + call Goto_model_1field( 'PRESENV', kfrom, kto, XPENV ) + call Goto_model_1field( 'HUMENV', kfrom, kto, XQENV ) + call Goto_model_1field( 'UT17', kfrom, kto, XUBASIC ) + call Goto_model_1field( 'VT17', kfrom, kto, XVBASIC ) + call Goto_model_1field( 'TEMPBAS', kfrom, kto, XTBASIC ) + call Goto_model_1field( 'PRESBAS', kfrom, kto, XPBASIC ) + call Goto_model_1field( 'HUMBAS', kfrom, kto, XQBASIC ) + call Goto_model_1field( 'VTDIS', kfrom, kto, XVTDIS ) END IF ! -! -END IF !KFROM/=KTO -! END SUBROUTINE FIELDLIST_GOTO_MODEL -subroutine Fieldlist_nmodel_resize( kmodelnew ) +subroutine Add_field2list( tpfield ) + +implicit none + +type(tfielddata) :: tpfield + +character(len=64) :: ymsg +type(tfielddata), allocatable, dimension(:) :: tzfieldlistnew + +!Check if tfieldlist big enough and enlarge it if necessary +if ( nfields_used >= NMAXFIELDS ) then + Allocate( tzfieldlistnew(nmaxfields + nmaxfieldstep) ) + tzfieldlistnew(1 : nmaxfields) = tfieldlist(1 : nmaxfields) + call Move_alloc( from = tzfieldlistnew, to = tfieldlist ) + nmaxfields = nmaxfields + nmaxfieldstep + Write( ymsg, '( "nmaxfields increased from ", i5, " to ", i5 )') nmaxfields - nmaxfieldstep, nmaxfields + call Print_msg( NVERB_DEBUG, 'GEN', 'Add_field2list', Trim( ymsg ) ) +end if + +nfields_used = nfields_used + 1 + +tfieldlist(nfields_used) = tpfield + +end subroutine Add_field2list + + +subroutine Goto_model_1field_c0d( hname, kfrom, kto, pdata ) + +implicit none + +character(len=*), intent(in) :: hname +integer, intent(in) :: kfrom +integer, intent(in) :: kto +character(len=*), pointer, intent(inout) :: pdata + +integer :: iid +integer :: iresp + +call Find_field_id_from_mnhname( hname, iid, iresp ) + +call Extend_1field_c0d( tfieldlist(iid), Max( kfrom, kto ) ) + +tfieldlist(iid)%tfield_c0d(kfrom)%data => pdata +if ( kfrom /= kto ) then + if ( .not. Associated( tfieldlist(iid)%tfield_c0d(kto)%data ) ) then + Allocate( character(len=Len(pdata)) :: tfieldlist(iid)%tfield_c0d(kto)%data ) + tfieldlist(iid)%tfield_c0d(kto)%data(:) = '' + end if + pdata => tfieldlist(iid)%tfield_c0d(kto)%data +end if + +end subroutine Goto_model_1field_c0d + + +subroutine Goto_model_1field_c1d( hname, kfrom, kto, pdata ) + +implicit none + +character(len=*), intent(in) :: hname +integer, intent(in) :: kfrom +integer, intent(in) :: kto +character(len=*), dimension(:), pointer, intent(inout) :: pdata + +integer :: iid +integer :: iresp +integer :: ji + +call Find_field_id_from_mnhname( hname, iid, iresp ) + +call Extend_1field_c1d( tfieldlist(iid), Max( kfrom, kto ) ) + +tfieldlist(iid)%tfield_c1d(kfrom)%data => pdata +if ( kfrom /= kto ) then + if ( .not. Associated( tfieldlist(iid)%tfield_c1d(kto)%data ) ) then + Allocate( character(len=Len(pdata)) :: tfieldlist(iid)%tfield_c1d(kto)%data(Size(pdata)) ) + do ji = 1, Size(pdata) + tfieldlist(iid)%tfield_c1d(kto)%data(ji) = '' + end do + end if + pdata => tfieldlist(iid)%tfield_c1d(kto)%data +end if + +end subroutine Goto_model_1field_c1d + + +subroutine Goto_model_1field_l0d( hname, kfrom, kto, pdata ) + +implicit none + +character(len=*), intent(in) :: hname +integer, intent(in) :: kfrom +integer, intent(in) :: kto +logical, pointer, intent(inout) :: pdata + +integer :: iid +integer :: iresp + +call Find_field_id_from_mnhname( hname, iid, iresp ) + +call Extend_1field_l0d( tfieldlist(iid), Max( kfrom, kto ) ) + +tfieldlist(iid)%tfield_l0d(kfrom)%data => pdata +if ( kfrom /= kto ) pdata => tfieldlist(iid)%tfield_l0d(kto)%data + +end subroutine Goto_model_1field_l0d + + +subroutine Goto_model_1field_l1d( hname, kfrom, kto, pdata ) + +implicit none + +character(len=*), intent(in) :: hname +integer, intent(in) :: kfrom +integer, intent(in) :: kto +logical, dimension(:), pointer, intent(inout) :: pdata + +integer :: iid +integer :: iresp + +call Find_field_id_from_mnhname( hname, iid, iresp ) + +call Extend_1field_l1d( tfieldlist(iid), Max( kfrom, kto ) ) + +tfieldlist(iid)%tfield_l1d(kfrom)%data => pdata +if ( kfrom /= kto ) pdata => tfieldlist(iid)%tfield_l1d(kto)%data + +end subroutine Goto_model_1field_l1d + + +subroutine Goto_model_1field_n0d( hname, kfrom, kto, pdata ) + +implicit none + +character(len=*), intent(in) :: hname +integer, intent(in) :: kfrom +integer, intent(in) :: kto +integer, pointer, intent(inout) :: pdata + +integer :: iid +integer :: iresp + +call Find_field_id_from_mnhname( hname, iid, iresp ) + +call Extend_1field_n0d( tfieldlist(iid), Max( kfrom, kto ) ) + +tfieldlist(iid)%tfield_n0d(kfrom)%data => pdata +if ( kfrom /= kto ) pdata => tfieldlist(iid)%tfield_n0d(kto)%data + +end subroutine Goto_model_1field_n0d + + +subroutine Goto_model_1field_n1d( hname, kfrom, kto, pdata ) + +implicit none + +character(len=*), intent(in) :: hname +integer, intent(in) :: kfrom +integer, intent(in) :: kto +integer, dimension(:), pointer, intent(inout) :: pdata + +integer :: iid +integer :: iresp + +call Find_field_id_from_mnhname( hname, iid, iresp ) + +call Extend_1field_n1d( tfieldlist(iid), Max( kfrom, kto ) ) + +tfieldlist(iid)%tfield_n1d(kfrom)%data => pdata +if ( kfrom /= kto ) pdata => tfieldlist(iid)%tfield_n1d(kto)%data + +end subroutine Goto_model_1field_n1d + + +subroutine Goto_model_1field_n2d( hname, kfrom, kto, pdata ) + +implicit none + +character(len=*), intent(in) :: hname +integer, intent(in) :: kfrom +integer, intent(in) :: kto +integer, dimension(:,:), pointer, intent(inout) :: pdata + +integer :: iid +integer :: iresp + +call Find_field_id_from_mnhname( hname, iid, iresp ) + +call Extend_1field_n2d( tfieldlist(iid), Max( kfrom, kto ) ) + +tfieldlist(iid)%tfield_n2d(kfrom)%data => pdata +if ( kfrom /= kto ) pdata => tfieldlist(iid)%tfield_n2d(kto)%data + +end subroutine Goto_model_1field_n2d + + +subroutine Goto_model_1field_n3d( hname, kfrom, kto, pdata ) + +implicit none + +character(len=*), intent(in) :: hname +integer, intent(in) :: kfrom +integer, intent(in) :: kto +integer, dimension(:,:,:), pointer, intent(inout) :: pdata + +integer :: iid +integer :: iresp + +call Find_field_id_from_mnhname( hname, iid, iresp ) + +call Extend_1field_n3d( tfieldlist(iid), Max( kfrom, kto ) ) + +tfieldlist(iid)%tfield_n3d(kfrom)%data => pdata +if ( kfrom /= kto ) pdata => tfieldlist(iid)%tfield_n3d(kto)%data + +end subroutine Goto_model_1field_n3d + + +subroutine Goto_model_1field_t0d( hname, kfrom, kto, pdata ) + +use modd_type_date, only: date_time + +implicit none + +character(len=*), intent(in) :: hname +integer, intent(in) :: kfrom +integer, intent(in) :: kto +type(date_time), pointer, intent(inout) :: pdata + +integer :: iid +integer :: iresp + +call Find_field_id_from_mnhname( hname, iid, iresp ) + +call Extend_1field_t0d( tfieldlist(iid), Max( kfrom, kto ) ) + +tfieldlist(iid)%tfield_t0d(kfrom)%data => pdata +if ( kfrom /= kto ) pdata => tfieldlist(iid)%tfield_t0d(kto)%data + +end subroutine Goto_model_1field_t0d + + +subroutine Goto_model_1field_t1d( hname, kfrom, kto, pdata ) + +use modd_type_date, only: date_time + +implicit none + +character(len=*), intent(in) :: hname +integer, intent(in) :: kfrom +integer, intent(in) :: kto +type(date_time), dimension(:), pointer, intent(inout) :: pdata + +integer :: iid +integer :: iresp + +call Find_field_id_from_mnhname( hname, iid, iresp ) + +call Extend_1field_t1d( tfieldlist(iid), Max( kfrom, kto ) ) + +tfieldlist(iid)%tfield_t1d(kfrom)%data => pdata +if ( kfrom /= kto ) pdata => tfieldlist(iid)%tfield_t1d(kto)%data + +end subroutine Goto_model_1field_t1d + + +subroutine Goto_model_1field_x0d( hname, kfrom, kto, pdata ) + +implicit none + +character(len=*), intent(in) :: hname +integer, intent(in) :: kfrom +integer, intent(in) :: kto +real, pointer, intent(inout) :: pdata + +integer :: iid +integer :: iresp + +call Find_field_id_from_mnhname( hname, iid, iresp ) + +call Extend_1field_x0d( tfieldlist(iid), Max( kfrom, kto ) ) + +tfieldlist(iid)%tfield_x0d(kfrom)%data => pdata +if ( kfrom /= kto ) pdata => tfieldlist(iid)%tfield_x0d(kto)%data + +end subroutine Goto_model_1field_x0d + + +subroutine Goto_model_1field_x1d( hname, kfrom, kto, pdata ) + +implicit none + +character(len=*), intent(in) :: hname +integer, intent(in) :: kfrom +integer, intent(in) :: kto +real, dimension(:), pointer, intent(inout) :: pdata + +integer :: iid +integer :: iresp + +call Find_field_id_from_mnhname( hname, iid, iresp ) + +call Extend_1field_x1d( tfieldlist(iid), Max( kfrom, kto ) ) + +tfieldlist(iid)%tfield_x1d(kfrom)%data => pdata +if ( kfrom /= kto ) pdata => tfieldlist(iid)%tfield_x1d(kto)%data + +end subroutine Goto_model_1field_x1d + + +subroutine Goto_model_1field_x2d( hname, kfrom, kto, pdata ) + +implicit none + +character(len=*), intent(in) :: hname +integer, intent(in) :: kfrom +integer, intent(in) :: kto +real, dimension(:,:), pointer, intent(inout) :: pdata + +integer :: iid +integer :: iresp + +call Find_field_id_from_mnhname( hname, iid, iresp ) + +call Extend_1field_x2d( tfieldlist(iid), Max( kfrom, kto ) ) + +tfieldlist(iid)%tfield_x2d(kfrom)%data => pdata +if ( kfrom /= kto ) pdata => tfieldlist(iid)%tfield_x2d(kto)%data + +end subroutine Goto_model_1field_x2d + + +subroutine Goto_model_1field_x3d( hname, kfrom, kto, pdata ) + +implicit none + +character(len=*), intent(in) :: hname +integer, intent(in) :: kfrom +integer, intent(in) :: kto +real, dimension(:,:,:), pointer, intent(inout) :: pdata + +integer :: iid +integer :: iresp + +call Find_field_id_from_mnhname( hname, iid, iresp ) + +call Extend_1field_x3d( tfieldlist(iid), Max( kfrom, kto ) ) + +tfieldlist(iid)%tfield_x3d(kfrom)%data => pdata +if ( kfrom /= kto ) pdata => tfieldlist(iid)%tfield_x3d(kto)%data + +end subroutine Goto_model_1field_x3d + + +subroutine Goto_model_1field_x4d( hname, kfrom, kto, pdata ) + +implicit none + +character(len=*), intent(in) :: hname +integer, intent(in) :: kfrom +integer, intent(in) :: kto +real, dimension(:,:,:,:), pointer, intent(inout) :: pdata + +integer :: iid +integer :: iresp + +call Find_field_id_from_mnhname( hname, iid, iresp ) + +call Extend_1field_x4d( tfieldlist(iid), Max( kfrom, kto ) ) + +tfieldlist(iid)%tfield_x4d(kfrom)%data => pdata +if ( kfrom /= kto ) pdata => tfieldlist(iid)%tfield_x4d(kto)%data + +end subroutine Goto_model_1field_x4d + + +subroutine Goto_model_1field_x5d( hname, kfrom, kto, pdata ) + +implicit none + +character(len=*), intent(in) :: hname +integer, intent(in) :: kfrom +integer, intent(in) :: kto +real, dimension(:,:,:,:,:), pointer, intent(inout) :: pdata + +integer :: iid +integer :: iresp + +call Find_field_id_from_mnhname( hname, iid, iresp ) + +call Extend_1field_x5d( tfieldlist(iid), Max( kfrom, kto ) ) + +tfieldlist(iid)%tfield_x5d(kfrom)%data => pdata +if ( kfrom /= kto ) pdata => tfieldlist(iid)%tfield_x5d(kto)%data + +end subroutine Goto_model_1field_x5d + + +subroutine Goto_model_1field_x6d( hname, kfrom, kto, pdata ) + +implicit none + +character(len=*), intent(in) :: hname +integer, intent(in) :: kfrom +integer, intent(in) :: kto +real, dimension(:,:,:,:,:,:), pointer, intent(inout) :: pdata + +integer :: iid +integer :: iresp + +call Find_field_id_from_mnhname( hname, iid, iresp ) + +call Extend_1field_x6d( tfieldlist(iid), Max( kfrom, kto ) ) + +tfieldlist(iid)%tfield_x6d(kfrom)%data => pdata +if ( kfrom /= kto ) pdata => tfieldlist(iid)%tfield_x6d(kto)%data + +end subroutine Goto_model_1field_x6d + + +subroutine Extend_1field_c0d( tpfield, ksize ) implicit none -integer, intent(in) :: kmodelnew - -character(len=10) :: ymsg -integer :: imodelmax -integer :: ji, jj -type(tfieldptr_c0d), dimension(:), allocatable :: tfield_save_c0d -type(tfieldptr_c1d), dimension(:), allocatable :: tfield_save_c1d -type(tfieldptr_l0d), dimension(:), allocatable :: tfield_save_l0d -type(tfieldptr_l1d), dimension(:), allocatable :: tfield_save_l1d -type(tfieldptr_n0d), dimension(:), allocatable :: tfield_save_n0d -type(tfieldptr_n1d), dimension(:), allocatable :: tfield_save_n1d -type(tfieldptr_n2d), dimension(:), allocatable :: tfield_save_n2d -type(tfieldptr_n3d), dimension(:), allocatable :: tfield_save_n3d -type(tfieldptr_x0d), dimension(:), allocatable :: tfield_save_x0d -type(tfieldptr_x1d), dimension(:), allocatable :: tfield_save_x1d -type(tfieldptr_x2d), dimension(:), allocatable :: tfield_save_x2d -type(tfieldptr_x3d), dimension(:), allocatable :: tfield_save_x3d -type(tfieldptr_x4d), dimension(:), allocatable :: tfield_save_x4d -type(tfieldptr_x5d), dimension(:), allocatable :: tfield_save_x5d -type(tfieldptr_x6d), dimension(:), allocatable :: tfield_save_x6d -type(tfieldptr_t0d), dimension(:), allocatable :: tfield_save_t0d - -write( ymsg, '( i4,"->",i4 )') nmodel_allocated, kmodelnew -call Print_msg( NVERB_DEBUG, 'GEN', 'Fieldlist_nmodel_resize', trim( ymsg ) ) - -!Nothing to do -if ( kmodelnew == nmodel_allocated ) return - -imodelmax = max( kmodelnew, nmodel_allocated ) - -allocate( tfield_save_c0d( imodelmax ) ) -allocate( tfield_save_c1d( imodelmax ) ) -allocate( tfield_save_l0d( imodelmax ) ) -allocate( tfield_save_l1d( imodelmax ) ) -allocate( tfield_save_n0d( imodelmax ) ) -allocate( tfield_save_n1d( imodelmax ) ) -allocate( tfield_save_n2d( imodelmax ) ) -allocate( tfield_save_n3d( imodelmax ) ) -allocate( tfield_save_x0d( imodelmax ) ) -allocate( tfield_save_x1d( imodelmax ) ) -allocate( tfield_save_x2d( imodelmax ) ) -allocate( tfield_save_x3d( imodelmax ) ) -allocate( tfield_save_x4d( imodelmax ) ) -allocate( tfield_save_x5d( imodelmax ) ) -allocate( tfield_save_x6d( imodelmax ) ) -allocate( tfield_save_t0d( imodelmax ) ) - -do ji = 1, imodelmax - tfield_save_c0d(ji)%data => null() - tfield_save_c1d(ji)%data => null() - tfield_save_l0d(ji)%data => null() - tfield_save_l1d(ji)%data => null() - tfield_save_n0d(ji)%data => null() - tfield_save_n1d(ji)%data => null() - tfield_save_n2d(ji)%data => null() - tfield_save_n3d(ji)%data => null() - tfield_save_x0d(ji)%data => null() - tfield_save_x1d(ji)%data => null() - tfield_save_x2d(ji)%data => null() - tfield_save_x3d(ji)%data => null() - tfield_save_x4d(ji)%data => null() - tfield_save_x5d(ji)%data => null() - tfield_save_x6d(ji)%data => null() - tfield_save_t0d(ji)%data => null() -end do - -do ji = 1, size( tfieldlist ) - if ( allocated( tfieldlist(ji)%tfield_c0d ) ) then - !Save existing pointers to temporary structure - do jj = 1, nmodel_allocated - tfield_save_c0d(jj)%data => tfieldlist(ji)%tfield_c0d(jj)%data +type(tfielddata), intent(inout) :: tpfield +integer, intent(in) :: ksize + +integer :: ji +type(tfieldptr_c0d), dimension(:), allocatable :: tzfield_c0d + +if ( tpfield%nmodelmax < 0 ) then + !nmodelmax is < 0 if the allocation of the field has been done by hand + !(not using a constructor, default value of nmodelmax) + !The correct value of nmodelmax is hence computed here + tpfield%nmodelmax = Size( tpfield%tfield_c0d ) +end if + +if ( ksize > tpfield%nmodelmax ) then + if ( tpfield%nmodelmax == 0 ) then + Allocate( tpfield%tfield_c0d(ksize) ) + do ji = 1, ksize + tpfield%tfield_c0d(ji)%data => null() end do - !Reallocate - deallocate( tfieldlist(ji)%tfield_c0d ) - allocate( tfieldlist(ji)%tfield_c0d(kmodelnew) ) - !Restore pointers - do jj = 1, kmodelnew - tfieldlist(ji)%tfield_c0d(jj)%data => tfield_save_c0d(jj)%data - tfield_save_c0d(jj)%data => null() + else + Allocate( tzfield_c0d(ksize) ) + do ji = 1, Size( tpfield%tfield_c0d) + tzfield_c0d(ji)%data => tpfield%tfield_c0d(ji)%data end do - !Check no used pointers if nmodel is decreazed - do jj = kmodelnew + 1, nmodel_allocated - if ( associated(tfield_save_c0d(jj)%data ) ) then - call Print_msg( NVERB_ERROR, 'GEN', 'Fieldlist_nmodel_resize', 'data loss due to reduction in number of models' ) - tfield_save_c0d(jj)%data => null() - end if + do ji = Size( tpfield%tfield_c0d) + 1, ksize + tzfield_c0d(ji)%data => null() end do + call Move_alloc( from = tzfield_c0d, to = tpfield%tfield_c0d ) end if + tpfield%nmodelmax = ksize +end if + +end subroutine Extend_1field_c0d + + +subroutine Extend_1field_c1d( tpfield, ksize ) + +implicit none - if ( allocated( tfieldlist(ji)%tfield_c1d ) ) then - !Save existing pointers to temporary structure - do jj = 1, nmodel_allocated - tfield_save_c1d(jj)%data => tfieldlist(ji)%tfield_c1d(jj)%data +type(tfielddata), intent(inout) :: tpfield +integer, intent(in) :: ksize + +integer :: ji +type(tfieldptr_c1d), dimension(:), allocatable :: tzfield_c1d + +if ( tpfield%nmodelmax < 0 ) then + !nmodelmax is < 0 if the allocation of the field has been done by hand + !(not using a constructor, default value of nmodelmax) + !The correct value of nmodelmax is hence computed here + tpfield%nmodelmax = Size( tpfield%tfield_c1d ) +end if + +if ( ksize > tpfield%nmodelmax ) then + if ( tpfield%nmodelmax == 0 ) then + Allocate( tpfield%tfield_c1d(ksize) ) + do ji = 1, ksize + tpfield%tfield_c1d(ji)%data => null() end do - !Reallocate - deallocate( tfieldlist(ji)%tfield_c1d ) - allocate( tfieldlist(ji)%tfield_c1d(kmodelnew) ) - !Restore pointers - do jj = 1, kmodelnew - tfieldlist(ji)%tfield_c1d(jj)%data => tfield_save_c1d(jj)%data - tfield_save_c1d(jj)%data => null() + else + Allocate( tzfield_c1d(ksize) ) + do ji = 1, Size( tpfield%tfield_c1d) + tzfield_c1d(ji)%data => tpfield%tfield_c1d(ji)%data end do - !Check no used pointers if nmodel is decreazed - do jj = kmodelnew + 1, nmodel_allocated - if ( associated(tfield_save_c1d(jj)%data ) ) then - call Print_msg( NVERB_ERROR, 'GEN', 'Fieldlist_nmodel_resize', 'data loss due to reduction in number of models' ) - tfield_save_c1d(jj)%data => null() - end if + do ji = Size( tpfield%tfield_c1d) + 1, ksize + tzfield_c1d(ji)%data => null() end do + call Move_alloc( from = tzfield_c1d, to = tpfield%tfield_c1d ) end if + tpfield%nmodelmax = ksize +end if + +end subroutine Extend_1field_c1d + + +subroutine Extend_1field_l0d( tpfield, ksize ) + +implicit none - if ( allocated( tfieldlist(ji)%tfield_l0d ) ) then - !Save existing pointers to temporary structure - do jj = 1, nmodel_allocated - tfield_save_l0d(jj)%data => tfieldlist(ji)%tfield_l0d(jj)%data +type(tfielddata), intent(inout) :: tpfield +integer, intent(in) :: ksize + +integer :: ji +type(tfieldptr_l0d), dimension(:), allocatable :: tzfield_l0d + +if ( tpfield%nmodelmax < 0 ) then + !nmodelmax is < 0 if the allocation of the field has been done by hand + !(not using a constructor, default value of nmodelmax) + !The correct value of nmodelmax is hence computed here + tpfield%nmodelmax = Size( tpfield%tfield_l0d ) +end if + +if ( ksize > tpfield%nmodelmax ) then + if ( tpfield%nmodelmax == 0 ) then + Allocate( tpfield%tfield_l0d(ksize) ) + do ji = 1, ksize + ! tpfield%tfield_l0d(ji)%data => null() + Allocate( tpfield%tfield_l0d(ji)%data ) + tpfield%tfield_l0d(ji)%data = .false. end do - !Reallocate - deallocate( tfieldlist(ji)%tfield_l0d ) - allocate( tfieldlist(ji)%tfield_l0d(kmodelnew) ) - !Restore pointers - do jj = 1, kmodelnew - tfieldlist(ji)%tfield_l0d(jj)%data => tfield_save_l0d(jj)%data - tfield_save_l0d(jj)%data => null() + else + Allocate( tzfield_l0d(ksize) ) + do ji = 1, Size( tpfield%tfield_l0d) + tzfield_l0d(ji)%data => tpfield%tfield_l0d(ji)%data end do - !Check no used pointers if nmodel is decreazed - do jj = kmodelnew + 1, nmodel_allocated - if ( associated(tfield_save_l0d(jj)%data ) ) then - call Print_msg( NVERB_ERROR, 'GEN', 'Fieldlist_nmodel_resize', 'data loss due to reduction in number of models' ) - tfield_save_l0d(jj)%data => null() - end if + do ji = Size( tpfield%tfield_l0d) + 1, ksize + ! tzfield_l0d(ji)%data => null() + Allocate( tzfield_l0d(ji)%data ) + tzfield_l0d(ji)%data = .false. end do + call Move_alloc( from = tzfield_l0d, to = tpfield%tfield_l0d ) end if + tpfield%nmodelmax = ksize +end if + +end subroutine Extend_1field_l0d + + +subroutine Extend_1field_l1d( tpfield, ksize ) + +implicit none - if ( allocated( tfieldlist(ji)%tfield_l1d ) ) then - !Save existing pointers to temporary structure - do jj = 1, nmodel_allocated - tfield_save_l1d(jj)%data => tfieldlist(ji)%tfield_l1d(jj)%data +type(tfielddata), intent(inout) :: tpfield +integer, intent(in) :: ksize + +integer :: ji +type(tfieldptr_l1d), dimension(:), allocatable :: tzfield_l1d + +if ( tpfield%nmodelmax < 0 ) then + !nmodelmax is < 0 if the allocation of the field has been done by hand + !(not using a constructor, default value of nmodelmax) + !The correct value of nmodelmax is hence computed here + tpfield%nmodelmax = Size( tpfield%tfield_l1d ) +end if + +if ( ksize > tpfield%nmodelmax ) then + if ( tpfield%nmodelmax == 0 ) then + Allocate( tpfield%tfield_l1d(ksize) ) + do ji = 1, ksize + tpfield%tfield_l1d(ji)%data => null() end do - !Reallocate - deallocate( tfieldlist(ji)%tfield_l1d ) - allocate( tfieldlist(ji)%tfield_l1d(kmodelnew) ) - !Restore pointers - do jj = 1, kmodelnew - tfieldlist(ji)%tfield_l1d(jj)%data => tfield_save_l1d(jj)%data - tfield_save_l1d(jj)%data => null() + else + Allocate( tzfield_l1d(ksize) ) + do ji = 1, Size( tpfield%tfield_l1d) + tzfield_l1d(ji)%data => tpfield%tfield_l1d(ji)%data end do - !Check no used pointers if nmodel is decreazed - do jj = kmodelnew + 1, nmodel_allocated - if ( associated(tfield_save_l1d(jj)%data ) ) then - call Print_msg( NVERB_ERROR, 'GEN', 'Fieldlist_nmodel_resize', 'data loss due to reduction in number of models' ) - tfield_save_l1d(jj)%data => null() - end if + do ji = Size( tpfield%tfield_l1d) + 1, ksize + tzfield_l1d(ji)%data => null() end do + call Move_alloc( from = tzfield_l1d, to = tpfield%tfield_l1d ) end if + tpfield%nmodelmax = ksize +end if + +end subroutine Extend_1field_l1d + + +subroutine Extend_1field_n0d( tpfield, ksize ) + +use modd_parameters, only: NUNDEF + +implicit none + +type(tfielddata), intent(inout) :: tpfield +integer, intent(in) :: ksize + +integer :: ji +type(tfieldptr_n0d), dimension(:), allocatable :: tzfield_n0d + +if ( tpfield%nmodelmax < 0 ) then + !nmodelmax is < 0 if the allocation of the field has been done by hand + !(not using a constructor, default value of nmodelmax) + !The correct value of nmodelmax is hence computed here + tpfield%nmodelmax = Size( tpfield%tfield_n0d ) +end if - if ( allocated( tfieldlist(ji)%tfield_n0d ) ) then - !Save existing pointers to temporary structure - do jj = 1, nmodel_allocated - tfield_save_n0d(jj)%data => tfieldlist(ji)%tfield_n0d(jj)%data +if ( ksize > tpfield%nmodelmax ) then + if ( tpfield%nmodelmax == 0 ) then + Allocate( tpfield%tfield_n0d(ksize) ) + do ji = 1, ksize + ! tpfield%tfield_n0d(ji)%data => null() + Allocate( tpfield%tfield_n0d(ji)%data ) + tpfield%tfield_n0d(ji)%data = NUNDEF end do - !Reallocate - deallocate( tfieldlist(ji)%tfield_n0d ) - allocate( tfieldlist(ji)%tfield_n0d(kmodelnew) ) - !Restore pointers - do jj = 1, kmodelnew - tfieldlist(ji)%tfield_n0d(jj)%data => tfield_save_n0d(jj)%data - tfield_save_n0d(jj)%data => null() + else + Allocate( tzfield_n0d(ksize) ) + do ji = 1, Size( tpfield%tfield_n0d) + tzfield_n0d(ji)%data => tpfield%tfield_n0d(ji)%data end do - !Check no used pointers if nmodel is decreazed - do jj = kmodelnew + 1, nmodel_allocated - if ( associated(tfield_save_n0d(jj)%data ) ) then - call Print_msg( NVERB_ERROR, 'GEN', 'Fieldlist_nmodel_resize', 'data loss due to reduction in number of models' ) - tfield_save_n0d(jj)%data => null() - end if + do ji = Size( tpfield%tfield_n0d) + 1, ksize + ! tzfield_n0d(ji)%data => null() + Allocate( tzfield_n0d(ji)%data ) + tzfield_n0d(ji)%data = NUNDEF end do + call Move_alloc( from = tzfield_n0d, to = tpfield%tfield_n0d ) end if + tpfield%nmodelmax = ksize +end if + +end subroutine Extend_1field_n0d + + +subroutine Extend_1field_n1d( tpfield, ksize ) + +implicit none + +type(tfielddata), intent(inout) :: tpfield +integer, intent(in) :: ksize + +integer :: ji +type(tfieldptr_n1d), dimension(:), allocatable :: tzfield_n1d + +if ( tpfield%nmodelmax < 0 ) then + !nmodelmax is < 0 if the allocation of the field has been done by hand + !(not using a constructor, default value of nmodelmax) + !The correct value of nmodelmax is hence computed here + tpfield%nmodelmax = Size( tpfield%tfield_n1d ) +end if - if ( allocated( tfieldlist(ji)%tfield_n1d ) ) then - !Save existing pointers to temporary structure - do jj = 1, nmodel_allocated - tfield_save_n1d(jj)%data => tfieldlist(ji)%tfield_n1d(jj)%data +if ( ksize > tpfield%nmodelmax ) then + if ( tpfield%nmodelmax == 0 ) then + Allocate( tpfield%tfield_n1d(ksize) ) + do ji = 1, ksize + tpfield%tfield_n1d(ji)%data => null() end do - !Reallocate - deallocate( tfieldlist(ji)%tfield_n1d ) - allocate( tfieldlist(ji)%tfield_n1d(kmodelnew) ) - !Restore pointers - do jj = 1, kmodelnew - tfieldlist(ji)%tfield_n1d(jj)%data => tfield_save_n1d(jj)%data - tfield_save_n1d(jj)%data => null() + else + Allocate( tzfield_n1d(ksize) ) + do ji = 1, Size( tpfield%tfield_n1d) + tzfield_n1d(ji)%data => tpfield%tfield_n1d(ji)%data end do - !Check no used pointers if nmodel is decreazed - do jj = kmodelnew + 1, nmodel_allocated - if ( associated(tfield_save_n1d(jj)%data ) ) then - call Print_msg( NVERB_ERROR, 'GEN', 'Fieldlist_nmodel_resize', 'data loss due to reduction in number of models' ) - tfield_save_n1d(jj)%data => null() - end if + do ji = Size( tpfield%tfield_n1d) + 1, ksize + tzfield_n1d(ji)%data => null() end do + call Move_alloc( from = tzfield_n1d, to = tpfield%tfield_n1d ) end if + tpfield%nmodelmax = ksize +end if + +end subroutine Extend_1field_n1d + + +subroutine Extend_1field_n2d( tpfield, ksize ) + +implicit none + +type(tfielddata), intent(inout) :: tpfield +integer, intent(in) :: ksize + +integer :: ji +type(tfieldptr_n2d), dimension(:), allocatable :: tzfield_n2d + +if ( tpfield%nmodelmax < 0 ) then + !nmodelmax is < 0 if the allocation of the field has been done by hand + !(not using a constructor, default value of nmodelmax) + !The correct value of nmodelmax is hence computed here + tpfield%nmodelmax = Size( tpfield%tfield_n2d ) +end if - if ( allocated( tfieldlist(ji)%tfield_n2d ) ) then - !Save existing pointers to temporary structure - do jj = 1, nmodel_allocated - tfield_save_n2d(jj)%data => tfieldlist(ji)%tfield_n2d(jj)%data +if ( ksize > tpfield%nmodelmax ) then + if ( tpfield%nmodelmax == 0 ) then + Allocate( tpfield%tfield_n2d(ksize) ) + do ji = 1, ksize + tpfield%tfield_n2d(ji)%data => null() end do - !Reallocate - deallocate( tfieldlist(ji)%tfield_n2d ) - allocate( tfieldlist(ji)%tfield_n2d(kmodelnew) ) - !Restore pointers - do jj = 1, kmodelnew - tfieldlist(ji)%tfield_n2d(jj)%data => tfield_save_n2d(jj)%data - tfield_save_n2d(jj)%data => null() + else + Allocate( tzfield_n2d(ksize) ) + do ji = 1, Size( tpfield%tfield_n2d) + tzfield_n2d(ji)%data => tpfield%tfield_n2d(ji)%data end do - !Check no used pointers if nmodel is decreazed - do jj = kmodelnew + 1, nmodel_allocated - if ( associated(tfield_save_n2d(jj)%data ) ) then - call Print_msg( NVERB_ERROR, 'GEN', 'Fieldlist_nmodel_resize', 'data loss due to reduction in number of models' ) - tfield_save_n2d(jj)%data => null() - end if + do ji = Size( tpfield%tfield_n2d) + 1, ksize + tzfield_n2d(ji)%data => null() end do + call Move_alloc( from = tzfield_n2d, to = tpfield%tfield_n2d ) end if + tpfield%nmodelmax = ksize +end if + +end subroutine Extend_1field_n2d + + +subroutine Extend_1field_n3d( tpfield, ksize ) + +implicit none + +type(tfielddata), intent(inout) :: tpfield +integer, intent(in) :: ksize + +integer :: ji +type(tfieldptr_n3d), dimension(:), allocatable :: tzfield_n3d + +if ( tpfield%nmodelmax < 0 ) then + !nmodelmax is < 0 if the allocation of the field has been done by hand + !(not using a constructor, default value of nmodelmax) + !The correct value of nmodelmax is hence computed here + tpfield%nmodelmax = Size( tpfield%tfield_n3d ) +end if - if ( allocated( tfieldlist(ji)%tfield_n3d ) ) then - !Save existing pointers to temporary structure - do jj = 1, nmodel_allocated - tfield_save_n3d(jj)%data => tfieldlist(ji)%tfield_n3d(jj)%data +if ( ksize > tpfield%nmodelmax ) then + if ( tpfield%nmodelmax == 0 ) then + Allocate( tpfield%tfield_n3d(ksize) ) + do ji = 1, ksize + tpfield%tfield_n3d(ji)%data => null() end do - !Reallocate - deallocate( tfieldlist(ji)%tfield_n3d ) - allocate( tfieldlist(ji)%tfield_n3d(kmodelnew) ) - !Restore pointers - do jj = 1, kmodelnew - tfieldlist(ji)%tfield_n3d(jj)%data => tfield_save_n3d(jj)%data - tfield_save_n3d(jj)%data => null() + else + Allocate( tzfield_n3d(ksize) ) + do ji = 1, Size( tpfield%tfield_n3d) + tzfield_n3d(ji)%data => tpfield%tfield_n3d(ji)%data end do - !Check no used pointers if nmodel is decreazed - do jj = kmodelnew + 1, nmodel_allocated - if ( associated(tfield_save_n3d(jj)%data ) ) then - call Print_msg( NVERB_ERROR, 'GEN', 'Fieldlist_nmodel_resize', 'data loss due to reduction in number of models' ) - tfield_save_n3d(jj)%data => null() - end if + do ji = Size( tpfield%tfield_n3d) + 1, ksize + tzfield_n3d(ji)%data => null() end do + call Move_alloc( from = tzfield_n3d, to = tpfield%tfield_n3d ) end if + tpfield%nmodelmax = ksize +end if + +end subroutine Extend_1field_n3d + + +subroutine Extend_1field_t0d( tpfield, ksize ) + +implicit none + +type(tfielddata), intent(inout) :: tpfield +integer, intent(in) :: ksize + +integer :: ji +type(tfieldptr_t0d), dimension(:), allocatable :: tzfield_t0d + +if ( tpfield%nmodelmax < 0 ) then + !nmodelmax is < 0 if the allocation of the field has been done by hand + !(not using a constructor, default value of nmodelmax) + !The correct value of nmodelmax is hence computed here + tpfield%nmodelmax = Size( tpfield%tfield_t0d ) +end if - if ( allocated( tfieldlist(ji)%tfield_x0d ) ) then - !Save existing pointers to temporary structure - do jj = 1, nmodel_allocated - tfield_save_x0d(jj)%data => tfieldlist(ji)%tfield_x0d(jj)%data +if ( ksize > tpfield%nmodelmax ) then + if ( tpfield%nmodelmax == 0 ) then + Allocate( tpfield%tfield_t0d(ksize) ) + do ji = 1, ksize + ! tpfield%tfield_t0d(ji)%data => null() + Allocate( tpfield%tfield_t0d(ji)%data ) end do - !Reallocate - deallocate( tfieldlist(ji)%tfield_x0d ) - allocate( tfieldlist(ji)%tfield_x0d(kmodelnew) ) - !Restore pointers - do jj = 1, kmodelnew - tfieldlist(ji)%tfield_x0d(jj)%data => tfield_save_x0d(jj)%data - tfield_save_x0d(jj)%data => null() + else + Allocate( tzfield_t0d(ksize) ) + do ji = 1, Size( tpfield%tfield_t0d) + tzfield_t0d(ji)%data => tpfield%tfield_t0d(ji)%data end do - !Check no used pointers if nmodel is decreazed - do jj = kmodelnew + 1, nmodel_allocated - if ( associated(tfield_save_x0d(jj)%data ) ) then - call Print_msg( NVERB_ERROR, 'GEN', 'Fieldlist_nmodel_resize', 'data loss due to reduction in number of models' ) - tfield_save_x0d(jj)%data => null() - end if + do ji = Size( tpfield%tfield_t0d) + 1, ksize + ! tzfield_t0d(ji)%data => null() + Allocate( tzfield_t0d(ji)%data ) end do + call Move_alloc( from = tzfield_t0d, to = tpfield%tfield_t0d ) end if + tpfield%nmodelmax = ksize +end if + +end subroutine Extend_1field_t0d + + +subroutine Extend_1field_t1d( tpfield, ksize ) + +implicit none + +type(tfielddata), intent(inout) :: tpfield +integer, intent(in) :: ksize + +integer :: ji +type(tfieldptr_t1d), dimension(:), allocatable :: tzfield_t1d + +if ( tpfield%nmodelmax < 0 ) then + !nmodelmax is < 0 if the allocation of the field has been done by hand + !(not using a constructor, default value of nmodelmax) + !The correct value of nmodelmax is hence computed here + tpfield%nmodelmax = Size( tpfield%tfield_t1d ) +end if - if ( allocated( tfieldlist(ji)%tfield_x1d ) ) then - !Save existing pointers to temporary structure - do jj = 1, nmodel_allocated - tfield_save_x1d(jj)%data => tfieldlist(ji)%tfield_x1d(jj)%data +if ( ksize > tpfield%nmodelmax ) then + if ( tpfield%nmodelmax == 0 ) then + Allocate( tpfield%tfield_t1d(ksize) ) + do ji = 1, ksize + tpfield%tfield_t1d(ji)%data => null() end do - !Reallocate - deallocate( tfieldlist(ji)%tfield_x1d ) - allocate( tfieldlist(ji)%tfield_x1d(kmodelnew) ) - !Restore pointers - do jj = 1, kmodelnew - tfieldlist(ji)%tfield_x1d(jj)%data => tfield_save_x1d(jj)%data - tfield_save_x1d(jj)%data => null() + else + Allocate( tzfield_t1d(ksize) ) + do ji = 1, Size( tpfield%tfield_t1d) + tzfield_t1d(ji)%data => tpfield%tfield_t1d(ji)%data end do - !Check no used pointers if nmodel is decreazed - do jj = kmodelnew + 1, nmodel_allocated - if ( associated(tfield_save_x1d(jj)%data ) ) then - call Print_msg( NVERB_ERROR, 'GEN', 'Fieldlist_nmodel_resize', 'data loss due to reduction in number of models' ) - tfield_save_x1d(jj)%data => null() - end if + do ji = Size( tpfield%tfield_t1d) + 1, ksize + tzfield_t1d(ji)%data => null() end do + call Move_alloc( from = tzfield_t1d, to = tpfield%tfield_t1d ) end if + tpfield%nmodelmax = ksize +end if + +end subroutine Extend_1field_t1d + + +subroutine Extend_1field_x0d( tpfield, ksize ) + +use modd_parameters, only: XUNDEF - if ( allocated( tfieldlist(ji)%tfield_x2d ) ) then - !Save existing pointers to temporary structure - do jj = 1, nmodel_allocated - tfield_save_x2d(jj)%data => tfieldlist(ji)%tfield_x2d(jj)%data +implicit none + +type(tfielddata), intent(inout) :: tpfield +integer, intent(in) :: ksize + +integer :: ji +type(tfieldptr_x0d), dimension(:), allocatable :: tzfield_x0d + +if ( tpfield%nmodelmax < 0 ) then + !nmodelmax is < 0 if the allocation of the field has been done by hand + !(not using a constructor, default value of nmodelmax) + !The correct value of nmodelmax is hence computed here + tpfield%nmodelmax = Size( tpfield%tfield_x0d ) +end if + +if ( ksize > tpfield%nmodelmax ) then + if ( tpfield%nmodelmax == 0 ) then + Allocate( tpfield%tfield_x0d(ksize) ) + do ji = 1, ksize + ! tpfield%tfield_x0d(ji)%data => null() + Allocate( tpfield%tfield_x0d(ji)%data ) + tpfield%tfield_x0d(ji)%data = XUNDEF end do - !Reallocate - deallocate( tfieldlist(ji)%tfield_x2d ) - allocate( tfieldlist(ji)%tfield_x2d(kmodelnew) ) - !Restore pointers - do jj = 1, kmodelnew - tfieldlist(ji)%tfield_x2d(jj)%data => tfield_save_x2d(jj)%data - tfield_save_x2d(jj)%data => null() + else + Allocate( tzfield_x0d(ksize) ) + do ji = 1, Size( tpfield%tfield_x0d) + tzfield_x0d(ji)%data => tpfield%tfield_x0d(ji)%data end do - !Check no used pointers if nmodel is decreazed - do jj = kmodelnew + 1, nmodel_allocated - if ( associated(tfield_save_x2d(jj)%data ) ) then - call Print_msg( NVERB_ERROR, 'GEN', 'Fieldlist_nmodel_resize', 'data loss due to reduction in number of models' ) - tfield_save_x2d(jj)%data => null() - end if + do ji = Size( tpfield%tfield_x0d) + 1, ksize + ! tzfield_x0d(ji)%data => null() + Allocate( tzfield_x0d(ji)%data ) + tzfield_x0d(ji)%data = XUNDEF end do + call Move_alloc( from = tzfield_x0d, to = tpfield%tfield_x0d ) end if + tpfield%nmodelmax = ksize +end if + +end subroutine Extend_1field_x0d + + +subroutine Extend_1field_x1d( tpfield, ksize ) - if ( allocated( tfieldlist(ji)%tfield_x3d ) ) then - !Save existing pointers to temporary structure - do jj = 1, nmodel_allocated - tfield_save_x3d(jj)%data => tfieldlist(ji)%tfield_x3d(jj)%data +implicit none + +type(tfielddata), intent(inout) :: tpfield +integer, intent(in) :: ksize + +integer :: ji +type(tfieldptr_x1d), dimension(:), allocatable :: tzfield_x1d + +if ( tpfield%nmodelmax < 0 ) then + !nmodelmax is < 0 if the allocation of the field has been done by hand + !(not using a constructor, default value of nmodelmax) + !The correct value of nmodelmax is hence computed here + tpfield%nmodelmax = Size( tpfield%tfield_x1d ) +end if + +if ( ksize > tpfield%nmodelmax ) then + if ( tpfield%nmodelmax == 0 ) then + Allocate( tpfield%tfield_x1d(ksize) ) + do ji = 1, ksize + tpfield%tfield_x1d(ji)%data => null() end do - !Reallocate - deallocate( tfieldlist(ji)%tfield_x3d ) - allocate( tfieldlist(ji)%tfield_x3d(kmodelnew) ) - !Restore pointers - do jj = 1, kmodelnew - tfieldlist(ji)%tfield_x3d(jj)%data => tfield_save_x3d(jj)%data - tfield_save_x3d(jj)%data => null() + else + Allocate( tzfield_x1d(ksize) ) + do ji = 1, Size( tpfield%tfield_x1d) + tzfield_x1d(ji)%data => tpfield%tfield_x1d(ji)%data end do - !Check no used pointers if nmodel is decreazed - do jj = kmodelnew + 1, nmodel_allocated - if ( associated(tfield_save_x3d(jj)%data ) ) then - call Print_msg( NVERB_ERROR, 'GEN', 'Fieldlist_nmodel_resize', 'data loss due to reduction in number of models' ) - tfield_save_x3d(jj)%data => null() - end if + do ji = Size( tpfield%tfield_x1d) + 1, ksize + tzfield_x1d(ji)%data => null() end do + call Move_alloc( from = tzfield_x1d, to = tpfield%tfield_x1d ) end if + tpfield%nmodelmax = ksize +end if + +end subroutine Extend_1field_x1d + + +subroutine Extend_1field_x2d( tpfield, ksize ) - if ( allocated( tfieldlist(ji)%tfield_x4d ) ) then - !Save existing pointers to temporary structure - do jj = 1, nmodel_allocated - tfield_save_x4d(jj)%data => tfieldlist(ji)%tfield_x4d(jj)%data +implicit none + +type(tfielddata), intent(inout) :: tpfield +integer, intent(in) :: ksize + +integer :: ji +type(tfieldptr_x2d), dimension(:), allocatable :: tzfield_x2d + +if ( tpfield%nmodelmax < 0 ) then + !nmodelmax is < 0 if the allocation of the field has been done by hand + !(not using a constructor, default value of nmodelmax) + !The correct value of nmodelmax is hence computed here + tpfield%nmodelmax = Size( tpfield%tfield_x2d ) +end if + +if ( ksize > tpfield%nmodelmax ) then + if ( tpfield%nmodelmax == 0 ) then + Allocate( tpfield%tfield_x2d(ksize) ) + do ji = 1, ksize + tpfield%tfield_x2d(ji)%data => null() end do - !Reallocate - deallocate( tfieldlist(ji)%tfield_x4d ) - allocate( tfieldlist(ji)%tfield_x4d(kmodelnew) ) - !Restore pointers - do jj = 1, kmodelnew - tfieldlist(ji)%tfield_x4d(jj)%data => tfield_save_x4d(jj)%data - tfield_save_x4d(jj)%data => null() + else + Allocate( tzfield_x2d(ksize) ) + do ji = 1, Size( tpfield%tfield_x2d) + tzfield_x2d(ji)%data => tpfield%tfield_x2d(ji)%data end do - !Check no used pointers if nmodel is decreazed - do jj = kmodelnew + 1, nmodel_allocated - if ( associated(tfield_save_x4d(jj)%data ) ) then - call Print_msg( NVERB_ERROR, 'GEN', 'Fieldlist_nmodel_resize', 'data loss due to reduction in number of models' ) - tfield_save_x4d(jj)%data => null() - end if + do ji = Size( tpfield%tfield_x2d) + 1, ksize + tzfield_x2d(ji)%data => null() end do + call Move_alloc( from = tzfield_x2d, to = tpfield%tfield_x2d ) end if + tpfield%nmodelmax = ksize +end if + +end subroutine Extend_1field_x2d + + +subroutine Extend_1field_x3d( tpfield, ksize ) - if ( allocated( tfieldlist(ji)%tfield_x5d ) ) then - !Save existing pointers to temporary structure - do jj = 1, nmodel_allocated - tfield_save_x5d(jj)%data => tfieldlist(ji)%tfield_x5d(jj)%data +implicit none + +type(tfielddata), intent(inout) :: tpfield +integer, intent(in) :: ksize + +integer :: ji +type(tfieldptr_x3d), dimension(:), allocatable :: tzfield_x3d + +if ( tpfield%nmodelmax < 0 ) then + !nmodelmax is < 0 if the allocation of the field has been done by hand + !(not using a constructor, default value of nmodelmax) + !The correct value of nmodelmax is hence computed here + tpfield%nmodelmax = Size( tpfield%tfield_x3d ) +end if + +if ( ksize > tpfield%nmodelmax ) then + if ( tpfield%nmodelmax == 0 ) then + Allocate( tpfield%tfield_x3d(ksize) ) + do ji = 1, ksize + tpfield%tfield_x3d(ji)%data => null() end do - !Reallocate - deallocate( tfieldlist(ji)%tfield_x5d ) - allocate( tfieldlist(ji)%tfield_x5d(kmodelnew) ) - !Restore pointers - do jj = 1, kmodelnew - tfieldlist(ji)%tfield_x5d(jj)%data => tfield_save_x5d(jj)%data - tfield_save_x5d(jj)%data => null() + else + Allocate( tzfield_x3d(ksize) ) + do ji = 1, Size( tpfield%tfield_x3d) + tzfield_x3d(ji)%data => tpfield%tfield_x3d(ji)%data end do - !Check no used pointers if nmodel is decreazed - do jj = kmodelnew + 1, nmodel_allocated - if ( associated(tfield_save_x5d(jj)%data ) ) then - call Print_msg( NVERB_ERROR, 'GEN', 'Fieldlist_nmodel_resize', 'data loss due to reduction in number of models' ) - tfield_save_x5d(jj)%data => null() - end if + do ji = Size( tpfield%tfield_x3d) + 1, ksize + tzfield_x3d(ji)%data => null() end do + call Move_alloc( from = tzfield_x3d, to = tpfield%tfield_x3d ) end if + tpfield%nmodelmax = ksize +end if + +end subroutine Extend_1field_x3d + + +subroutine Extend_1field_x4d( tpfield, ksize ) - if ( allocated( tfieldlist(ji)%tfield_x6d ) ) then - !Save existing pointers to temporary structure - do jj = 1, nmodel_allocated - tfield_save_x6d(jj)%data => tfieldlist(ji)%tfield_x6d(jj)%data +implicit none + +type(tfielddata), intent(inout) :: tpfield +integer, intent(in) :: ksize + +integer :: ji +type(tfieldptr_x4d), dimension(:), allocatable :: tzfield_x4d + +if ( tpfield%nmodelmax < 0 ) then + !nmodelmax is < 0 if the allocation of the field has been done by hand + !(not using a constructor, default value of nmodelmax) + !The correct value of nmodelmax is hence computed here + tpfield%nmodelmax = Size( tpfield%tfield_x4d ) +end if + +if ( ksize > tpfield%nmodelmax ) then + if ( tpfield%nmodelmax == 0 ) then + Allocate( tpfield%tfield_x4d(ksize) ) + do ji = 1, ksize + tpfield%tfield_x4d(ji)%data => null() end do - !Reallocate - deallocate( tfieldlist(ji)%tfield_x6d ) - allocate( tfieldlist(ji)%tfield_x6d(kmodelnew) ) - !Restore pointers - do jj = 1, kmodelnew - tfieldlist(ji)%tfield_x6d(jj)%data => tfield_save_x6d(jj)%data - tfield_save_x6d(jj)%data => null() + else + Allocate( tzfield_x4d(ksize) ) + do ji = 1, Size( tpfield%tfield_x4d) + tzfield_x4d(ji)%data => tpfield%tfield_x4d(ji)%data end do - !Check no used pointers if nmodel is decreazed - do jj = kmodelnew + 1, nmodel_allocated - if ( associated(tfield_save_x6d(jj)%data ) ) then - call Print_msg( NVERB_ERROR, 'GEN', 'Fieldlist_nmodel_resize', 'data loss due to reduction in number of models' ) - tfield_save_x6d(jj)%data => null() - end if + do ji = Size( tpfield%tfield_x4d) + 1, ksize + tzfield_x4d(ji)%data => null() end do + call Move_alloc( from = tzfield_x4d, to = tpfield%tfield_x4d ) end if + tpfield%nmodelmax = ksize +end if + +end subroutine Extend_1field_x4d + + +subroutine Extend_1field_x5d( tpfield, ksize ) - if ( allocated( tfieldlist(ji)%tfield_t0d ) ) then - !Save existing pointers to temporary structure - do jj = 1, nmodel_allocated - tfield_save_t0d(jj)%data => tfieldlist(ji)%tfield_t0d(jj)%data +implicit none + +type(tfielddata), intent(inout) :: tpfield +integer, intent(in) :: ksize + +integer :: ji +type(tfieldptr_x5d), dimension(:), allocatable :: tzfield_x5d + +if ( tpfield%nmodelmax < 0 ) then + !nmodelmax is < 0 if the allocation of the field has been done by hand + !(not using a constructor, default value of nmodelmax) + !The correct value of nmodelmax is hence computed here + tpfield%nmodelmax = Size( tpfield%tfield_x5d ) +end if + +if ( ksize > tpfield%nmodelmax ) then + if ( tpfield%nmodelmax == 0 ) then + Allocate( tpfield%tfield_x5d(ksize) ) + do ji = 1, ksize + tpfield%tfield_x5d(ji)%data => null() end do - !Reallocate - deallocate( tfieldlist(ji)%tfield_t0d ) - allocate( tfieldlist(ji)%tfield_t0d(kmodelnew) ) - !Restore pointers - do jj = 1, kmodelnew - tfieldlist(ji)%tfield_t0d(jj)%data => tfield_save_t0d(jj)%data - tfield_save_t0d(jj)%data => null() + else + Allocate( tzfield_x5d(ksize) ) + do ji = 1, Size( tpfield%tfield_x5d) + tzfield_x5d(ji)%data => tpfield%tfield_x5d(ji)%data end do - !Check no used pointers if nmodel is decreazed - do jj = kmodelnew + 1, nmodel_allocated - if ( associated(tfield_save_t0d(jj)%data ) ) then - call Print_msg( NVERB_ERROR, 'GEN', 'Fieldlist_nmodel_resize', 'data loss due to reduction in number of models' ) - tfield_save_t0d(jj)%data => null() - end if + do ji = Size( tpfield%tfield_x5d) + 1, ksize + tzfield_x5d(ji)%data => null() end do + call Move_alloc( from = tzfield_x5d, to = tpfield%tfield_x5d ) end if + tpfield%nmodelmax = ksize +end if + +end subroutine Extend_1field_x5d + + +subroutine Extend_1field_x6d( tpfield, ksize ) -end do +implicit none + +type(tfielddata), intent(inout) :: tpfield +integer, intent(in) :: ksize + +integer :: ji +type(tfieldptr_x6d), dimension(:), allocatable :: tzfield_x6d + +if ( tpfield%nmodelmax < 0 ) then + !nmodelmax is < 0 if the allocation of the field has been done by hand + !(not using a constructor, default value of nmodelmax) + !The correct value of nmodelmax is hence computed here + tpfield%nmodelmax = Size( tpfield%tfield_x6d ) +end if -nmodel_allocated = kmodelnew +if ( ksize > tpfield%nmodelmax ) then + if ( tpfield%nmodelmax == 0 ) then + Allocate( tpfield%tfield_x6d(ksize) ) + do ji = 1, ksize + tpfield%tfield_x6d(ji)%data => null() + end do + else + Allocate( tzfield_x6d(ksize) ) + do ji = 1, Size( tpfield%tfield_x6d) + tzfield_x6d(ji)%data => tpfield%tfield_x6d(ji)%data + end do + do ji = Size( tpfield%tfield_x6d) + 1, ksize + tzfield_x6d(ji)%data => null() + end do + call Move_alloc( from = tzfield_x6d, to = tpfield%tfield_x6d ) + end if + tpfield%nmodelmax = ksize +end if -end subroutine Fieldlist_nmodel_resize +end subroutine Extend_1field_x6d end module mode_field diff --git a/src/LIB/SURCOUCHE/src/mode_io_field_read.f90 b/src/LIB/SURCOUCHE/src/mode_io_field_read.f90 index 15bb499d2ca93f21606dbcee61087753ef7c4230..f0eb696c9f4b2049de9afd5db3a7581f3966fbef 100644 --- a/src/LIB/SURCOUCHE/src/mode_io_field_read.f90 +++ b/src/LIB/SURCOUCHE/src/mode_io_field_read.f90 @@ -114,8 +114,8 @@ end subroutine IO_Format_read_select SUBROUTINE IO_Field_metadata_bcast(TPFILE,TPFIELD) -TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD +TYPE(TFILEDATA), INTENT(IN) :: TPFILE +CLASS(TFIELDMETADATA), INTENT(INOUT) :: TPFIELD ! INTEGER :: IERR ! @@ -159,10 +159,10 @@ SUBROUTINE IO_Field_read_byfield_X0(TPFILE,TPFIELD,PFIELD,KRESP) ! USE MODD_IO, ONLY: ISP,GSMONOPROC ! -TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD -REAL, INTENT(INOUT) :: PFIELD ! data field -INTEGER,OPTIONAL, INTENT(OUT) :: KRESP ! return-code +TYPE(TFILEDATA), INTENT(IN) :: TPFILE +CLASS(TFIELDMETADATA), INTENT(INOUT) :: TPFIELD +REAL, INTENT(INOUT) :: PFIELD ! data field +INTEGER, OPTIONAL, INTENT(OUT) :: KRESP ! return-code ! INTEGER :: IERR INTEGER :: IRESP @@ -238,13 +238,13 @@ USE MODD_STRUCTURE_ll, ONLY: ZONE_ll USE MODE_SCATTER_ll USE MODE_ALLOCBUFFER_ll ! -TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD -REAL,DIMENSION(:),INTENT(INOUT) :: PFIELD ! array containing the data field -INTEGER,OPTIONAL, INTENT(OUT) :: KRESP ! return-code -INTEGER,OPTIONAL, INTENT(IN) :: KIMAX_ll -INTEGER,OPTIONAL, INTENT(IN) :: KJMAX_ll -TYPE(ZONE_ll),DIMENSION(ISNPROC),OPTIONAL,INTENT(IN) :: TPSPLITTING ! splitting of the domain +TYPE(TFILEDATA), INTENT(IN) :: TPFILE +CLASS(TFIELDMETADATA), INTENT(INOUT) :: TPFIELD +REAL, DIMENSION(:), INTENT(INOUT) :: PFIELD ! array containing the data field +INTEGER, OPTIONAL, INTENT(OUT) :: KRESP ! return-code +INTEGER, OPTIONAL, INTENT(IN) :: KIMAX_ll +INTEGER, OPTIONAL, INTENT(IN) :: KJMAX_ll +TYPE(ZONE_ll), DIMENSION(ISNPROC), OPTIONAL, INTENT(IN) :: TPSPLITTING ! splitting of the domain ! INTEGER :: IERR REAL,DIMENSION(:),POINTER :: ZFIELDP @@ -349,13 +349,13 @@ USE MODD_ARGSLIST_ll, ONLY : LIST_ll USE MODE_ll , ONLY : ADD2DFIELD_ll,UPDATE_HALO_ll,CLEANLIST_ll #endif ! -TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD -REAL,DIMENSION(:,:),TARGET,INTENT(INOUT) :: PFIELD ! array containing the data field -INTEGER, OPTIONAL, INTENT(OUT) :: KRESP ! return-code -INTEGER, OPTIONAL, INTENT(IN) :: KIMAX_ll -INTEGER, OPTIONAL, INTENT(IN) :: KJMAX_ll -TYPE(ZONE_ll),DIMENSION(ISNPROC),OPTIONAL,INTENT(IN) :: TPSPLITTING ! splitting of the domain +TYPE(TFILEDATA), INTENT(IN) :: TPFILE +CLASS(TFIELDMETADATA), INTENT(INOUT) :: TPFIELD +REAL, DIMENSION(:,:), TARGET, INTENT(INOUT) :: PFIELD ! array containing the data field +INTEGER, OPTIONAL, INTENT(OUT) :: KRESP ! return-code +INTEGER, OPTIONAL, INTENT(IN) :: KIMAX_ll +INTEGER, OPTIONAL, INTENT(IN) :: KJMAX_ll +TYPE(ZONE_ll), DIMENSION(ISNPROC), OPTIONAL, INTENT(IN) :: TPSPLITTING ! splitting of the domain ! INTEGER :: IERR real :: zfieldp0d @@ -367,7 +367,7 @@ INTEGER :: IRESP INTEGER :: IHEXTOT REAL(kind=MNHTIME), DIMENSION(2) :: ZT0, ZT1, ZT2 REAL(kind=MNHTIME), DIMENSION(2) :: ZT11, ZT22 -type(tfielddata) :: tzfield +class(tfieldmetadata),allocatable :: tzfield #ifdef MNH_GA REAL,DIMENSION(:,:),POINTER :: ZFIELD_GA TYPE(LIST_ll) ,POINTER :: TZFIELD_ll @@ -389,8 +389,8 @@ call IO_Format_read_select( tpfile, glfi, gnc4 ) IF (IRESP==0) THEN IF (GSMONOPROC) THEN ! sequential execution if ( lpack .and. l1d .and. Size( pfield, 1 ) == ihextot .and. Size( pfield, 2 ) == ihextot ) then + Allocate( tzfield, source = tpfield ) if ( tpfile%ldimreduced ) then - tzfield = tpfield tzfield%ndims = tzfield%ndims - 2 if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(1) = tzfield%ndimlist(3) !Necessary if time dimension @@ -400,7 +400,6 @@ IF (IRESP==0) THEN if ( glfi ) call IO_Field_read_lfi( tpfile, tzfield, zfieldp0d, iresp ) pfield(:, :) = Spread( Spread( zfieldp0d, dim = 1, ncopies = ihextot ), dim = 2, ncopies = ihextot ) else - tzfield = tpfield if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(1:2) = NMNHDIM_ONE end if @@ -410,8 +409,8 @@ IF (IRESP==0) THEN pfield(:, :) = Spread( Spread( pfield(jphext + 1, jphext + 1), dim = 1, ncopies = ihextot ), dim = 2, ncopies = ihextot ) endif else if ( lpack .and. l2d .and. Size( pfield, 2 ) == ihextot ) then + Allocate( tzfield, source = tpfield ) if ( tpfile%ldimreduced ) then - tzfield = tpfield tzfield%ndims = tzfield%ndims - 1 if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(2) = tzfield%ndimlist(3) !Necessary if time dimension @@ -422,7 +421,6 @@ IF (IRESP==0) THEN if ( glfi ) call IO_Field_read_lfi( tpfile, tzfield, zfieldp1d, iresp ) pfield(:, :) = Spread( pfield(:, jphext + 1), dim = 2, ncopies = ihextot ) else - tzfield = tpfield if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(2) = NMNHDIM_ONE end if @@ -558,10 +556,10 @@ USE MODE_IO_MANAGE_STRUCT, ONLY: IO_File_find_byname USE MODE_MNH_TIMING, ONLY: SECOND_MNH2 USE MODE_SCATTER_ll ! -TYPE(TFILEDATA),TARGET, INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD -REAL,DIMENSION(:,:,:),TARGET,INTENT(INOUT) :: PFIELD ! array containing the data field -INTEGER, OPTIONAL, INTENT(OUT) :: KRESP ! return-code +TYPE(TFILEDATA), TARGET, INTENT(IN) :: TPFILE +CLASS(TFIELDMETADATA), INTENT(INOUT) :: TPFIELD +REAL,DIMENSION(:,:,:), TARGET, INTENT(INOUT) :: PFIELD ! array containing the data field +INTEGER, OPTIONAL, INTENT(OUT) :: KRESP ! return-code ! TYPE TX_2DP REAL,DIMENSION(:,:), POINTER :: X @@ -588,7 +586,7 @@ CHARACTER(LEN=2) :: YDIR CHARACTER(LEN=4) :: YK CHARACTER(LEN=NMNHNAMELGTMAX+4) :: YRECZSLICE CHARACTER(LEN=4) :: YSUFFIX -type(tfielddata) :: tzfield +class(tfieldmetadata), allocatable :: tzfield TYPE(TFILEDATA),POINTER :: TZFILE TYPE(TX_2DP),ALLOCATABLE,DIMENSION(:) :: T_TX2DP #ifdef MNH_GA @@ -615,8 +613,8 @@ call IO_Format_read_select( tpfile, glfi, gnc4 ) IF (IRESP==0) THEN IF (GSMONOPROC .AND. TPFILE%NSUBFILES_IOZ==0 ) THEN ! sequential execution if ( lpack .and. l1d .and. Size( pfield, 1 ) == ihextot .and. Size( pfield, 2 ) == ihextot ) then + Allocate( tzfield, source = tpfield ) if ( tpfile%ldimreduced ) then - tzfield = tpfield tzfield%ndims = tzfield%ndims - 2 if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(1) = tzfield%ndimlist(3) @@ -629,7 +627,6 @@ IF (IRESP==0) THEN pfield(:, :, :) = Spread( Spread( pfield(jphext + 1, jphext + 1, :), dim = 1, ncopies = ihextot ), & dim = 2, ncopies = ihextot ) else - tzfield = tpfield if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(1:2) = NMNHDIM_ONE end if @@ -640,8 +637,8 @@ IF (IRESP==0) THEN dim = 2, ncopies = ihextot ) endif else if ( lpack .and. l2d .and. Size( pfield, 2 ) == ihextot ) then + Allocate( tzfield, source = tpfield ) if ( tpfile%ldimreduced ) then - tzfield = tpfield tzfield%ndims = tzfield%ndims - 1 if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(2) = tzfield%ndimlist(3) @@ -653,7 +650,6 @@ IF (IRESP==0) THEN if ( glfi ) call IO_Field_read_lfi( tpfile, tzfield, zfieldp2d, iresp ) pfield(:, :, :) = Spread( pfield(:, jphext + 1, :), dim = 2, ncopies = ihextot ) else - tzfield = tpfield if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(2) = NMNHDIM_ONE end if @@ -717,6 +713,7 @@ IF (IRESP==0) THEN ALLOCATE(ZSLICE_ll(0,0)) ! to avoid bug on test of size GALLOC_ll = .TRUE. IRESP_ISP=0 + Allocate( tzfield, mold = tpfield ) DO JKK=1,SIZE(PFIELD,3) ! IKU_ll IK_FILE = IO_Level2filenumber_get(JKK,TPFILE%NSUBFILES_IOZ) TZFILE => TPFILE%TFILES_IOZ(IK_FILE+1)%TFILE @@ -783,6 +780,7 @@ IF (IRESP==0) THEN JK_MAX=MIN(SIZE(PFIELD,3),JK+INB_PROC_REAL-1) ! INB_REQ=0 + Allocate( tzfield, mold = tpfield ) DO JKK=JK,JK_MAX IF (TPFILE%NSUBFILES_IOZ .GT. 1 ) THEN IK_FILE = IO_Level2filenumber_get(JKK,TPFILE%NSUBFILES_IOZ) @@ -947,10 +945,10 @@ USE MODE_ALLOCBUFFER_ll USE MODE_MNH_TIMING, ONLY: SECOND_MNH2 USE MODE_SCATTER_ll ! -TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD -REAL,DIMENSION(:,:,:,:),TARGET,INTENT(INOUT) :: PFIELD ! array containing the data field -INTEGER, OPTIONAL, INTENT(OUT) :: KRESP ! return-code +TYPE(TFILEDATA), INTENT(IN) :: TPFILE +CLASS(TFIELDMETADATA), INTENT(INOUT) :: TPFIELD +REAL, DIMENSION(:,:,:,:), TARGET, INTENT(INOUT) :: PFIELD ! array containing the data field +INTEGER, OPTIONAL, INTENT(OUT) :: KRESP ! return-code ! INTEGER :: IERR real, dimension(:,:), pointer :: zfieldp2d @@ -960,7 +958,7 @@ LOGICAL :: GALLOC logical :: glfi, gnc4 INTEGER :: IRESP INTEGER :: IHEXTOT -type(tfielddata) :: tzfield +class(tfieldmetadata), allocatable :: tzfield ! CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_Field_read_byfield_X4',TRIM(TPFILE%CNAME)//': reading '//TRIM(TPFIELD%CMNHNAME)) ! @@ -976,8 +974,8 @@ call IO_Format_read_select( tpfile, glfi, gnc4 ) IF (IRESP==0) THEN IF (GSMONOPROC) THEN ! sequential execution if ( lpack .and. l1d .and. Size( pfield, 1 ) == ihextot .and. Size( pfield, 2 ) == ihextot ) then + Allocate( tzfield, source = tpfield ) if ( tpfile%ldimreduced ) then - tzfield = tpfield tzfield%ndims = tzfield%ndims - 2 if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(1) = tzfield%ndimlist(3) @@ -991,7 +989,6 @@ IF (IRESP==0) THEN pfield(:, :, :, :) = Spread( Spread( pfield(jphext + 1, jphext + 1, :, :), dim = 1, ncopies = ihextot ), & dim = 2, ncopies = ihextot ) else - tzfield = tpfield if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(1:2) = NMNHDIM_ONE end if @@ -1002,8 +999,8 @@ IF (IRESP==0) THEN dim = 2, ncopies = ihextot ) endif else if ( lpack .and. l2d .and. Size( pfield, 2 ) == ihextot ) then + Allocate( tzfield, source = tpfield ) if ( tpfile%ldimreduced ) then - tzfield = tpfield tzfield%ndims = tzfield%ndims - 1 if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(2) = tzfield%ndimlist(3) @@ -1016,7 +1013,6 @@ IF (IRESP==0) THEN if ( glfi ) call IO_Field_read_lfi( tpfile, tzfield, zfieldp3d, iresp ) pfield(:, :, :, :) = Spread( pfield(:, jphext + 1, :, :), dim = 2, ncopies = ihextot ) else - tzfield = tpfield if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(2) = NMNHDIM_ONE end if @@ -1106,10 +1102,10 @@ USE MODE_ALLOCBUFFER_ll USE MODE_MNH_TIMING, ONLY: SECOND_MNH2 USE MODE_SCATTER_ll ! -TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD -REAL,DIMENSION(:,:,:,:,:),TARGET,INTENT(INOUT) :: PFIELD ! array containing the data field -INTEGER, OPTIONAL, INTENT(OUT) :: KRESP ! return-code +TYPE(TFILEDATA), INTENT(IN) :: TPFILE +CLASS(TFIELDMETADATA), INTENT(INOUT) :: TPFIELD +REAL, DIMENSION(:,:,:,:,:), TARGET, INTENT(INOUT) :: PFIELD ! array containing the data field +INTEGER, OPTIONAL, INTENT(OUT) :: KRESP ! return-code ! INTEGER :: IERR real, dimension(:,:,:), pointer :: zfieldp3d @@ -1119,7 +1115,7 @@ LOGICAL :: GALLOC logical :: glfi, gnc4 INTEGER :: IRESP INTEGER :: IHEXTOT -type(tfielddata) :: tzfield +class(tfieldmetadata), allocatable :: tzfield ! CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_Field_read_byfield_X5',TRIM(TPFILE%CNAME)//': reading '//TRIM(TPFIELD%CMNHNAME)) ! @@ -1135,8 +1131,8 @@ call IO_Format_read_select( tpfile, glfi, gnc4 ) IF (IRESP==0) THEN IF (GSMONOPROC) THEN ! sequential execution if ( lpack .and. l1d .and. Size( pfield, 1 ) == ihextot .and. Size( pfield, 2 ) == ihextot ) then + Allocate( tzfield, source = tpfield ) if ( tpfile%ldimreduced ) then - tzfield = tpfield tzfield%ndims = tzfield%ndims - 2 if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(1) = tzfield%ndimlist(3) @@ -1151,7 +1147,6 @@ IF (IRESP==0) THEN pfield(:, :, :, :, :) = Spread( Spread( pfield(jphext + 1, jphext + 1, :, :, :), dim = 1, ncopies = ihextot ), & dim = 2, ncopies = ihextot ) else - tzfield = tpfield if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(1:2) = NMNHDIM_ONE end if @@ -1162,8 +1157,8 @@ IF (IRESP==0) THEN dim = 2, ncopies = ihextot ) endif else if ( lpack .and. l2d .and. Size( pfield, 2 ) == ihextot ) then + Allocate( tzfield, source = tpfield ) if ( tpfile%ldimreduced ) then - tzfield = tpfield tzfield%ndims = tzfield%ndims - 1 if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(2) = tzfield%ndimlist(3) @@ -1177,7 +1172,6 @@ IF (IRESP==0) THEN if ( glfi ) call IO_Field_read_lfi( tpfile, tzfield, zfieldp4d, iresp ) pfield(:, :, :, :, :) = Spread( pfield(:, jphext + 1, :, :, :), dim = 2, ncopies = ihextot ) else - tzfield = tpfield if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(2) = NMNHDIM_ONE end if @@ -1266,10 +1260,10 @@ USE MODE_ALLOCBUFFER_ll USE MODE_MNH_TIMING, ONLY: SECOND_MNH2 USE MODE_SCATTER_ll ! -TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD -REAL,DIMENSION(:,:,:,:,:,:),TARGET,INTENT(INOUT) :: PFIELD ! array containing the data field -INTEGER, OPTIONAL, INTENT(OUT) :: KRESP ! return-code +TYPE(TFILEDATA), INTENT(IN) :: TPFILE +CLASS(TFIELDMETADATA), INTENT(INOUT) :: TPFIELD +REAL, DIMENSION(:,:,:,:,:,:), TARGET, INTENT(INOUT) :: PFIELD ! array containing the data field +INTEGER, OPTIONAL, INTENT(OUT) :: KRESP ! return-code ! INTEGER :: IERR REAL,DIMENSION(:,:,:,:,:,:),POINTER :: ZFIELDP @@ -1356,10 +1350,10 @@ SUBROUTINE IO_Field_read_byfield_N0(TPFILE,TPFIELD,KFIELD,KRESP) ! USE MODD_IO, ONLY: ISP,GSMONOPROC ! -TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD -INTEGER, INTENT(INOUT) :: KFIELD ! array containing the data field -INTEGER,OPTIONAL, INTENT(OUT) :: KRESP ! return-code +TYPE(TFILEDATA), INTENT(IN) :: TPFILE +CLASS(TFIELDMETADATA), INTENT(INOUT) :: TPFIELD +INTEGER, INTENT(INOUT) :: KFIELD ! array containing the data field +INTEGER, OPTIONAL, INTENT(OUT) :: KRESP ! return-code ! INTEGER :: IERR INTEGER :: IRESP @@ -1427,10 +1421,10 @@ USE MODD_IO, ONLY: ISP, GSMONOPROC USE MODE_ALLOCBUFFER_ll USE MODE_SCATTER_ll ! -TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD -INTEGER,DIMENSION(:),INTENT(INOUT) :: KFIELD ! array containing the data field -INTEGER,OPTIONAL, INTENT(OUT) :: KRESP ! return-code +TYPE(TFILEDATA), INTENT(IN) :: TPFILE +CLASS(TFIELDMETADATA), INTENT(INOUT) :: TPFIELD +INTEGER, DIMENSION(:), INTENT(INOUT) :: KFIELD ! array containing the data field +INTEGER, OPTIONAL, INTENT(OUT) :: KRESP ! return-code ! INTEGER :: IERR INTEGER :: IRESP @@ -1518,10 +1512,10 @@ USE MODD_TIMEZ, ONLY: TIMEZ USE MODE_ALLOCBUFFER_ll USE MODE_SCATTER_ll ! -TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD -INTEGER,DIMENSION(:,:),TARGET,INTENT(INOUT) :: KFIELD ! array containing the data field -INTEGER, OPTIONAL, INTENT(OUT) :: KRESP ! return-code +TYPE(TFILEDATA), INTENT(IN) :: TPFILE +CLASS(TFIELDMETADATA), INTENT(INOUT) :: TPFIELD +INTEGER, DIMENSION(:,:), TARGET, INTENT(INOUT) :: KFIELD ! array containing the data field +INTEGER, OPTIONAL, INTENT(OUT) :: KRESP ! return-code ! INTEGER :: IERR integer :: ifieldp0d @@ -1531,7 +1525,7 @@ LOGICAL :: GALLOC logical :: glfi, gnc4 INTEGER :: IRESP INTEGER :: IHEXTOT -type(tfielddata) :: tzfield +class(tfieldmetadata), allocatable :: tzfield ! CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_Field_read_byfield_N2',TRIM(TPFILE%CNAME)//': reading '//TRIM(TPFIELD%CMNHNAME)) ! @@ -1547,8 +1541,8 @@ call IO_Format_read_select( tpfile, glfi, gnc4 ) IF (IRESP==0) THEN IF (GSMONOPROC) THEN ! sequential execution if ( lpack .and. l1d .and. Size( kfield, 1 ) == ihextot .and. Size( kfield, 2 ) == ihextot ) then + Allocate( tzfield, source = tpfield ) if ( tpfile%ldimreduced ) then - tzfield = tpfield tzfield%ndims = tzfield%ndims - 2 if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(1) = tzfield%ndimlist(3) !Necessary if time dimension @@ -1558,7 +1552,6 @@ IF (IRESP==0) THEN if ( glfi ) call IO_Field_read_lfi( tpfile, tzfield, ifieldp0d, iresp ) kfield(:, :) = Spread( Spread( ifieldp0d, dim = 1, ncopies = ihextot ), dim = 2, ncopies = ihextot ) else - tzfield = tpfield if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(1:2) = NMNHDIM_ONE end if @@ -1568,8 +1561,8 @@ IF (IRESP==0) THEN kfield(:, :) = Spread( Spread( kfield(jphext + 1, jphext + 1), dim = 1, ncopies = ihextot ), dim = 2, ncopies = ihextot ) endif else if ( lpack .and. l2d .and. Size( kfield, 2 ) == ihextot ) then + Allocate( tzfield, source = tpfield ) if ( tpfile%ldimreduced ) then - tzfield = tpfield tzfield%ndims = tzfield%ndims - 1 if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(2) = tzfield%ndimlist(3) !Necessary if time dimension @@ -1580,7 +1573,6 @@ IF (IRESP==0) THEN if ( glfi ) call IO_Field_read_lfi( tpfile, tzfield, ifieldp1d, iresp ) kfield(:, :) = Spread( kfield(:, jphext + 1), dim = 2, ncopies = ihextot ) else - tzfield = tpfield if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(2) = NMNHDIM_ONE end if @@ -1672,10 +1664,10 @@ USE MODD_TIMEZ, ONLY: TIMEZ USE MODE_ALLOCBUFFER_ll USE MODE_SCATTER_ll ! -TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD -INTEGER,DIMENSION(:,:,:),TARGET,INTENT(INOUT) :: KFIELD ! array containing the data field -INTEGER, OPTIONAL, INTENT(OUT) :: KRESP ! return-code +TYPE(TFILEDATA), INTENT(IN) :: TPFILE +CLASS(TFIELDMETADATA), INTENT(INOUT) :: TPFIELD +INTEGER, DIMENSION(:,:,:), TARGET, INTENT(INOUT) :: KFIELD ! array containing the data field +INTEGER, OPTIONAL, INTENT(OUT) :: KRESP ! return-code ! INTEGER :: IERR integer, dimension(:), pointer :: ifieldp1d @@ -1685,7 +1677,7 @@ LOGICAL :: GALLOC logical :: glfi, gnc4 INTEGER :: IRESP INTEGER :: IHEXTOT -type(tfielddata) :: tzfield +class(tfieldmetadata), allocatable :: tzfield ! CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_Field_read_byfield_N3',TRIM(TPFILE%CNAME)//': reading '//TRIM(TPFIELD%CMNHNAME)) ! @@ -1701,8 +1693,8 @@ call IO_Format_read_select( tpfile, glfi, gnc4 ) IF (IRESP==0) THEN IF (GSMONOPROC) THEN ! sequential execution if ( lpack .and. l1d .and. Size( kfield, 1 ) == ihextot .and. Size( kfield, 2 ) == ihextot ) then + Allocate( tzfield, source = tpfield ) if ( tpfile%ldimreduced ) then - tzfield = tpfield tzfield%ndims = tzfield%ndims - 2 if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(1) = tzfield%ndimlist(3) @@ -1715,7 +1707,6 @@ IF (IRESP==0) THEN kfield(:, :, :) = Spread( Spread( kfield(jphext + 1, jphext + 1, :), dim = 1, ncopies = ihextot ), & dim = 2, ncopies = ihextot ) else - tzfield = tpfield if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(1:2) = NMNHDIM_ONE end if @@ -1726,8 +1717,8 @@ IF (IRESP==0) THEN dim = 2, ncopies = ihextot ) endif else if ( lpack .and. l2d .and. Size( kfield, 2 ) == ihextot ) then + Allocate( tzfield, source = tpfield ) if ( tpfile%ldimreduced ) then - tzfield = tpfield tzfield%ndims = tzfield%ndims - 1 if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(2) = tzfield%ndimlist(3) @@ -1739,7 +1730,6 @@ IF (IRESP==0) THEN if ( glfi ) call IO_Field_read_lfi( tpfile, tzfield, ifieldp2d, iresp ) kfield(:, :, :) = Spread( kfield(:, jphext + 1, :), dim = 2, ncopies = ihextot ) else - tzfield = tpfield if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(2) = NMNHDIM_ONE end if @@ -1825,10 +1815,10 @@ SUBROUTINE IO_Field_read_byfield_L0(TPFILE,TPFIELD,OFIELD,KRESP) ! USE MODD_IO, ONLY: ISP, GSMONOPROC ! -TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD -LOGICAL, INTENT(INOUT) :: OFIELD ! array containing the data field -INTEGER,OPTIONAL, INTENT(OUT) :: KRESP ! return-code +TYPE(TFILEDATA), INTENT(IN) :: TPFILE +CLASS(TFIELDMETADATA), INTENT(INOUT) :: TPFIELD +LOGICAL, INTENT(INOUT) :: OFIELD ! array containing the data field +INTEGER, OPTIONAL, INTENT(OUT) :: KRESP ! return-code ! INTEGER :: IERR INTEGER :: IRESP @@ -1893,10 +1883,10 @@ SUBROUTINE IO_Field_read_byfield_L1(TPFILE,TPFIELD,OFIELD,KRESP) ! USE MODD_IO, ONLY: ISP, GSMONOPROC ! -TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD -LOGICAL,DIMENSION(:),INTENT(INOUT) :: OFIELD ! array containing the data field -INTEGER,OPTIONAL, INTENT(OUT) :: KRESP ! return-code +TYPE(TFILEDATA), INTENT(IN) :: TPFILE +CLASS(TFIELDMETADATA), INTENT(INOUT) :: TPFIELD +LOGICAL, DIMENSION(:), INTENT(INOUT) :: OFIELD ! array containing the data field +INTEGER, OPTIONAL, INTENT(OUT) :: KRESP ! return-code ! INTEGER :: IERR INTEGER :: IRESP @@ -1961,10 +1951,10 @@ SUBROUTINE IO_Field_read_byfield_C0(TPFILE,TPFIELD,HFIELD,KRESP) ! USE MODD_IO, ONLY: ISP, GSMONOPROC ! -TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD -CHARACTER(LEN=*), INTENT(INOUT) :: HFIELD ! array containing the data field -INTEGER,OPTIONAL, INTENT(OUT) :: KRESP ! return-code +TYPE(TFILEDATA), INTENT(IN) :: TPFILE +CLASS(TFIELDMETADATA), INTENT(INOUT) :: TPFIELD +CHARACTER(LEN=*), INTENT(INOUT) :: HFIELD ! array containing the data field +INTEGER, OPTIONAL, INTENT(OUT) :: KRESP ! return-code ! INTEGER :: IERR INTEGER :: IRESP @@ -2032,10 +2022,10 @@ SUBROUTINE IO_Field_read_byfield_T0(TPFILE,TPFIELD,TPDATA,KRESP) use modd_io, only: ISP, GSMONOPROC use modd_type_date, only: DATE_TIME ! -TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD -TYPE (DATE_TIME), INTENT(INOUT) :: TPDATA ! array containing the data field -INTEGER,OPTIONAL, INTENT(OUT) :: KRESP ! return-code +TYPE(TFILEDATA), INTENT(IN) :: TPFILE +CLASS(TFIELDMETADATA), INTENT(INOUT) :: TPFIELD +TYPE(DATE_TIME), INTENT(INOUT) :: TPDATA ! array containing the data field +INTEGER, OPTIONAL, INTENT(OUT) :: KRESP ! return-code ! INTEGER :: IERR INTEGER :: IRESP @@ -2118,12 +2108,12 @@ USE MODE_DISTRIB_lb USE MODE_MNH_TIMING, ONLY: SECOND_MNH2 USE MODE_TOOLS_ll, ONLY: GET_GLOBALDIMS_ll ! -TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD -INTEGER, INTENT(IN) :: KL3D ! size of the LB array in FM -INTEGER, INTENT(IN) :: KRIM ! size of the LB area -REAL, DIMENSION(:,:,:),TARGET, INTENT(INOUT) :: PLB ! array containing the LB field -INTEGER,OPTIONAL, INTENT(OUT) :: KRESP ! return-code +TYPE(TFILEDATA), INTENT(IN) :: TPFILE +CLASS(TFIELDMETADATA), INTENT(INOUT) :: TPFIELD +INTEGER, INTENT(IN) :: KL3D ! size of the LB array in FM +INTEGER, INTENT(IN) :: KRIM ! size of the LB area +REAL, DIMENSION(:,:,:) ,TARGET, INTENT(INOUT) :: PLB ! array containing the LB field +INTEGER,OPTIONAL, INTENT(OUT) :: KRESP ! return-code ! !* 0.2 Declarations of local variables ! @@ -2147,7 +2137,7 @@ real, dimension(:,:), pointer :: ZTX2DP REAL,DIMENSION(:,:,:), POINTER :: TX3DP REAL(kind=MNHTIME), DIMENSION(2) :: ZT0, ZT1, ZT2, ZT3 REAL(kind=MNHTIME), DIMENSION(2) :: ZT11, ZT22 -type(tfielddata) :: tzfield +class(tfieldmetadata), allocatable :: tzfield TYPE(TX_3DP),ALLOCATABLE,DIMENSION(:) :: T_TX3DP ! CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_Field_read_byfield_lb','reading '//TRIM(TPFIELD%CMNHNAME)) @@ -2175,8 +2165,8 @@ IF (IRESP==0) THEN IF (YLBTYPE == 'LBX' .OR. YLBTYPE == 'LBXU') THEN ALLOCATE(Z3D(KL3D,SIZE(PLB,2),SIZE(PLB,3))) IF (LPACK .AND. L2D) THEN + Allocate( tzfield, source = tpfield ) if ( tpfile%ldimreduced ) then - tzfield = tpfield tzfield%ndims = tzfield%ndims - 1 if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(2) = tzfield%ndimlist(3) @@ -2188,7 +2178,6 @@ IF (IRESP==0) THEN if ( glfi ) call IO_Field_read_lfi( tpfile, tzfield, ZTX2DP, iresp ) Z3D(:,:,:) = SPREAD(Z3D(:,JPHEXT+1,:),DIM=2,NCOPIES=IHEXTOT) else - tzfield = tpfield if ( tzfield%ndimlist(2) /= NMNHDIM_UNKNOWN ) tzfield%ndimlist(2) = NMNHDIM_ONE TX3DP=>Z3D(:,JPHEXT+1:JPHEXT+1,:) if ( gnc4 ) call IO_Field_read_nc4( tpfile, tzfield, tx3dp, iresp ) diff --git a/src/LIB/SURCOUCHE/src/mode_io_file.f90 b/src/LIB/SURCOUCHE/src/mode_io_file.f90 index 6ed3a03c255e7690965e101065a6892fee7c1d7c..663059f07193f44eb708c9ee48604c4460cddd2c 100644 --- a/src/LIB/SURCOUCHE/src/mode_io_file.f90 +++ b/src/LIB/SURCOUCHE/src/mode_io_file.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1994-2022 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1994-2023 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. @@ -39,6 +39,7 @@ ! P. Wautelet 05/09/2019: disable IO_Coordvar_write_nc4 for Z-split files ! P. Wautelet 01/10/2020: bugfix: add missing initializations for IRESP ! P. Wautelet 19/08/2022: bugfix: IO_File_check_format_exist: broadcast cformat if changed +! P. Wautelet 13/01/2023: IO_File_close: add optional dummy argument TPDTMODELN to force written model time !----------------------------------------------------------------- module mode_io_file @@ -492,10 +493,11 @@ END FUNCTION SUFFIX END SUBROUTINE IO_File_doopen -recursive SUBROUTINE IO_File_close(TPFILE,KRESP,HPROGRAM_ORIG) +recursive SUBROUTINE IO_File_close( TPFILE, KRESP, HPROGRAM_ORIG, TPDTMODELN ) ! use modd_conf, only: cprogram use modd_io, only: nnullunit +use modd_type_date, only: date_time use mode_io_file_lfi, only: IO_File_close_lfi #ifdef MNH_IOCDF4 @@ -507,7 +509,7 @@ use mode_io_manage_struct, only: IO_File_find_byname TYPE(TFILEDATA), INTENT(INOUT) :: TPFILE ! File structure INTEGER, OPTIONAL, INTENT(OUT) :: KRESP ! Return code CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: HPROGRAM_ORIG !To emulate a file coming from this program -! +TYPE(DATE_TIME), OPTIONAL, INTENT(IN) :: TPDTMODELN !Time of model (to force model date written in file) character(len=256) :: yioerrmsg INTEGER :: IRESP, JI TYPE(TFILEDATA),POINTER :: TZFILE_DES @@ -565,7 +567,7 @@ SELECT CASE(TPFILE%CTYPE) #ifdef MNH_IOCDF4 !Write coordinates variables in NetCDF file IF (TPFILE%CMODE == 'WRITE' .AND. (TPFILE%CFORMAT=='NETCDF4' .OR. TPFILE%CFORMAT=='LFICDF4')) THEN - CALL IO_Coordvar_write_nc4(TPFILE,HPROGRAM_ORIG=HPROGRAM_ORIG) + CALL IO_Coordvar_write_nc4( TPFILE, HPROGRAM_ORIG = HPROGRAM_ORIG, TPDTMODELN = TPDTMODELN ) END IF #endif diff --git a/src/LIB/SURCOUCHE/src/mode_io_manage_struct.f90 b/src/LIB/SURCOUCHE/src/mode_io_manage_struct.f90 index 60cf44de04d57ca5056621b06c3fda899d42bdb5..3174a29479d4e91b6db75697d80a5e850237eeb2 100644 --- a/src/LIB/SURCOUCHE/src/mode_io_manage_struct.f90 +++ b/src/LIB/SURCOUCHE/src/mode_io_manage_struct.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2016-2022 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2016-2023 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. @@ -20,7 +20,8 @@ ! S. Donnier 28/02/2020: type STREAM needed for use of ECOCLIMAP SG ! P. Wautelet 08/01/2021: allow output files with empty variable list (useful if IO_Field_user_write is not empty) ! P. Wautelet 18/03/2022: minor bugfix in ISTEP_MAX computation + adapt diagnostics messages - (change verbosity level and remove some unnecessary warnings) +! (change verbosity level and remove some unnecessary warnings) +! P. Wautelet 13/01/2023: set NMODEL field for backup and output files !----------------------------------------------------------------- MODULE MODE_IO_MANAGE_STRUCT ! @@ -213,8 +214,8 @@ DO IMI = 1, NMODEL ALLOCATE(OUT_MODEL(IMI)%TBACKUPN(IBAK_NUMB)) ALLOCATE(OUT_MODEL(IMI)%TOUTPUTN(IOUT_NUMB)) ! - CALL POPULATE_STRUCT(TFILE_FIRST,TFILE_LAST,IBAK_STEP,"MNHBACKUP",OUT_MODEL(IMI)%TBACKUPN) - CALL POPULATE_STRUCT(TFILE_FIRST,TFILE_LAST,IOUT_STEP,"MNHOUTPUT",OUT_MODEL(IMI)%TOUTPUTN) + CALL POPULATE_STRUCT(TFILE_FIRST,TFILE_LAST,IBAK_STEP,"MNHBACKUP",OUT_MODEL(IMI)%TBACKUPN,IMI) + CALL POPULATE_STRUCT(TFILE_FIRST,TFILE_LAST,IOUT_STEP,"MNHOUTPUT",OUT_MODEL(IMI)%TOUTPUTN,IMI) ! !* Find dad output number ! @@ -521,7 +522,7 @@ SUBROUTINE SORT_ENTRIES(KNUMB,KSTEPS) END SUBROUTINE SORT_ENTRIES ! !######################################################################### -SUBROUTINE POPULATE_STRUCT(TPFILE_FIRST,TPFILE_LAST,KSTEPS,HFILETYPE,TPBAKOUTN) +SUBROUTINE POPULATE_STRUCT(TPFILE_FIRST,TPFILE_LAST,KSTEPS,HFILETYPE,TPBAKOUTN,KMI) !######################################################################### ! USE MODD_CONFZ, ONLY: NB_PROCIO_W @@ -530,6 +531,7 @@ SUBROUTINE POPULATE_STRUCT(TPFILE_FIRST,TPFILE_LAST,KSTEPS,HFILETYPE,TPBAKOUTN) INTEGER,DIMENSION(:), INTENT(IN) :: KSTEPS CHARACTER(LEN=*), INTENT(IN) :: HFILETYPE TYPE(TOUTBAK),DIMENSION(:),POINTER,INTENT(IN) :: TPBAKOUTN + INTEGER, INTENT(IN) :: KMI ! Model number ! CHARACTER (LEN=3) :: YNUMBER ! Character string for the file number INTEGER :: JI @@ -601,6 +603,8 @@ SUBROUTINE POPULATE_STRUCT(TPFILE_FIRST,TPFILE_LAST,KSTEPS,HFILETYPE,TPBAKOUTN) CALL PRINT_MSG(NVERB_FATAL,'IO','POPULATE_STRUCT','unknown backup/output fileformat') ENDIF ! + TPBAKOUTN(IPOS)%TFILE%NMODEL = KMI + ! !Create file structures if Z-split files IF (NB_PROCIO_W>1) THEN TPBAKOUTN(IPOS)%TFILE%NSUBFILES_IOZ = NB_PROCIO_W diff --git a/src/LIB/SURCOUCHE/src/mode_io_read_lfi.f90 b/src/LIB/SURCOUCHE/src/mode_io_read_lfi.f90 index f98999c1ea643987e3825b791b28d30d41a151fa..66aab0cef714eb2a2df0802e5d4585e040d8727e 100644 --- a/src/LIB/SURCOUCHE/src/mode_io_read_lfi.f90 +++ b/src/LIB/SURCOUCHE/src/mode_io_read_lfi.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1994-2020 CNRS, Meteo-France and Universite Paul Sabatier +!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. @@ -13,7 +13,7 @@ !----------------------------------------------------------------- module mode_io_read_lfi ! -use modd_field, only: tfielddata +use modd_field, only: tfieldmetadata_base USE MODD_IO USE MODD_PARAMETERS, ONLY: NLFIMAXCOMMENTLENGTH use modd_precision, only: LFIINT, MNHINT64, MNHREAL32, MNHREAL64 @@ -50,10 +50,10 @@ IMPLICIT NONE ! !* 0.1 Declarations of arguments ! -TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD -REAL, INTENT(INOUT) :: PFIELD ! array containing the data field -INTEGER, INTENT(OUT) :: KRESP ! return-code if problems occured +TYPE(TFILEDATA), INTENT(IN) :: TPFILE +CLASS(tfieldmetadata_base), INTENT(INOUT) :: TPFIELD +REAL, INTENT(INOUT) :: PFIELD ! array containing the data field +INTEGER, INTENT(OUT) :: KRESP ! return-code if problems occured ! !* 0.2 Declarations of local variables ! @@ -89,10 +89,10 @@ IMPLICIT NONE ! !* 0.1 Declarations of arguments ! -TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD -REAL,DIMENSION(:),INTENT(INOUT) :: PFIELD ! array containing the data field -INTEGER, INTENT(OUT) :: KRESP ! return-code if problems occured +TYPE(TFILEDATA), INTENT(IN) :: TPFILE +CLASS(tfieldmetadata_base), INTENT(INOUT) :: TPFIELD +REAL, DIMENSION(:), INTENT(INOUT) :: PFIELD ! array containing the data field +INTEGER, INTENT(OUT) :: KRESP ! return-code if problems occured ! !* 0.2 Declarations of local variables ! @@ -123,10 +123,10 @@ IMPLICIT NONE ! !* 0.1 Declarations of arguments ! -TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD -REAL,DIMENSION(:,:),INTENT(INOUT) :: PFIELD ! array containing the data field -INTEGER, INTENT(OUT) :: KRESP ! return-code if problems occured +TYPE(TFILEDATA), INTENT(IN) :: TPFILE +CLASS(tfieldmetadata_base), INTENT(INOUT) :: TPFIELD +REAL, DIMENSION(:,:), INTENT(INOUT) :: PFIELD ! array containing the data field +INTEGER, INTENT(OUT) :: KRESP ! return-code if problems occured ! !* 0.2 Declarations of local variables ! @@ -157,10 +157,10 @@ IMPLICIT NONE ! !* 0.1 Declarations of arguments ! -TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD -REAL,DIMENSION(:,:,:),INTENT(INOUT) :: PFIELD ! array containing the data field -INTEGER, INTENT(OUT) :: KRESP ! return-code if problems occured +TYPE(TFILEDATA), INTENT(IN) :: TPFILE +CLASS(tfieldmetadata_base), INTENT(INOUT) :: TPFIELD +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PFIELD ! array containing the data field +INTEGER, INTENT(OUT) :: KRESP ! return-code if problems occured ! !* 0.2 Declarations of local variables ! @@ -191,10 +191,10 @@ IMPLICIT NONE ! !* 0.1 Declarations of arguments ! -TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD -REAL,DIMENSION(:,:,:,:),INTENT(INOUT) :: PFIELD ! array containing the data field -INTEGER, INTENT(OUT) :: KRESP ! return-code if problems occured +TYPE(TFILEDATA), INTENT(IN) :: TPFILE +CLASS(tfieldmetadata_base), INTENT(INOUT) :: TPFIELD +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PFIELD ! array containing the data field +INTEGER, INTENT(OUT) :: KRESP ! return-code if problems occured ! !* 0.2 Declarations of local variables ! @@ -225,10 +225,10 @@ IMPLICIT NONE ! !* 0.1 Declarations of arguments ! -TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD -REAL,DIMENSION(:,:,:,:,:),INTENT(INOUT) :: PFIELD ! array containing the data field -INTEGER, INTENT(OUT) :: KRESP ! return-code if problems occured +TYPE(TFILEDATA), INTENT(IN) :: TPFILE +CLASS(tfieldmetadata_base), INTENT(INOUT) :: TPFIELD +REAL ,DIMENSION(:,:,:,:,:), INTENT(INOUT) :: PFIELD ! array containing the data field +INTEGER, INTENT(OUT) :: KRESP ! return-code if problems occured ! !* 0.2 Declarations of local variables ! @@ -259,10 +259,10 @@ IMPLICIT NONE ! !* 0.1 Declarations of arguments ! -TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD -REAL,DIMENSION(:,:,:,:,:,:),INTENT(INOUT) :: PFIELD ! array containing the data field -INTEGER, INTENT(OUT) :: KRESP ! return-code if problems occured +TYPE(TFILEDATA), INTENT(IN) :: TPFILE +CLASS(tfieldmetadata_base), INTENT(INOUT) :: TPFIELD +REAL, DIMENSION(:,:,:,:,:,:), INTENT(INOUT) :: PFIELD ! array containing the data field +INTEGER, INTENT(OUT) :: KRESP ! return-code if problems occured ! !* 0.2 Declarations of local variables ! @@ -293,10 +293,10 @@ IMPLICIT NONE ! !* 0.1 Declarations of arguments ! -TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA),INTENT(INOUT) :: TPFIELD -INTEGER, INTENT(INOUT) :: KFIELD ! array containing the data field -INTEGER, INTENT(OUT) :: KRESP ! return-code if problems occured +TYPE(TFILEDATA), INTENT(IN) :: TPFILE +CLASS(tfieldmetadata_base), INTENT(INOUT) :: TPFIELD +INTEGER, INTENT(INOUT) :: KFIELD ! array containing the data field +INTEGER, INTENT(OUT) :: KRESP ! return-code if problems occured ! !* 0.2 Declarations of local variables ! @@ -327,10 +327,10 @@ IMPLICIT NONE ! !* 0.1 Declarations of arguments ! -TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD -INTEGER,DIMENSION(:),INTENT(INOUT) :: KFIELD ! array containing the data field -INTEGER, INTENT(OUT) :: KRESP ! return-code if problems occured +TYPE(TFILEDATA), INTENT(IN) :: TPFILE +CLASS(tfieldmetadata_base), INTENT(INOUT) :: TPFIELD +INTEGER, DIMENSION(:), INTENT(INOUT) :: KFIELD ! array containing the data field +INTEGER, INTENT(OUT) :: KRESP ! return-code if problems occured ! !* 0.2 Declarations of local variables ! @@ -361,10 +361,10 @@ IMPLICIT NONE ! !* 0.1 Declarations of arguments ! -TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD -INTEGER,DIMENSION(:,:),INTENT(INOUT) :: KFIELD ! array containing the data field -INTEGER, INTENT(OUT) :: KRESP ! return-code if problems occured +TYPE(TFILEDATA), INTENT(IN) :: TPFILE +CLASS(tfieldmetadata_base), INTENT(INOUT) :: TPFIELD +INTEGER, DIMENSION(:,:), INTENT(INOUT) :: KFIELD ! array containing the data field +INTEGER, INTENT(OUT) :: KRESP ! return-code if problems occured ! !* 0.2 Declarations of local variables ! @@ -395,10 +395,10 @@ IMPLICIT NONE ! !* 0.1 Declarations of arguments ! -TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD -INTEGER,DIMENSION(:,:,:),INTENT(INOUT) :: KFIELD ! array containing the data field -INTEGER, INTENT(OUT) :: KRESP ! return-code if problems occured +TYPE(TFILEDATA), INTENT(IN) :: TPFILE +CLASS(tfieldmetadata_base), INTENT(INOUT) :: TPFIELD +INTEGER, DIMENSION(:,:,:), INTENT(INOUT) :: KFIELD ! array containing the data field +INTEGER, INTENT(OUT) :: KRESP ! return-code if problems occured ! !* 0.2 Declarations of local variables ! @@ -429,10 +429,10 @@ IMPLICIT NONE ! !* 0.1 Declarations of arguments ! -TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA),INTENT(INOUT) :: TPFIELD -LOGICAL, INTENT(INOUT) :: OFIELD ! array containing the data field -INTEGER, INTENT(OUT) :: KRESP ! return-code if problems occured +TYPE(TFILEDATA), INTENT(IN) :: TPFILE +CLASS(tfieldmetadata_base), INTENT(INOUT) :: TPFIELD +LOGICAL, INTENT(INOUT) :: OFIELD ! array containing the data field +INTEGER, INTENT(OUT) :: KRESP ! return-code if problems occured ! !* 0.2 Declarations of local variables ! @@ -476,10 +476,10 @@ IMPLICIT NONE ! !* 0.1 Declarations of arguments ! -TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD -LOGICAL,DIMENSION(:),INTENT(INOUT) :: OFIELD ! array containing the data field -INTEGER, INTENT(OUT) :: KRESP ! return-code if problems occured +TYPE(TFILEDATA), INTENT(IN) :: TPFILE +CLASS(tfieldmetadata_base), INTENT(INOUT) :: TPFIELD +LOGICAL, DIMENSION(:), INTENT(INOUT) :: OFIELD ! array containing the data field +INTEGER, INTENT(OUT) :: KRESP ! return-code if problems occured ! !* 0.2 Declarations of local variables ! @@ -531,10 +531,10 @@ IMPLICIT NONE ! !* 0.1 Declarations of arguments ! -TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA),INTENT(INOUT) :: TPFIELD -CHARACTER(LEN=*),INTENT(INOUT) :: HFIELD ! array containing the data field -INTEGER, INTENT(OUT) :: KRESP ! return-code if problems occured +TYPE(TFILEDATA), INTENT(IN) :: TPFILE +CLASS(tfieldmetadata_base), INTENT(INOUT) :: TPFIELD +CHARACTER(LEN=*), INTENT(INOUT) :: HFIELD ! array containing the data field +INTEGER, INTENT(OUT) :: KRESP ! return-code if problems occured ! !* 0.2 Declarations of local variables ! @@ -581,10 +581,10 @@ IMPLICIT NONE ! !* 0.1 Declarations of arguments ! -TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA),INTENT(INOUT) :: TPFIELD -TYPE (DATE_TIME),INTENT(INOUT) :: TPDATA ! array containing the data field -INTEGER, INTENT(OUT) :: KRESP ! return-code if problems occured +TYPE(TFILEDATA), INTENT(IN) :: TPFILE +CLASS(tfieldmetadata_base), INTENT(INOUT) :: TPFIELD +TYPE (DATE_TIME), INTENT(INOUT) :: TPDATA ! array containing the data field +INTEGER, INTENT(OUT) :: KRESP ! return-code if problems occured ! !* 0.2 Declarations of local variables ! @@ -592,7 +592,7 @@ INTEGER(KIND=LFIINT) :: IRESP, ITOTAL INTEGER :: ILENG INTEGER(KIND=MNHINT64),DIMENSION(:),ALLOCATABLE :: IWORK LOGICAL :: GGOOD -TYPE(TFIELDDATA) :: TZFIELD +TYPE(tfieldmetadata_base) :: TZFIELD INTEGER, DIMENSION(3) :: ITDATE ! date array REAL,DIMENSION(1) :: ZTIME ! @@ -649,7 +649,7 @@ SUBROUTINE IO_Field_read_check_lfi(TPFILE,TPFIELD,KLENG,KWORK,KTOTAL,KRESP,OGOOD USE MODD_PARAMETERS, ONLY: NGRIDUNKNOWN ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD +CLASS(tfieldmetadata_base), INTENT(INOUT) :: TPFIELD INTEGER, INTENT(IN) :: KLENG INTEGER(KIND=MNHINT64),DIMENSION(:),ALLOCATABLE,INTENT(OUT) :: KWORK INTEGER(KIND=LFIINT), INTENT(OUT) :: KTOTAL diff --git a/src/LIB/SURCOUCHE/src/mode_io_read_nc4.f90 b/src/LIB/SURCOUCHE/src/mode_io_read_nc4.f90 index a257e66b8cdd31e21396959c0d72217ae4a3a615..8c68aeaf9138cd9e6b8c606d9c392ca1cbee87c3 100644 --- a/src/LIB/SURCOUCHE/src/mode_io_read_nc4.f90 +++ b/src/LIB/SURCOUCHE/src/mode_io_read_nc4.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1994-2022 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. @@ -17,7 +17,7 @@ #ifdef MNH_IOCDF4 module mode_io_read_nc4 -use modd_field, only: tfielddata +use modd_field, only: tfieldmetadata, tfieldmetadata_base use modd_io, only: tfiledata use modd_precision, only: CDFINT @@ -53,11 +53,11 @@ SUBROUTINE IO_Field_attr_read_check_nc4(TPFILE,TPFIELD,KVARID,KRESP,HCALENDAR) ! USE MODD_PARAMETERS, ONLY: NGRIDUNKNOWN ! -TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD -INTEGER(KIND=CDFINT), INTENT(IN) :: KVARID -INTEGER, INTENT(OUT) :: KRESP ! return-code -CHARACTER(LEN=*),OPTIONAL,INTENT(IN) :: HCALENDAR +TYPE(TFILEDATA), INTENT(IN) :: TPFILE +CLASS(tfieldmetadata_base), INTENT(INOUT) :: TPFIELD +INTEGER(KIND=CDFINT), INTENT(IN) :: KVARID +INTEGER, INTENT(OUT) :: KRESP ! return-code +CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: HCALENDAR ! INTEGER :: IERRLEVEL INTEGER :: IGRID @@ -204,10 +204,20 @@ IF (istatus == NF90_NOERR) THEN istatus = NF90_GET_ATT(INCID, KVARID, 'units', YVALUE) IF (TRIM(YVALUE)/=TRIM(TPFIELD%CUNITS)) THEN IF(.NOT.PRESENT(HCALENDAR)) THEN - CALL PRINT_MSG(NVERB_WARNING,'IO','IO_Field_attr_read_check_nc4',TRIM(TPFILE%CNAME)// & - ': expected UNITS ('//TRIM(TPFIELD%CUNITS)// & - ') is different than found ('//TRIM(YVALUE)//') in file for field '//TRIM(TPFIELD%CMNHNAME)) - KRESP = -111 !Used later to broadcast modified metadata + if ( Trim( tpfield%cunits ) == 'ppv' .and. Trim( yvalue ) == 'ppp' ) then + ! 'ppp' (non-existing unit) was used in old Meso-NH files (before 5.5.1 version) instead of 'ppv' + CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_Field_attr_read_check_nc4',TRIM(TPFILE%CNAME)// & + ': expected UNITS found in file for field '//TRIM(TPFIELD%CMNHNAME)) + else if ( Trim( tpfield%cunits ) == 'ppb' .and. Trim( yvalue ) == 'ppbv' ) then + ! 'ppbv' was used in old Meso-NH files (before 5.5.1 version). It is strictly equivalent to 'ppb' + CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_Field_attr_read_check_nc4',TRIM(TPFILE%CNAME)// & + ': expected UNITS found in file for field '//TRIM(TPFIELD%CMNHNAME)) + else + CALL PRINT_MSG(NVERB_WARNING,'IO','IO_Field_attr_read_check_nc4',TRIM(TPFILE%CNAME)// & + ': expected UNITS ('//TRIM(TPFIELD%CUNITS)// & + ') is different than found ('//TRIM(YVALUE)//') in file for field '//TRIM(TPFIELD%CMNHNAME)) + KRESP = -111 !Used later to broadcast modified metadata + end if ELSE CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_Field_attr_read_check_nc4',TRIM(TPFILE%CNAME)// & ': UNITS found in file for field '//TRIM(TPFIELD%CMNHNAME)//' (will be analysed later)') @@ -260,10 +270,10 @@ END SUBROUTINE IO_Field_attr_read_check_nc4 SUBROUTINE IO_Field_read_nc4_X0(TPFILE, TPFIELD, PFIELD, KRESP) -TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD -REAL, INTENT(INOUT) :: PFIELD -INTEGER, INTENT(OUT) :: KRESP ! return-code +TYPE(TFILEDATA), INTENT(IN) :: TPFILE +CLASS(tfieldmetadata), INTENT(INOUT) :: TPFIELD +REAL, INTENT(INOUT) :: PFIELD +INTEGER, INTENT(OUT) :: KRESP ! return-code INTEGER(KIND=CDFINT) :: istatus INTEGER(KIND=CDFINT) :: INCID @@ -315,10 +325,10 @@ END SUBROUTINE IO_Field_read_nc4_X0 SUBROUTINE IO_Field_read_nc4_X1(TPFILE, TPFIELD, PFIELD, KRESP) -TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD -REAL,DIMENSION(:),INTENT(INOUT) :: PFIELD -INTEGER, INTENT(OUT) :: KRESP ! return-code +TYPE(TFILEDATA), INTENT(IN) :: TPFILE +CLASS(tfieldmetadata), INTENT(INOUT) :: TPFIELD +REAL, DIMENSION(:), INTENT(INOUT) :: PFIELD +INTEGER, INTENT(OUT) :: KRESP ! return-code INTEGER(KIND=CDFINT) :: istatus INTEGER(KIND=CDFINT) :: INCID @@ -382,10 +392,10 @@ END SUBROUTINE IO_Field_read_nc4_X1 SUBROUTINE IO_Field_read_nc4_X2(TPFILE, TPFIELD, PFIELD, KRESP) -TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD -REAL,DIMENSION(:,:),INTENT(INOUT) :: PFIELD -INTEGER, INTENT(OUT) :: KRESP ! return-code +TYPE(TFILEDATA), INTENT(IN) :: TPFILE +CLASS(tfieldmetadata), INTENT(INOUT) :: TPFIELD +REAL, DIMENSION(:,:), INTENT(INOUT) :: PFIELD +INTEGER, INTENT(OUT) :: KRESP ! return-code INTEGER(KIND=CDFINT) :: istatus INTEGER(KIND=CDFINT) :: INCID @@ -464,10 +474,10 @@ END SUBROUTINE IO_Field_read_nc4_X2 SUBROUTINE IO_Field_read_nc4_X3(TPFILE, TPFIELD, PFIELD, KRESP) -TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD -REAL,DIMENSION(:,:,:),INTENT(INOUT) :: PFIELD -INTEGER, INTENT(OUT) :: KRESP ! return-code +TYPE(TFILEDATA), INTENT(IN) :: TPFILE +CLASS(tfieldmetadata), INTENT(INOUT) :: TPFIELD +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PFIELD +INTEGER, INTENT(OUT) :: KRESP ! return-code INTEGER(KIND=CDFINT) :: istatus INTEGER(KIND=CDFINT) :: INCID @@ -536,7 +546,7 @@ END SUBROUTINE IO_Field_read_nc4_X3 SUBROUTINE IO_Field_read_nc4_X4(TPFILE, TPFIELD, PFIELD, KRESP) TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD +CLASS(tfieldmetadata), INTENT(INOUT) :: TPFIELD REAL,DIMENSION(:,:,:,:),INTENT(INOUT) :: PFIELD INTEGER, INTENT(OUT) :: KRESP ! return-code @@ -610,7 +620,7 @@ END SUBROUTINE IO_Field_read_nc4_X4 SUBROUTINE IO_Field_read_nc4_X5(TPFILE, TPFIELD, PFIELD, KRESP) TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD +CLASS(tfieldmetadata), INTENT(INOUT) :: TPFIELD REAL,DIMENSION(:,:,:,:,:),INTENT(INOUT) :: PFIELD INTEGER, INTENT(OUT) :: KRESP ! return-code @@ -687,7 +697,7 @@ END SUBROUTINE IO_Field_read_nc4_X5 SUBROUTINE IO_Field_read_nc4_X6(TPFILE, TPFIELD, PFIELD, KRESP) TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD +CLASS(tfieldmetadata), INTENT(INOUT) :: TPFIELD REAL,DIMENSION(:,:,:,:,:,:),INTENT(INOUT) :: PFIELD INTEGER, INTENT(OUT) :: KRESP ! return-code @@ -765,10 +775,10 @@ END SUBROUTINE IO_Field_read_nc4_X6 SUBROUTINE IO_Field_read_nc4_N0(TPFILE, TPFIELD, KFIELD, KRESP) -TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD -INTEGER, INTENT(INOUT) :: KFIELD -INTEGER, INTENT(OUT) :: KRESP ! return-code +TYPE(TFILEDATA), INTENT(IN) :: TPFILE +CLASS(tfieldmetadata), INTENT(INOUT) :: TPFIELD +INTEGER, INTENT(INOUT) :: KFIELD +INTEGER, INTENT(OUT) :: KRESP ! return-code INTEGER(KIND=CDFINT) :: istatus INTEGER(KIND=CDFINT) :: INCID @@ -822,7 +832,7 @@ END SUBROUTINE IO_Field_read_nc4_N0 SUBROUTINE IO_Field_read_nc4_N1(TPFILE, TPFIELD, KFIELD, KRESP) TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD +CLASS(tfieldmetadata), INTENT(INOUT) :: TPFIELD INTEGER, DIMENSION(:), INTENT(INOUT) :: KFIELD INTEGER, INTENT(OUT) :: KRESP ! return-code @@ -890,7 +900,7 @@ END SUBROUTINE IO_Field_read_nc4_N1 SUBROUTINE IO_Field_read_nc4_N2(TPFILE, TPFIELD, KFIELD, KRESP) TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD +CLASS(tfieldmetadata), INTENT(INOUT) :: TPFIELD INTEGER, DIMENSION(:,:), INTENT(INOUT) :: KFIELD INTEGER, INTENT(OUT) :: KRESP ! return-code @@ -972,7 +982,7 @@ END SUBROUTINE IO_Field_read_nc4_N2 SUBROUTINE IO_Field_read_nc4_N3(TPFILE, TPFIELD, KFIELD, KRESP) TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD +CLASS(tfieldmetadata), INTENT(INOUT) :: TPFIELD INTEGER, DIMENSION(:,:,:), INTENT(INOUT) :: KFIELD INTEGER, INTENT(OUT) :: KRESP ! return-code @@ -1042,10 +1052,10 @@ KRESP = IRESP END SUBROUTINE IO_Field_read_nc4_N3 SUBROUTINE IO_Field_read_nc4_L0(TPFILE, TPFIELD, OFIELD, KRESP) -TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD -LOGICAL, INTENT(INOUT) :: OFIELD -INTEGER, INTENT(OUT) :: KRESP ! return-code +TYPE(TFILEDATA), INTENT(IN) :: TPFILE +CLASS(tfieldmetadata), INTENT(INOUT) :: TPFIELD +LOGICAL, INTENT(INOUT) :: OFIELD +INTEGER, INTENT(OUT) :: KRESP ! return-code INTEGER(KIND=CDFINT) :: istatus INTEGER(KIND=CDFINT) :: INCID @@ -1112,10 +1122,10 @@ END SUBROUTINE IO_Field_read_nc4_L0 SUBROUTINE IO_Field_read_nc4_L1(TPFILE, TPFIELD, OFIELD, KRESP) -TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD -LOGICAL,DIMENSION(:),INTENT(INOUT) :: OFIELD -INTEGER, INTENT(OUT) :: KRESP ! return-code +TYPE(TFILEDATA), INTENT(IN) :: TPFILE +CLASS(tfieldmetadata), INTENT(INOUT) :: TPFIELD +LOGICAL, DIMENSION(:), INTENT(INOUT) :: OFIELD +INTEGER, INTENT(OUT) :: KRESP ! return-code INTEGER(KIND=CDFINT) :: istatus INTEGER(KIND=CDFINT) :: INCID @@ -1199,10 +1209,10 @@ END SUBROUTINE IO_Field_read_nc4_L1 SUBROUTINE IO_Field_read_nc4_C0(TPFILE, TPFIELD, HFIELD, KRESP) -TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD -CHARACTER(LEN=*), INTENT(INOUT) :: HFIELD -INTEGER, INTENT(OUT) :: KRESP ! return-code +TYPE(TFILEDATA), INTENT(IN) :: TPFILE +CLASS(tfieldmetadata), INTENT(INOUT) :: TPFIELD +CHARACTER(LEN=*), INTENT(INOUT) :: HFIELD +INTEGER, INTENT(OUT) :: KRESP ! return-code INTEGER(KIND=CDFINT) :: istatus INTEGER(KIND=CDFINT) :: INCID @@ -1268,10 +1278,10 @@ USE MODD_TYPE_DATE ! USE MODE_DATETIME ! -TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD -TYPE (DATE_TIME), INTENT(INOUT) :: TPDATA -INTEGER, INTENT(OUT) :: KRESP ! return-code +TYPE(TFILEDATA), INTENT(IN) :: TPFILE +CLASS(tfieldmetadata), INTENT(INOUT) :: TPFIELD +TYPE (DATE_TIME), INTENT(INOUT) :: TPDATA +INTEGER, INTENT(OUT) :: KRESP ! return-code INTEGER(KIND=CDFINT) :: istatus INTEGER(KIND=CDFINT) :: INCID diff --git a/src/LIB/SURCOUCHE/src/mode_io_tools.f90 b/src/LIB/SURCOUCHE/src/mode_io_tools.f90 index 42236655f7c00e3db69c6574f122cc343db0ff7e..7346177c4e2f279187f3fff07a14278abe835127 100644 --- a/src/LIB/SURCOUCHE/src/mode_io_tools.f90 +++ b/src/LIB/SURCOUCHE/src/mode_io_tools.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1994-2020 CNRS, Meteo-France and Universite Paul Sabatier +!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. @@ -103,7 +103,7 @@ contains subroutine IO_Mnhversion_get(tpfile) !Compare MNHVERSION of file with current version and store it in file metadata use modd_conf, only: nmnhversion - use modd_field, only: tfielddata, TYPEINT + use modd_field, only: tfieldmetadata, TYPEINT use mode_io_field_read, only: IO_Field_read @@ -113,7 +113,7 @@ subroutine IO_Mnhversion_get(tpfile) integer :: imasdev,ibugfix integer :: iresp integer,dimension(3) :: imnhversion - type(tfielddata) :: tzfield + type(tfieldmetadata) :: tzfield call print_msg(NVERB_DEBUG,'IO','IO_Mnhversion_get','called for '//trim(tpfile%cname)) @@ -123,16 +123,17 @@ subroutine IO_Mnhversion_get(tpfile) if ( .not. associated( tpfile%tmainfile ) ) then imnhversion(:) = 0 !use tzfield because tfieldlist could be not initialised - tzfield%cmnhname = 'MNHVERSION' - tzfield%cstdname = '' - tzfield%clongname = 'MesoNH version' - tzfield%cunits = '' - tzfield%cdir = '--' - tzfield%ccomment = '' - tzfield%ngrid = 0 - tzfield%ntype = TYPEINT - tzfield%ndims = 1 - tzfield%ltimedep = .false. + tzfield = tfieldmetadata( & + cmnhname = 'MNHVERSION', & + cstdname = '', & + clongname = 'MesoNH version', & + cunits = '', & + cdir = '--', & + ccomment = '', & + ngrid = 0, & + ntype = TYPEINT, & + ndims = 1, & + ltimedep = .false. ) call IO_Field_read(tpfile,tzfield,imnhversion,iresp) if (iresp/=0) then tzfield%cmnhname = 'MASDEV' diff --git a/src/LIB/SURCOUCHE/src/mode_io_tools_nc4.f90 b/src/LIB/SURCOUCHE/src/mode_io_tools_nc4.f90 index b436b0d18cf7763e6d5cdfc213050d36ec6cfec5..cca90579e8ec98c90038b827ceccaa9cd5bddf56 100644 --- a/src/LIB/SURCOUCHE/src/mode_io_tools_nc4.f90 +++ b/src/LIB/SURCOUCHE/src/mode_io_tools_nc4.f90 @@ -24,7 +24,7 @@ #ifdef MNH_IOCDF4 module mode_io_tools_nc4 -use modd_field, only: tfielddata +use modd_field, only: tfieldmetadata use modd_io, only: tfiledata use modd_netcdf, only: tdimnc, tdimsnc use modd_precision, only: CDFINT @@ -85,7 +85,7 @@ USE MODD_FIELD, ONLY: NMNHDIM_ARAKAWA, TYPECHAR ! !Used by LFI2CDF TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD +CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD INTEGER, INTENT(IN) :: KLEN TYPE(tdimnc),DIMENSION(:), INTENT(OUT) :: TPDIMS INTEGER, INTENT(OUT) :: KRESP @@ -276,11 +276,11 @@ use modd_les_n, only: nles_times, nspectra_ni, nspectra_nj use modd_nsv, only: nsv USE MODD_PARAMETERS_ll, ONLY: JPHEXT, JPVEXT use modd_param_n, only: crad -use modd_profiler_n, only: numbprofiler, tprofiler +use modd_profiler_n, only: lprofiler, tprofilers_time use modd_radiations_n, only: nlwb_mnh, nswb_mnh use modd_series, only: lseries use modd_series_n, only: nsnbstept -use modd_station_n, only: numbstat, tstation +use modd_station_n, only: lstation, tstations_time TYPE(TFILEDATA),INTENT(INOUT) :: TPFILE CHARACTER(LEN=*),OPTIONAL,INTENT(IN) :: HPROGRAM_ORIG !To emulate a file coming from this program @@ -420,14 +420,14 @@ if ( tpfile%ctype == 'MNHDIACHRONIC' ) then if ( nspectra_k > 0 ) call IO_Add_dim_nc4( tpfile, NMNHDIM_SPECTRA_LEVEL, 'nspectra_level', nspectra_k ) !Dimension for the number of profiler times - if ( numbprofiler > 0 ) then - iprof = Nint ( ( xseglen - dyn_model(1)%xtstep ) / tprofiler%step ) + 1 + if ( lprofiler ) then + iprof = Nint ( ( xseglen - dyn_model(1)%xtstep ) / tprofilers_time%xtstep ) + 1 call IO_Add_dim_nc4( tpfile, NMNHDIM_PROFILER_TIME, 'time_profiler', iprof ) end if !Dimension for the number of station times - if ( numbstat > 0 ) then - istation = Nint ( ( xseglen - dyn_model(1)%xtstep ) / tstation%step ) + 1 + if ( lstation ) then + istation = Nint ( ( xseglen - dyn_model(1)%xtstep ) / tstations_time%xtstep ) + 1 call IO_Add_dim_nc4( tpfile, NMNHDIM_STATION_TIME, 'time_station', istation ) end if @@ -515,7 +515,7 @@ use modd_field, only: NMNHDIM_UNKNOWN, NMNHDIM_ONE, NMNHDIM_COMPLEX, NMNHDIM_NOTLISTED, NMNHDIM_UNUSED, NMNHDIM_ARAKAWA TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD +CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD INTEGER(KIND=CDFINT),DIMENSION(:), INTENT(IN) :: KSHAPE INTEGER(KIND=CDFINT),DIMENSION(:),ALLOCATABLE,INTENT(OUT) :: KVDIMS ! diff --git a/src/LIB/SURCOUCHE/src/mode_io_write_lfi.f90 b/src/LIB/SURCOUCHE/src/mode_io_write_lfi.f90 index 430f06ccfed1c5d64d8daeec50f95164be6d1ed7..588ac539b516d2093b296b3d97b9d3312302d30f 100644 --- a/src/LIB/SURCOUCHE/src/mode_io_write_lfi.f90 +++ b/src/LIB/SURCOUCHE/src/mode_io_write_lfi.f90 @@ -14,7 +14,7 @@ !----------------------------------------------------------------- module mode_io_write_lfi ! -use modd_field, only: tfielddata +use modd_field, only: tfieldmetadata_base USE MODD_IO USE MODD_PARAMETERS, ONLY: NLFIMAXCOMMENTLENGTH use modd_precision, only: LFIINT, MNHINT64, MNHREAL64 @@ -53,7 +53,7 @@ IMPLICIT NONE !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD +CLASS(tfieldmetadata_base), INTENT(IN) :: TPFIELD REAL, INTENT(IN) :: PFIELD ! array containing the data field INTEGER, INTENT(OUT):: KRESP ! return-code if problems araised ! @@ -92,7 +92,7 @@ IMPLICIT NONE !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD +CLASS(tfieldmetadata_base), INTENT(IN) :: TPFIELD REAL,DIMENSION(:), INTENT(IN) :: PFIELD ! array containing the data field INTEGER, INTENT(OUT):: KRESP ! return-code if problems araised ! @@ -137,7 +137,7 @@ IMPLICIT NONE !* 0.1 Declarations of arguments ! TYPE(TFILEDATA),TARGET,INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD +CLASS(tfieldmetadata_base), INTENT(IN) :: TPFIELD REAL,DIMENSION(:,:), INTENT(IN) :: PFIELD ! array containing the data field INTEGER, INTENT(OUT):: KRESP ! return-code if problems araised INTEGER,OPTIONAL, INTENT(IN) :: KVERTLEVEL ! Number of the vertical level (needed for Z-level split files) @@ -203,7 +203,7 @@ IMPLICIT NONE !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD +CLASS(tfieldmetadata_base), INTENT(IN) :: TPFIELD REAL,DIMENSION(:,:,:), INTENT(IN) :: PFIELD ! array containing the data field INTEGER, INTENT(OUT):: KRESP ! return-code if problems araised ! @@ -248,7 +248,7 @@ IMPLICIT NONE !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD +CLASS(tfieldmetadata_base), INTENT(IN) :: TPFIELD REAL,DIMENSION(:,:,:,:), INTENT(IN) :: PFIELD ! array containing the data field INTEGER, INTENT(OUT):: KRESP ! return-code if problems araised ! @@ -293,7 +293,7 @@ IMPLICIT NONE !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD +CLASS(tfieldmetadata_base), INTENT(IN) :: TPFIELD REAL,DIMENSION(:,:,:,:,:),INTENT(IN) :: PFIELD ! array containing the data field INTEGER, INTENT(OUT):: KRESP ! return-code if problems araised ! @@ -338,7 +338,7 @@ IMPLICIT NONE !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD +CLASS(tfieldmetadata_base), INTENT(IN) :: TPFIELD REAL,DIMENSION(:,:,:,:,:,:),INTENT(IN) :: PFIELD ! array containing the data field INTEGER, INTENT(OUT):: KRESP ! return-code if problems araised ! @@ -383,7 +383,7 @@ IMPLICIT NONE !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD +CLASS(tfieldmetadata_base), INTENT(IN) :: TPFIELD INTEGER, INTENT(IN) :: KFIELD ! array containing the data field INTEGER, INTENT(OUT):: KRESP ! return-code if problems araised ! @@ -422,7 +422,7 @@ IMPLICIT NONE !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD +CLASS(tfieldmetadata_base), INTENT(IN) :: TPFIELD INTEGER,DIMENSION(:), INTENT(IN) :: KFIELD ! array containing the data field INTEGER, INTENT(OUT):: KRESP ! return-code if problems araised ! @@ -467,7 +467,7 @@ IMPLICIT NONE !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD +CLASS(tfieldmetadata_base), INTENT(IN) :: TPFIELD INTEGER,DIMENSION(:,:),INTENT(IN) :: KFIELD ! array containing the data field INTEGER, INTENT(OUT):: KRESP ! return-code if problems araised ! @@ -512,7 +512,7 @@ IMPLICIT NONE !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD +CLASS(tfieldmetadata_base), INTENT(IN) :: TPFIELD INTEGER,DIMENSION(:,:,:),INTENT(IN) :: KFIELD ! array containing the data field INTEGER, INTENT(OUT):: KRESP ! return-code if problems araised ! @@ -558,7 +558,7 @@ IMPLICIT NONE !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD +CLASS(tfieldmetadata_base), INTENT(IN) :: TPFIELD INTEGER,DIMENSION(:,:,:,:),INTENT(IN) :: KFIELD ! array containing the data field INTEGER, INTENT(OUT):: KRESP ! return-code if problems araised ! @@ -604,7 +604,7 @@ IMPLICIT NONE !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD +CLASS(tfieldmetadata_base), INTENT(IN) :: TPFIELD LOGICAL, INTENT(IN) :: OFIELD ! array containing the data field INTEGER, INTENT(OUT):: KRESP ! return-code if problems araised ! @@ -651,7 +651,7 @@ IMPLICIT NONE !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD +CLASS(tfieldmetadata_base), INTENT(IN) :: TPFIELD LOGICAL,DIMENSION(:), INTENT(IN) :: OFIELD ! array containing the data field INTEGER, INTENT(OUT):: KRESP ! return-code if problems araised ! @@ -706,7 +706,7 @@ IMPLICIT NONE !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD +CLASS(tfieldmetadata_base), INTENT(IN) :: TPFIELD CHARACTER(LEN=*), INTENT(IN) :: HFIELD ! array containing the data field INTEGER, INTENT(OUT):: KRESP ! return-code if problems araised ! @@ -764,7 +764,7 @@ IMPLICIT NONE !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD +CLASS(tfieldmetadata_base), INTENT(IN) :: TPFIELD TYPE (DATE_TIME), INTENT(IN) :: TPDATA ! array containing the data field INTEGER, INTENT(OUT):: KRESP ! return-code if problems araised ! @@ -772,14 +772,14 @@ INTEGER, INTENT(OUT):: KRESP ! return-code if problems araised ! INTEGER :: ILENG INTEGER(kind=LFIINT) :: IRESP, ITOTAL -TYPE(TFIELDDATA) :: TZFIELD +CLASS(tfieldmetadata_base), ALLOCATABLE :: TZFIELD INTEGER, DIMENSION(3) :: ITDATE ! date array INTEGER(KIND=MNHINT64),DIMENSION(:),ALLOCATABLE :: IWORK CHARACTER(LEN=LEN_HREC) :: YRECFM ! CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_Field_write_lfi_T0','writing '//TRIM(TPFIELD%CMNHNAME)) ! -TZFIELD = TPFIELD +Allocate( TZFIELD, source = TPFIELD ) ! ! Write date ! @@ -840,7 +840,7 @@ IMPLICIT NONE !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD +CLASS(tfieldmetadata_base), INTENT(IN) :: TPFIELD TYPE (DATE_TIME), DIMENSION(:), INTENT(IN) :: TPDATA ! array containing the data field INTEGER, INTENT(OUT):: KRESP ! return-code if problems araised ! @@ -849,7 +849,7 @@ INTEGER, INTENT(OUT):: KRESP ! return-code if problems a INTEGER :: ILENG, IPOS INTEGER :: JI INTEGER(kind=LFIINT) :: IRESP, ITOTAL -TYPE(TFIELDDATA) :: TZFIELD +CLASS(tfieldmetadata_base), ALLOCATABLE :: TZFIELD INTEGER, DIMENSION(:), ALLOCATABLE :: ITDATE ! date array INTEGER(KIND=MNHINT64),DIMENSION(:),ALLOCATABLE :: IWORK CHARACTER(LEN=LEN_HREC) :: YRECFM @@ -866,7 +866,7 @@ END IF ! ALLOCATE( ITDATE( ILENG ) ) ! -TZFIELD = TPFIELD +Allocate( TZFIELD, source = TPFIELD ) ! ! Write date ! @@ -924,7 +924,7 @@ END SUBROUTINE IO_Field_write_lfi_T1 ! SUBROUTINE WRITE_PREPARE(TPFIELD,KLENG,KWORK,KTOTAL,KRESP) ! -TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD +CLASS(tfieldmetadata_base), INTENT(IN) :: TPFIELD INTEGER, INTENT(IN) :: KLENG INTEGER(KIND=MNHINT64),DIMENSION(:),ALLOCATABLE,INTENT(INOUT) :: KWORK INTEGER(kind=LFIINT), INTENT(OUT) :: KTOTAL diff --git a/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 b/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 index 10ed5d33ba1b1993d9e3baad7c9c3a87f3f4a1c2..f91733cddbe8dd78fce9e7f7af08cc3648080449 100644 --- a/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 +++ b/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1994-2022 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1994-2023 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. @@ -29,12 +29,14 @@ ! IO_Field_partial_write_nc4_N3 and IO_Field_partial_write_nc4_N4 subroutines ! P. Wautelet 30/03/2021: budgets: LES cartesian subdomain limits are defined in the physical domain ! P. Wautelet 22/03/2022: correct time_les_avg and time_les_avg_bounds coordinates +! P. Wautelet 06/2022: reorganize flyers ! P. Wautelet 21/06/2022: bugfix: time_budget was not computed correctly (tdtexp -> tdtseg) +! P. Wautelet 13/01/2023: IO_Coordvar_write_nc4: add optional dummy argument TPDTMODELN to force written model time !----------------------------------------------------------------- #ifdef MNH_IOCDF4 module mode_io_write_nc4 -use modd_field, only: tfielddata +use modd_field, only: tfieldmetadata use modd_io, only: gsmonoproc, tfiledata use modd_parameters, only: NMNHNAMELGTMAX use modd_precision, only: CDFINT, MNHINT_NF90, MNHREAL32, MNHREAL_MPI, MNHREAL_NF90 @@ -91,7 +93,7 @@ use mode_tools_ll, only: Get_globaldims_ll use NETCDF, only: NF90_FLOAT type(tfiledata), intent(in) :: tpfile -type(tfielddata), intent(in) :: tpfield +class(tfieldmetadata), intent(in) :: tpfield integer, intent(in) :: knblocks character(len=len(tpfield%cmnhname)) :: yvarname @@ -185,7 +187,7 @@ USE MODD_CONF_n, ONLY: CSTORAGE_TYPE use modd_field, only: NMNHDIM_ARAKAWA, TYPEINT, TYPEREAL ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD +CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD INTEGER(KIND=CDFINT), INTENT(IN) :: KVARID LOGICAL, INTENT(IN) :: OEXISTED !True if variable was already defined INTEGER(KIND=CDFINT), DIMENSION(:), OPTIONAL, INTENT(IN) :: KSHAPE @@ -381,7 +383,7 @@ use modd_field, only: NMNHDIM_TIME, TYPECHAR, TYPEDATE, TYPEINT, TYPELOG, TY use modd_precision, only: MNHINT_NF90, MNHREAL_NF90 type(tfiledata), intent(in) :: tpfile -type(tfielddata), intent(in) :: tpfield +class(tfieldmetadata), intent(in) :: tpfield integer, dimension(:), intent(in), optional :: kshape character(len=*), intent(in), optional :: hcalendar logical, intent(in), optional :: oiscoord ! Is a coordinate variable (->do not write coordinates attribute) @@ -533,7 +535,7 @@ end subroutine IO_Field_create_nc4 SUBROUTINE IO_Field_write_nc4_X0(TPFILE,TPFIELD,PFIELD,KRESP) ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD +CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD REAL, INTENT(IN) :: PFIELD INTEGER, INTENT(OUT):: KRESP ! @@ -556,7 +558,7 @@ END SUBROUTINE IO_Field_write_nc4_X0 SUBROUTINE IO_Field_write_nc4_X1(TPFILE,TPFIELD,PFIELD,KRESP) ! TYPE(TFILEDATA),TARGET,INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD +CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD REAL,DIMENSION(:), INTENT(IN) :: PFIELD ! array containing the data field INTEGER, INTENT(OUT):: KRESP ! @@ -582,19 +584,19 @@ END SUBROUTINE IO_Field_write_nc4_X1 SUBROUTINE IO_Field_write_nc4_X2(TPFILE,TPFIELD,PFIELD,KRESP,KVERTLEVEL,KZFILE,OISCOORD) ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD +CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD REAL,DIMENSION(:,:), INTENT(IN) :: PFIELD ! array containing the data field INTEGER, INTENT(OUT):: KRESP INTEGER,OPTIONAL, INTENT(IN) :: KVERTLEVEL ! Number of the vertical level (needed for Z-level split files) INTEGER,OPTIONAL, INTENT(IN) :: KZFILE ! Number of the Z-level split file LOGICAL,OPTIONAL, INTENT(IN) :: OISCOORD ! Is a coordinate variable (->do not write coordinates attribute) ! -INTEGER(KIND=CDFINT) :: istatus -CHARACTER(LEN=4) :: YSUFFIX -INTEGER(KIND=CDFINT) :: IVARID -logical :: gisempty -TYPE(TFIELDDATA), pointer :: TZFIELD -TYPE(TFILEDATA), POINTER :: TZFILE +CHARACTER(LEN=4) :: YSUFFIX +INTEGER(KIND=CDFINT) :: istatus +INTEGER(KIND=CDFINT) :: IVARID +logical :: gisempty +CLASS(TFIELDMETADATA), pointer :: TZFIELD +TYPE(TFILEDATA), POINTER :: TZFILE ! KRESP = 0 ! @@ -618,7 +620,7 @@ END SUBROUTINE IO_Field_write_nc4_X2 SUBROUTINE IO_Field_write_nc4_X3(TPFILE,TPFIELD,PFIELD,KRESP) ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD +CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD REAL,DIMENSION(:,:,:), INTENT(IN) :: PFIELD ! array containing the data field INTEGER, INTENT(OUT):: KRESP ! @@ -644,7 +646,7 @@ END SUBROUTINE IO_Field_write_nc4_X3 SUBROUTINE IO_Field_write_nc4_X4(TPFILE,TPFIELD,PFIELD,KRESP) ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD +CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD REAL,DIMENSION(:,:,:,:), INTENT(IN) :: PFIELD ! array containing the data field INTEGER, INTENT(OUT):: KRESP ! @@ -670,7 +672,7 @@ END SUBROUTINE IO_Field_write_nc4_X4 SUBROUTINE IO_Field_write_nc4_X5(TPFILE,TPFIELD,PFIELD,KRESP) ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD +CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD REAL,DIMENSION(:,:,:,:,:), INTENT(IN) :: PFIELD ! array containing the data field INTEGER, INTENT(OUT):: KRESP ! @@ -696,7 +698,7 @@ END SUBROUTINE IO_Field_write_nc4_X5 SUBROUTINE IO_Field_write_nc4_X6(TPFILE,TPFIELD,PFIELD,KRESP) ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD +CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD REAL,DIMENSION(:,:,:,:,:,:), INTENT(IN) :: PFIELD ! array containing the data field INTEGER, INTENT(OUT):: KRESP ! @@ -731,7 +733,7 @@ USE MODD_PARAMETERS_ll, ONLY: JPVEXT #endif ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD +CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD INTEGER, INTENT(IN) :: KFIELD INTEGER, INTENT(OUT):: KRESP ! @@ -781,7 +783,7 @@ USE MODD_PARAMETERS_ll, ONLY: JPVEXT #endif ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD +CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD INTEGER, DIMENSION(:), INTENT(IN) :: KFIELD INTEGER, INTENT(OUT):: KRESP ! @@ -807,7 +809,7 @@ END SUBROUTINE IO_Field_write_nc4_N1 SUBROUTINE IO_Field_write_nc4_N2(TPFILE,TPFIELD,KFIELD,KRESP) ! TYPE(TFILEDATA),TARGET,INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD +CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD INTEGER,DIMENSION(:,:),INTENT(IN) :: KFIELD ! array containing the data field INTEGER, INTENT(OUT):: KRESP ! @@ -833,7 +835,7 @@ END SUBROUTINE IO_Field_write_nc4_N2 SUBROUTINE IO_Field_write_nc4_N3(TPFILE,TPFIELD,KFIELD,KRESP) ! TYPE(TFILEDATA),TARGET, INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD +CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD INTEGER,DIMENSION(:,:,:),INTENT(IN) :: KFIELD ! array containing the data field INTEGER, INTENT(OUT):: KRESP ! @@ -859,7 +861,7 @@ END SUBROUTINE IO_Field_write_nc4_N3 SUBROUTINE IO_Field_write_nc4_N4(TPFILE,TPFIELD,KFIELD,KRESP) ! TYPE(TFILEDATA),TARGET, INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD +CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD INTEGER,DIMENSION(:,:,:,:),INTENT(IN) :: KFIELD ! array containing the data field INTEGER, INTENT(OUT):: KRESP ! @@ -885,7 +887,7 @@ END SUBROUTINE IO_Field_write_nc4_N4 SUBROUTINE IO_Field_write_nc4_L0(TPFILE,TPFIELD,OFIELD,KRESP) ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD +CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD LOGICAL, INTENT(IN) :: OFIELD INTEGER, INTENT(OUT):: KRESP ! @@ -916,7 +918,7 @@ END SUBROUTINE IO_Field_write_nc4_L0 SUBROUTINE IO_Field_write_nc4_L1(TPFILE,TPFIELD,OFIELD,KRESP) ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD +CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD LOGICAL, DIMENSION(:), INTENT(IN) :: OFIELD INTEGER, INTENT(OUT):: KRESP ! @@ -950,7 +952,7 @@ END SUBROUTINE IO_Field_write_nc4_L1 SUBROUTINE IO_Field_write_nc4_C0(TPFILE,TPFIELD,HFIELD,KRESP) ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD +CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD CHARACTER(LEN=*), INTENT(IN) :: HFIELD INTEGER, INTENT(OUT):: KRESP ! @@ -988,7 +990,7 @@ SUBROUTINE IO_Field_write_nc4_C1(TPFILE,TPFIELD,HFIELD,KRESP) ! J.Escobar : 25/04/2018 : missing 'IF ALLOCATED(IVDIMSTMP)' DEALLOCATE !---------------------------------------------------------------- TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD +CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD CHARACTER(LEN=*),DIMENSION(:),INTENT(IN) :: HFIELD INTEGER, INTENT(OUT) :: KRESP ! @@ -1025,22 +1027,22 @@ USE MODD_TYPE_DATE USE MODE_DATETIME ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD +CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD TYPE (DATE_TIME), INTENT(IN) :: TPDATA INTEGER, INTENT(OUT):: KRESP ! -INTEGER(KIND=CDFINT) :: istatus -INTEGER(KIND=CDFINT) :: IVARID -TYPE(TFIELDDATA) :: TZFIELD -CHARACTER(LEN=40) :: YUNITS -REAL :: ZDELTATIME !Distance in seconds since reference date and time -TYPE(DATE_TIME) :: TZREF +CHARACTER(LEN=40) :: YUNITS +INTEGER(KIND=CDFINT) :: istatus +INTEGER(KIND=CDFINT) :: IVARID +REAL :: ZDELTATIME !Distance in seconds since reference date and time +CLASS(TFIELDMETADATA), ALLOCATABLE :: TZFIELD +TYPE(DATE_TIME) :: TZREF ! CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_Field_write_nc4_T0',TRIM(TPFILE%CNAME)//': writing '//TRIM(TPFIELD%CMNHNAME)) ! KRESP = 0 ! -TZFIELD = TPFIELD +Allocate( TZFIELD, source = TPFIELD ) ! ! Model beginning date (TDTMOD%TDATE) is used as the reference date ! Reference time is set to 0. @@ -1079,24 +1081,24 @@ USE MODD_TYPE_DATE USE MODE_DATETIME ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD +CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD TYPE (DATE_TIME), DIMENSION(:), INTENT(IN) :: TPDATA INTEGER, INTENT(OUT):: KRESP ! -CHARACTER(LEN=40) :: YUNITS -INTEGER :: JI -INTEGER(KIND=CDFINT) :: istatus -INTEGER(KIND=CDFINT) :: IVARID -logical :: gisempty -REAL, DIMENSION(:), ALLOCATABLE :: ZDELTATIME !Distance in seconds since reference date and time -TYPE(DATE_TIME) :: TZREF -TYPE(TFIELDDATA) :: TZFIELD +CHARACTER(LEN=40) :: YUNITS +INTEGER :: JI +INTEGER(KIND=CDFINT) :: istatus +INTEGER(KIND=CDFINT) :: IVARID +logical :: gisempty +REAL, DIMENSION(:), ALLOCATABLE :: ZDELTATIME !Distance in seconds since reference date and time +CLASS(TFIELDMETADATA), ALLOCATABLE :: TZFIELD +TYPE(DATE_TIME) :: TZREF ! CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_Field_write_nc4_T1',TRIM(TPFILE%CNAME)//': writing '//TRIM(TPFIELD%CMNHNAME)) ! KRESP = 0 ! -TZFIELD = TPFIELD +Allocate( TZFIELD, source = TPFIELD ) ! ! Model beginning date (TDTMOD%TDATE) is used as the reference date ! Reference time is set to 0. @@ -1136,7 +1138,7 @@ END SUBROUTINE IO_Field_write_nc4_T1 subroutine IO_Field_partial_write_nc4_X1( tpfile, tpfield, pfield, koffset, kresp ) type(tfiledata), intent(in) :: tpfile -type(tfielddata), intent(in) :: tpfield +class(tfieldmetadata), intent(in) :: tpfield real, dimension(:), intent(in) :: pfield ! array containing the data field integer, dimension(1), intent(in) :: koffset integer, intent(out) :: kresp @@ -1173,20 +1175,20 @@ end subroutine IO_Field_partial_write_nc4_X1 subroutine IO_Field_partial_write_nc4_X2( tpfile, tpfield, pfield, koffset, kresp, kvertlevel, kzfile ) type(tfiledata), intent(in) :: tpfile -type(tfielddata), intent(in) :: tpfield +class(tfieldmetadata), intent(in) :: tpfield real, dimension(:,:), intent(in) :: pfield ! array containing the data field integer, dimension(2), intent(in) :: koffset integer, intent(out) :: kresp integer, optional, intent(in) :: kvertlevel ! Number of the vertical level (needed for Z-level split files) integer, optional, intent(in) :: kzfile ! Number of the Z-level split file -character(len=4) :: ysuffix -character(len=NMNHNAMELGTMAX) :: yvarname -integer(kind=CDFINT) :: istatus -integer(kind=CDFINT) :: ivarid -integer(kind=CDFINT), dimension(2) :: istarts -type(tfielddata), pointer :: tzfield -type(tfiledata), pointer :: tzfile +character(len=4) :: ysuffix +character(len=NMNHNAMELGTMAX) :: yvarname +integer(kind=CDFINT) :: istatus +integer(kind=CDFINT) :: ivarid +integer(kind=CDFINT), dimension(2) :: istarts +class(tfieldmetadata), pointer :: tzfield +type(tfiledata), pointer :: tzfile kresp = 0 @@ -1219,7 +1221,7 @@ end subroutine IO_Field_partial_write_nc4_X2 subroutine IO_Field_partial_write_nc4_X3( tpfile, tpfield, pfield, koffset, kresp ) type(tfiledata), intent(in) :: tpfile -type(tfielddata), intent(in) :: tpfield +class(tfieldmetadata), intent(in) :: tpfield real, dimension(:,:,:), intent(in) :: pfield ! array containing the data field integer, dimension(3), intent(in) :: koffset integer, intent(out) :: kresp @@ -1256,7 +1258,7 @@ end subroutine IO_Field_partial_write_nc4_X3 subroutine IO_Field_partial_write_nc4_X4( tpfile, tpfield, pfield, koffset, kresp ) type(tfiledata), intent(in) :: tpfile -type(tfielddata), intent(in) :: tpfield +class(tfieldmetadata), intent(in) :: tpfield real, dimension(:,:,:,:), intent(in) :: pfield ! array containing the data field integer, dimension(4), intent(in) :: koffset integer, intent(out) :: kresp @@ -1293,20 +1295,20 @@ end subroutine IO_Field_partial_write_nc4_X4 subroutine IO_Field_partial_write_nc4_N2( tpfile, tpfield, kfield, koffset, kresp, kvertlevel, kzfile ) type(tfiledata), intent(in) :: tpfile -type(tfielddata), intent(in) :: tpfield +class(tfieldmetadata), intent(in) :: tpfield integer, dimension(:,:), intent(in) :: kfield ! array containing the data field integer, dimension(2), intent(in) :: koffset integer, intent(out) :: kresp integer, optional, intent(in) :: kvertlevel ! Number of the vertical level (needed for Z-level split files) integer, optional, intent(in) :: kzfile ! Number of the Z-level split file -character(len=4) :: ysuffix -character(len=NMNHNAMELGTMAX) :: yvarname -integer(kind=CDFINT) :: istatus -integer(kind=CDFINT) :: ivarid -integer(kind=CDFINT), dimension(2) :: istarts -type(tfielddata), pointer :: tzfield -type(tfiledata), pointer :: tzfile +character(len=4) :: ysuffix +character(len=NMNHNAMELGTMAX) :: yvarname +integer(kind=CDFINT) :: istatus +integer(kind=CDFINT) :: ivarid +integer(kind=CDFINT), dimension(2) :: istarts +class(tfieldmetadata), pointer :: tzfield +type(tfiledata), pointer :: tzfile kresp = 0 @@ -1339,20 +1341,20 @@ end subroutine IO_Field_partial_write_nc4_N2 subroutine IO_Field_partial_write_nc4_N3( tpfile, tpfield, kfield, koffset, kresp, kvertlevel, kzfile ) type(tfiledata), intent(in) :: tpfile -type(tfielddata), intent(in) :: tpfield +class(tfieldmetadata), intent(in) :: tpfield integer, dimension(:,:,:), intent(in) :: kfield ! array containing the data field integer, dimension(3), intent(in) :: koffset integer, intent(out) :: kresp integer, optional, intent(in) :: kvertlevel ! Number of the vertical level (needed for Z-level split files) integer, optional, intent(in) :: kzfile ! Number of the Z-level split file -character(len=4) :: ysuffix -character(len=NMNHNAMELGTMAX) :: yvarname -integer(kind=CDFINT) :: istatus -integer(kind=CDFINT) :: ivarid -integer(kind=CDFINT), dimension(3) :: istarts -type(tfielddata), pointer :: tzfield -type(tfiledata), pointer :: tzfile +character(len=4) :: ysuffix +character(len=NMNHNAMELGTMAX) :: yvarname +integer(kind=CDFINT) :: istatus +integer(kind=CDFINT) :: ivarid +integer(kind=CDFINT), dimension(3) :: istarts +class(tfieldmetadata), pointer :: tzfield +type(tfiledata), pointer :: tzfile kresp = 0 @@ -1385,20 +1387,20 @@ end subroutine IO_Field_partial_write_nc4_N3 subroutine IO_Field_partial_write_nc4_N4( tpfile, tpfield, kfield, koffset, kresp, kvertlevel, kzfile ) type(tfiledata), intent(in) :: tpfile -type(tfielddata), intent(in) :: tpfield +class(tfieldmetadata), intent(in) :: tpfield integer, dimension(:,:,:,:), intent(in) :: kfield ! array containing the data field integer, dimension(4), intent(in) :: koffset integer, intent(out) :: kresp integer, optional, intent(in) :: kvertlevel ! Number of the vertical level (needed for Z-level split files) integer, optional, intent(in) :: kzfile ! Number of the Z-level split file -character(len=4) :: ysuffix -character(len=NMNHNAMELGTMAX) :: yvarname -integer(kind=CDFINT) :: istatus -integer(kind=CDFINT) :: ivarid -integer(kind=CDFINT), dimension(4) :: istarts -type(tfielddata), pointer :: tzfield -type(tfiledata), pointer :: tzfile +character(len=4) :: ysuffix +character(len=NMNHNAMELGTMAX) :: yvarname +integer(kind=CDFINT) :: istatus +integer(kind=CDFINT) :: ivarid +integer(kind=CDFINT), dimension(4) :: istarts +class(tfieldmetadata), pointer :: tzfield +type(tfiledata), pointer :: tzfile kresp = 0 @@ -1428,7 +1430,7 @@ if ( Present( kvertlevel ) ) deallocate( tzfield ) end subroutine IO_Field_partial_write_nc4_N4 -subroutine IO_Coordvar_write_nc4( tpfile, hprogram_orig ) +subroutine IO_Coordvar_write_nc4( tpfile, hprogram_orig, tpdtmodeln ) use modd_aircraft_balloon use modd_budget, only: cbutype, lbu_icp, lbu_jcp, lbu_kcp, nbuih, nbuil, nbujh, nbujl, nbukh, nbukl, nbukmax, & nbustep, nbutotwrite @@ -1449,7 +1451,7 @@ use modd_field, only: NMNHDIM_NI, NMNHDIM_NJ, NMNHDIM_NI_U, NMNHDIM_NJ_U, N NMNHDIM_PROFILER_TIME, NMNHDIM_STATION_TIME, & tfieldlist use modd_grid, only: xlatori, xlonori -use modd_grid_n, only: lsleve, xxhat, xyhat, xzhat +use modd_grid_n, only: lsleve, xxhat, xxhatm, xyhat, xyhatm, xzhat, xzhatm, xxhat_ll, xyhat_ll, xxhatm_ll, xyhatm_ll use modd_les, only: cles_level_type, cspectra_level_type, nlesn_iinf, nlesn_isup, nlesn_jinf, nlesn_jsup, & nles_k, nles_levels, nspectra_k, nspectra_levels, & xles_altitudes, xspectra_altitudes @@ -1457,10 +1459,10 @@ use modd_les_n, only: nles_dtcount, nles_mean_end, nles_mean_start, nles_me nles_times, nspectra_ni, nspectra_nj, tles_dates, xles_times use modd_netcdf, only: tdimnc use modd_parameters, only: jphext, JPVEXT -use modd_profiler_n, only: numbprofiler, tprofiler +use modd_profiler_n, only: lprofiler, tprofilers_time use modd_series, only: lseries use modd_series_n, only: nsnbstept, tpsdates -use modd_station_n, only: numbstat, tstation +use modd_station_n, only: lstation, tstations_time use modd_time, only: tdtseg use modd_time_n, only: tdtcur use modd_type_date, only: date_time @@ -1471,10 +1473,11 @@ use mode_nest_ll, only: Get_model_number_ll, Go_tomodel_ll type(tfiledata), intent(in) :: tpfile character(len=*), optional, intent(in) :: hprogram_orig !To emulate a file coming from this program +type(date_time), optional, intent(in) :: tpdtmodeln !Time of model (to force model date written in file) character(len=:), allocatable :: ystdnameprefix character(len=:), allocatable :: yprogram -integer :: iiu, iju, iku +integer :: iiu, iju integer :: id, iid, iresp integer :: imi integer :: ji @@ -1485,7 +1488,7 @@ logical :: gchangemodel logical :: gdealloc logical, pointer :: gsleve real, dimension(:), pointer :: zxhat, zyhat, zzhat -real, dimension(:), allocatable :: zxhatm, zyhatm, zzhatm !Coordinates at mass points in the transformed space +real, dimension(:), pointer :: zxhatm, zyhatm, zzhatm !Coordinates at mass points in the transformed space real, dimension(:), allocatable :: zles_levels real, dimension(:), allocatable :: zspectra_levels real, dimension(:,:), pointer :: zlat, zlon @@ -1493,9 +1496,9 @@ type(tdimnc), pointer :: tzdim_ni, tzdim_nj, tzd type(date_time), dimension(:), allocatable :: tzdates type(date_time), dimension(:,:), allocatable :: tzdates_bound +real, dimension(:), pointer :: zxhat_glob, zyhat_glob +real, dimension(:), pointer :: zxhatm_glob, zyhatm_glob !These variables are save: they are populated once for the master Z-split file and freed after the last file has been written -real, dimension(:), pointer, save :: zxhat_glob => null(), zyhat_glob => null() -real, dimension(:), pointer, save :: zxhatm_glob => null(), zyhatm_glob => null() real, dimension(:,:), pointer, save :: zlatm_glob => null(), zlonm_glob => null() real, dimension(:,:), pointer, save :: zlatu_glob => null(), zlonu_glob => null() real, dimension(:,:), pointer, save :: zlatv_glob => null(), zlonv_glob => null() @@ -1504,9 +1507,16 @@ real, dimension(:,:), pointer, save :: zlatf_glob => null(), zlonf_glob => nul call Print_msg( NVERB_DEBUG, 'IO', 'IO_Coordvar_write_nc4', 'called for ' // Trim( tpfile%cname ) ) -zxhat => null() -zyhat => null() -zzhat => null() +zxhat => null() +zyhat => null() +zzhat => null() +zxhatm => null() +zyhatm => null() +zzhatm => null() +zxhat_glob => null() +zyhat_glob => null() +zxhatm_glob => null() +zyhatm_glob => null() gchangemodel = .false. @@ -1526,8 +1536,22 @@ if ( tpfile%nmodel > 0 ) then zxhat => tfieldlist(iid)%tfield_x1d(tpfile%nmodel)%data call Find_field_id_from_mnhname( 'YHAT', iid, iresp ) zyhat => tfieldlist(iid)%tfield_x1d(tpfile%nmodel)%data + call Find_field_id_from_mnhname( 'XHATM', iid, iresp ) + zxhatm => tfieldlist(iid)%tfield_x1d(tpfile%nmodel)%data + call Find_field_id_from_mnhname( 'YHATM', iid, iresp ) + zyhatm => tfieldlist(iid)%tfield_x1d(tpfile%nmodel)%data call Find_field_id_from_mnhname( 'ZHAT', iid, iresp ) zzhat => tfieldlist(iid)%tfield_x1d(tpfile%nmodel)%data + call Find_field_id_from_mnhname( 'ZHATM', iid, iresp ) + zzhatm => tfieldlist(iid)%tfield_x1d(tpfile%nmodel)%data + call Find_field_id_from_mnhname( 'XHAT_ll', iid, iresp ) + zxhat_glob => tfieldlist(iid)%tfield_x1d(tpfile%nmodel)%data + call Find_field_id_from_mnhname( 'YHAT_ll', iid, iresp ) + zyhat_glob => tfieldlist(iid)%tfield_x1d(tpfile%nmodel)%data + call Find_field_id_from_mnhname( 'XHATM_ll', iid, iresp ) + zxhatm_glob => tfieldlist(iid)%tfield_x1d(tpfile%nmodel)%data + call Find_field_id_from_mnhname( 'YHATM_ll', iid, iresp ) + zyhatm_glob => tfieldlist(iid)%tfield_x1d(tpfile%nmodel)%data call Find_field_id_from_mnhname( 'SLEVE', iid, iresp ) gsleve => tfieldlist(iid)%tfield_l0d(tpfile%nmodel)%data @@ -1537,21 +1561,21 @@ if ( tpfile%nmodel > 0 ) then gchangemodel = .true. end if else - zxhat => xxhat - zyhat => xyhat - zzhat => xzhat + zxhat => xxhat + zyhat => xyhat + zzhat => xzhat + zxhatm => xxhatm + zyhatm => xyhatm + zzhatm => xzhatm + zxhat_glob => xxhat_ll + zyhat_glob => xyhat_ll + zxhatm_glob => xxhatm_ll + zyhatm_glob => xyhatm_ll gsleve => lsleve end if iiu = Size( zxhat ) iju = Size( zyhat ) -Allocate( zxhatm(iiu), zyhatm(iju) ) -!zxhatm(iiu) and zyhatm(iju) are correct only on some processes -!but it is OK due to the way Gather_xxfield is done -zxhatm(1 : iiu - 1) = 0.5 * ( zxhat(1 : iiu - 1) + zxhat(2 : iiu) ) -zxhatm(iiu) = 2. * zxhat(iiu) - zxhatm(iiu - 1) -zyhatm(1 : iju - 1) = 0.5 * ( zyhat(1 : iju - 1) + zyhat(2 : iju) ) -zyhatm(iju) = 2. * zyhat(iju) - zyhatm(iju - 1) if ( lcartesian ) then ystdnameprefix = 'plane' @@ -1575,14 +1599,6 @@ else tzdim_nj_v => Null() end if -!If the file is a Z-split subfile, coordinates are already collected -if ( .not. Associated( tpfile%tmainfile ) ) then - call Gather_hor_coord1d( 'X', zxhat, zxhat_glob ) - call Gather_hor_coord1d( 'X', zxhatm, zxhatm_glob ) - call Gather_hor_coord1d( 'Y', zyhat, zyhat_glob ) - call Gather_hor_coord1d( 'Y', zyhatm, zyhatm_glob ) -end if - call Write_hor_coord1d( tzdim_ni, 'x-dimension of the grid', & trim(ystdnameprefix)//'_x_coordinate', 'X', 0., jphext, jphext, zxhatm_glob ) call Write_hor_coord1d( tzdim_nj, 'y-dimension of the grid', & @@ -1596,7 +1612,6 @@ call Write_hor_coord1d( tzdim_ni_v, 'x-dimension of the grid at v location', & call Write_hor_coord1d( tzdim_nj_v, 'y-dimension of the grid at v location', & trim(ystdnameprefix)//'_y_coordinate_at_v_location', 'Y', -0.5, jphext, 0, zyhat_glob ) -!The z?hat*_glob were allocated in Gather_hor_coord1d calls !Deallocate only if it is a non Z-split file or the last Z-split subfile gdealloc = .false. if ( Associated( tpfile%tmainfile ) ) then @@ -1633,17 +1648,10 @@ if ( .not. lcartesian ) then if ( gdealloc ) Deallocate( zlatm_glob, zlonm_glob, zlatu_glob, zlonu_glob, zlatv_glob, zlonv_glob, zlatf_glob, zlonf_glob ) end if -Deallocate( zxhatm, zyhatm ) - if ( tpfile%lmaster ) then !vertical coordinates in the transformed space are the same on all processes if ( Trim( yprogram ) /= 'PGD' .and. Trim( yprogram ) /= 'NESPGD' .and. Trim( yprogram ) /= 'ZOOMPG' & .and. .not. ( Trim( yprogram ) == 'REAL' .and. cstorage_type == 'SU') ) then !condition to detect prep_surfex - iku = Size( zzhat ) - Allocate( zzhatm(iku) ) - zzhatm(1 : iku - 1) = 0.5 * ( zzhat(2 : iku) + zzhat(1 : iku - 1) ) - zzhatm(iku) = 2.* zzhat(iku) - zzhatm(iku - 1) - call Write_ver_coord( tpfile%tncdims%tdims(NMNHDIM_LEVEL), 'position z in the transformed space', '', & 'altitude', 0., JPVEXT, JPVEXT, ZZHATM ) call Write_ver_coord( tpfile%tncdims%tdims(NMNHDIM_LEVEL_W),'position z in the transformed space at w location','', & @@ -1655,8 +1663,13 @@ END IF if ( tpfile%lmaster ) then !time scale is the same on all processes if ( Trim( yprogram ) /= 'PGD' .and. Trim( yprogram ) /= 'NESPGD' .and. Trim( yprogram ) /= 'ZOOMPG' & .and. .not. ( Trim( yprogram ) == 'REAL' .and. cstorage_type == 'SU' ) ) then !condition to detect prep_surfex - if ( tpfile%ctype /= 'MNHDIACHRONIC' .and. Associated( tdtcur ) ) & - call Write_time_coord( tpfile%tncdims%tdims(nmnhdim_time), 'time axis', [ tdtcur ] ) + if ( tpfile%ctype /= 'MNHDIACHRONIC' ) then + if ( Present( tpdtmodeln ) ) then + call Write_time_coord( tpfile%tncdims%tdims(nmnhdim_time), 'time axis', [ tpdtmodeln ] ) + else if ( Associated( tdtcur ) ) then + call Write_time_coord( tpfile%tncdims%tdims(nmnhdim_time), 'time axis', [ tdtcur ] ) + end if + end if end if end if @@ -1836,12 +1849,12 @@ if ( tpfile%lmaster ) then end if !Coordinates for the number of profiler times - if ( numbprofiler > 0 ) & - call Write_time_coord( tpfile%tncdims%tdims(NMNHDIM_PROFILER_TIME), 'time axis for profilers', tprofiler%tpdates ) + if ( lprofiler ) & + call Write_time_coord( tpfile%tncdims%tdims(NMNHDIM_PROFILER_TIME), 'time axis for profilers', tprofilers_time%tpdates ) !Coordinates for the number of station times - if ( numbstat > 0 ) & - call Write_time_coord( tpfile%tncdims%tdims(NMNHDIM_STATION_TIME), 'time axis for stations', tstation%tpdates ) + if ( lstation ) & + call Write_time_coord( tpfile%tncdims%tdims(NMNHDIM_STATION_TIME), 'time axis for stations', tstations_time%tpdates ) !Dimension for the number of series times if ( lseries .and. nsnbstept > 0 ) then @@ -1855,59 +1868,37 @@ if ( tpfile%lmaster ) then end if if ( lflyer ) then - call Write_flyer_time_coord( tballoon1 ) - call Write_flyer_time_coord( tballoon2 ) - call Write_flyer_time_coord( tballoon3 ) - call Write_flyer_time_coord( tballoon4 ) - call Write_flyer_time_coord( tballoon5 ) - call Write_flyer_time_coord( tballoon6 ) - call Write_flyer_time_coord( tballoon7 ) - call Write_flyer_time_coord( tballoon8 ) - call Write_flyer_time_coord( tballoon9 ) - - call Write_flyer_time_coord( taircraft1 ) - call Write_flyer_time_coord( taircraft2 ) - call Write_flyer_time_coord( taircraft3 ) - call Write_flyer_time_coord( taircraft4 ) - call Write_flyer_time_coord( taircraft5 ) - call Write_flyer_time_coord( taircraft6 ) - call Write_flyer_time_coord( taircraft7 ) - call Write_flyer_time_coord( taircraft8 ) - call Write_flyer_time_coord( taircraft9 ) - call Write_flyer_time_coord( taircraft10 ) - call Write_flyer_time_coord( taircraft11 ) - call Write_flyer_time_coord( taircraft12 ) - call Write_flyer_time_coord( taircraft13 ) - call Write_flyer_time_coord( taircraft14 ) - call Write_flyer_time_coord( taircraft15 ) - call Write_flyer_time_coord( taircraft16 ) - call Write_flyer_time_coord( taircraft17 ) - call Write_flyer_time_coord( taircraft18 ) - call Write_flyer_time_coord( taircraft19 ) - call Write_flyer_time_coord( taircraft20 ) - call Write_flyer_time_coord( taircraft21 ) - call Write_flyer_time_coord( taircraft22 ) - call Write_flyer_time_coord( taircraft23 ) - call Write_flyer_time_coord( taircraft24 ) - call Write_flyer_time_coord( taircraft25 ) - call Write_flyer_time_coord( taircraft26 ) - call Write_flyer_time_coord( taircraft27 ) - call Write_flyer_time_coord( taircraft28 ) - call Write_flyer_time_coord( taircraft29 ) - call Write_flyer_time_coord( taircraft30 ) + ! Remark: to work flyer data must be on the file master rank + ! This is currently ensured in WRITE_AIRCRAFT_BALLOON subroutine + do ji = 1, nballoons + if ( associated( tballoons(ji)%tballoon ) ) then + call Write_flyer_time_coord( tballoons(ji)%tballoon ) + else + call Print_msg( NVERB_ERROR, 'IO', 'IO_Coordvar_write_nc4','tballoon not associated' ) + end if + end do + + do ji = 1, naircrafts + if ( associated( taircrafts(ji)%taircraft ) ) then + call Write_flyer_time_coord( taircrafts(ji)%taircraft ) + else + call Print_msg( NVERB_ERROR, 'IO', 'IO_Coordvar_write_nc4','taircraft not associated' ) + end if + end do end if end if !MNHDIACHRONIC end if -if ( gdealloc ) deallocate( zxhat_glob, zxhatm_glob, zyhat_glob, zyhatm_glob ) if ( gchangemodel ) call Go_tomodel_ll( imi, iresp ) contains +#if 0 +!Not used anymore subroutine Gather_hor_coord1d( haxis, pcoords_loc, pcoords_glob ) use mode_allocbuffer_ll, only: Allocbuffer_ll use mode_gather_ll, only: Gather_xxfield @@ -1951,7 +1942,9 @@ subroutine Gather_hor_coord1d( haxis, pcoords_loc, pcoords_glob ) !PW: TODO: broadcast only to subfile writers if ( tpfile%nsubfiles_ioz > 0 ) & call MPI_BCAST( pcoords_glob, size( pcoords_glob ), MNHREAL_MPI, tpfile%nmaster_rank - 1, tpfile%nmpicomm, ierr ) + end subroutine Gather_hor_coord1d +#endif subroutine Gather_hor_coord2d( px, py, plat_glob, plon_glob ) @@ -2290,11 +2283,11 @@ subroutine Write_flyer_time_coord( tpflyer ) use modd_aircraft_balloon use modd_parameters, only: NBUNAMELGTMAX, XUNDEF + use mode_aircraft_balloon, only: Aircraft_balloon_longtype_get use mode_io_tools_nc4, only: IO_Mnhname_clean - use modi_aircraft_balloon, only: Aircraft_balloon_longtype_get - type(flyer), intent(in) :: tpflyer + class(tflyerdata), intent(in) :: tpflyer character(len=NBUNAMELGTMAX) :: ytype character(len=NBUNAMELGTMAX) :: ytype_clean @@ -2305,7 +2298,7 @@ subroutine Write_flyer_time_coord( tpflyer ) type(tdimnc), pointer :: tzdim !Do it only if correct model level and has really flown - if ( tpflyer%nmodel == imi .and. Count( tpflyer%x /= XUNDEF) > 1 ) then + if ( tpflyer%nmodel == imi .and. Count( tpflyer%xx /= XUNDEF) > 1 ) then Allocate( tzdim ) istatus = NF90_INQ_NCID( tpfile%nncid, 'Flyers', icatid ) @@ -2322,16 +2315,16 @@ subroutine Write_flyer_time_coord( tpflyer ) Trim( tpfile%cname ) // ': group ' // Trim( ytype_clean ) // ' not found' ) end if - istatus = NF90_INQ_NCID( isubcatid, Trim( tpflyer%title ), incid ) + istatus = NF90_INQ_NCID( isubcatid, Trim( tpflyer%ctitle ), incid ) if ( istatus /= NF90_NOERR ) then call Print_msg( NVERB_ERROR, 'IO', 'Write_flyer_time_coord', & - Trim( tpfile%cname ) // ': group '// Trim( tpflyer%title ) // ' not found' ) + Trim( tpfile%cname ) // ': group '// Trim( tpflyer%ctitle ) // ' not found' ) end if istatus = NF90_INQ_DIMID( incid, 'time_flyer', idimid ) if ( istatus /= NF90_NOERR ) then call Print_msg( NVERB_ERROR, 'IO', 'Write_flyer_time_coord', & - Trim( tpfile%cname ) // ': group ' // Trim( tpflyer%title ) // ' time_flyer dimension not found' ) + Trim( tpfile%cname ) // ': group ' // Trim( tpflyer%ctitle ) // ' time_flyer dimension not found' ) end if tzdim%cname = 'time_flyer' @@ -2339,7 +2332,7 @@ subroutine Write_flyer_time_coord( tpflyer ) tzdim%nid = idimid !Remark: incid is used in Write_time_coord - call Write_time_coord( tzdim, 'time axis for flyer', tpflyer%tpdates ) + call Write_time_coord( tzdim, 'time axis for flyer', tpflyer%tflyer_time%tpdates ) Deallocate( tzdim ) @@ -2363,7 +2356,7 @@ IF (TRIM(TPFILE%CFORMAT)/='NETCDF4' .AND. TRIM(TPFILE%CFORMAT)/='LFICDF4') RETUR CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_Header_write_nc4','called for file '//TRIM(TPFILE%CNAME)) ! IF (TPFILE%LMASTER) THEN - ISTATUS = NF90_PUT_ATT(TPFILE%NNCID, NF90_GLOBAL, 'Conventions', 'CF-1.7 COMODO-1.4') + ISTATUS = NF90_PUT_ATT(TPFILE%NNCID, NF90_GLOBAL, 'Conventions', 'CF-1.10 COMODO-1.4') IF (ISTATUS /= NF90_NOERR) CALL IO_Err_handle_nc4(istatus,'IO_FILE_WRITE_HEADER','NF90_PUT_ATT','Conventions') #if (MNH_REAL == 8) @@ -2463,8 +2456,8 @@ END SUBROUTINE IO_History_append_nc4 subroutine IO_Select_split_file( tpfile, tpfield, tpfileout, tpfieldout, kvertlevel, kzfile ) type(tfiledata), target, intent(in) :: tpfile -type(tfielddata), target, intent(in) :: tpfield -type(tfielddata), pointer, intent(out) :: tpfieldout +class(tfieldmetadata), target, intent(in) :: tpfield +class(tfieldmetadata), pointer, intent(out) :: tpfieldout type(tfiledata), pointer, intent(out) :: tpfileout integer, optional, intent(in) :: kvertlevel ! Number of the vertical level (needed for Z-level split files) integer, optional, intent(in) :: kzfile ! Number of the Z-level split file @@ -2478,9 +2471,8 @@ if ( Present( kvertlevel ) ) then Write( ysuffix, '( i4.4 )' ) kvertlevel tpfileout => tpfile%tfiles_ioz(kzfile)%tfile - !Copy the values of tpfield to the pointer tpfieldout (new tfielddata) - Allocate( tpfieldout ) - tpfieldout = tpfield + !Copy the values of tpfield to the pointer tpfieldout + Allocate( tpfieldout, source = tpfield ) tpfieldout%cmnhname = Trim( tpfieldout%cmnhname ) // ysuffix if ( Len_trim( tpfieldout%cstdname ) > 0 ) tpfieldout%cstdname = Trim( tpfieldout%cstdname ) // '_at_level_' // ysuffix if ( Len_trim( tpfieldout%clongname ) > 0 ) tpfieldout%clongname = Trim( tpfieldout%clongname ) // ' at level ' // ysuffix diff --git a/src/LIB/SURCOUCHE/src/mode_msg.f90 b/src/LIB/SURCOUCHE/src/mode_msg.f90 index 80d2f6677cf7209871081707050fbf5b14de918a..ac78920fae6da2b112c7c296f9a9d30829c4b6e6 100644 --- a/src/LIB/SURCOUCHE/src/mode_msg.f90 +++ b/src/LIB/SURCOUCHE/src/mode_msg.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2017-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2017-2022 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. @@ -12,6 +12,7 @@ ! P. Wautelet 17/01/2020: add 'BUD' category for Print_msg ! P. Wautelet 08/04/2020: add multiline Print_msg ! P. Wautelet 01/07/2021: add counters for the number of prints + subroutine Msg_stats +! P. Wautelet 01/07/2022: add olocal optional argument to force Print_msg on current process !----------------------------------------------------------------- module mode_msg @@ -37,22 +38,24 @@ end interface Print_msg contains -subroutine Print_msg_1line( kverb, hdomain, hsubr, hmsg ) - integer, intent(in) :: kverb !Verbosity level - character(len=*), intent(in) :: hdomain !Domain/category of message - character(len=*), intent(in) :: hsubr !Subroutine/function name - character(len=*), intent(in) :: hmsg !Message +subroutine Print_msg_1line( kverb, hdomain, hsubr, hmsg, olocal ) + integer, intent(in) :: kverb !Verbosity level + character(len=*), intent(in) :: hdomain !Domain/category of message + character(len=*), intent(in) :: hsubr !Subroutine/function name + character(len=*), intent(in) :: hmsg !Message + logical, optional, intent(in) :: olocal !true to force print on this process (if verbosity level is high enough) - call Print_msg_multi( kverb, hdomain, hsubr, [hmsg] ) + call Print_msg_multi( kverb, hdomain, hsubr, [hmsg], olocal ) end subroutine Print_msg_1line -subroutine Print_msg_multi_cmnhmsg( kverb, hdomain, hsubr ) +subroutine Print_msg_multi_cmnhmsg( kverb, hdomain, hsubr, olocal ) - integer, intent(in) :: kverb !Verbosity level - character(len=*), intent(in) :: hdomain !Domain/category of message - character(len=*), intent(in) :: hsubr !Subroutine/function name + integer, intent(in) :: kverb !Verbosity level + character(len=*), intent(in) :: hdomain !Domain/category of message + character(len=*), intent(in) :: hsubr !Subroutine/function name + logical, optional, intent(in) :: olocal !true to force print on this process (if verbosity level is high enough) integer :: ilines @@ -71,7 +74,7 @@ subroutine Print_msg_multi_cmnhmsg( kverb, hdomain, hsubr ) end subroutine Print_msg_multi_cmnhmsg -subroutine Print_msg_multi( KVERB, HDOMAIN, HSUBR, HMSG ) +subroutine Print_msg_multi( KVERB, HDOMAIN, HSUBR, HMSG, OLOCAL ) ! USE ISO_FORTRAN_ENV, ONLY: ERROR_UNIT, OUTPUT_UNIT ! @@ -87,6 +90,7 @@ INTEGER, INTENT(IN) :: KVERB !Verbosity level CHARACTER(LEN=*), INTENT(IN) :: HDOMAIN !Domain/category of message CHARACTER(LEN=*), INTENT(IN) :: HSUBR !Subroutine/function name CHARACTER(LEN=*), dimension(:), INTENT(IN) :: HMSG !Message +LOGICAL, OPTIONAL, INTENT(IN) :: OLOCAL !true to force print on this process (if verbosity level is high enough) ! character(len=2) :: ysz CHARACTER(LEN=2) :: YPRC @@ -98,12 +102,19 @@ INTEGER :: IERR, IMAXVERB,IABORTLEVEL INTEGER :: ILU integer :: ji integer :: ilines +logical :: glocal LOGICAL :: GWRITE_OUTLST,GWRITE_STDOUT -! + +if ( present( olocal ) ) then + glocal = olocal +else + glocal = .false. +end if + !Determine if the process will write GWRITE_OUTLST = .FALSE. GWRITE_STDOUT = .FALSE. -IF (IP == 1 .OR. LVERB_ALLPRC) THEN +IF ( IP == 1 .OR. LVERB_ALLPRC .OR. GLOCAL ) THEN IF (LVERB_OUTLST) GWRITE_OUTLST = .TRUE. IF (LVERB_STDOUT) GWRITE_STDOUT = .TRUE. END IF @@ -178,7 +189,7 @@ else ysz = 'I4' end if -if ( lverb_allprc ) then +if ( lverb_allprc .or. glocal ) then if ( nproc < 10 ) then yprc = 'I1' else if ( nproc < 100 ) then @@ -222,9 +233,9 @@ if ( lverb_allprc ) then else if ( gwrite_stdout ) then if ( ilines == 1 ) then - Write( unit = output_unit, fmt = "(a9,a30,a)" ) ypre, ysubr, Trim( hmsg(1) ) + Write( unit = output_unit, fmt = "('0: ',a9,a30,a)" ) ypre, ysubr, Trim( hmsg(1) ) else - yformat = '(a9,a30,' // ysz // ',''/'',' // ysz // ','': '',a)' + yformat = '("0: ",a9,a30,' // ysz // ',''/'',' // ysz // ','': '',a)' do ji = 1, ilines Write(unit = output_unit, fmt = yformat ) ypre, ysubr, ji, ilines, Trim( hmsg(ji) ) end do @@ -232,9 +243,9 @@ else end if if ( gwrite_outlst ) then if ( ilines == 1 ) then - Write( unit = ilu, fmt = "(a9,a30,a)") ypre, ysubr, Trim( hmsg(1) ) + Write( unit = ilu, fmt = "('0: ',a9,a30,a)") ypre, ysubr, Trim( hmsg(1) ) else - yformat = '(a9,a30,' // ysz // ',''/'',' // ysz // ','': '',a)' + yformat = '("0: ",a9,a30,' // ysz // ',''/'',' // ysz // ','': '',a)' do ji = 1, ilines Write( unit = ilu, fmt = yformat) ypre, ysubr, ji, ilines, Trim( hmsg(ji) ) end do diff --git a/src/LIB/hdf5-1.12.0.tar.gz b/src/LIB/hdf5-1.12.0.tar.gz deleted file mode 100644 index b61a243e0a1baa69da1ba494a00809af9cc32f4e..0000000000000000000000000000000000000000 --- a/src/LIB/hdf5-1.12.0.tar.gz +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a62dcb276658cb78e6795dd29bf926ed7a9bc4edf6e77025cd2c689a8f97c17a -size 12580850 diff --git a/src/LIB/hdf5-1.14.0.tar.gz b/src/LIB/hdf5-1.14.0.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..14467a66342048527655995b2cd28292bcbc3272 --- /dev/null +++ b/src/LIB/hdf5-1.14.0.tar.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a571cc83efda62e1a51a0a912dd916d01895801c5025af91669484a1575a6ef4 +size 19285771 diff --git a/src/LIB/libaec-0.3.4.tar.gz b/src/LIB/libaec-0.3.4.tar.gz deleted file mode 100644 index f35f3df1af288e0354f300788a86d57583a287fd..0000000000000000000000000000000000000000 --- a/src/LIB/libaec-0.3.4.tar.gz +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:62af371b50b9ee93fa1d0d038809f3b1ab4dc4b75c182982fcdcd90c1847666b -size 1495364 diff --git a/src/LIB/libaec-v1.0.6.tar.gz b/src/LIB/libaec-v1.0.6.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..9a4e3c40caa0cf72438f7e54e9cee4bfeda4ab90 --- /dev/null +++ b/src/LIB/libaec-v1.0.6.tar.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2675d26b24a081cdaaa48e0d085632e568e3f85f843f62b91fc51e1b3f5fe93f +size 2777547 diff --git a/src/LIB/netcdf-c-4.7.4.tar.gz b/src/LIB/netcdf-c-4.7.4.tar.gz deleted file mode 100644 index e0062fbd761c0bb1ac3ef87e0e39e01339371ff9..0000000000000000000000000000000000000000 --- a/src/LIB/netcdf-c-4.7.4.tar.gz +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:99930ad7b3c4c1a8e8831fb061cb02b2170fc8e5ccaeda733bd99c3b9d31666b -size 19711158 diff --git a/src/LIB/netcdf-c-4.9.0.tar.gz b/src/LIB/netcdf-c-4.9.0.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..6ee47e081789963c760d947169817a78c299d41b --- /dev/null +++ b/src/LIB/netcdf-c-4.9.0.tar.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4c956022b79c08e5e14eee8df51b13c28e6121c2b7e7faadc21b375949400b49 +size 7103958 diff --git a/src/LIB/netcdf-fortran-4.5.3.tar.gz b/src/LIB/netcdf-fortran-4.5.3.tar.gz deleted file mode 100644 index 8533eec91cf5a04b7a03244a9ff06aef193b0f55..0000000000000000000000000000000000000000 --- a/src/LIB/netcdf-fortran-4.5.3.tar.gz +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c6da30c2fe7e4e614c1dff4124e857afbd45355c6798353eccfa60c0702b495a -size 1805683 diff --git a/src/LIB/netcdf-fortran-4.6.0.tar.gz b/src/LIB/netcdf-fortran-4.6.0.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..acc4addf308e9f42bfcaeac1876fa79edb2342c9 --- /dev/null +++ b/src/LIB/netcdf-fortran-4.6.0.tar.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:198bff6534cc85a121adc9e12f1c4bc53406c403bda331775a1291509e7b2f23 +size 1110214 diff --git a/src/MNH/advection_metsv.f90 b/src/MNH/advection_metsv.f90 index cd93fe4fa34499fe46eb5fc4ca5ce4ab810cf196..a0ef0da8c88e61797c558e314337d6380a7bc402 100644 --- a/src/MNH/advection_metsv.f90 +++ b/src/MNH/advection_metsv.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1994-2023 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. @@ -47,7 +47,8 @@ REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRT , PSVT ! Variables at t REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHVREF ! Virtual Temperature ! of the reference state -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX,PDYY,PDZZ,PDZX,PDZY +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX,PDYY,PDZZ +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDZX,PDZY ! metric coefficients REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRTHS, PRTKES REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRRS , PRSVS @@ -152,7 +153,7 @@ use modd_budget, only: lbudget_th, lbudget_tke, lbudget_rv, lbudget_rc, USE MODD_CST USE MODD_CTURB, ONLY: XTKEMIN USE MODD_CONF, ONLY: LNEUTRAL,NHALO,L1D, L2D -use modd_field, only: tfielddata, TYPEREAL +use modd_field, only: tfieldmetadata, TYPEREAL USE MODD_IBM_PARAM_n, ONLY: LIBM,XIBM_LS,XIBM_EPSI USE MODD_IO, ONLY: TFILEDATA USE MODD_LUNIT_n, ONLY: TLUOUT @@ -212,7 +213,8 @@ REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRT , PSVT ! Variables at t REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHVREF ! Virtual Temperature ! of the reference state -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX,PDYY,PDZZ,PDZX,PDZY +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX,PDYY,PDZZ +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDZX,PDZY ! metric coefficients REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRTHS, PRTKES REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRRS , PRSVS @@ -275,11 +277,11 @@ TYPE(LIST_ll), POINTER :: TZFIELDS0_ll ! list of fields to exchange TYPE(LIST_ll), POINTER :: TZFIELDS1_ll ! list of fields to exchange ! ! -INTEGER :: IRESP ! Return code of FM routines -INTEGER :: ILUOUT ! logical unit -INTEGER :: ISPLIT_PPM ! temporal time splitting -INTEGER :: IIB, IIE, IJB, IJE,IKB,IKE -TYPE(TFIELDDATA) :: TZFIELD +INTEGER :: IRESP ! Return code of FM routines +INTEGER :: ILUOUT ! logical unit +INTEGER :: ISPLIT_PPM ! temporal time splitting +INTEGER :: IIB, IIE, IJB, IJE,IKB,IKE +TYPE(TFIELDMETADATA) :: TZFIELD !------------------------------------------------------------------------------- ! !* 0. INITIALIZATION @@ -366,54 +368,58 @@ END IF !* prints in the file the 3D Courant numbers (one should flag this) ! IF ( tpfile%lopened .AND. OCFL_WRIT .AND. (.NOT. L1D) ) THEN - TZFIELD%CMNHNAME = 'CFLU' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'CFLU' - TZFIELD%CUNITS = '1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_CFLU' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'CFLU', & + CSTDNAME = '', & + CLONGNAME = 'CFLU', & + CUNITS = '1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_CFLU', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZCFLU) ! IF (.NOT. L2D) THEN - TZFIELD%CMNHNAME = 'CFLV' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'CFLV' - TZFIELD%CUNITS = '1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_CFLV' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'CFLV', & + CSTDNAME = '', & + CLONGNAME = 'CFLV', & + CUNITS = '1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_CFLV', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZCFLV) END IF ! - TZFIELD%CMNHNAME = 'CFLW' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'CFLW' - TZFIELD%CUNITS = '1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_CFLW' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'CFLW', & + CSTDNAME = '', & + CLONGNAME = 'CFLW', & + CUNITS = '1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_CFLW', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZCFLW) ! - TZFIELD%CMNHNAME = 'CFL' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'CFL' - TZFIELD%CUNITS = '1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_CFL' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'CFL', & + CSTDNAME = '', & + CLONGNAME = 'CFL', & + CUNITS = '1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_CFL', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZCFL) END IF ! diff --git a/src/MNH/advection_uvw.f90 b/src/MNH/advection_uvw.f90 index 64a497958d0296f788ea7d87e77af64a9a9c0485..8b05aa48032b66a32222133ae26f430c29a4cb53 100644 --- a/src/MNH/advection_uvw.f90 +++ b/src/MNH/advection_uvw.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1994-2020 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1994-2023 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. @@ -30,8 +30,9 @@ REAL, INTENT(IN) :: PTSTEP ! REAL, DIMENSION(:,:,:), INTENT(IN) :: PUT , PVT , PWT ! Variables at t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX,PDYY,PDZZ,PDZX,PDZY +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX,PDYY,PDZZ +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDZX,PDZY ! metric coefficients REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRUS , PRVS, PRWS ! Sources terms @@ -132,7 +133,8 @@ REAL, INTENT(IN) :: PTSTEP REAL, DIMENSION(:,:,:), INTENT(IN) :: PUT , PVT , PWT ! Variables at t REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX,PDYY,PDZZ,PDZX,PDZY +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX,PDYY,PDZZ +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDZX,PDZY ! metric coefficients REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRUS , PRVS, PRWS ! Sources terms diff --git a/src/MNH/advection_uvw_cen.f90 b/src/MNH/advection_uvw_cen.f90 index 62787ea599d91b6def85a40a70d94cb1b97a3fd3..ac9c7f56df21e90c201e660395348ec8392b4335 100644 --- a/src/MNH/advection_uvw_cen.f90 +++ b/src/MNH/advection_uvw_cen.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2013-2020 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2013-2023 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. @@ -30,7 +30,8 @@ REAL, DIMENSION(:,:,:), INTENT(IN) :: PUM, PVM, PWM ! Variables at t-dt REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDUM, PDVM, PDWM REAL, DIMENSION(:,:,:), INTENT(IN) :: PUT , PVT , PWT, PRHODJ -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX,PDYY,PDZZ,PDZX,PDZY +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX,PDYY,PDZZ +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDZX,PDZY ! metric coefficients REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRUS , PRVS , PRWS ! Sources terms @@ -125,7 +126,8 @@ REAL, DIMENSION(:,:,:), INTENT(IN) :: PUM, PVM, PWM ! Variables at t-dt REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDUM, PDVM, PDWM REAL, DIMENSION(:,:,:), INTENT(IN) :: PUT , PVT , PWT, PRHODJ -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX,PDYY,PDZZ,PDZX,PDZY +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX,PDYY,PDZZ +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDZX,PDZY ! metric coefficients REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRUS , PRVS , PRWS ! Sources terms diff --git a/src/MNH/aer_monitorn.f90 b/src/MNH/aer_monitorn.f90 index 97faca64cb603b8b904a8512a07a01a45f85f619..22d5f69a9b8e052d1f28a46fe8a2d524a9e5913c 100644 --- a/src/MNH/aer_monitorn.f90 +++ b/src/MNH/aer_monitorn.f90 @@ -1,4 +1,4 @@ -!ORILAM_LIC Copyright 2008-2019 CNRS, Meteo-France and Universite Paul Sabatier +!ORILAM_LIC Copyright 2008-2022 CNRS, Meteo-France and Universite Paul Sabatier !ORILAM_LIC This is part of the ORILAM software governed by the CeCILL-C licence !ORILAM_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !ORILAM_LIC for details. @@ -214,7 +214,7 @@ IF (LDUST.AND.LSEDIMDUST) THEN XRHODREF(IIB:IIE,IJB:IJE,IKB:IKE), & XPABST(IIB:IIE,IJB:IJE,IKB:IKE), & XZZ(IIB:IIE,IJB:IJE,IKB:IKE+1), & - ZSVT(IIB:IIE,IJB:IJE,IKB:IKE,:)) !ppp (concentration) + ZSVT(IIB:IIE,IJB:IJE,IKB:IKE,:)) !ppv (concentration) ! DO JSV = NSV_DSTBEG, NSV_DSTEND XRSVS(IIB:IIE,IJB:IJE,IKB:IKE,JSV) = ZSVT(IIB:IIE,IJB:IJE,IKB:IKE,JSV-NSV_DSTBEG+1) *& @@ -240,7 +240,7 @@ IF ((LSALT).AND.(LSEDIMSALT)) THEN XRHODREF(IIB:IIE,IJB:IJE,IKB:IKE), & XPABST(IIB:IIE,IJB:IJE,IKB:IKE), & XZZ(IIB:IIE,IJB:IJE,IKB:IKE+1), & - ZSVT(IIB:IIE,IJB:IJE,IKB:IKE,:)) !ppp (concentration) + ZSVT(IIB:IIE,IJB:IJE,IKB:IKE,:)) !ppv (concentration) ! -- JORIS DEBUG -- DO JSV = NSV_SLTBEG, NSV_SLTEND diff --git a/src/MNH/aircraft_balloon.f90 b/src/MNH/aircraft_balloon.f90 index ef6648cd6972e9caf618a7fa101eca6d44f82d66..3f7e8384f0663de5a2d13fca6f276ec1ca15e7ea 100644 --- a/src/MNH/aircraft_balloon.f90 +++ b/src/MNH/aircraft_balloon.f90 @@ -1,119 +1,65 @@ -!MNH_LIC Copyright 2000-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2000-2023 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. !----------------------------------------------------------------- +! Author: Valery Masson (Meteo-France) +! Original 15/05/2000 +! Modifications: +! P. Lacarrere 03/2008: add 3D fluxes +! P. Wautelet 05/2016-04/2018: new data structures and calls for I/O +! P. Wautelet 13/09/2019: budget: simplify and modernize date/time management +! P. Wautelet 06/2022: reorganize flyers +!----------------------------------------------------------------- ! ##################### -MODULE MODI_AIRCRAFT_BALLOON +MODULE MODE_AIRCRAFT_BALLOON ! ##################### -! -INTERFACE -! - SUBROUTINE AIRCRAFT_BALLOON(PTSTEP, & - PXHAT, PYHAT, PZ, & - PMAP, PLONOR, PLATOR, & - PU, PV, PW, PP, PTH, PR, PSV, PTKE, & - PTS, PRHODREF, PCIT, PSEA) -! -REAL, INTENT(IN) :: PTSTEP ! time step -REAL, DIMENSION(:), INTENT(IN) :: PXHAT ! x coordinate -REAL, DIMENSION(:), INTENT(IN) :: PYHAT ! y coordinate -REAL, DIMENSION(:,:,:), INTENT(IN) :: PZ ! z -REAL, DIMENSION(:,:), INTENT(IN) :: PMAP ! map factor -REAL, INTENT(IN) :: PLONOR ! origine longitude -REAL, INTENT(IN) :: PLATOR ! origine latitude -REAL, DIMENSION(:,:,:), INTENT(IN) :: PU ! horizontal wind X component -REAL, DIMENSION(:,:,:), INTENT(IN) :: PV ! horizontal wind Y component -REAL, DIMENSION(:,:,:), INTENT(IN) :: PW ! vertical wind -REAL, DIMENSION(:,:,:), INTENT(IN) :: PP ! pressure -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTH ! potential temperature -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PR ! water mixing ratios -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSV ! Scalar variables -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKE ! turbulent kinetic energy -REAL, DIMENSION(:,:), INTENT(IN) :: PTS ! surface temperature -! ++ OC -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! dry air density of the reference state -REAL, DIMENSION(:,:,:), INTENT(IN) :: PCIT ! pristine ice concentration -REAL, DIMENSION(:,:),OPTIONAL,INTENT(IN) :: PSEA -! -- OC -! -!------------------------------------------------------------------------------- -! -END SUBROUTINE AIRCRAFT_BALLOON -! -SUBROUTINE AIRCRAFT_BALLOON_LONGTYPE_GET( TPFLYER, HLONGTYPE ) - USE MODD_AIRCRAFT_BALLOON, ONLY: FLYER - TYPE(FLYER), INTENT(IN) :: TPFLYER - CHARACTER(LEN=*), INTENT(OUT) :: HLONGTYPE -END SUBROUTINE AIRCRAFT_BALLOON_LONGTYPE_GET +USE MODE_MSG -END INTERFACE -! -END MODULE MODI_AIRCRAFT_BALLOON -! -! ################################################################### - SUBROUTINE AIRCRAFT_BALLOON(PTSTEP, & - PXHAT, PYHAT, PZ, & - PMAP, PLONOR, PLATOR, & - PU, PV, PW, PP, PTH, PR, PSV, PTKE, & - PTS, PRHODREF, PCIT, PSEA) -! ################################################################### -! -! -!!**** *AIRCRAFT_BALLOON* - monitor for balloons and aircrafts -!! -!! PURPOSE -!! ------- -! -! -!!** METHOD -!! ------ -!! -!! -!! -!! EXTERNAL -!! -------- -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! -!! REFERENCE -!! --------- -!! -!! AUTHOR -!! ------ -!! Valery Masson * Meteo-France * -!! -!! MODIFICATIONS -!! ------------- -!! Original 15/05/2000 -!! -!! March, 2008 (P.Lacarrere) Add 3D fluxes -! P. Wautelet 05/2016-04/2018: new data structures and calls for I/O -! P. Wautelet 13/09/2019: budget: simplify and modernize date/time management -! -------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ +IMPLICIT NONE + +PRIVATE + +PUBLIC :: AIRCRAFT_BALLOON + +PUBLIC :: AIRCRAFT_BALLOON_LONGTYPE_GET + +PUBLIC :: FLYER_RECV_AND_ALLOCATE, FLYER_SEND + +INTEGER, PARAMETER :: NTAG_NCUR = 145 +INTEGER, PARAMETER :: NTAG_PACK = 245 + +INTEGER, PARAMETER :: NMODEL_FIX = 1 +INTEGER, PARAMETER :: NMODEL_MOB = 2 + +INTEGER, PARAMETER :: NTYPE_AIRCRA = 0 +INTEGER, PARAMETER :: NTYPE_CVBALL = 1 +INTEGER, PARAMETER :: NTYPE_ISODEN = 2 +INTEGER, PARAMETER :: NTYPE_RADIOS = 4 + + +CONTAINS ! +! ################################################################# + SUBROUTINE AIRCRAFT_BALLOON(PTSTEP, PZ, & + PMAP, PLONOR, PLATOR, & + PU, PV, PW, PP, PTH, PR, PSV, PTKE, & + PTS, PRHODREF, PCIT, PSEA ) +! ################################################################# +! *AIRCRAFT_BALLOON* - monitor for balloons and aircrafts + USE MODD_AIRCRAFT_BALLOON -! USE MODD_TURB_FLUX_AIRCRAFT_BALLOON -USE MODI_AIRCRAFT_BALLOON_EVOL -! -USE MODE_ll -! -! + +USE MODE_AIRCRAFT_BALLOON_EVOL, ONLY: AIRCRAFT_BALLOON_EVOL + IMPLICIT NONE ! -! !* 0.1 declarations of arguments ! ! REAL, INTENT(IN) :: PTSTEP ! time step -REAL, DIMENSION(:), INTENT(IN) :: PXHAT ! x coordinate -REAL, DIMENSION(:), INTENT(IN) :: PYHAT ! y coordinate REAL, DIMENSION(:,:,:), INTENT(IN) :: PZ ! z array REAL, DIMENSION(:,:), INTENT(IN) :: PMAP ! map factor REAL, INTENT(IN) :: PLONOR ! origine longitude @@ -129,249 +75,797 @@ REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKE ! turbulent kinetic energy REAL, DIMENSION(:,:), INTENT(IN) :: PTS ! surface temperature REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! dry air density of the reference state REAL, DIMENSION(:,:,:), INTENT(IN) :: PCIT ! pristine ice concentration -REAL, DIMENSION(:,:),INTENT(IN) :: PSEA +REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PSEA ! !------------------------------------------------------------------------------- ! ! 0.2 declaration of local variables ! -! +INTEGER :: JI +LOGICAL, SAVE :: GFIRSTCALL = .TRUE. !---------------------------------------------------------------------------- -IF(.NOT. ALLOCATED(XTHW_FLUX)) & -ALLOCATE(XTHW_FLUX(SIZE(PTH,1),SIZE(PTH,2),SIZE(PTH,3))) -IF(.NOT. ALLOCATED(XRCW_FLUX)) & -ALLOCATE(XRCW_FLUX(SIZE(PTH,1),SIZE(PTH,2),SIZE(PTH,3))) -IF(.NOT. ALLOCATED(XSVW_FLUX)) & -ALLOCATE(XSVW_FLUX(SIZE(PSV,1),SIZE(PSV,2),SIZE(PSV,3),SIZE(PSV,4))) -! -IF (TBALLOON1%NMODEL /= 0) THEN -CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & - PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT, & - TBALLOON1, PSEA ) -ENDIF -IF (TBALLOON2%NMODEL /= 0) THEN -CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & - PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT, & - TBALLOON2, PSEA ) -ENDIF -IF (TBALLOON3%NMODEL /= 0) THEN -CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & - PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT, & - TBALLOON3, PSEA ) -ENDIF -IF (TBALLOON4%NMODEL /= 0) THEN -CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & - PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT, & - TBALLOON4, PSEA ) -ENDIF -IF (TBALLOON5%NMODEL /= 0) THEN -CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & - PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT, & - TBALLOON5, PSEA ) -ENDIF -IF (TBALLOON6%NMODEL /= 0) THEN -CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & - PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT, & - TBALLOON6, PSEA ) -ENDIF -IF (TBALLOON7%NMODEL /= 0) THEN -CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & - PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT, & - TBALLOON7, PSEA ) -ENDIF -IF (TBALLOON8%NMODEL /= 0) THEN -CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & - PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT, & - TBALLOON8, PSEA ) -ENDIF -IF (TBALLOON9%NMODEL /= 0) THEN -CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & - PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT, & - TBALLOON9, PSEA ) -ENDIF -! -IF (TAIRCRAFT1%NMODEL /= 0) THEN -CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & - PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT, & - TAIRCRAFT1, PSEA ) -ENDIF -IF (TAIRCRAFT2%NMODEL /= 0) THEN -CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & - PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT, & - TAIRCRAFT2, PSEA ) -ENDIF -IF (TAIRCRAFT3%NMODEL /= 0) THEN -CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & - PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT, & - TAIRCRAFT3, PSEA ) -ENDIF -IF (TAIRCRAFT4%NMODEL /= 0) THEN -CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & - PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT, & - TAIRCRAFT4, PSEA ) -ENDIF -IF (TAIRCRAFT5%NMODEL /= 0) THEN -CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & - PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT, & - TAIRCRAFT5, PSEA ) -ENDIF -IF (TAIRCRAFT6%NMODEL /= 0) THEN -CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & - PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT, & - TAIRCRAFT6, PSEA ) -ENDIF -IF (TAIRCRAFT7%NMODEL /= 0) THEN -CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & - PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT, & - TAIRCRAFT7, PSEA ) -ENDIF -IF (TAIRCRAFT8%NMODEL /= 0) THEN -CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & - PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT, & - TAIRCRAFT8, PSEA ) -ENDIF -IF (TAIRCRAFT9%NMODEL /= 0) THEN -CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & - PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT, & - TAIRCRAFT9, PSEA ) -ENDIF -IF (TAIRCRAFT10%NMODEL /= 0) THEN -CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & - PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT, & - TAIRCRAFT10, PSEA ) -ENDIF -IF (TAIRCRAFT11%NMODEL /= 0) THEN -CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & - PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT, & - TAIRCRAFT11, PSEA ) -ENDIF -IF (TAIRCRAFT12%NMODEL /= 0) THEN -CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & - PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT, & - TAIRCRAFT12, PSEA ) -ENDIF -IF (TAIRCRAFT13%NMODEL /= 0) THEN -CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & - PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT, & - TAIRCRAFT13, PSEA ) -ENDIF -IF (TAIRCRAFT14%NMODEL /= 0) THEN -CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & - PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT, & - TAIRCRAFT14, PSEA ) -ENDIF -IF (TAIRCRAFT15%NMODEL /= 0) THEN -CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & - PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT, & - TAIRCRAFT15, PSEA ) -ENDIF -IF (TAIRCRAFT16%NMODEL /= 0) THEN -CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & - PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT, & - TAIRCRAFT16, PSEA ) -ENDIF -IF (TAIRCRAFT17%NMODEL /= 0) THEN -CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & - PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT, & - TAIRCRAFT17, PSEA ) -ENDIF -IF (TAIRCRAFT18%NMODEL /= 0) THEN -CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & - PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT, & - TAIRCRAFT18, PSEA ) -ENDIF -IF (TAIRCRAFT19%NMODEL /= 0) THEN -CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & - PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT, & - TAIRCRAFT19, PSEA ) -ENDIF -IF (TAIRCRAFT20%NMODEL /= 0) THEN -CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & - PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT, & - TAIRCRAFT20, PSEA ) -ENDIF -IF (TAIRCRAFT21%NMODEL /= 0) THEN -CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & - PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT, & - TAIRCRAFT21, PSEA ) -ENDIF -IF (TAIRCRAFT22%NMODEL /= 0) THEN -CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & - PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT, & - TAIRCRAFT22, PSEA ) -ENDIF -IF (TAIRCRAFT23%NMODEL /= 0) THEN -CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & - PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT, & - TAIRCRAFT23, PSEA ) -ENDIF -IF (TAIRCRAFT24%NMODEL /= 0) THEN -CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & - PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT, & - TAIRCRAFT24, PSEA ) -ENDIF -IF (TAIRCRAFT25%NMODEL /= 0) THEN -CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & - PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT, & - TAIRCRAFT25, PSEA ) -ENDIF -IF (TAIRCRAFT26%NMODEL /= 0) THEN -CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & - PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT, & - TAIRCRAFT26, PSEA ) -ENDIF -IF (TAIRCRAFT27%NMODEL /= 0) THEN -CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & - PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT, & - TAIRCRAFT27, PSEA ) -ENDIF -IF (TAIRCRAFT28%NMODEL /= 0) THEN -CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & - PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT, & - TAIRCRAFT28, PSEA ) -ENDIF -IF (TAIRCRAFT29%NMODEL /= 0) THEN -CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & - PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT, & - TAIRCRAFT29, PSEA ) -ENDIF -IF (TAIRCRAFT30%NMODEL /= 0) THEN -CALL AIRCRAFT_BALLOON_EVOL(PTSTEP, PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & - PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT, & - TAIRCRAFT30, PSEA ) -ENDIF + +CALL PRINT_MSG( NVERB_DEBUG, 'GEN', 'AIRCRAFT_BALLOON', 'called' ) + +IF(.NOT. ALLOCATED(XTHW_FLUX)) ALLOCATE(XTHW_FLUX(SIZE(PTH,1),SIZE(PTH,2),SIZE(PTH,3))) +IF(.NOT. ALLOCATED(XRCW_FLUX)) ALLOCATE(XRCW_FLUX(SIZE(PTH,1),SIZE(PTH,2),SIZE(PTH,3))) +IF(.NOT. ALLOCATED(XSVW_FLUX)) ALLOCATE(XSVW_FLUX(SIZE(PSV,1),SIZE(PSV,2),SIZE(PSV,3),SIZE(PSV,4))) + +IF ( NBALLOONS > 0 ) THEN + IF ( GFIRSTCALL ) CALL BALLOONS_INIT_POSITIONS() + NRANKCUR_BALLOON(:) = NRANKNXT_BALLOON(:) + NRANKNXT_BALLOON(:) = 0 + + DO JI = 1, NBALLOONS + IF ( ASSOCIATED( TBALLOONS(JI)%TBALLOON ) ) THEN + CALL AIRCRAFT_BALLOON_EVOL( PTSTEP, PZ, PMAP, PLONOR, PLATOR, & + PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT, & + TBALLOONS(JI)%TBALLOON, NRANKCUR_BALLOON(JI), NRANKNXT_BALLOON(JI), & + PSEA ) + END IF + END DO + + CALL BALLOONS_MOVE_TO_NEW_RANKS() + +END IF ! +IF ( NAIRCRAFTS > 0 ) THEN + IF ( GFIRSTCALL ) CALL AIRCRAFTS_INIT_POSITIONS() + NRANKCUR_AIRCRAFT(:) = NRANKNXT_AIRCRAFT(:) + NRANKNXT_AIRCRAFT(:) = 0 + + DO JI = 1, NAIRCRAFTS + IF ( ASSOCIATED( TAIRCRAFTS(JI)%TAIRCRAFT ) ) THEN + CALL AIRCRAFT_BALLOON_EVOL( PTSTEP, PZ, PMAP, PLONOR, PLATOR, & + PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT, & + TAIRCRAFTS(JI)%TAIRCRAFT, NRANKCUR_AIRCRAFT(JI), NRANKNXT_AIRCRAFT(JI), & + PSEA ) + END IF + END DO + + CALL AIRCRAFTS_MOVE_TO_NEW_RANKS() +END IF + +GFIRSTCALL = .FALSE. + +CONTAINS + !---------------------------------------------------------------------------- -! -END SUBROUTINE AIRCRAFT_BALLOON +SUBROUTINE AIRCRAFTS_INIT_POSITIONS() + +USE MODD_DYN_n, ONLY: DYN_MODEL +USE MODD_IO, ONLY: ISP +USE MODD_TIME_n, ONLY: TDTCUR + +USE MODE_AIRCRAFT_BALLOON_EVOL, ONLY: AIRCRAFT_COMPUTE_POSITION, FLYER_GET_RANK_MODEL_ISCRASHED +USE MODE_DATETIME + +INTEGER :: IMODEL +REAL :: ZDELTATIME +TYPE(DATE_TIME) :: TZDATE +TYPE(TAIRCRAFTDATA), POINTER :: TZAIRCRAFT +! Set next rank to 0 (necessary for MPI_ALLREDUCE) +NRANKNXT_AIRCRAFT(:) = 0 +IF ( ISP == NFLYER_DEFAULT_RANK ) THEN + DO JI = 1, NAIRCRAFTS + IF ( .NOT. ASSOCIATED( TAIRCRAFTS(JI)%TAIRCRAFT ) ) & + CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'AIRCRAFT_BALLOON', 'aircraft structure not associated' ) + + ! Compute position at take-off (or at first timestep in flight) + TZAIRCRAFT => TAIRCRAFTS(JI)%TAIRCRAFT + + ! Determine moment of the first positioning + ! This is done at first call of this subroutine and therefore not necessarily on the correct model + IF ( TDTCUR < TZAIRCRAFT%TLAUNCH ) THEN + ! Moment is the first timestep since launch date + ZDELTATIME = TZAIRCRAFT%TLAUNCH - TDTCUR + 1.E-8 + IF ( TZAIRCRAFT%CMODEL == 'FIX' ) THEN + IMODEL = TZAIRCRAFT%NMODEL + ELSE ! 'MOB' + IMODEL = 1 + END IF + TZDATE = TDTCUR + INT( ZDELTATIME / DYN_MODEL(IMODEL)%XTSTEP ) * DYN_MODEL(IMODEL)%XTSTEP + ELSE IF ( TDTCUR > TZAIRCRAFT%TLAND ) THEN + ! Nothing to do + ! Aircraft will never be in flight in this run. Data will remain on the initial process. + ELSE + ! Aircraft is already in flight at the beginning of the run + TZDATE = TDTCUR + END IF + + CALL AIRCRAFT_COMPUTE_POSITION( TZDATE, TZAIRCRAFT ) + + ! Get rank of the process where the aircraft is at this moment and the model number + CALL FLYER_GET_RANK_MODEL_ISCRASHED( TZAIRCRAFT ) + + NRANKNXT_AIRCRAFT(JI) = TZAIRCRAFT%NRANK_CUR + END DO +END IF + +CALL AIRCRAFTS_MOVE_TO_NEW_RANKS() + +END SUBROUTINE AIRCRAFTS_INIT_POSITIONS +!---------------------------------------------------------------------------- +!---------------------------------------------------------------------------- +SUBROUTINE AIRCRAFTS_MOVE_TO_NEW_RANKS() + +USE MODD_IO, ONLY: ISP +USE MODD_MPIF +USE MODD_PRECISION, ONLY: MNHINT_MPI +USE MODD_VAR_ll, ONLY: NMNH_COMM_WORLD + +INTEGER :: IERR + +CALL MPI_ALLREDUCE( MPI_IN_PLACE, NRANKNXT_AIRCRAFT, NAIRCRAFTS, MNHINT_MPI, MPI_MAX, NMNH_COMM_WORLD, IERR ) +DO JI = 1, NAIRCRAFTS + IF ( NRANKNXT_AIRCRAFT(JI) /= NRANKCUR_AIRCRAFT(JI) ) THEN + IF ( ISP == NRANKCUR_AIRCRAFT(JI) ) THEN + CALL FLYER_SEND_AND_DEALLOCATE( TAIRCRAFTS(JI)%TAIRCRAFT, NRANKNXT_AIRCRAFT(JI) ) + DEALLOCATE( TAIRCRAFTS(JI)%TAIRCRAFT ) + ELSE IF ( ISP == NRANKNXT_AIRCRAFT(JI) ) THEN + IF ( ASSOCIATED( TAIRCRAFTS(JI)%TAIRCRAFT ) ) & + call Print_msg( NVERB_FATAL, 'GEN', 'AIRCRAFT_BALLOON', 'aircraft already associated' ) + ALLOCATE( TAIRCRAFTS(JI)%TAIRCRAFT ) + CALL FLYER_RECV_AND_ALLOCATE( TAIRCRAFTS(JI)%TAIRCRAFT, NRANKCUR_AIRCRAFT(JI) ) + END IF + END IF +END DO + +END SUBROUTINE AIRCRAFTS_MOVE_TO_NEW_RANKS +!---------------------------------------------------------------------------- +!---------------------------------------------------------------------------- +SUBROUTINE BALLOONS_INIT_POSITIONS() + +USE MODD_IO, ONLY: ISP + +USE MODE_AIRCRAFT_BALLOON_EVOL, ONLY: FLYER_GET_RANK_MODEL_ISCRASHED + +TYPE(TBALLOONDATA), POINTER :: TZBALLOON + +! Set next rank to 0 (necessary for MPI_ALLREDUCE) +NRANKNXT_BALLOON(:) = 0 + +IF ( ISP == NFLYER_DEFAULT_RANK ) THEN + DO JI = 1, NBALLOONS + IF ( .NOT. ASSOCIATED( TBALLOONS(JI)%TBALLOON ) ) & + CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'AIRCRAFT_BALLOON', 'balloon structure not associated' ) + + TZBALLOON => TBALLOONS(JI)%TBALLOON + + ! Initialize model number (and rank) + ! This is not done in initialisation phase because some data is not yet available at this early stage + ! (XXHAT_ll of all models are needed by FIND_PROCESS_AND_MODEL_FROM_XY_POS) + IF ( .NOT. TZBALLOON%LPOSITION_INIT ) THEN + TZBALLOON%LPOSITION_INIT = .TRUE. + ! Get rank of the process where the balloon is and the model number + IF ( TZBALLOON%LFLY ) THEN + ! In this case, we are in a restart and the balloon position was read in the restart file + CALL FLYER_GET_RANK_MODEL_ISCRASHED( TZBALLOON ) + ELSE + CALL FLYER_GET_RANK_MODEL_ISCRASHED( TZBALLOON, PX = TZBALLOON%XXLAUNCH, PY = TZBALLOON%XYLAUNCH ) + END IF + IF ( TZBALLOON%LCRASH ) THEN + CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'AIRCRAFT_BALLOON', 'balloon ' // TRIM( TZBALLOON%CTITLE ) & + // ': launch coordinates are outside of horizontal physical domain' ) + END IF + ELSE + CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'AIRCRAFT_BALLOON', 'balloon ' // TRIM( TZBALLOON%CTITLE ) & + // ': position has already been initialized' ) + END IF + + NRANKNXT_BALLOON(JI) = TZBALLOON%NRANK_CUR + END DO +END IF + +CALL BALLOONS_MOVE_TO_NEW_RANKS() + +END SUBROUTINE BALLOONS_INIT_POSITIONS +!---------------------------------------------------------------------------- +!---------------------------------------------------------------------------- +SUBROUTINE BALLOONS_MOVE_TO_NEW_RANKS() + +USE MODD_IO, ONLY: ISP +USE MODD_MPIF +USE MODD_PRECISION, ONLY: MNHINT_MPI +USE MODD_VAR_ll, ONLY: NMNH_COMM_WORLD + +INTEGER :: IERR + +CALL MPI_ALLREDUCE( MPI_IN_PLACE, NRANKNXT_BALLOON, NBALLOONS, MNHINT_MPI, MPI_MAX, NMNH_COMM_WORLD, IERR ) + +DO JI = 1, NBALLOONS + IF ( NRANKNXT_BALLOON(JI) /= NRANKCUR_BALLOON(JI) ) THEN + IF ( ISP == NRANKCUR_BALLOON(JI) ) THEN + CALL FLYER_SEND_AND_DEALLOCATE( TBALLOONS(JI)%TBALLOON, NRANKNXT_BALLOON(JI) ) + DEALLOCATE( TBALLOONS(JI)%TBALLOON ) + ELSE IF ( ISP == NRANKNXT_BALLOON(JI) ) THEN + ALLOCATE( TBALLOONS(JI)%TBALLOON ) + CALL FLYER_RECV_AND_ALLOCATE( TBALLOONS(JI)%TBALLOON, NRANKCUR_BALLOON(JI) ) + END IF + END IF +END DO + +END SUBROUTINE BALLOONS_MOVE_TO_NEW_RANKS +!---------------------------------------------------------------------------- +END SUBROUTINE AIRCRAFT_BALLOON +!---------------------------------------------------------------------------- +!---------------------------------------------------------------------------- SUBROUTINE AIRCRAFT_BALLOON_LONGTYPE_GET( TPFLYER, HLONGTYPE ) -USE MODD_AIRCRAFT_BALLOON, ONLY: FLYER +USE MODD_AIRCRAFT_BALLOON, ONLY: taircraftdata, tballoondata, TFLYERDATA -USE MODE_MSG +IMPLICIT NONE -TYPE(FLYER), INTENT(IN) :: TPFLYER -CHARACTER(LEN=*), INTENT(OUT) :: HLONGTYPE +CLASS(TFLYERDATA), INTENT(IN) :: TPFLYER +CHARACTER(LEN=*), INTENT(OUT) :: HLONGTYPE character(len=:), allocatable :: ytype -if ( Trim( TPFLYER%TYPE ) == 'AIRCRA' ) then - ytype = 'Aircrafts' -else if ( Trim( TPFLYER%TYPE ) == 'RADIOS' ) then - ytype = 'Radiosonde_balloons' -else if ( Trim( TPFLYER%TYPE ) == 'ISODEN' ) then - ytype = 'Isodensity_balloons' -else if ( Trim( TPFLYER%TYPE ) == 'CVBALL' ) then - ytype = 'Constant_volume_balloons' -else - call Print_msg( NVERB_ERROR, 'GEN', 'AIRCRAFT_BALLOON_LONGTYPE_GET', 'unknown category for flyer ' // Trim( tpflyer%title ) ) - ytype = 'Unknown' -end if +select type ( tpflyer ) + class is ( taircraftdata ) + ytype = 'Aircrafts' + + class is ( tballoondata ) + if ( Trim( TPFLYER%CTYPE ) == 'RADIOS' ) then + ytype = 'Radiosonde_balloons' + else if ( Trim( TPFLYER%CTYPE ) == 'ISODEN' ) then + ytype = 'Isodensity_balloons' + else if ( Trim( TPFLYER%CTYPE ) == 'CVBALL' ) then + ytype = 'Constant_volume_balloons' + else + call Print_msg( NVERB_ERROR, 'GEN', 'AIRCRAFT_BALLOON_LONGTYPE_GET', 'unknown category for flyer ' // Trim( tpflyer%ctitle ) ) + ytype = 'Unknown' + end if + + class default + call Print_msg( NVERB_ERROR, 'GEN', 'AIRCRAFT_BALLOON_LONGTYPE_GET', 'unknown class for flyer ' // Trim( tpflyer%ctitle ) ) + ytype = 'Unknown' + +end select if ( Len_trim( ytype ) > Len( HLONGTYPE ) ) & call Print_msg( NVERB_WARNING, 'GEN', 'AIRCRAFT_BALLOON_LONGTYPE_GET', & - 'HLONGTYPE truncated for flyer ' // Trim( tpflyer%title ) ) + 'HLONGTYPE truncated for flyer ' // Trim( tpflyer%ctitle ) ) HLONGTYPE = Trim( ytype ) END SUBROUTINE AIRCRAFT_BALLOON_LONGTYPE_GET +!---------------------------------------------------------------------------- +!---------------------------------------------------------------------------- + +SUBROUTINE FLYER_SEND( TPFLYER, KTO ) + +USE MODD_AIRCRAFT_BALLOON, ONLY: TAIRCRAFTDATA, TBALLOONDATA, TFLYERDATA +USE MODD_CONF_n, ONLY: NRR +USE MODD_DIM_n, ONLY: NKMAX +USE MODD_IO, ONLY: ISP +USE MODD_MPIF +USE MODD_NSV, ONLY: NSV +USE MODD_PARAMETERS, ONLY: JPVEXT +USE MODD_PARAM_n, ONLY: CCLOUD +USE MODD_PRECISION, ONLY: MNHINT_MPI, MNHREAL_MPI +USE MODD_VAR_LL, ONLY: NMNH_COMM_WORLD + +USE MODE_DATETIME + +IMPLICIT NONE + +CLASS(TFLYERDATA), INTENT(INOUT) :: TPFLYER +INTEGER, INTENT(IN) :: KTO ! Process to which to send flyer data + +CHARACTER(LEN=10) :: YFROM, YTO +INTEGER :: IERR +INTEGER :: IKU ! number of vertical levels +INTEGER :: IPACKSIZE ! Size of the ZPACK buffer +INTEGER :: IPOS ! Position in the ZPACK buffer +INTEGER :: IPOSAIR +INTEGER :: ISTORE_CUR +INTEGER :: JI +INTEGER, DIMENSION(3) :: ISTORES +REAL, DIMENSION(:), ALLOCATABLE :: ZPACK ! Buffer to store raw data of a profiler (used for MPI communication) + +WRITE( YFROM, '( I10 )' ) ISP +WRITE( YTO, '( I10 )' ) KTO +CALL PRINT_MSG( NVERB_DEBUG, 'GEN', 'FLYER_SEND', 'send flyer '//TRIM(TPFLYER%CTITLE)//': '//TRIM(YFROM)//'->'//TRIM(YTO), & + OLOCAL = .TRUE. ) + +IKU = NKMAX + 2 * JPVEXT + +ISTORE_CUR = TPFLYER%TFLYER_TIME%N_CUR + +! Prepare data to send + +! Determine size of data to send +! Characters, integers and logicals will be converted to reals. CMODEL and CTYPE will be coded by 1 real +IPACKSIZE = 15 + LEN(TPFLYER%CTITLE) + ISTORE_CUR * ( 18 + NRR + NSV * 2 + IKU * ( 9 + NRR ) ) +IF ( CCLOUD == 'LIMA' ) IPACKSIZE = IPACKSIZE + ISTORE_CUR * IKU * 2 + +SELECT TYPE ( TPFLYER ) + CLASS IS ( TAIRCRAFTDATA ) + IPACKSIZE = IPACKSIZE + 6 + TPFLYER%NPOS * 6 + + CLASS IS ( TBALLOONDATA ) + IPACKSIZE = IPACKSIZE + 15 +END SELECT + +! Communication is in 2 phases: +! 1) first send the ISTORE dimension (optimisation: only what has already been written = N_CUR) +! 2) send data +ISTORES(1) = ISTORE_CUR ! Number of currently used store positions +ISTORES(2) = SIZE( TPFLYER%NMODELHIST ) ! Total number of store positions +ISTORES(3) = IPACKSIZE +CALL MPI_SEND( ISTORES, 3, MNHINT_MPI, KTO-1, NTAG_NCUR, NMNH_COMM_WORLD, IERR ) + +ALLOCATE( ZPACK(IPACKSIZE) ) + +! Fill buffer / pack data +IPOS = 1 +IF ( TPFLYER%CMODEL == 'FIX' ) THEN + ZPACK(IPOS) = NMODEL_FIX +ELSE + ZPACK(IPOS) = NMODEL_MOB +END IF +IPOS = IPOS + 1 + +ZPACK(IPOS) = TPFLYER%NMODEL; IPOS = IPOS + 1 +ZPACK(IPOS) = TPFLYER%NID; IPOS = IPOS + 1 + +SELECT CASE( TPFLYER%CTYPE ) + CASE( 'AIRCRA' ) + ZPACK(IPOS) = NTYPE_AIRCRA + CASE( 'CVBALL' ) + ZPACK(IPOS) = NTYPE_CVBALL + CASE( 'ISODEN' ) + ZPACK(IPOS) = NTYPE_ISODEN + CASE( 'RADIOS' ) + ZPACK(IPOS) = NTYPE_RADIOS + CASE DEFAULT + CALL PRINT_MSG( NVERB_FATAL, 'FLYER_SEND', 'invalid CTYPE for flyer' ) +END SELECT +IPOS = IPOS + 1 + +! Convert title characters to integers +DO JI = 1, LEN(TPFLYER%CTITLE) + ZPACK(IPOS) = ICHAR( TPFLYER%CTITLE(JI:JI) ) + IPOS = IPOS + 1 +END DO + +ZPACK(IPOS) = TPFLYER%TLAUNCH - TPREFERENCE_DATE; IPOS = IPOS + 1 +IF ( TPFLYER%LCRASH ) THEN + ZPACK(IPOS) = 1.d0 +ELSE + ZPACK(IPOS) = 0.d0 +END IF +IPOS = IPOS + 1 + +ZPACK(IPOS) = TPFLYER%NCRASH; IPOS = IPOS + 1 + +IF ( TPFLYER%LFLY ) THEN + ZPACK(IPOS) = 1.d0 +ELSE + ZPACK(IPOS) = 0.d0 +END IF +IPOS = IPOS + 1 + +IF ( TPFLYER%LSTORE ) THEN + ZPACK(IPOS) = 1.d0 +ELSE + ZPACK(IPOS) = 0.d0 +END IF +IPOS = IPOS + 1 + +ZPACK(IPOS) = TPFLYER%TFLYER_TIME%N_CUR; IPOS = IPOS + 1 +ZPACK(IPOS) = TPFLYER%TFLYER_TIME%XTSTEP; IPOS = IPOS + 1 +DO JI = 1, ISTORE_CUR + ZPACK(IPOS) = TPFLYER%TFLYER_TIME%TPDATES(JI) - TPREFERENCE_DATE; IPOS = IPOS + 1 +END DO + +ZPACK(IPOS) = TPFLYER%XX_CUR; IPOS = IPOS + 1 +ZPACK(IPOS) = TPFLYER%XY_CUR; IPOS = IPOS + 1 +ZPACK(IPOS) = TPFLYER%XZ_CUR; IPOS = IPOS + 1 + +ZPACK(IPOS) = TPFLYER%NRANK_CUR; IPOS = IPOS + 1 + +ZPACK(IPOS:IPOS+ISTORE_CUR-1) = TPFLYER%NMODELHIST(1:ISTORE_CUR); IPOS = IPOS + ISTORE_CUR + +ZPACK(IPOS:IPOS+ISTORE_CUR-1) = TPFLYER%XX(1:ISTORE_CUR) ; IPOS = IPOS + ISTORE_CUR +ZPACK(IPOS:IPOS+ISTORE_CUR-1) = TPFLYER%XY(1:ISTORE_CUR) ; IPOS = IPOS + ISTORE_CUR +ZPACK(IPOS:IPOS+ISTORE_CUR-1) = TPFLYER%XZ(1:ISTORE_CUR) ; IPOS = IPOS + ISTORE_CUR +ZPACK(IPOS:IPOS+ISTORE_CUR-1) = TPFLYER%XLAT(1:ISTORE_CUR) ; IPOS = IPOS + ISTORE_CUR +ZPACK(IPOS:IPOS+ISTORE_CUR-1) = TPFLYER%XLON(1:ISTORE_CUR) ; IPOS = IPOS + ISTORE_CUR +ZPACK(IPOS:IPOS+ISTORE_CUR-1) = TPFLYER%XZON(1:ISTORE_CUR) ; IPOS = IPOS + ISTORE_CUR +ZPACK(IPOS:IPOS+ISTORE_CUR-1) = TPFLYER%XMER(1:ISTORE_CUR) ; IPOS = IPOS + ISTORE_CUR +ZPACK(IPOS:IPOS+ISTORE_CUR-1) = TPFLYER%XW(1:ISTORE_CUR) ; IPOS = IPOS + ISTORE_CUR +ZPACK(IPOS:IPOS+ISTORE_CUR-1) = TPFLYER%XP(1:ISTORE_CUR) ; IPOS = IPOS + ISTORE_CUR +ZPACK(IPOS:IPOS+ISTORE_CUR-1) = TPFLYER%XTKE(1:ISTORE_CUR) ; IPOS = IPOS + ISTORE_CUR +ZPACK(IPOS:IPOS+ISTORE_CUR-1) = TPFLYER%XTKE_DISS(1:ISTORE_CUR) ; IPOS = IPOS + ISTORE_CUR +ZPACK(IPOS:IPOS+ISTORE_CUR-1) = TPFLYER%XTH(1:ISTORE_CUR) ; IPOS = IPOS + ISTORE_CUR + +ZPACK(IPOS:IPOS+ISTORE_CUR*NRR-1) = RESHAPE( TPFLYER%XR(1:ISTORE_CUR,1:NRR), [ISTORE_CUR*NRR] ) ; IPOS = IPOS + ISTORE_CUR * NRR +ZPACK(IPOS:IPOS+ISTORE_CUR*NSV-1) = RESHAPE( TPFLYER%XSV(1:ISTORE_CUR,1:NSV), [ISTORE_CUR*NSV] ) ; IPOS = IPOS + ISTORE_CUR * NSV +ZPACK(IPOS:IPOS+ISTORE_CUR*IKU-1) = RESHAPE( TPFLYER%XRTZ(1:ISTORE_CUR,1:IKU), [ISTORE_CUR*IKU] ) ; IPOS = IPOS + ISTORE_CUR * IKU + +ZPACK(IPOS:IPOS+ISTORE_CUR*IKU*NRR-1) = RESHAPE( TPFLYER%XRZ(1:ISTORE_CUR,1:IKU,1:NRR), [ISTORE_CUR*IKU*NRR] ) +IPOS = IPOS + ISTORE_CUR * IKU * NRR + +ZPACK(IPOS:IPOS+ISTORE_CUR*IKU-1) = RESHAPE( TPFLYER%XFFZ(1:ISTORE_CUR,1:IKU), [ISTORE_CUR*IKU] ) ; IPOS = IPOS + ISTORE_CUR * IKU +ZPACK(IPOS:IPOS+ISTORE_CUR*IKU-1) = RESHAPE( TPFLYER%XIWCZ(1:ISTORE_CUR,1:IKU), [ISTORE_CUR*IKU] ); IPOS = IPOS + ISTORE_CUR * IKU +ZPACK(IPOS:IPOS+ISTORE_CUR*IKU-1) = RESHAPE( TPFLYER%XLWCZ(1:ISTORE_CUR,1:IKU), [ISTORE_CUR*IKU] ); IPOS = IPOS + ISTORE_CUR * IKU +ZPACK(IPOS:IPOS+ISTORE_CUR*IKU-1) = RESHAPE( TPFLYER%XCIZ(1:ISTORE_CUR,1:IKU), [ISTORE_CUR*IKU] ) ; IPOS = IPOS + ISTORE_CUR * IKU +IF ( CCLOUD == 'LIMA' ) THEN + ZPACK(IPOS:IPOS+ISTORE_CUR*IKU-1) = RESHAPE( TPFLYER%XCCZ(1:ISTORE_CUR,1:IKU), [ISTORE_CUR*IKU] );IPOS = IPOS + ISTORE_CUR * IKU + ZPACK(IPOS:IPOS+ISTORE_CUR*IKU-1) = RESHAPE( TPFLYER%XCRZ(1:ISTORE_CUR,1:IKU), [ISTORE_CUR*IKU] );IPOS = IPOS + ISTORE_CUR * IKU +END IF +ZPACK(IPOS:IPOS+ISTORE_CUR*IKU-1) = RESHAPE( TPFLYER%XCRARE(1:ISTORE_CUR,1:IKU), [ISTORE_CUR*IKU] );IPOS = IPOS + ISTORE_CUR * IKU + +ZPACK(IPOS:IPOS+ISTORE_CUR*IKU-1) = RESHAPE( TPFLYER%XCRARE_ATT(1:ISTORE_CUR,1:IKU), [ISTORE_CUR*IKU] ) +IPOS = IPOS + ISTORE_CUR * IKU + +ZPACK(IPOS:IPOS+ISTORE_CUR*IKU-1) = RESHAPE( TPFLYER%XWZ(1:ISTORE_CUR,1:IKU), [ISTORE_CUR*IKU] ) ; IPOS = IPOS + ISTORE_CUR * IKU +ZPACK(IPOS:IPOS+ISTORE_CUR*IKU-1) = RESHAPE( TPFLYER%XZZ(1:ISTORE_CUR,1:IKU), [ISTORE_CUR*IKU] ) ; IPOS = IPOS + ISTORE_CUR * IKU + +ZPACK(IPOS:IPOS+ISTORE_CUR-1) = TPFLYER%XZS(1:ISTORE_CUR); IPOS = IPOS + ISTORE_CUR +ZPACK(IPOS:IPOS+ISTORE_CUR-1) = TPFLYER%XTSRAD(1:ISTORE_CUR); IPOS = IPOS + ISTORE_CUR + +ZPACK(IPOS:IPOS+ISTORE_CUR-1) = TPFLYER%XTHW_FLUX(1:ISTORE_CUR); IPOS = IPOS + ISTORE_CUR +ZPACK(IPOS:IPOS+ISTORE_CUR-1) = TPFLYER%XRCW_FLUX(1:ISTORE_CUR); IPOS = IPOS + ISTORE_CUR + +ZPACK(IPOS:IPOS+ISTORE_CUR*NSV-1) = RESHAPE( TPFLYER%XSVW_FLUX(1:ISTORE_CUR,1:NSV), [ISTORE_CUR*NSV] ) +IPOS = IPOS + ISTORE_CUR * NSV + +SELECT TYPE ( TPFLYER ) + CLASS IS ( TAIRCRAFTDATA ) + IF ( TPFLYER%LTOOKOFF ) THEN + ZPACK(IPOS) = 1.d0 + ELSE + ZPACK(IPOS) = 0.d0 + END IF + IPOS = IPOS + 1 + + IF ( TPFLYER%LALTDEF ) THEN + ZPACK(IPOS) = 1.d0 + ELSE + ZPACK(IPOS) = 0.d0 + END IF + IPOS = IPOS + 1 + + ZPACK(IPOS) = TPFLYER%NPOS; IPOS = IPOS + 1 + ZPACK(IPOS) = TPFLYER%NPOSCUR; IPOS = IPOS + 1 + ZPACK(IPOS) = TPFLYER%XP_CUR; IPOS = IPOS + 1 + + IPOSAIR = TPFLYER%NPOS + + ZPACK(IPOS:IPOS+IPOSAIR-1) = TPFLYER%XPOSLAT(1:IPOSAIR) ; IPOS = IPOS + IPOSAIR + ZPACK(IPOS:IPOS+IPOSAIR-1) = TPFLYER%XPOSLON(1:IPOSAIR) ; IPOS = IPOS + IPOSAIR + ZPACK(IPOS:IPOS+IPOSAIR-1) = TPFLYER%XPOSX(1:IPOSAIR) ; IPOS = IPOS + IPOSAIR + ZPACK(IPOS:IPOS+IPOSAIR-1) = TPFLYER%XPOSY(1:IPOSAIR) ; IPOS = IPOS + IPOSAIR + IF ( TPFLYER%LALTDEF ) THEN + ZPACK(IPOS:IPOS+IPOSAIR-1) = TPFLYER%XPOSP(1:IPOSAIR) ; IPOS = IPOS + IPOSAIR + ELSE + ZPACK(IPOS:IPOS+IPOSAIR-1) = TPFLYER%XPOSZ(1:IPOSAIR) ; IPOS = IPOS + IPOSAIR + ENDIF + ZPACK(IPOS:IPOS+IPOSAIR-1) = TPFLYER%XPOSTIME(1:IPOSAIR) ; IPOS = IPOS + IPOSAIR + + ZPACK(IPOS) = TPFLYER%TLAND - TPREFERENCE_DATE; IPOS = IPOS + 1 + + CLASS IS ( TBALLOONDATA ) + IF ( TPFLYER%LPOSITION_INIT ) THEN + ZPACK(IPOS) = 1.d0 + ELSE + ZPACK(IPOS) = 0.d0 + END IF + IPOS = IPOS + 1 + + ZPACK(IPOS) = TPFLYER%XLATLAUNCH ; IPOS = IPOS + 1 + ZPACK(IPOS) = TPFLYER%XLONLAUNCH ; IPOS = IPOS + 1 + ZPACK(IPOS) = TPFLYER%XXLAUNCH ; IPOS = IPOS + 1 + ZPACK(IPOS) = TPFLYER%XYLAUNCH ; IPOS = IPOS + 1 + ZPACK(IPOS) = TPFLYER%XALTLAUNCH ; IPOS = IPOS + 1 + ZPACK(IPOS) = TPFLYER%XWASCENT ; IPOS = IPOS + 1 + ZPACK(IPOS) = TPFLYER%XRHO ; IPOS = IPOS + 1 + ZPACK(IPOS) = TPFLYER%XPRES ; IPOS = IPOS + 1 + ZPACK(IPOS) = TPFLYER%XDIAMETER ; IPOS = IPOS + 1 + ZPACK(IPOS) = TPFLYER%XAERODRAG ; IPOS = IPOS + 1 + ZPACK(IPOS) = TPFLYER%XINDDRAG ; IPOS = IPOS + 1 + ZPACK(IPOS) = TPFLYER%XVOLUME ; IPOS = IPOS + 1 + ZPACK(IPOS) = TPFLYER%XMASS ; IPOS = IPOS + 1 + + ZPACK(IPOS) = TPFLYER%TPOS_CUR - TPREFERENCE_DATE; IPOS = IPOS + 1 + +END SELECT + +IF ( IPOS-1 /= IPACKSIZE ) & + call Print_msg( NVERB_WARNING, 'IO', 'FLYER_SEND', 'IPOS-1 /= IPACKSIZE (sender side)', OLOCAL = .TRUE. ) + +! Send packed data +CALL MPI_SEND( ZPACK, IPACKSIZE, MNHREAL_MPI, KTO-1, NTAG_PACK, NMNH_COMM_WORLD, IERR ) + +END SUBROUTINE FLYER_SEND +!---------------------------------------------------------------------------- +!---------------------------------------------------------------------------- +SUBROUTINE FLYER_SEND_AND_DEALLOCATE( TPFLYER, KTO ) + +USE MODD_AIRCRAFT_BALLOON, ONLY: TFLYERDATA +USE MODD_IO, ONLY: ISP + +USE MODE_INI_AIRCRAFT_BALLOON, ONLY: DEALLOCATE_FLYER + +IMPLICIT NONE + +CLASS(TFLYERDATA), INTENT(INOUT) :: TPFLYER +INTEGER, INTENT(IN) :: KTO ! Process to which to send flyer data + +CHARACTER(LEN=10) :: YFROM, YTO + +WRITE( YFROM, '( I10 )' ) ISP +WRITE( YTO, '( I10 )' ) KTO +CALL PRINT_MSG( NVERB_DEBUG, 'GEN', 'FLYER_SEND_AND_DEALLOCATE', & + 'send flyer '//TRIM(TPFLYER%CTITLE)//': '//TRIM(YFROM)//'->'//TRIM(YTO), OLOCAL = .TRUE. ) + +CALL FLYER_SEND( TPFLYER, KTO ) + +! Free flyer data (dynamically allocated), scalar data has to be freed outside this subroutine +CALL DEALLOCATE_FLYER( TPFLYER ) + +END SUBROUTINE FLYER_SEND_AND_DEALLOCATE +!---------------------------------------------------------------------------- +!---------------------------------------------------------------------------- +SUBROUTINE FLYER_RECV_AND_ALLOCATE( TPFLYER, KFROM ) + +USE MODD_AIRCRAFT_BALLOON, ONLY: TAIRCRAFTDATA, TBALLOONDATA, TFLYERDATA +USE MODD_CONF_n, ONLY: NRR +USE MODD_DIM_n, ONLY: NKMAX +USE MODD_IO, ONLY: ISP +USE MODD_MPIF +USE MODD_NSV, ONLY: NSV +USE MODD_PARAMETERS, ONLY: JPVEXT +USE MODD_PARAM_n, ONLY: CCLOUD +USE MODD_PRECISION, ONLY: MNHINT_MPI, MNHREAL_MPI +USE MODD_VAR_LL, ONLY: NMNH_COMM_WORLD + +USE MODE_DATETIME +USE MODE_INI_AIRCRAFT_BALLOON, ONLY: ALLOCATE_FLYER + +IMPLICIT NONE + +CLASS(TFLYERDATA), INTENT(INOUT) :: TPFLYER +INTEGER, INTENT(IN) :: KFROM ! Process from which to receive flyer data + +CHARACTER(LEN=10) :: YFROM, YTO +INTEGER :: IERR +INTEGER :: IKU ! number of vertical levels +INTEGER :: IPOSAIR +INTEGER :: ISTORE_CUR +INTEGER :: ISTORE_TOT +INTEGER :: IPACKSIZE ! Size of the ZPACK buffer +INTEGER :: IPOS ! Position in the ZPACK buffer +INTEGER :: JI +INTEGER, DIMENSION(3) :: ISTORES +REAL, DIMENSION(:), ALLOCATABLE :: ZPACK ! Buffer to store raw data of a profiler (used for MPI communication) + +WRITE( YFROM, '( I10 )' ) KFROM +WRITE( YTO, '( I10 )' ) ISP +! CALL PRINT_MSG( NVERB_DEBUG, 'GEN', 'FLYER_RECV_AND_ALLOCATE', & +! 'receive flyer (name not yet known): '//TRIM(YFROM)//'->'//TRIM(YTO), OLOCAL = .TRUE. ) + +IKU = NKMAX + 2 * JPVEXT + +! Receive data (useful dimensions) +CALL MPI_RECV( ISTORES, 3, MNHINT_MPI, KFROM-1, NTAG_NCUR, NMNH_COMM_WORLD, MPI_STATUS_IGNORE, IERR ) + +ISTORE_CUR = ISTORES(1) +ISTORE_TOT = ISTORES(2) +IPACKSIZE = ISTORES(3) + +! Allocate receive buffer +ALLOCATE( ZPACK(IPACKSIZE) ) + +! Receive packed data +CALL MPI_RECV( ZPACK, IPACKSIZE, MNHREAL_MPI, KFROM-1, NTAG_PACK, NMNH_COMM_WORLD, MPI_STATUS_IGNORE, IERR ) + +! Allocation of flyer must be done only once number of stores is known +CALL ALLOCATE_FLYER( TPFLYER, ISTORE_TOT ) + +! Unpack data +IPOS = 1 + +IF ( NINT( ZPACK(IPOS) ) == NMODEL_FIX ) THEN + TPFLYER%CMODEL = 'FIX' +ELSE + TPFLYER%CMODEL = 'MOB' +END IF +IPOS = IPOS + 1 + +TPFLYER%NMODEL = NINT( ZPACK(IPOS) ); IPOS = IPOS + 1 +TPFLYER%NID = NINT( ZPACK(IPOS) ); IPOS = IPOS + 1 + +SELECT CASE( NINT( ZPACK(IPOS) ) ) + CASE(NTYPE_AIRCRA ) + TPFLYER%CTYPE = 'AIRCRA' + CASE( NTYPE_CVBALL ) + TPFLYER%CTYPE = 'CVBALL' + CASE( NTYPE_ISODEN ) + TPFLYER%CTYPE = 'ISODEN' + CASE( NTYPE_RADIOS ) + TPFLYER%CTYPE = 'RADIOS' + CASE DEFAULT + CALL PRINT_MSG( NVERB_FATAL, 'FLYER_RECV_AND_ALLOCATE', 'invalid CTYPE for flyer' ) +END SELECT +IPOS = IPOS + 1 + +! Convert integers to characters for title +DO JI = 1, LEN(TPFLYER%CTITLE) + TPFLYER%CTITLE(JI:JI) = ACHAR( NINT( ZPACK(IPOS) ) ) + IPOS = IPOS + 1 +END DO + +! Print full message only now (flyer title was not yet known) +CALL PRINT_MSG( NVERB_DEBUG, 'GEN', 'FLYER_RECV_AND_ALLOCATE', & + 'receive flyer '//TRIM(TPFLYER%CTITLE)//': '//TRIM(YFROM)//'->'//TRIM(YTO), OLOCAL = .TRUE. ) + +TPFLYER%TLAUNCH = TPREFERENCE_DATE + ZPACK(IPOS); IPOS = IPOS + 1 + +IF ( NINT( ZPACK(IPOS) ) == 0 ) THEN + TPFLYER%LCRASH = .FALSE. +ELSE + TPFLYER%LCRASH = .TRUE. +END IF +IPOS = IPOS + 1 + +TPFLYER%NCRASH = NINT( ZPACK(IPOS) ); IPOS = IPOS + 1 + +IF ( NINT( ZPACK(IPOS) ) == 0 ) THEN + TPFLYER%LFLY = .FALSE. +ELSE + TPFLYER%LFLY = .TRUE. +END IF +IPOS = IPOS + 1 + +IF ( NINT( ZPACK(IPOS) ) == 0 ) THEN + TPFLYER%LSTORE = .FALSE. +ELSE + TPFLYER%LSTORE = .TRUE. +END IF +IPOS = IPOS + 1 + +TPFLYER%TFLYER_TIME%N_CUR = NINT( ZPACK(IPOS) ); IPOS = IPOS + 1 +TPFLYER%TFLYER_TIME%XTSTEP = ZPACK(IPOS); IPOS = IPOS + 1 + +DO JI = 1, ISTORE_CUR + TPFLYER%TFLYER_TIME%TPDATES(JI) = TPREFERENCE_DATE + ZPACK(IPOS); IPOS = IPOS + 1 +END DO + +TPFLYER%XX_CUR = ZPACK(IPOS); IPOS = IPOS + 1 +TPFLYER%XY_CUR = ZPACK(IPOS); IPOS = IPOS + 1 +TPFLYER%XZ_CUR = ZPACK(IPOS); IPOS = IPOS + 1 + +TPFLYER%NRANK_CUR = NINT( ZPACK(IPOS) ); IPOS = IPOS + 1 + +TPFLYER%NMODELHIST(1:ISTORE_CUR) = NINT( ZPACK(IPOS:IPOS+ISTORE_CUR-1) ) ; IPOS = IPOS + ISTORE_CUR + +TPFLYER%XX(1:ISTORE_CUR) = ZPACK(IPOS:IPOS+ISTORE_CUR-1) ; IPOS = IPOS + ISTORE_CUR +TPFLYER%XY(1:ISTORE_CUR) = ZPACK(IPOS:IPOS+ISTORE_CUR-1) ; IPOS = IPOS + ISTORE_CUR +TPFLYER%XZ(1:ISTORE_CUR) = ZPACK(IPOS:IPOS+ISTORE_CUR-1) ; IPOS = IPOS + ISTORE_CUR +TPFLYER%XLAT(1:ISTORE_CUR) = ZPACK(IPOS:IPOS+ISTORE_CUR-1) ; IPOS = IPOS + ISTORE_CUR +TPFLYER%XLON(1:ISTORE_CUR) = ZPACK(IPOS:IPOS+ISTORE_CUR-1) ; IPOS = IPOS + ISTORE_CUR +TPFLYER%XZON(1:ISTORE_CUR) = ZPACK(IPOS:IPOS+ISTORE_CUR-1) ; IPOS = IPOS + ISTORE_CUR +TPFLYER%XMER(1:ISTORE_CUR) = ZPACK(IPOS:IPOS+ISTORE_CUR-1) ; IPOS = IPOS + ISTORE_CUR +TPFLYER%XW(1:ISTORE_CUR) = ZPACK(IPOS:IPOS+ISTORE_CUR-1) ; IPOS = IPOS + ISTORE_CUR +TPFLYER%XP(1:ISTORE_CUR) = ZPACK(IPOS:IPOS+ISTORE_CUR-1) ; IPOS = IPOS + ISTORE_CUR +TPFLYER%XTKE(1:ISTORE_CUR) = ZPACK(IPOS:IPOS+ISTORE_CUR-1) ; IPOS = IPOS + ISTORE_CUR +TPFLYER%XTKE_DISS(1:ISTORE_CUR) = ZPACK(IPOS:IPOS+ISTORE_CUR-1) ; IPOS = IPOS + ISTORE_CUR +TPFLYER%XTH(1:ISTORE_CUR) = ZPACK(IPOS:IPOS+ISTORE_CUR-1) ; IPOS = IPOS + ISTORE_CUR + +TPFLYER%XR(1:ISTORE_CUR,1:NRR) = RESHAPE( ZPACK(IPOS:IPOS+ISTORE_CUR*NRR-1), [ISTORE_CUR,NRR] ) ; IPOS = IPOS + ISTORE_CUR * NRR +TPFLYER%XSV(1:ISTORE_CUR,1:NSV) = RESHAPE( ZPACK(IPOS:IPOS+ISTORE_CUR*NSV-1), [ISTORE_CUR,NSV] ) ; IPOS = IPOS + ISTORE_CUR * NSV +TPFLYER%XRTZ(1:ISTORE_CUR,1:IKU) = RESHAPE( ZPACK(IPOS:IPOS+ISTORE_CUR*IKU-1), [ISTORE_CUR,IKU] ) ; IPOS = IPOS + ISTORE_CUR * IKU + +TPFLYER%XRZ(1:ISTORE_CUR,1:IKU,1:NRR) = RESHAPE( ZPACK(IPOS:IPOS+(ISTORE_CUR*IKU*NRR)-1), [ISTORE_CUR,IKU,NRR] ) +IPOS = IPOS + ISTORE_CUR * IKU * NRR + +TPFLYER%XFFZ(1:ISTORE_CUR,1:IKU) = RESHAPE( ZPACK(IPOS:IPOS+ISTORE_CUR*IKU-1), [ISTORE_CUR,IKU] ) ; IPOS = IPOS + ISTORE_CUR * IKU +TPFLYER%XIWCZ(1:ISTORE_CUR,1:IKU) = RESHAPE( ZPACK(IPOS:IPOS+ISTORE_CUR*IKU-1), [ISTORE_CUR,IKU] ) ; IPOS = IPOS + ISTORE_CUR * IKU +TPFLYER%XLWCZ(1:ISTORE_CUR,1:IKU) = RESHAPE( ZPACK(IPOS:IPOS+ISTORE_CUR*IKU-1), [ISTORE_CUR,IKU] ) ; IPOS = IPOS + ISTORE_CUR * IKU +TPFLYER%XCIZ(1:ISTORE_CUR,1:IKU) = RESHAPE( ZPACK(IPOS:IPOS+ISTORE_CUR*IKU-1), [ISTORE_CUR,IKU] ) ; IPOS = IPOS + ISTORE_CUR * IKU +IF ( CCLOUD == 'LIMA' ) THEN + TPFLYER%XCCZ(1:ISTORE_CUR,1:IKU) = RESHAPE( ZPACK(IPOS:IPOS+ISTORE_CUR*IKU-1), [ISTORE_CUR,IKU] ); IPOS = IPOS + ISTORE_CUR * IKU + TPFLYER%XCRZ(1:ISTORE_CUR,1:IKU) = RESHAPE( ZPACK(IPOS:IPOS+ISTORE_CUR*IKU-1), [ISTORE_CUR,IKU] ); IPOS = IPOS + ISTORE_CUR * IKU +END IF +TPFLYER%XCRARE(1:ISTORE_CUR,1:IKU) = RESHAPE( ZPACK(IPOS:IPOS+ISTORE_CUR*IKU-1), [ISTORE_CUR,IKU] ); IPOS = IPOS + ISTORE_CUR * IKU + +TPFLYER%XCRARE_ATT(1:ISTORE_CUR,1:IKU) = RESHAPE( ZPACK(IPOS:IPOS+ISTORE_CUR*IKU-1), [ISTORE_CUR,IKU] ) +IPOS = IPOS + ISTORE_CUR * IKU + +TPFLYER%XWZ(1:ISTORE_CUR,1:IKU) = RESHAPE( ZPACK(IPOS:IPOS+ISTORE_CUR*IKU-1), [ISTORE_CUR,IKU] ) ; IPOS = IPOS + ISTORE_CUR * IKU +TPFLYER%XZZ(1:ISTORE_CUR,1:IKU) = RESHAPE( ZPACK(IPOS:IPOS+ISTORE_CUR*IKU-1), [ISTORE_CUR,IKU] ) ; IPOS = IPOS + ISTORE_CUR * IKU + +TPFLYER%XZS(1:ISTORE_CUR) = ZPACK(IPOS:IPOS+ISTORE_CUR-1) ; IPOS = IPOS + ISTORE_CUR +TPFLYER%XTSRAD(1:ISTORE_CUR) = ZPACK(IPOS:IPOS+ISTORE_CUR-1) ; IPOS = IPOS + ISTORE_CUR + +TPFLYER%XTHW_FLUX(1:ISTORE_CUR) = ZPACK(IPOS:IPOS+ISTORE_CUR-1) ; IPOS = IPOS + ISTORE_CUR +TPFLYER%XRCW_FLUX(1:ISTORE_CUR) = ZPACK(IPOS:IPOS+ISTORE_CUR-1) ; IPOS = IPOS + ISTORE_CUR + +TPFLYER%XSVW_FLUX(1:ISTORE_CUR,1:NSV) = RESHAPE( ZPACK(IPOS:IPOS+ISTORE_CUR*NSV-1), [ISTORE_CUR,NSV] ) +IPOS = IPOS + ISTORE_CUR * NSV + +SELECT TYPE ( TPFLYER ) + CLASS IS ( TAIRCRAFTDATA ) + IF ( NINT( ZPACK(IPOS) ) == 0 ) THEN + TPFLYER%LTOOKOFF = .FALSE. + ELSE + TPFLYER%LTOOKOFF = .TRUE. + END IF + IPOS = IPOS + 1 + + IF ( NINT( ZPACK(IPOS) ) == 0 ) THEN + TPFLYER%LALTDEF = .FALSE. + ELSE + TPFLYER%LALTDEF = .TRUE. + END IF + IPOS = IPOS + 1 + + TPFLYER%NPOS = NINT( ZPACK(IPOS) ); IPOS = IPOS + 1 + TPFLYER%NPOSCUR = NINT( ZPACK(IPOS) ); IPOS = IPOS + 1 + + TPFLYER%XP_CUR = ZPACK(IPOS); IPOS = IPOS + 1 + + IPOSAIR = TPFLYER%NPOS + + ALLOCATE( TPFLYER%XPOSLAT(IPOSAIR) ) + ALLOCATE( TPFLYER%XPOSLON(IPOSAIR) ) + ALLOCATE( TPFLYER%XPOSX(IPOSAIR) ) + ALLOCATE( TPFLYER%XPOSY(IPOSAIR) ) + IF ( TPFLYER%LALTDEF ) THEN + ALLOCATE( TPFLYER%XPOSP(IPOSAIR) ) + ELSE + ALLOCATE( TPFLYER%XPOSZ(IPOSAIR) ) + END IF + ALLOCATE( TPFLYER%XPOSTIME(IPOSAIR) ) + + TPFLYER%XPOSLAT(1:IPOSAIR) = ZPACK(IPOS:IPOS+IPOSAIR-1) ; IPOS = IPOS + IPOSAIR + TPFLYER%XPOSLON(1:IPOSAIR) = ZPACK(IPOS:IPOS+IPOSAIR-1) ; IPOS = IPOS + IPOSAIR + TPFLYER%XPOSX(1:IPOSAIR) = ZPACK(IPOS:IPOS+IPOSAIR-1) ; IPOS = IPOS + IPOSAIR + TPFLYER%XPOSY(1:IPOSAIR) = ZPACK(IPOS:IPOS+IPOSAIR-1) ; IPOS = IPOS + IPOSAIR + IF ( TPFLYER%LALTDEF ) THEN + TPFLYER%XPOSP(1:IPOSAIR) = ZPACK(IPOS:IPOS+IPOSAIR-1) ; IPOS = IPOS + IPOSAIR + ELSE + TPFLYER%XPOSZ(1:IPOSAIR) = ZPACK(IPOS:IPOS+IPOSAIR-1) ; IPOS = IPOS + IPOSAIR + END IF + TPFLYER%XPOSTIME(1:IPOSAIR) = ZPACK(IPOS:IPOS+IPOSAIR-1) ; IPOS = IPOS + IPOSAIR + + TPFLYER%TLAND = TPREFERENCE_DATE + ZPACK(IPOS); IPOS = IPOS + 1 + + CLASS IS ( TBALLOONDATA ) + IF ( NINT( ZPACK(IPOS) ) == 0 ) THEN + TPFLYER%LPOSITION_INIT = .FALSE. + ELSE + TPFLYER%LPOSITION_INIT = .TRUE. + END IF + IPOS = IPOS + 1 + + TPFLYER%XLATLAUNCH = ZPACK(IPOS); IPOS = IPOS + 1 + TPFLYER%XLONLAUNCH = ZPACK(IPOS); IPOS = IPOS + 1 + TPFLYER%XXLAUNCH = ZPACK(IPOS); IPOS = IPOS + 1 + TPFLYER%XYLAUNCH = ZPACK(IPOS); IPOS = IPOS + 1 + TPFLYER%XALTLAUNCH = ZPACK(IPOS); IPOS = IPOS + 1 + TPFLYER%XWASCENT = ZPACK(IPOS); IPOS = IPOS + 1 + TPFLYER%XRHO = ZPACK(IPOS); IPOS = IPOS + 1 + TPFLYER%XPRES = ZPACK(IPOS); IPOS = IPOS + 1 + TPFLYER%XDIAMETER = ZPACK(IPOS); IPOS = IPOS + 1 + TPFLYER%XAERODRAG = ZPACK(IPOS); IPOS = IPOS + 1 + TPFLYER%XINDDRAG = ZPACK(IPOS); IPOS = IPOS + 1 + TPFLYER%XVOLUME = ZPACK(IPOS); IPOS = IPOS + 1 + TPFLYER%XMASS = ZPACK(IPOS); IPOS = IPOS + 1 + + TPFLYER%TPOS_CUR = TPREFERENCE_DATE + ZPACK(IPOS); IPOS = IPOS + 1 + +END SELECT + +IF ( IPOS-1 /= IPACKSIZE ) & + call Print_msg( NVERB_WARNING, 'IO', 'FLYER_RECV_AND_ALLOCATE', 'IPOS-1 /= IPACKSIZE (receiver side)', OLOCAL = .TRUE. ) + +END SUBROUTINE FLYER_RECV_AND_ALLOCATE +!---------------------------------------------------------------------------- +!---------------------------------------------------------------------------- + +END MODULE MODE_AIRCRAFT_BALLOON diff --git a/src/MNH/aircraft_balloon_evol.f90 b/src/MNH/aircraft_balloon_evol.f90 index 452113c95439e64ed6de56aec3ca1d3d1aa3bebe..21552784ad055e87fbce0afc5a2994ef7e9e44fe 100644 --- a/src/MNH/aircraft_balloon_evol.f90 +++ b/src/MNH/aircraft_balloon_evol.f90 @@ -1,62 +1,58 @@ -!MNH_LIC Copyright 2000-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2000-2023 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. !----------------------------------------------------------------- +! Author: Valery Masson (Meteo-France *) +! Original 15/05/2000 +! Modifications: +! G. Jaubert 19/04/2001: add CVBALL type +! P. Lacarrere 03/2008: add 3D fluxes +! M. Leriche 12/12/2008: move ZTDIST out from if.not.(tpflyer%fly) +! V. Masson 15/12/2008: correct do while aircraft move +! O. Caumont 03/2013: add radar reflectivities +! C. Lac 04/2014: allow RARE calculation only if CCLOUD=ICE3 +! O. Caumont 05/2014: modify RARE for hydrometeors containing ice + add bright band calculation for RARE +! C. Lac 02/2015: correction to prevent aircraft crash +! O. Nuissier/F. Duffourg 07/2015: add microphysics diagnostic for aircraft, ballon and profiler +! G. Delautier 10/2016: LIMA +! P. Wautelet 28/03/2018: replace TEMPORAL_DIST by DATETIME_DISTANCE +! P. Wautelet 05/2016-04/2018: new data structures and calls for I/O +! P. Wautelet 13/09/2019: budget: simplify and modernize date/time management +! P. Wautelet 01/10/2020: bugfix: initialize GSTORE +! P. Wautelet 14/01/2021: bugfixes: -ZXCOEF and ZYCOEF were not computed if CVBALL +! -PCIT was used if CCLOUD/=ICEx (not allocated) +! -PSEA was always used even if not allocated (CSURF/=EXTE) +! -do not use PMAP if cartesian domain +! P. Wautelet 06/2022: reorganize flyers +!----------------------------------------------------------------- ! ########################## -MODULE MODI_AIRCRAFT_BALLOON_EVOL +MODULE MODE_AIRCRAFT_BALLOON_EVOL ! ########################## -! -INTERFACE -! - SUBROUTINE AIRCRAFT_BALLOON_EVOL(PTSTEP, & - PXHAT, PYHAT, PZ, & - PMAP, PLONOR, PLATOR, & - PU, PV, PW, PP, PTH, PR, PSV, PTKE, & - PTS, PRHODREF, PCIT,TPFLYER, PSEA ) -! -USE MODD_AIRCRAFT_BALLOON -! -REAL, INTENT(IN) :: PTSTEP ! time step -REAL, DIMENSION(:), INTENT(IN) :: PXHAT ! x coordinate -REAL, DIMENSION(:), INTENT(IN) :: PYHAT ! y coordinate -REAL, DIMENSION(:,:,:), INTENT(IN) :: PZ ! z array -REAL, DIMENSION(:,:), INTENT(IN) :: PMAP ! map factor -REAL, INTENT(IN) :: PLONOR ! origine longitude -REAL, INTENT(IN) :: PLATOR ! origine latitude -REAL, DIMENSION(:,:,:), INTENT(IN) :: PU ! horizontal wind X component -REAL, DIMENSION(:,:,:), INTENT(IN) :: PV ! horizontal wind Y component -REAL, DIMENSION(:,:,:), INTENT(IN) :: PW ! vertical wind -REAL, DIMENSION(:,:,:), INTENT(IN) :: PP ! pressure -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTH ! potential temperature -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PR ! water mixing ratios -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSV ! Scalar variables -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKE ! turbulent kinetic energy -REAL, DIMENSION(:,:), INTENT(IN) :: PTS ! surface temperature -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! dry air density of the reference state -REAL, DIMENSION(:,:,:), INTENT(IN) :: PCIT ! pristine ice concentration -! -TYPE(FLYER), INTENT(INOUT) :: TPFLYER! balloon/aircraft -REAL, DIMENSION(:,:),OPTIONAL,INTENT(IN) :: PSEA -! -!------------------------------------------------------------------------------- -! -END SUBROUTINE AIRCRAFT_BALLOON_EVOL -! -END INTERFACE -! -END MODULE MODI_AIRCRAFT_BALLOON_EVOL -! + +USE MODE_MSG + +IMPLICIT NONE + +PRIVATE + +PUBLIC :: AIRCRAFT_BALLOON_EVOL + +PUBLIC :: AIRCRAFT_COMPUTE_POSITION + +PUBLIC :: FLYER_GET_RANK_MODEL_ISCRASHED + +CONTAINS ! ######################################################## SUBROUTINE AIRCRAFT_BALLOON_EVOL(PTSTEP, & - PXHAT, PYHAT, PZ, & - PMAP, PLONOR, PLATOR, & + PZ, PMAP, PLONOR, PLATOR, & PU, PV, PW, PP, PTH, PR, PSV, PTKE, & - PTS, PRHODREF, PCIT,TPFLYER, PSEA ) + PTS, PRHODREF, PCIT, TPFLYER, & + KRANK_CUR, KRANK_NXT, PSEA ) ! ######################################################## ! ! -!!**** *AIRCRAFT_BALLOON_EVOL* - (advects and) stores +!!**** *AIRCRAFT_BALLOON_EVOL* - (advects and) stores !! balloons/aircrafts in the model !! !! PURPOSE @@ -65,7 +61,7 @@ END MODULE MODI_AIRCRAFT_BALLOON_EVOL ! !!** METHOD !! ------ -!! +!! !! 1) All the balloons are tested. If the current balloon is !! a) in the current model !! b) not crashed @@ -86,10 +82,10 @@ END MODULE MODI_AIRCRAFT_BALLOON_EVOL !! a) iso-density balloons are advected following horizontal wind. !! the slope of the iso-density surfaces is neglected. !! b) radio-sounding balloons are advected according to all wind velocities. -!! the vertical ascent speed is added to the vertical wind speed. +!! the vertical ascent speed is added to the vertical wind speed. !! c) Constant Volume balloons are advected according to all wind velocities. !! the vertical ascent speed is computed using the balloon equation -!! +!! !! !! EXTERNAL !! -------- @@ -100,87 +96,19 @@ END MODULE MODI_AIRCRAFT_BALLOON_EVOL !! REFERENCE !! --------- !! -!! AUTHOR -!! ------ -!! Valery Masson * Meteo-France * -!! -!! MODIFICATIONS -!! ------------- -!! Original 15/05/2000 -!! Apr,19, 2001 (G.Jaubert) add CVBALL type -!! March, 2008 (P.Lacarrere) Add 3D fluxes -!! Dec,12, 2008 (M. Leriche) move ZTDIST out from if.not.(tpflyer%fly) -!! Dec,15, 2008 (V. Masson) correct do while aircraft move -!! March, 2013 (O.Caumont) add radar reflectivities -!! April, 2014 (C.Lac) allow RARE calculation only if CCLOUD=ICE3 -!! May, 2014 (O.Caumont) modify RARE for hydrometeors containing ice -!! add bright band calculation for RARE -!! Feb, 2015 (C.Lac) Correction to prevent aircraft crash -!! July, 2015 (O.Nuissier/F.Duffourg) Add microphysics diagnostic for -!! aircraft, ballon and profiler -!! October, 2016 (G.DELAUTIER) LIMA -!! March,28, 2018 (P. Wautelet) replace TEMPORAL_DIST by DATETIME_DISTANCE -!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O -! P. Wautelet 13/09/2019: budget: simplify and modernize date/time management -! P. Wautelet 01/10/2020: bugfix: initialize GSTORE -! P. Wautelet 14/01/2021: bugfixes: -ZXCOEF and ZYCOEF were not computed if CVBALL -! -PCIT was used if CCLOUD/=ICEx (not allocated) -! -PSEA was always used even if not allocated (CSURF/=EXTE) -! -do not use PMAP if cartesian domain -! !! -------------------------------------------------------------------------- -! +! !* 0. DECLARATIONS ! ------------ ! USE MODD_AIRCRAFT_BALLOON -USE MODD_CONF -USE MODD_CST -USE MODD_DIAG_IN_RUN -USE MODD_GRID -USE MODD_LUNIT_n, ONLY: TLUOUT -USE MODD_NESTING -USE MODD_NSV, ONLY : NSV_LIMA_NI,NSV_LIMA_NR,NSV_LIMA_NC -USE MODD_PARAMETERS -USE MODD_PARAM_LIMA, ONLY: XALPHAR_L=>XALPHAR,XNUR_L=>XNUR,XALPHAS_L=>XALPHAS,XNUS_L=>XNUS,& - XALPHAG_L=>XALPHAG,XNUG_L=>XNUG, XALPHAI_L=>XALPHAI,XNUI_L=>XNUI,& - XRTMIN_L=>XRTMIN,XALPHAC_L=>XALPHAC,XNUC_L=>XNUC,LSNOW_T_L=>LSNOW_T -USE MODD_PARAM_LIMA_COLD, ONLY: XDI_L=>XDI,XLBEXI_L=>XLBEXI,XLBI_L=>XLBI,XAI_L=>XAI,XBI_L=>XBI,XC_I_L=>XC_I,& - XLBEXS_L=>XLBEXS,XLBS_L=>XLBS,XCCS_L=>XCCS,& - XAS_L=>XAS,XBS_L=>XBS,XCXS_L=>XCXS,XNS_L=>XNS, & - XLBDAS_MAX,XLBDAS_MIN -USE MODD_PARAM_LIMA_MIXED, ONLY: XDG_L=>XDG,XLBEXG_L=>XLBEXG,XLBG_L=>XLBG,XCCG_L=>XCCG,& - XAG_L=>XAG,XBG_L=>XBG,XCXG_L=>XCXG,XCG_L=>XCG -USE MODD_PARAM_LIMA_WARM, ONLY: XLBEXR_L=>XLBEXR,XLBR_L=>XLBR,XBR_L=>XBR,XAR_L=>XAR,& - XBC_L=>XBC,XAC_L=>XAC -USE MODD_PARAM_n, ONLY: CCLOUD, CSURF -USE MODD_PARAM_ICE, ONLY: LSNOW_T_I=>LSNOW_T -USE MODD_RAIN_ICE_DESCR, ONLY: XALPHAR_I=>XALPHAR,XNUR_I=>XNUR,XLBEXR_I=>XLBEXR,& - XLBR_I=>XLBR,XCCR_I=>XCCR,XBR_I=>XBR,XAR_I=>XAR,& - XALPHAC_I=>XALPHAC,XNUC_I=>XNUC,& - XLBC_I=>XLBC,XBC_I=>XBC,XAC_I=>XAC,& - XALPHAC2_I=>XALPHAC2,XNUC2_I=>XNUC2,& - XALPHAS_I=>XALPHAS,XNUS_I=>XNUS,XLBEXS_I=>XLBEXS,& - XLBS_I=>XLBS,XCCS_I=>XCCS,XAS_I=>XAS,XBS_I=>XBS,XCXS_I=>XCXS,XNS_I=>XNS,& - XALPHAG_I=>XALPHAG,XNUG_I=>XNUG,XDG_I=>XDG,XLBEXG_I=>XLBEXG,& - XLBG_I=>XLBG,XCCG_I=>XCCG,XAG_I=>XAG,XBG_I=>XBG,XCXG_I=>XCXG,XCG_I=>XCG,& - XALPHAI_I=>XALPHAI,XNUI_I=>XNUI,XDI_I=>XDI,XLBEXI_I=>XLBEXI,& - XLBI_I=>XLBI,XAI_I=>XAI,XBI_I=>XBI,XC_I_I=>XC_I,& - XRTMIN_I=>XRTMIN,XCONC_LAND,XCONC_SEA -USE MODD_REF_n, ONLY: XRHODREF -USE MODD_TIME, only: tdtexp -USE MODD_TIME_n, only: tdtcur -USE MODD_TURB_FLUX_AIRCRAFT_BALLOON +USE MODD_CST, ONLY: XCPD, XLVTT +USE MODD_IO, ONLY: ISP +USE MODD_TIME_n, ONLY: TDTCUR +USE MODD_TURB_FLUX_AIRCRAFT_BALLOON, ONLY: XRCW_FLUX, XSVW_FLUX, XTHW_FLUX ! USE MODE_DATETIME -USE MODE_FGAU, ONLY: GAULAG -USE MODE_FSCATTER, ONLY: QEPSW,QEPSI,BHMIE,MOMG,MG -USE MODE_GRIDPROJ -USE MODE_ll -USE MODE_MSG -! -USE MODI_GAMMA, ONLY: GAMMA -USE MODI_WATER_SUM +USE MODE_NEST_ll, ONLY: GET_MODEL_NUMBER_ll ! IMPLICIT NONE ! @@ -189,8 +117,6 @@ IMPLICIT NONE ! ! REAL, INTENT(IN) :: PTSTEP ! time step -REAL, DIMENSION(:), INTENT(IN) :: PXHAT ! x coordinate -REAL, DIMENSION(:), INTENT(IN) :: PYHAT ! y coordinate REAL, DIMENSION(:,:,:), INTENT(IN) :: PZ ! z array REAL, DIMENSION(:,:), INTENT(IN) :: PMAP ! map factor REAL, INTENT(IN) :: PLONOR ! origine longitude @@ -207,8 +133,10 @@ REAL, DIMENSION(:,:), INTENT(IN) :: PTS ! surface temperature REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! dry air density of the reference state REAL, DIMENSION(:,:,:), INTENT(IN) :: PCIT ! pristine ice concentration ! -TYPE(FLYER), INTENT(INOUT) :: TPFLYER! balloon/aircraft -REAL, DIMENSION(:,:), INTENT(IN) :: PSEA +CLASS(TFLYERDATA), INTENT(INOUT) :: TPFLYER ! balloon/aircraft +INTEGER, INTENT(IN) :: KRANK_CUR +INTEGER, INTENT(OUT) :: KRANK_NXT +REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PSEA ! !------------------------------------------------------------------------------- ! @@ -216,1280 +144,1212 @@ REAL, DIMENSION(:,:), INTENT(IN) :: PSEA ! ! INTEGER :: IMI ! model index -REAL :: ZTHIS_PROC ! 1 if balloon is currently treated by this proc., else 0 -! -INTEGER :: IIB ! current processor domain sizes -INTEGER :: IJB -INTEGER :: IIE -INTEGER :: IJE -INTEGER :: IIU -INTEGER :: IJU -INTEGER :: IKB +INTEGER :: IKB ! vertical domain sizes INTEGER :: IKE INTEGER :: IKU ! -INTEGER :: JK ! loop index -! -REAL, DIMENSION(SIZE(PXHAT)) :: ZXHATM ! mass point coordinates -REAL, DIMENSION(SIZE(PYHAT)) :: ZYHATM ! mass point coordinates -! REAL, DIMENSION(2,2,SIZE(PZ,3)) :: ZZM ! mass point coordinates REAL, DIMENSION(2,2,SIZE(PZ,3)) :: ZZU ! U points z coordinates REAL, DIMENSION(2,2,SIZE(PZ,3)) :: ZZV ! V points z coordinates REAL, DIMENSION(2,2,SIZE(PZ,3)) :: ZWM ! mass point wind ! -REAL, DIMENSION(2,2,SIZE(PTH,3)) :: ZTHV ! virtual potential temperature -REAL, DIMENSION(2,2,SIZE(PTH,3)) :: ZTV ! virtual temperature -REAL, DIMENSION(2,2,SIZE(PTH,3)) :: ZTEMP ! temperature REAL, DIMENSION(2,2,SIZE(PTH,3)) :: ZEXN ! Exner function REAL, DIMENSION(2,2,SIZE(PTH,3)) :: ZRHO ! air density REAL :: ZFLYER_EXN ! balloon/aircraft Exner func. -REAL, DIMENSION(2,2,SIZE(PTH,3)) :: ZTHW_FLUX ! +REAL, DIMENSION(2,2,SIZE(PTH,3)) :: ZTHW_FLUX ! REAL, DIMENSION(2,2,SIZE(PTH,3)) :: ZRCW_FLUX ! -REAL, DIMENSION(2,2,SIZE(PSV,3),SIZE(PSV,4)) :: ZSVW_FLUX +REAL, DIMENSION(2,2,SIZE(PSV,3),SIZE(PSV,4)) :: ZSVW_FLUX ! -REAL :: ZTDIST ! time until launch (sec) LOGICAL :: GLAUNCH ! launch/takeoff is effective at this time-step (if true) LOGICAL :: GSTORE ! storage occurs at this time step -! -INTEGER :: II ! mass balloon position (x index) -INTEGER :: IJ ! mass balloon position (y index) -INTEGER :: IU ! U flux point balloon position (x index) -INTEGER :: IV ! V flux point balloon position (y index) -INTEGER :: IDU ! difference between IU and II -INTEGER :: IDV ! difference between IV and IJ -! -INTEGER :: IK00 ! balloon position for II , IJ -INTEGER :: IK01 ! balloon position for II , IJ+1 -INTEGER :: IK10 ! balloon position for II+1, IJ -INTEGER :: IK11 ! balloon position for II+1, IJ+1 -INTEGER :: IU00 ! balloon position for IU , IJ -INTEGER :: IU01 ! balloon position for IU , IJ+1 -INTEGER :: IU10 ! balloon position for IU+1, IJ -INTEGER :: IU11 ! balloon position for IU+1, IJ+1 -INTEGER :: IV00 ! balloon position for II , IV -INTEGER :: IV01 ! balloon position for II , IV+1 -INTEGER :: IV10 ! balloon position for II+1, IV -INTEGER :: IV11 ! balloon position for II+1, IV+1 +LOGICAL :: GOWNER_CUR ! The process is the current owner of the flyer +! +INTEGER :: II_M ! mass balloon position (x index) +INTEGER :: IJ_M ! mass balloon position (y index) +INTEGER :: II_U ! U flux point balloon position (x index) +INTEGER :: IJ_V ! V flux point balloon position (y index) +! +INTEGER :: IK00 ! balloon position for II_M , IJ_M +INTEGER :: IK01 ! balloon position for II_M , IJ_M+1 +INTEGER :: IK10 ! balloon position for II_M+1, IJ_M +INTEGER :: IK11 ! balloon position for II_M+1, IJ_M+1 +INTEGER :: IU00 ! balloon position for II_U , IJ_M +INTEGER :: IU01 ! balloon position for II_U , IJ_M+1 +INTEGER :: IU10 ! balloon position for II_U+1, IJ_M +INTEGER :: IU11 ! balloon position for II_U+1, IJ_M+1 +INTEGER :: IV00 ! balloon position for II_M , IJ_V +INTEGER :: IV01 ! balloon position for II_M , IJ_V+1 +INTEGER :: IV10 ! balloon position for II_M+1, IJ_V +INTEGER :: IV11 ! balloon position for II_M+1, IJ_V+1 ! REAL :: ZXCOEF ! X direction interpolation coefficient REAL :: ZUCOEF ! X direction interpolation coefficient (for U) REAL :: ZYCOEF ! Y direction interpolation coefficient REAL :: ZVCOEF ! Y direction interpolation coefficient (for V) ! -REAL :: ZZCOEF00 ! Z direction interpolation coefficient for II , IJ -REAL :: ZZCOEF01 ! Z direction interpolation coefficient for II , IJ+1 -REAL :: ZZCOEF10 ! Z direction interpolation coefficient for II+1, IJ -REAL :: ZZCOEF11 ! Z direction interpolation coefficient for II+1, IJ+1 -REAL :: ZUCOEF00 ! Z direction interpolation coefficient for IU , IJ -REAL :: ZUCOEF01 ! Z direction interpolation coefficient for IU , IJ+1 -REAL :: ZUCOEF10 ! Z direction interpolation coefficient for IU+1, IJ -REAL :: ZUCOEF11 ! Z direction interpolation coefficient for IU+1, IJ+1 -REAL :: ZVCOEF00 ! Z direction interpolation coefficient for II , IV -REAL :: ZVCOEF01 ! Z direction interpolation coefficient for II , IV+1 -REAL :: ZVCOEF10 ! Z direction interpolation coefficient for II+1, IV -REAL :: ZVCOEF11 ! Z direction interpolation coefficient for II+1, IV+1 -! -INTEGER :: IN ! time index -INTEGER :: JLOOP,JLOOP2 ! loop counter -! -REAL :: ZU_BAL ! horizontal wind speed at balloon location (along x) -REAL :: ZV_BAL ! horizontal wind speed at balloon location (along y) -REAL :: ZW_BAL ! vertical wind speed at balloon location (along z) -REAL :: ZMAP ! map factor at balloon location -REAL :: ZGAM ! rotation between meso-nh base and spherical lat-lon base. -INTEGER :: IL ! flight segment index -REAL :: ZSEG_FRAC! fraction of flight in the current segment -REAL :: ZRO_BAL ! air density at balloon location -! -INTEGER :: IINFO_ll ! return code -INTEGER :: ILUOUT ! logical unit -INTEGER :: IRESP ! return code -! -! specific to cloud radar -REAL, DIMENSION(SIZE(PR,3)) :: ZTEMPZ! vertical profile of temperature -REAL, DIMENSION(SIZE(PR,3)) :: ZRHODREFZ ! vertical profile of dry air density of the reference state -REAL, DIMENSION(SIZE(PR,3)) :: ZCIT ! pristine ice concentration -REAL, DIMENSION(SIZE(PR,3)) :: ZCCI,ZCCR,ZCCC ! ICE,RAIN CLOUD concentration (LIMA) -REAL, DIMENSION(SIZE(PR,1),SIZE(PR,2),SIZE(PR,3)) :: ZR -REAL, DIMENSION(SIZE(PR,3),SIZE(PR,4)+1) :: ZRZ ! vertical profile of hydrometeor mixing ratios -REAL :: ZA,ZB,ZCC,ZCX,ZALPHA,ZNU,ZLB,ZLBEX,ZNS,ZRHOHYD ! generic microphysical parameters -INTEGER :: JJ ! loop counter for quadrature -COMPLEX :: QMW,QMI,QM,QB,QEPSIW,QEPSWI ! dielectric parameter -REAL :: ZAETOT,ZAETMP,ZREFLOC,ZQSCA,ZQBACK,ZQEXT ! temporary scattering parameters -REAL,DIMENSION(:),ALLOCATABLE :: ZAELOC,ZZMZ ! temporary arrays -INTEGER :: JPTS_GAULAG=7 ! number of points for Gauss-Laguerre quadrature -REAL :: ZLBDA ! slope distribution parameter -REAL :: ZN ! number concentration -REAL :: ZFRAC_ICE ! ice water fraction -REAL :: ZDELTA_EQUIV ! mass-equivalent Gauss-Laguerre point -REAL :: ZFW ! liquid fraction -REAL :: ZFPW ! weight for mixed-phase reflectivity -REAL,DIMENSION(:),ALLOCATABLE :: ZX,ZW ! Gauss-Laguerre points and weights -REAL,DIMENSION(:),ALLOCATABLE :: ZRTMIN ! local values for XRTMIN -LOGICAL :: GCALC -!---------------------------------------------------------------------------- -! -!* 1. PRELIMINARIES -! ------------- -! -IF(.NOT. ALLOCATED(XTHW_FLUX)) & -ALLOCATE(XTHW_FLUX(SIZE(PTH,1),SIZE(PTH,2),SIZE(PTH,3))) -IF(.NOT. ALLOCATED(XRCW_FLUX)) & -ALLOCATE(XRCW_FLUX(SIZE(PTH,1),SIZE(PTH,2),SIZE(PTH,3))) -IF(.NOT. ALLOCATED(XSVW_FLUX)) & -ALLOCATE(XSVW_FLUX(SIZE(PSV,1),SIZE(PSV,2),SIZE(PSV,3),SIZE(PSV,4))) -ILUOUT = TLUOUT%NLU -! -ZR = 0. -GSTORE = .FALSE. -! -!* 1.0 initialization of processor test -! -------------------------------- -! -ZTHIS_PROC=0. -! -! -!* 1.1 test on the model -! ----------------- -! -CALL GET_MODEL_NUMBER_ll (IMI) -! -! -IF (TPFLYER%MODEL /= 'FIX' .AND. COUNT(NDAD(:) == IMI) /= 0 & - .AND. ( TPFLYER%NMODEL == IMI .OR. NDAD(TPFLYER%NMODEL) == IMI ) & - .AND. TPFLYER%X_CUR /= XUNDEF .AND. TPFLYER%Y_CUR /= XUNDEF & - .AND. TPFLYER%FLY .AND. .NOT. TPFLYER%CRASH & - .AND. CPROGRAM == 'MESONH' ) THEN - CALL FLYER_CHANGE_MODEL(IMI) -ENDIF -! -IF ( TPFLYER%NMODEL /= IMI ) RETURN -! +REAL :: ZZCOEF00 ! Z direction interpolation coefficient for II_M , IJ_M +REAL :: ZZCOEF01 ! Z direction interpolation coefficient for II_M , IJ_M+1 +REAL :: ZZCOEF10 ! Z direction interpolation coefficient for II_M+1, IJ_M +REAL :: ZZCOEF11 ! Z direction interpolation coefficient for II_M+1, IJ_M+1 +REAL :: ZUCOEF00 ! Z direction interpolation coefficient for II_U , IJ_M +REAL :: ZUCOEF01 ! Z direction interpolation coefficient for II_U , IJ_M+1 +REAL :: ZUCOEF10 ! Z direction interpolation coefficient for II_U+1, IJ_M +REAL :: ZUCOEF11 ! Z direction interpolation coefficient for II_U+1, IJ_M+1 +REAL :: ZVCOEF00 ! Z direction interpolation coefficient for II_M , IJ_V +REAL :: ZVCOEF01 ! Z direction interpolation coefficient for II_M , IJ_V+1 +REAL :: ZVCOEF10 ! Z direction interpolation coefficient for II_M+1, IJ_V +REAL :: ZVCOEF11 ! Z direction interpolation coefficient for II_M+1, IJ_V+1 +! +INTEGER :: ISTORE ! time index for storage +! +REAL :: ZTSTEP +TYPE(DATE_TIME) :: TZNEXT ! Time for next position !---------------------------------------------------------------------------- -! -!* 2. PRELIMINARIES-2 -! ------------- -! -!* 2.1 Indices -! ------- -! -CALL GET_INDICE_ll (IIB,IJB,IIE,IJE) -IKB = 1 + JPVEXT -IKE = SIZE(PZ,3) - JPVEXT IKU = SIZE(PZ,3) -! -! -!* 2.2 Interpolations of model variables to mass points -! ------------------------------------------------ -! -IIU=SIZE(PXHAT) -IJU=SIZE(PYHAT) -! -ZXHATM(1:IIU-1)=0.5*PXHAT(1:IIU-1)+0.5*PXHAT(2:IIU ) -ZXHATM( IIU )=1.5*PXHAT( IIU )-0.5*PXHAT( IIU-1) -! -ZYHATM(1:IJU-1)=0.5*PYHAT(1:IJU-1)+0.5*PYHAT(2:IJU ) -ZYHATM( IJU )=1.5*PYHAT( IJU )-0.5*PYHAT( IJU-1) -!---------------------------------------------------------------------------- -! -!* 2.3 Compute time until launch by comparison of dates and times -! ---------------------------------------------------------- -! -CALL DATETIME_DISTANCE(TPFLYER%LAUNCH,TDTCUR,ZTDIST) -! -!* 3. LAUNCH -! ------ -! -GLAUNCH = .FALSE. -! -! -IF (.NOT. TPFLYER%FLY) THEN -! -! -!* 3.1 comparison of dates and times -! ----------------------------- -! -! CALL DATETIME_DISTANCE(TPFLYER%LAUNCH,TDTCUR,ZTDIST) -! -!* 3.2 launch/takeoff is effective -! --------------------------- -! - IF (ZTDIST >= - PTSTEP ) THEN - IF (TPFLYER%TYPE=='AIRCRA') THEN -! -!* 3.2.1 Determination of flight segment -! ------------------------------- -! - TPFLYER%SEGCURN = 1 - IL = TPFLYER%SEGCURN - ! - TPFLYER%SEGCURT = ZTDIST - ! - DO WHILE (TPFLYER%SEGCURT>TPFLYER%SEGTIME(IL) .AND. IL <= TPFLYER%SEG) - TPFLYER%SEGCURN = TPFLYER%SEGCURN + 1 - IL = TPFLYER%SEGCURN - TPFLYER%SEGCURT = TPFLYER%SEGCURT - TPFLYER%SEGTIME(IL-1) - IF (IL>TPFLYER%SEG) EXIT - END DO - ! - !* end of flight - ! - IF (IL > TPFLYER%SEG) THEN - TPFLYER%FLY=.FALSE. - ELSE - TPFLYER%FLY = .TRUE. - GLAUNCH = .TRUE. - TPFLYER%CRASH=.FALSE. - IF (ZTDIST <= PTSTEP ) THEN - WRITE(ILUOUT,*) '-------------------------------------------------------------------' - WRITE(ILUOUT,*) 'Aircraft ',TPFLYER%TITLE,' takes off the ', & - TDTCUR%nday,'/',TDTCUR%nmonth,'/', & - TDTCUR%nyear,' at ',NINT(TDTCUR%xtime),' sec.' - WRITE(ILUOUT,*) '-------------------------------------------------------------------' - ENDIF - ENDIF - ELSE IF (ZTDIST <= PTSTEP ) THEN - TPFLYER%FLY = .TRUE. - GLAUNCH = .TRUE. - WRITE(ILUOUT,*) '-------------------------------------------------------------------' - WRITE(ILUOUT,*) 'Balloon ',TPFLYER%TITLE,' is launched the ', & - TDTCUR%nday,'/',TDTCUR%nmonth,'/', & - TDTCUR%nyear,' at ',NINT(TDTCUR%xtime),' sec.' - WRITE(ILUOUT,*) '-------------------------------------------------------------------' - END IF -! -!* 3.3 Initial horizontal positions -! ---------------------------- -! - IF (TPFLYER%TYPE=='RADIOS' .OR. TPFLYER%TYPE=='ISODEN' .OR. TPFLYER%TYPE=='CVBALL') THEN - TPFLYER%X_CUR = TPFLYER%XLAUNCH - TPFLYER%Y_CUR = TPFLYER%YLAUNCH + +CALL GET_MODEL_NUMBER_ll(IMI) + +! Set initial value for KRANK_NXT +! It needs to be 0 on all processes except the one where it is when this subroutine is called +! If the flyer flies to an other process, KRANK_NXT will be set accordingly by the current owner +IF ( TPFLYER%NRANK_CUR == ISP ) THEN + GOWNER_CUR = .TRUE. ! This variable is set and used because NRANK_CUR could change in this subroutine + KRANK_NXT = ISP +ELSE + GOWNER_CUR = .FALSE. + KRANK_NXT = 0 +END IF + +SELECT TYPE ( TPFLYER ) + CLASS IS ( TAIRCRAFTDATA) + ! Take-off? + TAKEOFF: IF ( .NOT. TPFLYER%LTOOKOFF ) THEN + ! Do the take-off positioning only once + ! (on model 1 for 'MOB', if aircraft is on an other model, data will be available on the right one anyway) + IF ( ( TPFLYER%CMODEL == 'MOB' .AND. IMI == 1 ) & + .OR. ( TPFLYER%CMODEL == 'FIX' .AND. IMI == TPFLYER%NMODEL ) ) THEN + ! Is the aircraft in flight ? + IF ( TDTCUR >= TPFLYER%TLAUNCH .AND. TDTCUR <= TPFLYER%TLAND ) THEN + TPFLYER%LFLY = .TRUE. + TPFLYER%LTOOKOFF = .TRUE. + END IF + END IF + END IF TAKEOFF + + !Do we have to store aircraft data? + IF ( IMI == TPFLYER%NMODEL ) CALL FLYER_CHECK_STORESTEP( TPFLYER ) + + ! For aircrafts, data has only to be computed at store moments + ISTORE = TPFLYER%TFLYER_TIME%N_CUR + IF ( IMI == TPFLYER%NMODEL .AND. TPFLYER%LFLY .AND. TPFLYER%LSTORE ) THEN + ! Check if it is the right moment to store data + IF ( ABS( TDTCUR - TPFLYER%TFLYER_TIME%TPDATES(ISTORE) ) < 1e-10 ) THEN + ISOWNERAIR: IF ( TPFLYER%NRANK_CUR == ISP ) THEN + CALL FLYER_INTERP_TO_MASSPOINTS() + + ZEXN(:,:,:) = FLYER_COMPUTE_EXNER( ) + ZRHO(:,:,:) = FLYER_COMPUTE_RHO( ) + + ZTHW_FLUX(:,:,:) = ZRHO(:,:,:)*XCPD *XTHW_FLUX(II_M:II_M+1,IJ_M:IJ_M+1,:) + ZRCW_FLUX(:,:,:) = ZRHO(:,:,:)*XLVTT*XRCW_FLUX(II_M:II_M+1,IJ_M:IJ_M+1,:) + ZSVW_FLUX(:,:,:,:) = XSVW_FLUX(II_M:II_M+1,IJ_M:IJ_M+1,:,:) + + ! Compute coefficents for horizontal interpolations + CALL FLYER_COMPUTE_INTERP_COEFF_HOR_STAGE1( ) + ! Compute coefficents for vertical interpolations + CALL FLYER_COMPUTE_INTERP_COEFF_VER( ) + ! Compute coefficents for horizontal interpolations + CALL FLYER_COMPUTE_INTERP_COEFF_HOR_STAGE2( ) + + CALL FLYER_RECORD_DATA( ) + END IF ISOWNERAIR + + ! Store has been done + TPFLYER%LSTORE = .FALSE. + END IF END IF - IF (TPFLYER%TYPE=='AIRCRA') THEN -! -! -!* 3.3.2 Determination of initial position -! ----------------------------- -! - IF (TPFLYER%FLY) THEN - ZSEG_FRAC = TPFLYER%SEGCURT / TPFLYER%SEGTIME(IL) - ! - TPFLYER%X_CUR = (1.-ZSEG_FRAC) * TPFLYER%SEGX(IL ) & - + ZSEG_FRAC * TPFLYER%SEGX(IL+1) - TPFLYER%Y_CUR = (1.-ZSEG_FRAC) * TPFLYER%SEGY(IL ) & - + ZSEG_FRAC * TPFLYER%SEGY(IL+1) + + ! Compute next position if the previous store has just been done (right moment on right model) + IF ( IMI == TPFLYER%NMODEL .AND. ISTORE > 0 ) THEN + ! This condition may only be tested if ISTORE > 0 + IF (ABS( TDTCUR - TPFLYER%TFLYER_TIME%TPDATES(ISTORE) ) < 1e-10 ) THEN + ! Next store moment + TZNEXT = TDTCUR + TPFLYER%TFLYER_TIME%XTSTEP + + ! Is the aircraft in flight ? + IF ( TZNEXT >= TPFLYER%TLAUNCH .AND. TZNEXT <= TPFLYER%TLAND ) THEN + TPFLYER%LFLY = .TRUE. + ! Force LTOOKOFF to prevent to do it again (at a next timestep) + TPFLYER%LTOOKOFF = .TRUE. + + ! Compute next position + CALL AIRCRAFT_COMPUTE_POSITION( TZNEXT, TPFLYER ) + + ! Get rank of the process where the aircraft is and the model number + CALL FLYER_GET_RANK_MODEL_ISCRASHED( TPFLYER ) + ELSE + TPFLYER%LFLY = .FALSE. + END IF END IF -! END IF - END IF -END IF -! -!* 3.4 instant of storage -! ------------------ -! -IF ( TPFLYER%T_CUR == XUNDEF ) TPFLYER%T_CUR = TPFLYER%STEP - PTSTEP -! -TPFLYER%T_CUR = TPFLYER%T_CUR + PTSTEP -! -IF ( TPFLYER%T_CUR >= TPFLYER%STEP - 1.E-10 ) THEN - GSTORE = .TRUE. - TPFLYER%T_CUR = TPFLYER%T_CUR - TPFLYER%STEP - TPFLYER%N_CUR = TPFLYER%N_CUR + 1 -END IF -! -IF (GSTORE) THEN - IN = TPFLYER%N_CUR -#if 0 - tpflyer%tpdates(in)%nyear = tdtexp%nyear - tpflyer%tpdates(in)%nmonth = tdtexp%nmonth - tpflyer%tpdates(in)%nday = tdtexp%nday - tpflyer%tpdates(in)%xtime = tdtexp%xtime + ( in - 1 ) * tpflyer%step -#else - tpflyer%tpdates(in) = tdtcur -#endif -END IF -! -IF ( TPFLYER%FLY) THEN -! + + IF ( GOWNER_CUR ) KRANK_NXT = TPFLYER%NRANK_CUR + + CLASS IS ( TBALLOONDATA) + GLAUNCH = .FALSE. !Set to true only at the launch instant (set to false in flight after launch) + + ! Launch? + LAUNCH: IF ( .NOT. TPFLYER%LFLY .AND. .NOT. TPFLYER%LCRASH .AND. TPFLYER%NMODEL == IMI ) THEN + ! Check if it is launchtime + LAUNCHTIME: IF ( ( TDTCUR - TPFLYER%TLAUNCH ) >= -1.e-10 ) THEN + TPFLYER%LFLY = .TRUE. + GLAUNCH = .TRUE. + + TPFLYER%XX_CUR = TPFLYER%XXLAUNCH + TPFLYER%XY_CUR = TPFLYER%XYLAUNCH + TPFLYER%TPOS_CUR = TDTCUR + END IF LAUNCHTIME + END IF LAUNCH + + ! Check if it is time to store data. This has also to be checked if the balloon + ! is not yet launched or is crashed (data is also written in these cases, but with default values) + IF ( TPFLYER%NMODEL == IMI .AND. & + ( .NOT. TPFLYER%LFLY .OR. TPFLYER%LCRASH .OR. ABS( TPFLYER%TPOS_CUR - TDTCUR ) < 1.e-8 ) ) THEN + !Do we have to store balloon data? + CALL FLYER_CHECK_STORESTEP( TPFLYER ) + END IF + + ! In flight + INFLIGHTONMODEL: IF ( TPFLYER%LFLY .AND. .NOT. TPFLYER%LCRASH .AND. TPFLYER%NMODEL == IMI & + .AND. ABS( TPFLYER%TPOS_CUR - TDTCUR ) < 1.e-8 ) THEN + ISOWNERBAL: IF ( TPFLYER%NRANK_CUR == ISP ) THEN + CALL FLYER_INTERP_TO_MASSPOINTS() + + ZEXN(:,:,:) = FLYER_COMPUTE_EXNER( ) + ZRHO(:,:,:) = FLYER_COMPUTE_RHO( ) + + ZTHW_FLUX(:,:,:) = ZRHO(:,:,:)*XCPD *XTHW_FLUX(II_M:II_M+1,IJ_M:IJ_M+1,:) + ZRCW_FLUX(:,:,:) = ZRHO(:,:,:)*XLVTT*XRCW_FLUX(II_M:II_M+1,IJ_M:IJ_M+1,:) + ZSVW_FLUX(:,:,:,:) = XSVW_FLUX(II_M:II_M+1,IJ_M:IJ_M+1,:,:) + + ! Compute coefficents for horizontal interpolations + CALL FLYER_COMPUTE_INTERP_COEFF_HOR_STAGE1( ) + + IF ( GLAUNCH ) CALL BALLOON_COMPUTE_INITIAL_VERTICAL_POSITION( TPFLYER ) + + ! Compute coefficents for vertical interpolations + CALL FLYER_COMPUTE_INTERP_COEFF_VER( ) + + CRASH_VERT: IF ( TPFLYER%LCRASH ) THEN + TPFLYER%LFLY = .FALSE. + WRITE( CMNHMSG(1), "( 'Balloon ', A, ' crashed the ', I2, '/', I2, '/', I4, ' at ', F18.12, & + 's (too low or too high)' )" ) & + TRIM( TPFLYER%CTITLE ), TDTCUR%NDAY, TDTCUR%NMONTH, TDTCUR%NYEAR, TDTCUR%XTIME + CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'AIRCRAFT_BALLOON_EVOL', OLOCAL = .TRUE. ) + ELSE CRASH_VERT + !No vertical crash + + ! Compute coefficents for horizontal interpolations + CALL FLYER_COMPUTE_INTERP_COEFF_HOR_STAGE2( ) + + ! Check if it is the right moment to store data + IF ( TPFLYER%LSTORE ) THEN + ISTORE = TPFLYER%TFLYER_TIME%N_CUR + IF ( ABS( TDTCUR - TPFLYER%TFLYER_TIME%TPDATES(ISTORE) ) < 1e-10 ) THEN + CALL FLYER_RECORD_DATA( ) + END IF + END IF + + ! Compute next horizontal position (balloon advection) + CALL BALLOON_ADVECTION_HOR( TPFLYER ) + + ! Compute next vertical position (balloon advection) + CALL BALLOON_ADVECTION_VER( TPFLYER ) + + TPFLYER%TPOS_CUR = TDTCUR + ZTSTEP + END IF CRASH_VERT !end of no vertical crash branch + END IF ISOWNERBAL + END IF INFLIGHTONMODEL + + IF ( GOWNER_CUR ) KRANK_NXT = TPFLYER%NRANK_CUR +END SELECT + +CONTAINS + !---------------------------------------------------------------------------- -! -!* 4. FLYER POSITION -! -------------- -! -!* 4.1 X position -! ---------- -! - IU=COUNT( PXHAT (:)<=TPFLYER%X_CUR ) - II=COUNT( ZXHATM(:)<=TPFLYER%X_CUR ) -! - IF (IU<IIB .AND. LWEST_ll()) THEN - IF (TPFLYER%MODEL == 'FIX' .OR. TPFLYER%NMODEL == 1 ) THEN - TPFLYER%CRASH=.TRUE. +!---------------------------------------------------------------------------- +SUBROUTINE BALLOON_COMPUTE_INITIAL_VERTICAL_POSITION( TPBALLOON ) + +USE MODD_CST, ONLY: XCPD, XP00, XRD + +IMPLICIT NONE + +CLASS(TBALLOONDATA), INTENT(INOUT) :: TPBALLOON + +SELECT CASE ( TPBALLOON%CTYPE ) + ! + ! Iso-density balloon + ! + CASE ( 'ISODEN' ) + IF ( TPBALLOON%XALTLAUNCH /= XNEGUNDEF ) THEN + IK00 = MAX ( COUNT (TPBALLOON%XALTLAUNCH >= ZZM(1,1,:)), 1) + IK01 = MAX ( COUNT (TPBALLOON%XALTLAUNCH >= ZZM(1,2,:)), 1) + IK10 = MAX ( COUNT (TPBALLOON%XALTLAUNCH >= ZZM(2,1,:)), 1) + IK11 = MAX ( COUNT (TPBALLOON%XALTLAUNCH >= ZZM(2,2,:)), 1) + ZZCOEF00 = (TPBALLOON%XALTLAUNCH - ZZM(1,1,IK00)) / ( ZZM(1,1,IK00+1) - ZZM(1,1,IK00)) + ZZCOEF01 = (TPBALLOON%XALTLAUNCH - ZZM(1,2,IK01)) / ( ZZM(1,2,IK01+1) - ZZM(1,2,IK01)) + ZZCOEF10 = (TPBALLOON%XALTLAUNCH - ZZM(2,1,IK10)) / ( ZZM(2,1,IK10+1) - ZZM(2,1,IK10)) + ZZCOEF11 = (TPBALLOON%XALTLAUNCH - ZZM(2,2,IK11)) / ( ZZM(2,2,IK11+1) - ZZM(2,2,IK11)) + TPBALLOON%XRHO = FLYER_INTERP(ZRHO) + ELSE IF ( TPBALLOON%XPRES /= XNEGUNDEF ) THEN + ZFLYER_EXN = (TPBALLOON%XPRES/XP00)**(XRD/XCPD) + IK00 = MAX ( COUNT (ZFLYER_EXN <= ZEXN(1,1,:)), 1) + IK01 = MAX ( COUNT (ZFLYER_EXN <= ZEXN(1,2,:)), 1) + IK10 = MAX ( COUNT (ZFLYER_EXN <= ZEXN(2,1,:)), 1) + IK11 = MAX ( COUNT (ZFLYER_EXN <= ZEXN(2,2,:)), 1) + ZZCOEF00 = (ZFLYER_EXN - ZEXN(1,1,IK00)) / ( ZEXN(1,1,IK00+1) - ZEXN(1,1,IK00)) + ZZCOEF01 = (ZFLYER_EXN - ZEXN(1,2,IK01)) / ( ZEXN(1,2,IK01+1) - ZEXN(1,2,IK01)) + ZZCOEF10 = (ZFLYER_EXN - ZEXN(2,1,IK10)) / ( ZEXN(2,1,IK10+1) - ZEXN(2,1,IK10)) + ZZCOEF11 = (ZFLYER_EXN - ZEXN(2,2,IK11)) / ( ZEXN(2,2,IK11+1) - ZEXN(2,2,IK11)) + TPBALLOON%XRHO = FLYER_INTERP(ZRHO) ELSE - II=IIB - IU=IIB + CMNHMSG(1) = 'Error in balloon initial position (balloon ' // TRIM(TPBALLOON%CTITLE) // ' )' + CMNHMSG(2) = 'neither initial ALTITUDE or PRESsure is given' + CMNHMSG(3) = 'Check your INI_BALLOON routine' + CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'AIRCRAFT_BALLOON_EVOL', OLOCAL = .TRUE. ) END IF - END IF - IF (IU>IIE .AND. LEAST_ll()) THEN - IF (TPFLYER%MODEL == 'FIX' .OR. TPFLYER%NMODEL == 1) THEN - TPFLYER%CRASH=.TRUE. + ! + ! Radiosounding balloon + ! + CASE ( 'RADIOS' ) + TPBALLOON%XZ_CUR = TPBALLOON%XALTLAUNCH + TPBALLOON%XZ_CUR = MAX ( TPBALLOON%XZ_CUR , ZZM(1,1,IKB) ) + TPBALLOON%XZ_CUR = MAX ( TPBALLOON%XZ_CUR , ZZM(2,1,IKB) ) + TPBALLOON%XZ_CUR = MAX ( TPBALLOON%XZ_CUR , ZZM(1,2,IKB) ) + TPBALLOON%XZ_CUR = MAX ( TPBALLOON%XZ_CUR , ZZM(2,2,IKB) ) + ! + ! Constant Volume Balloon + ! + CASE ( 'CVBALL' ) + IF ( TPBALLOON%XALTLAUNCH /= XNEGUNDEF ) THEN + IK00 = MAX ( COUNT (TPBALLOON%XALTLAUNCH >= ZZM(1,1,:)), 1) + IK01 = MAX ( COUNT (TPBALLOON%XALTLAUNCH >= ZZM(1,2,:)), 1) + IK10 = MAX ( COUNT (TPBALLOON%XALTLAUNCH >= ZZM(2,1,:)), 1) + IK11 = MAX ( COUNT (TPBALLOON%XALTLAUNCH >= ZZM(2,2,:)), 1) + IF (IK00*IK01*IK10*IK11 .EQ. 0) THEN + TPBALLOON%XZ_CUR = TPBALLOON%XALTLAUNCH + TPBALLOON%XZ_CUR = MAX ( TPBALLOON%XZ_CUR , ZZM(1,1,IKB) ) + TPBALLOON%XZ_CUR = MAX ( TPBALLOON%XZ_CUR , ZZM(2,1,IKB) ) + TPBALLOON%XZ_CUR = MAX ( TPBALLOON%XZ_CUR , ZZM(1,2,IKB) ) + TPBALLOON%XZ_CUR = MAX ( TPBALLOON%XZ_CUR , ZZM(2,2,IKB) ) + ELSE + ZZCOEF00 = (TPBALLOON%XALTLAUNCH - ZZM(1,1,IK00)) / ( ZZM(1,1,IK00+1) - ZZM(1,1,IK00)) + ZZCOEF01 = (TPBALLOON%XALTLAUNCH - ZZM(1,2,IK01)) / ( ZZM(1,2,IK01+1) - ZZM(1,2,IK01)) + ZZCOEF10 = (TPBALLOON%XALTLAUNCH - ZZM(2,1,IK10)) / ( ZZM(2,1,IK10+1) - ZZM(2,1,IK10)) + ZZCOEF11 = (TPBALLOON%XALTLAUNCH - ZZM(2,2,IK11)) / ( ZZM(2,2,IK11+1) - ZZM(2,2,IK11)) + TPBALLOON%XRHO = FLYER_INTERP(ZRHO) + TPBALLOON%XZ_CUR = FLYER_INTERP(ZZM) + END IF + ELSE IF ( TPBALLOON%XPRES /= XNEGUNDEF ) THEN + ZFLYER_EXN = (TPBALLOON%XPRES/XP00)**(XRD/XCPD) + IK00 = MAX ( COUNT (ZFLYER_EXN <= ZEXN(1,1,:)), 1) + IK01 = MAX ( COUNT (ZFLYER_EXN <= ZEXN(1,2,:)), 1) + IK10 = MAX ( COUNT (ZFLYER_EXN <= ZEXN(2,1,:)), 1) + IK11 = MAX ( COUNT (ZFLYER_EXN <= ZEXN(2,2,:)), 1) + IF (IK00*IK01*IK10*IK11 .EQ. 0) THEN + TPBALLOON%XZ_CUR = ZZM(1,1,IKB) + TPBALLOON%XZ_CUR = MAX ( TPBALLOON%XZ_CUR , ZZM(2,1,IKB) ) + TPBALLOON%XZ_CUR = MAX ( TPBALLOON%XZ_CUR , ZZM(1,2,IKB) ) + TPBALLOON%XZ_CUR = MAX ( TPBALLOON%XZ_CUR , ZZM(2,2,IKB) ) + ELSE + ZZCOEF00 = (ZFLYER_EXN - ZEXN(1,1,IK00)) / ( ZEXN(1,1,IK00+1) - ZEXN(1,1,IK00)) + ZZCOEF01 = (ZFLYER_EXN - ZEXN(1,2,IK01)) / ( ZEXN(1,2,IK01+1) - ZEXN(1,2,IK01)) + ZZCOEF10 = (ZFLYER_EXN - ZEXN(2,1,IK10)) / ( ZEXN(2,1,IK10+1) - ZEXN(2,1,IK10)) + ZZCOEF11 = (ZFLYER_EXN - ZEXN(2,2,IK11)) / ( ZEXN(2,2,IK11+1) - ZEXN(2,2,IK11)) + TPBALLOON%XRHO = FLYER_INTERP(ZRHO) + TPBALLOON%XZ_CUR = FLYER_INTERP(ZZM) + END IF ELSE - II=IIE - IU=IIE + TPBALLOON%XRHO = TPBALLOON%XMASS / TPBALLOON%XVOLUME + IK00 = MAX ( COUNT (TPBALLOON%XRHO <= ZRHO(1,1,:)), 1) + IK01 = MAX ( COUNT (TPBALLOON%XRHO <= ZRHO(1,2,:)), 1) + IK10 = MAX ( COUNT (TPBALLOON%XRHO <= ZRHO(2,1,:)), 1) + IK11 = MAX ( COUNT (TPBALLOON%XRHO <= ZRHO(2,2,:)), 1) + IF (IK00*IK01*IK10*IK11 .EQ. 0) THEN + TPBALLOON%XZ_CUR = ZZM(1,1,IKB) + TPBALLOON%XZ_CUR = MAX ( TPBALLOON%XZ_CUR , ZZM(2,1,IKB) ) + TPBALLOON%XZ_CUR = MAX ( TPBALLOON%XZ_CUR , ZZM(1,2,IKB) ) + TPBALLOON%XZ_CUR = MAX ( TPBALLOON%XZ_CUR , ZZM(2,2,IKB) ) + ELSE + ZZCOEF00 = (TPBALLOON%XRHO - ZRHO(1,1,IK00)) / ( ZRHO(1,1,IK00+1) - ZRHO(1,1,IK00)) + ZZCOEF01 = (TPBALLOON%XRHO - ZRHO(1,2,IK01)) / ( ZRHO(1,2,IK01+1) - ZRHO(1,2,IK01)) + ZZCOEF10 = (TPBALLOON%XRHO - ZRHO(2,1,IK10)) / ( ZRHO(2,1,IK10+1) - ZRHO(2,1,IK10)) + ZZCOEF11 = (TPBALLOON%XRHO - ZRHO(2,2,IK11)) / ( ZRHO(2,2,IK11+1) - ZRHO(2,2,IK11)) + TPBALLOON%XZ_CUR = FLYER_INTERP(ZZM) + END IF END IF - END IF -! -! -!* 4.2 Y position -! ---------- -! - IV=COUNT( PYHAT (:)<=TPFLYER%Y_CUR ) - IJ=COUNT( ZYHATM(:)<=TPFLYER%Y_CUR ) -! - IF (IV<IJB .AND. LSOUTH_ll()) THEN - IF (TPFLYER%MODEL == 'FIX' .OR. TPFLYER%NMODEL == 1) THEN - TPFLYER%CRASH=.TRUE. +END SELECT + +END SUBROUTINE BALLOON_COMPUTE_INITIAL_VERTICAL_POSITION +!---------------------------------------------------------------------------- +!---------------------------------------------------------------------------- +SUBROUTINE BALLOON_ADVECTION_HOR( TPBALLOON ) + +USE MODD_AIRCRAFT_BALLOON, ONLY: TBALLOONDATA +USE MODD_CONF, ONLY: LCARTESIAN +USE MODD_NESTING, ONLY: NDAD, NDTRATIO +USE MODD_TIME, only: TDTSEG +USE MODD_TIME_n, ONLY: TDTCUR + +IMPLICIT NONE + +CLASS(TBALLOONDATA), INTENT(INOUT) :: TPBALLOON + +INTEGER :: IMODEL +INTEGER :: IMODEL_OLD +REAL :: ZX_OLD, ZY_OLD +REAL :: ZDELTATIME +REAL :: ZDIVTMP +REAL :: ZMAP ! map factor at balloon location +REAL :: ZU_BAL ! horizontal wind speed at balloon location (along x) +REAL :: ZV_BAL ! horizontal wind speed at balloon location (along y) + +ZTSTEP = PTSTEP + +ZU_BAL = FLYER_INTERP_U(PU) +ZV_BAL = FLYER_INTERP_V(PV) +if ( .not. lcartesian ) then + ZMAP = FLYER_INTERP_2D(PMAP) +else + ZMAP = 1. +end if +! +ZX_OLD = TPBALLOON%XX_CUR +ZY_OLD = TPBALLOON%XY_CUR + +TPBALLOON%XX_CUR = TPBALLOON%XX_CUR + ZU_BAL * ZTSTEP * ZMAP +TPBALLOON%XY_CUR = TPBALLOON%XY_CUR + ZV_BAL * ZTSTEP * ZMAP + +! Compute rank and model for next position +! This is done here because we need to check if there is a change of model (for 'MOB' balloons) +! because position has to be adapted to the timestep of a coarser model (if necessary) +IMODEL_OLD = TPBALLOON%NMODEL + +! Get rank of the process where the balloon is and the model number +CALL FLYER_GET_RANK_MODEL_ISCRASHED( TPBALLOON ) + +IF ( TPBALLOON%LCRASH ) THEN + WRITE( CMNHMSG(1), "( 'Balloon ', A, ' crashed the ', I2, '/', I2, '/', I4, ' at ', F18.12, & + 's (out of the horizontal boundaries)' )" ) & + TRIM( TPBALLOON%CTITLE ), TDTCUR%NDAY, TDTCUR%NMONTH, TDTCUR%NYEAR, TDTCUR%XTIME + CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'AIRCRAFT_BALLOON_EVOL', OLOCAL = .TRUE. ) +END IF + +IF ( TPBALLOON%NMODEL /= IMODEL_OLD .AND. .NOT. TPBALLOON%LCRASH ) THEN + ! Balloon has changed of model + IF ( NDAD(TPBALLOON%NMODEL ) == IMODEL_OLD ) THEN + ! Nothing special to do when going to child model + ELSE IF ( TPBALLOON%NMODEL == NDAD(IMODEL_OLD) ) THEN + ! Balloon go to parent model + ! Recompute position to be compatible with parent timestep + ! Parent timestep could be bigger (factor NDTRATIO) and therefore next position is not the one computed just before + + ! Determine step compatible with parent model at next parent timestep + ZDELTATIME = TDTCUR - TDTSEG + ZDIVTMP = ZDELTATIME / ( PTSTEP * NDTRATIO(IMODEL_OLD) ) + IF ( ABS( ZDIVTMP - NINT( ZDIVTMP ) ) < 1E-6 * PTSTEP * NDTRATIO(IMODEL_OLD) ) THEN + ! Current time is a multiple of parent timestep => next position is parent timestep + ZTSTEP = ZTSTEP * NDTRATIO(IMODEL_OLD) ELSE - IJ=IJB - IV=IJB + ! Current time is not a multiple of parent timestep + ! Next position must be a multiple of parent timestep + ! NINT( NDTRATIO(IMODEL_OLD) * ( 1 - ( ZDIVTMP - INT( ZDIVTMP ) ) ) ) corresponds to the number + ! of child timesteps to go to the next parent timestep + ! We skip one timestep (+NDTRATIO(IMODEL_OLD)) because it has already been computed for the parent model + ZTSTEP = ZTSTEP * ( NINT( NDTRATIO(IMODEL_OLD) * ( 1 - ( ZDIVTMP - INT( ZDIVTMP ) ) ) ) + NDTRATIO(IMODEL_OLD) ) + + ! Detect if we need to skip a store (if time of next position is after time of next store) + ! This can happen when a ballon goes to its parent model + IF ( TDTCUR + ZTSTEP > TPBALLOON%TFLYER_TIME%TPDATES(TPBALLOON%TFLYER_TIME%N_CUR) + TPBALLOON%TFLYER_TIME%XTSTEP + 1e-6 ) THEN + !Force a dummy store (nothing is computed, therefore default/initial values will be stored) + TPBALLOON%LSTORE = .TRUE. + + TPBALLOON%TFLYER_TIME%N_CUR = TPBALLOON%TFLYER_TIME%N_CUR + 1 + ISTORE = TPBALLOON%TFLYER_TIME%N_CUR + + !Remark: by construction here, ISTORE is always > 1 => no risk with ISTORE-1 value + TPBALLOON%TFLYER_TIME%TPDATES(ISTORE) = TPBALLOON%TFLYER_TIME%TPDATES(ISTORE-1) + TPBALLOON%TFLYER_TIME%XTSTEP + + WRITE( CMNHMSG(1), "( 'Balloon ', A, ': store skipped at ', I2, '/', I2, '/', I4, ' at ', F18.12, 's' )" ) & + TRIM( TPBALLOON%CTITLE ), & + TPBALLOON%TFLYER_TIME%TPDATES(ISTORE)%NDAY, TPBALLOON%TFLYER_TIME%TPDATES(ISTORE)%NMONTH, & + TPBALLOON%TFLYER_TIME%TPDATES(ISTORE)%NYEAR, TPBALLOON%TFLYER_TIME%TPDATES(ISTORE)%XTIME + CMNHMSG(2) = 'due to change of model (child to its parent)' + CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'AIRCRAFT_BALLOON_EVOL', OLOCAL = .TRUE. ) + END IF END IF - END IF - IF (IV>IJE .AND. LNORTH_ll()) THEN - IF (TPFLYER%MODEL == 'FIX' .OR. TPFLYER%NMODEL == 1) THEN - TPFLYER%CRASH=.TRUE. - ELSE - IJ=IJE - IV=IJE + + ! Compute new horizontal position + TPBALLOON%XX_CUR = TPBALLOON%XX_CUR + ZU_BAL * ZTSTEP * ZMAP + TPBALLOON%XY_CUR = TPBALLOON%XY_CUR + ZV_BAL * ZTSTEP * ZMAP + + ! Get rank of the process where the balloon is and the model number + ! Model number is now imposed + IMODEL = TPBALLOON%NMODEL + CALL FLYER_GET_RANK_MODEL_ISCRASHED( TPBALLOON, KMODEL = IMODEL ) + IF ( TPBALLOON%LCRASH ) THEN + WRITE( CMNHMSG(1), "( 'Balloon ', A, ' crashed the ', I2, '/', I2, '/', I4, ' at ', F18.12, & + 's (out of the horizontal boundaries)' )" ) & + TRIM( TPBALLOON%CTITLE ), TDTCUR%NDAY, TDTCUR%NMONTH, TDTCUR%NYEAR, TDTCUR%XTIME + CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'AIRCRAFT_BALLOON_EVOL', OLOCAL = .TRUE. ) END IF + ELSE + ! Special case not-managed (different dads, change of several models in 1 step (going to grand parent/grand children)...) + ! This situation should be very infrequent => reasonable risk, error on the trajectory should be relatively small in most cases + CMNHMSG(1) = 'unmanaged change of model for ballon ' // TPBALLOON%CTITLE + CMNHMSG(2) = 'its trajectory might be wrong' + CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'AIRCRAFT_BALLOON_EVOL', OLOCAL = .TRUE. ) END IF -! -! -!* 4.3 Position of balloon according to processors -! ------------------------------------------- -! - IF (IU>=IIB .AND. IU<=IIE .AND. IV>=IJB .AND. IV<=IJE) ZTHIS_PROC=1. -! -! -!* 4.4 Computations only on correct processor -! -------------------------------------- -! +END IF + +END SUBROUTINE BALLOON_ADVECTION_HOR !---------------------------------------------------------------------------- - IF (ZTHIS_PROC>0. .AND. .NOT. TPFLYER%CRASH) THEN !---------------------------------------------------------------------------- -! -!* 4.5 Interpolations of model variables to mass points -! ------------------------------------------------ -! +SUBROUTINE BALLOON_ADVECTION_VER( TPBALLOON ) - ZZM(:,:,1:IKU-1)=0.5 *PZ(II :II+1,IJ :IJ+1,1:IKU-1)+0.5 *PZ(II :II+1,IJ :IJ+1,2:IKU ) - ZZM(:,:, IKU )=1.5 *PZ(II :II+1,IJ :IJ+1, IKU-1)-0.5 *PZ(II :II+1,IJ :IJ+1, IKU-2) -! - IDU = IU - II - ZZU(:,:,1:IKU-1)=0.25*PZ(IDU+II-1:IDU+II, IJ :IJ+1,1:IKU-1)+0.25*PZ(IDU+II-1:IDU+II ,IJ :IJ+1,2:IKU ) & - +0.25*PZ(IDU+II :IDU+II+1,IJ :IJ+1,1:IKU-1)+0.25*PZ(IDU+II :IDU+II+1,IJ :IJ+1,2:IKU ) - ZZU(:,:, IKU )=0.75*PZ(IDU+II-1:IDU+II ,IJ :IJ+1, IKU-1)-0.25*PZ(IDU+II-1:IDU+II ,IJ :IJ+1, IKU-2) & - +0.75*PZ(IDU+II :IDU+II+1,IJ :IJ+1, IKU-1)-0.25*PZ(IDU+II :IDU+II+1,IJ :IJ+1, IKU-2) - - IDV = IV - IJ - ZZV(:,:,1:IKU-1)=0.25*PZ(II :II+1,IDV+IJ-1:IDV+IJ ,1:IKU-1)+0.25*PZ(II :II+1,IDV+IJ-1:IDV+IJ ,2:IKU ) & - +0.25*PZ(II :II+1,IDV+IJ :IDV+IJ+1,1:IKU-1)+0.25*PZ(II :II+1,IDV+IJ :IDV+IJ+1,2:IKU ) - ZZV(:,:, IKU )=0.75*PZ(II :II+1,IDV+IJ-1:IDV+IJ , IKU-1)-0.25*PZ(II :II+1,IDV+IJ-1:IDV+IJ , IKU-2) & - +0.75*PZ(II :II+1,IDV+IJ :IDV+IJ+1, IKU-1)-0.25*PZ(II :II+1,IDV+IJ :IDV+IJ+1, IKU-2) -! -! - ZWM(:,:,1:IKU-1)=0.5*PW(II:II+1,IJ:IJ+1,1:IKU-1)+0.5*PW(II:II+1,IJ:IJ+1,2:IKU ) - ZWM(:,:, IKU )=1.5*PW(II:II+1,IJ:IJ+1, IKU-1)-0.5*PW(II:II+1,IJ:IJ+1, IKU-2) -! -!---------------------------------------------------------------------------- -! -!* 5. BALLOON/AIRCRAFT VERTICAL POSITION -! ---------------------------------- -! -! -!* 5.1 Density -! ------- -! - ZEXN(:,:,: ) = (PP(II:II+1,IJ:IJ+1,:)/XP00)**(XRD/XCPD) - DO JK=IKB-1,1,-1 - ZEXN(:,:,JK) = 1.5 * ZEXN(:,:,JK+1) - 0.5 * ZEXN(:,:,JK+2) - END DO - DO JK=IKE+1,IKU - ZEXN(:,:,JK) = 1.5 * ZEXN(:,:,JK-1) - 0.5 * ZEXN(:,:,JK-2) +USE MODD_AIRCRAFT_BALLOON, ONLY: TBALLOONDATA +USE MODD_CST, ONLY: XG + +IMPLICIT NONE + +CLASS(TBALLOONDATA), INTENT(INOUT) :: TPBALLOON + +INTEGER :: JK ! loop index +REAL :: ZRO_BAL ! air density at balloon location +REAL :: ZW_BAL ! vertical wind speed at balloon location (along z) + +IF ( TPBALLOON%CTYPE == 'RADIOS' ) THEN + ZW_BAL = FLYER_INTERP(ZWM) + TPBALLOON%XZ_CUR = TPBALLOON%XZ_CUR + ( ZW_BAL + TPBALLOON%XWASCENT ) * ZTSTEP +END IF + +IF ( TPBALLOON%CTYPE == 'CVBALL' ) THEN + ZW_BAL = FLYER_INTERP(ZWM) + ZRO_BAL = FLYER_INTERP(ZRHO) + ! calculation with a time step of 1 second or less + IF (INT(ZTSTEP) .GT. 1 ) THEN + DO JK=1,INT(ZTSTEP) + TPBALLOON%XWASCENT = TPBALLOON%XWASCENT & + - ( 1. / (1. + TPBALLOON%XINDDRAG ) ) * 1. * & + ( XG * ( ( TPBALLOON%XMASS / TPBALLOON%XVOLUME ) - ZRO_BAL ) / ( TPBALLOON%XMASS / TPBALLOON%XVOLUME ) & + + TPBALLOON%XWASCENT * ABS ( TPBALLOON%XWASCENT ) * & + TPBALLOON%XDIAMETER * TPBALLOON%XAERODRAG / ( 2. * TPBALLOON%XVOLUME ) & + ) + TPBALLOON%XZ_CUR = TPBALLOON%XZ_CUR + ( ZW_BAL + TPBALLOON%XWASCENT ) * 1. END DO - ! - IF (TPFLYER%TYPE=='ISODEN' .OR. TPFLYER%TYPE=='CVBALL' & - .OR. TPFLYER%TYPE=='AIRCRA' ) THEN - ZTHV(:,:,:) = PTH(II:II+1,IJ:IJ+1,:) - IF (SIZE(PR,4)>0) & - ZTHV(:,:,:) = ZTHV(:,:,:) * ( 1. + XRV/XRD*PR(II:II+1,IJ:IJ+1,:,1) ) & - / ( 1. + WATER_SUM(PR(II:II+1,IJ:IJ+1,:,:)) ) - ! - ZTV (:,:,:) = ZTHV(:,:,:) * ZEXN(:,:,:) - ZRHO(:,:,:) = PP(II:II+1,IJ:IJ+1,:) / (XRD*ZTV(:,:,:)) - DO JK=IKB-1,1,-1 - ZRHO(:,:,JK) = 1.5 * ZRHO(:,:,JK+1) - 0.5 * ZRHO(:,:,JK+2) - END DO - DO JK=IKE+1,IKU - ZRHO(:,:,JK) = 1.5 * ZRHO(:,:,JK-1) - 0.5 * ZRHO(:,:,JK-2) - END DO - ZTHW_FLUX(:,:,:) = ZRHO(:,:,:)*XCPD *XTHW_FLUX(II:II+1,IJ:IJ+1,:) - ZRCW_FLUX(:,:,:) = ZRHO(:,:,:)*XLVTT*XRCW_FLUX(II:II+1,IJ:IJ+1,:) - ZSVW_FLUX(:,:,:,:) = XSVW_FLUX(II:II+1,IJ:IJ+1,:,:) - END IF + END IF + IF (ZTSTEP .GT. INT(ZTSTEP)) THEN + TPBALLOON%XWASCENT = TPBALLOON%XWASCENT & + - ( 1. / (1. + TPBALLOON%XINDDRAG ) ) * (ZTSTEP-INT(ZTSTEP)) * & + ( XG * ( ( TPBALLOON%XMASS / TPBALLOON%XVOLUME ) - ZRO_BAL ) / ( TPBALLOON%XMASS / TPBALLOON%XVOLUME ) & + + TPBALLOON%XWASCENT * ABS ( TPBALLOON%XWASCENT ) * & + TPBALLOON%XDIAMETER * TPBALLOON%XAERODRAG / ( 2. * TPBALLOON%XVOLUME ) & + ) + TPBALLOON%XZ_CUR = TPBALLOON%XZ_CUR + ( ZW_BAL + TPBALLOON%XWASCENT ) * (ZTSTEP-INT(ZTSTEP)) + END IF +END IF -! -!* 5.2 Initial vertical positions -! -------------------------- -! - IF (GLAUNCH) THEN -! -!* 5.2.1 Iso-density balloon -! - IF (TPFLYER%TYPE=='ISODEN') THEN - ZXCOEF = (TPFLYER%X_CUR - ZXHATM(II)) / (ZXHATM(II+1) - ZXHATM(II)) - ZXCOEF = MAX (0.,MIN(ZXCOEF,1.)) - ZYCOEF = (TPFLYER%Y_CUR - ZYHATM(IJ)) / (ZYHATM(IJ+1) - ZYHATM(IJ)) - ZYCOEF = MAX (0.,MIN(ZYCOEF,1.)) - IF ( TPFLYER%ALT /= XUNDEF ) THEN - IK00 = MAX ( COUNT (TPFLYER%ALT >= ZZM(1,1,:)), 1) - IK01 = MAX ( COUNT (TPFLYER%ALT >= ZZM(1,2,:)), 1) - IK10 = MAX ( COUNT (TPFLYER%ALT >= ZZM(2,1,:)), 1) - IK11 = MAX ( COUNT (TPFLYER%ALT >= ZZM(2,2,:)), 1) - ZZCOEF00 = (TPFLYER%ALT - ZZM(1,1,IK00)) / ( ZZM(1,1,IK00+1) - ZZM(1,1,IK00)) - ZZCOEF01 = (TPFLYER%ALT - ZZM(1,2,IK01)) / ( ZZM(1,2,IK01+1) - ZZM(1,2,IK01)) - ZZCOEF10 = (TPFLYER%ALT - ZZM(2,1,IK10)) / ( ZZM(2,1,IK10+1) - ZZM(2,1,IK10)) - ZZCOEF11 = (TPFLYER%ALT - ZZM(2,2,IK11)) / ( ZZM(2,2,IK11+1) - ZZM(2,2,IK11)) - TPFLYER%RHO = FLYER_INTERP(ZRHO) - ELSE IF ( TPFLYER%PRES /= XUNDEF ) THEN - ZFLYER_EXN = (TPFLYER%PRES/XP00)**(XRD/XCPD) - IK00 = MAX ( COUNT (ZFLYER_EXN <= ZEXN(1,1,:)), 1) - IK01 = MAX ( COUNT (ZFLYER_EXN <= ZEXN(1,2,:)), 1) - IK10 = MAX ( COUNT (ZFLYER_EXN <= ZEXN(2,1,:)), 1) - IK11 = MAX ( COUNT (ZFLYER_EXN <= ZEXN(2,2,:)), 1) - ZZCOEF00 = (ZFLYER_EXN - ZEXN(1,1,IK00)) / ( ZEXN(1,1,IK00+1) - ZEXN(1,1,IK00)) - ZZCOEF01 = (ZFLYER_EXN - ZEXN(1,2,IK01)) / ( ZEXN(1,2,IK01+1) - ZEXN(1,2,IK01)) - ZZCOEF10 = (ZFLYER_EXN - ZEXN(2,1,IK10)) / ( ZEXN(2,1,IK10+1) - ZEXN(2,1,IK10)) - ZZCOEF11 = (ZFLYER_EXN - ZEXN(2,2,IK11)) / ( ZEXN(2,2,IK11+1) - ZEXN(2,2,IK11)) - TPFLYER%RHO = FLYER_INTERP(ZRHO) - ELSE - WRITE(ILUOUT,*) 'Error in balloon initial position (balloon ',TPFLYER%TITLE,' )' - WRITE(ILUOUT,*) 'neither initial ALTITUDE or PRESsure is given' - WRITE(ILUOUT,*) 'Check your INI_BALLOON routine' -!callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','AIRCRAFT_BALLOON_EVOL','') - END IF - END IF -! -!* 5.2.2 Radiosounding balloon -! - IF (TPFLYER%TYPE=='RADIOS') THEN - TPFLYER%Z_CUR = TPFLYER%ALT - TPFLYER%Z_CUR = MAX ( TPFLYER%Z_CUR , ZZM(1,1,IKB) ) - TPFLYER%Z_CUR = MAX ( TPFLYER%Z_CUR , ZZM(2,1,IKB) ) - TPFLYER%Z_CUR = MAX ( TPFLYER%Z_CUR , ZZM(1,2,IKB) ) - TPFLYER%Z_CUR = MAX ( TPFLYER%Z_CUR , ZZM(2,2,IKB) ) - END IF +END SUBROUTINE BALLOON_ADVECTION_VER +!---------------------------------------------------------------------------- +!---------------------------------------------------------------------------- +SUBROUTINE FLYER_INTERP_TO_MASSPOINTS() -!* 5.2.3 Aircraft -! - IF (TPFLYER%TYPE=='AIRCRA') THEN - IF (TPFLYER%ALTDEF) THEN - TPFLYER%P_CUR = (1.-ZSEG_FRAC) * TPFLYER%SEGP(IL ) & - + ZSEG_FRAC * TPFLYER%SEGP(IL+1) - ELSE - TPFLYER%Z_CUR = (1.-ZSEG_FRAC) * TPFLYER%SEGZ(IL ) & - + ZSEG_FRAC * TPFLYER%SEGZ(IL +1 ) - END IF - END IF -! -!* 5.2.4 Constant Volume Balloon -! - IF (TPFLYER%TYPE=='CVBALL') THEN - ZXCOEF = (TPFLYER%X_CUR - ZXHATM(II)) / (ZXHATM(II+1) - ZXHATM(II)) - ZXCOEF = MAX (0.,MIN(ZXCOEF,1.)) - ZYCOEF = (TPFLYER%Y_CUR - ZYHATM(IJ)) / (ZYHATM(IJ+1) - ZYHATM(IJ)) - ZYCOEF = MAX (0.,MIN(ZYCOEF,1.)) - IF ( TPFLYER%ALT /= XUNDEF ) THEN - IK00 = MAX ( COUNT (TPFLYER%ALT >= ZZM(1,1,:)), 1) - IK01 = MAX ( COUNT (TPFLYER%ALT >= ZZM(1,2,:)), 1) - IK10 = MAX ( COUNT (TPFLYER%ALT >= ZZM(2,1,:)), 1) - IK11 = MAX ( COUNT (TPFLYER%ALT >= ZZM(2,2,:)), 1) - IF (IK00*IK01*IK10*IK11 .EQ. 0) THEN - TPFLYER%Z_CUR = TPFLYER%ALT - TPFLYER%Z_CUR = MAX ( TPFLYER%Z_CUR , ZZM(1,1,IKB) ) - TPFLYER%Z_CUR = MAX ( TPFLYER%Z_CUR , ZZM(2,1,IKB) ) - TPFLYER%Z_CUR = MAX ( TPFLYER%Z_CUR , ZZM(1,2,IKB) ) - TPFLYER%Z_CUR = MAX ( TPFLYER%Z_CUR , ZZM(2,2,IKB) ) - ELSE - ZZCOEF00 = (TPFLYER%ALT - ZZM(1,1,IK00)) / ( ZZM(1,1,IK00+1) - ZZM(1,1,IK00)) - ZZCOEF01 = (TPFLYER%ALT - ZZM(1,2,IK01)) / ( ZZM(1,2,IK01+1) - ZZM(1,2,IK01)) - ZZCOEF10 = (TPFLYER%ALT - ZZM(2,1,IK10)) / ( ZZM(2,1,IK10+1) - ZZM(2,1,IK10)) - ZZCOEF11 = (TPFLYER%ALT - ZZM(2,2,IK11)) / ( ZZM(2,2,IK11+1) - ZZM(2,2,IK11)) - TPFLYER%RHO = FLYER_INTERP(ZRHO) - TPFLYER%Z_CUR = FLYER_INTERP(ZZM) - END IF - ELSE IF ( TPFLYER%PRES /= XUNDEF ) THEN - ZFLYER_EXN = (TPFLYER%PRES/XP00)**(XRD/XCPD) - IK00 = MAX ( COUNT (ZFLYER_EXN <= ZEXN(1,1,:)), 1) - IK01 = MAX ( COUNT (ZFLYER_EXN <= ZEXN(1,2,:)), 1) - IK10 = MAX ( COUNT (ZFLYER_EXN <= ZEXN(2,1,:)), 1) - IK11 = MAX ( COUNT (ZFLYER_EXN <= ZEXN(2,2,:)), 1) - IF (IK00*IK01*IK10*IK11 .EQ. 0) THEN - TPFLYER%Z_CUR = ZZM(1,1,IKB) - TPFLYER%Z_CUR = MAX ( TPFLYER%Z_CUR , ZZM(2,1,IKB) ) - TPFLYER%Z_CUR = MAX ( TPFLYER%Z_CUR , ZZM(1,2,IKB) ) - TPFLYER%Z_CUR = MAX ( TPFLYER%Z_CUR , ZZM(2,2,IKB) ) - ELSE - ZZCOEF00 = (ZFLYER_EXN - ZEXN(1,1,IK00)) / ( ZEXN(1,1,IK00+1) - ZEXN(1,1,IK00)) - ZZCOEF01 = (ZFLYER_EXN - ZEXN(1,2,IK01)) / ( ZEXN(1,2,IK01+1) - ZEXN(1,2,IK01)) - ZZCOEF10 = (ZFLYER_EXN - ZEXN(2,1,IK10)) / ( ZEXN(2,1,IK10+1) - ZEXN(2,1,IK10)) - ZZCOEF11 = (ZFLYER_EXN - ZEXN(2,2,IK11)) / ( ZEXN(2,2,IK11+1) - ZEXN(2,2,IK11)) - TPFLYER%RHO = FLYER_INTERP(ZRHO) - TPFLYER%Z_CUR = FLYER_INTERP(ZZM) - END IF - ELSE - TPFLYER%RHO = TPFLYER%MASS / TPFLYER%VOLUME - IK00 = MAX ( COUNT (TPFLYER%RHO <= ZRHO(1,1,:)), 1) - IK01 = MAX ( COUNT (TPFLYER%RHO <= ZRHO(1,2,:)), 1) - IK10 = MAX ( COUNT (TPFLYER%RHO <= ZRHO(2,1,:)), 1) - IK11 = MAX ( COUNT (TPFLYER%RHO <= ZRHO(2,2,:)), 1) - IF (IK00*IK01*IK10*IK11 .EQ. 0) THEN - TPFLYER%Z_CUR = ZZM(1,1,IKB) - TPFLYER%Z_CUR = MAX ( TPFLYER%Z_CUR , ZZM(2,1,IKB) ) - TPFLYER%Z_CUR = MAX ( TPFLYER%Z_CUR , ZZM(1,2,IKB) ) - TPFLYER%Z_CUR = MAX ( TPFLYER%Z_CUR , ZZM(2,2,IKB) ) - ELSE - ZZCOEF00 = (TPFLYER%RHO - ZRHO(1,1,IK00)) / ( ZRHO(1,1,IK00+1) - ZRHO(1,1,IK00)) - ZZCOEF01 = (TPFLYER%RHO - ZRHO(1,2,IK01)) / ( ZRHO(1,2,IK01+1) - ZRHO(1,2,IK01)) - ZZCOEF10 = (TPFLYER%RHO - ZRHO(2,1,IK10)) / ( ZRHO(2,1,IK10+1) - ZRHO(2,1,IK10)) - ZZCOEF11 = (TPFLYER%RHO - ZRHO(2,2,IK11)) / ( ZRHO(2,2,IK11+1) - ZRHO(2,2,IK11)) - TPFLYER%Z_CUR = FLYER_INTERP(ZZM) - END IF - END IF - END IF +USE MODD_GRID_n, ONLY: XXHAT, XXHATM, XYHAT, XYHATM +USE MODD_PARAMETERS, ONLY: JPVEXT + +IMPLICIT NONE + +INTEGER :: IDU ! difference between II_U and II_M +INTEGER :: IDV ! difference between IJ_V and IJ_M + +! Indices +IKB = 1 + JPVEXT +IKE = SIZE(PZ,3) - JPVEXT + +! Interpolations of model variables to mass points +! ------------------------------------------------ + +! X position +II_U = COUNT( XXHAT (:) <= TPFLYER%XX_CUR ) +II_M = COUNT( XXHATM(:) <= TPFLYER%XX_CUR ) + +! Y position +IJ_V=COUNT( XYHAT (:)<=TPFLYER%XY_CUR ) +IJ_M=COUNT( XYHATM(:)<=TPFLYER%XY_CUR ) +ZZM(:,:,1:IKU-1)=0.5 *PZ(II_M :II_M+1,IJ_M :IJ_M+1,1:IKU-1)+0.5 *PZ(II_M :II_M+1,IJ_M :IJ_M+1,2:IKU ) +ZZM(:,:, IKU )=1.5 *PZ(II_M :II_M+1,IJ_M :IJ_M+1, IKU-1)-0.5 *PZ(II_M :II_M+1,IJ_M :IJ_M+1, IKU-2) + +IDU = II_U - II_M +ZZU(:,:,1:IKU-1)=0.25*PZ(IDU+II_M-1:IDU+II_M, IJ_M :IJ_M+1,1:IKU-1)+0.25*PZ(IDU+II_M-1:IDU+II_M ,IJ_M :IJ_M+1,2:IKU ) & + +0.25*PZ(IDU+II_M :IDU+II_M+1,IJ_M :IJ_M+1,1:IKU-1)+0.25*PZ(IDU+II_M :IDU+II_M+1,IJ_M :IJ_M+1,2:IKU ) +ZZU(:,:, IKU )=0.75*PZ(IDU+II_M-1:IDU+II_M ,IJ_M :IJ_M+1, IKU-1)-0.25*PZ(IDU+II_M-1:IDU+II_M ,IJ_M :IJ_M+1, IKU-2) & + +0.75*PZ(IDU+II_M :IDU+II_M+1,IJ_M :IJ_M+1, IKU-1)-0.25*PZ(IDU+II_M :IDU+II_M+1,IJ_M :IJ_M+1, IKU-2) + +IDV = IJ_V - IJ_M +ZZV(:,:,1:IKU-1)=0.25*PZ(II_M :II_M+1,IDV+IJ_M-1:IDV+IJ_M ,1:IKU-1)+0.25*PZ(II_M :II_M+1,IDV+IJ_M-1:IDV+IJ_M ,2:IKU ) & + +0.25*PZ(II_M :II_M+1,IDV+IJ_M :IDV+IJ_M+1,1:IKU-1)+0.25*PZ(II_M :II_M+1,IDV+IJ_M :IDV+IJ_M+1,2:IKU ) +ZZV(:,:, IKU )=0.75*PZ(II_M :II_M+1,IDV+IJ_M-1:IDV+IJ_M , IKU-1)-0.25*PZ(II_M :II_M+1,IDV+IJ_M-1:IDV+IJ_M , IKU-2) & + +0.75*PZ(II_M :II_M+1,IDV+IJ_M :IDV+IJ_M+1, IKU-1)-0.25*PZ(II_M :II_M+1,IDV+IJ_M :IDV+IJ_M+1, IKU-2) + +ZWM(:,:,1:IKU-1)=0.5*PW(II_M:II_M+1,IJ_M:IJ_M+1,1:IKU-1)+0.5*PW(II_M:II_M+1,IJ_M:IJ_M+1,2:IKU ) +ZWM(:,:, IKU )=1.5*PW(II_M:II_M+1,IJ_M:IJ_M+1, IKU-1)-0.5*PW(II_M:II_M+1,IJ_M:IJ_M+1, IKU-2) + +END SUBROUTINE FLYER_INTERP_TO_MASSPOINTS +!---------------------------------------------------------------------------- +!---------------------------------------------------------------------------- +PURE FUNCTION FLYER_COMPUTE_EXNER( ) RESULT( PEXN ) + +USE MODD_CST, ONLY: XCPD, XP00, XRD + +IMPLICIT NONE + +REAL, DIMENSION(2,2,SIZE(PTH,3)) :: PEXN + +INTEGER :: JK + +PEXN(:,:,:) = ( PP(II_M:II_M+1, IJ_M:IJ_M+1, :) / XP00) ** ( XRD / XCPD ) +DO JK = IKB-1, 1, -1 + PEXN(:,:,JK) = 1.5 * PEXN(:,:,JK+1) - 0.5 * PEXN(:,:,JK+2) +END DO +DO JK = IKE+1, IKU + PEXN(:,:,JK) = 1.5 * PEXN(:,:,JK-1) - 0.5 * PEXN(:,:,JK-2) +END DO + +END FUNCTION FLYER_COMPUTE_EXNER +!---------------------------------------------------------------------------- +!---------------------------------------------------------------------------- +PURE FUNCTION FLYER_COMPUTE_RHO( ) RESULT( PRHO ) + +USE MODD_CST, ONLY: XRD, XRV + +USE MODI_WATER_SUM + +IMPLICIT NONE + +REAL, DIMENSION(2,2,SIZE(PTH,3)) :: PRHO + +INTEGER :: JK +REAL, DIMENSION(2,2,SIZE(PTH,3)) :: ZTHV ! virtual potential temperature + +ZTHV(:,:,:) = PTH(II_M:II_M+1, IJ_M:IJ_M+1, :) +IF ( SIZE( PR, 4 ) > 0 ) & + ZTHV(:,:,:) = ZTHV(:,:,:) * ( 1. + XRV / XRD * PR(II_M:II_M+1, IJ_M:IJ_M+1, :, 1) ) & + / ( 1. + WATER_SUM( PR(II_M:II_M+1, IJ_M:IJ_M+1, :, :)) ) +! +PRHO(:,:,:) = PP(II_M:II_M+1, IJ_M:IJ_M+1, :) / ( XRD * ZTHV(:,:,:) * ZEXN(:,:,:) ) +DO JK = IKB-1, 1, -1 + PRHO(:,:,JK) = 1.5 * PRHO(:,:,JK+1) - 0.5 * PRHO(:,:,JK+2) +END DO +DO JK = IKE+1, IKU + PRHO(:,:,JK) = 1.5 * PRHO(:,:,JK-1) - 0.5 * PRHO(:,:,JK-2) +END DO + +END FUNCTION FLYER_COMPUTE_RHO +!---------------------------------------------------------------------------- +!---------------------------------------------------------------------------- +SUBROUTINE FLYER_COMPUTE_INTERP_COEFF_HOR_STAGE1( ) +! Compute coefficents for horizontal interpolations (1st stage) + +USE MODD_GRID_n, ONLY: XXHAT, XXHATM, XYHAT, XYHATM + +IMPLICIT NONE + +! Interpolation coefficient for X +ZXCOEF = (TPFLYER%XX_CUR - XXHATM(II_M)) / (XXHATM(II_M+1) - XXHATM(II_M)) +ZXCOEF = MAX (0.,MIN(ZXCOEF,1.)) + +! Interpolation coefficient for y +ZYCOEF = (TPFLYER%XY_CUR - XYHATM(IJ_M)) / (XYHATM(IJ_M+1) - XYHATM(IJ_M)) +ZYCOEF = MAX (0.,MIN(ZYCOEF,1.)) + +! Interpolation coefficient for X (for U) +ZUCOEF = (TPFLYER%XX_CUR - XXHAT(II_U)) / (XXHAT(II_U+1) - XXHAT(II_U)) +ZUCOEF = MAX(0.,MIN(ZUCOEF,1.)) + +! Interpolation coefficient for y (for V) +ZVCOEF = (TPFLYER%XY_CUR - XYHAT(IJ_V)) / (XYHAT(IJ_V+1) - XYHAT(IJ_V)) +ZVCOEF = MAX(0.,MIN(ZVCOEF,1.)) + +END SUBROUTINE FLYER_COMPUTE_INTERP_COEFF_HOR_STAGE1 +!---------------------------------------------------------------------------- +!---------------------------------------------------------------------------- +SUBROUTINE FLYER_COMPUTE_INTERP_COEFF_VER( ) +! Compute coefficent for vertical interpolations + +USE MODD_CST, ONLY: XCPD, XP00, XRD +USE MODD_TIME_n, ONLY: TDTCUR + +IMPLICIT NONE + +! Find indices surrounding the vertical box where the flyer is +SELECT TYPE ( TPFLYER ) + CLASS IS ( TAIRCRAFTDATA) + IF ( TPFLYER%LALTDEF ) THEN + ZFLYER_EXN = (TPFLYER%XP_CUR/XP00)**(XRD/XCPD) + IK00 = MAX ( COUNT (ZFLYER_EXN <= ZEXN(1,1,:)), 1) + IK01 = MAX ( COUNT (ZFLYER_EXN <= ZEXN(1,2,:)), 1) + IK10 = MAX ( COUNT (ZFLYER_EXN <= ZEXN(2,1,:)), 1) + IK11 = MAX ( COUNT (ZFLYER_EXN <= ZEXN(2,2,:)), 1) + ELSE + IK00 = MAX ( COUNT (TPFLYER%XZ_CUR >= ZZM(1,1,:)), 1) + IK01 = MAX ( COUNT (TPFLYER%XZ_CUR >= ZZM(1,2,:)), 1) + IK10 = MAX ( COUNT (TPFLYER%XZ_CUR >= ZZM(2,1,:)), 1) + IK11 = MAX ( COUNT (TPFLYER%XZ_CUR >= ZZM(2,2,:)), 1) END IF -! -! -! -!* 5.3 Vertical position -! ----------------- -! - IF (TPFLYER%TYPE=='ISODEN') THEN - IK00 = MAX ( COUNT (TPFLYER%RHO <= ZRHO(1,1,:)), 1) - IK01 = MAX ( COUNT (TPFLYER%RHO <= ZRHO(1,2,:)), 1) - IK10 = MAX ( COUNT (TPFLYER%RHO <= ZRHO(2,1,:)), 1) - IK11 = MAX ( COUNT (TPFLYER%RHO <= ZRHO(2,2,:)), 1) - ELSE IF (TPFLYER%TYPE=='RADIOS' .OR. TPFLYER%TYPE=='CVBALL') THEN - IK00 = MAX ( COUNT (TPFLYER%Z_CUR >= ZZM(1,1,:)), 1) - IK01 = MAX ( COUNT (TPFLYER%Z_CUR >= ZZM(1,2,:)), 1) - IK10 = MAX ( COUNT (TPFLYER%Z_CUR >= ZZM(2,1,:)), 1) - IK11 = MAX ( COUNT (TPFLYER%Z_CUR >= ZZM(2,2,:)), 1) - ELSE IF (TPFLYER%TYPE=='AIRCRA') THEN - IF (TPFLYER%ALTDEF) THEN - ZFLYER_EXN = (TPFLYER%P_CUR/XP00)**(XRD/XCPD) - IK00 = MAX ( COUNT (ZFLYER_EXN <= ZEXN(1,1,:)), 1) - IK01 = MAX ( COUNT (ZFLYER_EXN <= ZEXN(1,2,:)), 1) - IK10 = MAX ( COUNT (ZFLYER_EXN <= ZEXN(2,1,:)), 1) - IK11 = MAX ( COUNT (ZFLYER_EXN <= ZEXN(2,2,:)), 1) - ELSE - IK00 = MAX ( COUNT (TPFLYER%Z_CUR >= ZZM(1,1,:)), 1) - IK01 = MAX ( COUNT (TPFLYER%Z_CUR >= ZZM(1,2,:)), 1) - IK10 = MAX ( COUNT (TPFLYER%Z_CUR >= ZZM(2,1,:)), 1) - IK11 = MAX ( COUNT (TPFLYER%Z_CUR >= ZZM(2,2,:)), 1) - END IF + + CLASS IS ( TBALLOONDATA) + IF ( TPFLYER%CTYPE == 'ISODEN' ) THEN + IK00 = MAX ( COUNT (TPFLYER%XRHO <= ZRHO(1,1,:)), 1) + IK01 = MAX ( COUNT (TPFLYER%XRHO <= ZRHO(1,2,:)), 1) + IK10 = MAX ( COUNT (TPFLYER%XRHO <= ZRHO(2,1,:)), 1) + IK11 = MAX ( COUNT (TPFLYER%XRHO <= ZRHO(2,2,:)), 1) + ELSE IF ( TPFLYER%CTYPE == 'RADIOS' .OR. TPFLYER%CTYPE == 'CVBALL' ) THEN + IK00 = MAX ( COUNT (TPFLYER%XZ_CUR >= ZZM(1,1,:)), 1) + IK01 = MAX ( COUNT (TPFLYER%XZ_CUR >= ZZM(1,2,:)), 1) + IK10 = MAX ( COUNT (TPFLYER%XZ_CUR >= ZZM(2,1,:)), 1) + IK11 = MAX ( COUNT (TPFLYER%XZ_CUR >= ZZM(2,2,:)), 1) END IF - IK00 = MAX ( IK00, IKB ) - IK01 = MAX ( IK01, IKB ) - IK10 = MAX ( IK10, IKB ) - IK11 = MAX ( IK11, IKB ) -! -! -!* 5.4 Crash of the balloon -! -------------------- -! -! - IF (IK00 < IKB .OR. IK01 < IKB .OR. IK10 < IKB .OR. IK11 < IKB .OR. & - IK00 >= IKE .OR. IK01 >= IKE .OR. IK10 >= IKE .OR. IK11 >= IKE ) THEN - TPFLYER%CRASH=.TRUE. + +END SELECT + +! Do not allow crash on the ground: set position on the ground if too low +IF ( ANY( [ IK00, IK01, IK10, IK11 ] < IKB ) ) THEN + !Minimum altitude is on the ground at IKB (no crash if too low) + IK00 = MAX ( IK00, IKB ) + IK01 = MAX ( IK01, IKB ) + IK10 = MAX ( IK10, IKB ) + IK11 = MAX ( IK11, IKB ) + + CMNHMSG(1) = 'flyer ' // TRIM( TPFLYER%CTITLE ) // ' is near the ground' + WRITE( CMNHMSG(2), "( 'at ', I2, '/', I2, '/', I4, ' ', F18.12, 's' )" ) & + TDTCUR%NDAY, TDTCUR%NMONTH, TDTCUR%NYEAR, TDTCUR%XTIME + CALL PRINT_MSG( NVERB_INFO, 'GEN', 'FLYER_COMPUTE_INTERP_COEFF_VER', OLOCAL = .TRUE. ) +END IF + +! ! Check if the flyer crashed vertically (lower bound) +! IF (IK00 < IKB .OR. IK01 < IKB .OR. IK10 < IKB .OR. IK11 < IKB ) THEN +! TPFLYER%LCRASH = .TRUE. +! TPFLYER%NCRASH = NCRASH_OUT_LOW +! END IF + +! Check if the flyer crashed vertically (higher bound) +IF (IK00 >= IKE .OR. IK01 >= IKE .OR. IK10 >= IKE .OR. IK11 >= IKE ) THEN + TPFLYER%LCRASH = .TRUE. + TPFLYER%NCRASH = NCRASH_OUT_HIGH +END IF + +SELECT TYPE ( TPFLYER ) + CLASS IS ( TBALLOONDATA) + IF ( TPFLYER%LCRASH ) RETURN +END SELECT + +! Interpolation coefficients for the 4 suroundings verticals +SELECT TYPE ( TPFLYER ) + CLASS IS ( TAIRCRAFTDATA) + IF ( TPFLYER%LALTDEF ) THEN + ZZCOEF00 = (ZFLYER_EXN - ZEXN(1,1,IK00)) / ( ZEXN(1,1,IK00+1) - ZEXN(1,1,IK00) ) + ZZCOEF01 = (ZFLYER_EXN - ZEXN(1,2,IK01)) / ( ZEXN(1,2,IK01+1) - ZEXN(1,2,IK01) ) + ZZCOEF10 = (ZFLYER_EXN - ZEXN(2,1,IK10)) / ( ZEXN(2,1,IK10+1) - ZEXN(2,1,IK10) ) + ZZCOEF11 = (ZFLYER_EXN - ZEXN(2,2,IK11)) / ( ZEXN(2,2,IK11+1) - ZEXN(2,2,IK11) ) + TPFLYER%XZ_CUR = FLYER_INTERP(ZZM) + ELSE + ZZCOEF00 = (TPFLYER%XZ_CUR - ZZM(1,1,IK00)) / ( ZZM(1,1,IK00+1) - ZZM(1,1,IK00) ) + ZZCOEF01 = (TPFLYER%XZ_CUR - ZZM(1,2,IK01)) / ( ZZM(1,2,IK01+1) - ZZM(1,2,IK01) ) + ZZCOEF10 = (TPFLYER%XZ_CUR - ZZM(2,1,IK10)) / ( ZZM(2,1,IK10+1) - ZZM(2,1,IK10) ) + ZZCOEF11 = (TPFLYER%XZ_CUR - ZZM(2,2,IK11)) / ( ZZM(2,2,IK11+1) - ZZM(2,2,IK11) ) + TPFLYER%XP_CUR = FLYER_INTERP(PP) END IF -! - END IF -! -! - IF (TPFLYER%CRASH) THEN - TPFLYER%FLY = .FALSE. - IF (TPFLYER%TYPE=='AIRCRA' .AND. .NOT. GLAUNCH ) THEN - WRITE(ILUOUT,*) 'Aircraft ',TPFLYER%TITLE,' flew out of the domain the ', & - TDTCUR%nday,'/',TDTCUR%nmonth,'/', & - TDTCUR%nyear,' at ',TDTCUR%xtime,' sec.' - ELSE IF (TPFLYER%TYPE /= 'AIRCRA') THEN - WRITE(ILUOUT,*) 'Balloon ',TPFLYER%TITLE,' crashed the ', & - TDTCUR%nday,'/',TDTCUR%nmonth,'/', & - TDTCUR%nyear,' at ',TDTCUR%xtime,' sec.' + + CLASS IS ( TBALLOONDATA) + IF ( TPFLYER%CTYPE == 'ISODEN' ) THEN + ZZCOEF00 = (TPFLYER%XRHO - ZRHO(1,1,IK00)) / ( ZRHO(1,1,IK00+1) - ZRHO(1,1,IK00) ) + ZZCOEF01 = (TPFLYER%XRHO - ZRHO(1,2,IK01)) / ( ZRHO(1,2,IK01+1) - ZRHO(1,2,IK01) ) + ZZCOEF10 = (TPFLYER%XRHO - ZRHO(2,1,IK10)) / ( ZRHO(2,1,IK10+1) - ZRHO(2,1,IK10) ) + ZZCOEF11 = (TPFLYER%XRHO - ZRHO(2,2,IK11)) / ( ZRHO(2,2,IK11+1) - ZRHO(2,2,IK11) ) + TPFLYER%XZ_CUR = FLYER_INTERP(ZZM) + ELSE IF ( TPFLYER%CTYPE == 'RADIOS' .OR. TPFLYER%CTYPE == 'CVBALL' ) THEN + ZZCOEF00 = (TPFLYER%XZ_CUR - ZZM(1,1,IK00)) / ( ZZM(1,1,IK00+1) - ZZM(1,1,IK00) ) + ZZCOEF01 = (TPFLYER%XZ_CUR - ZZM(1,2,IK01)) / ( ZZM(1,2,IK01+1) - ZZM(1,2,IK01) ) + ZZCOEF10 = (TPFLYER%XZ_CUR - ZZM(2,1,IK10)) / ( ZZM(2,1,IK10+1) - ZZM(2,1,IK10) ) + ZZCOEF11 = (TPFLYER%XZ_CUR - ZZM(2,2,IK11)) / ( ZZM(2,2,IK11+1) - ZZM(2,2,IK11) ) END IF - ELSE - IF (TPFLYER%TYPE=='AIRCRA' .AND. .NOT. GLAUNCH .AND. ZTDIST > PTSTEP ) THEN - WRITE(ILUOUT,*) '-------------------------------------------------------------------' - WRITE(ILUOUT,*) 'Aircraft ',TPFLYER%TITLE,' flies in leg',TPFLYER%SEGCURN ,' the ', & - TDTCUR%nday,'/',TDTCUR%nmonth,'/', & - TDTCUR%nyear,' at ',NINT(TDTCUR%xtime),' sec.' - WRITE(ILUOUT,*) '-------------------------------------------------------------------' - ENDIF -! + +END SELECT + +END SUBROUTINE FLYER_COMPUTE_INTERP_COEFF_VER !---------------------------------------------------------------------------- - IF (ZTHIS_PROC>0.) THEN !---------------------------------------------------------------------------- -! -!* 6. INITIALIZATIONS FOR INTERPOLATIONS -! ---------------------------------- -! -!* 6.1 Interpolation coefficient for X -! ------------------------------- -! - ZXCOEF = (TPFLYER%X_CUR - ZXHATM(II)) / (ZXHATM(II+1) - ZXHATM(II)) - ZXCOEF = MAX (0.,MIN(ZXCOEF,1.)) -! -! -!* 6.2 Interpolation coefficient for y -! ------------------------------- -! - ZYCOEF = (TPFLYER%Y_CUR - ZYHATM(IJ)) / (ZYHATM(IJ+1) - ZYHATM(IJ)) - ZYCOEF = MAX (0.,MIN(ZYCOEF,1.)) -! -! -!* 6.3 Interpolation coefficients for the 4 suroundings verticals -! ---------------------------------------------------------- -! - IF (TPFLYER%TYPE=='ISODEN') THEN - ZZCOEF00 = (TPFLYER%RHO - ZRHO(1,1,IK00)) / ( ZRHO(1,1,IK00+1) - ZRHO(1,1,IK00) ) - ZZCOEF01 = (TPFLYER%RHO - ZRHO(1,2,IK01)) / ( ZRHO(1,2,IK01+1) - ZRHO(1,2,IK01) ) - ZZCOEF10 = (TPFLYER%RHO - ZRHO(2,1,IK10)) / ( ZRHO(2,1,IK10+1) - ZRHO(2,1,IK10) ) - ZZCOEF11 = (TPFLYER%RHO - ZRHO(2,2,IK11)) / ( ZRHO(2,2,IK11+1) - ZRHO(2,2,IK11) ) - TPFLYER%Z_CUR = FLYER_INTERP(ZZM) - ELSE IF (TPFLYER%TYPE=='RADIOS' .OR. TPFLYER%TYPE=='CVBALL') THEN - ZZCOEF00 = (TPFLYER%Z_CUR - ZZM(1,1,IK00)) / ( ZZM(1,1,IK00+1) - ZZM(1,1,IK00) ) - ZZCOEF01 = (TPFLYER%Z_CUR - ZZM(1,2,IK01)) / ( ZZM(1,2,IK01+1) - ZZM(1,2,IK01) ) - ZZCOEF10 = (TPFLYER%Z_CUR - ZZM(2,1,IK10)) / ( ZZM(2,1,IK10+1) - ZZM(2,1,IK10) ) - ZZCOEF11 = (TPFLYER%Z_CUR - ZZM(2,2,IK11)) / ( ZZM(2,2,IK11+1) - ZZM(2,2,IK11) ) - ELSE IF (TPFLYER%TYPE=='AIRCRA') THEN - IF (TPFLYER%ALTDEF) THEN - ZZCOEF00 = (ZFLYER_EXN - ZEXN(1,1,IK00)) / ( ZEXN(1,1,IK00+1) - ZEXN(1,1,IK00) ) - ZZCOEF01 = (ZFLYER_EXN - ZEXN(1,2,IK01)) / ( ZEXN(1,2,IK01+1) - ZEXN(1,2,IK01) ) - ZZCOEF10 = (ZFLYER_EXN - ZEXN(2,1,IK10)) / ( ZEXN(2,1,IK10+1) - ZEXN(2,1,IK10) ) - ZZCOEF11 = (ZFLYER_EXN - ZEXN(2,2,IK11)) / ( ZEXN(2,2,IK11+1) - ZEXN(2,2,IK11) ) - TPFLYER%Z_CUR = FLYER_INTERP(ZZM) - ELSE - ZZCOEF00 = (TPFLYER%Z_CUR - ZZM(1,1,IK00)) / ( ZZM(1,1,IK00+1) - ZZM(1,1,IK00) ) - ZZCOEF01 = (TPFLYER%Z_CUR - ZZM(1,2,IK01)) / ( ZZM(1,2,IK01+1) - ZZM(1,2,IK01) ) - ZZCOEF10 = (TPFLYER%Z_CUR - ZZM(2,1,IK10)) / ( ZZM(2,1,IK10+1) - ZZM(2,1,IK10) ) - ZZCOEF11 = (TPFLYER%Z_CUR - ZZM(2,2,IK11)) / ( ZZM(2,2,IK11+1) - ZZM(2,2,IK11) ) - TPFLYER%P_CUR = FLYER_INTERP(PP) - END IF - END IF -! +SUBROUTINE FLYER_COMPUTE_INTERP_COEFF_HOR_STAGE2( ) +! Compute coefficents for horizontal interpolations (2nd stage) +! This stage must be done after FLYER_COMPUTE_INTERP_COEFF_VER because we should need XZ_CUR computed in it + +IMPLICIT NONE + +! Interpolation coefficients for the 4 suroundings verticals (for U) +IU00 = MAX( COUNT (TPFLYER%XZ_CUR >= ZZU(1,1,:)), 1) +IU01 = MAX( COUNT (TPFLYER%XZ_CUR >= ZZU(1,2,:)), 1) +IU10 = MAX( COUNT (TPFLYER%XZ_CUR >= ZZU(2,1,:)), 1) +IU11 = MAX( COUNT (TPFLYER%XZ_CUR >= ZZU(2,2,:)), 1) +ZUCOEF00 = (TPFLYER%XZ_CUR - ZZU(1,1,IU00)) / ( ZZU(1,1,IU00+1) - ZZU(1,1,IU00) ) +ZUCOEF01 = (TPFLYER%XZ_CUR - ZZU(1,2,IU01)) / ( ZZU(1,2,IU01+1) - ZZU(1,2,IU01) ) +ZUCOEF10 = (TPFLYER%XZ_CUR - ZZU(2,1,IU10)) / ( ZZU(2,1,IU10+1) - ZZU(2,1,IU10) ) +ZUCOEF11 = (TPFLYER%XZ_CUR - ZZU(2,2,IU11)) / ( ZZU(2,2,IU11+1) - ZZU(2,2,IU11) ) + +! Interpolation coefficients for the 4 suroundings verticals (for V) +IV00 = MAX ( COUNT (TPFLYER%XZ_CUR >= ZZV(1,1,:)), 1) +IV01 = MAX ( COUNT (TPFLYER%XZ_CUR >= ZZV(1,2,:)), 1) +IV10 = MAX ( COUNT (TPFLYER%XZ_CUR >= ZZV(2,1,:)), 1) +IV11 = MAX ( COUNT (TPFLYER%XZ_CUR >= ZZV(2,2,:)), 1) +ZVCOEF00 = (TPFLYER%XZ_CUR - ZZV(1,1,IV00)) / ( ZZV(1,1,IV00+1) - ZZV(1,1,IV00) ) +ZVCOEF01 = (TPFLYER%XZ_CUR - ZZV(1,2,IV01)) / ( ZZV(1,2,IV01+1) - ZZV(1,2,IV01) ) +ZVCOEF10 = (TPFLYER%XZ_CUR - ZZV(2,1,IV10)) / ( ZZV(2,1,IV10+1) - ZZV(2,1,IV10) ) +ZVCOEF11 = (TPFLYER%XZ_CUR - ZZV(2,2,IV11)) / ( ZZV(2,2,IV11+1) - ZZV(2,2,IV11) ) + +END SUBROUTINE FLYER_COMPUTE_INTERP_COEFF_HOR_STAGE2 !---------------------------------------------------------------------------- +!---------------------------------------------------------------------------- +SUBROUTINE FLYER_RECORD_DATA( ) + +USE MODD_CST, ONLY: XCPD, XLAM_CRAD, XLIGHTSPEED, XP00, XPI, XRD, XRHOLW, XTT +USE MODD_DIAG_IN_RUN, ONLY: LDIAG_IN_RUN, XCURRENT_TKE_DISS +USE MODD_GRID, ONLY: XBETA, XLON0, XRPK +USE MODD_NSV, ONLY: NSV_LIMA_NC, NSV_LIMA_NR, NSV_LIMA_NI +USE MODD_PARAMETERS, ONLY: JPVEXT +USE MODD_PARAM_ICE, ONLY: LSNOW_T_I => LSNOW_T +USE MODD_PARAM_LIMA, ONLY: LSNOW_T_L => LSNOW_T, & + XALPHAR_L => XALPHAR, XNUR_L => XNUR, XALPHAS_L => XALPHAS, XNUS_L => XNUS, & + XALPHAG_L => XALPHAG, XNUG_L => XNUG, XALPHAI_L => XALPHAI, XNUI_L => XNUI, & + XRTMIN_L => XRTMIN, XALPHAC_L => XALPHAC, XNUC_L => XNUC +USE MODD_PARAM_LIMA_COLD, ONLY: XAI_L => XAI, XBI_L => XBI, XLBEXS_L => XLBEXS,XLBS_L => XLBS,XCCS_L => XCCS, & + XAS_L => XAS, XBS_L => XBS, XCXS_L => XCXS, XLBDAS_MAX, XLBDAS_MIN, XNS_L => XNS +USE MODD_PARAM_LIMA_MIXED, ONLY: XLBEXG_L => XLBEXG, XLBG_L => XLBG, XCCG_L => XCCG, XAG_L => XAG, XBG_L => XBG, XCXG_L => XCXG +USE MODD_PARAM_LIMA_WARM, ONLY: XAC_L => XAC, XAR_L => XAR, XBC_L => XBC, XBR_L => XBR +USE MODD_PARAM_n, ONLY: CCLOUD, CSURF +USE MODD_RAIN_ICE_DESCR, ONLY: XALPHAR_I => XALPHAR, XNUR_I => XNUR, XLBEXR_I => XLBEXR, & + XLBR_I => XLBR, XCCR_I => XCCR, XBR_I => XBR, XAR_I => XAR, & + XALPHAC_I => XALPHAC, XNUC_I => XNUC, XBC_I => XBC, XAC_I => XAC, & + XALPHAC2_I => XALPHAC2, XNUC2_I => XNUC2, & + XALPHAS_I => XALPHAS, XNUS_I => XNUS, XLBEXS_I => XLBEXS, & + XLBS_I => XLBS, XCCS_I => XCCS, XAS_I => XAS, XBS_I => XBS, XCXS_I => XCXS, & + XALPHAG_I => XALPHAG, XNUG_I => XNUG, XLBEXG_I => XLBEXG, & + XLBG_I => XLBG, XCCG_I => XCCG, XAG_I => XAG, XBG_I => XBG, XCXG_I => XCXG, & + XALPHAI_I => XALPHAI, XNUI_I => XNUI, XLBEXI_I => XLBEXI, & + XLBI_I => XLBI, XAI_I => XAI, XBI_I => XBI, & + XNS_I => XNS, XRTMIN_I => XRTMIN, XCONC_LAND, XCONC_SEA + +USE MODE_FGAU, ONLY: GAULAG +USE MODE_FSCATTER, ONLY: BHMIE, MOMG, MG, QEPSI, QEPSW +USE MODE_GRIDPROJ, ONLY: SM_LATLON + +USE MODI_GAMMA, ONLY: GAMMA + +IMPLICIT NONE + +INTEGER, PARAMETER :: JPTS_GAULAG = 7 ! number of points for Gauss-Laguerre quadrature + +INTEGER :: JK ! loop index +INTEGER :: JLOOP ! loop counter +REAL, DIMENSION(SIZE(PR,3)) :: ZTEMPZ! vertical profile of temperature +REAL, DIMENSION(SIZE(PR,3)) :: ZRHODREFZ ! vertical profile of dry air density of the reference state +REAL, DIMENSION(SIZE(PR,3)) :: ZCIT ! pristine ice concentration +REAL, DIMENSION(SIZE(PR,3)) :: ZCCI,ZCCR,ZCCC ! ICE,RAIN CLOUD concentration (LIMA) +REAL, DIMENSION(SIZE(PR,1),SIZE(PR,2),SIZE(PR,3)) :: ZR +REAL, DIMENSION(SIZE(PR,3),SIZE(PR,4)+1) :: ZRZ ! vertical profile of hydrometeor mixing ratios +REAL :: ZA, ZB, ZCC, ZCX, ZALPHA, ZNS, ZNU, ZLB, ZLBEX, ZRHOHYD ! generic microphysical parameters +INTEGER :: JJ ! loop counter for quadrature +COMPLEX :: QMW,QMI,QM,QEPSIW,QEPSWI ! dielectric parameter +REAL :: ZAETOT,ZAETMP,ZREFLOC,ZQSCA,ZQBACK,ZQEXT ! temporary scattering parameters +REAL,DIMENSION(:),ALLOCATABLE :: ZAELOC,ZZMZ ! temporary arrays +REAL :: ZLBDA ! slope distribution parameter +REAL :: ZDELTA_EQUIV ! mass-equivalent Gauss-Laguerre point +REAL :: ZFW ! liquid fraction +REAL :: ZFPW ! weight for mixed-phase reflectivity +REAL :: ZN ! number concentration +REAL,DIMENSION(:),ALLOCATABLE :: ZX,ZW ! Gauss-Laguerre points and weights +REAL,DIMENSION(:),ALLOCATABLE :: ZRTMIN ! local values for XRTMIN +LOGICAL :: GCALC +REAL :: ZGAM ! rotation between meso-nh base and spherical lat-lon base. +REAL :: ZU_BAL ! horizontal wind speed at balloon location (along x) +REAL :: ZV_BAL ! horizontal wind speed at balloon location (along y) + +TPFLYER%NMODELHIST(ISTORE) = TPFLYER%NMODEL + +TPFLYER%XX(ISTORE) = TPFLYER%XX_CUR +TPFLYER%XY(ISTORE) = TPFLYER%XY_CUR +TPFLYER%XZ(ISTORE) = TPFLYER%XZ_CUR ! -!* 7. INITIALIZATIONS FOR INTERPOLATIONS OF U AND V -! --------------------------------------------- -! -!* 7.1 Interpolation coefficient for X (for U) -! ------------------------------- -! - ZUCOEF = (TPFLYER%X_CUR - PXHAT(IU)) / (PXHAT(IU+1) - PXHAT(IU)) - ZUCOEF = MAX(0.,MIN(ZUCOEF,1.)) -! -! -!* 7.2 Interpolation coefficient for y (for V) -! ------------------------------- -! - ZVCOEF = (TPFLYER%Y_CUR - PYHAT(IV)) / (PYHAT(IV+1) - PYHAT(IV)) - ZVCOEF = MAX(0.,MIN(ZVCOEF,1.)) -! -! -!* 7.3 Interpolation coefficients for the 4 suroundings verticals (for U) -! ---------------------------------------------------------- -! - IU00 = MAX( COUNT (TPFLYER%Z_CUR >= ZZU(1,1,:)), 1) - IU01 = MAX( COUNT (TPFLYER%Z_CUR >= ZZU(1,2,:)), 1) - IU10 = MAX( COUNT (TPFLYER%Z_CUR >= ZZU(2,1,:)), 1) - IU11 = MAX( COUNT (TPFLYER%Z_CUR >= ZZU(2,2,:)), 1) - ZUCOEF00 = (TPFLYER%Z_CUR - ZZU(1,1,IU00)) / ( ZZU(1,1,IU00+1) - ZZU(1,1,IU00) ) - ZUCOEF01 = (TPFLYER%Z_CUR - ZZU(1,2,IU01)) / ( ZZU(1,2,IU01+1) - ZZU(1,2,IU01) ) - ZUCOEF10 = (TPFLYER%Z_CUR - ZZU(2,1,IU10)) / ( ZZU(2,1,IU10+1) - ZZU(2,1,IU10) ) - ZUCOEF11 = (TPFLYER%Z_CUR - ZZU(2,2,IU11)) / ( ZZU(2,2,IU11+1) - ZZU(2,2,IU11) ) +CALL SM_LATLON(PLATOR,PLONOR, & + TPFLYER%XX_CUR, TPFLYER%XY_CUR, & + TPFLYER%XLAT(ISTORE), TPFLYER%XLON(ISTORE) ) ! +ZU_BAL = FLYER_INTERP_U(PU) +ZV_BAL = FLYER_INTERP_V(PV) +ZGAM = (XRPK * (TPFLYER%XLON(ISTORE) - XLON0) - XBETA)*(XPI/180.) +TPFLYER%XZON (ISTORE) = ZU_BAL * COS(ZGAM) + ZV_BAL * SIN(ZGAM) +TPFLYER%XMER (ISTORE) = - ZU_BAL * SIN(ZGAM) + ZV_BAL * COS(ZGAM) ! -!* 7.4 Interpolation coefficients for the 4 suroundings verticals (for V) -! ---------------------------------------------------------- +TPFLYER%XW (ISTORE) = FLYER_INTERP(ZWM) +TPFLYER%XTH (ISTORE) = FLYER_INTERP(PTH) ! +ZFLYER_EXN = FLYER_INTERP(ZEXN) +TPFLYER%XP (ISTORE) = XP00 * ZFLYER_EXN**(XCPD/XRD) - IV00 = MAX ( COUNT (TPFLYER%Z_CUR >= ZZV(1,1,:)), 1) - IV01 = MAX ( COUNT (TPFLYER%Z_CUR >= ZZV(1,2,:)), 1) - IV10 = MAX ( COUNT (TPFLYER%Z_CUR >= ZZV(2,1,:)), 1) - IV11 = MAX ( COUNT (TPFLYER%Z_CUR >= ZZV(2,2,:)), 1) - ZVCOEF00 = (TPFLYER%Z_CUR - ZZV(1,1,IV00)) / ( ZZV(1,1,IV00+1) - ZZV(1,1,IV00) ) - ZVCOEF01 = (TPFLYER%Z_CUR - ZZV(1,2,IV01)) / ( ZZV(1,2,IV01+1) - ZZV(1,2,IV01) ) - ZVCOEF10 = (TPFLYER%Z_CUR - ZZV(2,1,IV10)) / ( ZZV(2,1,IV10+1) - ZZV(2,1,IV10) ) - ZVCOEF11 = (TPFLYER%Z_CUR - ZZV(2,2,IV11)) / ( ZZV(2,2,IV11+1) - ZZV(2,2,IV11) ) -! -!---------------------------------------------------------------------------- -! -!* 8. DATA RECORDING -! -------------- -! - IF ( GSTORE ) THEN - TPFLYER%X (IN) = TPFLYER%X_CUR - TPFLYER%Y (IN) = TPFLYER%Y_CUR - TPFLYER%Z (IN) = TPFLYER%Z_CUR - ! - CALL SM_LATLON(PLATOR,PLONOR, & - TPFLYER%X_CUR, TPFLYER%Y_CUR, & - TPFLYER%YLAT(IN), TPFLYER%XLON(IN) ) - ! - ZU_BAL = FLYER_INTERP_U(PU) - ZV_BAL = FLYER_INTERP_V(PV) - ZGAM = (XRPK * (TPFLYER%XLON(IN) - XLON0) - XBETA)*(XPI/180.) - TPFLYER%ZON (IN) = ZU_BAL * COS(ZGAM) + ZV_BAL * SIN(ZGAM) - TPFLYER%MER (IN) = - ZU_BAL * SIN(ZGAM) + ZV_BAL * COS(ZGAM) - ! - TPFLYER%W (IN) = FLYER_INTERP(ZWM) - TPFLYER%TH (IN) = FLYER_INTERP(PTH) - ! - ZFLYER_EXN = FLYER_INTERP(ZEXN) - TPFLYER%P (IN) = XP00 * ZFLYER_EXN**(XCPD/XRD) - ! - DO JLOOP=1,SIZE(PR,4) - TPFLYER%R (IN,JLOOP) = FLYER_INTERP(PR(:,:,:,JLOOP)) - IF (JLOOP>=2) ZR(:,:,:) = ZR(:,:,:) + PR(:,:,:,JLOOP) - END DO - DO JLOOP=1,SIZE(PSV,4) - TPFLYER%SV (IN,JLOOP) = FLYER_INTERP(PSV(:,:,:,JLOOP)) - END DO - TPFLYER%RTZ (IN,:) = FLYER_INTERPZ(ZR(:,:,:)) - DO JLOOP=1,SIZE(PR,4) - TPFLYER%RZ (IN,:,JLOOP) = FLYER_INTERPZ(PR(:,:,:,JLOOP)) - END DO - ! Fin Modifs ON - TPFLYER%FFZ (IN,:) = FLYER_INTERPZ(SQRT(PU**2+PV**2)) - IF (CCLOUD=="LIMA") THEN - TPFLYER%CIZ (IN,:) = FLYER_INTERPZ(PSV(:,:,:,NSV_LIMA_NI)) - TPFLYER%CCZ (IN,:) = FLYER_INTERPZ(PSV(:,:,:,NSV_LIMA_NC)) - TPFLYER%CRZ (IN,:) = FLYER_INTERPZ(PSV(:,:,:,NSV_LIMA_NR)) - ELSE IF ( CCLOUD=="ICE3" .OR. CCLOUD=="ICE4" ) THEN - TPFLYER%CIZ (IN,:) = FLYER_INTERPZ(PCIT(:,:,:)) - ENDIF - ! initialization CRARE and CRARE_ATT + LWC and IWC - TPFLYER%CRARE(IN,:) = 0. - TPFLYER%CRARE_ATT(IN,:) = 0. - TPFLYER%LWCZ (IN,:) = 0. - TPFLYER%IWCZ (IN,:) = 0. - IF (CCLOUD=="LIMA" .OR. CCLOUD=="ICE3" ) THEN ! only for ICE3 and LIMA - TPFLYER%LWCZ (IN,:) = FLYER_INTERPZ((PR(:,:,:,2)+PR(:,:,:,3))*PRHODREF(:,:,:)) - TPFLYER%IWCZ (IN,:) = FLYER_INTERPZ((PR(:,:,:,4)+PR(:,:,:,5)+PR(:,:,:,6))*PRHODREF(:,:,:)) - ZTEMPZ(:)=FLYER_INTERPZ(PTH(II:II+1,IJ:IJ+1,:) * ZEXN(:,:,:)) - ZRHODREFZ(:)=FLYER_INTERPZ(PRHODREF(:,:,:)) - IF (CCLOUD=="LIMA") THEN - ZCCI(:)=FLYER_INTERPZ(PSV(:,:,:,NSV_LIMA_NI)) - ZCCR(:)=FLYER_INTERPZ(PSV(:,:,:,NSV_LIMA_NR)) - ZCCC(:)=FLYER_INTERPZ(PSV(:,:,:,NSV_LIMA_NC)) - ELSE - ZCIT(:)=FLYER_INTERPZ(PCIT(:,:,:)) - ENDIF - DO JLOOP=3,6 - ZRZ(:,JLOOP)=FLYER_INTERPZ(PR(:,:,:,JLOOP)) - END DO - if ( csurf == 'EXTE' ) then - DO JK=1,IKU - ZRZ(JK,2)=FLYER_INTERP_2D(PR(:,:,JK,2)*PSEA(:,:)) ! becomes cloud mixing ratio over sea - ZRZ(JK,7)=FLYER_INTERP_2D(PR(:,:,JK,2)*(1.-PSEA(:,:))) ! becomes cloud mixing ratio over land - END DO - else - !if csurf/='EXTE', psea is not allocated - DO JK=1,IKU - ZRZ(JK,2)=FLYER_INTERP_2D(PR(:,:,JK,2)) - ZRZ(JK,7) = 0. - END DO - end if - ALLOCATE(ZAELOC(IKU)) - ! - ZAELOC(:)=0. - ! initialization of quadrature points and weights - ALLOCATE(ZX(JPTS_GAULAG),ZW(JPTS_GAULAG)) - CALL GAULAG(JPTS_GAULAG,ZX,ZW) ! for integration over diameters - ! initialize minimum values - ALLOCATE(ZRTMIN(SIZE(PR,4)+1)) - IF (CCLOUD == 'LIMA') THEN - ZRTMIN(2)=XRTMIN_L(2) ! cloud water over sea - ZRTMIN(3)=XRTMIN_L(3) - ZRTMIN(4)=XRTMIN_L(4) - ZRTMIN(5)=1E-10 - ZRTMIN(6)=XRTMIN_L(6) - ZRTMIN(7)=XRTMIN_L(2) ! cloud water over land - ELSE - ZRTMIN(2)=XRTMIN_I(2) ! cloud water over sea - ZRTMIN(3)=XRTMIN_I(3) - ZRTMIN(4)=XRTMIN_I(4) - ZRTMIN(5)=1E-10 - ZRTMIN(6)=XRTMIN_I(6) - ZRTMIN(7)=XRTMIN_I(2) ! cloud water over land - ENDIF - ! compute cloud radar reflectivity from vertical profiles of temperature and mixing ratios - DO JK=1,IKU - QMW=SQRT(QEPSW(ZTEMPZ(JK),XLIGHTSPEED/XLAM_CRAD)) - QMI=SQRT(QEPSI(ZTEMPZ(JK),XLIGHTSPEED/XLAM_CRAD)) - DO JLOOP=2,7 +ZR(:,:,:) = 0. +DO JLOOP=1,SIZE(PR,4) + TPFLYER%XR (ISTORE,JLOOP) = FLYER_INTERP(PR(:,:,:,JLOOP)) + IF (JLOOP>=2) ZR(:,:,:) = ZR(:,:,:) + PR(:,:,:,JLOOP) +END DO +DO JLOOP=1,SIZE(PSV,4) + TPFLYER%XSV (ISTORE,JLOOP) = FLYER_INTERP(PSV(:,:,:,JLOOP)) +END DO +TPFLYER%XRTZ (ISTORE,:) = FLYER_INTERPZ(ZR(:,:,:)) +DO JLOOP=1,SIZE(PR,4) + TPFLYER%XRZ (ISTORE,:,JLOOP) = FLYER_INTERPZ(PR(:,:,:,JLOOP)) +END DO + +TPFLYER%XFFZ (ISTORE,:) = FLYER_INTERPZ(SQRT(PU**2+PV**2)) + +IF (CCLOUD=="LIMA") THEN + TPFLYER%XCIZ (ISTORE,:) = FLYER_INTERPZ(PSV(:,:,:,NSV_LIMA_NI)) + TPFLYER%XCCZ (ISTORE,:) = FLYER_INTERPZ(PSV(:,:,:,NSV_LIMA_NC)) + TPFLYER%XCRZ (ISTORE,:) = FLYER_INTERPZ(PSV(:,:,:,NSV_LIMA_NR)) +ELSE IF ( CCLOUD=="ICE3" .OR. CCLOUD=="ICE4" ) THEN + TPFLYER%XCIZ (ISTORE,:) = FLYER_INTERPZ(PCIT(:,:,:)) +END IF +! initialization CRARE and CRARE_ATT + LWC and IWC +TPFLYER%XCRARE(ISTORE,:) = 0. +TPFLYER%XCRARE_ATT(ISTORE,:) = 0. +TPFLYER%XLWCZ (ISTORE,:) = 0. +TPFLYER%XIWCZ (ISTORE,:) = 0. +IF (CCLOUD=="LIMA" .OR. CCLOUD=="ICE3" ) THEN ! only for ICE3 and LIMA + TPFLYER%XLWCZ (ISTORE,:) = FLYER_INTERPZ((PR(:,:,:,2)+PR(:,:,:,3))*PRHODREF(:,:,:)) + TPFLYER%XIWCZ (ISTORE,:) = FLYER_INTERPZ((PR(:,:,:,4)+PR(:,:,:,5)+PR(:,:,:,6))*PRHODREF(:,:,:)) + ZTEMPZ(:)=FLYER_INTERPZ(PTH(II_M:II_M+1,IJ_M:IJ_M+1,:) * ZEXN(:,:,:)) + ZRHODREFZ(:)=FLYER_INTERPZ(PRHODREF(:,:,:)) + IF (CCLOUD=="LIMA") THEN + ZCCI(:)=FLYER_INTERPZ(PSV(:,:,:,NSV_LIMA_NI)) + ZCCR(:)=FLYER_INTERPZ(PSV(:,:,:,NSV_LIMA_NR)) + ZCCC(:)=FLYER_INTERPZ(PSV(:,:,:,NSV_LIMA_NC)) + ELSE + ZCIT(:)=FLYER_INTERPZ(PCIT(:,:,:)) + ENDIF + DO JLOOP=3,6 + ZRZ(:,JLOOP)=FLYER_INTERPZ(PR(:,:,:,JLOOP)) + END DO + if ( csurf == 'EXTE' ) then + DO JK=1,IKU + ZRZ(JK,2)=FLYER_INTERP_2D(PR(:,:,JK,2)*PSEA(:,:)) ! becomes cloud mixing ratio over sea + ZRZ(JK,7)=FLYER_INTERP_2D(PR(:,:,JK,2)*(1.-PSEA(:,:))) ! becomes cloud mixing ratio over land + END DO + else + !if csurf/='EXTE', psea is not allocated + DO JK=1,IKU + ZRZ(JK,2)=FLYER_INTERP_2D(PR(:,:,JK,2)) + ZRZ(JK,7) = 0. + END DO + end if + ALLOCATE(ZAELOC(IKU)) + ! + ZAELOC(:)=0. + ! initialization of quadrature points and weights + ALLOCATE(ZX(JPTS_GAULAG),ZW(JPTS_GAULAG)) + CALL GAULAG(JPTS_GAULAG,ZX,ZW) ! for integration over diameters + ! initialize minimum values + ALLOCATE(ZRTMIN(SIZE(PR,4)+1)) + IF (CCLOUD == 'LIMA') THEN + ZRTMIN(2)=XRTMIN_L(2) ! cloud water over sea + ZRTMIN(3)=XRTMIN_L(3) + ZRTMIN(4)=XRTMIN_L(4) + ZRTMIN(5)=1E-10 + ZRTMIN(6)=XRTMIN_L(6) + ZRTMIN(7)=XRTMIN_L(2) ! cloud water over land + ELSE + ZRTMIN(2)=XRTMIN_I(2) ! cloud water over sea + ZRTMIN(3)=XRTMIN_I(3) + ZRTMIN(4)=XRTMIN_I(4) + ZRTMIN(5)=1E-10 + ZRTMIN(6)=XRTMIN_I(6) + ZRTMIN(7)=XRTMIN_I(2) ! cloud water over land + ENDIF + ! compute cloud radar reflectivity from vertical profiles of temperature and mixing ratios +#if 0 + DO JK=1,IKU + QMW=SQRT(QEPSW(ZTEMPZ(JK),XLIGHTSPEED/XLAM_CRAD)) + QMI=SQRT(QEPSI(ZTEMPZ(JK),XLIGHTSPEED/XLAM_CRAD)) + DO JLOOP=2,7 + IF (CCLOUD == 'LIMA') THEN + GCALC=(ZRZ(JK,JLOOP)>ZRTMIN(JLOOP).AND.(JLOOP.NE.4.OR.ZCCI(JK)>0.).AND.& + (JLOOP.NE.3.OR.ZCCR(JK)>0.).AND.((JLOOP.NE.2.AND. JLOOP.NE.7).OR.ZCCC(JK)>0.)) + ELSE + GCALC=(ZRZ(JK,JLOOP)>ZRTMIN(JLOOP).AND.(JLOOP.NE.4.OR.ZCIT(JK)>0.)) + ENDIF + IF(GCALC) THEN + SELECT CASE(JLOOP) + CASE(2) ! cloud water over sea IF (CCLOUD == 'LIMA') THEN - GCALC=(ZRZ(JK,JLOOP)>ZRTMIN(JLOOP).AND.(JLOOP.NE.4.OR.ZCCI(JK)>0.).AND.& - (JLOOP.NE.3.OR.ZCCR(JK)>0.).AND.((JLOOP.NE.2.AND. JLOOP.NE.7).OR.ZCCC(JK)>0.)) + ZA=XAC_L + ZB=XBC_L + ZCC=ZCCC(JK)*ZRHODREFZ(JK) + ZCX=0. + ZALPHA=XALPHAC_L + ZNU=XNUC_L + ZLBEX=1.0/(ZCX-ZB) + ZLB=( ZA*ZCC*MOMG(ZALPHA,ZNU,ZB) )**(-ZLBEX) ELSE - GCALC=(ZRZ(JK,JLOOP)>ZRTMIN(JLOOP).AND.(JLOOP.NE.4.OR.ZCIT(JK)>0.)) + ZA=XAC_I + ZB=XBC_I + ZCC=XCONC_SEA + ZCX=0. + ZALPHA=XALPHAC2_I + ZNU=XNUC2_I + ZLBEX=1.0/(ZCX-ZB) + ZLB=( ZA*ZCC*MOMG(ZALPHA,ZNU,ZB) )**(-ZLBEX) ENDIF - IF(GCALC) THEN - SELECT CASE(JLOOP) - CASE(2) ! cloud water over sea - IF (CCLOUD == 'LIMA') THEN - ZA=XAC_L - ZB=XBC_L - ZCC=ZCCC(JK)*ZRHODREFZ(JK) - ZCX=0. - ZALPHA=XALPHAC_L - ZNU=XNUC_L - ZLBEX=1.0/(ZCX-ZB) - ZLB=( ZA*ZCC*MOMG(ZALPHA,ZNU,ZB) )**(-ZLBEX) - ELSE - ZA=XAC_I - ZB=XBC_I - ZCC=XCONC_SEA - ZCX=0. - ZALPHA=XALPHAC2_I - ZNU=XNUC2_I - ZLBEX=1.0/(ZCX-ZB) - ZLB=( ZA*ZCC*MOMG(ZALPHA,ZNU,ZB) )**(-ZLBEX) - ENDIF - CASE(3) ! rain water - IF (CCLOUD == 'LIMA') THEN - ZA=XAR_L - ZB=XBR_L - ZCC=ZCCR(JK)*ZRHODREFZ(JK) - ZCX=0. - ZALPHA=XALPHAR_L - ZNU=XNUR_L - ZLBEX=1.0/(ZCX-ZB) - ZLB=( ZA*ZCC*MOMG(ZALPHA,ZNU,ZB) )**(-ZLBEX) - ELSE - ZA=XAR_I - ZB=XBR_I - ZCC=XCCR_I - ZCX=-1. - ZALPHA=XALPHAR_I - ZNU=XNUR_I - ZLB=XLBR_I - ZLBEX=XLBEXR_I - ENDIF - CASE(4) ! pristine ice - IF (CCLOUD == 'LIMA') THEN - ZA=XAI_L - ZB=XBI_L - ZCC=ZCCI(JK)*ZRHODREFZ(JK) - ZCX=0. - ZALPHA=XALPHAI_L - ZNU=XNUI_L - ZLBEX=1.0/(ZCX-ZB) - ZLB=( ZA*ZCC*MOMG(ZALPHA,ZNU,ZB) )**(-ZLBEX) ! because ZCC not included in XLBI - ZFW=0 - ELSE - ZA=XAI_I - ZB=XBI_I - ZCC=ZCIT(JK) - ZCX=0. - ZALPHA=XALPHAI_I - ZNU=XNUI_I - ZLBEX=XLBEXI_I - ZLB=XLBI_I*ZCC**(-ZLBEX) ! because ZCC not included in XLBI - ZFW=0 - ENDIF - CASE(5) ! snow - IF (CCLOUD == 'LIMA') THEN - ZA=XAS_L - ZB=XBS_L - ZCC=XCCS_L - ZCX=XCXS_L - ZALPHA=XALPHAS_L - ZNU=XNUS_L - ZNS=XNS_L - ZLB=XLBS_L - ZLBEX=XLBEXS_L - ZFW=0 - ELSE - ZA=XAS_I - ZB=XBS_I - ZCC=XCCS_I - ZCX=XCXS_I - ZALPHA=XALPHAS_I - ZNU=XNUS_I - ZNS=XNS_I - ZLB=XLBS_I - ZLBEX=XLBEXS_I - ZFW=0 - ENDIF - CASE(6) ! graupel - !If temperature between -10 and 10°C and Mr and Mg over min threshold: melting graupel - ! with liquid water fraction Fw=Mr/(Mr+Mg) else dry graupel (Fw=0) - IF( ZTEMPZ(JK) > XTT-10 .AND. ZTEMPZ(JK) < XTT+10 & - .AND. ZRZ(JK,3) > ZRTMIN(3) ) THEN - ZFW=ZRZ(JK,3)/(ZRZ(JK,3)+ZRZ(JK,JLOOP)) - ELSE - ZFW=0 - ENDIF - IF (CCLOUD == 'LIMA') THEN - ZA=XAG_L - ZB=XBG_L - ZCC=XCCG_L - ZCX=XCXG_L - ZALPHA=XALPHAG_L - ZNU=XNUG_L - ZLB=XLBG_L - ZLBEX=XLBEXG_L - ELSE - ZA=XAG_I - ZB=XBG_I - ZCC=XCCG_I - ZCX=XCXG_I - ZALPHA=XALPHAG_I - ZNU=XNUG_I - ZLB=XLBG_I - ZLBEX=XLBEXG_I - ENDIF - CASE(7) ! cloud water over land - IF (CCLOUD == 'LIMA') THEN - ZA=XAC_L - ZB=XBC_L - ZCC=ZCCC(JK)*ZRHODREFZ(JK) - ZCX=0. - ZALPHA=XALPHAC_L - ZNU=XNUC_L - ZLBEX=1.0/(ZCX-ZB) - ZLB=( ZA*ZCC*MOMG(ZALPHA,ZNU,ZB) )**(-ZLBEX) - ELSE - ZA=XAC_I - ZB=XBC_I - ZCC=XCONC_LAND - ZCX=0. - ZALPHA=XALPHAC_I - ZNU=XNUC_I - ZLBEX=1.0/(ZCX-ZB) - ZLB=( ZA*ZCC*MOMG(ZALPHA,ZNU,ZB) )**(-ZLBEX) - ENDIF - END SELECT - IF (JLOOP.EQ.5 .AND. ( (CCLOUD=='LIMA'.AND.LSNOW_T_L).OR. & - (CCLOUD=='ICE3'.AND.LSNOW_T_I) ) ) THEN - IF (ZTEMPZ(JK)>-10.) THEN - ZLBDA = MAX(MIN(XLBDAS_MAX, 10**(14.554-0.0423*(ZTEMPZ(JK)+273.15))),XLBDAS_MIN) - ELSE - ZLBDA = MAX(MIN(XLBDAS_MAX, 10**(6.226-0.0106*(ZTEMPZ(JK)+273.15))),XLBDAS_MIN) - END IF - ZN=ZNS*ZRHODREFZ(JK)*ZRZ(JK,JLOOP)*ZLBDA**ZB - ELSE - ZLBDA=ZLB*(ZRHODREFZ(JK)*ZRZ(JK,JLOOP))**ZLBEX - ZN=ZCC*ZLBDA**ZCX - END IF - ZREFLOC=0. - ZAETMP=0. - DO JJ=1,JPTS_GAULAG ! Gauss-Laguerre quadrature - ZDELTA_EQUIV=ZX(JJ)**(1./ZALPHA)/ZLBDA - SELECT CASE(JLOOP) - CASE(2,3,7) - QM=QMW - CASE(4,5,6) - ! pristine ice, snow, dry graupel - ZRHOHYD=MIN(6.*ZA*ZDELTA_EQUIV**(ZB-3.)/XPI,.92*XRHOLW) - QM=sqrt(MG(QMI**2,CMPLX(1,0),ZRHOHYD/.92/XRHOLW)) - - ! water inclusions in ice in air - QEPSWI=MG(QMW**2,QM**2,ZFW) - ! ice in air inclusions in water - QEPSIW=MG(QM**2,QMW**2,1.-ZFW) - - !MG weighted rule (Matrosov 2008) - IF(ZFW .LT. 0.37) THEN - ZFPW=0 - ELSE IF(ZFW .GT. 0.63) THEN - ZFPW=1 - ELSE - ZFPW=(ZFW-0.37)/(0.63-0.37) - ENDIF - QM=sqrt(QEPSWI*(1.-ZFPW)+QEPSIW*ZFPW) - END SELECT - CALL BHMIE(XPI/XLAM_CRAD*ZDELTA_EQUIV,QM,ZQEXT,ZQSCA,ZQBACK) - ZREFLOC=ZREFLOC+ZQBACK*ZX(JJ)**(ZNU-1)*ZDELTA_EQUIV**2*ZW(JJ) - ZAETMP =ZAETMP +ZQEXT *ZX(JJ)**(ZNU-1)*ZDELTA_EQUIV**2*ZW(JJ) - END DO - ZREFLOC=ZREFLOC*(XLAM_CRAD/XPI)**4*ZN/(4.*GAMMA(ZNU)*.93) - ZAETMP=ZAETMP * XPI *ZN/(4.*GAMMA(ZNU)) - TPFLYER%CRARE(IN,JK)=TPFLYER%CRARE(IN,JK)+ZREFLOC - ZAELOC(JK)=ZAELOC(JK)+ZAETMP - END IF - - END DO - - END DO - - ! apply attenuation - ALLOCATE(ZZMZ(IKU)) - ZZMZ(:)=FLYER_INTERPZ(ZZM(:,:,:)) - ! nadir - ZAETOT=1. - DO JK=COUNT(TPFLYER%Z_CUR >= ZZMZ(:)),1,-1 - IF(JK.EQ.COUNT(TPFLYER%Z_CUR >= ZZMZ(:))) THEN - IF(TPFLYER%Z_CUR<=ZZMZ(JK)+.5*(ZZMZ(JK+1)-ZZMZ(JK))) THEN - ! only attenuation from ZAELOC(JK) - ZAETOT=ZAETOT*EXP(-2.*(ZAELOC(JK)*(TPFLYER%Z_CUR-ZZMZ(JK)))) + CASE(3) ! rain water + IF (CCLOUD == 'LIMA') THEN + ZA=XAR_L + ZB=XBR_L + ZCC=ZCCR(JK)*ZRHODREFZ(JK) + ZCX=0. + ZALPHA=XALPHAR_L + ZNU=XNUR_L + ZLBEX=1.0/(ZCX-ZB) + ZLB=( ZA*ZCC*MOMG(ZALPHA,ZNU,ZB) )**(-ZLBEX) ELSE - ! attenuation from ZAELOC(JK) and ZAELOC(JK+1) - ZAETOT=ZAETOT*EXP(-2.*(ZAELOC(JK+1)*(TPFLYER%Z_CUR-.5*(ZZMZ(JK+1)+ZZMZ(JK))) & - +ZAELOC(JK)*.5*(ZZMZ(JK+1)-ZZMZ(JK)))) - END IF - ELSE - ! attenuation from ZAELOC(JK) and ZAELOC(JK+1) - ZAETOT=ZAETOT*EXP(-(ZAELOC(JK+1)+ZAELOC(JK))*(ZZMZ(JK+1)-ZZMZ(JK))) - END IF - TPFLYER%CRARE_ATT(IN,JK)=TPFLYER%CRARE(IN,JK)*ZAETOT - END DO - ! zenith - ZAETOT=1. - DO JK = MAX(COUNT(TPFLYER%Z_CUR >= ZZMZ(:)),1)+1,IKU - IF ( JK .EQ. (MAX(COUNT(TPFLYER%Z_CUR >= ZZMZ(:)),1)+1) ) THEN - IF(TPFLYER%Z_CUR>=ZZMZ(JK)-.5*(ZZMZ(JK)-ZZMZ(JK-1))) THEN - ! only attenuation from ZAELOC(JK) - ZAETOT=ZAETOT*EXP(-2.*(ZAELOC(JK)*(ZZMZ(JK)-TPFLYER%Z_CUR))) + ZA=XAR_I + ZB=XBR_I + ZCC=XCCR_I + ZCX=-1. + ZALPHA=XALPHAR_I + ZNU=XNUR_I + ZLB=XLBR_I + ZLBEX=XLBEXR_I + ENDIF + CASE(4) ! pristine ice + IF (CCLOUD == 'LIMA') THEN + ZA=XAI_L + ZB=XBI_L + ZCC=ZCCI(JK)*ZRHODREFZ(JK) + ZCX=0. + ZALPHA=XALPHAI_L + ZNU=XNUI_L + ZLBEX=1.0/(ZCX-ZB) + ZLB=( ZA*ZCC*MOMG(ZALPHA,ZNU,ZB) )**(-ZLBEX) ! because ZCC not included in XLBI + ZFW=0 ELSE - ! attenuation from ZAELOC(JK) and ZAELOC(JK-1) - ZAETOT=ZAETOT*EXP(-2.*(ZAELOC(JK-1)*(.5*(ZZMZ(JK)+ZZMZ(JK-1))-TPFLYER%Z_CUR) & - +ZAELOC(JK)*.5*(ZZMZ(JK)-ZZMZ(JK-1)))) - END IF + ZA=XAI_I + ZB=XBI_I + ZCC=ZCIT(JK) + ZCX=0. + ZALPHA=XALPHAI_I + ZNU=XNUI_I + ZLBEX=XLBEXI_I + ZLB=XLBI_I*ZCC**(-ZLBEX) ! because ZCC not included in XLBI + ZFW=0 + ENDIF + CASE(5) ! snow + IF (CCLOUD == 'LIMA') THEN + ZA=XAS_L + ZB=XBS_L + ZCC=XCCS_L + ZCX=XCXS_L + ZALPHA=XALPHAS_L + ZNU=XNUS_L + ZNS=XNS_L + ZLB=XLBS_L + ZLBEX=XLBEXS_L + ZFW=0 + ELSE + ZA=XAS_I + ZB=XBS_I + ZCC=XCCS_I + ZCX=XCXS_I + ZALPHA=XALPHAS_I + ZNU=XNUS_I + ZNS=XNS_I + ZLB=XLBS_I + ZLBEX=XLBEXS_I + ZFW=0 + ENDIF + CASE(6) ! graupel + !If temperature between -10 and 10°C and Mr and Mg over min threshold: melting graupel + ! with liquid water fraction Fw=Mr/(Mr+Mg) else dry graupel (Fw=0) + IF( ZTEMPZ(JK) > XTT-10 .AND. ZTEMPZ(JK) < XTT+10 & + .AND. ZRZ(JK,3) > ZRTMIN(3) ) THEN + ZFW=ZRZ(JK,3)/(ZRZ(JK,3)+ZRZ(JK,JLOOP)) + ELSE + ZFW=0 + ENDIF + IF (CCLOUD == 'LIMA') THEN + ZA=XAG_L + ZB=XBG_L + ZCC=XCCG_L + ZCX=XCXG_L + ZALPHA=XALPHAG_L + ZNU=XNUG_L + ZLB=XLBG_L + ZLBEX=XLBEXG_L + ELSE + ZA=XAG_I + ZB=XBG_I + ZCC=XCCG_I + ZCX=XCXG_I + ZALPHA=XALPHAG_I + ZNU=XNUG_I + ZLB=XLBG_I + ZLBEX=XLBEXG_I + ENDIF + CASE(7) ! cloud water over land + IF (CCLOUD == 'LIMA') THEN + ZA=XAC_L + ZB=XBC_L + ZCC=ZCCC(JK)*ZRHODREFZ(JK) + ZCX=0. + ZALPHA=XALPHAC_L + ZNU=XNUC_L + ZLBEX=1.0/(ZCX-ZB) + ZLB=( ZA*ZCC*MOMG(ZALPHA,ZNU,ZB) )**(-ZLBEX) + ELSE + ZA=XAC_I + ZB=XBC_I + ZCC=XCONC_LAND + ZCX=0. + ZALPHA=XALPHAC_I + ZNU=XNUC_I + ZLBEX=1.0/(ZCX-ZB) + ZLB=( ZA*ZCC*MOMG(ZALPHA,ZNU,ZB) )**(-ZLBEX) + ENDIF + END SELECT + ZLBDA=ZLB*(ZRHODREFZ(JK)*ZRZ(JK,JLOOP))**ZLBEX + IF ( JLOOP == 5 .AND. ( (CCLOUD=='LIMA'.AND.LSNOW_T_L) .OR. & + (CCLOUD=='ICE3'.AND.LSNOW_T_I) ) ) THEN + ZLBDA = MAX(MIN(XLBDAS_MAX, 10**(14.554-0.0423*(ZTEMPZ(JK)+273.15))),XLBDAS_MIN) ELSE - ! attenuation from ZAELOC(JK) and ZAELOC(JK-1) - ZAETOT=ZAETOT*EXP(-(ZAELOC(JK-1)+ZAELOC(JK))*(ZZMZ(JK)-ZZMZ(JK-1))) + ZLBDA = MAX(MIN(XLBDAS_MAX, 10**(6.226-0.0106*(ZTEMPZ(JK)+273.15))),XLBDAS_MIN) END IF - TPFLYER%CRARE_ATT(IN,JK)=TPFLYER%CRARE(IN,JK)*ZAETOT - END DO - TPFLYER%ZZ (IN,:) = ZZMZ(:) - DEALLOCATE(ZZMZ,ZAELOC) - ! m^3 → mm^6/m^3 → dBZ - WHERE(TPFLYER%CRARE(IN,:)>0) - TPFLYER%CRARE(IN,:)=10.*LOG10(1.E18*TPFLYER%CRARE(IN,:)) - ELSEWHERE - TPFLYER%CRARE(IN,:)=XUNDEF - END WHERE - WHERE(TPFLYER%CRARE_ATT(IN,:)>0) - TPFLYER%CRARE_ATT(IN,:)=10.*LOG10(1.E18*TPFLYER%CRARE_ATT(IN,:)) - ELSEWHERE - TPFLYER%CRARE_ATT(IN,:)=XUNDEF - END WHERE - DEALLOCATE(ZX,ZW,ZRTMIN) - END IF ! end LOOP ICE3 - ! vertical wind - TPFLYER%WZ (IN,:) = FLYER_INTERPZ(ZWM(:,:,:)) - IF (SIZE(PTKE)>0) TPFLYER%TKE (IN) = FLYER_INTERP(PTKE) - IF (SIZE(PTS) >0) TPFLYER%TSRAD(IN) = FLYER_INTERP_2D(PTS) - IF (LDIAG_IN_RUN) TPFLYER%TKE_DISS(IN) = FLYER_INTERP(XCURRENT_TKE_DISS) - TPFLYER%ZS(IN) = FLYER_INTERP_2D(PZ(:,:,1+JPVEXT)) - TPFLYER%THW_FLUX(IN) = FLYER_INTERP(ZTHW_FLUX) - TPFLYER%RCW_FLUX(IN) = FLYER_INTERP(ZRCW_FLUX) - DO JLOOP=1,SIZE(PSV,4) - TPFLYER%SVW_FLUX(IN,JLOOP) = FLYER_INTERP(ZSVW_FLUX(:,:,:,JLOOP)) - END DO - END IF -! -!---------------------------------------------------------------------------- -! -!* 9. BALLOON ADVECTION -! ----------------- -! - IF (TPFLYER%TYPE=='RADIOS' .OR. TPFLYER%TYPE=='ISODEN' .OR. TPFLYER%TYPE=='CVBALL') THEN - ZU_BAL = FLYER_INTERP_U(PU) - ZV_BAL = FLYER_INTERP_V(PV) - if ( .not. lcartesian ) then - ZMAP = FLYER_INTERP_2D(PMAP) - else - ZMAP = 1. - end if - ! - TPFLYER%X_CUR = TPFLYER%X_CUR + ZU_BAL * PTSTEP * ZMAP - TPFLYER%Y_CUR = TPFLYER%Y_CUR + ZV_BAL * PTSTEP * ZMAP - END IF - ! - IF (TPFLYER%TYPE=='RADIOS') THEN - ZW_BAL = FLYER_INTERP(ZWM) - TPFLYER%Z_CUR = TPFLYER%Z_CUR + ( ZW_BAL + TPFLYER%WASCENT ) * PTSTEP - END IF - ! - IF (TPFLYER%TYPE=='CVBALL') THEN - ZW_BAL = FLYER_INTERP(ZWM) - ZRO_BAL = FLYER_INTERP(ZRHO) - ! calculation with a time step of 1 second or less - IF (INT(PTSTEP) .GT. 1 ) THEN - DO JK=1,INT(PTSTEP) - TPFLYER%WASCENT = TPFLYER%WASCENT & - - ( 1. / (1. + TPFLYER%INDDRAG ) ) * 1. * & - ( XG * ( ( TPFLYER%MASS / TPFLYER%VOLUME ) - ZRO_BAL ) / ( TPFLYER%MASS / TPFLYER%VOLUME ) & - + TPFLYER%WASCENT * ABS ( TPFLYER%WASCENT ) * & - TPFLYER%DIAMETER * TPFLYER%AERODRAG / ( 2. * TPFLYER%VOLUME ) & - ) - TPFLYER%Z_CUR = TPFLYER%Z_CUR + ( ZW_BAL + TPFLYER%WASCENT ) * 1. - END DO - END IF - IF (PTSTEP .GT. INT(PTSTEP)) THEN - TPFLYER%WASCENT = TPFLYER%WASCENT & - - ( 1. / (1. + TPFLYER%INDDRAG ) ) * (PTSTEP-INT(PTSTEP)) * & - ( XG * ( ( TPFLYER%MASS / TPFLYER%VOLUME ) - ZRO_BAL ) / ( TPFLYER%MASS / TPFLYER%VOLUME ) & - + TPFLYER%WASCENT * ABS ( TPFLYER%WASCENT ) * & - TPFLYER%DIAMETER * TPFLYER%AERODRAG / ( 2. * TPFLYER%VOLUME ) & - ) - TPFLYER%Z_CUR = TPFLYER%Z_CUR + ( ZW_BAL + TPFLYER%WASCENT ) * (PTSTEP-INT(PTSTEP)) + ZN=ZNS*ZRHODREFZ(JK)*ZRZ(JK,JLOOP)*ZLBDA**ZB + ELSE + ZLBDA=ZLB*(ZRHODREFZ(JK)*ZRZ(JK,JLOOP))**ZLBEX + ZN=ZCC*ZLBDA**ZCX END IF + ZREFLOC=0. + ZAETMP=0. + DO JJ=1,JPTS_GAULAG ! Gauss-Laguerre quadrature + ZDELTA_EQUIV=ZX(JJ)**(1./ZALPHA)/ZLBDA + SELECT CASE(JLOOP) + CASE(2,3,7) + QM=QMW + CASE(4,5,6) + ! pristine ice, snow, dry graupel + ZRHOHYD=MIN(6.*ZA*ZDELTA_EQUIV**(ZB-3.)/XPI,.92*XRHOLW) + QM=sqrt(MG(QMI**2,CMPLX(1,0),ZRHOHYD/.92/XRHOLW)) + + ! water inclusions in ice in air + QEPSWI=MG(QMW**2,QM**2,ZFW) + ! ice in air inclusions in water + QEPSIW=MG(QM**2,QMW**2,1.-ZFW) + + !MG weighted rule (Matrosov 2008) + IF(ZFW .LT. 0.37) THEN + ZFPW=0 + ELSE IF(ZFW .GT. 0.63) THEN + ZFPW=1 + ELSE + ZFPW=(ZFW-0.37)/(0.63-0.37) + ENDIF + QM=sqrt(QEPSWI*(1.-ZFPW)+QEPSIW*ZFPW) + END SELECT + CALL BHMIE(XPI/XLAM_CRAD*ZDELTA_EQUIV,QM,ZQEXT,ZQSCA,ZQBACK) + ZREFLOC=ZREFLOC+ZQBACK*ZX(JJ)**(ZNU-1)*ZDELTA_EQUIV**2*ZW(JJ) + ZAETMP =ZAETMP +ZQEXT *ZX(JJ)**(ZNU-1)*ZDELTA_EQUIV**2*ZW(JJ) + END DO + ZREFLOC=ZREFLOC*(XLAM_CRAD/XPI)**4*ZN/(4.*GAMMA(ZNU)*.93) + ZAETMP=ZAETMP * XPI *ZN/(4.*GAMMA(ZNU)) + TPFLYER%XCRARE(ISTORE,JK)=TPFLYER%XCRARE(ISTORE,JK)+ZREFLOC + ZAELOC(JK)=ZAELOC(JK)+ZAETMP END IF -! -!---------------------------------------------------------------------------- - END IF -!---------------------------------------------------------------------------- -! -!* 10. AIRCRAFT MOVE (computations done on all processors, to limit exchanges) -! ------------- -! - IF (TPFLYER%TYPE=='AIRCRA') THEN -! -! -!* 10.1 Determination of flight segment -! ------------------------------- -! - IL = TPFLYER%SEGCURN - ! - TPFLYER%SEGCURT = TPFLYER%SEGCURT + PTSTEP - ! - DO WHILE (TPFLYER%SEGCURT>TPFLYER%SEGTIME(IL)) - TPFLYER%SEGCURN = TPFLYER%SEGCURN + 1 - IL = TPFLYER%SEGCURN - TPFLYER%SEGCURT = TPFLYER%SEGCURT - TPFLYER%SEGTIME(IL-1) - IF (IL>TPFLYER%SEG) EXIT - END DO -! DO WHILE (TPFLYER%SEGCURT>TPFLYER%SEGTIME(IL) .AND. IL <= TPFLYER%SEG) -! TPFLYER%SEGCURN = TPFLYER%SEGCURN + 1 -! IL = TPFLYER%SEGCURN -! TPFLYER%SEGCURT = TPFLYER%SEGCURT - TPFLYER%SEGTIME(IL-1) -! END DO - ! - !* end of flight - ! - IF (IL > TPFLYER%SEG) TPFLYER%FLY=.FALSE. -! -! -!* 10.2 Determination of new position -! ----------------------------- -! - IF (TPFLYER%FLY) THEN - ZSEG_FRAC = TPFLYER%SEGCURT / TPFLYER%SEGTIME(IL) - ! - TPFLYER%X_CUR = (1.-ZSEG_FRAC) * TPFLYER%SEGX(IL ) & - + ZSEG_FRAC * TPFLYER%SEGX(IL+1) - TPFLYER%Y_CUR = (1.-ZSEG_FRAC) * TPFLYER%SEGY(IL ) & - + ZSEG_FRAC * TPFLYER%SEGY(IL+1) - IF (TPFLYER%ALTDEF) THEN - TPFLYER%P_CUR = (1.-ZSEG_FRAC) * TPFLYER%SEGP(IL ) & - + ZSEG_FRAC * TPFLYER%SEGP(IL+1) - ELSE - TPFLYER%Z_CUR = (1.-ZSEG_FRAC) * TPFLYER%SEGZ(IL ) & - + ZSEG_FRAC * TPFLYER%SEGZ(IL+1) - END IF + END DO + END DO +#endif + + ! apply attenuation + ALLOCATE(ZZMZ(IKU)) + ZZMZ(:)=FLYER_INTERPZ(ZZM(:,:,:)) + ! nadir + ZAETOT=1. + DO JK=COUNT(TPFLYER%XZ_CUR >= ZZMZ(:)),1,-1 + IF(JK.EQ.COUNT(TPFLYER%XZ_CUR >= ZZMZ(:))) THEN + IF(TPFLYER%XZ_CUR<=ZZMZ(JK)+.5*(ZZMZ(JK+1)-ZZMZ(JK))) THEN + ! only attenuation from ZAELOC(JK) + ZAETOT=ZAETOT*EXP(-2.*(ZAELOC(JK)*(TPFLYER%XZ_CUR-ZZMZ(JK)))) + ELSE + ! attenuation from ZAELOC(JK) and ZAELOC(JK+1) + ZAETOT=ZAETOT*EXP(-2.*(ZAELOC(JK+1)*(TPFLYER%XZ_CUR-.5*(ZZMZ(JK+1)+ZZMZ(JK))) & + +ZAELOC(JK)*.5*(ZZMZ(JK+1)-ZZMZ(JK)))) END IF - ! + ELSE + ! attenuation from ZAELOC(JK) and ZAELOC(JK+1) + ZAETOT=ZAETOT*EXP(-(ZAELOC(JK+1)+ZAELOC(JK))*(ZZMZ(JK+1)-ZZMZ(JK))) END IF - ! - END IF -! -END IF -! -!---------------------------------------------------------------------------- -! -!* 11. EXCHANGE OF INFORMATION BETWEEN PROCESSORS -! ------------------------------------------ -! -!* 11.1 current position -! ---------------- -! -CALL DISTRIBUTE_FLYER_L(TPFLYER%FLY) -CALL DISTRIBUTE_FLYER_L(TPFLYER%CRASH) -CALL DISTRIBUTE_FLYER(TPFLYER%X_CUR) -CALL DISTRIBUTE_FLYER(TPFLYER%Y_CUR) -IF (TPFLYER%TYPE=='CVBALL') THEN - CALL DISTRIBUTE_FLYER(TPFLYER%Z_CUR) - CALL DISTRIBUTE_FLYER(TPFLYER%WASCENT) -ELSE - IF (TPFLYER%TYPE=='RADIOS') CALL DISTRIBUTE_FLYER(TPFLYER%Z_CUR) - IF (TPFLYER%TYPE=='AIRCRA') THEN - IF (TPFLYER%ALTDEF) THEN - CALL DISTRIBUTE_FLYER(TPFLYER%P_CUR) - ELSE - CALL DISTRIBUTE_FLYER(TPFLYER%Z_CUR) - ENDIF - END IF - IF (TPFLYER%TYPE=='ISODEN' ) CALL DISTRIBUTE_FLYER(TPFLYER%RHO) -END IF -! -!* 11.2 data stored -! ----------- -! -IF ( GSTORE ) THEN - CALL DISTRIBUTE_FLYER(TPFLYER%X (IN)) - CALL DISTRIBUTE_FLYER(TPFLYER%Y (IN)) - CALL DISTRIBUTE_FLYER(TPFLYER%Z (IN)) - CALL DISTRIBUTE_FLYER(TPFLYER%XLON(IN)) - CALL DISTRIBUTE_FLYER(TPFLYER%YLAT(IN)) - CALL DISTRIBUTE_FLYER(TPFLYER%ZON (IN)) - CALL DISTRIBUTE_FLYER(TPFLYER%MER (IN)) - CALL DISTRIBUTE_FLYER(TPFLYER%W (IN)) - CALL DISTRIBUTE_FLYER(TPFLYER%P (IN)) - CALL DISTRIBUTE_FLYER(TPFLYER%TH (IN)) - DO JLOOP=1,SIZE(PR,4) - CALL DISTRIBUTE_FLYER(TPFLYER%R (IN,JLOOP)) - END DO - DO JLOOP=1,SIZE(PSV,4) - CALL DISTRIBUTE_FLYER(TPFLYER%SV (IN,JLOOP)) + TPFLYER%XCRARE_ATT(ISTORE,JK)=TPFLYER%XCRARE(ISTORE,JK)*ZAETOT END DO - DO JLOOP=1,IKU - CALL DISTRIBUTE_FLYER(TPFLYER%RTZ (IN,JLOOP)) - DO JLOOP2=1,SIZE(PR,4) - CALL DISTRIBUTE_FLYER(TPFLYER%RZ (IN,JLOOP,JLOOP2)) - ENDDO - CALL DISTRIBUTE_FLYER(TPFLYER%FFZ (IN,JLOOP)) - CALL DISTRIBUTE_FLYER(TPFLYER%CIZ (IN,JLOOP)) - IF (CCLOUD== 'LIMA' ) THEN - CALL DISTRIBUTE_FLYER(TPFLYER%CRZ (IN,JLOOP)) - CALL DISTRIBUTE_FLYER(TPFLYER%CCZ (IN,JLOOP)) - ENDIF - CALL DISTRIBUTE_FLYER(TPFLYER%IWCZ (IN,JLOOP)) - CALL DISTRIBUTE_FLYER(TPFLYER%LWCZ (IN,JLOOP)) - CALL DISTRIBUTE_FLYER(TPFLYER%CRARE (IN,JLOOP)) - CALL DISTRIBUTE_FLYER(TPFLYER%CRARE_ATT (IN,JLOOP)) - CALL DISTRIBUTE_FLYER(TPFLYER%WZ (IN,JLOOP)) - CALL DISTRIBUTE_FLYER(TPFLYER%ZZ (IN,JLOOP)) - END DO - IF (SIZE(PTKE)>0) CALL DISTRIBUTE_FLYER(TPFLYER%TKE (IN)) - IF (SIZE(PTS) >0) CALL DISTRIBUTE_FLYER(TPFLYER%TSRAD(IN)) - CALL DISTRIBUTE_FLYER(TPFLYER%ZS (IN)) - CALL DISTRIBUTE_FLYER(TPFLYER%THW_FLUX(IN)) - CALL DISTRIBUTE_FLYER(TPFLYER%RCW_FLUX(IN)) - DO JLOOP=1,SIZE(PSV,4) - CALL DISTRIBUTE_FLYER(TPFLYER%SVW_FLUX(IN,JLOOP)) + ! zenith + ZAETOT=1. + DO JK = MAX(COUNT(TPFLYER%XZ_CUR >= ZZMZ(:)),1)+1,IKU + IF ( JK .EQ. (MAX(COUNT(TPFLYER%XZ_CUR >= ZZMZ(:)),1)+1) ) THEN + IF(TPFLYER%XZ_CUR>=ZZMZ(JK)-.5*(ZZMZ(JK)-ZZMZ(JK-1))) THEN + ! only attenuation from ZAELOC(JK) + ZAETOT=ZAETOT*EXP(-2.*(ZAELOC(JK)*(ZZMZ(JK)-TPFLYER%XZ_CUR))) + ELSE + ! attenuation from ZAELOC(JK) and ZAELOC(JK-1) + ZAETOT=ZAETOT*EXP(-2.*(ZAELOC(JK-1)*(.5*(ZZMZ(JK)+ZZMZ(JK-1))-TPFLYER%XZ_CUR) & + +ZAELOC(JK)*.5*(ZZMZ(JK)-ZZMZ(JK-1)))) + END IF + ELSE + ! attenuation from ZAELOC(JK) and ZAELOC(JK-1) + ZAETOT=ZAETOT*EXP(-(ZAELOC(JK-1)+ZAELOC(JK))*(ZZMZ(JK)-ZZMZ(JK-1))) + END IF + TPFLYER%XCRARE_ATT(ISTORE,JK)=TPFLYER%XCRARE(ISTORE,JK)*ZAETOT END DO -END IF -! -!---------------------------------------------------------------------------- -!---------------------------------------------------------------------------- -! -CONTAINS -! + + TPFLYER%XZZ (ISTORE,:) = ZZMZ(:) + DEALLOCATE(ZZMZ,ZAELOC) + ! m^3 → mm^6/m^3 → dBZ + WHERE(TPFLYER%XCRARE(ISTORE,:)>0) + TPFLYER%XCRARE(ISTORE,:)=10.*LOG10(1.E18*TPFLYER%XCRARE(ISTORE,:)) + ELSEWHERE + TPFLYER%XCRARE(ISTORE,:)=XUNDEF + END WHERE + WHERE(TPFLYER%XCRARE_ATT(ISTORE,:)>0) + TPFLYER%XCRARE_ATT(ISTORE,:)=10.*LOG10(1.E18*TPFLYER%XCRARE_ATT(ISTORE,:)) + ELSEWHERE + TPFLYER%XCRARE_ATT(ISTORE,:)=XUNDEF + END WHERE + DEALLOCATE(ZX,ZW,ZRTMIN) +END IF ! end LOOP ICE3 +! vertical wind +TPFLYER%XWZ (ISTORE,:) = FLYER_INTERPZ(ZWM(:,:,:)) +IF (SIZE(PTKE)>0) TPFLYER%XTKE (ISTORE) = FLYER_INTERP(PTKE) +IF (SIZE(PTS) >0) TPFLYER%XTSRAD(ISTORE) = FLYER_INTERP_2D(PTS) +IF (LDIAG_IN_RUN) TPFLYER%XTKE_DISS(ISTORE) = FLYER_INTERP(XCURRENT_TKE_DISS) +TPFLYER%XZS(ISTORE) = FLYER_INTERP_2D(PZ(:,:,1+JPVEXT)) +TPFLYER%XTHW_FLUX(ISTORE) = FLYER_INTERP(ZTHW_FLUX) +TPFLYER%XRCW_FLUX(ISTORE) = FLYER_INTERP(ZRCW_FLUX) +DO JLOOP=1,SIZE(PSV,4) +TPFLYER%XSVW_FLUX(ISTORE,JLOOP) = FLYER_INTERP(ZSVW_FLUX(:,:,:,JLOOP)) +END DO + +END SUBROUTINE FLYER_RECORD_DATA !---------------------------------------------------------------------------- !---------------------------------------------------------------------------- FUNCTION FLYER_INTERP(PA) RESULT(PB) @@ -1503,8 +1363,8 @@ IF (SIZE(PA,1)==2) THEN JI=1 JJ=1 ELSE - JI=II - JJ=IJ + JI=II_M + JJ=IJ_M END IF ! PB = (1.- ZYCOEF) * (1.-ZXCOEF) * ( (1.-ZZCOEF00) * PA(JI ,JJ ,IK00) + ZZCOEF00 * PA(JI ,JJ ,IK00+1)) & @@ -1514,6 +1374,7 @@ PB = (1.- ZYCOEF) * (1.-ZXCOEF) * ( (1.-ZZCOEF00) * PA(JI ,JJ ,IK00) + ZZCOEF0 ! END FUNCTION FLYER_INTERP !---------------------------------------------------------------------------- +!---------------------------------------------------------------------------- FUNCTION FLYER_INTERPZ(PA) RESULT(PB) ! REAL, DIMENSION(:,:,:), INTENT(IN) :: PA @@ -1525,8 +1386,8 @@ IF (SIZE(PA,1)==2) THEN JI=1 JJ=1 ELSE - JI=II - JJ=IJ + JI=II_M + JJ=IJ_M END IF ! ! @@ -1536,10 +1397,10 @@ DO JK=1,SIZE(PA,3) PB(JK) = (1.-ZYCOEF) * (1.-ZXCOEF) * PA(JI,JJ,JK) + & (1.-ZYCOEF) * (ZXCOEF) * PA(JI+1,JJ,JK) + & (ZYCOEF) * (1.-ZXCOEF) * PA(JI,JJ+1,JK) + & - (ZYCOEF) * (ZXCOEF) * PA(JI+1,JJ+1,JK) + (ZYCOEF) * (ZXCOEF) * PA(JI+1,JJ+1,JK) ELSE - PB(JK) = XUNDEF - END IF + PB(JK) = XUNDEF + END IF END DO ! END FUNCTION FLYER_INTERPZ @@ -1555,8 +1416,8 @@ IF (SIZE(PA,1)==2) THEN JI=1 JJ=1 ELSE - JI=IU - JJ=IJ + JI=II_U + JJ=IJ_M END IF ! PB = (1.- ZYCOEF) * (1.-ZUCOEF) * ( (1.-ZUCOEF00) * PA(JI ,JJ ,IU00) + ZUCOEF00 * PA(JI ,JJ ,IU00+1)) & @@ -1578,8 +1439,8 @@ IF (SIZE(PA,1)==2) THEN JI=1 JJ=1 ELSE - JI=II - JJ=IV + JI=II_M + JJ=IJ_V END IF ! PB = (1.- ZVCOEF) * (1.-ZXCOEF) * ( (1.-ZVCOEF00) * PA(JI ,JJ ,IV00) + ZVCOEF00 * PA(JI ,JJ ,IV00+1)) & @@ -1601,8 +1462,8 @@ IF (SIZE(PA,1)==2) THEN JI=1 JJ=1 ELSE - JI=II - JJ=IJ + JI=II_M + JJ=IJ_M END IF ! PB = (1.- ZYCOEF) * (1.-ZXCOEF) * PA(JI ,JJ ) & @@ -1612,132 +1473,140 @@ PB = (1.- ZYCOEF) * (1.-ZXCOEF) * PA(JI ,JJ ) & ! END FUNCTION FLYER_INTERP_2D !---------------------------------------------------------------------------- -!---------------------------------------------------------------------------- -SUBROUTINE DISTRIBUTE_FLYER(PA) -! -REAL, INTENT(INOUT) :: PA -! -PA = PA * ZTHIS_PROC -CALL REDUCESUM_ll(PA,IINFO_ll) -! -END SUBROUTINE DISTRIBUTE_FLYER -!---------------------------------------------------------------------------- -!---------------------------------------------------------------------------- -SUBROUTINE DISTRIBUTE_FLYER_N(KA) -! -INTEGER, INTENT(INOUT) :: KA -REAL :: ZA -! -ZA=KA -! -ZA = ZA * ZTHIS_PROC -CALL REDUCESUM_ll(ZA,IINFO_ll) -! -IF (NINT(ZA)/=0) KA=NINT(ZA) -! -END SUBROUTINE DISTRIBUTE_FLYER_N + +END SUBROUTINE AIRCRAFT_BALLOON_EVOL !---------------------------------------------------------------------------- !---------------------------------------------------------------------------- -SUBROUTINE DISTRIBUTE_FLYER_L(OA) -! -LOGICAL, INTENT(INOUT) :: OA -REAL :: ZA -! -ZA=0. -IF (OA) ZA=1. -! -CALL REDUCESUM_ll(ZA,IINFO_ll) -! -IF (ZA==0.) THEN - OA=.FALSE. +SUBROUTINE AIRCRAFT_COMPUTE_POSITION( TPDATE, TPAIRCRAFT ) + +USE MODD_AIRCRAFT_BALLOON, ONLY: TAIRCRAFTDATA +USE MODD_TYPE_DATE, ONLY: DATE_TIME + +USE MODE_DATETIME +USE MODE_POSITION_TOOLS, ONLY: FIND_PROCESS_AND_MODEL_FROM_XY_POS + +IMPLICIT NONE + +TYPE(DATE_TIME), INTENT(IN) :: TPDATE +CLASS(TAIRCRAFTDATA), INTENT(INOUT) :: TPAIRCRAFT !aircraft + +INTEGER :: IL ! flight segment index +REAL :: ZTDIST ! time since launch (sec) +REAL :: ZSEG_FRAC ! fraction of flight in the current segment + +! Find the flight segment +ZTDIST = TPDATE - TPAIRCRAFT%TLAUNCH +IL = TPAIRCRAFT%NPOSCUR +DO WHILE ( ZTDIST > TPAIRCRAFT%XPOSTIME(IL+1) ) + IL = IL + 1 + IF ( IL > TPAIRCRAFT%NPOS-1 ) THEN + !Security (should not happen) + IL = TPAIRCRAFT%NPOS-1 + EXIT + END IF +END DO +TPAIRCRAFT%NPOSCUR = IL + +! Compute the current position +ZSEG_FRAC = ( ZTDIST - TPAIRCRAFT%XPOSTIME(IL) ) / ( TPAIRCRAFT%XPOSTIME(IL+1) - TPAIRCRAFT%XPOSTIME(IL) ) + +TPAIRCRAFT%XX_CUR = (1.-ZSEG_FRAC) * TPAIRCRAFT%XPOSX(IL ) & + + ZSEG_FRAC * TPAIRCRAFT%XPOSX(IL+1) +TPAIRCRAFT%XY_CUR = (1.-ZSEG_FRAC) * TPAIRCRAFT%XPOSY(IL ) & + + ZSEG_FRAC * TPAIRCRAFT%XPOSY(IL+1) + +IF (TPAIRCRAFT%LALTDEF) THEN + TPAIRCRAFT%XP_CUR = (1.-ZSEG_FRAC) * TPAIRCRAFT%XPOSP(IL ) & + + ZSEG_FRAC * TPAIRCRAFT%XPOSP(IL+1) ELSE - OA=.TRUE. + TPAIRCRAFT%XZ_CUR = (1.-ZSEG_FRAC) * TPAIRCRAFT%XPOSZ(IL ) & + + ZSEG_FRAC * TPAIRCRAFT%XPOSZ(IL +1) END IF -! -END SUBROUTINE DISTRIBUTE_FLYER_L + +END SUBROUTINE AIRCRAFT_COMPUTE_POSITION !---------------------------------------------------------------------------- !---------------------------------------------------------------------------- -SUBROUTINE FLYER_CHANGE_MODEL(IMI) -! -INTEGER, INTENT(IN) :: IMI ! model index -! -INTEGER :: IMK ! kid model index -INTEGER :: IMODEL ! TPFLYER model index at the beginning of the subroutine -INTEGER :: IU ! U flux point balloon position (x index) -INTEGER :: IV ! V flux point balloon position (y index) -INTEGER :: IU_ABS ! U flux point balloon position (in the model) -INTEGER :: IV_ABS ! V flux point balloon position (in the model) -INTEGER :: IXOR ! Origin's coordinates of the extended 2 way subdomain -INTEGER :: IYOR ! Origin's coordinates of the extended 2 way subdomain -INTEGER :: IIB ! current processor domain sizes -INTEGER :: IJB -INTEGER :: IIE -INTEGER :: IJE -! -! -IMODEL=TPFLYER%NMODEL -CALL GET_INDICE_ll (IIB,IJB,IIE,IJE) -IU=COUNT( PXHAT (:)<=TPFLYER%X_CUR ) -IV=COUNT( PYHAT (:)<=TPFLYER%Y_CUR ) -ZTHIS_PROC=0. -IF (IU>=IIB .AND. IU<=IIE .AND. IV>=IJB .AND. IV<=IJE) ZTHIS_PROC=1. -IF (ZTHIS_PROC .EQ. 1) THEN - CALL GET_OR_LL('B',IXOR,IYOR) - IU_ABS=IU + IXOR - 1 - IV_ABS=IV + IYOR - 1 - ! - IF (TPFLYER%NMODEL == IMI) THEN - ! - ! go to the kid model if the flyer location is inside - ! ------------------ - ! - DO IMK=IMI+1,NMODEL - IF (NDAD(IMK) == IMI .AND. & - IU_ABS>=NXOR_ALL(IMK) .AND. IU_ABS<=NXEND_ALL(IMK) .AND. & - IV_ABS>=NYOR_ALL(IMK) .AND. IV_ABS<=NYEND_ALL(IMK) ) THEN - TPFLYER%NMODEL = IMK - ! - END IF - END DO - ! +SUBROUTINE FLYER_GET_RANK_MODEL_ISCRASHED( TPFLYER, PX, PY, KMODEL ) + +USE MODD_AIRCRAFT_BALLOON, ONLY: NCRASH_NO, NCRASH_OUT_HORIZ, TFLYERDATA + +USE MODE_POSITION_TOOLS, ONLY: FIND_PROCESS_AND_MODEL_FROM_XY_POS + +IMPLICIT NONE + +CLASS(TFLYERDATA), INTENT(INOUT) :: TPFLYER ! balloon/aircraft +REAL, OPTIONAL, INTENT(IN) :: PX ! X position (if not provided, takes current flyer position) +REAL, OPTIONAL, INTENT(IN) :: PY ! Y position (if not provided, takes current flyer position) +INTEGER, OPTIONAL, INTENT(IN) :: KMODEL ! if provided, model number is imposed (if not 0) + +INTEGER :: IMODEL +INTEGER :: IRANK +REAL :: ZX, ZY + +IF ( PRESENT( KMODEL ) ) THEN + IMODEL = KMODEL +ELSE + IF ( TPFLYER%CMODEL == 'FIX' ) THEN + IMODEL = TPFLYER%NMODEL ELSE - ! - ! come from the kid model if the flyer location is outside - ! ------------------ - ! - IMK = TPFLYER%NMODEL - IF (IU_ABS<NXOR_ALL(IMK) .OR. IU_ABS>NXEND_ALL(IMK) .OR. & - IV_ABS<NYOR_ALL(IMK) .OR. IV_ABS>NYEND_ALL(IMK) ) THEN - TPFLYER%NMODEL = IMI - ! - END IF + IMODEL = 0 END IF END IF -! -! send the information to all the processors -! ---------------------------------------- -! -CALL DISTRIBUTE_FLYER_N(TPFLYER%NMODEL) -ZTHIS_PROC=0. -! -! print if the model changes -!--------------------------------- -IF (TPFLYER%NMODEL /= IMODEL) THEN - IF (NDAD(IMODEL) == TPFLYER%NMODEL) THEN - WRITE(ILUOUT,*) '-------------------------------------------------------------------' - WRITE(ILUOUT,*) TPFLYER%TITLE,' comes from model ',IMODEL,' in model ',& - TPFLYER%NMODEL,' at ',NINT(TDTCUR%xtime),' sec.' - WRITE(ILUOUT,*) '-------------------------------------------------------------------' - ELSE - WRITE(ILUOUT,*) '-------------------------------------------------------------------' - WRITE(ILUOUT,*) TPFLYER%TITLE,' goes from model ',IMODEL,' to model ',& - TPFLYER%NMODEL,' at ',NINT(TDTCUR%xtime),' sec.' - WRITE(ILUOUT,*) '-------------------------------------------------------------------' - ENDIF -ENDIF -! -! -END SUBROUTINE FLYER_CHANGE_MODEL + +IF ( PRESENT( PX ) ) THEN + ZX = PX +ELSE + ZX = TPFLYER%XX_CUR +END IF + +IF ( PRESENT( PY ) ) THEN + ZY = PY +ELSE + ZY = TPFLYER%XY_CUR +END IF + +CALL FIND_PROCESS_AND_MODEL_FROM_XY_POS( ZX, ZY, IRANK, IMODEL ) + +IF ( IRANK < 1 ) THEN + ! Flyer is outside of horizontal domain + ! TPFLYER%NMODEL !Do not change to keep a valid value + TPFLYER%LCRASH = .TRUE. + TPFLYER%NCRASH = NCRASH_OUT_HORIZ + TPFLYER%LFLY = .FALSE. +ELSE + TPFLYER%NMODEL = IMODEL + TPFLYER%LCRASH = .FALSE. + TPFLYER%NCRASH = NCRASH_NO + !TPFLYER%LFLY = !Do not touch LFLY (flyer could be in flight or not) + TPFLYER%NRANK_CUR = IRANK +END IF + +END SUBROUTINE FLYER_GET_RANK_MODEL_ISCRASHED !---------------------------------------------------------------------------- !---------------------------------------------------------------------------- -END SUBROUTINE AIRCRAFT_BALLOON_EVOL +SUBROUTINE FLYER_CHECK_STORESTEP( TPFLYER ) + +USE MODD_AIRCRAFT_BALLOON, ONLY: TFLYERDATA + +USE MODE_STATPROF_TOOLS, ONLY: STATPROF_INSTANT + +IMPLICIT NONE + +CLASS(TFLYERDATA), INTENT(INOUT) :: TPFLYER ! balloon/aircraft + +INTEGER :: ISTORE + +!Remark: TPFLYER%TFLYER_TIME%N_CUR and %TPDATES are updated in STATPROF_INSTANT +CALL STATPROF_INSTANT( TPFLYER%TFLYER_TIME, ISTORE ) + +IF ( ISTORE < 1 ) THEN + !No profiler storage at this time step + TPFLYER%LSTORE = .FALSE. +ELSE + TPFLYER%LSTORE = .TRUE. +END IF + +END SUBROUTINE FLYER_CHECK_STORESTEP +!---------------------------------------------------------------------------- + +END MODULE MODE_AIRCRAFT_BALLOON_EVOL diff --git a/src/MNH/call_rttov11.f90 b/src/MNH/call_rttov11.f90 index e9eda58c83d726d4d3b27d595189f32abf9aadfd..c949ca4ebf02ce76697e879545f78ad7a8cd8e18 100644 --- a/src/MNH/call_rttov11.f90 +++ b/src/MNH/call_rttov11.f90 @@ -93,7 +93,7 @@ USE MODD_CST USE MODD_PARAMETERS USE MODD_GRID_n USE MODD_IO, ONLY: TFILEDATA -USE MODD_FIELD, ONLY: TFIELDDATA, TYPEREAL +USE MODD_FIELD, ONLY: TFIELDMETADATA, TYPEREAL USE MODD_LUNIT_n USE MODD_DEEP_CONVECTION_n USE MODD_REF_n @@ -266,7 +266,7 @@ integer (kind=jpim), parameter :: fin = 10 character (len=256) :: outstring ! ----------------------------------------------------------------------------- REAL, DIMENSION(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3)) :: ZTEMP -TYPE(TFIELDDATA) :: TZFIELD +TYPE(TFIELDMETADATA) :: TZFIELD !------------------------------------------------------------------------------- ! !* 0. ARRAYS BOUNDS INITIALIZATION @@ -585,22 +585,17 @@ DO JSAT=1,IJSAT ! loop over sensors YEND=YTWO//YCHAN END IF -! IF (INRAD==1) THEN -! TZFIELD%CMNHNAME = TRIM(YBEG)//'_'//TRIM(YEND)//'rad' -! TZFIELD%CUNITS = 'mw/cm-1/ster/sq.m' -! TZFIELD%CCOMMENT = TRIM(YBEG)//'_'//TRIM(YEND)//' rad' -! ELSE - TZFIELD%CMNHNAME = TRIM(YBEG)//'_'//TRIM(YEND)//'BT' - TZFIELD%CUNITS = 'K' - TZFIELD%CCOMMENT = TRIM(YBEG)//'_'//TRIM(YEND)//' BT' -! ENDIF - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 2 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = TRIM(YBEG)//'_'//TRIM(YEND)//'BT', & + CSTDNAME = '', & + CLONGNAME = TRIM(YBEG)//'_'//TRIM(YEND)//'BT', & + CUNITS = 'K', & + CDIR = 'XY', & + CCOMMENT = TRIM(YBEG)//'_'//TRIM(YEND)//' BT', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) ! PRINT *,'YRECFM='//TRIM(TZFIELD%CMNHNAME) CALL IO_Field_write(TPFILE,TZFIELD,ZBT(:,:,JCH)) END DO diff --git a/src/MNH/call_rttov13.f90 b/src/MNH/call_rttov13.f90 index 97ccf20af2a1a608ad00478b2f05046572cef425..90526ac29577602f548b302c12173cfe7b98298c 100644 --- a/src/MNH/call_rttov13.f90 +++ b/src/MNH/call_rttov13.f90 @@ -90,7 +90,7 @@ USE MODD_CST USE MODD_PARAMETERS USE MODD_GRID_n USE MODD_IO, ONLY: TFILEDATA -USE MODD_FIELD, ONLY: TFIELDDATA, TYPEREAL +USE MODD_FIELD, ONLY: TFIELDMETADATA, TYPEREAL USE MODD_LUNIT_n USE MODD_LBC_n USE MODD_DEEP_CONVECTION_n @@ -262,8 +262,9 @@ real (kind=jprb) :: zenangle integer (kind=jpim), parameter :: fin = 10 character (len=256) :: outstring ! ----------------------------------------------------------------------------- +CHARACTER(LEN=:), ALLOCATABLE :: YMNHNAME, YUNITS, YCOMMENT REAL, DIMENSION(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3)) :: ZTEMP -TYPE(TFIELDDATA) :: TZFIELD +TYPE(TFIELDMETADATA) :: TZFIELD !------------------------------------------------------------------------------- ! !* 0. ARRAYS BOUNDS INITIALIZATION @@ -696,21 +697,25 @@ DO JSAT=1,IJSAT ! loop over sensors thermal = coefs%coef%ss_val_chn(ichan) < 2 ! solar = coefs%coef%ss_val_chn(ichan) > 0 IF (thermal) THEN - TZFIELD%CMNHNAME = TRIM(YBEG)//'_'//TRIM(YEND)//'BT' - TZFIELD%CUNITS = 'K' - TZFIELD%CCOMMENT = TRIM(YBEG)//'_'//TRIM(YEND)//' brightness temperature' + YMNHNAME = TRIM(YBEG)//'_'//TRIM(YEND)//'BT' + YUNITS = 'K' + YCOMMENT = TRIM(YBEG)//'_'//TRIM(YEND)//' brightness temperature' ELSE - TZFIELD%CMNHNAME = TRIM(YBEG)//'_'//TRIM(YEND)//'refl' - TZFIELD%CUNITS = '-' - TZFIELD%CCOMMENT = TRIM(YBEG)//'_'//TRIM(YEND)//' bidirectional reflectance factor' + YMNHNAME = TRIM(YBEG)//'_'//TRIM(YEND)//'refl' + YUNITS = '-' + YCOMMENT = TRIM(YBEG)//'_'//TRIM(YEND)//' bidirectional reflectance factor' END IF - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME) - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 2 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = TRIM( YMNHNAME ), & + CSTDNAME = '', & + CLONGNAME = 'MesoNH: ' // TRIM( YMNHNAME ), & + CUNITS = TRIM( YUNITS ), & + CDIR = 'XY', & + CCOMMENT = TRIM( YCOMMENT ), & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) ! ZOUT(:,:,JCH) = ZOUT(:,:,JCH) *ZCOSZEN(:,:) CALL IO_Field_write(TPFILE,TZFIELD,ZOUT(:,:,JCH)) END DO diff --git a/src/MNH/call_rttov8.f90 b/src/MNH/call_rttov8.f90 index 946021f408ea475fedeb5baeea3d2576a05df475..ab370816e9fbd8998e73ed1420898793511151f9 100644 --- a/src/MNH/call_rttov8.f90 +++ b/src/MNH/call_rttov8.f90 @@ -90,6 +90,7 @@ SUBROUTINE CALL_RTTOV8(KDLON, KFLEV, KSTATM, PEMIS, PTSRAD, PSTATM, & !! ------------ !! USE MODD_CST +USE MODD_FIELD, only: TFIELDMETADATA USE MODD_IO, ONLY: TFILEDATA USE MODD_PARAMETERS USE MODD_GRID_n @@ -686,7 +687,8 @@ REAL(Kind=jprb), PARAMETER :: q_mixratio_to_ppmv = 1.60771704e+6_JPRB REAL(Kind=jprb), PARAMETER :: o3_mixratio_to_ppmv = 6.03504e+5_JPRB INTEGER(Kind=jpim) :: alloc_status(40) -TYPE(TFIELDDATA) :: TZFIELD +CHARACTER(LEN=:), ALLOCATABLE :: YMNHNAME, YUNITS, YCOMMENT +TYPE(TFIELDMETADATA) :: TZFIELD ! - End of header -------------------------------------------------------- !!!---------------------------------------------------------------------------- @@ -1567,16 +1569,17 @@ DO JSAT=1,IJSAT ! loop over sensors ! DO JK1=1,LEN_TRIM(inst_name(KRTTOVINFO(3,JSAT))) ! YINST(JK1:JK1)=CHAR(ICHAR(YINST(JK1:JK1))-32) ! END DO - TZFIELD%CMNHNAME = TRIM(YINST)//'_ANGL' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'degree' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = TRIM(YINST)//' ANGLE' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 2 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = TRIM(YINST)//'_ANGL', & + CSTDNAME = '', & + CLONGNAME = TRIM(YINST)//'_ANGL', & + CUNITS = 'degree', & + CDIR = 'XY', & + CCOMMENT = TRIM(YINST)//' ANGLE' & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) PRINT *,TZFIELD%CMNHNAME//TZFIELD%CCOMMENT CALL IO_Field_write(TPFILE,TZFIELD,ZANTMP) END IF @@ -1619,36 +1622,41 @@ DO JSAT=1,IJSAT ! loop over sensors YEND=YTWO//YCHAN END IF IF (INRAD==1) THEN - TZFIELD%CMNHNAME = TRIM(YBEG)//'_'//TRIM(YEND)//'rad' - TZFIELD%CUNITS = 'mw/cm-1/ster/sq.m' - TZFIELD%CCOMMENT = TRIM(YBEG)//'_'//TRIM(YEND)//' rad' + YMNHNAME = TRIM(YBEG)//'_'//TRIM(YEND)//'rad' + YUNITS = 'mw/cm-1/ster/sq.m' + YCOMMENT = TRIM(YBEG)//'_'//TRIM(YEND)//' rad' ELSE - TZFIELD%CMNHNAME = TRIM(YBEG)//'_'//TRIM(YEND)//'BT' - TZFIELD%CUNITS = 'K' - TZFIELD%CCOMMENT = TRIM(YBEG)//'_'//TRIM(YEND)//' BT' + YMNHNAME = TRIM(YBEG)//'_'//TRIM(YEND)//'BT' + YUNITS = 'K' + YCOMMENT = TRIM(YBEG)//'_'//TRIM(YEND)//' BT' ENDIF - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 2 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = TRIM( YMNHNAME ), & + CSTDNAME = '', & + CLONGNAME = TRIM( YMNHNAME ), & + CUNITS = TRIM( YUNITS ), & + CDIR = 'XY', & + CCOMMENT = TRIM( YCOMMENT ), & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) PRINT *,TZFIELD%CMNHNAME//TZFIELD%CCOMMENT, & MINVAL(ZTBTMP(:,:,JCH),ZTBTMP(:,:,JCH)/=XUNDEF), & MAXVAL(ZTBTMP(:,:,JCH),ZTBTMP(:,:,JCH)/=XUNDEF) CALL IO_Field_write(TPFILE,TZFIELD,ZTBTMP(:,:,JCH)) IF (KRTTOVINFO(3,JSAT) == 4.AND. JCH==3 ) THEN ! AMSU-B - TZFIELD%CMNHNAME = TRIM(YBEG)//'_UTH' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'percent' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = TRIM(YBEG)//'_UTH' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 2 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = TRIM(YBEG)//'_UTH', & + CSTDNAME = '', & + CLONGNAME = TRIM(YBEG)//'_UTH', & + CUNITS = 'percent', & + CDIR = 'XY', & + CCOMMENT = TRIM(YBEG)//'_UTH', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) ! UTH computation from Buehler and John JGR 2005 ZZH= 833000. ! (m) nominal altitude of the satellite zdeg_to_rad = XPI / 180.0 @@ -1720,31 +1728,33 @@ DO JSAT=1,IJSAT ! loop over sensors END DO END DO ! - TZFIELD%CMNHNAME = TRIM(YBEG)//'_'//TRIM(YEND)//'JAT' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'K K-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = TRIM(YBEG)//'_'//TRIM(YEND)//' JATEMP' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 2 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = TRIM(YBEG)//'_'//TRIM(YEND)//'JAT', & + CSTDNAME = '', & + CLONGNAME = TRIM(YBEG)//'_'//TRIM(YEND)//'JAT', & + CUNITS = 'K K-1', & + CDIR = 'XY', & + CCOMMENT = TRIM(YBEG)//'_'//TRIM(YEND)//' JATEMP', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) PRINT *,TZFIELD%CMNHNAME//TZFIELD%CCOMMENT, & MINVAL(ZTEMPK(:,:,:),ZTEMPK(:,:,:)/=XUNDEF), & MAXVAL(ZTEMPK(:,:,:),ZTEMPK(:,:,:)/=XUNDEF) CALL IO_Field_write(TPFILE,TZFIELD,ZTEMPK(:,:,:)) ! - TZFIELD%CMNHNAME = TRIM(YBEG)//'_'//TRIM(YEND)//'JAV' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'K' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = TRIM(YBEG)//'_'//TRIM(YEND)//' JAWVAP' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 2 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = TRIM(YBEG)//'_'//TRIM(YEND)//'JAV', & + CSTDNAME = '', & + CLONGNAME = TRIM(YBEG)//'_'//TRIM(YEND)//'JAV', & + CUNITS = 'K', & + CDIR = 'XY', & + CCOMMENT = TRIM(YBEG)//'_'//TRIM(YEND)//' JAWVAP', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) WHERE (ZWVAPK(:,:,:) /= XUNDEF) & ZWVAPK(:,:,:)=ZWVAPK(:,:,:)*(-0.1*PRT(:,:,:,1)) PRINT *,TZFIELD%CMNHNAME//TZFIELD%CCOMMENT, & diff --git a/src/MNH/ch_aer_reallfin.f90 b/src/MNH/ch_aer_reallfin.f90 index 99b0f876602db0bfca18dd5da3d16547cd8670a4..505f3acfae89b18fac882c45bc4a2fe83b953ac0 100644 --- a/src/MNH/ch_aer_reallfin.f90 +++ b/src/MNH/ch_aer_reallfin.f90 @@ -1,13 +1,8 @@ -!ORILAM_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!ORILAM_LIC Copyright 1994-2022 CNRS, Meteo-France and Universite Paul Sabatier !ORILAM_LIC This is part of the ORILAM software governed by the CeCILL-C licence !ORILAM_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !ORILAM_LIC for details. !----------------------------------------------------------------- -!--------------- special set of characters for RCS information -!----------------------------------------------------------------- -! $Source$ $Revision$ -! MASDEV4_7 chimie 2006/06/16 13:28:57 -!----------------------------------------------------------------- !! ######################## MODULE MODI_CH_AER_REALLFI_n !! ######################## @@ -155,8 +150,8 @@ IF (LINITPM) THEN !ZVALOC=2.304978E-9 ! value in kg/m3 (escompte values) !ZVALBC=1.E-9 ! value in kg/m3 (default values) !ZVALOC=2.E-9 ! value in kg/m3 (default values) -!ZVALBC= ZVALBC *24.47 / 12. ! conversion into ppp -!ZVALOC= ZVALOC *24.47 / 12. ! conversion into ppp +!ZVALBC= ZVALBC *24.47 / 12. ! conversion into ppv +!ZVALOC= ZVALOC *24.47 / 12. ! conversion into ppv !ZCOEFAEROBC=ZVALBC/ZSUMAEROCO !ZCOEFAEROOC=ZVALOC/ZSUMAEROCO @@ -317,7 +312,7 @@ DO JN=1,JPMODE ! ENDDO ! -!conversion into ppp +!conversion into ppv DO JJ=1,NSV_AER PSV(:,:,:,JJ) = PSV(:,:,:,JJ) / (ZDEN2MOL*PRHODREF(:,:,:)) ENDDO diff --git a/src/MNH/ch_convect_scavenging.f90 b/src/MNH/ch_convect_scavenging.f90 index a0bfccfd63a1dac9b3f8404c9819fd294e5d777c..dd8a5591799129525c4416e7f90d405a808732d2 100644 --- a/src/MNH/ch_convect_scavenging.f90 +++ b/src/MNH/ch_convect_scavenging.f90 @@ -1,7 +1,8 @@ -!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1994-2022 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 MODI_CH_CONVECT_SCAVENGING ! ###################### @@ -340,7 +341,7 @@ ENDDO ! GCHFIRSTCALL = .FALSE. ! -! Convert KH from mol/l/atm in ppp/ppp +! Convert KH from mol/l/atm in ppv/ppv ! ------------------------------------ DO JKAQ = NSV_CHEMBEG, NSV_CHEMEND ZKHC(:,:,JKAQ) = ZKH(:,:,JKAQ)*0.08205*ZT(:,:)*ZLWCC(:,:) @@ -368,7 +369,7 @@ DO JKAQ = NSV_CHEMBEG, NSV_CHEMEND ENDDO ! ! -! Convert KHI from cm3(air)/cm3(ice) in ppp/ppp +! Convert KHI from cm3(air)/cm3(ice) in ppv/ppv ! --------------------------------------------- DO JKAQ = NSV_CHEMBEG, NSV_CHEMEND IF (CNAMES(JKAQ-NSV_CHEMBEG+1)=='HNO3') THEN diff --git a/src/MNH/ch_emission_flux0d.f90 b/src/MNH/ch_emission_flux0d.f90 index 540a03306b94eb4c9c1501f269d4d09e6e87a004..74b84f6d413745e5707a5cfb811f65be0bf56e5a 100644 --- a/src/MNH/ch_emission_flux0d.f90 +++ b/src/MNH/ch_emission_flux0d.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1999-2019 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1999-2022 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. @@ -13,7 +13,7 @@ USE MODD_CH_M9_n, ONLY: NEQ IMPLICIT NONE REAL, INTENT(IN) :: PTIME ! time of simulation in sec UTC ! (counting from midnight) -REAL, DIMENSION(NEQ), INTENT(OUT) :: PFLUX ! emission flux in ppp*m/s +REAL, DIMENSION(NEQ), INTENT(OUT) :: PFLUX ! emission flux in ppv*m/s CHARACTER(len=*), INTENT(IN) :: HINPUTFILE ! name of the input file INTEGER, INTENT(IN) :: KLUOUT ! output listing channel INTEGER, INTENT(IN) :: KVERB ! verbosity level @@ -55,10 +55,10 @@ END MODULE MODI_CH_EMISSION_FLUX0D !! where the unit identifier [MIX|CON|MOL] indicates whether !! the flux is given as !! CON: molecules/cm2/s -!! MIX: ppp*m/s +!! MIX: ppv*m/s !! MOL: microMol/m2/day !! (assuming standard pressure and temperature in the conversion) -!! The returned flux is given in ppp*m/s, that is standard MesoNH +!! The returned flux is given in ppv*m/s, that is standard MesoNH !! units so that no conversion is to be applied when introducing !! the emission flux in the 3-D model. !! @@ -96,7 +96,7 @@ IMPLICIT NONE REAL, INTENT(IN) :: PTIME ! time of simulation in sec UTC ! (counting from midnight) -REAL, DIMENSION(NEQ), INTENT(OUT) :: PFLUX ! emission flux in ppp*m/s +REAL, DIMENSION(NEQ), INTENT(OUT) :: PFLUX ! emission flux in ppv*m/s CHARACTER(len=*), INTENT(IN) :: HINPUTFILE ! name of the input file INTEGER, INTENT(IN) :: KLUOUT ! output listing channel INTEGER, INTENT(IN) :: KVERB ! verbosity level @@ -207,13 +207,13 @@ IF (LSFIRSTCALL) THEN ! ! determine the conversion factor SELECT CASE (YUNIT) - CASE ('MIX') ! flux given ppp*m/s, no conversion required + CASE ('MIX') ! flux given ppv*m/s, no conversion required ZCONVERSION = 1.0 CASE ('CON') ! flux given in molecules/cm2/s - ! where 1 molecule/cm2/s = (224.14/6.022136E23) ppp*m/s + ! where 1 molecule/cm2/s = (224.14/6.022136E23) ppv*m/s ZCONVERSION = (224.14/6.022136E23) CASE ('MOL') ! flux given in microMol/m2/day - ! where 1 microMol/m2/day = (22.414/86.400)*1E-12 ppp*m/s + ! where 1 microMol/m2/day = (22.414/86.400)*1E-12 ppv*m/s ZCONVERSION = (22.414/86.400)*1E-12 CASE DEFAULT call Print_msg( NVERB_FATAL, 'GEN', 'CH_EMISSION_FLUX0D', 'unknow conversion factor: '//trim(YUNIT) ) diff --git a/src/MNH/ch_field_valuen.f90 b/src/MNH/ch_field_valuen.f90 index 0693c28a24b13c14162aebc939e5b5d80508adcc..0dcd5670a826ecff442ae53b74afb07366a5f13c 100644 --- a/src/MNH/ch_field_valuen.f90 +++ b/src/MNH/ch_field_valuen.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1995-2019 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1995-2022 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. @@ -228,7 +228,7 @@ firstcall: IF (GSFIRSTCALL) THEN CALL CH_OPEN_INPUT(CCHEM_INPUT_FILE, "NORMINIT", TZFILE, KLUOUT, KVERB) ICHANNEL = TZFILE%NLU ! -! read units for initial data (may be "CON" for molec./cm3 or "MIX" for ppp) +! read units for initial data (may be "CON" for molec./cm3 or "MIX" for ppv) READ(ICHANNEL,"(A)") HUNIT IF (HUNIT .EQ. "CON") THEN IF (KVERB >= 5) THEN diff --git a/src/MNH/ch_model0d.f90 b/src/MNH/ch_model0d.f90 index c2b4fb45727db9663e58f0c26b1a9bf6a853f702..26ff9fe185dc6ffae01f86a2ff48f17528fefe27 100644 --- a/src/MNH/ch_model0d.f90 +++ b/src/MNH/ch_model0d.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1995-2019 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1995-2022 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. @@ -309,10 +309,10 @@ IF (NVERB >= 5) THEN END IF END IF ! -ZCONC(1,:) = ZCONC(1,:) * ZDEN2MOL * ZRHODREF(1,1,1) ! convert ppp to molec.cm-3 +ZCONC(1,:) = ZCONC(1,:) * ZDEN2MOL * ZRHODREF(1,1,1) ! convert ppv to molec.cm-3 ZNEWCONC(1,:) = ZCONC(1,:) IF (LORILAM) THEN -ZAERO(1,:) = ZAERO(1,:) * ZDEN2MOL * ZRHODREF(1,1,1) ! convert ppp to molec.cm-3 +ZAERO(1,:) = ZAERO(1,:) * ZDEN2MOL * ZRHODREF(1,1,1) ! convert ppv to molec.cm-3 ZNEWAERO(1,:) = ZAERO(1,:) END IF !* 1.5 initialize data for jvalues @@ -468,7 +468,7 @@ IF (LORILAM) THEN XDP(:,:) = 2.E-6 * ZRG0(:,:) END IF - ! ZCONC(1,:) = ZCONC(1,:) * ZDEN2MOL * ZRHODREF(1,1,1) !convert ppp to molec.cm-3 + ! ZCONC(1,:) = ZCONC(1,:) * ZDEN2MOL * ZRHODREF(1,1,1) !convert ppv to molec.cm-3 CALL CH_SET_RATES(XTSIMUL,ZCONC,TZM,1,6,NVERB,1,NEQ) TZK%MODELLEVEL = 1 @@ -501,10 +501,10 @@ CALL CH_UPDATE_JVALUES(6, ZZENITH, ZRT, & write_to_disk : IF (XTSIMUL >= XTNEXTOUT) THEN ZCONC(1,:) = ZCONC(1,:)*1.E9 / (ZDEN2MOL * ZRHODREF(1,1,1)) ! convert molec.cm-3 to ppb - IF (LORILAM) ZAERO(1,:) = ZAERO(1,:) / (ZDEN2MOL * ZRHODREF(1,1,1)) ! convert molec.cm-3 to ppp + IF (LORILAM) ZAERO(1,:) = ZAERO(1,:) / (ZDEN2MOL * ZRHODREF(1,1,1)) ! convert molec.cm-3 to ppv CALL CH_OUTPUT(ZCONC,ZAERO, ZMI, TZM, 1, 1) ZCONC(1,:) = ZCONC(1,:)*1.E-9 * (ZDEN2MOL * ZRHODREF(1,1,1)) ! convert ppb to molec.cm-3 - IF (LORILAM) ZAERO(1,:) = ZAERO(1,:) * (ZDEN2MOL * ZRHODREF(1,1,1)) ! convert ppp to molec.cm-3 + IF (LORILAM) ZAERO(1,:) = ZAERO(1,:) * (ZDEN2MOL * ZRHODREF(1,1,1)) ! convert ppv to molec.cm-3 XTNEXTOUT = XTSIMUL + XDTOUT ENDIF write_to_disk @@ -559,8 +559,8 @@ ENDDO time_loop !* 4.1 write final result to disk (restart file) ! ! convert molec.cm-3 to ppb -ZCONC(1,:) = ZCONC(1,:) / (ZDEN2MOL * ZRHODREF(1,1,1)) ! convert molec.cm-3 to ppp -IF (LORILAM) ZAERO(1,:) = ZAERO(1,:) / (ZDEN2MOL * ZRHODREF(1,1,1)) ! convert molec.cm-3 to ppp +ZCONC(1,:) = ZCONC(1,:) / (ZDEN2MOL * ZRHODREF(1,1,1)) ! convert molec.cm-3 to ppv +IF (LORILAM) ZAERO(1,:) = ZAERO(1,:) / (ZDEN2MOL * ZRHODREF(1,1,1)) ! convert molec.cm-3 to ppv CALL CH_WRITE_CHEM(ZCONC(1,:), ZAERO(1,:), ZRHODREF(:,1,1), COUTFILE) ! !* 4.2 finish diff --git a/src/MNH/ch_monitorn.f90 b/src/MNH/ch_monitorn.f90 index eb8db26c60d91dfa3c2354d326b3cb6039346b8a..b225ac270ce8058284c1c08224e26e2484159e55 100644 --- a/src/MNH/ch_monitorn.f90 +++ b/src/MNH/ch_monitorn.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1995-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1995-2022 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. @@ -628,7 +628,7 @@ IF (LORILAM) THEN ! END IF ! -!* 1.4 compute conversion factor ppp/m3 --> molec/cm3 +!* 1.4 compute conversion factor ppv/m3 --> molec/cm3 ! ZDEN2MOL = 1E-6 * XAVOGADRO / XMD ! @@ -947,7 +947,7 @@ DO JL=1,ISVECNMASK IF (SIZE(XRT,4) .GE. 2) ZRC(JM+1) = XRT(JI, JJ, JK, 2) !Molar mass (kg/kg) ZMI(JM+1,:) = XMI(JI, JJ, JK, :) - !Moments (ppp) + !Moments (ppv) ZM(JM+1,:) = XM3D(JI,JJ,JK,:) ZLNSIG(JM+1,:) = LOG(XSIG3D(JI,JJ,JK,:)) ZRG(JM+1,:) = XRG3D(JI,JJ,JK,:) diff --git a/src/MNH/ch_read_chem.f90 b/src/MNH/ch_read_chem.f90 index bd3ed06dfc5da4908161c7f07ede175eaa09849e..29a166440fe35c34c029548a5874883605945ddc 100644 --- a/src/MNH/ch_read_chem.f90 +++ b/src/MNH/ch_read_chem.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1995-2019 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1995-2022 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. @@ -147,7 +147,7 @@ ELSE END IF END DO -!Conversion ppb to ppp +!Conversion ppb to ppv PCONC(:) = PCONC(:) * 1E-9 IF (LORILAM) THEN DO JI = 1, SIZE(PAERO,1) @@ -165,7 +165,7 @@ IF (LORILAM) THEN ' /= '//trim(YVARNAME) ) END IF END DO -!Conversion microgram/m3 to ppp +!Conversion microgram/m3 to ppv ZMD = 28.9644E-3 ! Constants initialization ZMI(:) = 250. diff --git a/src/MNH/ch_surface0d.f90 b/src/MNH/ch_surface0d.f90 index ce3bab6c4e23a9647273ec2e612fc1a38aaef8f8..8247ae0b790b360aac9a4f193e840a98555dc4fa 100644 --- a/src/MNH/ch_surface0d.f90 +++ b/src/MNH/ch_surface0d.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1999-2019 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1999-2022 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. @@ -132,8 +132,8 @@ CALL CH_EMISSION_FLUX0D(PTSIMUL, ZEMIS, "CHCONTROL1.nam", 6, NVERB) ! convert m2 to cm2, days to seconds and Mole to molecules ! ZEMIS(1:KEQ) = (6.022136E23/1E4/86400.)*ZEMIS(1:KEQ) ! -! convert ppp*m/s to molecules/cm2/s -! based on 1 ppp*m/s = (Na/Vmol)*m/s = (6.022136E23/22.414E-3) molecules/m2/s +! convert ppv*m/s to molecules/cm2/s +! based on 1 ppv*m/s = (Na/Vmol)*m/s = (6.022136E23/22.414E-3) molecules/m2/s ZEMIS(1:KEQ) = (6.022136E23/224.14)*ZEMIS(1:KEQ) ! !* 2. CALCULATE DEPOSITION FLUXES WITH WESLEY @@ -153,7 +153,7 @@ ZSVT(1,1,1,:) = PCONC(:) ! scalar variables at t ! ZHU_PATCH,ZPSN_PATCH) !UPG ! -! results in ZSFSV(1,1,:) ! flux of scalar variables (ppp*m/s) +! results in ZSFSV(1,1,:) ! flux of scalar variables (ppv*m/s) ! but we do not use them here, we rather take the deposition velocity ! directly from the module (variable XVDEPT) ! diff --git a/src/MNH/ch_write_chem.f90 b/src/MNH/ch_write_chem.f90 index ecc8a4b1e26915317b1cb535695e4bdba29b041b..a3c05fd66d24c713d242f84c5063527fc42bcecd 100644 --- a/src/MNH/ch_write_chem.f90 +++ b/src/MNH/ch_write_chem.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1995-2019 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1995-2022 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. @@ -93,10 +93,10 @@ OPEN(NEWUNIT = ILU, & STATUS = 'UNKNOWN' ) ! DO JI = 1, NEQ - WRITE(UNIT=ILU,FMT='(3A,E20.8)') "'", CNAMES(JI), "' ", PCONC(JI)*1.E9 ! convert ppp to ppb + WRITE(UNIT=ILU,FMT='(3A,E20.8)') "'", CNAMES(JI), "' ", PCONC(JI)*1.E9 ! convert ppv to ppb ENDDO IF (LORILAM) THEN -!Conversion ppp to microgram/m3 +!Conversion ppv to microgram/m3 ZMD = 28.9644E-3 ! Constants initialization ZMI(:) = 250. diff --git a/src/MNH/compare_dad.f90 b/src/MNH/compare_dad.f90 index fe145cee49c3dc81433344f9e26cebddcc46f57c..983eb5188da425017d880f728576aac6e0ece1e5 100644 --- a/src/MNH/compare_dad.f90 +++ b/src/MNH/compare_dad.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2004-2020 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2004-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. @@ -66,7 +66,7 @@ END MODULE MODI_COMPARE_DAD ! ! USE MODD_CONF -use modd_field, only: tfielddata, tfieldlist +use modd_field, only: tfieldmetadata, tfieldlist USE MODD_IO, ONLY: TFILEDATA USE MODD_LUNIT_n, ONLY: TLUOUT USE MODD_PARAMETERS, ONLY: JPHEXT, JPVEXT, NMNHNAMELGTMAX @@ -109,7 +109,7 @@ INTEGER :: IIMAX_1,IJMAX_1,IKMAX_1 INTEGER :: IIMAX_2,IJMAX_2,IKMAX_2 ! REAL :: ZLATORI, ZLONORI, ZXHATM, ZYHATM -TYPE(TFIELDDATA) :: TZFIELD +TYPE(TFIELDMETADATA) :: TZFIELD TYPE(TFILEDATA),POINTER :: TZDADINIFILE => NULL() TYPE(TFILEDATA),POINTER :: TZDADSPAFILE => NULL() !------------------------------------------------------------------------------- @@ -170,12 +170,12 @@ IF (.NOT.LCARTESIAN) THEN ! IF (TZDADINIFILE%NMNHVERSION(1)<4 .OR. (TZDADINIFILE%NMNHVERSION(1)==4 .AND. TZDADINIFILE%NMNHVERSION(2)<=5) ) THEN CALL FIND_FIELD_ID_FROM_MNHNAME('LONORI',IID,IRESP) - TZFIELD = TFIELDLIST(IID) + TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) TZFIELD%CMNHNAME = 'LONOR' CALL IO_Field_read(TZDADINIFILE,TZFIELD,ZLONORI_1) ! CALL FIND_FIELD_ID_FROM_MNHNAME('LATORI',IID,IRESP) - TZFIELD = TFIELDLIST(IID) + TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) TZFIELD%CMNHNAME = 'LATOR' CALL IO_Field_read(TZDADINIFILE,TZFIELD,ZLATORI_1) ! @@ -226,12 +226,12 @@ IF (.NOT.LCARTESIAN) THEN ! IF (TZDADSPAFILE%NMNHVERSION(1)<4 .OR. (TZDADSPAFILE%NMNHVERSION(1)==4 .AND. TZDADSPAFILE%NMNHVERSION(2)<=5)) THEN CALL FIND_FIELD_ID_FROM_MNHNAME('LONORI',IID,IRESP) - TZFIELD = TFIELDLIST(IID) + TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) TZFIELD%CMNHNAME = 'LONOR' CALL IO_Field_read(TZDADSPAFILE,TZFIELD,ZLONORI_2) ! CALL FIND_FIELD_ID_FROM_MNHNAME('LATORI',IID,IRESP) - TZFIELD = TFIELDLIST(IID) + TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) TZFIELD%CMNHNAME = 'LATOR' CALL IO_Field_read(TZDADSPAFILE,TZFIELD,ZLATORI_2) ! diff --git a/src/MNH/compute_r00.f90 b/src/MNH/compute_r00.f90 index 692fb3a1e0d1b8c90710f2d086f5bd37565c2962..727b230ffd52a9b7afa1b20d5748bc45e34876b4 100644 --- a/src/MNH/compute_r00.f90 +++ b/src/MNH/compute_r00.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1994-2020 CNRS, Meteo-France and Universite Paul Sabatier +!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. @@ -65,7 +65,7 @@ END MODULE MODI_COMPUTE_R00 ! USE MODD_CONF USE MODD_GRID_n -use modd_field, only: tfielddata, TYPEREAL +use modd_field, only: tfieldmetadata, TYPEREAL USE MODD_FIELD_n USE MODD_IO, ONLY: TFILEDATA USE MODD_LUNIT_n @@ -106,6 +106,7 @@ REAL, ALLOCATABLE, DIMENSION(:,:,:):: ZRV0 ! same fields ! for Rv as for the coordinates of the origin REAL, ALLOCATABLE, DIMENSION(:,:,:):: ZWORK1,ZWORK2,ZWORK3 TYPE(DATE_TIME) :: TDTCUR_START +CHARACTER(LEN=NMNHNAMELGTMAX) :: YMNHNAME CHARACTER(LEN=24) :: YDATE INTEGER :: IHOUR, IMINUTE REAL :: ZSECOND, ZREMAIN @@ -113,7 +114,7 @@ LOGICAL :: GSTART INTEGER :: INBR_START REAL :: ZXMAX,ZYMAX,ZZMAX ! domain extrema INTEGER, DIMENSION(100) :: NBRFILES -TYPE(TFIELDDATA) :: TZFIELD +TYPE(TFIELDMETADATA) :: TZFIELD TYPE(TFILEDATA),POINTER :: TZTRACFILE ! !------------------------------------------------------------------------------- @@ -275,43 +276,49 @@ DO JFILECUR=1,NFILES ! IF (GSTART) THEN PRINT *,'INBR_START',INBR_START,' NBRFILES(JFILECUR)',NBRFILES(JFILECUR) - WRITE(TZFIELD%CMNHNAME,'(A2,I2.2)')'X0',INBR_START - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'km' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME)//YDATE + WRITE(YMNHNAME,'(A2,I2.2)')'X0',INBR_START + TZFIELD = TFIELDMETADATA( & + CMNHNAME = TRIM( YMNHNAME ), & + CSTDNAME = '', & + CLONGNAME = TRIM( YMNHNAME ), & + CUNITS = 'km', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_'//TRIM(YMNHNAME)//YDATE, & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) PRINT *,'YCOMMENT = ',TRIM(TZFIELD%CCOMMENT) - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. CALL IO_Field_write(TPFILE,TZFIELD,ZX00(:,:,:)) ! - WRITE(TZFIELD%CMNHNAME,'(A2,I2.2)')'Y0',INBR_START - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'km' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME)//YDATE + WRITE(YMNHNAME,'(A2,I2.2)')'Y0',INBR_START + TZFIELD = TFIELDMETADATA( & + CMNHNAME = TRIM( YMNHNAME ), & + CSTDNAME = '', & + CLONGNAME = TRIM(TZFIELD%CMNHNAME), & + CUNITS = 'km', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_'//TRIM(YMNHNAME)//YDATE, & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) PRINT *,'YCOMMENT = ',TRIM(TZFIELD%CCOMMENT) - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. CALL IO_Field_write(TPFILE,TZFIELD,ZY00(:,:,:)) ! - WRITE(TZFIELD%CMNHNAME,'(A2,I2.2)')'Z0',INBR_START - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'km' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME)//YDATE + WRITE(YMNHNAME,'(A2,I2.2)')'Z0',INBR_START + TZFIELD = TFIELDMETADATA( & + CMNHNAME = TRIM( YMNHNAME ), & + CSTDNAME = '', & + CLONGNAME = TRIM( YMNHNAME ), & + CUNITS = 'km', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_'//TRIM(YMNHNAME)//YDATE, & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) PRINT *,'YCOMMENT = ',TRIM(TZFIELD%CCOMMENT) - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. CALL IO_Field_write(TPFILE,TZFIELD,ZZ00(:,:,:)) END IF ! @@ -330,56 +337,60 @@ DO JFILECUR=1,NFILES ! IF (GSTART) THEN ! - WRITE(TZFIELD%CMNHNAME,'(A3,I2.2)')'TH0',INBR_START - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'K' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME)//YDATE + WRITE(YMNHNAME,'(A3,I2.2)')'TH0',INBR_START + TZFIELD = TFIELDMETADATA( & + CMNHNAME = TRIM( YMNHNAME ), & + CSTDNAME = '', & + CLONGNAME = TRIM( YMNHNAME ), & + CUNITS = 'K', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_'//TRIM(YMNHNAME)//YDATE, & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) PRINT *,'YCOMMENT = ',TRIM(TZFIELD%CCOMMENT) - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. CALL IO_Field_write(TPFILE,TZFIELD,ZWORK1(:,:,:)) ! - WRITE(TZFIELD%CMNHNAME,'(A3,I2.2)')'RV0',INBR_START - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'g kg-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME)//YDATE + WRITE(YMNHNAME,'(A3,I2.2)')'RV0',INBR_START + TZFIELD = TFIELDMETADATA( & + CMNHNAME = TRIM( YMNHNAME ), & + CSTDNAME = '', & + CLONGNAME = TRIM( YMNHNAME ), & + CUNITS = 'g kg-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_'//TRIM(YMNHNAME)//YDATE, & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) PRINT *,'YCOMMENT = ',TRIM(TZFIELD%CCOMMENT) - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. CALL IO_Field_write(TPFILE,TZFIELD,ZWORK2(:,:,:)) ENDIF !* 4.4 compute the origin of the particules using one more segment ! IF (JFILECUR /= NFILES) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'm' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = '' !Unknown comment - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - TZFIELD%CMNHNAME = 'LGXT' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) + TZFIELD = TFIELDMETADATA(& + CMNHNAME = 'LGXT', & + CSTDNAME = '', & + CLONGNAME = 'LGXT', & + CUNITS = 'm', & + CDIR = 'XY', & + CCOMMENT = '', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_read(TZTRACFILE,TZFIELD,ZX0) ZX0(:,:,:)=ZX0(:,:,:)*1.E-3 ! ZX0 in km ! TZFIELD%CMNHNAME = 'LGYT' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) + TZFIELD%CLONGNAME = 'LGYT' CALL IO_Field_read(TZTRACFILE,TZFIELD,ZY0) ZY0(:,:,:)=ZY0(:,:,:)*1.E-3 ! ZY0 in km ! TZFIELD%CMNHNAME = 'LGZT' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) + TZFIELD%CLONGNAME = 'LGZT' CALL IO_Field_read(TZTRACFILE,TZFIELD,ZZ0) ZZ0(:,:,:)=ZZ0(:,:,:)*1.E-3 ! ZZ0 in km ! diff --git a/src/MNH/conjgrad.f90 b/src/MNH/conjgrad.f90 index 9adf9ed36ed2cb0a64ca545ba5c9c378d35b5224..63c3cad9e3f9c5f890deb642eccb0e2c44cb3eb2 100644 --- a/src/MNH/conjgrad.f90 +++ b/src/MNH/conjgrad.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1994-2023 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. @@ -23,12 +23,12 @@ IMPLICIT NONE CHARACTER (LEN=4), DIMENSION(2), INTENT(IN) :: HLBCX ! x-direction LBC type CHARACTER (LEN=4), DIMENSION(2), INTENT(IN) :: HLBCY ! y-direction LBC type ! - ! Metric coefficients: -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX ! d*xx -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY ! d*yy -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZX ! d*zx -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZY ! d*zy -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! d*zz + ! Metric coefficients: +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX ! d*xx +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY ! d*yy +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDZX ! d*zx +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDZY ! d*zy +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! d*zz ! REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! density of reference * J REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHETAV ! virtual potential temp. at time t @@ -149,12 +149,12 @@ IMPLICIT NONE CHARACTER (LEN=4), DIMENSION(2), INTENT(IN) :: HLBCX ! x-direction LBC type CHARACTER (LEN=4), DIMENSION(2), INTENT(IN) :: HLBCY ! y-direction LBC type ! - ! Metric coefficients: -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX ! d*xx -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY ! d*yy -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZX ! d*zx -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZY ! d*zy -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! d*zz + ! Metric coefficients: +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX ! d*xx +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY ! d*yy +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDZX ! d*zx +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDZY ! d*zy +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! d*zz ! REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! density of reference * J REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHETAV ! virtual potential temp. at time t diff --git a/src/MNH/conresol.f90 b/src/MNH/conresol.f90 index c0e103e9a6b06282ccc14e37f90535404b147340..8b33d0dcc715d728dd404fa279ed51cd1cb6a0e2 100644 --- a/src/MNH/conresol.f90 +++ b/src/MNH/conresol.f90 @@ -1,13 +1,8 @@ -!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1999-2023 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. !----------------------------------------------------------------- -!--------------- special set of characters for RCS information -!----------------------------------------------------------------- -! $Source$ $Revision$ -! MASDEV4_7 solver 2006/05/18 13:07:25 -!----------------------------------------------------------------- ! #################### MODULE MODI_CONRESOL ! #################### @@ -23,12 +18,12 @@ IMPLICIT NONE CHARACTER (LEN=4), DIMENSION(2), INTENT(IN) :: HLBCX ! x-direction LBC type CHARACTER (LEN=4), DIMENSION(2), INTENT(IN) :: HLBCY ! y-direction LBC type ! - ! Metric coefficients: -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX ! d*xx -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY ! d*yy -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZX ! d*zx -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZY ! d*zy -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! d*zz + ! Metric coefficients: +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX ! d*xx +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY ! d*yy +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDZX ! d*zx +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDZY ! d*zy +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! d*zz ! REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! density of reference * J REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHETAV ! virtual pot. temp. at time t @@ -149,12 +144,12 @@ IMPLICIT NONE CHARACTER (LEN=4), DIMENSION(2), INTENT(IN) :: HLBCX ! x-direction LBC type CHARACTER (LEN=4), DIMENSION(2), INTENT(IN) :: HLBCY ! y-direction LBC type ! - ! Metric coefficients: -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX ! d*xx -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY ! d*yy -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZX ! d*zx -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZY ! d*zy -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! d*zz + ! Metric coefficients: +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX ! d*xx +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY ! d*yy +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDZX ! d*zx +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDZY ! d*zy +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! d*zz ! REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! density of reference * J REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHETAV ! virtual pot. temp. at time t diff --git a/src/MNH/conresolz.f90 b/src/MNH/conresolz.f90 index 3624bb2eb58b095c96245e1894b2ad8f4f9c71e8..358b78ea7c1b2b06f9b371d1c0c62e46c1f49828 100644 --- a/src/MNH/conresolz.f90 +++ b/src/MNH/conresolz.f90 @@ -1,14 +1,8 @@ -!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1999-2023 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. !----------------------------------------------------------------- -!--------------- special set of characters for RCS information -!----------------------------------------------------------------- -! $Source$ $Revision$ $Date$ -!----------------------------------------------------------------- -!----------------------------------------------------------------- -!----------------------------------------------------------------- ! #################### MODULE MODI_CONRESOLZ ! #################### @@ -26,12 +20,12 @@ IMPLICIT NONE CHARACTER (LEN=4), DIMENSION(2), INTENT(IN) :: HLBCX ! x-direction LBC type CHARACTER (LEN=4), DIMENSION(2), INTENT(IN) :: HLBCY ! y-direction LBC type ! - ! Metric coefficients: -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX ! d*xx -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY ! d*yy -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZX ! d*zx -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZY ! d*zy -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! d*zz + ! Metric coefficients: +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX ! d*xx +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY ! d*yy +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDZX ! d*zx +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDZY ! d*zy +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! d*zz ! REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! density of reference * J REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHETAV ! virtual pot. temp. at time t @@ -160,12 +154,12 @@ IMPLICIT NONE CHARACTER (LEN=4), DIMENSION(2), INTENT(IN) :: HLBCX ! x-direction LBC type CHARACTER (LEN=4), DIMENSION(2), INTENT(IN) :: HLBCY ! y-direction LBC type ! - ! Metric coefficients: -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX ! d*xx -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY ! d*yy -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZX ! d*zx -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZY ! d*zy -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! d*zz + ! Metric coefficients: +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX ! d*xx +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY ! d*yy +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDZX ! d*zx +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDZY ! d*zy +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! d*zz ! REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! density of reference * J REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHETAV ! virtual pot. temp. at time t diff --git a/src/MNH/contrav.f90 b/src/MNH/contrav.f90 index c890435f523160d94c0da938e847bf36c21b1da6..44e3b3333227f5cfc3605c79930d60885a1c9422 100644 --- a/src/MNH/contrav.f90 +++ b/src/MNH/contrav.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1994-2023 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. @@ -21,8 +21,8 @@ REAL, DIMENSION(:,:,:), INTENT(IN) :: PRWT ! Cartesian comp along z REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX ! Metric coefficients REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY ! Metric coefficients REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! Metric coefficients -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZX ! Metric coefficients -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZY ! Metric coefficients +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDZX ! Metric coefficients +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDZY ! Metric coefficients REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRUCT ! Contrav comp along x-bar REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRVCT ! Contrav comp along y-bar REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRWCT ! Contrav comp along z-bar @@ -127,8 +127,8 @@ REAL, DIMENSION(:,:,:), INTENT(IN) :: PRWT ! Cartesian comp along z REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX ! Metric coefficients REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY ! Metric coefficients REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! Metric coefficients -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZX ! Metric coefficients -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZY ! Metric coefficients +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDZX ! Metric coefficients +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDZY ! Metric coefficients ! ! REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRUCT ! Contrav comp along x-bar diff --git a/src/MNH/default_desfmn.f90 b/src/MNH/default_desfmn.f90 index ade773022d23c3b0a5a10956b158429b0fde831d..a6f463fda595639df6763d46b1cc1fda568d3f66 100644 --- a/src/MNH/default_desfmn.f90 +++ b/src/MNH/default_desfmn.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1994-2022 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. @@ -221,7 +221,8 @@ END MODULE MODI_DEFAULT_DESFM_n ! Q. Rodier 07/2021: modify XPOND=1 ! A. Costes 12/2021: Blaze fire model ! C. Barthe 03/2022: add CIBU and RDSF options in LIMA -! Delbeke/Vie 03/2022 : KHKO option in LIMA +! Delbeke/Vie 03/2022: KHKO option in LIMA +! P. Wautelet 27/04/2022: add namelist for profilers !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -273,6 +274,7 @@ USE MODD_EOL_MAIN USE MODD_EOL_ADNR USE MODD_EOL_ALM USE MODD_EOL_SHARED_IO +USE MODD_ALLPROFILER_n USE MODD_ALLSTATION_n ! ! @@ -599,7 +601,21 @@ LTIPLOSSG = .TRUE. LTECOUTPTS = .FALSE. ! !------------------------------------------------------------------------------ -!* 10.e SET DEFAULT VALUES FOR MODD_ALLSTATION_n : +!* 10.e SET DEFAULT VALUES FOR MODD_ALLPROFILER_n : +! ---------------------------------- +! +NNUMB_PROF = 0 +XSTEP_PROF = 60.0 +XX_PROF(:) = XUNDEF +XY_PROF(:) = XUNDEF +XZ_PROF(:) = XUNDEF +XLAT_PROF(:) = XUNDEF +XLON_PROF(:) = XUNDEF +CNAME_PROF(:) = '' +CFILE_PROF = 'NO_INPUT_CSV' +! LDIAG_SURFRAD = .TRUE. +!------------------------------------------------------------------------------ +!* 10.f SET DEFAULT VALUES FOR MODD_ALLSTATION_n : ! ---------------------------------- ! NNUMB_STAT = 0 @@ -610,7 +626,6 @@ XZ_STAT(:) = XUNDEF XLAT_STAT(:) = XUNDEF XLON_STAT(:) = XUNDEF CNAME_STAT(:) = '' -CTYPE_STAT(:) = '' CFILE_STAT = 'NO_INPUT_CSV' LDIAG_SURFRAD = .TRUE. ! diff --git a/src/MNH/diag.f90 b/src/MNH/diag.f90 index 4bfd2dc5e8e8453068b95e8dc0ae6f41c16faa3e..abc7599766929e2d08e88a4f57f17d12cca8032b 100644 --- a/src/MNH/diag.f90 +++ b/src/MNH/diag.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1999-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1999-2022 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. @@ -91,7 +91,7 @@ ! P. Wautelet 07/02/2019: force TYPE to a known value for IO_File_add2list ! P. Wautelet 11/02/2019: added missing use of MODI_CH_MONITOR_n ! P. Wautelet 28/03/2019: use MNHTIME for time measurement variables -! P. Wautelet 26/07/2019: bug correction: deallocate of zsea and ztown done too early +! P. Wautelet 26/07/2019: bug correction: deallocate of zsea done too early ! P. Wautelet 13/09/2019: budget: simplify and modernize date/time management ! P. Wautelet 06/07/2021: use FINALIZE_MNH !------------------------------------------------------------------------------- @@ -141,6 +141,7 @@ USE MODD_TIME_n USE MODD_TURB_n USE MODD_VAR_ll ! +USE MODE_AIRCRAFT_BALLOON USE MODE_DATETIME USE MODE_FINALIZE_MNH, only: FINALIZE_MNH USE MODE_IO_FILE, only: IO_File_close, IO_File_open @@ -156,9 +157,9 @@ USE MODE_MODELN_HANDLER USE MODE_MSG USE MODE_POS USE MODE_TIME +USE MODE_WRITE_AIRCRAFT_BALLOON use mode_write_lfifmn_fordiachro_n, only: WRITE_LFIFMN_FORDIACHRO_n ! -USE MODI_AIRCRAFT_BALLOON USE MODI_CH_MONITOR_n USE MODI_COMPUTE_R00 USE MODI_DIAG_SURF_ATM_N @@ -166,7 +167,6 @@ USE MODI_INIT_MNH USE MODI_MNHGET_SURF_PARAM_n USE MODI_PHYS_PARAM_n USE MODI_VERSION -USE MODI_WRITE_AIRCRAFT_BALLOON USE MODI_WRITE_DIAG_SURF_ATM_N USE MODI_WRITE_LFIFM1_FOR_DIAG USE MODI_WRITE_LFIFM1_FOR_DIAG_SUPP @@ -205,7 +205,7 @@ LOGICAL:: GCLOUD_ONLY ! conditionnal radiation computations for ! the only cloudy columns ! INTEGER :: IIU, IJU, IKU -REAL, DIMENSION(:,:),ALLOCATABLE :: ZSEA,ZTOWN +REAL, DIMENSION(:,:),ALLOCATABLE :: ZSEA REAL, DIMENSION(:,:,:,:),ALLOCATABLE :: ZWETDEPAER ! TYPE(TFILEDATA),POINTER :: TZDIACFILE => NULL() @@ -547,21 +547,17 @@ IF ( LAIRCRAFT_BALLOON ) THEN TDTCUR = TXDTBAL !TDTCUR is used in AIRCRAFT_BALLOON ! ALLOCATE (ZSEA(SIZE(XRHODJ,1),SIZE(XRHODJ,2))) - ALLOCATE (ZTOWN(SIZE(XRHODJ,1),SIZE(XRHODJ,2))) ZSEA(:,:) = 0. - ZTOWN(:,:)= 0. - CALL MNHGET_SURF_PARAM_n (PSEA=ZSEA(:,:),PTOWN=ZTOWN(:,:)) - DO ISTEPBAL=1,NTIME_AIRCRAFT_BALLOON,INT(XSTEP_AIRCRAFT_BALLOON) - CALL AIRCRAFT_BALLOON(XSTEP_AIRCRAFT_BALLOON, & - XXHAT, XYHAT, XZZ, XMAP, XLONORI, XLATORI, & - XUT, XVT, XWT, XPABST, XTHT, XRT, XSVT, & - XTKET, XTSRAD, XRHODREF,XCIT,ZSEA) + CALL MNHGET_SURF_PARAM_n (PSEA=ZSEA(:,:)) + DO ISTEPBAL = 1, NTIME_AIRCRAFT_BALLOON, INT(XSTEP_AIRCRAFT_BALLOON) + CALL AIRCRAFT_BALLOON( XSTEP_AIRCRAFT_BALLOON, XZZ, XMAP, XLONORI, XLATORI, XUT, XVT, XWT, & + XPABST, XTHT, XRT, XSVT, XTKET, XTSRAD, XRHODREF, XCIT, ZSEA ) TXDTBAL%xtime = TXDTBAL%xtime + XSTEP_AIRCRAFT_BALLOON CALL DATETIME_CORRECTDATE(TXDTBAL) TDTCUR = TXDTBAL !TDTCUR is used in AIRCRAFT_BALLOON - ENDDO - DEALLOCATE (ZSEA,ZTOWN) + END DO + DEALLOCATE (ZSEA) ! TDTCUR = TPDTCUR_SAVE ! diff --git a/src/MNH/eddy_fluxn.f90 b/src/MNH/eddy_fluxn.f90 index ed52def268d0ea872591a158078514d3fef3316e..dc20500dcd9390c6bd54a6847fbdf54ea661b953 100644 --- a/src/MNH/eddy_fluxn.f90 +++ b/src/MNH/eddy_fluxn.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2004-2020 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2004-2022 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. @@ -302,8 +302,8 @@ DO JJ=IJB,IJE ! ZKYY(JI,JJ,JK) = & (ZA0(JI) * XG*ZNDW(JI,JJ)/(ZTHM_W(JI,JJ)*(ZCORIOZ(JI,JJ,JK)**2)) ) & - * (ZDW(JI,JJ)**2) * (EXP(-0.5*(XZHAT(JK)+XZHAT(JK+1))/ZDW(JI,JJ))) & - * ZADTDXW(JI,JJ) + * ZDW(JI,JJ)**2 * EXP( - XZHATM(JK) / ZDW(JI,JJ) ) & + * ZADTDXW(JI,JJ) ENDDO ! ! CASE WHERE NO INSTABILITY IS DETECTED @@ -323,8 +323,7 @@ ENDDO ! DO JK=IKB,IKE - ZVTH_FLUX(:,:,JK) = - 0.5 * ZKYY(:,:,JK)*ZDTHM_DY(:,:,JK) * & - (1-EXP(-0.5*(XZHAT(JK)+XZHAT(JK+1))/ZDELTAZ)) + ZVTH_FLUX(:,:,JK) = - 0.5 * ZKYY(:,:,JK) * ZDTHM_DY(:,:,JK) * ( 1 - EXP( -XZHATM(JK) / ZDELTAZ ) ) END DO ! ! 2.1 Smoothing in equatorial region diff --git a/src/MNH/effic_aero.f90 b/src/MNH/effic_aero.f90 index 83d65305711a97c472c6a3ab67421cdafcada72d..f3d053a49b031a07ac83cfb2cd67df1d61ac28f9 100644 --- a/src/MNH/effic_aero.f90 +++ b/src/MNH/effic_aero.f90 @@ -1,12 +1,8 @@ -!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2013-2022 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 version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. !----------------------------------------------------------------- -!--------------- special set of characters for RCS information -!----------------------------------------------------------------- -! $Source$ $Revision$ $Date$ -!----------------------------------------------------------------- !! ############################## MODULE MODI_EFFIC_AERO !! ############################## @@ -18,8 +14,8 @@ SUBROUTINE EFFIC_AERO( & ,PRHODREF & !I [kg/m3] air density ,PPABST & !I [Pa] pressure ,PURR & !I - ,PSVT & !I [scalar variable, ppp] sea salt concentration - ,PEFFIC_AER & !O [scalar variable, ppp] sea salt concentration + ,PSVT & !I [scalar variable, ppv] sea salt concentration + ,PEFFIC_AER & !O [scalar variable, ppv] sea salt concentration ) IMPLICIT NONE diff --git a/src/MNH/effic_dust.f90 b/src/MNH/effic_dust.f90 index 0f3755fcf9f3d27f7d219137691897cf66791fe6..a3ba0109e44279f6aada99142daacc728700b440 100644 --- a/src/MNH/effic_dust.f90 +++ b/src/MNH/effic_dust.f90 @@ -1,12 +1,8 @@ -!ORILAM_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!ORILAM_LIC Copyright 2011-2022 CNRS, Meteo-France and Universite Paul Sabatier !ORILAM_LIC This is part of the ORILAM software governed by the CeCILL-C licence !ORILAM_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !ORILAM_LIC for details. !----------------------------------------------------------------- -!--------------- special set of characters for RCS information -!----------------------------------------------------------------- -! $Source$ $Revision$ $Date$ -!----------------------------------------------------------------- !! ############################## MODULE MODI_EFFIC_DUST !! ############################## @@ -18,8 +14,8 @@ SUBROUTINE EFFIC_DUST( & ,PRHODREF & !I [kg/m3] air density ,PPABST & !I [Pa] pressure ,PURR & !I - ,PSVT & !I [scalar variable, ppp] sea salt concentration - ,PEFFIC & !O [scalar variable, ppp] sea salt concentration + ,PSVT & !I [scalar variable, ppv] sea salt concentration + ,PEFFIC & !O [scalar variable, ppv] sea salt concentration ) IMPLICIT NONE diff --git a/src/MNH/effic_salt.f90 b/src/MNH/effic_salt.f90 index a2636789606306e49d88e71ac4d74e2d72ef3c1a..6b7f152d2c77e9597673960ba903055bde499ebb 100644 --- a/src/MNH/effic_salt.f90 +++ b/src/MNH/effic_salt.f90 @@ -1,12 +1,8 @@ -!ORILAM_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!ORILAM_LIC Copyright 2017-2022 CNRS, Meteo-France and Universite Paul Sabatier !ORILAM_LIC This is part of the ORILAM software governed by the CeCILL-C licence !ORILAM_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !ORILAM_LIC for details. !----------------------------------------------------------------- -!--------------- special set of characters for RCS information -!----------------------------------------------------------------- -! $Source$ $Revision$ $Date$ -!----------------------------------------------------------------- !! ############################## MODULE MODI_EFFIC_SALT !! ############################## @@ -18,8 +14,8 @@ SUBROUTINE EFFIC_SALT( & ,PRHODREF & !I [kg/m3] air density ,PPABST & !I [Pa] pressure ,PURR & !I - ,PSVT & !I [scalar variable, ppp] sea salt concentration - ,PEFFIC & !O [scalar variable, ppp] sea salt concentration + ,PSVT & !I [scalar variable, ppv] sea salt concentration + ,PEFFIC & !O [scalar variable, ppv] sea salt concentration ) IMPLICIT NONE diff --git a/src/MNH/eol_maths.f90 b/src/MNH/eol_maths.f90 index bda3aa6949d919d1616eb68b28bef118ab7802fd..81e2a0a885d7012caff260547722e3829d0e7aee 100644 --- a/src/MNH/eol_maths.f90 +++ b/src/MNH/eol_maths.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2018-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2018-2022 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. @@ -283,7 +283,7 @@ END FUNCTION INTERP_SPLCUB !######################################################### FUNCTION INTERP_LIN8NB(PPOS, KI, KJ, KK, PVAR, PZH) ! -USE MODD_GRID_n, ONLY: XXHAT,XYHAT +USE MODD_GRID_n, ONLY: XDXHAT, XXHATM, XDYHAT, XYHATM ! REAL :: INTERP_LIN8NB ! Return REAL, DIMENSION(3), INTENT(IN) :: PPOS ! Position where we want to evaluate @@ -309,7 +309,7 @@ REAL :: ZUX ! Interpolated variable (VAR) in Z pla ! ! FINDING 8 NEIGHBOORS ! -- X axis -IF (PPOS(1) <= 0.5*(XXHAT(KI)+XXHAT(KI+1))) THEN +IF (PPOS(1) <= XXHATM(KI)) THEN IIP = KI - 1 IIN = KI ELSE @@ -317,7 +317,7 @@ ELSE IIN = KI + 1 END IF ! -- Y axis -IF (PPOS(2) <= 0.5*((XYHAT(KJ)+XYHAT(KJ+1)))) THEN +IF (PPOS(2) <= XYHATM(KJ)) THEN IJP = KJ - 1 IJN = KJ ELSE @@ -336,7 +336,7 @@ END IF ! INTERPOLATION ! -- Along X ! -- -- Alpha -ZALPHAX = (PPOS(1) - 0.5*(XXHAT(IIP)+XXHAT(IIN))) / (XXHAT(IIN) - XXHAT(IIP)) +ZALPHAX = (PPOS(1) - XXHATM(IIP)) / XDXHAT(IIP) !!PRINT*, "ZALPHAX = ", ZALPHAX ! -- -- -- Wind ! -- -- Interpolated variable in temporary plane X @@ -353,7 +353,7 @@ ZHXPN = (1-ZALPHAX)*PZH(IIP,IJP,IKN) + ZALPHAX*PZH(IIN,IJP,IKN) ! ! -- Along Y ! -- -- Alpha -ZALPHAY = (PPOS(2) - 0.5*(XYHAT(IJP)+XYHAT(IJN))) / (XYHAT(IJN) - XYHAT(IJP)) +ZALPHAY = (PPOS(2) - XYHATM(IJP)) / XDYHAT(IJP) !PRINT*, "ZALPHAY = ", ZALPHAY ! -- -- Interpolated variable in temporary plane Y ! -- -- -- Wind diff --git a/src/MNH/extract_vortex.f90 b/src/MNH/extract_vortex.f90 index df1bb103b63398cd752ce8f6d5b2dbc5adeda879..311fcecd19f99b461609155dfd3ae1df6ee84159 100644 --- a/src/MNH/extract_vortex.f90 +++ b/src/MNH/extract_vortex.f90 @@ -1,12 +1,8 @@ -!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2001-2022 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 version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. !----------------------------------------------------------------- -!--------------- special set of characters for RCS information -!----------------------------------------------------------------- -! $Source$ $Revision$ -!----------------------------------------------------------------- ! ########################## MODULE MODI_EXTRACT_VORTEX ! ########################## @@ -102,7 +98,7 @@ END MODULE MODI_EXTRACT_VORTEX USE MODD_CST, ONLY: XPI USE MODD_PARAMETERS, ONLY: XUNDEF USE MODD_DIM_n, ONLY: NIMAX,NJMAX -USE MODD_GRID_n, ONLY: XXHAT,XYHAT +USE MODD_GRID_n, ONLY: XDXHAT, XXHAT, XDYHAT, XYHAT USE MODE_ll ! IMPLICIT NONE @@ -142,8 +138,8 @@ IPHI=SIZE(PR0,1) ! CALL GET_INDICE_ll (IIB,IJB,IIE,IJE) ! -ZDELTAX = XXHAT(3) - XXHAT(2) -ZDELTAY = XYHAT(3) - XYHAT(2) +ZDELTAX = XDXHAT(2) +ZDELTAY = XDYHAT(2) ZDELTAR = MAX(ZDELTAX,ZDELTAY) ZDPHI = 2.*XPI / IPHI ! diff --git a/src/MNH/finalize_mnh.f90 b/src/MNH/finalize_mnh.f90 index faabb9972201b09d35d1020b56ef477597ee9150..e6000a55b3020e7a78f0a77daebb793e6a8ec6ef 100644 --- a/src/MNH/finalize_mnh.f90 +++ b/src/MNH/finalize_mnh.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2021-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2021-2023 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. @@ -6,7 +6,7 @@ ! Author: ! P. Wautelet 06/07/2021 ! Modifications: -! +! P. Wautelet 13/01/2023: fix for LCHECK !----------------------------------------------------------------- MODULE MODE_FINALIZE_MNH @@ -53,17 +53,14 @@ SUBROUTINE FINALIZE_MNH END IF END DO + IF ( LCHECK ) CALL MPPDB_BARRIER() + !Finalize the parallel libraries - IF ( LCHECK ) THEN - CALL MPPDB_BARRIER() - ELSE - CALL END_PARA_ll( IRESP ) + CALL END_PARA_ll( IRESP ) + #ifdef CPLOASIS - IF ( LOASIS ) THEN - CALL SFX_OASIS_END() - END IF + IF ( LOASIS ) CALL SFX_OASIS_END() #endif - END IF !Free SURFEX structures if necessary CALL SURFEX_DEALLO_LIST() diff --git a/src/MNH/flash_geom_elec.f90 b/src/MNH/flash_geom_elec.f90 index 8ae281d266727272811789065a02bce9cad1ec3c..14265cba17427a97b008a4ae1fef61a785116e5b 100644 --- a/src/MNH/flash_geom_elec.f90 +++ b/src/MNH/flash_geom_elec.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2010-2020 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2010-2022 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. @@ -101,6 +101,7 @@ END MODULE MODI_FLASH_GEOM_ELEC_n ! P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function ! P. Wautelet 20/05/2019: add name argument to ADDnFIELD_ll + new ADD4DFIELD_ll subroutine ! P. Wautelet 18/09/2019: correct support of 64bit integers (MNH_INT=8) +! P. Wautelet 31/08/2022: remove ZXMASS and ZYMASS (use XXHATM and XYHATM instead) !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -119,7 +120,7 @@ USE MODD_ELEC_PARAM, ONLY: XFQLIGHTR, XEXQLIGHTR, & XFQLIGHTH, XEXQLIGHTH, & XFQLIGHTC USE MODD_GRID, ONLY: XLATORI,XLONORI -USE MODD_GRID_n, ONLY: XXHAT, XYHAT, XZHAT +USE MODD_GRID_n, ONLY: XXHATM, XYHATM, XZHAT USE MODD_IO, ONLY: TFILEDATA USE MODD_LMA_SIMULATOR USE MODD_METRICS_n, ONLY: XDXX, XDYY, XDZZ ! in linox_production @@ -352,8 +353,6 @@ INBFTS_MAX = ANINT(1000 * PTSTEP / 60) ! IF (GEFIRSTCALL) THEN GEFIRSTCALL = .FALSE. - ALLOCATE (ZXMASS(SIZE(XXHAT))) - ALLOCATE (ZYMASS(SIZE(XYHAT))) ALLOCATE (ZZMASS(SIZE(PZZ,1), SIZE(PZZ,2), SIZE(PZZ,3))) ALLOCATE (ZPRES_COEF(SIZE(PZZ,1), SIZE(PZZ,2), SIZE(PZZ,3))) IF(LLMA) THEN @@ -379,8 +378,6 @@ IF (GEFIRSTCALL) THEN ALLOCATE (ZSNEUT_POS(NFLASH_WRITE)) ALLOCATE (ZSNEUT_NEG(NFLASH_WRITE)) ! - ZXMASS(IIB:IIE) = 0.5 * (XXHAT(IIB:IIE) + XXHAT(IIB+1:IIE+1)) - ZYMASS(IJB:IJE) = 0.5 * (XYHAT(IJB:IJE) + XYHAT(IJB+1:IJE+1)) ZZMASS = MZF(PZZ) ZPRES_COEF = EXP(ZZMASS/8400.) ZSCOORD_SEG(:,:,:) = 0.0 @@ -588,9 +585,8 @@ DEALLOCATE (ZEMAX) IF (INB_CELL .GE. 1) THEN ! ! mean mesh size - ZMEAN_GRID = (XDXHATM**2 + XDYHATM**2 + & - (SUM(XZHAT(2:SIZE(PRT,3)) - XZHAT(1:SIZE(PRT,3)-1)) / & - (SIZE(PRT,3)-1.))**2)**0.5 + ZMEAN_GRID = (XDXHATM**2 + XDYHATM**2 + & + ( ( XZHAT(UBOUND(XZHAT,1)) - XZHAT(1) ) / (SIZE(PRT,3)-1.) )**2 )**0.5 ! chaque proc calcule son propre zmean_grid ! mais cette valeur peut etre differente sur chaque proc (ex: relief) ! laisse tel quel pour le moment @@ -913,8 +909,8 @@ ENDIF DO IJ = IJB, IJE DO IK = IKB, IKE IF (GPROP(II,IJ,IK,IL)) THEN - ZDIST(II,IJ,IK) = ((ZXMASS(II) - ZCOORD_TRIG(1,IL))**2 + & - (ZYMASS(IJ) - ZCOORD_TRIG(2,IL))**2 + & + ZDIST(II,IJ,IK) = ((XXHATM(II) - ZCOORD_TRIG(1,IL))**2 + & + (XYHATM(IJ) - ZCOORD_TRIG(2,IL))**2 + & (ZZMASS(II,IJ,IK) - ZCOORD_TRIG(3,IL))**2)**0.5 END IF END DO @@ -1664,8 +1660,8 @@ DO IL = 1, INB_CELL ISEG_GLOB(2,IL) = IJ_TRIG_GLOB ISEG_GLOB(3,IL) = IK_TRIG ! - ZCOORD_TRIG(1,IL) = ZXMASS(II_TRIG_LOC) - ZCOORD_TRIG(2,IL) = ZYMASS(IJ_TRIG_LOC) + ZCOORD_TRIG(1,IL) = XXHATM(II_TRIG_LOC) + ZCOORD_TRIG(2,IL) = XYHATM(IJ_TRIG_LOC) ZCOORD_TRIG(3,IL) = ZZMASS(II_TRIG_LOC, IJ_TRIG_LOC, IK_TRIG) ! ZCOORD_SEG(1:3,IL) = ZCOORD_TRIG(1:3,IL) @@ -1767,8 +1763,8 @@ IF (IPROC .EQ. IPROC_TRIG(IL)) THEN ISEG_GLOB(IIDECAL+2,IL) = IJBL_LOC + IYOR - 1 ISEG_GLOB(IIDECAL+3,IL) = IKBL ! - ZCOORD_SEG(IIDECAL+1,IL) = ZXMASS(IIBL_LOC) - ZCOORD_SEG(IIDECAL+2,IL) = ZYMASS(IJBL_LOC) + ZCOORD_SEG(IIDECAL+1,IL) = XXHATM(IIBL_LOC) + ZCOORD_SEG(IIDECAL+2,IL) = XYHATM(IJBL_LOC) ZCOORD_SEG(IIDECAL+3,IL) = ZZMASS(IIBL_LOC, IJBL_LOC, IKBL) ! INBSEG(IL) = INBSEG(IL) + 1 @@ -2239,8 +2235,8 @@ IF (INB_SEG_AFT .GT. INB_SEG_BEF) THEN ISEG_GLOB(IIDECALB+2,IL) = IJ + IYOR - 1 ISEG_GLOB(IIDECALB+3,IL) = IK ! - ZCOORD_SEG(IIDECALB+1,IL) = ZXMASS(II) - ZCOORD_SEG(IIDECALB+2,IL) = ZYMASS(IJ) + ZCOORD_SEG(IIDECALB+1,IL) = XXHATM(II) + ZCOORD_SEG(IIDECALB+2,IL) = XYHATM(IJ) ZCOORD_SEG(IIDECALB+3,IL) = ZZMASS(II,IJ,IK) INBSEG(IL) = INBSEG(IL) + 1 END IF diff --git a/src/MNH/free_atm_profile.f90 b/src/MNH/free_atm_profile.f90 index 50496da72b87d003764faf82a65a856daf128c84..572dd91d8489b8e2ea4e8bb4738cbf1b0750e60f 100644 --- a/src/MNH/free_atm_profile.f90 +++ b/src/MNH/free_atm_profile.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1997-2020 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1997-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. @@ -93,7 +93,7 @@ END MODULE MODI_FREE_ATM_PROFILE ! ------------ ! USE MODD_CONF -use modd_field, only: tfielddata, TYPEINT, TYPEREAL +use modd_field, only: tfieldmetadata, TYPEINT, TYPEREAL USE MODD_GRID_n USE MODD_IO, ONLY: TFILEDATA USE MODD_LUNIT, ONLY: TLUOUT0 @@ -163,7 +163,7 @@ REAL, DIMENSION(SIZE(XZZ,1),SIZE(XZZ,2),SIZE(XZZ,3)) & :: Z3D ! field to be recorded REAL, DIMENSION(SIZE(XZZ,1),SIZE(XZZ,2),SIZE(XZZ,3)) & :: ZZMASS ! MESO-NH output mass grid -TYPE(TFIELDDATA) :: TZFIELD +TYPE(TFIELDMETADATA) :: TZFIELD !------------------------------------------------------------------------------- ! ILUOUT0 = TLUOUT0%NLU @@ -468,32 +468,33 @@ IF (CPROGRAM == 'DIAG ' ) THEN Z2D(JI,JJ) = PZMASS_MX(JI,JJ,IK_BL_TOP(JI,JJ)) - PZS_LS(JI,JJ) END DO END DO - TZFIELD%CMNHNAME = 'HBLTOP' - TZFIELD%CSTDNAME = 'atmosphere_boundary_layer_thickness' - TZFIELD%CLONGNAME = 'HBLTOP' - TZFIELD%CUNITS = 'm' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'Height of Boundary Layer TOP' - TZFIELD%NGRID = 4 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 2 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'HBLTOP', & + CSTDNAME = 'atmosphere_boundary_layer_thickness', & + CLONGNAME = 'HBLTOP', & + CUNITS = 'm', & + CDIR = 'XY', & + CCOMMENT = 'Height of Boundary Layer TOP', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,Z2D) ! !* 11.2 Writing of level of boundary layer top ! -------------------------------------- ! - Z2D(:,:) = IK_BL_TOP(:,:) - TZFIELD%CMNHNAME = 'KBLTOP' - TZFIELD%CSTDNAME = 'model_level_number_at_top_of_atmosphere_boundary_layer' - TZFIELD%CLONGNAME = 'KBLTOP' - TZFIELD%CUNITS = '1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'Index of Boundary Layer TOP' - TZFIELD%NGRID = 4 - TZFIELD%NTYPE = TYPEINT - TZFIELD%NDIMS = 2 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'KBLTOP', & + CSTDNAME = 'model_level_number_at_top_of_atmosphere_boundary_layer', & + CLONGNAME = 'KBLTOP', & + CUNITS = '1', & + CDIR = 'XY', & + CCOMMENT = 'Index of Boundary Layer TOP', & + NGRID = 4, & + NTYPE = TYPEINT, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,IK_BL_TOP) END IF ! @@ -502,19 +503,18 @@ IF (CPROGRAM /= 'DIAG ' .AND. CPROGRAM /= 'IDEAL ' ) THEN !* 11.3 Writing of free atmosphere gradient ! ----------------------------------- ! - Z2D(:,:)=ZFREE_GR(:,:) -! - TZFIELD%CMNHNAME = 'FREE_ATM_GR' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'FREE_ATM_GR' - TZFIELD%CUNITS = 'K m-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'Free atmosphere gradient' - TZFIELD%NGRID = 4 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 2 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,Z2D) + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'FREE_ATM_GR', & + CSTDNAME = '', & + CLONGNAME = 'FREE_ATM_GR', & + CUNITS = 'K m-1', & + CDIR = 'XY', & + CCOMMENT = 'Free atmosphere gradient', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) + CALL IO_Field_write(TPFILE,TZFIELD,ZFREE_GR(:,:)) ! !* 11.4 Writing of free atmosphere 3D profiles ! -------------------------------------- @@ -525,16 +525,17 @@ IF (CPROGRAM /= 'DIAG ' .AND. CPROGRAM /= 'IDEAL ' ) THEN CALL COEF_VER_INTERP_LIN(PZ_FREE(:,:,:),ZZMASS(:,:,:),OLEUG=.TRUE.) Z3D(:,:,:)=VER_INTERP_LIN(PF_FREE(:,:,:),NKLIN(:,:,:),XCOEFLIN(:,:,:)) ! - TZFIELD%CMNHNAME = 'THV_FREE' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'THV_FREE' - TZFIELD%CUNITS = 'K' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_THV_FREE' - TZFIELD%NGRID = 4 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'THV_FREE', & + CSTDNAME = '', & + CLONGNAME = 'THV_FREE', & + CUNITS = 'K', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_THV_FREE', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,Z3D) ! END IF diff --git a/src/MNH/fun.f90 b/src/MNH/fun.f90 index 46db8b201c4b7d5352b188bf5489b2e580bdbeb1..85100a77b32e488091f384ee9a23a96cdc145666 100644 --- a/src/MNH/fun.f90 +++ b/src/MNH/fun.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1994-2017 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1994-2022 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. @@ -88,7 +88,6 @@ END MODULE MODI_FUN !* 0. DECLARATIONS ! ------------ ! -USE MODE_GATHER_ll USE MODD_GRID_n USE MODD_DIM_n USE MODD_PARAMETERS @@ -110,7 +109,6 @@ INTEGER :: JJ ,JK ! Loop index INTEGER :: IINFO_ll, IJU_ll ! parallel variables REAL :: ZWIDTHY ! Width of the jet along the y direction REAL :: ZWIDTHZ ! Width of the jet along the z direction -REAL, DIMENSION(:), ALLOCATABLE :: ZYHAT_ll ! !------------------------------------------------------------------------------- ! @@ -120,18 +118,15 @@ REAL, DIMENSION(:), ALLOCATABLE :: ZYHAT_ll IJU_ll=NJMAX_ll+2*JPHEXT IJ0=IJU_ll/2 IK0=KKU/2 -ALLOCATE(ZYHAT_ll(IJU_ll)) -CALL GATHERALL_FIELD_ll('YY',XYHAT,ZYHAT_ll,IINFO_ll) -ZWIDTHY =ZYHAT_ll(IJ0+IJU_ll/5)-ZYHAT_ll(IJ0) +ZWIDTHY =XYHAT_ll(IJ0+IJU_ll/5)-XYHAT_ll(IJ0) ZWIDTHZ =PZHAT(IK0+KKU/5)-PZHAT(IK0) DO JJ = 1,KJU-1 DO JK = 1,KKU - FUNUYZ(JJ,JK) = 1./COSH( & - (( (XYHAT(JJ)+XYHAT(JJ+1))*0.5-ZYHAT_ll(IJ0))/ZWIDTHY) **2 & - +(( PZHAT(JK) - PZHAT(IK0))/ZWIDTHZ) **2 ) + FUNUYZ(JJ,JK) = 1./COSH( & + (( XYHATM(JJ)-XYHAT_ll(IJ0))/ZWIDTHY) **2 & + +(( PZHAT(JK) - PZHAT(IK0))/ZWIDTHZ) **2 ) END DO END DO -DEALLOCATE(ZYHAT_ll) FUNUYZ(KJU,:)=2.*FUNUYZ(KJU-1,:)-FUNUYZ(KJU-2,:) !simple extrapolation !for the last point ! @@ -189,7 +184,6 @@ END FUNCTION FUNUYZ USE MODD_GRID_n USE MODD_DIM_n USE MODD_PARAMETERS -USE MODE_GATHER_ll ! ! IMPLICIT NONE @@ -206,18 +200,15 @@ INTEGER :: IJ0 ! Jet center INTEGER :: JJ ! Loop index INTEGER :: IINFO_ll, IJU_ll ! parallel variables REAL :: ZWIDTH ! Width of the jet -REAL, DIMENSION(:), ALLOCATABLE :: ZYHAT_ll !------------------------------------------------------------------------------- ! !* 1. COMPUTE FUNUY ! ------------- IJU_ll=NJMAX_ll+2*JPHEXT IJ0=IJU_ll/2 -ALLOCATE(ZYHAT_ll(IJU_ll)) -CALL GATHERALL_FIELD_ll('YY',XYHAT,ZYHAT_ll,IINFO_ll) -ZWIDTH=ZYHAT_ll(IJ0+IJU_ll/5)-ZYHAT_ll(IJ0) +ZWIDTH=XYHAT_ll(IJ0+IJU_ll/5)-XYHAT_ll(IJ0) DO JJ = 1,KJU-1 - FUNUY(JJ) = 1./COSH(((XYHAT(JJ)+XYHAT(JJ+1))*0.5-ZYHAT_ll(IJ0))/ZWIDTH) + FUNUY(JJ) = 1./COSH((XYHATM(JJ)-XYHAT_ll(IJ0))/ZWIDTH) END DO FUNUY(KJU)=2.*FUNUY(KJU-1)-FUNUY(KJU-2) !simple extrapolation for the last point ! @@ -276,7 +267,6 @@ END FUNCTION FUNUY !* 0. DECLARATIONS ! ------------ ! -USE MODE_GATHER_ll USE MODD_GRID_n USE MODD_DIM_n USE MODD_PARAMETERS @@ -298,7 +288,6 @@ INTEGER :: JI,JK ! Loop index INTEGER :: IINFO_ll, IIU_ll ! parallel variables REAL :: ZWIDTHX ! Width of the jet along the x direction REAL :: ZWIDTHZ ! Width of the jet along the z direction -REAL, DIMENSION(:), ALLOCATABLE :: ZXHAT_ll ! !------------------------------------------------------------------------------- ! @@ -308,15 +297,13 @@ REAL, DIMENSION(:), ALLOCATABLE :: ZXHAT_ll IIU_ll=NIMAX_ll+2*JPHEXT II0=IIU_ll/2 IK0=KKU/2 -ALLOCATE(ZXHAT_ll(IIU_ll)) -CALL GATHERALL_FIELD_ll('XX',XXHAT,ZXHAT_ll,IINFO_ll) -ZWIDTHX=ZXHAT_ll(II0+IIU_ll/5)-ZXHAT_ll(II0) +ZWIDTHX=XXHAT_ll(II0+IIU_ll/5)-XXHAT_ll(II0) ZWIDTHZ=PZHAT(IK0+KKU/5)-PZHAT(IK0) DO JI = 1,KIU-1 DO JK = 1,KKU - FUNVXZ(JI,JK) = 1./COSH( & - (( (XXHAT(JI)+XXHAT(JI+1))*0.5-ZXHAT_ll(II0))/ZWIDTHX)**2 & - +(( PZHAT (JK) - PZHAT (IK0))/ZWIDTHZ)**2 ) + FUNVXZ(JI,JK) = 1./COSH( & + (( XXHATM(JI)-XXHAT_ll(II0))/ZWIDTHX)**2 & + +(( PZHAT (JK) - PZHAT (IK0))/ZWIDTHZ)**2 ) END DO END DO FUNVXZ(KIU,:)=2.*FUNVXZ(KIU-1,:)-FUNVXZ(KIU-2,:) !simple extrapolation for the last point @@ -372,7 +359,6 @@ END FUNCTION FUNVXZ !* 0. DECLARATIONS ! ------------ ! -USE MODE_GATHER_ll USE MODD_GRID_n USE MODD_DIM_n USE MODD_PARAMETERS @@ -392,20 +378,16 @@ INTEGER :: II0 ! Jet center INTEGER :: JI ! Loop index INTEGER :: IINFO_ll, IIU_ll ! parallel variables REAL :: ZWIDTH ! Width of the jet -REAL, DIMENSION(:), ALLOCATABLE :: ZXHAT_ll !------------------------------------------------------------------------------- ! !* 1. COMPUTE FUNUY ! ------------- IIU_ll=NIMAX_ll+2*JPHEXT II0=IIU_ll/2 -ALLOCATE(ZXHAT_ll(IIU_ll)) -CALL GATHERALL_FIELD_ll('XX',XXHAT,ZXHAT_ll,IINFO_ll) -ZWIDTH=ZXHAT_ll(II0+IIU_ll/5)-ZXHAT_ll(II0) +ZWIDTH=XXHAT_ll(II0+IIU_ll/5)-XXHAT_ll(II0) DO JI = 1,KIU - FUNVX(JI)=1./COSH(((XXHAT(JI)+XXHAT(JI))*0.5-ZXHAT_ll(II0))/ZWIDTH) + FUNVX(JI)=1./COSH((XXHATM(JI)-XXHAT_ll(II0))/ZWIDTH) END DO -DEALLOCATE(ZXHAT_ll) !------------------------------------------------------------------------------- ! END FUNCTION FUNVX diff --git a/src/MNH/gdiv.f90 b/src/MNH/gdiv.f90 index b22065908c6e897d61706999fd1374582060f1d4..dc77dde5587474069b58d20d7149910d26b76358 100644 --- a/src/MNH/gdiv.f90 +++ b/src/MNH/gdiv.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1994-2020 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1994-2023 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. @@ -16,12 +16,12 @@ IMPLICIT NONE CHARACTER (LEN=4), DIMENSION(2), INTENT(IN) :: HLBCX ! x-direction LBC type CHARACTER (LEN=4), DIMENSION(2), INTENT(IN) :: HLBCY ! y-direction LBC type ! - ! Metric coefficients: -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX ! d*xx -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY ! d*yy -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZX ! d*zx -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZY ! d*zy -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! d*zz + ! Metric coefficients: +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX ! d*xx +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY ! d*yy +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDZX ! d*zx +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDZY ! d*zy +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! d*zz ! ! Field components REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PU ! along x @@ -113,12 +113,12 @@ IMPLICIT NONE CHARACTER (LEN=4), DIMENSION(2), INTENT(IN) :: HLBCX ! x-direction LBC type CHARACTER (LEN=4), DIMENSION(2), INTENT(IN) :: HLBCY ! y-direction LBC type ! - ! Metric coefficients: -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX ! d*xx -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY ! d*yy -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZX ! d*zx -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZY ! d*zy -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! d*zz + ! Metric coefficients: +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX ! d*xx +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY ! d*yy +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDZX ! d*zx +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDZY ! d*zy +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! d*zz ! ! Field components REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PU ! along x diff --git a/src/MNH/goto_model_wrapper.f90 b/src/MNH/goto_model_wrapper.f90 index 831cb2028c3c0ea54da0090bb1329b014437bb4c..33dbefdf202038d77207019c0f4e123e696225a9 100644 --- a/src/MNH/goto_model_wrapper.f90 +++ b/src/MNH/goto_model_wrapper.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1994-2022 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. @@ -18,6 +18,7 @@ ! 11/2019 C.Lac correction in the drag formula and application to building in addition to tree ! F. Auguste 02/21: add IBM ! T. Nagel 02/21: add turbulence recycling +! P. Wautelet 27/04/2022: add namelist for profilers !----------------------------------------------------------------- MODULE MODI_GOTO_MODEL_WRAPPER @@ -34,6 +35,7 @@ SUBROUTINE GOTO_MODEL_WRAPPER(KFROM, KTO, ONOFIELDLIST) ! all USE modd*_n modules USE MODD_ADVFRC_n USE MODD_ADV_n +USE MODD_ALLPROFILER_n USE MODD_ALLSTATION_n USE MODD_BIKHARDT_n USE MODD_BLANK_n @@ -60,6 +62,7 @@ USE MODD_DRAGBLDG_n USE MODD_DUMMY_GR_FIELD_n USE MODD_DYN_n USE MODD_DYNZD_n +USE MODD_ELEC_n USE MODD_FIELD_n #ifdef MNH_FOREFIRE USE MODD_FOREFIRE_n @@ -88,7 +91,6 @@ USE MODD_PARAM_ECRAD_n USE MODD_PASPOL_n USE MODD_PAST_FIELD_n USE MODD_PRECIP_n -USE MODD_ELEC_n USE MODD_PROFILER_n USE MODD_RADIATIONS_n USE MODD_RBK90_Global_n @@ -107,8 +109,6 @@ USE MODD_SUB_ELEC_n USE MODD_SUB_MODEL_n USE MODD_SUB_PASPOL_n USE MODD_SUB_PHYS_PARAM_n -USE MODD_SUB_PROFILER_n -USE MODD_SUB_STATION_n USE MODD_TIMEZ USE MODD_TURB_n ! @@ -190,21 +190,20 @@ CALL FOREFIRE_GOTO_MODEL(KFROM, KTO) #endif !CALL PRECIP_GOTO_MODEL(KFROM, KTO) CALL ELEC_GOTO_MODEL(KFROM, KTO) -CALL PROFILER_GOTO_MODEL(KFROM, KTO) CALL RADIATIONS_GOTO_MODEL(KFROM, KTO) CALL SHADOWS_GOTO_MODEL(KFROM, KTO) CALL REF_GOTO_MODEL(KFROM, KTO) CALL FRC_GOTO_MODEL(KFROM, KTO) CALL SECPGD_FIELD_GOTO_MODEL(KFROM, KTO) CALL SERIES_GOTO_MODEL(KFROM, KTO) +CALL PROFILER_GOTO_MODEL(KFROM, KTO) CALL STATION_GOTO_MODEL(KFROM, KTO) +CALL ALLPROFILER_GOTO_MODEL(KFROM, KTO) CALL ALLSTATION_GOTO_MODEL(KFROM, KTO) CALL SUB_CH_FIELD_VALUE_GOTO_MODEL(KFROM, KTO) CALL SUB_CH_MONITOR_GOTO_MODEL(KFROM, KTO) CALL SUB_MODEL_GOTO_MODEL(KFROM, KTO) CALL SUB_PHYS_PARAM_GOTO_MODEL(KFROM, KTO) -CALL SUB_PROFILER_GOTO_MODEL(KFROM, KTO) -CALL SUB_STATION_GOTO_MODEL(KFROM, KTO) CALL SUB_PASPOL_GOTO_MODEL(KFROM, KTO) CALL SUB_ELEC_GOTO_MODEL(KFROM, KTO) !CALL TIME_GOTO_MODEL(KFROM, KTO) diff --git a/src/MNH/gps_zenith.f90 b/src/MNH/gps_zenith.f90 index a11a074d6f511b7909c55934712aa9294cd0a3c2..5fe9cd741b0508c9b21133516957926682ae0942 100644 --- a/src/MNH/gps_zenith.f90 +++ b/src/MNH/gps_zenith.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2004-2019 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2004-2022 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. @@ -66,8 +66,8 @@ END MODULE MODI_GPS_ZENITH !! ------------- !! Original 18/11/04 !! Modified 4/12/2007 -! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O -!! +! P. Wautelet 05/2016-04/2018: new data structures and calls for I/O +! P. Wautelet 31/08/2022: use XXHATM and XYHATM (remove ZXHATM and ZYHATM local variables) !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -120,7 +120,6 @@ INTEGER :: JI,JJ,JK ! Loop variables of control INTEGER :: IIU,IJU,IKU ! Loop variables of model INTEGER :: ILUOUT0, IRESP ! file unit and return code for output INTEGER :: JL ! -REAL, DIMENSION(:),ALLOCATABLE :: ZXHATM,ZYHATM ! mass-point positions REAL, DIMENSION(:,:,:),ALLOCATABLE :: ZZHATM ! mass level altitude !-------- Physical parameters for the integration ---------------------------- REAL, DIMENSION(:,:,:),ALLOCATABLE :: ZE ! Partial pressure of water vapor @@ -166,8 +165,6 @@ IKU = SIZE (PTEMP,3) IKB = JPVEXT + 1 IKE = IKU - JPVEXT ! -ALLOCATE(ZXHATM(IIU)) -ALLOCATE(ZYHATM(IJU)) ALLOCATE(ZZHATM(IIU,IJU,IKU)) ALLOCATE(ZE(IIU,IJU,IKU)) ALLOCATE(ZTV(IIU,IJU,IKU)) @@ -203,10 +200,6 @@ ZRDSRV=XRD/XRV ! ------------------- ! ! -ZXHATM(1:IIU-1) = 0.5*(XXHAT(1:IIU-1)+XXHAT(2:IIU)) -ZXHATM(IIU) = 2.*XXHAT(IIU)-ZXHATM(IIU-1) -ZYHATM(1:IJU-1) = 0.5*(XYHAT(1:IJU-1)+XYHAT(2:IJU)) -ZYHATM(IJU) = 2.*XYHAT(IJU)-ZYHATM(IJU-1) ZZHATM(:,:,1:IKU-1)=0.5*(XZZ(:,:,1:IKU-1)+XZZ(:,:,2:IKU)) ZZHATM(:,:,IKU) = 2.*XZZ(:,:,IKU) -ZZHATM(:,:,IKU-1) ! @@ -304,7 +297,7 @@ IF (ISTATIONS >0 ) THEN CALL SM_XYHAT(XLATORI,XLONORI, & XLAT_GPS(JL),XLON_GPS(JL),ZXHAT_GPS(JL),ZYHAT_GPS(JL)) ! - II(JL)=COUNT(ZXHATM(:)<=ZXHAT_GPS(JL)) + II(JL)=COUNT(XXHATM(:)<=ZXHAT_GPS(JL)) IX=COUNT(XXHAT(:)<=ZXHAT_GPS(JL)) IF (IX<IIB .AND. LWEST_ll()) THEN ! station outside the MESO-NH domain @@ -314,7 +307,7 @@ IF (ISTATIONS >0 ) THEN ! station outside the MESO-NH domain GSTATION(JL)=.FALSE. ENDIF - IJ(JL)=COUNT(ZYHATM(:)<=ZYHAT_GPS(JL)) + IJ(JL)=COUNT(XYHATM(:)<=ZYHAT_GPS(JL)) IY=COUNT(XYHAT(:)<=ZYHAT_GPS(JL)) IF (IY<IJB .AND. LSOUTH_ll()) THEN ! stations outside MESO-NH domain @@ -337,7 +330,7 @@ IF (ISTATIONS >0 ) THEN II1=II(JL) IJ1=IJ(JL) ! interpolate Z at station position and check that the difference between model relief and station altitude is weaker than XDIFORO - CALL INTERPOL_STATION(XZZ(:,:,:),ZXHATM,ZYHATM,II1,IJ1,ZXHAT_GPS(JL),ZYHAT_GPS(JL),ZZ_STA(:,JL)) + CALL INTERPOL_STATION(XZZ(:,:,:),XXHATM,XYHATM,II1,IJ1,ZXHAT_GPS(JL),ZYHAT_GPS(JL),ZZ_STA(:,JL)) IF ( ABS( ZZ_STA(IKB,JL)-XZS_GPS(JL)) > XDIFFORO ) THEN WRITE(IFGRI,*) 'NO DATA, Difference between the model orography and the GPS station height too large for ',CNAM_GPS(JL) GSTATION(JL)=.FALSE. @@ -347,10 +340,10 @@ IF (ISTATIONS >0 ) THEN ! 6.3 Interpolate to the station positions ! ! interpolate model variables to obs point - CALL INTERPOL_STATION(PPABSM(:,:,:),ZXHATM,ZYHATM,II1,IJ1,ZXHAT_GPS(JL),ZYHAT_GPS(JL),ZP_STA(:)) - CALL INTERPOL_STATION(ZE(:,:,:),ZXHATM,ZYHATM,II1,IJ1,ZXHAT_GPS(JL),ZYHAT_GPS(JL),ZE_STA(:)) - CALL INTERPOL_STATION(PTEMP(:,:,:),ZXHATM,ZYHATM,II1,IJ1,ZXHAT_GPS(JL),ZYHAT_GPS(JL),ZT_STA(:)) - CALL INTERPOL_STATION(ZTV(:,:,:),ZXHATM,ZYHATM,II1,IJ1,ZXHAT_GPS(JL),ZYHAT_GPS(JL),ZTV_STA(:)) + CALL INTERPOL_STATION(PPABSM(:,:,:),XXHATM,XYHATM,II1,IJ1,ZXHAT_GPS(JL),ZYHAT_GPS(JL),ZP_STA(:)) + CALL INTERPOL_STATION(ZE(:,:,:),XXHATM,XYHATM,II1,IJ1,ZXHAT_GPS(JL),ZYHAT_GPS(JL),ZE_STA(:)) + CALL INTERPOL_STATION(PTEMP(:,:,:),XXHATM,XYHATM,II1,IJ1,ZXHAT_GPS(JL),ZYHAT_GPS(JL),ZT_STA(:)) + CALL INTERPOL_STATION(ZTV(:,:,:),XXHATM,XYHATM,II1,IJ1,ZXHAT_GPS(JL),ZYHAT_GPS(JL),ZTV_STA(:)) ! ! 6.3.1 For stations above model orography ! @@ -386,7 +379,7 @@ IF (ISTATIONS >0 ) THEN /(XRD* 0.5 *(ZTV_STAT+ZTV_STA(IKB)))) ! assume constant rvn for Vapor pressure - CALL INTERPOL_STATION( PRM(:,:,IKB),ZXHATM,ZYHATM,II(JL),IJ(JL),ZXHAT_GPS(JL), & + CALL INTERPOL_STATION( PRM(:,:,IKB),XXHATM,XYHATM,II(JL),IJ(JL),ZXHAT_GPS(JL), & ZYHAT_GPS(JL),ZRV_STAT) ZEM_STAT = ZPM_STAT * ZRV_STAT / ( ZRDSRV + ZRV_STAT ) ! add contribution below the model orography @@ -408,11 +401,11 @@ IF (ISTATIONS >0 ) THEN ! ! 6.3.4 Add external contribution for ZHD ! - CALL INTERPOL_STATION( ZPTOP(:,:),ZXHATM,ZYHATM,II(JL),IJ(JL),ZXHAT_GPS(JL), & + CALL INTERPOL_STATION( ZPTOP(:,:),XXHATM,XYHATM,II(JL),IJ(JL),ZXHAT_GPS(JL), & ZYHAT_GPS(JL),ZPTOP_STAT) - CALL INTERPOL_STATION( ZGTOP(:,:),ZXHATM,ZYHATM,II(JL),IJ(JL),ZXHAT_GPS(JL), & + CALL INTERPOL_STATION( ZGTOP(:,:),XXHATM,XYHATM,II(JL),IJ(JL),ZXHAT_GPS(JL), & ZYHAT_GPS(JL),ZGTOP_STAT) - CALL INTERPOL_STATION( ZTEMPTOP(:,:),ZXHATM,ZYHATM,II(JL),IJ(JL),ZXHAT_GPS(JL), & + CALL INTERPOL_STATION( ZTEMPTOP(:,:),XXHATM,XYHATM,II(JL),IJ(JL),ZXHAT_GPS(JL), & ZYHAT_GPS(JL),ZTEMPTOP_STAT) ZGPS_ZHD(JL)=ZGPS_ZHD(JL)+ ( 1.E-6 * ZK1 * ZPTOP_STAT * XRD * ( 1. + 2. * XRD * ZTEMPTOP_STAT & / ( ( XRADIUS + ZZ_STA(IKE+1,JL) ) * ZGTOP_STAT ) + 2. * ( XRD * ZTEMPTOP_STAT & @@ -435,8 +428,6 @@ IF (ISTATIONS >0 ) THEN CALL IO_File_close(TZFILE,IRESP) PRINT *,'File ',TRIM(HFGRI),' closed, IRESP= ',IRESP ! - DEALLOCATE(ZXHATM) - DEALLOCATE(ZYHATM) DEALLOCATE(ZGPS_ZTD) DEALLOCATE(ZGPS_ZHD) DEALLOCATE(ZGPS_ZWD) diff --git a/src/MNH/gps_zenith_grid.f90 b/src/MNH/gps_zenith_grid.f90 index 86b72414fd58c1ab1ec065bc60a2e8c1f585e3b0..f3859e62cffe105ca97de8c6c8418eaa08348d98 100644 --- a/src/MNH/gps_zenith_grid.f90 +++ b/src/MNH/gps_zenith_grid.f90 @@ -1,6 +1,6 @@ -!MNH_LIC Copyright 1994-2018 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2004-2022 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 version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. !----------------------------------------------------------------- !########################################## @@ -66,8 +66,8 @@ END MODULE MODI_GPS_ZENITH_GRID !! Modified 4/12/2007 !! July, 2015 (O.Nuissier/F.Duffourg) Add microphysics diagnostic for !! aircraft, ballon and profiler -!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O -!! +! P. Wautelet 05/2016-04/2018: new data structures and calls for I/O +! P. Wautelet 31/08/2022: remove ZXHATM and ZYHATM (unused variables) !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -107,7 +107,6 @@ INTEGER :: IJB,IJE ! Loop limits for coordinate Y INTEGER :: IKB,IKE ! Loop limits for coordinate Z INTEGER :: JK ! Loop variables of control INTEGER :: IIU,IJU,IKU ! Loop variables of model -REAL, DIMENSION(:),ALLOCATABLE :: ZXHATM,ZYHATM ! mass-point positions REAL, DIMENSION(:,:,:),ALLOCATABLE :: ZZHATM ! mass level altitude !-------- Physical parameters for the integration ---------------------------- REAL, DIMENSION(:,:,:),ALLOCATABLE :: ZE ! Partial pressure of water vapor @@ -135,8 +134,6 @@ IKU = SIZE (PTEMP,3) IKB = JPVEXT + 1 IKE = IKU - JPVEXT ! -ALLOCATE(ZXHATM(IIU)) -ALLOCATE(ZYHATM(IJU)) ALLOCATE(ZZHATM(IIU,IJU,IKU)) ALLOCATE(ZE(IIU,IJU,IKU)) ALLOCATE(ZTV(IIU,IJU,IKU)) @@ -172,10 +169,6 @@ ZRDSRV=XRD/XRV ! ------------------- ! ! -ZXHATM(1:IIU-1) = 0.5*(XXHAT(1:IIU-1)+XXHAT(2:IIU)) -ZXHATM(IIU) = 2.*XXHAT(IIU)-ZXHATM(IIU-1) -ZYHATM(1:IJU-1) = 0.5*(XYHAT(1:IJU-1)+XYHAT(2:IJU)) -ZYHATM(IJU) = 2.*XYHAT(IJU)-ZYHATM(IJU-1) ZZHATM(:,:,1:IKU-1)=0.5*(XZZ(:,:,1:IKU-1)+XZZ(:,:,2:IKU)) ZZHATM(:,:,IKU) = 2.*XZZ(:,:,IKU) -ZZHATM(:,:,IKU-1) ! diff --git a/src/MNH/ground_paramn.f90 b/src/MNH/ground_paramn.f90 index 1db438c04bbd617fd654f288b3d62c54ede6cdeb..d50a7fbe5070d883c6d3e2b80935680fa43cfe24 100644 --- a/src/MNH/ground_paramn.f90 +++ b/src/MNH/ground_paramn.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1994-2020 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1995-2023 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. @@ -12,17 +12,17 @@ INTERFACE SUBROUTINE GROUND_PARAM_n(D, PSFTH, PSFRV, PSFSV, PSFCO2, PSFU, PSFV, & PDIR_ALB, PSCA_ALB, PEMIS, PTSRAD, KTCOUNT, TPFILE ) ! -USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t !* surface fluxes ! -------------- ! -USE MODD_IO, ONLY: TFILEDATA +USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t +USE MODD_IO, ONLY: TFILEDATA ! TYPE(DIMPHYEX_t), INTENT(IN) :: D REAL, DIMENSION(:,:), INTENT(OUT) :: PSFTH ! surface flux of potential temperature (Km/s) REAL, DIMENSION(:,:), INTENT(OUT) :: PSFRV ! surface flux of water vapor (m/s*kg/kg) REAL, DIMENSION(:,:,:),INTENT(OUT):: PSFSV ! surface flux of scalar (m/s*kg/kg) - ! flux of chemical var. (ppp.m/s) + ! flux of chemical var. (ppv.m/s) REAL, DIMENSION(:,:), INTENT(OUT) :: PSFCO2! surface flux of CO2 (m/s*kg/kg) REAL, DIMENSION(:,:), INTENT(OUT) :: PSFU ! surface fluxes of horizontal REAL, DIMENSION(:,:), INTENT(OUT) :: PSFV ! momentum in x and y directions (m2/s2) @@ -43,10 +43,10 @@ END INTERFACE ! END MODULE MODI_GROUND_PARAM_n ! -! ###################################################################### - SUBROUTINE GROUND_PARAM_n(D, PSFTH, PSFRV, PSFSV, PSFCO2, PSFU, PSFV, & +! ############################################################################### + SUBROUTINE GROUND_PARAM_n( D, PSFTH, PSFRV, PSFSV, PSFCO2, PSFU, PSFV, & PDIR_ALB, PSCA_ALB, PEMIS, PTSRAD, KTCOUNT, TPFILE ) -! ####################################################################### +! ############################################################################### ! ! !!**** *GROUND_PARAM* @@ -117,8 +117,11 @@ END MODULE MODI_GROUND_PARAM_n !! (V. Vionnet) 18/07/2017 add coupling for blowing snow module !! (Bielli S.) 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes ! P. Wautelet 20/05/2019: add name argument to ADDnFIELD_ll + new ADD4DFIELD_ll subroutine -! P. Wautelet 09/02/2022: bugfix: add missing XCURRENT_LEI computation ! A. Costes 12/2021: Blaze Fire model +! P. Wautelet 09/02/2022: bugfix: add missing XCURRENT_LEI computation +! P. Wautelet 30/09/2022: bugfix: missing communications for SWDIFF, SWDIR and LEI +! P. Wautelet 30/09/2022: bugfix: use XUNDEF from SURFEX for surface variables computed by SURFEX +! P. Wautelet 21/10/2022: bugfix: communicate halo values between processes for OUT variables !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -139,20 +142,19 @@ USE MODD_BUDGET, ONLY: LBUDGET_TH, LBUDGET_RV, NBUDGET_RV, NBUDGET_TH,TBUDGETS USE MODE_BUDGET, ONLY: BUDGET_STORE_INIT, BUDGET_STORE_END USE MODD_CST, ONLY : XP00, XCPD, XRD, XRV,XRHOLW, XDAY, XPI, XLVTT, XMD, XAVOGADRO USE MODD_DIMPHYEX, ONLY : DIMPHYEX_t -USE MODD_PARAMETERS, ONLY : JPVEXT, XUNDEF +USE MODD_PARAMETERS, ONLY : JPVEXT USE MODD_DYN_n, ONLY : XTSTEP USE MODD_CH_MNHC_n, ONLY : LUSECHEM -USE MODD_CH_M9_n, ONLY : CNAMES -USE MODD_FIELD_n, ONLY : XUT, XVT, XWT, XTHT, XRT, XPABST, XSVT, XTKET, XZWS,& -XLSPHI, XBMAP, XFMR0, XFMRFA, XFMWF0, XFMR00, XFMIGNITION, XFMFUELTYPE,& -XFIRETAU, XFLUXPARAMH, XFLUXPARAMW, XFIRERW, XFMASE, XFMAWC, XFMWALKIG,& -XFMFLUXHDH, XFMFLUXHDW, XRTHS, XRRS, XFMHWS, XFMWINDU, XFMWINDV, XFMWINDW, XGRADLSPHIX, & -XGRADLSPHIY, XFIREWIND, XFMGRADOROX, XFMGRADOROY +USE MODD_FIELD_n, ONLY : XUT, XVT, XWT, XTHT, XRT, XPABST, XSVT, XTKET, XZWS, & + XLSPHI, XBMAP, XFMR0, XFMRFA, XFMWF0, XFMR00, XFMIGNITION, XFMFUELTYPE,& + XFIRETAU, XFLUXPARAMH, XFLUXPARAMW, XFIRERW, XFMASE, XFMAWC, XFMWALKIG,& + XFMFLUXHDH, XFMFLUXHDW, XRTHS, XRRS, XFMHWS, XFMWINDU, XFMWINDV, XFMWINDW, XGRADLSPHIX, & + XGRADLSPHIY, XFIREWIND, XFMGRADOROX, XFMGRADOROY USE MODD_METRICS_n, ONLY : XDXX, XDYY, XDZZ USE MODD_DIM_n, ONLY : NKMAX USE MODD_GRID_n, ONLY : XLON, XZZ, XDIRCOSXW, XDIRCOSYW, XDIRCOSZW, & XCOSSLOPE, XSINSLOPE, XZS -USE MODD_REF_n, ONLY : XRHODREF,XRHODJ,XEXNREF +USE MODD_REF_n, ONLY : XEXNREF, XRHODREF, XRHODJ USE MODD_CONF_n, ONLY : NRR USE MODD_PARAM_n, ONLY : CDCONV,CCLOUD, CRAD USE MODD_PRECIP_n, ONLY : XINPRC, XINPRR, XINPRS, XINPRG, XINPRH @@ -176,9 +178,10 @@ USE MODD_CSTS_DUST, ONLY : XMOLARWEIGHT_DUST USE MODD_CSTS_SALT, ONLY : XMOLARWEIGHT_SALT USE MODD_CH_FLX_n, ONLY : XCHFLX USE MODD_DIAG_FLAG, ONLY : LCHEMDIAG +USE MODD_SURF_PAR, ONLY: XUNDEF_SFX => XUNDEF ! USE MODI_NORMAL_INTERPOL -USE MODE_ROTATE_WIND, ONLY : ROTATE_WIND +USE MODE_ROTATE_WIND, ONLY: ROTATE_WIND USE MODI_SHUMAN USE MODI_MNHGET_SURF_PARAM_n USE MODI_COUPLING_SURF_ATM_n @@ -221,7 +224,7 @@ TYPE(DIMPHYEX_t), INTENT(IN) :: D REAL, DIMENSION(:,:), INTENT(OUT) :: PSFTH ! surface flux of potential temperature (Km/s) REAL, DIMENSION(:,:), INTENT(OUT) :: PSFRV ! surface flux of water vapor (m/s*kg/kg) REAL, DIMENSION(:,:,:),INTENT(OUT):: PSFSV ! surface flux of scalar (m/s*kg/kg) - ! flux of chemical var. (ppp.m/s) + ! flux of chemical var. (ppv.m/s) REAL, DIMENSION(:,:), INTENT(OUT) :: PSFCO2! surface flux of CO2 (m/s*kg/kg) REAL, DIMENSION(:,:), INTENT(OUT) :: PSFU ! surface fluxes of horizontal REAL, DIMENSION(:,:), INTENT(OUT) :: PSFV ! momentum in x and y directions (m2/s2) @@ -375,6 +378,7 @@ TYPE(LIST_ll), POINTER :: TZFIELDSURF_ll ! list of fields to excha INTEGER :: IINFO_ll ! return code of parallel routine ! ! +CHARACTER(LEN=6) :: YJSV CHARACTER(LEN=6), DIMENSION(:), ALLOCATABLE :: YSV_SURF ! name of the scalar variables ! sent to SURFEX ! @@ -401,16 +405,16 @@ IKE=IKU-JPVEXT ! CALL GET_INDICE_ll (IIB,IJB,IIE,IJE) ! -PSFTH = XUNDEF -PSFRV = XUNDEF -PSFSV = XUNDEF -PSFCO2 = XUNDEF -PSFU = XUNDEF -PSFV = XUNDEF -PDIR_ALB = XUNDEF -PSCA_ALB = XUNDEF -PEMIS = XUNDEF -PTSRAD = XUNDEF +PSFTH = XUNDEF_SFX +PSFRV = XUNDEF_SFX +PSFSV = XUNDEF_SFX +PSFCO2 = XUNDEF_SFX +PSFU = XUNDEF_SFX +PSFV = XUNDEF_SFX +PDIR_ALB = XUNDEF_SFX +PSCA_ALB = XUNDEF_SFX +PEMIS = XUNDEF_SFX +PTSRAD = XUNDEF_SFX ! ! !------------------------------------------------------------------------------- @@ -456,11 +460,11 @@ END IF ! 1.3 Rotate the wind ! --------------- ! -CALL ROTATE_WIND(D,XUT,XVT,XWT, & - XDIRCOSXW, XDIRCOSYW, XDIRCOSZW, & - XCOSSLOPE,XSINSLOPE, & - XDXX,XDYY,XDZZ, & - ZUA,ZVA ) +CALL ROTATE_WIND( D, XUT, XVT, XWT, & + XDIRCOSXW, XDIRCOSYW, XDIRCOSZW, & + XCOSSLOPE, XSINSLOPE, & + XDXX, XDYY, XDZZ, & + ZUA, ZVA ) ! ! 1.4 zonal and meridian components of the wind parallel to the slope @@ -695,7 +699,7 @@ FF_TIME = FF_TIME + XTSTEP PSFU(:,:) = 0. PSFV(:,:) = 0. ! -WHERE (ZSFU(:,:)/=XUNDEF .AND. ZWIND(:,:)>0.) +WHERE (ZSFU(:,:)/=XUNDEF_SFX .AND. ZWIND(:,:)>0.) PSFU(:,:) = - SQRT(ZSFU**2+ZSFV**2) * ZUA(:,:) / ZWIND(:,:) / XRHODREF(:,:,IKB) PSFV(:,:) = - SQRT(ZSFU**2+ZSFV**2) * ZVA(:,:) / ZWIND(:,:) / XRHODREF(:,:,IKB) END WHERE @@ -770,13 +774,9 @@ IF (LBLAZE) THEN !* 2.1.7 Test halo size ! -------------- IF (NHALO < 2 .AND. NFIRE_WENO_ORDER == 3) THEN - WRITE(ILUOUT,'(A/A)') 'ERROR BLAZE-FIRE : WENO3 fire gradient calculation needs NHALO >= 2' - !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','GROUND_PARAM_n','') - ELSEIF (NHALO < 3 .AND. NFIRE_WENO_ORDER == 5) THEN - WRITE(ILUOUT,'(A/A)') 'ERROR : WENO5 fire gradient calculation needs NHALO >= 3' - !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','GROUND_PARAM_n','') + CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'GROUND_PARAM_n', 'BLAZE-FIRE: WENO3 fire gradient calculation needs NHALO >= 2' ) + ELSE IF (NHALO < 3 .AND. NFIRE_WENO_ORDER == 5) THEN + CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'GROUND_PARAM_n', 'BLAZE-FIRE: WENO5 fire gradient calculation needs NHALO >= 3' ) END IF ! END IF @@ -878,7 +878,7 @@ IF(NSV .GT. 0) THEN END DO END IF ! -!* conversion from chemistry flux (molec/m2/s) to (ppp.m.s-1) +!* conversion from chemistry flux (molec/m2/s) to (ppv.m.s-1) ! IF (LUSECHEM) THEN DO JSV=NSV_CHEMBEG,NSV_CHEMEND @@ -889,7 +889,7 @@ ELSE PSFSV(:,:,NSV_CHEMBEG:NSV_CHEMEND) = 0. END IF ! -!* conversion from dust flux (kg/m2/s) to (ppp.m.s-1) +!* conversion from dust flux (kg/m2/s) to (ppv.m.s-1) ! IF (LDUST) THEN DO JSV=NSV_DSTBEG,NSV_DSTEND @@ -899,7 +899,7 @@ ELSE PSFSV(:,:,NSV_DSTBEG:NSV_DSTEND) = 0. END IF ! -!* conversion from sea salt flux (kg/m2/s) to (ppp.m.s-1) +!* conversion from sea salt flux (kg/m2/s) to (ppv.m.s-1) ! IF (LSALT) THEN DO JSV=NSV_SLTBEG,NSV_SLTEND @@ -909,7 +909,7 @@ ELSE PSFSV(:,:,NSV_SLTBEG:NSV_SLTEND) = 0. END IF ! -!* conversion from aerosol flux (molec/m2/s) to (ppp.m.s-1) +!* conversion from aerosol flux (molec/m2/s) to (ppv.m.s-1) ! IF (LORILAM) THEN DO JSV=NSV_AERBEG,NSV_AEREND @@ -938,6 +938,32 @@ END IF ! PSFCO2(:,:) = ZSFCO2(:,:) / XRHODREF(:,:,IKB) ! +! Communicate halo values +! +NULLIFY(TZFIELDSURF_ll) +!The commented communications are done in PHYS_PARAM_n +! CALL ADD2DFIELD_ll( TZFIELDSURF_ll,PSFTH, 'GROUND_PARAM_n::PSFTH' ) +! CALL ADD2DFIELD_ll( TZFIELDSURF_ll,PSFRV, 'GROUND_PARAM_n::PSFRV' ) +! DO JSV = 1, NSV +! WRITE( YJSV, '( I6.6 )' ) JSV +! CALL ADD2DFIELD_ll( TZFIELDSURF_ll,PSFSV(:,:,JSV), 'GROUND_PARAM_n::PSFSV'//YJSV ) +! END DO +! CALL ADD2DFIELD_ll( TZFIELDSURF_ll,PSFCO2, 'GROUND_PARAM_n::PSFCO2' ) +! CALL ADD2DFIELD_ll( TZFIELDSURF_ll,PSFU, 'GROUND_PARAM_n::PSFU' ) +! CALL ADD2DFIELD_ll( TZFIELDSURF_ll,PSFV, 'GROUND_PARAM_n::PSFV' ) +DO JLAYER = 1, SIZE( PDIR_ALB, 3 ) + WRITE( YJSV, '( I6.6 )' ) JLAYER + CALL ADD2DFIELD_ll( TZFIELDSURF_ll,PDIR_ALB(:,:,JLAYER), 'GROUND_PARAM_n::PDIR_ALB'//YJSV ) + CALL ADD2DFIELD_ll( TZFIELDSURF_ll,PSCA_ALB(:,:,JLAYER), 'GROUND_PARAM_n::PSCA_ALB'//YJSV ) +END DO +DO JLAYER = 1, SIZE( PEMIS, 3 ) + WRITE( YJSV, '( I6.6 )' ) JLAYER + CALL ADD2DFIELD_ll( TZFIELDSURF_ll,PEMIS(:,:,JLAYER), 'GROUND_PARAM_n::PEMIS'//YJSV ) +END DO +CALL ADD2DFIELD_ll( TZFIELDSURF_ll,PTSRAD, 'GROUND_PARAM_n::PTSRAD' ) + +CALL UPDATE_HALO_ll(TZFIELDSURF_ll,IINFO_ll) +CALL CLEANLIST_ll(TZFIELDSURF_ll) ! !* Diagnostics ! ----------- @@ -970,11 +996,14 @@ IF (LDIAG_IN_RUN) THEN CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_RN, 'GROUND_PARAM_n::XCURRENT_RN' ) CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_H, 'GROUND_PARAM_n::XCURRENT_H' ) CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_LE, 'GROUND_PARAM_n::XCURRENT_LE' ) + CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_LEI, 'GROUND_PARAM_n::XCURRENT_LEI' ) CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_GFLUX, 'GROUND_PARAM_n::XCURRENT_GFLUX' ) CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_SWD, 'GROUND_PARAM_n::XCURRENT_SWD' ) CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_SWU, 'GROUND_PARAM_n::XCURRENT_SWU' ) CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_LWD, 'GROUND_PARAM_n::XCURRENT_LWD' ) CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_LWU, 'GROUND_PARAM_n::XCURRENT_LWU' ) + CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_SWDIR, 'GROUND_PARAM_n::XCURRENT_SWDIR' ) + CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_SWDIFF, 'GROUND_PARAM_n::XCURRENT_SWDIFF' ) CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_T2M, 'GROUND_PARAM_n::XCURRENT_T2M' ) CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_Q2M, 'GROUND_PARAM_n::XCURRENT_Q2M' ) CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_HU2M, 'GROUND_PARAM_n::XCURRENT_HU2M' ) @@ -1141,12 +1170,12 @@ ISHAPE_2 = (/KDIM1,KDIM2/) ! ! Arguments in call to surface: ! -ZSFTH = XUNDEF -ZSFTQ = XUNDEF -IF (NSV>0) ZSFTS = XUNDEF -ZSFCO2 = XUNDEF -ZSFU = XUNDEF -ZSFV = XUNDEF +ZSFTH = XUNDEF_SFX +ZSFTQ = XUNDEF_SFX +IF (NSV>0) ZSFTS = XUNDEF_SFX +ZSFCO2 = XUNDEF_SFX +ZSFU = XUNDEF_SFX +ZSFV = XUNDEF_SFX ! ZSFTH (IIB:IIE,IJB:IJE) = RESHAPE(ZP_SFTH(:), ISHAPE_2) ZSFTQ (IIB:IIE,IJB:IJE) = RESHAPE(ZP_SFTQ(:), ISHAPE_2) @@ -1177,7 +1206,7 @@ IF (LDIAG_IN_RUN) THEN XCURRENT_HU2M (IIB:IIE,IJB:IJE) = RESHAPE(ZP_HU2M(:), ISHAPE_2) XCURRENT_ZON10M (IIB:IIE,IJB:IJE) = RESHAPE(ZP_ZON10M(:), ISHAPE_2) XCURRENT_MER10M (IIB:IIE,IJB:IJE) = RESHAPE(ZP_MER10M(:), ISHAPE_2) - XCURRENT_ZWS (IIB:IIE,IJB:IJE) = RESHAPE(ZP_ZWS(:), ISHAPE_2) + XCURRENT_ZWS (IIB:IIE,IJB:IJE) = RESHAPE(ZP_ZWS(:), ISHAPE_2) ENDIF ! DO JLAYER=1,SIZE(PDIR_ALB,3) diff --git a/src/MNH/ibm_affectp.f90 b/src/MNH/ibm_affectp.f90 index b0c998744f7971f296e01b421b8f959ed890136d..4f6bd44514015955aa2c20885d9f2535b20a898e 100644 --- a/src/MNH/ibm_affectp.f90 +++ b/src/MNH/ibm_affectp.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2019-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2019-2022 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. @@ -121,7 +121,7 @@ SUBROUTINE IBM_AFFECTP(PVAR,KIBM_LAYER,PRADIUS,PPOWERS,& USE MODD_RADIATIONS_n USE MODD_DYN_n USE MODD_FIELD_n - USE MODD_GRID_n, ONLY: XXHAT,XYHAT + USE MODD_GRID_n, ONLY: XDXHAT, XDYHAT ! IMPLICIT NONE ! @@ -225,7 +225,7 @@ SUBROUTINE IBM_AFFECTP(PVAR,KIBM_LAYER,PRADIUS,PPOWERS,& DO JN = 1,3 ! Z_LOCAT_IMAG(JN,:)= XIBM_IMAGE_P(JM,JMM,1 ,JN,:) - Z_DELTA_IMAG = ((XXHAT(JI+1)-XXHAT(JI))*(XYHAT(JJ+1)-XYHAT(JJ)))**0.5 + Z_DELTA_IMAG = ( XDXHAT(JI) * XDYHAT(JJ) ) ** 0.5 I_INDEX_CORN(:) = NIBM_IMAGE_P(JM,JMM,1,1,JN,:) IF (I_INDEX_CORN(1)==0.AND.JN==2) ZIBM_HALO=0. IF (I_INDEX_CORN(2)==0.AND.JN==2) ZIBM_HALO=0. diff --git a/src/MNH/ibm_affectv.f90 b/src/MNH/ibm_affectv.f90 index 74df9a13dcc052c86357bf674ab178fff8dcfae7..fee54c3e094d852b8eba6a7df25ce569c094b4f3 100644 --- a/src/MNH/ibm_affectv.f90 +++ b/src/MNH/ibm_affectv.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2019-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2019-2022 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. @@ -129,7 +129,7 @@ SUBROUTINE IBM_AFFECTV(PVAR,PVAR2,PVAR3,HVAR,KIBM_LAYER,HIBM_MODE_INTE3,& USE MODD_IBM_PARAM_n USE MODD_FIELD_n USE MODD_PARAM_n, ONLY: CTURB - USE MODD_GRID_n, ONLY: XXHAT,XYHAT,XZZ + USE MODD_GRID_n, ONLY: XDXHAT, XDYHAT USE MODD_VAR_ll, ONLY: IP USE MODD_LBC_n USE MODD_REF_n, ONLY: XRHODJ,XRHODREF @@ -290,7 +290,7 @@ SUBROUTINE IBM_AFFECTV(PVAR,PVAR2,PVAR3,HVAR,KIBM_LAYER,HIBM_MODE_INTE3,& DO JN = 1,3 ! Z_LOCAT_IMAG(JN,:)= XIBM_IMAGE_V(JM,JMM,JH ,JN,:) - Z_DELTA_IMAG = ((XXHAT(JI+1)-XXHAT(JI))*(XYHAT(JJ+1)-XYHAT(JJ)))**0.5 + Z_DELTA_IMAG = ( XDXHAT(JI) * XDYHAT(JJ) ) ** 0.5 ! DO JLL=1,3 I_INDEX_CORN(:) = NIBM_IMAGE_V(JM,JMM,JH,JLL,JN,:) diff --git a/src/MNH/ibm_balance.f90 b/src/MNH/ibm_balance.f90 index 2256cd097bc547fd789da11f5fc85507a808242d..e1ed43c51bd559873d0e4adb640a49a9c68c9d66 100644 --- a/src/MNH/ibm_balance.f90 +++ b/src/MNH/ibm_balance.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2019-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2019-2022 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. @@ -57,6 +57,7 @@ SUBROUTINE IBM_BALANCE(PPHI,PVOL,PRUS,PRVS,PRWS,PBAL) ! MODIFICATIONS ! ------------- ! Original 01/01/2019 + ! P. Wautelet 31/08/2022: use XDXHAT and XDYHAT instead of XXHAT and XYHAT ! !------------------------------------------------------------------------------ ! @@ -69,7 +70,7 @@ SUBROUTINE IBM_BALANCE(PPHI,PVOL,PRUS,PRVS,PRWS,PBAL) ! declaration USE MODD_CST, ONLY: XPI USE MODD_IBM_PARAM_n - USE MODD_GRID_n, ONLY: XXHAT,XYHAT,XZHAT,XZZ + USE MODD_GRID_n, ONLY: XDXHAT, XDYHAT, XZZ USE MODD_PARAMETERS, ONLY: JPVEXT,JPHEXT USE MODD_LBC_n USE MODD_REF_n @@ -140,7 +141,7 @@ SUBROUTINE IBM_BALANCE(PPHI,PVOL,PRUS,PRVS,PRWS,PBAL) JL = 2 JI2 = JI ZIBM_FLUX(JI2,JJ,JK,JL-1) = 0. - ZDEL = SQRT((XYHAT(JJ+1)-XYHAT(JJ))*0.5*(XZZ(JI2,JJ,JK+1)-XZZ(JI2,JJ,JK)+XZZ(JI2-1,JJ,JK+1)-XZZ(JI2-1,JJ,JK))) + ZDEL = SQRT( XDYHAT(JJ) * 0.5 * (XZZ(JI2,JJ,JK+1)-XZZ(JI2,JJ,JK)+XZZ(JI2-1,JJ,JK+1)-XZZ(JI2-1,JJ,JK)) ) ZPH1 = PPHI(JI2 ,JJ ,JK ,JL) ZSIG1 = max(0.,-ZPH1/abs(ZPH1)) ZVIT1 = ZSIG1*PRUS(JI2,JJ ,JK ) @@ -206,7 +207,7 @@ SUBROUTINE IBM_BALANCE(PPHI,PVOL,PRUS,PRVS,PRWS,PBAL) JL = 2 JI2 = JI+1 ZIBM_FLUX(JI2,JJ,JK,JL-1) = 0. - ZDEL = SQRT((XYHAT(JJ+1)-XYHAT(JJ))*0.5*(XZZ(JI2,JJ,JK+1)-XZZ(JI2,JJ,JK)+XZZ(JI2-1,JJ,JK+1)-XZZ(JI2-1,JJ,JK))) + ZDEL = SQRT( XDYHAT(JJ) * 0.5 * (XZZ(JI2,JJ,JK+1)-XZZ(JI2,JJ,JK)+XZZ(JI2-1,JJ,JK+1)-XZZ(JI2-1,JJ,JK)) ) ZPH1 = PPHI(JI2 ,JJ ,JK ,JL) ZSIG1 = max(0.,-ZPH1/abs(ZPH1)) ZVIT1 = ZSIG1*PRUS(JI2,JJ ,JK ) @@ -270,7 +271,7 @@ SUBROUTINE IBM_BALANCE(PPHI,PVOL,PRUS,PRVS,PRWS,PBAL) JL = 3 JJ2 = JJ ZIBM_FLUX(JI,JJ2,JK,JL-1) = 0. - ZDEL = SQRT((XXHAT(JI+1)-XXHAT(JI))*0.5*(XZZ(JI,JJ2,JK+1)-XZZ(JI,JJ2,JK)+XZZ(JI,JJ2-1,JK+1)-XZZ(JI,JJ2-1,JK))) + ZDEL = SQRT( XDXHAT(JI) * 0.5 * (XZZ(JI,JJ2,JK+1)-XZZ(JI,JJ2,JK)+XZZ(JI,JJ2-1,JK+1)-XZZ(JI,JJ2-1,JK)) ) ZPH1 = PPHI(JI ,JJ2 ,JK ,JL) ZSIG1 = max(0.,-ZPH1/abs(ZPH1)) ZVIT1 = ZSIG1*PRVS(JI ,JJ2,JK ) @@ -335,7 +336,7 @@ SUBROUTINE IBM_BALANCE(PPHI,PVOL,PRUS,PRVS,PRWS,PBAL) JL = 3 JJ2 = JJ+1 ZIBM_FLUX(JI,JJ2,JK,JL-1) = 0. - ZDEL = SQRT((XXHAT(JI+1)-XXHAT(JI))*0.5*(XZZ(JI,JJ2,JK+1)-XZZ(JI,JJ2,JK)+XZZ(JI,JJ2-1,JK+1)-XZZ(JI,JJ2-1,JK))) + ZDEL = SQRT( XDXHAT(JI) * 0.5 * (XZZ(JI,JJ2,JK+1)-XZZ(JI,JJ2,JK)+XZZ(JI,JJ2-1,JK+1)-XZZ(JI,JJ2-1,JK)) ) ZPH1 = PPHI(JI ,JJ2 ,JK ,JL) ZSIG1 = max(0.,-ZPH1/abs(ZPH1)) ZVIT1 = ZSIG1*PRVS(JI ,JJ2,JK ) @@ -401,7 +402,7 @@ SUBROUTINE IBM_BALANCE(PPHI,PVOL,PRUS,PRVS,PRWS,PBAL) JL = 4 JK2 = JK ZIBM_FLUX(JI,JJ,JK2,JL-1) = 0. - ZDEL = SQRT((XXHAT(JI+1)-XXHAT(JI))*(XYHAT(JJ+1)-XYHAT(JJ))) + ZDEL = SQRT( XDXHAT(JI) * XDYHAT(JJ) ) ZPH1 = PPHI(JI ,JJ ,JK2 ,JL) ZSIG1 = max(0.,-ZPH1/abs(ZPH1)) ZVIT1 = ZSIG1*PRWS(JI ,JJ ,JK2) @@ -467,7 +468,7 @@ SUBROUTINE IBM_BALANCE(PPHI,PVOL,PRUS,PRVS,PRWS,PBAL) JL = 4 JK2 = JK+1 ZIBM_FLUX(JI,JJ,JK2,JL-1) = 0. - ZDEL = SQRT((XXHAT(JI+1)-XXHAT(JI))*(XYHAT(JJ+1)-XYHAT(JJ))) + ZDEL = SQRT( XDXHAT(JI) * XDYHAT(JJ) ) ZPH1 = PPHI(JI ,JJ ,JK2 ,JL) ZSIG1 = max(0.,-ZPH1/abs(ZPH1)) ZVIT1 = ZSIG1*PRWS(JI ,JJ ,JK2) diff --git a/src/MNH/ibm_detect.f90 b/src/MNH/ibm_detect.f90 index ca4530964ff6f617309a5df187c9c689cbf73d53..b88a80445aad736413f45e64431eae8f3a3c3db1 100644 --- a/src/MNH/ibm_detect.f90 +++ b/src/MNH/ibm_detect.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2019-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2019-2022 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. @@ -75,7 +75,6 @@ SUBROUTINE IBM_DETECT(PPHI) ! declaration USE MODD_IBM_PARAM_n USE MODD_PARAMETERS, ONLY: JPVEXT,JPHEXT - USE MODD_GRID_n, ONLY: XXHAT,XYHAT,XZHAT,XZZ USE MODD_METRICS_n, ONLY: XDXX,XDYY,XDZZ,XDZX,XDZY USE MODD_LBC_n USE MODD_CONF, ONLY: NHALO diff --git a/src/MNH/ibm_generls.f90 b/src/MNH/ibm_generls.f90 index a129d210930de85d7ade5ed783ce6c57c7714ad7..1b768365207207d3f7c07875bc3c44ccdfb61a0d 100644 --- a/src/MNH/ibm_generls.f90 +++ b/src/MNH/ibm_generls.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2021-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2021-2022 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. @@ -76,7 +76,6 @@ SUBROUTINE IBM_GENERLS(PIBM_FACES,PNORM_FACES,PV1,PV2,PV3,PX_MIN,PY_MIN,PX_MAX,P USE MODD_IBM_LSF USE MODD_DIM_n, ONLY: NIMAX,NJMAX,NKMAX USE MODD_PARAMETERS, ONLY: JPVEXT,JPHEXT,XUNDEF - USE MODD_GRID_n, ONLY: XXHAT,XYHAT,XZHAT,XZZ USE MODD_METRICS_n, ONLY: XDXX,XDYY,XDZZ USE MODD_VAR_ll, ONLY: IP USE MODD_CST, ONLY: XMNH_EPSILON diff --git a/src/MNH/ibm_idealee.f90 b/src/MNH/ibm_idealee.f90 index e08be780d96d538d079536dc127c04074e860dd8..1c2d6449fec35679e66e1b036ac9773fddce7504 100644 --- a/src/MNH/ibm_idealee.f90 +++ b/src/MNH/ibm_idealee.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2019-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2019-2022 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. @@ -69,7 +69,6 @@ SUBROUTINE IBM_IDEALEE(KNUMB_OBS,PIBM_XYZ,PPHI) ! declaration USE MODD_IBM_PARAM_n USE MODD_DIM_n, ONLY: NIMAX,NJMAX,NKMAX - USE MODD_GRID_n, ONLY: XXHAT,XYHAT,XZZ USE MODD_PARAMETERS, ONLY: JPVEXT,JPHEXT ! ! interface diff --git a/src/MNH/ibm_idealrp.f90 b/src/MNH/ibm_idealrp.f90 index a67bb5fd2a5095ed294c0ec9a67bc547dc0e0273..3c2a0c77dcb2425eeb27901e538e5eeaad87af6b 100644 --- a/src/MNH/ibm_idealrp.f90 +++ b/src/MNH/ibm_idealrp.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2019-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2019-2022 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. @@ -68,12 +68,11 @@ SUBROUTINE IBM_IDEALRP(KNUMB_OBS,PIBM_XYZ,PPHI) USE MODE_POS USE MODE_ll USE MODE_IO - USE MODE_GATHER_ll ! ! declaration USE MODD_IBM_PARAM_n USE MODD_DIM_n, ONLY: NIMAX,NJMAX,NKMAX - USE MODD_GRID_n, ONLY: XXHAT,XYHAT,XZHAT,XZZ + USE MODD_GRID_n, ONLY: XXHAT,XYHAT,XZHAT, XXHAT_ll, XYHAT_ll, XZZ USE MODD_PARAMETERS, ONLY: JPVEXT,JPHEXT ! ! interface @@ -105,7 +104,6 @@ SUBROUTINE IBM_IDEALRP(KNUMB_OBS,PIBM_XYZ,PPHI) REAL, ALLOCATABLE :: ZDIST_SUR6,ZDIST_REF0 REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZXHATM,ZYHATM,ZZHATM ! mesh location (mass nodes) REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZXHATC,ZYHATC,ZZHATC ! mesh location (cell nodes) - REAL, DIMENSION(:) , ALLOCATABLE :: ZXHAT_ll,ZYHAT_ll CHARACTER(LEN=1) :: YPOS INTEGER :: NRESP ! @@ -140,14 +138,10 @@ SUBROUTINE IBM_IDEALRP(KNUMB_OBS,PIBM_XYZ,PPHI) ! ---------------- ! CALL GET_GLOBALDIMS_ll(IIU_ll,IJU_ll) - ALLOCATE(ZXHAT_ll(IIU_ll+ 2 * JPHEXT)) - ALLOCATE(ZYHAT_ll(IJU_ll+ 2 * JPHEXT)) - CALL GATHERALL_FIELD_ll('XX',XXHAT,ZXHAT_ll,NRESP) - CALL GATHERALL_FIELD_ll('YY',XYHAT,ZYHAT_ll,NRESP) ZDELTX = abs((PIBM_XYZ(KNUMB_OBS,1)-PIBM_XYZ(KNUMB_OBS,2))/ & - ((ZXHAT_ll(IIU_ll+2)-ZXHAT_ll(2))/(IIU_ll*1.))) + ((XXHAT_ll(IIU_ll+2)-XXHAT_ll(2))/(IIU_ll*1.))) ZDELTY = abs((PIBM_XYZ(KNUMB_OBS,3)-PIBM_XYZ(KNUMB_OBS,4))/ & - ((ZYHAT_ll(IJU_ll+2)-ZYHAT_ll(2))/(IJU_ll*1.))) + ((XYHAT_ll(IJU_ll+2)-XYHAT_ll(2))/(IJU_ll*1.))) ZDELTZ = abs((PIBM_XYZ(KNUMB_OBS,5)-PIBM_XYZ(KNUMB_OBS,6))/ & ((XZHAT(IKU)-XZHAT(2))/(IKU*1.-2.))) ! @@ -301,7 +295,6 @@ SUBROUTINE IBM_IDEALRP(KNUMB_OBS,PIBM_XYZ,PPHI) ! ----------------------- ! DEALLOCATE(ZXHATC,ZYHATC,ZZHATC) - DEALLOCATE(ZXHAT_ll,ZYHAT_ll) DEALLOCATE(ZTEST_XMIN,ZTEST_XMAX,ZTEST_YMIN,ZTEST_YMAX,ZTEST_ZMIN,ZTEST_ZMAX) DEALLOCATE(ZPOSI_XYZ0,ZPOSI_XYZ1,ZPOSI_XYZ2) DEALLOCATE(ZDIST_SUR0,ZDIST_SUR1,ZDIST_SUR2,ZDIST_SUR3,ZDIST_SUR4,ZDIST_SUR5,ZDIST_SUR6,ZDIST_REF0) diff --git a/src/MNH/ibm_init_ls.f90 b/src/MNH/ibm_init_ls.f90 index 2d881e1fd564803d1d7f786993fa5efc2fe14042..bdfbff5ad10d7304d4ad3efa355e280305fc8250 100644 --- a/src/MNH/ibm_init_ls.f90 +++ b/src/MNH/ibm_init_ls.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2019-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2019-2022 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. @@ -70,7 +70,7 @@ SUBROUTINE IBM_INIT_LS(PPHI) USE MODD_IBM_PARAM_n, ONLY: XIBM_EPSI,XIBM_IEPS USE MODD_IBM_LSF, ONLY: LIBM_LSF,CIBM_TYPE,NIBM_SMOOTH,XIBM_SMOOTH USE MODD_VAR_ll, ONLY: IP - USE MODD_GRID_n, ONLY: XXHAT,XYHAT,XZHAT,XZZ + USE MODD_GRID_n, ONLY: XZZ USE MODD_PARAMETERS, ONLY: XUNDEF,JPHEXT,JPVEXT ! ! interface diff --git a/src/MNH/ibm_smooth_ls.f90 b/src/MNH/ibm_smooth_ls.f90 index 96144123454422ed14e94f1ae592098171937ca9..7e06c354df84832fcb6a2ffaf27490fecd3d71b2 100644 --- a/src/MNH/ibm_smooth_ls.f90 +++ b/src/MNH/ibm_smooth_ls.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2019-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2019-2022 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. @@ -74,7 +74,7 @@ SUBROUTINE IBM_SMOOTH_LS(KIBM_SMOOTH,PIBM_SMOOTH,PPHI) USE MODD_IBM_PARAM_n USE MODD_IBM_LSF USE MODD_PARAMETERS, ONLY: JPVEXT,JPHEXT - USE MODD_GRID_n, ONLY: XXHAT,XYHAT,XZZ + USE MODD_GRID_n, ONLY: XDXHAT, XDYHAT USE MODD_METRICS_n, ONLY: XDXX,XDYY,XDZZ,XDZX,XDZY USE MODD_ARGSLIST_ll, ONLY: LIST_ll USE MODD_VAR_ll, ONLY: IP @@ -131,8 +131,8 @@ SUBROUTINE IBM_SMOOTH_LS(KIBM_SMOOTH,PIBM_SMOOTH,PPHI) ! IKE = IKU - JPVEXT IKB = 1 + JPVEXT - ZREF =(1.e-2)*((XXHAT(IIB+1)-XXHAT(IIB))*(XYHAT(IJB+1)-XYHAT(IJB)))**0.5 - ZREF3=((XXHAT(IIB+1)-XXHAT(IIB))*(XYHAT(IJB+1)-XYHAT(IJB)))**0.5 + ZREF =(1.e-2)*( XDXHAT(IIB) * XDYHAT(IJB) )**0.5 + ZREF3= ( XDXHAT(IIB) * XDYHAT(IJB) )**0.5 ! ! Boundary symmetry ! diff --git a/src/MNH/ibm_volume.f90 b/src/MNH/ibm_volume.f90 index af4012a42b9cba352d527c22179f6de698ff59dc..ec734278ffa65c8cff5eef79aa8247ebe816a099 100644 --- a/src/MNH/ibm_volume.f90 +++ b/src/MNH/ibm_volume.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2019-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2019-2022 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. @@ -66,7 +66,6 @@ SUBROUTINE IBM_VOLUME(PPHI,PVOL) ! ! declaration USE MODD_IBM_PARAM_n - USE MODD_GRID_n, ONLY: XXHAT,XYHAT,XZHAT,XZZ USE MODD_PARAMETERS, ONLY: JPVEXT,JPHEXT USE MODD_LBC_n USE MODD_LUNIT_n, ONLY: TLUOUT diff --git a/src/MNH/ini_aircraft.f90 b/src/MNH/ini_aircraft.f90 index 2df9363014ca83596f600d3a8d27b7bf60d4f77d..331df58cf9ea2e50738f7fdbc9bcaf73816c0bd3 100644 --- a/src/MNH/ini_aircraft.f90 +++ b/src/MNH/ini_aircraft.f90 @@ -1,8 +1,20 @@ -!MNH_LIC Copyright 2000-2020 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2000-2023 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 MODE_INI_AIRCRAFT + +IMPLICIT NONE + +PRIVATE + +PUBLIC :: INI_AIRCRAFT + +INTEGER, PARAMETER :: NMAXLINELGT = 256 + +CONTAINS + ! ####################### SUBROUTINE INI_AIRCRAFT ! ####################### @@ -41,9 +53,9 @@ !! !! 6) the (SEG ) duration of flight in the segments, in the flight order (sec.) !! -!! 6bis) TAIRCRAFT%ALTDEF : flag to define the mode of initialisation of -!! aircraft altitude TRUE for pressure (corresponding to %SEGP) -!! or FALSE for Z (corresponding to %SEGZ) +!! 6bis) TAIRCRAFT%LALTDEF : flag to define the mode of initialisation of +!! aircraft altitude TRUE for pressure (corresponding to %XSEGP) +!! or FALSE for Z (corresponding to %XSEGZ) !! !! 7) the (SEG+1) latitudes of the segments ends, in the flight order !! first point is take-off @@ -51,7 +63,7 @@ !! !! 8) the (SEG+1) longitudes of the segments ends, in the flight order !! -!! 9) the (SEG+1) pressure (%SEGP) or Z (%SEGZ) of the segments ends, in the flight order +!! 9) the (SEG+1) pressure (%XSEGP) or Z (%XSEGZ) of the segments ends, in the flight order !! !! !! @@ -62,8 +74,8 @@ !! 9) the time step for data storage. !! default is 60s !! -!! 10) the name or title describing the balloon (8 characters) -!! default is the balloon type (6 characters) + the balloon numbers (2 characters) +!! 10) the name or title describing the aircraft (8 characters) +!! default is the aircraft type (6 characters) + the aircraft numbers (2 characters) !! !! !! EXTERNAL @@ -83,2044 +95,168 @@ !! ------------- !! Original 15/05/2000 !! Sept2009, A. Boilley add initialisation of aircraft altitude by Z -!! -!! -!! -------------------------------------------------------------------------- -! +! P. Wautelet 06/2022: reorganize flyers +! P. Wautelet 19/08/2022: provide aircraft characteristics in namelist and CSV file instead of hardcoded +! -------------------------------------------------------------------------- +! !* 0. DECLARATIONS ! ------------ ! USE MODD_AIRCRAFT_BALLOON -! -! -IMPLICIT NONE -! -! -!* 0.1 declarations of arguments -! -! -!------------------------------------------------------------------------------- -! -! 0.2 declaration of local variables -! -! -!---------------------------------------------------------------------------- -! -!* 1. Aircraft number 1 -! ----------------- -! -!* model number -! -TAIRCRAFT1%NMODEL = 0 -! -!* model switch -! -TAIRCRAFT1%MODEL = 'FIX' -! -!* aircraft type -! -TAIRCRAFT1%TYPE = 'AIRCRA' -! -!* aircraft flight name -! -TAIRCRAFT1%TITLE = 'DIMO19A' -! -!* time step for storage -! -TAIRCRAFT1%STEP = 60. -! -!* take-off date and time -! -TAIRCRAFT1%LAUNCH%nyear = 2007 -TAIRCRAFT1%LAUNCH%nmonth = 04 -TAIRCRAFT1%LAUNCH%nday = 19 -TAIRCRAFT1%LAUNCH%xtime = 32280. -! -!* number of flight segments -! -TAIRCRAFT1%SEG = 168 -! -!* initalisation of flag for pressure (T) or Z(F) for aicraft altitude -! -TAIRCRAFT1%ALTDEF = .TRUE. -! -!* allocation of the arrays -! -ALLOCATE(TAIRCRAFT1%SEGTIME(TAIRCRAFT1%SEG )) -ALLOCATE(TAIRCRAFT1%SEGLAT (TAIRCRAFT1%SEG+1)) -ALLOCATE(TAIRCRAFT1%SEGLON (TAIRCRAFT1%SEG+1)) -! -!* duration of the segments (seconds) -! -TAIRCRAFT1%SEGTIME = (/ 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60 /) -! -!* latitudes of the segments ends (1st point is takeoff, last point is landing) -! (decimal degrees) -! -TAIRCRAFT1%SEGLAT = (/ 44.39971, 44.40095, 44.40040, 44.39919, 44.39657,& - 44.39339, 44.38749, 44.37916, 44.37464, 44.37021,& - 44.37045, 44.37059, 44.37443, 44.37222, 44.35214,& - 44.36092, 44.38175, 44.40122, 44.41992, 44.43539,& - 44.45071, 44.46737, 44.48038, 44.47368, 44.46140,& - 44.45519, 44.46365, 44.46959, 44.47475, 44.48028,& - 44.47210, 44.46509, 44.46825, 44.47021, 44.48252,& - 44.50106, 44.52266, 44.54233, 44.55776, 44.56624,& - 44.57126, 44.57083, 44.57098, 44.57155, 44.56524,& - 44.56006, 44.56914, 44.57413, 44.57368, 44.56907,& - 44.56207, 44.55547, 44.54991, 44.54553, 44.54143,& - 44.53734, 44.53293, 44.52783, 44.52403, 44.52920,& - 44.54065, 44.54570, 44.54875, 44.55127, 44.55372,& - 44.56859, 44.58518, 44.56456, 44.53939, 44.54009,& - 44.56265, 44.58650, 44.60879, 44.61819, 44.61754,& - 44.61660, 44.62217, 44.61920, 44.61041, 44.60369,& - 44.60041, 44.60191, 44.60322, 44.58885, 44.56374,& - 44.54355, 44.52951, 44.50729, 44.48498, 44.46095,& - 44.43832, 44.42894, 44.41980, 44.40837, 44.38897,& - 44.36689, 44.35023, 44.33820, 44.33409, 44.33662,& - 44.33859, 44.33223, 44.32123, 44.32175, 44.32951,& - 44.33953, 44.35040, 44.36167, 44.37196, 44.37869,& - 44.38493, 44.39208, 44.40101, 44.40943, 44.42089,& - 44.44113, 44.46887, 44.49583, 44.51708, 44.53618,& - 44.54475, 44.55005, 44.55511, 44.56009, 44.56446,& - 44.56590, 44.56728, 44.56972, 44.57093, 44.57225,& - 44.57260, 44.57197, 44.57016, 44.56544, 44.55235,& - 44.53552, 44.54387, 44.55054, 44.56146, 44.56070,& - 44.54054, 44.52130, 44.50292, 44.48638, 44.47290,& - 44.45529, 44.43734, 44.41889, 44.39770, 44.37671,& - 44.35838, 44.35707, 44.36639, 44.37534, 44.37753,& - 44.37753, 44.37986, 44.38700, 44.39457, 44.39753,& - 44.40017, 44.40076, 44.39730, 44.39181, 44.39756,& - 44.39935, 44.39868, 44.39727, 44.39696 /) -! -!* longitudes of the segments ends (1st point is takeoff, last point is landing) -! (decimal degrees) -! -TAIRCRAFT1%SEGLON = (/0.75561, 0.73090, 0.70157, 0.66896, 0.63468,& - 0.60107, 0.56909, 0.53738, 0.50474, 0.47315,& - 0.44092, 0.40665, 0.37725, 0.35171, 0.33016,& - 0.31340, 0.29638, 0.27594, 0.25293, 0.22663,& - 0.19920, 0.17395, 0.15872, 0.17700, 0.19870,& - 0.21796, 0.20584, 0.18416, 0.16200, 0.16042,& - 0.18704, 0.20952, 0.19838, 0.17702, 0.15936,& - 0.13843, 0.11309, 0.08309, 0.04845, 0.00948,& --0.03097,-0.07187,-0.11372,-0.15500,-0.19571,& --0.23476,-0.26490,-0.29027,-0.31521,-0.33867,& --0.36085,-0.38222,-0.40476,-0.42847,-0.45149,& --0.47413,-0.49675,-0.51926,-0.54853,-0.58352,& --0.61936,-0.65967,-0.70151,-0.74369,-0.78626,& --0.82035,-0.82679,-0.81080,-0.80093,-0.81855,& --0.83421,-0.84543,-0.85947,-0.88928,-0.92270,& --0.95642,-0.98774,-1.01802,-1.05282,-1.08807,& --1.12390,-1.15847,-1.19287,-1.22142,-1.24147,& --1.26289,-1.28825,-1.28869,-1.27067,-1.25984,& --1.25447,-1.22868,-1.19892,-1.16909,-1.14878,& --1.13185,-1.10636,-1.07398,-1.03438,-1.00077,& --0.97309,-0.94428,-0.91011,-0.87900,-0.85405,& --0.83235,-0.81217,-0.79231,-0.77125,-0.74612,& --0.71985,-0.69334,-0.66698,-0.64049,-0.61627,& --0.59738,-0.58007,-0.55652,-0.52248,-0.48603,& --0.44405,-0.39964,-0.35780,-0.32620,-0.29894,& --0.27061,-0.24144,-0.21229,-0.18267,-0.15256,& --0.12223,-0.09116,-0.05346,-0.00969, 0.03348,& - 0.07270, 0.07334, 0.03393, 0.00021, 0.01935,& - 0.05295, 0.08646, 0.11585, 0.14321, 0.17288,& - 0.20083, 0.22825, 0.25199, 0.27166, 0.29386,& - 0.31926, 0.35232, 0.38587, 0.41831, 0.45384,& - 0.49099, 0.52731, 0.56261, 0.59614, 0.63308,& - 0.67001, 0.70471, 0.73740, 0.76830, 0.76841,& - 0.75848, 0.76209, 0.76315, 0.76335 /) -! -!* pressure of the segments ends (1st point is takeoff, last point is landing) -! (pascals) -! -IF (TAIRCRAFT1%ALTDEF) THEN - ALLOCATE(TAIRCRAFT1%SEGP (TAIRCRAFT1%SEG+1)) - TAIRCRAFT1%SEGP = 100. * (/1003.6, 990.8, 988.1, 988.5, 989.3,& - 988.9, 989.6, 989.9, 990.3, 989.2,& - 990.8, 993.9, 987.7, 987.2, 992.0,& - 995.2, 993.9, 994.0, 994.3, 993.9,& - 993.9, 992.6, 981.6, 968.0, 954.6,& - 942.5, 929.8, 917.8, 904.2, 891.8,& - 879.5, 867.9, 857.0, 846.5, 840.0,& - 844.9, 857.8, 873.5, 889.7, 905.3,& - 921.5, 937.8, 953.9, 963.7, 978.8,& - 993.0, 984.1, 970.4, 955.6, 943.1,& - 930.3, 916.8, 904.4, 891.6, 878.6,& - 866.2, 854.3, 846.2, 851.2, 863.0,& - 878.3, 895.0, 912.3, 929.7, 944.7,& - 959.2, 967.2, 977.6, 981.9, 981.1,& - 982.1, 981.9, 984.4, 984.2, 983.6,& - 982.1, 978.6, 980.5, 982.1, 983.1,& - 984.2, 984.5, 983.6, 996.0,1003.8,& -1004.2,1001.4,1000.5,1002.3,1005.9,& -1000.9, 992.8, 989.7, 987.1, 985.1,& - 984.3, 982.4, 986.7, 999.1, 994.8,& - 984.1, 985.1, 997.0, 988.2, 975.0,& - 963.0, 949.0, 937.4, 925.3, 912.6,& - 898.8, 886.1, 873.6, 860.8, 848.3,& - 850.2, 863.4, 880.2, 898.0, 916.3,& - 932.8, 949.7, 959.7, 947.5, 933.3,& - 920.8, 907.4, 894.0, 881.4, 869.0,& - 858.0, 848.9, 852.2, 863.2, 880.0,& - 895.3, 909.6, 926.1, 942.0, 958.6,& - 977.3, 993.0, 995.6, 995.0, 993.0,& - 996.2, 995.1, 994.2, 993.4, 993.6,& - 992.0, 991.3, 993.2, 991.6, 993.1,& - 992.7, 992.0, 992.0, 989.4, 991.2,& - 989.5, 981.8, 977.8, 983.3,1001.9,& -1007.0,1006.8,1006.8, 1006.8 /) -ELSE - ALLOCATE(TAIRCRAFT1%SEGZ (TAIRCRAFT1%SEG+1)) -TAIRCRAFT1%SEGZ = (/8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000 /) -ENDIF -! -!---------------------------------------------------------------------------- -! -!* 1. Aircraft number 2 -! ----------------- -! -!* model number -! -TAIRCRAFT2%NMODEL = 0 -! -!* model switch -! -TAIRCRAFT2%MODEL = 'FIX' -! -!* aircraft type -! -TAIRCRAFT2%TYPE = 'AIRCRA' +USE MODD_CONF, ONLY: NMODEL_NEST => NMODEL +USE MODD_PARAMETERS, ONLY: XNEGUNDEF -!* aircraft flight name -! -TAIRCRAFT2%TITLE = 'DIMO19B' -! -!* time step for storage -! -TAIRCRAFT2%STEP = 60. -! -!* take-off date and time -! -TAIRCRAFT2%LAUNCH%nyear = 2007 -TAIRCRAFT2%LAUNCH%nmonth = 04 -TAIRCRAFT2%LAUNCH%nday = 19 -TAIRCRAFT2%LAUNCH%xtime = 48060. -! -!* number of flight segments -! -TAIRCRAFT2%SEG = 198 -! -!* initalisation of flag for pressure (T) or Z(F) for aicraft altitude -! -TAIRCRAFT2%ALTDEF = .TRUE. -! -!* allocation of the arrays -! -ALLOCATE(TAIRCRAFT2%SEGTIME(TAIRCRAFT2%SEG )) -ALLOCATE(TAIRCRAFT2%SEGLAT (TAIRCRAFT2%SEG+1)) -ALLOCATE(TAIRCRAFT2%SEGLON (TAIRCRAFT2%SEG+1)) -! -!* duration of the segments (seconds) -! -TAIRCRAFT2%SEGTIME = (/60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60 /) -! -!* latitudes of the segments ends (1st point is takeoff, last point is landing) -! (decimal degrees) -! -TAIRCRAFT2%SEGLAT = (/ 44.39819, 44.39967, 44.40104, 44.40074, 44.40085,& - 44.39843, 44.39619, 44.39141, 44.38353, 44.37732,& - 44.37508, 44.37609, 44.37377, 44.36764, 44.36083,& - 44.35442, 44.37187, 44.39327, 44.41394, 44.43280,& - 44.44887, 44.46759, 44.47026, 44.45759, 44.46716,& - 44.48098, 44.49223, 44.48031, 44.46436, 44.46050,& - 44.46611, 44.47339, 44.47535, 44.46444, 44.46467,& - 44.47678, 44.49333, 44.50428, 44.51275, 44.52244,& - 44.53453, 44.54696, 44.55673, 44.56092, 44.56132,& - 44.56116, 44.56225, 44.56290, 44.56055, 44.55233,& - 44.54409, 44.53433, 44.52137, 44.50897, 44.49627,& - 44.48420, 44.47599, 44.46897, 44.46110, 44.45206,& - 44.44454, 44.43702, 44.42862, 44.41992, 44.40707,& - 44.38769, 44.36858, 44.34945, 44.32974, 44.30938,& - 44.28888, 44.26943, 44.27339, 44.29464, 44.32345,& - 44.35428, 44.38620, 44.41810, 44.43924, 44.42371,& - 44.40729, 44.39663, 44.39174, 44.38035, 44.35685,& - 44.35082, 44.37277, 44.37210, 44.37059, 44.37076,& - 44.36948, 44.35924, 44.34744, 44.34207, 44.33859,& - 44.33485, 44.32219, 44.30517, 44.28314, 44.25674,& - 44.23110, 44.20517, 44.18849, 44.18723, 44.18804,& - 44.18820, 44.18341, 44.16808, 44.14988, 44.12651,& - 44.09887, 44.10007, 44.13022, 44.15963, 44.16313,& - 44.14156, 44.11520, 44.08806, 44.06374, 44.05124,& - 44.04458, 44.04106, 44.04035, 44.04010, 44.03897,& - 44.03530, 44.03939, 44.05114, 44.06269, 44.07460,& - 44.08650, 44.09131, 44.08050, 44.09213, 44.10666,& - 44.12659, 44.14738, 44.16590, 44.18314, 44.19906,& - 44.21885, 44.24219, 44.26652, 44.29116, 44.31433,& - 44.33735, 44.36057, 44.37947, 44.39634, 44.41202,& - 44.42718, 44.44310, 44.45702, 44.46577, 44.47367,& - 44.47522, 44.48508, 44.49589, 44.50652, 44.51467,& - 44.52342, 44.53589, 44.54841, 44.55751, 44.55326,& - 44.54398, 44.53334, 44.52054, 44.50654, 44.49421,& - 44.48487, 44.47112, 44.45230, 44.43285, 44.41224,& - 44.39065, 44.36929, 44.35484, 44.35927, 44.36936,& - 44.37609, 44.37666, 44.37590, 44.38037, 44.38779,& - 44.39413, 44.39740, 44.40002, 44.40032, 44.39755,& - 44.39226, 44.39494, 44.39910, 44.39862, 44.39719,& - 44.39691, 44.39692, 44.39689, 44.39694 /) -! -!* longitudes of the segments ends (1st point is takeoff, last point is landing) -! (decimal degrees) -! -TAIRCRAFT2%SEGLON = (/0.76323, 0.75549, 0.73212, 0.70405, 0.67289,& - 0.64082, 0.60831, 0.57717, 0.54697, 0.51578,& - 0.48245, 0.45056, 0.41783, 0.38851, 0.36046,& - 0.32828, 0.30353, 0.28176, 0.25886, 0.23647,& - 0.21031, 0.18783, 0.19138, 0.20574, 0.19556,& - 0.17902, 0.17207, 0.18561, 0.20057, 0.21096,& - 0.19209, 0.17406, 0.18880, 0.21157, 0.20492,& - 0.17724, 0.14803, 0.11416, 0.07884, 0.04294,& - 0.00754,-0.02836,-0.06645,-0.10613,-0.14594,& --0.18382,-0.21191,-0.23806,-0.26153,-0.28229,& --0.30235,-0.32461,-0.35502,-0.38888,-0.42649,& --0.46658,-0.49951,-0.52354,-0.54620,-0.56911,& --0.59210,-0.61530,-0.63781,-0.66103,-0.68000,& --0.68664,-0.68859,-0.68904,-0.68633,-0.68257,& --0.67785,-0.67856,-0.68504,-0.67421,-0.65909,& --0.64292,-0.62468,-0.60554,-0.60962,-0.64284,& --0.68049,-0.72153,-0.76308,-0.79993,-0.82295,& --0.80244,-0.79925,-0.83586,-0.87284,-0.90717,& --0.93954,-0.96673,-0.99345,-1.02688,-1.06013,& --1.09311,-1.12010,-1.14430,-1.15772,-1.15729,& --1.15461,-1.15633,-1.17298,-1.19786,-1.22215,& --1.24575,-1.26738,-1.27606,-1.27726,-1.28392,& --1.29406,-1.29028,-1.29255,-1.28781,-1.27630,& --1.29478,-1.30461,-1.31179,-1.30894,-1.28378,& --1.25748,-1.23181,-1.20656,-1.17989,-1.15381,& --1.12789,-1.10402,-1.08189,-1.05854,-1.03571,& --1.01321,-0.98957,-0.98981,-0.98826,-0.96629,& --0.94082,-0.91032,-0.87556,-0.83647,-0.79522,& --0.75987,-0.73047,-0.70212,-0.67419,-0.64559,& --0.61580,-0.58662,-0.56599,-0.55283,-0.53912,& --0.52493,-0.51192,-0.49392,-0.47041,-0.45111,& --0.43705,-0.41091,-0.38491,-0.35776,-0.32809,& --0.29403,-0.25181,-0.20625,-0.15899,-0.11076,& --0.06454,-0.01989, 0.02357, 0.06550, 0.10835,& - 0.15086, 0.18573, 0.21197, 0.23662, 0.25944,& - 0.28144, 0.30338, 0.32757, 0.35913, 0.39246,& - 0.42650, 0.46119, 0.49538, 0.52941, 0.56250,& - 0.59510, 0.63037, 0.66574, 0.69774, 0.72973,& - 0.75999, 0.77280, 0.75992, 0.76224, 0.76317,& - 0.76352, 0.76357, 0.76358, 0.76349 /) -! -!* pressure of the segments ends (1st point is takeoff, last point is landing) -! (pascals) -! -IF (TAIRCRAFT2%ALTDEF) THEN - ALLOCATE(TAIRCRAFT2%SEGP (TAIRCRAFT2%SEG+1)) -TAIRCRAFT2%SEGP = 100. * (/1001.,1001.0, 989.2, 987.5, 987.5,& - 987.9, 989.1, 990.2, 989.3, 988.6,& - 989.8, 989.6, 991.0, 986.1, 980.7,& - 986.5, 991.9, 991.5, 993.0, 992.1,& - 991.3, 991.8, 982.3, 972.0, 960.0,& - 950.5, 938.4, 924.8, 911.7, 899.5,& - 886.9, 876.2, 864.0, 849.9, 843.7,& - 852.1, 861.8, 871.3, 880.8, 891.3,& - 901.5, 913.5, 926.8, 940.6, 952.3,& - 952.9, 938.6, 921.6, 907.2, 898.2,& - 884.6, 880.2, 892.0, 902.0, 916.1,& - 931.1, 926.4, 909.7, 897.0, 891.0,& - 880.8, 868.3, 861.0, 851.4, 842.2,& - 833.7, 823.2, 809.5, 799.0, 789.0,& - 778.7, 768.7, 759.3, 761.1, 774.5,& - 789.5, 809.8, 829.7, 841.2, 856.2,& - 871.5, 886.9, 904.8, 923.0, 937.5,& - 952.0, 965.7, 980.8, 985.2, 988.0,& - 987.3, 985.8, 986.6, 989.8, 990.7,& - 991.4, 990.5, 989.1, 988.2, 988.0,& - 984.7, 985.0, 977.8, 964.8, 952.8,& - 941.3, 929.7, 918.2, 909.4, 915.3,& - 928.5, 943.0, 961.3, 978.0, 989.2,& - 992.9, 994.5, 994.4, 987.9, 974.2,& - 960.6, 946.6, 933.5, 920.8, 908.2,& - 895.7, 883.6, 872.7, 861.4, 850.0,& - 837.7, 825.8, 814.0, 803.1, 796.9,& - 803.0, 812.6, 824.4, 841.8, 859.3,& - 876.9, 893.8, 910.1, 928.2, 942.5,& - 962.5, 978.7, 964.3, 951.7, 937.5,& - 921.1, 906.0, 891.0, 879.2, 862.9,& - 847.7, 836.1, 826.2, 814.5, 802.0,& - 806.3, 820.0, 836.0, 853.4, 870.7,& - 889.7, 909.7, 929.1, 950.2, 971.8,& - 988.8, 993.3, 992.3, 991.9, 991.4,& - 992.0, 991.7, 988.2, 986.2, 989.9,& - 990.5, 991.2, 989.3, 988.5, 988.2,& - 986.8, 986.4, 987.0, 981.0, 975.5,& - 975.8, 993.9,1004.1,1004.1,1004.1,& -1004.1,1004.1,1004.1,1004.1 /) -ELSE - ALLOCATE(TAIRCRAFT2%SEGZ (TAIRCRAFT2%SEG+1)) - TAIRCRAFT2%SEGZ = (/8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000 /) -ENDIF -! -!---------------------------------------------------------------------------- -! -!* 1. Aircraft number 3 -! ----------------- -! -!* model number -! -TAIRCRAFT3%NMODEL = 0 -! -!* model switch -! -TAIRCRAFT3%MODEL = 'FIX' -! -!* aircraft type -! -TAIRCRAFT3%TYPE = 'AIRCRA' +USE MODE_MSG -!* aircraft flight name -! -TAIRCRAFT3%TITLE = 'SAAL19A' -! -!* time step for storage -! -TAIRCRAFT3%STEP = 30. -! -!* take-off date and time -! -TAIRCRAFT3%LAUNCH%nyear = 2007 -TAIRCRAFT3%LAUNCH%nmonth = 04 -TAIRCRAFT3%LAUNCH%nday = 19 -TAIRCRAFT3%LAUNCH%xtime = 45369 -! -!* number of flight segments -! -TAIRCRAFT3%SEG = 39 -! -!* initalisation of flag for pressure (T) or Z(F) for aicraft altitude -! -TAIRCRAFT3%ALTDEF = .TRUE. -! -!* allocation of the arrays -! -ALLOCATE(TAIRCRAFT3%SEGTIME(TAIRCRAFT3%SEG )) -ALLOCATE(TAIRCRAFT3%SEGLAT (TAIRCRAFT3%SEG+1)) -ALLOCATE(TAIRCRAFT3%SEGLON (TAIRCRAFT3%SEG+1)) -! -!* duration of the segments (seconds) -! -TAIRCRAFT3%SEGTIME = (/ 15, 16, 16, 18, 17, 17,& - 22, 25, 19, 19, 22, 27,& - 28, 27, 29, 32, 30, 24,& - 169, 18, 15, 18, 17, 16,& - 16, 14, 14, 18, 17, 15,& - 14, 14, 19, 20, 16, 15,& - 14, 16, 21 /) - -! -!* latitudes of the segments ends (1st point is takeoff, last point is landing) -! (decimal degrees) -! -TAIRCRAFT3%SEGLAT = (/ 44.14451, 44.14084, 44.14068, 44.14479, 44.14884,& - 44.14843, 44.14437, 44.14127, 44.14574, 44.14858,& - 44.14655, 44.14130, 44.14384, 44.14738, 44.14158,& - 44.14245, 44.14607, 44.14023, 44.14227, 44.15136,& - 44.14792, 44.14352, 44.13874, 44.13904, 44.14350,& - 44.14701, 44.14614, 44.14223, 44.14001, 44.14320,& - 44.14671, 44.14661, 44.14324, 44.14091, 44.14492,& - 44.14721, 44.14510, 44.14152, 44.14219, 44.14698 /) -! -!* longitudes of the segments ends (1st point is takeoff, last point is landing) -! (decimal degrees) -! -TAIRCRAFT3%SEGLON = (/0.95322, 0.95562, 0.96155, 0.96490, 0.96186,& - 0.95576, 0.95421, 0.96105, 0.96593, 0.96076,& - 0.95485, 0.95618, 0.96341, 0.95769, 0.95681,& - 0.96585, 0.96073, 0.96158, 0.97041, 0.96299,& - 0.95662, 0.95481, 0.95871, 0.96586, 0.96804,& - 0.96407, 0.95952, 0.95957, 0.96608, 0.97088,& - 0.96825, 0.96292, 0.96078, 0.96622, 0.96953,& - 0.96476, 0.96053, 0.96218, 0.96765, 0.96600 /) -! -!* pressure of the segments ends (1st point is takeoff, last point is landing) -! (pascals) -! -IF (TAIRCRAFT3%ALTDEF) THEN - ALLOCATE(TAIRCRAFT3%SEGP (TAIRCRAFT3%SEG+1)) -TAIRCRAFT3%SEGP = 100. * (/ 992.5, 987.4, 982.1, 976.4, 969.3,& - 964.3, 958.4, 952.9, 947.5, 942.8,& - 936.5, 930.8, 925.6, 919.8, 914.6,& - 909.2, 903.6, 898.0, 893.0, 881.8,& - 887.3, 892.5, 897.8, 903.1, 908.6,& - 914.1, 919.2, 924.9, 929.5, 935.2,& - 940.4, 946.6, 951.8, 957.8, 963.1,& - 969.1, 974.1, 980.0, 986.0, 993.0 /) -ELSE - ALLOCATE(TAIRCRAFT3%SEGZ (TAIRCRAFT3%SEG+1)) - TAIRCRAFT3%SEGZ = (/8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000 /) -ENDIF - -! -!---------------------------------------------------------------------------- -! -!* 1. Aircraft number 4 -! ----------------- -! -!* model number -! -TAIRCRAFT4%NMODEL = 0 -! -!* model switch -! -TAIRCRAFT4%MODEL = 'FIX' -! -!* aircraft type -! -TAIRCRAFT4%TYPE = 'AIRCRA' +USE MODN_AIRCRAFTS -!* aircraft flight name -! -TAIRCRAFT4%TITLE = 'SAAL19B' -! -!* time step for storage -! -TAIRCRAFT4%STEP = 30. -! -!* take-off date and time -! -TAIRCRAFT4%LAUNCH%nyear = 2007 -TAIRCRAFT4%LAUNCH%nmonth = 04 -TAIRCRAFT4%LAUNCH%nday = 19 -TAIRCRAFT4%LAUNCH%xtime = 60392. -! -!* number of flight segments -! -TAIRCRAFT4%SEG = 39 -! -!* initalisation of flag for pressure (T) or Z(F) for aicraft altitude -! -TAIRCRAFT4%ALTDEF = .TRUE. -! -!* allocation of the arrays -! -ALLOCATE(TAIRCRAFT4%SEGTIME(TAIRCRAFT4%SEG )) -ALLOCATE(TAIRCRAFT4%SEGLAT (TAIRCRAFT4%SEG+1)) -ALLOCATE(TAIRCRAFT4%SEGLON (TAIRCRAFT4%SEG+1)) -! -!* duration of the segments (seconds) -! -TAIRCRAFT4%SEGTIME = (/ 36, 18, 18, 21, 24, 23,& - 20, 20, 25, 27, 21, 25,& - 27, 23, 21, 23, 25, 21,& - 27, 190, 17, 17, 18, 17,& - 18, 17, 15, 18, 22, 17,& - 16, 18, 22, 22, 19, 20,& - 21, 23, 22 /) -! -!* latitudes of the segments ends (1st point is takeoff, last point is landing) -! (decimal degrees) -! -TAIRCRAFT4%SEGLAT = (/ 44.14025, 44.13824, 44.14291, 44.14575, 44.14321,& - 44.13749, 44.13853, 44.14373, 44.14530, 44.13921,& - 44.13773, 44.14285, 44.13974, 44.13622, 44.14093,& - 44.14375, 44.13868, 44.13771, 44.14272, 44.14156,& - 44.14130, 44.14335, 44.14031, 44.13480, 44.13150,& - 44.13157, 44.13507, 44.13921, 44.14201, 44.13823,& - 44.13479, 44.13668, 44.14132, 44.14112, 44.13621,& - 44.13775, 44.14254, 44.14194, 44.13669, 44.13837 /) - ! -!* longitudes of the segments ends (1st point is takeoff, last point is landing) -! (decimal degrees) -! -TAIRCRAFT4%SEGLON = (/ 0.94868, 0.95712, 0.95820, 0.95265, 0.94556,& - 0.94730, 0.95518, 0.95559, 0.94882, 0.94656,& - 0.95488, 0.95463, 0.94889, 0.95589, 0.95988,& - 0.95389, 0.95076, 0.95834, 0.95888, 0.95095,& - 0.95897, 0.95259, 0.94684, 0.94743, 0.95294,& - 0.96042, 0.96527, 0.96527, 0.95949, 0.95413,& - 0.95842, 0.96350, 0.96231, 0.95483, 0.95597,& - 0.96187, 0.96037, 0.95264, 0.95278, 0.95857 /) -! -!* pressure of the segments ends (1st point is takeoff, last point is landing) -! (pascals) -! -IF (TAIRCRAFT4%ALTDEF) THEN - ALLOCATE(TAIRCRAFT4%SEGP (TAIRCRAFT4%SEG+1)) -TAIRCRAFT4%SEGP = 100. * (/ 992.3, 985.4, 979.9, 974.2, 969.2,& - 962.8, 957.7, 952.1, 946.3, 940.5,& - 935.3, 930.4, 924.0, 918.9, 913.4,& - 907.8, 902.8, 897.1, 892.2, 886.3,& - 881.6, 886.6, 891.9, 897.0, 902.3,& - 907.9, 912.8, 918.3, 924.0, 929.0,& - 934.6, 940.3, 946.0, 951.4, 956.5,& - 962.8, 968.1, 973.7, 979.3, 984.9 /) - ELSE - ALLOCATE(TAIRCRAFT4%SEGZ (TAIRCRAFT4%SEG+1)) - TAIRCRAFT4%SEGZ = (/8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000/) -ENDIF +IMPLICIT NONE -! -!---------------------------------------------------------------------------- -! -!* 1. Aircraft number 5 -! ----------------- -! -!* model number -! -TAIRCRAFT5%NMODEL = 0 -! -!* model switch -! -TAIRCRAFT5%MODEL = 'FIX' -! -!* aircraft type -! -TAIRCRAFT5%TYPE = 'AIRCRA' +INTEGER :: JI +TYPE(TAIRCRAFTDATA), POINTER :: TZAIRCRAFT -!* aircraft flight name -! -TAIRCRAFT5%TITLE = 'SAIB19A' -! -!* time step for storage -! -TAIRCRAFT5%STEP = 30. -! -!* take-off date and time -! -TAIRCRAFT5%LAUNCH%nyear = 2007 -TAIRCRAFT5%LAUNCH%nmonth = 04 -TAIRCRAFT5%LAUNCH%nday = 19 -TAIRCRAFT5%LAUNCH%xtime = 43380. -! -!* number of flight segments -! -TAIRCRAFT5%SEG = 176 -! -!* initalisation of flag for pressure (T) or Z(F) for aicraft altitude -! -TAIRCRAFT5%ALTDEF = .TRUE. -! -!* allocation of the arrays -! -ALLOCATE(TAIRCRAFT5%SEGTIME(TAIRCRAFT5%SEG )) -ALLOCATE(TAIRCRAFT5%SEGLAT (TAIRCRAFT5%SEG+1)) -ALLOCATE(TAIRCRAFT5%SEGLON (TAIRCRAFT5%SEG+1)) -! -!* duration of the segments (seconds) -! -TAIRCRAFT5%SEGTIME = (/ 28, 28, 29, 29, 29, 28,& - 28, 28, 29, 26, 28, 27,& - 28, 27, 28, 27, 25, 27,& - 27, 26, 24, 25, 26, 26,& - 24, 25, 27, 27, 25, 27,& - 27, 28, 27, 28, 27, 27,& - 28, 28, 27, 28, 28, 28,& - 28, 28, 28, 27, 28, 26,& - 27, 27, 27, 26, 25, 25,& - 27, 27, 26, 25, 28, 28,& - 28, 27, 29, 27, 27, 28,& - 29, 27, 27, 27, 27, 26,& - 26, 26, 26, 25, 26, 26,& - 26, 27, 26, 25, 26, 25,& - 26, 25, 25, 25, 26, 25,& - 24, 25, 25, 25, 25, 24,& - 26, 26, 25, 25, 25, 26,& - 24, 23, 23, 24, 25, 22,& - 21, 24, 25, 24, 24, 24,& - 24, 24, 26, 26, 24, 26,& - 26, 25, 25, 27, 25, 25,& - 25, 25, 24, 24, 25, 24,& - 25, 24, 24, 24, 24, 25,& - 24, 24, 23, 25, 25, 24,& - 23, 25, 27, 26, 24, 25,& - 27, 27, 26, 26, 26, 25,& - 25, 26, 25, 25, 25, 25,& - 25, 26, 26, 25, 25, 25,& - 26, 26, 25, 25, 25, 25,& - 25, 25 /) +!Treat aircraft data read in namelist +DO JI = 1, NAIRCRAFTS + ALLOCATE( TAIRCRAFTS(JI)%TAIRCRAFT ) + TZAIRCRAFT => TAIRCRAFTS(JI)%TAIRCRAFT -! -!* latitudes of the segments ends (1st point is takeoff, last point is landing) -! (decimal degrees) -! -TAIRCRAFT5%SEGLAT = (/44.38992, 44.38830, 44.38713, 44.38609, 44.38512,& - 44.38420, 44.38336, 44.38248, 44.38151, 44.38046,& - 44.37942, 44.37835, 44.37729, 44.37630, 44.37530,& - 44.37407, 44.37156, 44.36766, 44.36184, 44.35421,& - 44.34673, 44.33986, 44.33271, 44.32536, 44.31800,& - 44.31084, 44.30350, 44.29764, 44.29618, 44.29837,& - 44.30431, 44.31233, 44.32061, 44.32872, 44.33691,& - 44.34478, 44.35284, 44.36091, 44.36894, 44.37666,& - 44.38478, 44.39273, 44.40079, 44.40907, 44.41711,& - 44.42513, 44.43278, 44.44096, 44.44872, 44.45604,& - 44.46205, 44.46722, 44.47121, 44.47528, 44.47961,& - 44.48401, 44.48833, 44.49243, 44.49633, 44.50052,& - 44.50473, 44.50888, 44.51291, 44.51712, 44.52108,& - 44.52521, 44.52945, 44.53390, 44.53808, 44.54208,& - 44.54610, 44.55014, 44.55407, 44.55854, 44.56353,& - 44.56913, 44.57520, 44.58130, 44.58722, 44.59335,& - 44.59960, 44.60600, 44.61232, 44.61881, 44.62519,& - 44.63163, 44.63794, 44.64420, 44.65037, 44.65659,& - 44.66282, 44.66911, 44.67549, 44.68206, 44.68845,& - 44.69469, 44.70078, 44.70619, 44.70841, 44.70754,& - 44.70336, 44.69652, 44.68935, 44.68254, 44.67577,& - 44.66869, 44.66101, 44.65345, 44.64679, 44.64044,& - 44.63337, 44.62587, 44.61864, 44.61169, 44.60483,& - 44.59803, 44.59103, 44.58360, 44.57622, 44.56934,& - 44.56229, 44.55523, 44.54845, 44.54173, 44.53448,& - 44.52751, 44.52062, 44.51361, 44.50655, 44.49974,& - 44.49290, 44.48547, 44.47823, 44.47103, 44.46391,& - 44.45718, 44.45013, 44.44316, 44.43579, 44.42883,& - 44.42169, 44.41486, 44.40771, 44.40028, 44.39341,& - 44.38669, 44.37949, 44.37202, 44.36499, 44.35838,& - 44.35147, 44.34417, 44.33688, 44.32985, 44.32279,& - 44.31593, 44.30918, 44.30215, 44.29464, 44.28732,& - 44.27999, 44.27291, 44.26616, 44.25944, 44.25235,& - 44.24517, 44.23800, 44.23081, 44.22393, 44.21662,& - 44.20946, 44.20266, 44.19582, 44.18895, 44.18196,& - 44.17498, 44.16789 /) + TZAIRCRAFT%NID = JI -! -!* longitudes of the segments ends (1st point is takeoff, last point is landing) -! (decimal degrees) -! -TAIRCRAFT5%SEGLON = (/ 0.60996, 0.59790, 0.58554, 0.57296, 0.56046,& - 0.54813, 0.53613, 0.52410, 0.51125, 0.49815,& - 0.48593, 0.47312, 0.46084, 0.44829, 0.43635,& - 0.42374, 0.41321, 0.40397, 0.39536, 0.38761,& - 0.37986, 0.37280, 0.36554, 0.35794, 0.35061,& - 0.34350, 0.33612, 0.32785, 0.32066, 0.31451,& - 0.30861, 0.30376, 0.29840, 0.29296, 0.28726,& - 0.28162, 0.27583, 0.26994, 0.26423, 0.25891,& - 0.25323, 0.24778, 0.24212, 0.23624, 0.23064,& - 0.22502, 0.21967, 0.21392, 0.20841, 0.20143,& - 0.19328, 0.18381, 0.17339, 0.16261, 0.15162,& - 0.14002, 0.12849, 0.11740, 0.10678, 0.09554,& - 0.08426, 0.07307, 0.06239, 0.05099, 0.04032,& - 0.02923, 0.01810, 0.00646,-0.00451,-0.01539,& --0.02655,-0.03777,-0.04874,-0.05951,-0.06992,& --0.08001,-0.08912,-0.09831,-0.10747,-0.11645,& --0.12552,-0.13428,-0.14260,-0.15142,-0.16039,& --0.16949,-0.17857,-0.18770,-0.19650,-0.20544,& --0.21419,-0.22292,-0.23212,-0.24134,-0.25051,& --0.25963,-0.26837,-0.27772,-0.28662,-0.29513,& --0.30338,-0.31122,-0.31934,-0.32710,-0.33460,& --0.34242,-0.35080,-0.35914,-0.36639,-0.37351,& --0.38158,-0.38999,-0.39802,-0.40577,-0.41337,& --0.42071,-0.42825,-0.43635,-0.44428,-0.45168,& --0.45980,-0.46756,-0.47507,-0.48266,-0.49060,& --0.49836,-0.50612,-0.51447,-0.52244,-0.53007,& --0.53764,-0.54520,-0.55282,-0.56051,-0.56820,& --0.57580,-0.58375,-0.59147,-0.59952,-0.60706,& --0.61472,-0.62227,-0.63041,-0.63860,-0.64631,& --0.65352,-0.66121,-0.66938,-0.67724,-0.68459,& --0.69224,-0.70005,-0.70780,-0.71548,-0.72306,& --0.73052,-0.73777,-0.74522,-0.75335,-0.76142,& --0.76949,-0.77717,-0.78452,-0.79186,-0.79943,& --0.80743,-0.81530,-0.82307,-0.83074,-0.83852,& --0.84620,-0.85372,-0.86115,-0.86912,-0.87743,& --0.88529,-0.89333 /) -! -! -!* pressure of the segments ends (1st point is takeoff, last point is landing) -! (pascals) -! -IF (TAIRCRAFT5%ALTDEF) THEN - ALLOCATE(TAIRCRAFT5%SEGP (TAIRCRAFT5%SEG+1)) -TAIRCRAFT5%SEGP = 100. * (/ 995.7, 998.1, 998.7, 998.8, 999.1,& - 999.3, 999.9,1000.4,1000.7,1000.6,& -1000.8,1000.8,1000.6,1000.5,1000.1,& - 999.7, 999.2, 999.2, 999.6,1000.5,& -1001.4,1001.6,1001.7,1001.6,1001.7,& -1001.9,1002.1,1001.9,1001.8,1001.7,& -1001.6,1001.7,1001.5,1001.2,1000.9,& -1000.7,1001.1,1001.5,1001.5,1001.5,& -1001.5,1001.5,1001.9,1002.2,1002.5,& -1002.7,1002.4,1001.9,1002.0,1001.9,& -1002.1,1002.7,1002.6,1002.7,1003.0,& -1003.2,1003.2,1003.3,1003.3,1003.2,& -1003.3,1003.4,1003.5,1003.0,1002.0,& -1000.8, 999.2, 998.3, 998.4, 998.3,& - 998.9, 999.5,1000.4,1001.9,1002.8,& -1003.3,1003.1,1001.2, 998.9, 996.9,& - 995.1, 994.9, 995.4, 995.5, 996.1,& - 996.5, 996.7, 996.8, 996.5, 996.2,& - 996.3, 997.2, 997.8, 998.6, 998.8,& - 997.9, 997.7, 996.8, 995.6, 994.7,& - 994.1, 993.8, 994.1, 995.1, 996.4,& - 999.0,1001.4,1002.9,1003.4,1002.7,& -1002.2,1001.8,1001.5,1001.2,1000.5,& -1000.0, 999.6, 998.4, 997.8, 997.3,& - 996.4, 996.5, 996.9, 996.9, 997.0,& - 997.1, 996.7, 996.9, 997.1, 997.2,& - 997.2, 997.0, 996.6, 996.0, 995.4,& - 994.9, 995.3, 996.0, 996.8, 997.4,& - 997.5, 997.6, 997.8, 998.0, 998.2,& - 998.3, 998.5, 998.6, 998.6, 998.6,& - 998.3, 998.0, 998.1, 998.2, 998.1,& - 997.9, 997.9, 997.5, 997.9, 998.4,& - 998.2, 997.4, 996.7, 996.1, 995.5,& - 996.0, 996.3, 996.2, 996.3, 996.0,& - 995.4, 995.4, 995.3, 994.8, 994.5,& - 994.1, 994.4 /) - ELSE - ALLOCATE(TAIRCRAFT5%SEGZ (TAIRCRAFT5%SEG+1)) - TAIRCRAFT5%SEGZ = (/8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000/) -ENDIF -! -! -!---------------------------------------------------------------------------- -! -!* 1. Aircraft number 6 -! ----------------- -! -!* model number -! -TAIRCRAFT6%NMODEL = 0 -! -!* model switch -! -TAIRCRAFT6%MODEL = 'FIX' -! -!* aircraft type -! -TAIRCRAFT6%TYPE = 'AIRCRA' + IF ( CTITLE(JI) == '' ) THEN + WRITE( CTITLE(JI), FMT = '( A, I3.3) ') TRIM( CTYPE(JI) ), JI -!* aircraft flight name -! -TAIRCRAFT6%TITLE = 'SAIB19B' -! -!* time step for storage -! -TAIRCRAFT6%STEP = 30. -! -!* take-off date and time -! -TAIRCRAFT6%LAUNCH%nyear = 2007 -TAIRCRAFT6%LAUNCH%nmonth = 04 -TAIRCRAFT6%LAUNCH%nday = 19 -TAIRCRAFT6%LAUNCH%xtime = 55992. -! -!* number of flight segments -! -TAIRCRAFT6%SEG = 179 -! -!* initalisation of flag for pressure (T) or Z(F) for aicraft altitude -! -TAIRCRAFT6%ALTDEF = .TRUE. -! -!* allocation of the arrays -! -ALLOCATE(TAIRCRAFT6%SEGTIME(TAIRCRAFT6%SEG )) -ALLOCATE(TAIRCRAFT6%SEGLAT (TAIRCRAFT6%SEG+1)) -ALLOCATE(TAIRCRAFT6%SEGLON (TAIRCRAFT6%SEG+1)) -! -!* duration of the segments (seconds) -! -TAIRCRAFT6%SEGTIME = (/ 27, 25, 26, 25, 25, 25,& - 25, 27, 28, 25, 26, 25,& - 26, 26, 26, 26, 25, 27,& - 27, 27, 27, 28, 28, 25,& - 27, 28, 27, 27, 26, 26,& - 26, 27, 26, 25, 25, 27,& - 27, 25, 26, 27, 27, 26,& - 27, 26, 26, 25, 26, 24,& - 25, 25, 25, 26, 27, 27,& - 27, 29, 29, 29, 29, 29,& - 29, 28, 29, 29, 27, 28,& - 28, 28, 26, 28, 26, 26,& - 25, 25, 28, 27, 26, 26,& - 29, 28, 26, 26, 27, 26,& - 26, 25, 26, 24, 25, 25,& - 26, 24, 25, 25, 27, 25,& - 26, 26, 26, 24, 24, 24,& - 24, 25, 25, 24, 25, 25,& - 25, 25, 24, 24, 24, 24,& - 23, 23, 24, 24, 24, 24,& - 27, 26, 25, 25, 26, 26,& - 24, 24, 25, 26, 25, 26,& - 26, 25, 26, 26, 27, 24,& - 25, 24, 25, 24, 26, 24,& - 24, 23, 24, 24, 23, 24,& - 25, 25, 24, 25, 28, 28,& - 26, 26, 28, 28, 28, 26,& - 27, 27, 27, 27, 26, 24,& - 24, 27, 28, 27, 26, 28,& - 29, 29, 28, 27, 28 /) -! -!* latitudes of the segments ends (1st point is takeoff, last point is landing) -! (decimal degrees) -! -TAIRCRAFT6%SEGLAT = (/ 44.14614, 44.14841, 44.15199, 44.15888, 44.16587,& - 44.17280, 44.17953, 44.18641, 44.19343, 44.20074,& - 44.20752, 44.21445, 44.22139, 44.22865, 44.23605,& - 44.24331, 44.25045, 44.25722, 44.26426, 44.27113,& - 44.27801, 44.28496, 44.29233, 44.29944, 44.30612,& - 44.31311, 44.32038, 44.32756, 44.33466, 44.34155,& - 44.34851, 44.35557, 44.36279, 44.36982, 44.37671,& - 44.38379, 44.39117, 44.39831, 44.40499, 44.41186,& - 44.41907, 44.42637, 44.43340, 44.44051, 44.44749,& - 44.45439, 44.46129, 44.46847, 44.47526, 44.48238,& - 44.48966, 44.49706, 44.50420, 44.51117, 44.51802,& - 44.52483, 44.53217, 44.53939, 44.54629, 44.55308,& - 44.56001, 44.56696, 44.57396, 44.58110, 44.58836,& - 44.59549, 44.60253, 44.60947, 44.61647, 44.62329,& - 44.63051, 44.63757, 44.64473, 44.65168, 44.65879,& - 44.66629, 44.67335, 44.68004, 44.68665, 44.69401,& - 44.70118, 44.70651, 44.70872, 44.70757, 44.70296,& - 44.69641, 44.69022, 44.68403, 44.67814, 44.67201,& - 44.66553, 44.65876, 44.65247, 44.64606, 44.63975,& - 44.63345, 44.62765, 44.62149, 44.61525, 44.60889,& - 44.60281, 44.59667, 44.59043, 44.58400, 44.57706,& - 44.57080, 44.56535, 44.56024, 44.55582, 44.55158,& - 44.54727, 44.54317, 44.53909, 44.53488, 44.53082,& - 44.52674, 44.52256, 44.51820, 44.51381, 44.50985,& - 44.50597, 44.50180, 44.49769, 44.49378, 44.48980,& - 44.48562, 44.48126, 44.47710, 44.47292, 44.46873,& - 44.46366, 44.45784, 44.45107, 44.44347, 44.43597,& - 44.42798, 44.41978, 44.41116, 44.40333, 44.39528,& - 44.38766, 44.37943, 44.37150, 44.36297, 44.35491,& - 44.34703, 44.33932, 44.33142, 44.32336, 44.31518,& - 44.30685, 44.29949, 44.29657, 44.29762, 44.30213,& - 44.30973, 44.31706, 44.32385, 44.33065, 44.33810,& - 44.34583, 44.35311, 44.35997, 44.36612, 44.37085,& - 44.37429, 44.37605, 44.37683, 44.37769, 44.37856,& - 44.37956, 44.38060, 44.38176, 44.38285, 44.38399,& - 44.38503, 44.38596, 44.38687, 44.38787, 44.38900 /) -! -!* longitudes of the segments ends (1st point is takeoff, last point is landing) -! (decimal degrees) -! -TAIRCRAFT6%SEGLON = (/-0.91544,-0.91300,-0.91007,-0.90375,-0.89495,& --0.88708,-0.87983,-0.87229,-0.86452,-0.85654,& --0.84914,-0.84153,-0.83408,-0.82634,-0.81846,& --0.81096,-0.80323,-0.79569,-0.78779,-0.78020,& --0.77269,-0.76506,-0.75705,-0.74908,-0.74182,& --0.73428,-0.72632,-0.71835,-0.71057,-0.70309,& --0.69558,-0.68793,-0.67997,-0.67218,-0.66448,& --0.65671,-0.64853,-0.64067,-0.63340,-0.62590,& --0.61814,-0.61023,-0.60250,-0.59460,-0.58691,& --0.57916,-0.57164,-0.56390,-0.55623,-0.54843,& --0.54024,-0.53200,-0.52405,-0.51616,-0.50871,& --0.50122,-0.49331,-0.48550,-0.47785,-0.47037,& --0.46268,-0.45501,-0.44730,-0.43928,-0.43133,& --0.42366,-0.41596,-0.40833,-0.40054,-0.39299,& --0.38491,-0.37715,-0.36912,-0.36132,-0.35336,& --0.34495,-0.33715,-0.32974,-0.32263,-0.31464,& --0.30671,-0.29859,-0.29010,-0.28099,-0.27146,& --0.26236,-0.25343,-0.24444,-0.23594,-0.22713,& --0.21787,-0.20837,-0.19956,-0.19056,-0.18158,& --0.17232,-0.16387,-0.15482,-0.14565,-0.13627,& --0.12737,-0.11867,-0.10967,-0.10052,-0.09125,& --0.08213,-0.07306,-0.06374,-0.05342,-0.04236,& --0.03127,-0.02006,-0.00892, 0.00231, 0.01348,& - 0.02438, 0.03579, 0.04783, 0.05932, 0.07014,& - 0.08075, 0.09185, 0.10281, 0.11332, 0.12413,& - 0.13581, 0.14777, 0.15852, 0.16945, 0.18071,& - 0.19117, 0.19969, 0.20670, 0.21238, 0.21771,& - 0.22343, 0.22936, 0.23526, 0.24051, 0.24602,& - 0.25125, 0.25706, 0.26283, 0.26897, 0.27450,& - 0.27996, 0.28523, 0.29072, 0.29630, 0.30192,& - 0.30769, 0.31455, 0.32105, 0.32751, 0.33412,& - 0.34105, 0.34838, 0.35544, 0.36269, 0.37056,& - 0.37841, 0.38584, 0.39290, 0.40050, 0.40952,& - 0.42039, 0.43293, 0.44570, 0.45767, 0.46948,& - 0.48277, 0.49606, 0.50844, 0.52011, 0.53235,& - 0.54491, 0.55738, 0.56943, 0.58104, 0.59369 /) -! -!* pressure of the segments ends (1st point is takeoff, last point is landing) -! (pascals) -! -IF (TAIRCRAFT6%ALTDEF) THEN - ALLOCATE(TAIRCRAFT6%SEGP (TAIRCRAFT6%SEG+1)) -TAIRCRAFT6%SEGP = 100. * (/ 990.1, 990.5, 991.1, 992.6, 993.7,& - 993.5, 993.2, 993.5, 993.8, 994.1,& - 994.4, 994.3, 994.3, 994.7, 995.4,& - 996.0, 996.2, 996.3, 996.1, 996.0,& - 996.3, 996.5, 996.9, 997.2, 997.1,& - 996.9, 996.5, 996.2, 995.9, 995.7,& - 996.0, 996.3, 996.6, 996.3, 995.8,& - 995.5, 995.3, 995.6, 996.0, 996.1,& - 996.0, 995.7, 995.4, 994.8, 994.3,& - 993.8, 993.7, 994.0, 994.6, 995.4,& - 996.0, 996.4, 996.3, 996.0, 995.6,& - 995.7, 995.7, 995.5, 995.1, 994.4,& - 994.1, 994.1, 994.7, 995.6, 996.4,& - 997.3, 997.8, 998.3, 998.8, 999.1,& - 999.4, 999.9,1000.5,1000.7,1000.7,& - 998.7, 996.2, 994.5, 993.0, 992.1,& - 991.9, 991.3, 991.7, 992.9, 994.4,& - 996.1, 996.5, 996.5, 996.3, 995.5,& - 995.0, 994.7, 994.4, 994.7, 995.2,& - 995.1, 995.1, 995.0, 994.7, 994.7,& - 994.9, 996.0, 997.9,1000.2,1001.6,& -1001.7,1001.6,1000.6, 999.7, 999.2,& - 998.1, 997.5, 997.3, 997.1, 997.2,& - 998.2, 999.6,1001.1,1002.2,1002.5,& -1002.2,1001.6,1000.7,1000.3,1000.3,& -1000.9,1001.2,1001.2,1001.2,1001.2,& -1001.3,1001.2,1000.8,1000.3,1000.2,& -1000.3,1000.3,1000.1, 999.5, 999.0,& - 998.7, 998.9, 999.3, 999.7, 999.4,& - 999.1, 999.0, 999.1, 999.4, 999.8,& - 999.7, 999.5, 999.5, 999.3, 999.4,& - 999.6, 999.2, 999.1, 998.9, 999.2,& - 999.1, 997.6, 995.9, 993.8, 993.9,& - 995.9, 998.5,1000.3,1000.3, 999.8,& - 999.2, 999.2, 999.2, 998.9, 998.4,& - 997.7, 997.1, 996.8, 996.9, 996.9 /) - ELSE - ALLOCATE(TAIRCRAFT6%SEGZ (TAIRCRAFT6%SEG+1)) - TAIRCRAFT6%SEGZ = (/8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000/) -ENDIF -! -!---------------------------------------------------------------------------- -! -! -!* 1. Aircraft number 7 -! ----------------- -! -!* model number -! -TAIRCRAFT7%NMODEL = 0 -! -!* model switch -! -TAIRCRAFT7%MODEL = 'FIX' -! -!* aircraft type -! -TAIRCRAFT7%TYPE = 'AIRCRA' + WRITE( CMNHMSG(1), FMT = '( A, I4 )' ) 'no title given to aircraft number ', JI + CMNHMSG(2) = 'title set to ' // TRIM( CTITLE(JI) ) + CALL PRINT_MSG( NVERB_INFO, 'GEN', 'INI_AIRCRAFT', OLOCAL = .TRUE. ) + END IF + TZAIRCRAFT%CTITLE = CTITLE(JI) -!* aircraft flight name -! -TAIRCRAFT7%TITLE = 'TEST_19' -! -!* time step for storage -! -TAIRCRAFT7%STEP = 60. -! -!* take-off date and time -! -TAIRCRAFT7%LAUNCH%nyear = 2007 -TAIRCRAFT7%LAUNCH%nmonth = 04 -TAIRCRAFT7%LAUNCH%nday = 19 -TAIRCRAFT7%LAUNCH%xtime = 43500. -! -!* number of flight segments -! -TAIRCRAFT7%SEG = 207 -! -!* initalisation of flag for pressure (T) or Z(F) for aicraft altitude -! -TAIRCRAFT7%ALTDEF = .TRUE. -! -!* allocation of the arrays -! -ALLOCATE(TAIRCRAFT7%SEGTIME(TAIRCRAFT7%SEG )) -ALLOCATE(TAIRCRAFT7%SEGLAT (TAIRCRAFT7%SEG+1)) -ALLOCATE(TAIRCRAFT7%SEGLON (TAIRCRAFT7%SEG+1)) -! -!* duration of the segments (seconds) -! -TAIRCRAFT7%SEGTIME = (/ 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60 /) -! -!* latitudes of the segments ends (1st point is takeoff, last point is landing) -! (decimal degrees) -! -TAIRCRAFT7%SEGLAT = (/44.39766, 44.39865, 44.40084, 44.39968, 44.40132,& - 44.39968, 44.39728, 44.39430, 44.38775, 44.37997,& - 44.37950, 44.37838, 44.37529, 44.37039, 44.36210,& - 44.35464, 44.35734, 44.37871, 44.39900, 44.41864,& - 44.43725, 44.45386, 44.47003, 44.46820, 44.45811,& - 44.45985, 44.46222, 44.46051, 44.46002, 44.45410,& - 44.45975, 44.47224, 44.47135, 44.46426, 44.45526,& - 44.46369, 44.47345, 44.46559, 44.45538, 44.45041,& - 44.46748, 44.48145, 44.47324, 44.46117, 44.44701,& - 44.44997, 44.46807, 44.45757, 44.44071, 44.42192,& - 44.40289, 44.38488, 44.37393, 44.37344, 44.37088,& - 44.36299, 44.35352, 44.34610, 44.33741, 44.32894,& - 44.31848, 44.30638, 44.29298, 44.27971, 44.26787,& - 44.25647, 44.24665, 44.23900, 44.22917, 44.21672,& - 44.19966, 44.18185, 44.16143, 44.13686, 44.11018,& - 44.08245, 44.05611, 44.02972, 44.00337, 43.97543,& - 43.95425, 43.93530, 43.91688, 43.89820, 43.89794,& - 43.90448, 43.89443, 43.88575, 43.89544, 43.88125,& - 43.86386, 43.84576, 43.82589, 43.80077, 43.77257,& - 43.74412, 43.71677, 43.68738, 43.66478, 43.64512,& - 43.62552, 43.60215, 43.57453, 43.54651, 43.53933,& - 43.55306, 43.55063, 43.53804, 43.51799, 43.50221,& - 43.49417, 43.48755, 43.47693, 43.49463, 43.50888,& - 43.50379, 43.50031, 43.49714, 43.49295, 43.49863,& - 43.49608, 43.49501, 43.49749, 43.49974, 43.50075,& - 43.49405, 43.50050, 43.49775, 43.49594, 43.49643,& - 43.50822, 43.50382, 43.50991, 43.52896, 43.54368,& - 43.55908, 43.57917, 43.60249, 43.62374, 43.64322,& - 43.66040, 43.67597, 43.69279, 43.70851, 43.72461,& - 43.74143, 43.75779, 43.77426, 43.78883, 43.79931,& - 43.80790, 43.81579, 43.82380, 43.83291, 43.84372,& - 43.85303, 43.86217, 43.88168, 43.90765, 43.93423,& - 43.96127, 43.98647, 44.01170, 44.03636, 44.06083,& - 44.08646, 44.11225, 44.14076, 44.17071, 44.19719,& - 44.21831, 44.23741, 44.25411, 44.27110, 44.28888,& - 44.30671, 44.32461, 44.34815, 44.37325, 44.39767,& - 44.42061, 44.44169, 44.46152, 44.47074, 44.45727,& - 44.43958, 44.42007, 44.39913, 44.37827, 44.35861,& - 44.35638, 44.36462, 44.37381, 44.37712, 44.37536,& - 44.37818, 44.38461, 44.39189, 44.39652, 44.39914,& - 44.40121, 44.40203, 44.39652, 44.39471, 44.39916,& - 44.39881, 44.39729, 44.39691 /) -! -!* longitudes of the segments ends (1st point is takeoff, last point is landing) -! (decimal degrees) -! -TAIRCRAFT7%SEGLON = (/0.76309, 0.76243, 0.74626, 0.71975, 0.69001,& - 0.65673, 0.62503, 0.59412, 0.56233, 0.53107,& - 0.49721, 0.46349, 0.42894, 0.39615, 0.36775,& - 0.33793, 0.31306, 0.29383, 0.27389, 0.25332,& - 0.23140, 0.20708, 0.18262, 0.17709, 0.21017,& - 0.21474, 0.19069, 0.17648, 0.20138, 0.21735,& - 0.19951, 0.17939, 0.17254, 0.19597, 0.20679,& - 0.18859, 0.16933, 0.18100, 0.20277, 0.20151,& - 0.18677, 0.16844, 0.17247, 0.19390, 0.20819,& - 0.19313, 0.17751, 0.18731, 0.22092, 0.25382,& - 0.28665, 0.31971, 0.35579, 0.39647, 0.43670,& - 0.47425, 0.51124, 0.54954, 0.58589, 0.62272,& - 0.65835, 0.69445, 0.73129, 0.76894, 0.80747,& - 0.84420, 0.87763, 0.90635, 0.93263, 0.95459,& - 0.96752, 0.97875, 0.98687, 0.99324, 1.00175,& - 1.01255, 1.02736, 1.04544, 1.06499, 1.08133,& - 1.09566, 1.10337, 1.10589, 1.11465, 1.11536,& - 1.09801, 1.10959, 1.12537, 1.10483, 1.09250,& - 1.08639, 1.08207, 1.07332, 1.07099, 1.07469,& - 1.08320, 1.09204, 1.09917, 1.09423, 1.08928,& - 1.09411, 1.09942, 1.10542, 1.10965, 1.11664,& - 1.10273, 1.10214, 1.12355, 1.14198, 1.17426,& - 1.21045, 1.24596, 1.25826, 1.23903, 1.21688,& - 1.21076, 1.22802, 1.23724, 1.24997, 1.22659,& - 1.23320, 1.25366, 1.23586, 1.22311, 1.24557,& - 1.25389, 1.23238, 1.23489, 1.25729, 1.24318,& - 1.21789, 1.21871, 1.23147, 1.20099, 1.16261,& - 1.12235, 1.08708, 1.05529, 1.02243, 0.98749,& - 0.95092, 0.91402, 0.87811, 0.84299, 0.80903,& - 0.77736, 0.74608, 0.71246, 0.68481, 0.66264,& - 0.64021, 0.61586, 0.59159, 0.56775, 0.54377,& - 0.51834, 0.49118, 0.46814, 0.45393, 0.44101,& - 0.42851, 0.41123, 0.39411, 0.37522, 0.35616,& - 0.34073, 0.32621, 0.31966, 0.31567, 0.31382,& - 0.30921, 0.30321, 0.29381, 0.28282, 0.27351,& - 0.28011, 0.29911, 0.31552, 0.29847, 0.27458,& - 0.25111, 0.22390, 0.19587, 0.17712, 0.20126,& - 0.22675, 0.25187, 0.27302, 0.29474, 0.31660,& - 0.34470, 0.37879, 0.41402, 0.44972, 0.48289,& - 0.51708, 0.55105, 0.58388, 0.61897, 0.65420,& - 0.68930, 0.72537, 0.76175, 0.77456, 0.75960,& - 0.76160, 0.76318, 0.76337 /) -! -!* pressure of the segments ends (1st point is takeoff, last point is landing) -! (pascals) -! -IF (TAIRCRAFT7%ALTDEF) THEN - ALLOCATE(TAIRCRAFT7%SEGP (TAIRCRAFT7%SEG+1)) -TAIRCRAFT7%SEGP = 100. * (/1013.5,1012.2, 999.9, 993.1, 992.3,& - 994.3, 995.5, 996.0, 994.8, 995.3,& - 996.3, 997.7, 997.7, 994.8, 988.4,& - 993.4, 999.0, 999.4, 999.8,1000.0,& - 999.6, 999.6, 999.0,1004.0,1006.1,& - 994.3, 982.4, 970.9, 959.8, 949.9,& - 941.0, 930.8, 921.5, 912.1, 902.6,& - 893.6, 884.2, 875.5, 866.6, 857.9,& - 849.3, 839.5, 829.7, 820.1, 811.1,& - 803.1, 801.1, 809.7, 819.5, 830.7,& - 842.1, 851.2, 859.0, 868.3, 877.2,& - 885.5, 893.1, 900.8, 907.4, 914.0,& - 923.0, 933.3, 946.2, 959.3, 972.0,& - 979.4, 976.9, 964.5, 952.8, 941.4,& - 929.5, 921.1, 920.5, 924.1, 934.8,& - 943.9, 955.0, 966.2, 981.6, 992.9,& - 979.6, 966.2, 954.1, 956.0, 963.3,& - 969.2, 980.9, 981.8, 977.0, 962.5,& - 948.5, 936.0, 933.5, 939.9, 949.7,& - 958.2, 965.0, 978.3, 968.7, 956.7,& - 948.0, 952.6, 964.2, 970.2, 968.3,& - 968.8, 977.2, 969.8, 971.4, 976.6,& - 979.5, 981.2, 981.2, 984.3, 972.3,& - 960.2, 948.7, 938.2, 929.8, 920.7,& - 911.0, 899.9, 889.6, 879.4, 868.8,& - 857.8, 847.7, 838.2, 827.8, 818.0,& - 807.5, 802.2, 801.8, 810.8, 821.9,& - 835.8, 848.8, 861.7, 874.2, 887.1,& - 898.9, 911.0, 922.9, 933.6, 943.9,& - 954.7, 967.1, 983.3, 973.8, 961.5,& - 950.8, 939.5, 927.4, 915.9, 904.9,& - 893.7, 886.8, 891.5, 898.0, 905.7,& - 913.6, 919.8, 926.5, 935.1, 944.1,& - 954.5, 965.2, 978.6, 992.7, 984.7,& - 972.1, 959.6, 948.7, 937.5, 926.5,& - 917.2, 914.4, 924.3, 940.1, 955.8,& - 971.7, 984.4, 997.4,1000.3,1000.6,& -1000.7, 999.6,1000.2, 999.4, 997.7,& - 992.5, 995.8, 999.1, 999.4, 997.4,& - 997.8, 996.9, 995.8, 996.1, 996.2,& - 993.5, 994.8, 995.2, 999.8,1012.4,& -1012.4,1012.4,1012.4 /) - ELSE - ALLOCATE(TAIRCRAFT7%SEGZ (TAIRCRAFT7%SEG+1)) - TAIRCRAFT7%SEGZ = (/8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000/) -ENDIF -! -!---------------------------------------------------------------------------- -! -! -! -!* 1. Aircraft number 8 -! ----------------- -! -!* model number -! -TAIRCRAFT8%NMODEL = 0 -! -!* model switch -! -TAIRCRAFT8%MODEL = 'FIX' -! -!* aircraft type -! -TAIRCRAFT8%TYPE = 'AIRCRA' + IF ( CMODEL(JI) == 'FIX' ) THEN + IF ( NMODEL(JI) < 1 .OR. NMODEL(JI) > NMODEL_NEST ) THEN + CMNHMSG(1) = 'invalid NMODEL aircraft ' // TRIM( CTITLE(JI) ) + CMNHMSG(2) = 'NMODEL must be between 1 and the last nested model number' + CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'INI_AIRCRAFT', OLOCAL = .TRUE. ) + NMODEL(JI) = 1 + END IF + ELSE IF ( CMODEL(JI) == 'MOB' ) THEN + IF ( NMODEL(JI) /= 0 .AND. NMODEL(JI) /= 1 ) THEN + CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'INI_AIRCRAFT', & + 'NMODEL is set to 1 at start for a CMODEL="MOB" aircraft (aircraft ' // TRIM( CTITLE(JI) ) // ')', & + OLOCAL = .TRUE. ) + END IF + IF ( NMODEL_NEST == 1 ) CMODEL(JI) = 'FIX' ! If only one model, FIX and MOB are the same + NMODEL(JI) = 1 + ELSE + CMNHMSG(1) = 'invalid CMODEL (' // TRIM( CMODEL(JI) ) // ') for aircraft ' // TRIM( CTITLE(JI) ) + CMNHMSG(2) = 'CMODEL must be FIX or MOB (default="FIX")' + CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'INI_AIRCRAFT', OLOCAL = .TRUE. ) + CMODEL(JI) = 'FIX' + NMODEL(JI) = 1 + END IF + TZAIRCRAFT%CMODEL = CMODEL(JI) + TZAIRCRAFT%NMODEL = NMODEL(JI) -!* aircraft flight name -! -TAIRCRAFT8%TITLE = 'DIMO22B' -! -!* time step for storage -! -TAIRCRAFT8%STEP = 60. -! -!* take-off date and time -! -TAIRCRAFT8%LAUNCH%nyear = 2007 -TAIRCRAFT8%LAUNCH%nmonth = 04 -TAIRCRAFT8%LAUNCH%nday = 22 -TAIRCRAFT8%LAUNCH%xtime = 45720. -! -!* number of flight segments -! -TAIRCRAFT8%SEG = 210 -! -!* initalisation of flag for pressure (T) or Z(F) for aicraft altitude -! -TAIRCRAFT8%ALTDEF = .TRUE. -! -!* allocation of the arrays -! -ALLOCATE(TAIRCRAFT8%SEGTIME(TAIRCRAFT8%SEG )) -ALLOCATE(TAIRCRAFT8%SEGLAT (TAIRCRAFT8%SEG+1)) -ALLOCATE(TAIRCRAFT8%SEGLON (TAIRCRAFT8%SEG+1)) -! -!* duration of the segments (seconds) -! -TAIRCRAFT8%SEGTIME = (/ 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60 /) -! -!* latitudes of the segments ends (1st point is takeoff, last point is landing) -! (decimal degrees) -! -TAIRCRAFT8%SEGLAT = (/ 44.40018, 44.39977, 44.39868, 44.39992, 44.39773,& - 44.39547, 44.38932, 44.38114, 44.37649, 44.37682,& - 44.37604, 44.37314, 44.36610, 44.35869, 44.35126,& - 44.36888, 44.38902, 44.41019, 44.43016, 44.44711,& - 44.46309, 44.46567, 44.46411, 44.46376, 44.46685,& - 44.45785, 44.46202, 44.46796, 44.45953, 44.46578,& - 44.45835, 44.45396, 44.46302, 44.46765, 44.45875,& - 44.46523, 44.47145, 44.46173, 44.46061, 44.47287,& - 44.47889, 44.46331, 44.46504, 44.47908, 44.48783,& - 44.47358, 44.46026, 44.47212, 44.47249, 44.45646,& - 44.43659, 44.41697, 44.40199, 44.38879, 44.37329,& - 44.35638, 44.33957, 44.32298, 44.31241, 44.30906,& - 44.30746, 44.30375, 44.29695, 44.28690, 44.27741,& - 44.26870, 44.25519, 44.23423, 44.21513, 44.19742,& - 44.18321, 44.16521, 44.13944, 44.11380, 44.09166,& - 44.07140, 44.05157, 44.03142, 44.01214, 43.99344,& - 43.97188, 43.94739, 43.92061, 43.89076, 43.87434,& - 43.89083, 43.89292, 43.87508, 43.85464, 43.83516,& - 43.81576, 43.79388, 43.76739, 43.76922, 43.77542,& - 43.74814, 43.71925, 43.69068, 43.66563, 43.64503,& - 43.62444, 43.60469, 43.58496, 43.56237, 43.54501,& - 43.55352, 43.55457, 43.54557, 43.54903, 43.54089,& - 43.52829, 43.51990, 43.51346, 43.50497, 43.49425,& - 43.49525, 43.49562, 43.50077, 43.49815, 43.49617,& - 43.49845, 43.49810, 43.49390, 43.49866, 43.50523,& - 43.49673, 43.49247, 43.49800, 43.50190, 43.49003,& - 43.48993, 43.50083, 43.50555, 43.48778, 43.48823,& - 43.48480, 43.47242, 43.47737, 43.49374, 43.50835,& - 43.52650, 43.54671, 43.56923, 43.58943, 43.61022,& - 43.63331, 43.65439, 43.67176, 43.68666, 43.70027,& - 43.71413, 43.72785, 43.74148, 43.75517, 43.76971,& - 43.78253, 43.79616, 43.80787, 43.81857, 43.82942,& - 43.83995, 43.84981, 43.85823, 43.86486, 43.87613,& - 43.89896, 43.92984, 43.96011, 43.98988, 44.01919,& - 44.04820, 44.07634, 44.10430, 44.13180, 44.15935,& - 44.18754, 44.21629, 44.24437, 44.27247, 44.30043,& - 44.32868, 44.35654, 44.38023, 44.40228, 44.42240,& - 44.44159, 44.45799, 44.47140, 44.45998, 44.44209,& - 44.42257, 44.40038, 44.37905, 44.36011, 44.35666,& - 44.36594, 44.37397, 44.37687, 44.37565, 44.37784,& - 44.38400, 44.39171, 44.39634, 44.39880, 44.40099,& - 44.40118, 44.39848, 44.39311, 44.39245, 44.39898,& - 44.39910 /) + TZAIRCRAFT%CTYPE = CTYPE(JI) -! -!* longitudes of the segments ends (1st point is takeoff, last point is landing) -! (decimal degrees) -! -TAIRCRAFT8%SEGLON = (/ 0.75057, 0.72578, 0.69760, 0.66704, 0.63457,& - 0.60222, 0.56878, 0.53642, 0.50398, 0.47225,& - 0.43953, 0.40789, 0.38031, 0.35008, 0.32169,& - 0.30147, 0.28060, 0.26058, 0.23973, 0.21616,& - 0.19367, 0.18236, 0.18502, 0.20778, 0.20656,& - 0.18370, 0.18703, 0.20372, 0.19130, 0.19682,& - 0.19357, 0.18506, 0.20504, 0.20853, 0.18918,& - 0.19966, 0.21438, 0.19613, 0.18009, 0.19803,& - 0.20224, 0.19336, 0.18564, 0.20677, 0.20731,& - 0.19554, 0.18745, 0.19135, 0.20223, 0.20453,& - 0.22417, 0.25282, 0.28740, 0.32278, 0.35850,& - 0.39281, 0.42680, 0.46075, 0.49942, 0.54027,& - 0.58128, 0.62144, 0.66096, 0.69920, 0.73827,& - 0.77681, 0.81271, 0.84190, 0.87282, 0.90619,& - 0.94117, 0.96868, 0.99038, 1.01055, 1.02558,& - 1.03116, 1.03574, 1.04032, 1.04706, 1.05803,& - 1.07306, 1.09104, 1.11081, 1.12296, 1.13651,& - 1.12012, 1.09442, 1.08149, 1.08005, 1.08059,& - 1.08087, 1.08126, 1.08118, 1.05870, 1.07019,& - 1.08092, 1.08959, 1.09857, 1.10259, 1.10139,& - 1.10055, 1.10282, 1.10878, 1.11744, 1.10495,& - 1.06783, 1.08647, 1.12371, 1.11720, 1.09692,& - 1.11863, 1.14779, 1.17939, 1.21196, 1.24465,& - 1.25333, 1.22210, 1.20875, 1.23017, 1.24679,& - 1.22657, 1.23285, 1.25139, 1.23305, 1.21876,& - 1.23712, 1.25495, 1.23643, 1.22729, 1.24422,& - 1.25601, 1.23404, 1.23452, 1.23818, 1.22150,& - 1.21730, 1.22441, 1.19372, 1.16127, 1.12640,& - 1.09446, 1.06388, 1.03469, 1.00273, 0.97325,& - 0.94589, 0.91633, 0.88300, 0.84659, 0.80979,& - 0.77679, 0.75144, 0.72825, 0.70681, 0.68546,& - 0.66167, 0.63855, 0.61353, 0.58770, 0.56178,& - 0.53561, 0.50932, 0.48310, 0.45312, 0.41403,& - 0.38316, 0.37315, 0.37027, 0.36942, 0.36485,& - 0.35752, 0.34676, 0.33433, 0.32168, 0.31139,& - 0.30504, 0.30198, 0.30551, 0.31093, 0.31540,& - 0.32043, 0.31453, 0.29134, 0.26964, 0.24912,& - 0.22493, 0.20110, 0.18452, 0.19842, 0.22297,& - 0.24828, 0.27199, 0.29414, 0.31429, 0.34416,& - 0.37748, 0.41231, 0.44685, 0.47991, 0.51294,& - 0.54640, 0.58024, 0.61466, 0.65004, 0.68542,& - 0.72044, 0.75565, 0.76069, 0.77374, 0.76079,& - 0.76013 /) + IF ( .NOT. TLAUNCH(JI)%CHECK( TRIM( CTITLE(JI) ) ) ) & + CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'INI_AIRCRAFT', & + 'problem with TLAUNCH (not set or incorrect values) for aircraft ' // TRIM( CTITLE(JI) ), OLOCAL = .TRUE. ) + TZAIRCRAFT%TLAUNCH = TLAUNCH(JI) -! -!* pressure of the segments ends (1st point is takeoff, last point is landing) -! (pascals) -! -IF (TAIRCRAFT8%ALTDEF) THEN - ALLOCATE(TAIRCRAFT8%SEGP (TAIRCRAFT8%SEG+1)) -TAIRCRAFT8%SEGP = 100. * (/1002.7, 994.1, 993.0, 994.6, 994.2,& - 994.3, 995.3, 996.2, 997.4, 996.8,& - 997.5, 996.0, 989.7, 990.8, 996.2,& - 999.0, 997.8, 998.4, 999.0, 999.8,& - 996.0, 985.6, 978.0, 967.9, 959.6,& - 952.6, 943.8, 934.8, 924.6, 916.9,& - 907.5, 898.5, 888.8, 879.9, 870.9,& - 861.3, 852.3, 843.9, 834.5, 825.4,& - 816.3, 806.4, 797.4, 788.2, 779.6,& - 770.6, 762.0, 753.3, 745.0, 741.1,& - 743.1, 748.3, 754.5, 761.4, 768.9,& - 777.1, 785.5, 794.8, 806.6, 817.8,& - 829.3, 840.3, 851.4, 862.4, 873.6,& - 885.4, 896.8, 911.7, 924.7, 933.7,& - 946.4, 959.8, 973.2, 981.3, 973.2,& - 957.9, 945.9, 935.4, 923.1, 913.1,& - 914.1, 923.5, 939.6, 958.2, 970.2,& - 975.1, 968.2, 954.8, 939.1, 928.3,& - 917.1, 915.8, 922.7, 933.0, 943.4,& - 957.9, 970.0, 977.2, 967.0, 955.4,& - 940.6, 927.1, 916.1, 918.5, 926.5,& - 940.9, 954.7, 965.0, 972.7, 964.7,& - 960.1, 959.0, 959.5, 966.5, 973.6,& - 977.4, 970.8, 960.0, 948.2, 937.7,& - 929.8, 920.2, 908.4, 899.6, 888.0,& - 877.9, 866.9, 855.7, 846.6, 836.1,& - 825.1, 813.8, 805.6, 795.1, 784.2,& - 775.1, 769.6, 773.5, 780.9, 790.2,& - 799.0, 812.7, 823.0, 832.8, 843.1,& - 854.7, 862.0, 873.0, 885.9, 895.8,& - 895.4, 884.4, 871.9, 864.3, 854.8,& - 844.0, 833.2, 824.1, 814.2, 805.5,& - 796.0, 786.3, 777.5, 776.5, 789.1,& - 803.2, 814.9, 826.4, 834.9, 842.7,& - 850.2, 861.0, 870.4, 880.3, 891.1,& - 902.5, 914.6, 927.2, 936.1, 946.8,& - 961.5, 974.1, 988.2, 993.4, 996.2,& - 998.3, 995.0, 995.7, 996.1, 995.0,& - 992.5, 995.4, 996.3, 993.9, 988.9,& - 992.2, 995.8, 996.7, 995.3, 995.0,& - 995.6, 995.8, 995.6, 995.4, 994.3,& - 995.1, 995.0, 986.7, 992.4,1009.3,& -1010.1 /) - ELSE - ALLOCATE(TAIRCRAFT8%SEGZ (TAIRCRAFT8%SEG+1)) - TAIRCRAFT8%SEGZ = (/8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000/) -ENDIF -! -! -!* 1. Aircraft number 9 -! ----------------- -! -!* model number -! -TAIRCRAFT9%NMODEL = 0 -! -!* model switch -! -TAIRCRAFT9%MODEL = 'FIX' -! -!* aircraft type -! -TAIRCRAFT9%TYPE = 'AIRCRA' + IF ( XTSTEP(JI) == XNEGUNDEF ) THEN + CALL PRINT_MSG( NVERB_INFO, 'GEN', 'INI_AIRCRAFT', & + 'data storage frequency not provided for aircraft ' // TRIM( CTITLE(JI) ) // ' => set to 60s', OLOCAL = .TRUE. ) + XTSTEP(JI) = 60. + ELSE IF ( XTSTEP(JI) <=0. ) THEN + CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'INI_AIRCRAFT', 'invalid data storage frequency for aircraft ' // TRIM( CTITLE(JI) ), & + OLOCAL = .TRUE. ) + XTSTEP(JI) = 60. + END IF + TZAIRCRAFT%TFLYER_TIME%XTSTEP = XTSTEP(JI) -!* aircraft flight name -! -TAIRCRAFT9%TITLE = 'DIMO23A' -! -!* time step for storage -! -TAIRCRAFT9%STEP = 60. -! -!* take-off date and time -! -TAIRCRAFT9%LAUNCH%nyear = 2007 -TAIRCRAFT9%LAUNCH%nmonth = 04 -TAIRCRAFT9%LAUNCH%nday = 23 -TAIRCRAFT9%LAUNCH%xtime = 28080. -! -!* number of flight segments -! -TAIRCRAFT9%SEG = 217 -! -!* initalisation of flag for pressure (T) or Z(F) for aicraft altitude -! -TAIRCRAFT9%ALTDEF = .TRUE. -! -!* allocation of the arrays -! -ALLOCATE(TAIRCRAFT9%SEGTIME(TAIRCRAFT9%SEG )) -ALLOCATE(TAIRCRAFT9%SEGLAT (TAIRCRAFT9%SEG+1)) -ALLOCATE(TAIRCRAFT9%SEGLON (TAIRCRAFT9%SEG+1)) -! -!* duration of the segments (seconds) -! -TAIRCRAFT9%SEGTIME = (/ 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60 /) + IF ( NPOS(JI) < 2 ) THEN + CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'INI_AIRCRAFT', 'NPOS should be at least 2 for aircraft ' // TRIM( CTITLE(JI) ), & + OLOCAL = .TRUE. ) + END IF + TZAIRCRAFT%NPOS = NPOS(JI) -! -!* latitudes of the segments ends (1st point is takeoff, last point is landing) -! (decimal degrees) -! -TAIRCRAFT9%SEGLAT = (/ 44.39751, 44.39753, 44.39752, 44.39853, 44.40034,& - 44.39319, 44.38918, 44.39412, 44.40370, 44.40138,& - 44.39750, 44.39613, 44.39272, 44.38845, 44.38440,& - 44.38014, 44.37677, 44.37483, 44.36861, 44.35633,& - 44.33758, 44.31741, 44.29690, 44.27804, 44.28492,& - 44.30878, 44.33297, 44.35655, 44.37919, 44.40120,& - 44.42312, 44.44432, 44.46236, 44.47801, 44.46757,& - 44.46157, 44.45602, 44.45566, 44.47449, 44.47193,& - 44.45598, 44.45165, 44.47066, 44.47028, 44.45764,& - 44.45697, 44.47308, 44.46318, 44.45201, 44.46706,& - 44.47951, 44.46693, 44.45556, 44.46823, 44.46949,& - 44.47851, 44.49455, 44.51153, 44.52774, 44.54366,& - 44.55714, 44.56864, 44.57811, 44.58390, 44.58479,& - 44.58010, 44.57385, 44.56768, 44.56246, 44.55190,& - 44.53340, 44.50838, 44.49894, 44.48327, 44.46686,& - 44.45235, 44.43776, 44.42406, 44.40974, 44.39455,& - 44.37895, 44.36464, 44.35046, 44.33591, 44.32117,& - 44.30449, 44.28671, 44.26956, 44.25473, 44.23844,& - 44.22230, 44.20516, 44.18263, 44.15639, 44.13418,& - 44.13223, 44.13549, 44.13856, 44.14149, 44.14458,& - 44.14644, 44.15412, 44.16261, 44.16914, 44.17509,& - 44.18020, 44.18150, 44.17193, 44.17974, 44.18504,& - 44.18683, 44.16630, 44.14618, 44.16061, 44.17979,& - 44.19216, 44.18184, 44.16803, 44.15456, 44.16727,& - 44.18122, 44.17483, 44.17399, 44.17022, 44.16534,& - 44.16835, 44.16535, 44.16013, 44.16126, 44.15846,& - 44.14933, 44.14374, 44.15137, 44.16848, 44.17712,& - 44.19348, 44.22233, 44.25237, 44.28189, 44.31303,& - 44.34515, 44.37181, 44.38475, 44.38428, 44.38017,& - 44.37486, 44.37286, 44.37742, 44.38493, 44.39367,& - 44.39152, 44.38350, 44.38046, 44.38063, 44.38652,& - 44.39793, 44.41131, 44.42400, 44.43619, 44.44731,& - 44.45933, 44.47095, 44.47776, 44.48403, 44.49192,& - 44.50044, 44.51020, 44.52095, 44.53370, 44.54737,& - 44.55783, 44.56727, 44.57504, 44.58094, 44.58412,& - 44.58225, 44.57236, 44.55879, 44.54496, 44.53045,& - 44.51564, 44.50161, 44.48671, 44.47298, 44.45754,& - 44.44110, 44.42419, 44.40608, 44.38719, 44.36785,& - 44.35673, 44.36123, 44.37101, 44.37533, 44.37696,& - 44.37613, 44.38058, 44.38785, 44.39397, 44.39713,& - 44.39959, 44.40136, 44.40122, 44.39871, 44.39061,& - 44.39359, 44.39652, 44.38966, 44.39608, 44.39569,& - 44.39465, 44.40496, 44.40415, 44.39887, 44.39713,& - 44.39695, 44.39696, 44.39696 /) + TZAIRCRAFT%LALTDEF = LALTDEF(JI) + IF ( CFILE(JI) == '' ) & + CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_AIRCRAFT', 'name of CSV file with trajectory not provided for aircraft ' & + // TRIM( CTITLE(JI) ), OLOCAL = .TRUE. ) -! -!* longitudes of the segments ends (1st point is takeoff, last point is landing) -! (decimal degrees) -! -TAIRCRAFT9%SEGLON = (/ 0.76306, 0.76307, 0.76305, 0.76269, 0.74580,& - 0.74072, 0.76103, 0.77639, 0.75449, 0.71425,& - 0.68316, 0.65249, 0.61874, 0.58328, 0.55006,& - 0.51760, 0.48441, 0.45139, 0.42065, 0.39305,& - 0.37216, 0.35714, 0.34286, 0.32602, 0.30618,& - 0.29573, 0.28531, 0.27413, 0.26043, 0.24570,& - 0.23012, 0.21237, 0.18837, 0.17083, 0.18349,& - 0.20509, 0.19600, 0.19825, 0.19492, 0.20130,& - 0.19254, 0.19556, 0.19605, 0.20768, 0.19070,& - 0.19338, 0.19937, 0.20087, 0.19005, 0.19651,& - 0.20863, 0.20360, 0.19309, 0.19990, 0.20947,& - 0.18161, 0.14867, 0.11569, 0.08135, 0.04598,& - 0.00878,-0.03075,-0.07182,-0.11374,-0.15676,& --0.19923,-0.24111,-0.28194,-0.32286,-0.36105,& --0.38799,-0.39993,-0.43095,-0.44520,-0.45588,& --0.47157,-0.48673,-0.50422,-0.52201,-0.53820,& --0.55361,-0.57117,-0.58856,-0.60501,-0.62178,& --0.63509,-0.64631,-0.65933,-0.67844,-0.69380,& --0.70676,-0.71683,-0.72233,-0.72811,-0.74429,& --0.78257,-0.82472,-0.86568,-0.90634,-0.94853,& --0.99312,-1.03733,-1.08136,-1.12497,-1.16729,& --1.20861,-1.24852,-1.24317,-1.24128,-1.26618,& --1.29450,-1.30808,-1.30763,-1.30267,-1.29873,& --1.29013,-1.29921,-1.31215,-1.31578,-1.31067,& --1.30216,-1.30826,-1.32260,-1.30085,-1.30780,& --1.32801,-1.30845,-1.29379,-1.31837,-1.32354,& --1.30182,-1.31707,-1.34122,-1.33728,-1.29928,& --1.26473,-1.24858,-1.23360,-1.21667,-1.20075,& --1.19259,-1.17065,-1.13473,-1.09576,-1.05647,& --1.01627,-0.97416,-0.93471,-0.90394,-0.87912,& --0.85150,-0.82113,-0.79423,-0.76751,-0.74274,& --0.72071,-0.70026,-0.67875,-0.65563,-0.63129,& --0.60738,-0.58319,-0.55662,-0.52999,-0.50503,& --0.48014,-0.45503,-0.42987,-0.40221,-0.36724,& --0.32885,-0.28896,-0.24699,-0.20322,-0.15936,& --0.11700,-0.07826,-0.04194,-0.00601, 0.02865,& - 0.06331, 0.09933, 0.13591, 0.17155, 0.20078,& - 0.22495, 0.24723, 0.26669, 0.28571, 0.30512,& - 0.33057, 0.36230, 0.39468, 0.42872, 0.46249,& - 0.49528, 0.52814, 0.56066, 0.59247, 0.62509,& - 0.65765, 0.68978, 0.72237, 0.75668, 0.77236,& - 0.75175, 0.76499, 0.76381, 0.74495, 0.76561,& - 0.78717, 0.76713, 0.74758, 0.76078, 0.76316,& - 0.76337, 0.76334, 0.76336 /) + ! Allocate trajectory data + ALLOCATE( TZAIRCRAFT%XPOSTIME(TZAIRCRAFT%NPOS) ); TZAIRCRAFT%XPOSTIME(:) = XNEGUNDEF + ALLOCATE( TZAIRCRAFT%XPOSLAT (TZAIRCRAFT%NPOS) ); TZAIRCRAFT%XPOSLAT(:) = XNEGUNDEF + ALLOCATE( TZAIRCRAFT%XPOSLON (TZAIRCRAFT%NPOS) ); TZAIRCRAFT%XPOSLON(:) = XNEGUNDEF + IF ( TZAIRCRAFT%LALTDEF ) THEN + ALLOCATE( TZAIRCRAFT%XPOSP (TZAIRCRAFT%NPOS) ); TZAIRCRAFT%XPOSP(:) = XNEGUNDEF + ELSE + ALLOCATE( TZAIRCRAFT%XPOSZ (TZAIRCRAFT%NPOS) ); TZAIRCRAFT%XPOSZ(:) = XNEGUNDEF + END IF -! -!* pressure of the segments ends (1st point is takeoff, last point is landing) -! (pascals) -! + ! Read CSV data (trajectory) + CALL AIRCRAFT_CSV_READ( TZAIRCRAFT, CFILE(JI) ) -IF (TAIRCRAFT9%ALTDEF) THEN - ALLOCATE(TAIRCRAFT9%SEGP (TAIRCRAFT9%SEG+1)) -TAIRCRAFT9%SEGP = 100. * (/ 1014.8,1014.8,1014.8,1014.8,1005.5,& - 987.8, 972.7, 959.2, 957.2, 978.1,& - 993.8, 993.5, 992.9, 995.5, 997.4,& - 997.7, 998.5, 998.3, 996.8, 997.7,& -1000.1, 999.3, 998.7, 997.4, 996.2,& - 998.3,1000.0, 999.9, 999.1, 998.6,& - 998.5, 998.0, 999.2, 999.1,1009.5,& -1003.4, 990.2, 978.4, 967.1, 956.2,& - 945.9, 934.6, 924.2, 912.3, 901.3,& - 889.8, 878.6, 866.9, 855.7, 844.9,& - 834.2, 823.0, 812.0, 801.4, 800.1,& - 806.9, 815.5, 824.4, 834.5, 845.2,& - 856.3, 870.2, 884.9, 898.2, 913.0,& - 927.0, 940.6, 953.4, 966.2, 979.8,& - 992.8,1004.2,1006.7, 993.2, 982.3,& - 972.7, 962.0, 950.9, 940.8, 928.6,& - 917.0, 906.2, 895.3, 884.4, 874.0,& - 864.1, 854.4, 844.5, 834.4, 823.4,& - 812.3, 803.1, 806.5, 815.1, 824.1,& - 836.3, 845.1, 854.7, 866.7, 884.2,& - 903.2, 921.4, 938.5, 953.8, 969.2,& - 986.8,1000.3,1007.3, 995.3, 983.3,& - 986.5,1005.5,1005.5, 994.9, 985.4,& - 973.9, 964.7, 954.5, 945.0, 935.2,& - 924.2, 913.1, 902.7, 891.8, 881.8,& - 871.0, 860.2, 850.3, 839.9, 830.3,& - 820.3, 809.5, 801.3, 802.9, 813.4,& - 825.9, 839.4, 855.4, 874.2, 894.0,& - 909.5, 925.8, 940.5, 955.0, 969.2,& - 983.7,1000.0,1008.1,1000.5, 988.9,& - 982.3, 972.7, 960.7, 951.3, 939.8,& - 929.0, 915.4, 904.9, 895.4, 884.3,& - 873.4, 863.1, 852.1, 840.5, 829.5,& - 819.2, 809.6, 800.6, 801.4, 809.6,& - 818.1, 829.6, 840.8, 854.8, 868.4,& - 882.0, 894.2, 908.1, 922.9, 937.5,& - 950.9, 967.8, 987.5,1003.2,1005.1,& -1003.5,1003.3,1002.4,1002.3,1002.0,& - 995.6, 995.5, 998.5, 999.5,1000.3,& -1000.6, 999.6, 998.8, 999.2, 998.0,& - 997.3, 995.4, 995.1, 998.1, 988.4,& - 976.2, 965.3, 956.4, 945.6, 947.8,& - 965.9, 985.1,1003.1,1013.9,1013.9,& -1013.9,1013.9,1013.9 /) - ELSE - ALLOCATE(TAIRCRAFT9%SEGZ (TAIRCRAFT9%SEG+1)) - TAIRCRAFT9%SEGZ = (/8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000/) -ENDIF +END DO + +IF ( NAIRCRAFTS > 0 ) CALL AIRCRAFTS_NML_DEALLOCATE() ! !---------------------------------------------------------------------------- ! ! END SUBROUTINE INI_AIRCRAFT + + +SUBROUTINE AIRCRAFT_CSV_READ( TPAIRCRAFT, HFILE ) + +USE MODD_AIRCRAFT_BALLOON, ONLY: TAIRCRAFTDATA + +USE MODE_DATETIME +USE MODE_MSG + +IMPLICIT NONE + +TYPE(TAIRCRAFTDATA), INTENT(INOUT) :: TPAIRCRAFT +CHARACTER(LEN=*), INTENT(IN) :: HFILE !Name of the CSV file with the aircraft trajectory + +CHARACTER(LEN=NMAXLINELGT) :: YSTRING +INTEGER :: ILU ! logical unit of the file +INTEGER :: JI +REAL :: ZLAT, ZLON, ZALT +REAL :: ZTIME + +! Open file +OPEN( NEWUNIT = ILU, FILE = HFILE, FORM = 'formatted' ) + +READ( ILU, END = 101, FMT = '(A)' ) YSTRING ! Reading of header (skip it) + +DO JI = 1, TPAIRCRAFT%NPOS + ! Read aircraft position + READ( ILU, END = 101, FMT = '(A)' ) YSTRING + + READ( YSTRING, * ) ZTIME, ZLAT, ZLON, ZALT + + TPAIRCRAFT%XPOSTIME(JI) = ZTIME + TPAIRCRAFT%XPOSLAT(JI) = ZLAT + TPAIRCRAFT%XPOSLON(JI) = ZLON + IF ( TPAIRCRAFT%LALTDEF ) THEN + TPAIRCRAFT%XPOSP(JI) = ZALT * 100. ! *100 to convert from hPa to Pa + ELSE + TPAIRCRAFT%XPOSZ(JI) = ZALT + END IF +END DO + +101 CONTINUE + +CLOSE( ILU ) + +IF ( JI < TPAIRCRAFT%NPOS ) & + CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'AIRCRAFT_CSV_READ', 'Data not found in file ' // TRIM( HFILE ), OLOCAL = .TRUE. ) + +TPAIRCRAFT%TLAND = TPAIRCRAFT%TLAUNCH + TPAIRCRAFT%XPOSTIME(TPAIRCRAFT%NPOS) + +END SUBROUTINE AIRCRAFT_CSV_READ + +END MODULE MODE_INI_AIRCRAFT diff --git a/src/MNH/ini_aircraft_balloon.f90 b/src/MNH/ini_aircraft_balloon.f90 index cdb990bb73ae06e3440e85858b68161bc9806c92..48f7b1e22d81e0dde1c15933169240920de14843 100644 --- a/src/MNH/ini_aircraft_balloon.f90 +++ b/src/MNH/ini_aircraft_balloon.f90 @@ -1,51 +1,33 @@ -!MNH_LIC Copyright 2000-2022 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2000-2023 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 01/10/2020: bugfix: DEFAULT_FLYER: add missing default values +! P. Wautelet 06/2022: reorganize flyers +! P. Wautelet 25/08/2022: write balloon positions in netCDF4 files inside HDF5 groups !----------------------------------------------------------------- -! ######################### -MODULE MODI_INI_AIRCRAFT_BALLOON -! ######################### -! -INTERFACE -! - SUBROUTINE INI_AIRCRAFT_BALLOON(TPINIFILE, & - PTSTEP, TPDTSEG, PSEGLEN, & - KRR, KSV, KKU, OUSETKE, & - PLATOR, PLONOR ) -! -USE MODD_IO, ONLY: TFILEDATA -USE MODD_TYPE_DATE -! -TYPE(TFILEDATA), INTENT(IN) :: TPINIFILE !Initial file -REAL, INTENT(IN) :: PTSTEP ! time step -TYPE(DATE_TIME), INTENT(IN) :: TPDTSEG ! segment date and time -REAL, INTENT(IN) :: PSEGLEN ! segment length -INTEGER, INTENT(IN) :: KRR ! number of moist variables -INTEGER, INTENT(IN) :: KSV ! number of scalar variables -INTEGER, INTENT(IN) :: KKU ! number of vertical levels -LOGICAL, INTENT(IN) :: OUSETKE ! flag to use tke -REAL, INTENT(IN) :: PLATOR ! latitude of origine point -REAL, INTENT(IN) :: PLONOR ! longitude of origine point -! -!------------------------------------------------------------------------------- -! -END SUBROUTINE INI_AIRCRAFT_BALLOON -! -END INTERFACE -! -END MODULE MODI_INI_AIRCRAFT_BALLOON -! -! ############################################################### - SUBROUTINE INI_AIRCRAFT_BALLOON(TPINIFILE, & - PTSTEP, TPDTSEG, PSEGLEN, & - KRR, KSV, KKU, OUSETKE, & - PLATOR, PLONOR ) -! ############################################################### +!############################### +MODULE MODE_INI_AIRCRAFT_BALLOON +!############################### + +USE MODE_MSG + +IMPLICIT NONE + +PRIVATE + +PUBLIC :: ALLOCATE_FLYER, DEALLOCATE_FLYER + +PUBLIC :: INI_AIRCRAFT_BALLOON + +CONTAINS + +! ############################################################ + SUBROUTINE INI_AIRCRAFT_BALLOON( TPINIFILE, PLATOR, PLONOR ) +! ############################################################ ! ! !!**** *INI_AIRCRAFT_BALLOON* - @@ -86,36 +68,24 @@ END MODULE MODI_INI_AIRCRAFT_BALLOON ! ------------ ! USE MODD_AIRCRAFT_BALLOON -USE MODD_CONF -USE MODD_DIAG_FLAG -USE MODD_DYN_n -use modd_field, only: tfielddata, TYPEREAL -USE MODD_GRID -USE MODD_IO, ONLY: TFILEDATA -USE MODD_LUNIT_n, ONLY: TLUOUT -USE MODD_PARAM_n, ONLY: CCLOUD -USE MODD_PARAMETERS +USE MODD_CONF, ONLY: CPROGRAM +USE MODD_DIAG_FLAG, ONLY: LAIRCRAFT_BALLOON, NTIME_AIRCRAFT_BALLOON, & + XALT_BALLOON, XLAT_BALLOON, XLON_BALLOON, XSTEP_AIRCRAFT_BALLOON +USE MODD_DYN_n, ONLY: DYN_MODEL +USE MODD_IO, ONLY: ISP, TFILEDATA +USE MODD_PARAMETERS, ONLY: NUNDEF ! -USE MODE_GRIDPROJ -USE MODE_ll -USE MODE_MODELN_HANDLER -USE MODE_MSG +USE MODE_GRIDPROJ, ONLY: SM_XYHAT +USE MODE_INI_AIRCRAFT, ONLY: INI_AIRCRAFT +USE MODE_INI_BALLOON, ONLY: INI_BALLOON +USE MODE_MODELN_HANDLER, ONLY: GET_CURRENT_MODEL_INDEX ! -USE MODI_INI_BALLOON -USE MODI_INI_AIRCRAFT ! IMPLICIT NONE ! !* 0.1 declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPINIFILE !Initial file -REAL, INTENT(IN) :: PTSTEP ! time step -TYPE(DATE_TIME), INTENT(IN) :: TPDTSEG ! segment date and time -REAL, INTENT(IN) :: PSEGLEN ! segment length -INTEGER, INTENT(IN) :: KRR ! number of moist variables -INTEGER, INTENT(IN) :: KSV ! number of scalar variables -INTEGER, INTENT(IN) :: KKU ! number of vertical levels -LOGICAL, INTENT(IN) :: OUSETKE ! flag to use tke REAL, INTENT(IN) :: PLATOR ! latitude of origine point REAL, INTENT(IN) :: PLONOR ! longitude of origine point ! @@ -124,16 +94,11 @@ REAL, INTENT(IN) :: PLONOR ! longitude of origine point ! 0.2 declaration of local variables ! INTEGER :: IMI ! current model index -INTEGER :: ISTORE ! number of storage instants -INTEGER :: ILUOUT ! logical unit -INTEGER :: IRESP ! return code -INTEGER :: JSEG ! loop counter -TYPE(TFIELDDATA) :: TZFIELD +INTEGER :: JI ! !---------------------------------------------------------------------------- ! IMI=GET_CURRENT_MODEL_INDEX() -ILUOUT = TLUOUT%NLU !---------------------------------------------------------------------------- ! !* 1. Default values @@ -142,517 +107,581 @@ ILUOUT = TLUOUT%NLU IF ( CPROGRAM == 'DIAG ') THEN IF ( .NOT. LAIRCRAFT_BALLOON ) RETURN IF (NTIME_AIRCRAFT_BALLOON == NUNDEF .OR. XSTEP_AIRCRAFT_BALLOON == XUNDEF) THEN - WRITE(ILUOUT,*) "NTIME_AIRCRAFT_BALLOON and/or XSTEP_AIRCRAFT_BALLOON not initialized in DIAG " - WRITE(ILUOUT,*) "No calculations for Balloons and Aircraft" + CMNHMSG(1) = "NTIME_AIRCRAFT_BALLOON and/or XSTEP_AIRCRAFT_BALLOON not initialized in DIAG " + CMNHMSG(2) = "No calculations for Balloons and Aircraft" + CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'INI_AIRCRAFT_BALLOON' ) + LAIRCRAFT_BALLOON=.FALSE. RETURN ENDIF ENDIF -! -! -IF ( IMI == 1 ) THEN - LFLYER=.FALSE. -! - CALL DEFAULT_FLYER(TBALLOON1) - CALL DEFAULT_FLYER(TBALLOON2) - CALL DEFAULT_FLYER(TBALLOON3) - CALL DEFAULT_FLYER(TBALLOON4) - CALL DEFAULT_FLYER(TBALLOON5) - CALL DEFAULT_FLYER(TBALLOON6) - CALL DEFAULT_FLYER(TBALLOON7) - CALL DEFAULT_FLYER(TBALLOON8) - CALL DEFAULT_FLYER(TBALLOON9) -! - CALL DEFAULT_FLYER(TAIRCRAFT1) - CALL DEFAULT_FLYER(TAIRCRAFT2) - CALL DEFAULT_FLYER(TAIRCRAFT3) - CALL DEFAULT_FLYER(TAIRCRAFT4) - CALL DEFAULT_FLYER(TAIRCRAFT5) - CALL DEFAULT_FLYER(TAIRCRAFT6) - CALL DEFAULT_FLYER(TAIRCRAFT7) - CALL DEFAULT_FLYER(TAIRCRAFT8) - CALL DEFAULT_FLYER(TAIRCRAFT9) - CALL DEFAULT_FLYER(TAIRCRAFT10) - CALL DEFAULT_FLYER(TAIRCRAFT11) - CALL DEFAULT_FLYER(TAIRCRAFT12) - CALL DEFAULT_FLYER(TAIRCRAFT13) - CALL DEFAULT_FLYER(TAIRCRAFT14) - CALL DEFAULT_FLYER(TAIRCRAFT15) - CALL DEFAULT_FLYER(TAIRCRAFT16) - CALL DEFAULT_FLYER(TAIRCRAFT17) - CALL DEFAULT_FLYER(TAIRCRAFT18) - CALL DEFAULT_FLYER(TAIRCRAFT19) - CALL DEFAULT_FLYER(TAIRCRAFT20) - CALL DEFAULT_FLYER(TAIRCRAFT21) - CALL DEFAULT_FLYER(TAIRCRAFT22) - CALL DEFAULT_FLYER(TAIRCRAFT23) - CALL DEFAULT_FLYER(TAIRCRAFT24) - CALL DEFAULT_FLYER(TAIRCRAFT25) - CALL DEFAULT_FLYER(TAIRCRAFT26) - CALL DEFAULT_FLYER(TAIRCRAFT27) - CALL DEFAULT_FLYER(TAIRCRAFT28) - CALL DEFAULT_FLYER(TAIRCRAFT29) - CALL DEFAULT_FLYER(TAIRCRAFT30) -END IF + +IF ( NAIRCRAFTS > 0 .OR. NBALLOONS > 0 ) LFLYER = .TRUE. ! !---------------------------------------------------------------------------- ! !* 2. Balloon initialization ! ---------------------- -IF (IMI == 1) CALL INI_BALLOON -! -CALL INI_LAUNCH(1,TBALLOON1) -CALL INI_LAUNCH(2,TBALLOON2) -CALL INI_LAUNCH(3,TBALLOON3) -CALL INI_LAUNCH(4,TBALLOON4) -CALL INI_LAUNCH(5,TBALLOON5) -CALL INI_LAUNCH(6,TBALLOON6) -CALL INI_LAUNCH(7,TBALLOON7) -CALL INI_LAUNCH(8,TBALLOON8) -CALL INI_LAUNCH(9,TBALLOON9) +IF ( IMI == 1 ) THEN + ALLOCATE( NRANKCUR_BALLOON (NBALLOONS) ); NRANKCUR_BALLOON = NFLYER_DEFAULT_RANK + ALLOCATE( NRANKNXT_BALLOON (NBALLOONS) ); NRANKNXT_BALLOON = NFLYER_DEFAULT_RANK + + ALLOCATE( TBALLOONS(NBALLOONS) ) +END IF + +! Flyers are at first only initialized on 1 process. Data will be transfered later on the right processes +IF ( ISP == NFLYER_DEFAULT_RANK ) THEN + IF ( IMI == 1 ) CALL INI_BALLOON + + DO JI = 1, NBALLOONS + CALL INI_LAUNCH( JI, TBALLOONS(JI)%TBALLOON ) + END DO +END IF ! !---------------------------------------------------------------------------- ! !* 3. Aircraft initialization ! ----------------------- ! -IF (IMI == 1) CALL INI_AIRCRAFT -! -CALL INI_FLIGHT(1,TAIRCRAFT1) -CALL INI_FLIGHT(2,TAIRCRAFT2) -CALL INI_FLIGHT(3,TAIRCRAFT3) -CALL INI_FLIGHT(4,TAIRCRAFT4) -CALL INI_FLIGHT(5,TAIRCRAFT5) -CALL INI_FLIGHT(6,TAIRCRAFT6) -CALL INI_FLIGHT(7,TAIRCRAFT7) -CALL INI_FLIGHT(8,TAIRCRAFT8) -CALL INI_FLIGHT(9,TAIRCRAFT9) -CALL INI_FLIGHT(10,TAIRCRAFT10) -CALL INI_FLIGHT(11,TAIRCRAFT11) -CALL INI_FLIGHT(12,TAIRCRAFT12) -CALL INI_FLIGHT(13,TAIRCRAFT13) -CALL INI_FLIGHT(14,TAIRCRAFT14) -CALL INI_FLIGHT(15,TAIRCRAFT15) -CALL INI_FLIGHT(16,TAIRCRAFT16) -CALL INI_FLIGHT(17,TAIRCRAFT17) -CALL INI_FLIGHT(18,TAIRCRAFT18) -CALL INI_FLIGHT(19,TAIRCRAFT19) -CALL INI_FLIGHT(20,TAIRCRAFT20) -CALL INI_FLIGHT(21,TAIRCRAFT21) -CALL INI_FLIGHT(22,TAIRCRAFT22) -CALL INI_FLIGHT(23,TAIRCRAFT23) -CALL INI_FLIGHT(24,TAIRCRAFT24) -CALL INI_FLIGHT(25,TAIRCRAFT25) -CALL INI_FLIGHT(26,TAIRCRAFT26) -CALL INI_FLIGHT(27,TAIRCRAFT27) -CALL INI_FLIGHT(28,TAIRCRAFT28) -CALL INI_FLIGHT(29,TAIRCRAFT29) -CALL INI_FLIGHT(30,TAIRCRAFT30) +IF ( IMI == 1 ) THEN + ALLOCATE( NRANKCUR_AIRCRAFT(NAIRCRAFTS) ); NRANKCUR_AIRCRAFT = NFLYER_DEFAULT_RANK + ALLOCATE( NRANKNXT_AIRCRAFT(NAIRCRAFTS) ); NRANKNXT_AIRCRAFT = NFLYER_DEFAULT_RANK + + ALLOCATE( TAIRCRAFTS(NAIRCRAFTS) ) +END IF + +! Flyers are at first only initialized on 1 process. Data will be transfered later on the right processes +IF ( ISP == NFLYER_DEFAULT_RANK ) THEN + IF ( IMI == 1 ) CALL INI_AIRCRAFT + + DO JI = 1, NAIRCRAFTS + CALL INI_FLIGHT( JI, TAIRCRAFTS(JI)%TAIRCRAFT ) + END DO +END IF ! !---------------------------------------------------------------------------- ! !* 4. Allocations of storage arrays ! ----------------------------- ! -IF (.NOT. LFLYER) RETURN -! -CALL ALLOCATE_FLYER(TBALLOON1) -CALL ALLOCATE_FLYER(TBALLOON2) -CALL ALLOCATE_FLYER(TBALLOON3) -CALL ALLOCATE_FLYER(TBALLOON4) -CALL ALLOCATE_FLYER(TBALLOON5) -CALL ALLOCATE_FLYER(TBALLOON6) -CALL ALLOCATE_FLYER(TBALLOON7) -CALL ALLOCATE_FLYER(TBALLOON8) -CALL ALLOCATE_FLYER(TBALLOON9) -! -CALL ALLOCATE_FLYER(TAIRCRAFT1) -CALL ALLOCATE_FLYER(TAIRCRAFT2) -CALL ALLOCATE_FLYER(TAIRCRAFT3) -CALL ALLOCATE_FLYER(TAIRCRAFT4) -CALL ALLOCATE_FLYER(TAIRCRAFT5) -CALL ALLOCATE_FLYER(TAIRCRAFT6) -CALL ALLOCATE_FLYER(TAIRCRAFT7) -CALL ALLOCATE_FLYER(TAIRCRAFT8) -CALL ALLOCATE_FLYER(TAIRCRAFT9) -CALL ALLOCATE_FLYER(TAIRCRAFT10) -CALL ALLOCATE_FLYER(TAIRCRAFT11) -CALL ALLOCATE_FLYER(TAIRCRAFT12) -CALL ALLOCATE_FLYER(TAIRCRAFT13) -CALL ALLOCATE_FLYER(TAIRCRAFT14) -CALL ALLOCATE_FLYER(TAIRCRAFT15) -CALL ALLOCATE_FLYER(TAIRCRAFT16) -CALL ALLOCATE_FLYER(TAIRCRAFT17) -CALL ALLOCATE_FLYER(TAIRCRAFT18) -CALL ALLOCATE_FLYER(TAIRCRAFT19) -CALL ALLOCATE_FLYER(TAIRCRAFT20) -CALL ALLOCATE_FLYER(TAIRCRAFT21) -CALL ALLOCATE_FLYER(TAIRCRAFT22) -CALL ALLOCATE_FLYER(TAIRCRAFT23) -CALL ALLOCATE_FLYER(TAIRCRAFT24) -CALL ALLOCATE_FLYER(TAIRCRAFT25) -CALL ALLOCATE_FLYER(TAIRCRAFT26) -CALL ALLOCATE_FLYER(TAIRCRAFT27) -CALL ALLOCATE_FLYER(TAIRCRAFT28) -CALL ALLOCATE_FLYER(TAIRCRAFT29) -CALL ALLOCATE_FLYER(TAIRCRAFT30) +IF ( IMI == 1 .AND. ISP == NFLYER_DEFAULT_RANK ) THEN + DO JI = 1, NBALLOONS + CALL ALLOCATE_FLYER( TBALLOONS(JI)%TBALLOON ) + END DO + + DO JI = 1, NAIRCRAFTS + CALL ALLOCATE_FLYER( TAIRCRAFTS(JI)%TAIRCRAFT ) + END DO +END IF ! !---------------------------------------------------------------------------- !---------------------------------------------------------------------------- ! CONTAINS ! -!---------------------------------------------------------------------------- -!---------------------------------------------------------------------------- -SUBROUTINE DEFAULT_FLYER(TPFLYER) -! -TYPE(FLYER), INTENT(OUT) :: TPFLYER -! -! -TPFLYER%NMODEL = 0 -TPFLYER%MODEL = 'FIX' -TPFLYER%TYPE = ' ' -TPFLYER%TITLE = ' ' -TPFLYER%LAUNCH = TPDTSEG -TPFLYER%CRASH = .FALSE. -TPFLYER%FLY = .FALSE. -! -TPFLYER%T_CUR = XUNDEF -TPFLYER%N_CUR = 0 -TPFLYER%STEP = 60. ! s -! -TPFLYER%LAT = XUNDEF -TPFLYER%LON = XUNDEF -TPFLYER%XLAUNCH = XUNDEF! X coordinate of launch -TPFLYER%YLAUNCH = XUNDEF! Y coordinate of launch -TPFLYER%ALT = XUNDEF -TPFLYER%WASCENT = 5. ! m/s -TPFLYER%RHO = XUNDEF -TPFLYER%PRES = XUNDEF -TPFLYER%DIAMETER= XUNDEF -TPFLYER%AERODRAG= XUNDEF -TPFLYER%INDDRAG = XUNDEF -TPFLYER%VOLUME = XUNDEF -TPFLYER%MASS = XUNDEF -! -TPFLYER%SEG = 0 -TPFLYER%SEGCURN = 1 -TPFLYER%SEGCURT = 0. -! -TPFLYER%ALTDEF = .FALSE. -! -TPFLYER%X_CUR = XUNDEF -TPFLYER%Y_CUR = XUNDEF -TPFLYER%Z_CUR = XUNDEF -TPFLYER%P_CUR = XUNDEF -! -END SUBROUTINE DEFAULT_FLYER -!---------------------------------------------------------------------------- -!---------------------------------------------------------------------------- -SUBROUTINE ALLOCATE_FLYER(TPFLYER) -! -! -TYPE(FLYER), INTENT(INOUT) :: TPFLYER -! -IF (TPFLYER%NMODEL > NMODEL) TPFLYER%NMODEL=0 -IF (IMI /= TPFLYER%NMODEL .AND. .NOT. (IMI==1 .AND. TPFLYER%NMODEL==0) ) RETURN -! -IF ( CPROGRAM == 'DIAG ' ) THEN - ISTORE = INT ( NTIME_AIRCRAFT_BALLOON / TPFLYER%STEP ) + 1 -ELSE - ISTORE = NINT ( ( PSEGLEN - DYN_MODEL(1)%XTSTEP ) / TPFLYER%STEP ) + 1 -ENDIF -! -IF (TPFLYER%NMODEL == 0) ISTORE=0 -IF (TPFLYER%NMODEL > 0) THEN - WRITE(ILUOUT,*) 'Aircraft or Balloon:',TPFLYER%TITLE,' nmodel=',TPFLYER%NMODEL -ENDIF -! -! -allocate( tpflyer%tpdates(istore) ) -ALLOCATE(TPFLYER%X (ISTORE)) -ALLOCATE(TPFLYER%Y (ISTORE)) -ALLOCATE(TPFLYER%Z (ISTORE)) -ALLOCATE(TPFLYER%XLON(ISTORE)) -ALLOCATE(TPFLYER%YLAT(ISTORE)) -ALLOCATE(TPFLYER%ZON (ISTORE)) -ALLOCATE(TPFLYER%MER (ISTORE)) -ALLOCATE(TPFLYER%W (ISTORE)) -ALLOCATE(TPFLYER%P (ISTORE)) -ALLOCATE(TPFLYER%TH (ISTORE)) -ALLOCATE(TPFLYER%R (ISTORE,KRR)) -ALLOCATE(TPFLYER%SV (ISTORE,KSV)) -ALLOCATE(TPFLYER%RTZ (ISTORE,KKU)) -ALLOCATE(TPFLYER%RZ (ISTORE,KKU,KRR)) -ALLOCATE(TPFLYER%FFZ (ISTORE,KKU)) -ALLOCATE(TPFLYER%IWCZ (ISTORE,KKU)) -ALLOCATE(TPFLYER%LWCZ (ISTORE,KKU)) -ALLOCATE(TPFLYER%CIZ (ISTORE,KKU)) -IF (CCLOUD=='LIMA') THEN - ALLOCATE(TPFLYER%CCZ (ISTORE,KKU)) - ALLOCATE(TPFLYER%CRZ (ISTORE,KKU)) -ENDIF -ALLOCATE(TPFLYER%CRARE(ISTORE,KKU)) -ALLOCATE(TPFLYER%CRARE_ATT(ISTORE,KKU)) -ALLOCATE(TPFLYER%WZ(ISTORE,KKU)) -ALLOCATE(TPFLYER%ZZ(ISTORE,KKU)) -IF (OUSETKE) THEN - ALLOCATE(TPFLYER%TKE (ISTORE)) -ELSE - ALLOCATE(TPFLYER%TKE (0)) -END IF -ALLOCATE(TPFLYER%TKE_DISS(ISTORE)) -ALLOCATE(TPFLYER%TSRAD (ISTORE)) -ALLOCATE(TPFLYER%ZS (ISTORE)) -! -ALLOCATE(TPFLYER%THW_FLUX (ISTORE)) -ALLOCATE(TPFLYER%RCW_FLUX (ISTORE)) -ALLOCATE(TPFLYER%SVW_FLUX (ISTORE,KSV)) -! -TPFLYER%X = XUNDEF -TPFLYER%Y = XUNDEF -TPFLYER%Z = XUNDEF -TPFLYER%XLON = XUNDEF -TPFLYER%YLAT = XUNDEF -TPFLYER%ZON = XUNDEF -TPFLYER%MER = XUNDEF -TPFLYER%W = XUNDEF -TPFLYER%P = XUNDEF -TPFLYER%TH = XUNDEF -TPFLYER%R = XUNDEF -TPFLYER%SV = XUNDEF -TPFLYER%RTZ = XUNDEF -TPFLYER%RZ = XUNDEF -TPFLYER%FFZ = XUNDEF -TPFLYER%CIZ = XUNDEF -IF (CCLOUD=='LIMA') THEN - TPFLYER%CRZ = XUNDEF - TPFLYER%CCZ = XUNDEF -ENDIF -TPFLYER%IWCZ = XUNDEF -TPFLYER%LWCZ = XUNDEF -XLAM_CRAD = 3.154E-3 ! (in m) <=> 95.04 GHz = Rasta cloud radar frequency -TPFLYER%CRARE = XUNDEF -TPFLYER%CRARE_ATT= XUNDEF -TPFLYER%WZ= XUNDEF -TPFLYER%ZZ= XUNDEF -TPFLYER%TKE = XUNDEF -TPFLYER%TSRAD = XUNDEF -TPFLYER%ZS = XUNDEF -TPFLYER%TKE_DISS = XUNDEF -! -TPFLYER%THW_FLUX = XUNDEF -TPFLYER%RCW_FLUX = XUNDEF -TPFLYER%SVW_FLUX = XUNDEF -END SUBROUTINE ALLOCATE_FLYER -!---------------------------------------------------------------------------- -!---------------------------------------------------------------------------- SUBROUTINE INI_LAUNCH(KNBR,TPFLYER) -! + +#ifdef MNH_IOCDF4 +USE NETCDF, ONLY: NF90_INQ_NCID, NF90_NOERR +#endif + +use modd_field, only: tfieldmetadata, TYPEREAL +USE MODD_IO, ONLY: GSMONOPROC, ISP, TFILEDATA +#ifdef MNH_IOCDF4 +USE MODD_PRECISION, ONLY: CDFINT +#endif +USE MODD_TIME_n, ONLY: TDTCUR + use MODE_IO_FIELD_READ, only: IO_Field_read -! -INTEGER, INTENT(IN) :: KNBR -TYPE(FLYER), INTENT(INOUT) :: TPFLYER -! -! -! -!* 0.2 declaration of local variables -! + +INTEGER, INTENT(IN) :: KNBR +CLASS(TBALLOONDATA), INTENT(INOUT) :: TPFLYER + +#ifdef MNH_IOCDF4 +INTEGER(KIND=CDFINT) :: IGROUPID +INTEGER(KIND=CDFINT) :: ISTATUS +#endif +INTEGER :: IMODEL +INTEGER :: IRESP ! return code +LOGICAL :: OMONOPROC_SAVE ! Copy of true value of GSMONOPROC +LOGICAL :: GREAD ! True if balloon position was read in synchronous file REAL :: ZLAT ! latitude of the balloon REAL :: ZLON ! longitude of the balloon -! -IF (TPFLYER%MODEL == 'MOB' .AND. TPFLYER%NMODEL /= 0) TPFLYER%NMODEL=1 -IF (TPFLYER%NMODEL > NMODEL) TPFLYER%NMODEL=0 +#ifdef MNH_IOCDF4 +TYPE(TFILEDATA) :: TZFILE +#endif +TYPE(TFIELDMETADATA) :: TZFIELD + IF ( IMI /= TPFLYER%NMODEL ) RETURN -! -LFLYER=.TRUE. -! -IF (TPFLYER%TITLE==' ') THEN - WRITE(TPFLYER%TITLE,FMT='(A6,I2.2)') TPFLYER%TYPE,KNBR -END IF -! + +GREAD = .FALSE. + +! Save GSMONOPROC value +OMONOPROC_SAVE = GSMONOPROC +! Force GSMONOPROC to true to allow IO_Field_read on only 1 process! (not very clean hack) +GSMONOPROC = .TRUE. + +CALL SM_XYHAT( PLATOR, PLONOR, TPFLYER%XLATLAUNCH, TPFLYER%XLONLAUNCH, TPFLYER%XXLAUNCH, TPFLYER%XYLAUNCH ) + IF ( CPROGRAM == 'MESONH' .OR. CPROGRAM == 'SPAWN ' .OR. CPROGRAM == 'REAL ' ) THEN - ! read the current location in the FM_FILE - ! - TZFIELD%CMNHNAME = TRIM(TPFLYER%TITLE)//'LAT' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'degree' - TZFIELD%CDIR = '--' - TZFIELD%CCOMMENT = '' - TZFIELD%NGRID = 0 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 0 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_read(TPINIFILE,TZFIELD,ZLAT,IRESP) - ! - IF ( IRESP /= 0 ) THEN - WRITE(ILUOUT,*) "INI_LAUCH: Initial location take for ",TPFLYER%TITLE + ! Read the current location in the synchronous file + + IF ( TPINIFILE%CFORMAT == 'LFI' & + .OR. ( TPINIFILE%CFORMAT == 'NETCDF4' .AND. & + ( TPINIFILE%NMNHVERSION(1) < 5 & + .OR. ( TPINIFILE%NMNHVERSION(1) == 5 .AND. TPINIFILE%NMNHVERSION(2) < 6 ) ) ) ) THEN + ! Read in LFI file or in old format if netCDF (MesoNH < 5.6) + TZFIELD = TFIELDMETADATA( & + CMNHNAME = TRIM(TPFLYER%CTITLE)//'LAT', & + CSTDNAME = '', & + CLONGNAME = TRIM(TPFLYER%CTITLE)//'LAT', & + CUNITS = 'degree', & + CDIR = '--', & + CCOMMENT = '', & + NGRID = 0, & + NTYPE = TYPEREAL, & + NDIMS = 0, & + LTIMEDEP = .TRUE. ) + CALL IO_Field_read(TPINIFILE,TZFIELD,ZLAT,IRESP) + + IF ( IRESP == 0 ) THEN + GREAD = .TRUE. + + TZFIELD = TFIELDMETADATA( & + CMNHNAME = TRIM(TPFLYER%CTITLE)//'LON', & + CSTDNAME = '', & + CLONGNAME = TRIM(TPFLYER%CTITLE)//'LON', & + CUNITS = 'degree', & + CDIR = '--', & + CCOMMENT = '', & + NGRID = 0, & + NTYPE = TYPEREAL, & + NDIMS = 0, & + LTIMEDEP = .TRUE. ) + CALL IO_Field_read(TPINIFILE,TZFIELD,ZLON) + + TZFIELD = TFIELDMETADATA( & + CMNHNAME = TRIM(TPFLYER%CTITLE)//'ALT', & + CSTDNAME = '', & + CLONGNAME = TRIM(TPFLYER%CTITLE)//'ALT', & + CUNITS = 'm', & + CDIR = '--', & + CCOMMENT = '', & + NGRID = 0, & + NTYPE = TYPEREAL, & + NDIMS = 0, & + LTIMEDEP = .TRUE. ) + CALL IO_Field_read(TPINIFILE,TZFIELD,TPFLYER%XZ_CUR) + + TZFIELD = TFIELDMETADATA( & + CMNHNAME = TRIM(TPFLYER%CTITLE)//'WASCENT', & + CSTDNAME = '', & + CLONGNAME = TRIM(TPFLYER%CTITLE)//'WASCENT', & + CUNITS = 'm s-1', & + CDIR = '--', & + CCOMMENT = '', & + NGRID = 0, & + NTYPE = TYPEREAL, & + NDIMS = 0, & + LTIMEDEP = .TRUE. ) + CALL IO_Field_read(TPINIFILE,TZFIELD,TPFLYER%XWASCENT) + + TZFIELD = TFIELDMETADATA( & + CMNHNAME = TRIM(TPFLYER%CTITLE)//'RHO', & + CSTDNAME = '', & + CLONGNAME = TRIM(TPFLYER%CTITLE)//'RHO', & + CUNITS = 'kg m-3', & + CDIR = '--', & + CCOMMENT = '', & + NGRID = 0, & + NTYPE = TYPEREAL, & + NDIMS = 0, & + LTIMEDEP = .TRUE. ) + CALL IO_Field_read(TPINIFILE,TZFIELD,TPFLYER%XRHO) + END IF +#ifdef MNH_IOCDF4 ELSE - TZFIELD%CMNHNAME = TRIM(TPFLYER%TITLE)//'LON' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'degree' - TZFIELD%CDIR = '--' - TZFIELD%CCOMMENT = '' - TZFIELD%NGRID = 0 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 0 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_read(TPINIFILE,TZFIELD,ZLON) - ! - TZFIELD%CMNHNAME = TRIM(TPFLYER%TITLE)//'ALT' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'm' - TZFIELD%CDIR = '--' - TZFIELD%CCOMMENT = '' - TZFIELD%NGRID = 0 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 0 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_read(TPINIFILE,TZFIELD,TPFLYER%Z_CUR) - ! - TPFLYER%P_CUR = XUNDEF - ! - TZFIELD%CMNHNAME = TRIM(TPFLYER%TITLE)//'WASCENT' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'm s-1' - TZFIELD%CDIR = '--' - TZFIELD%CCOMMENT = '' - TZFIELD%NGRID = 0 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 0 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_read(TPINIFILE,TZFIELD,TPFLYER%WASCENT) - ! - TZFIELD%CMNHNAME = TRIM(TPFLYER%TITLE)//'RHO' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'kg m-3' - TZFIELD%CDIR = '--' - TZFIELD%CCOMMENT = '' - TZFIELD%NGRID = 0 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 0 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_read(TPINIFILE,TZFIELD,TPFLYER%RHO) - ! - CALL SM_XYHAT(PLATOR,PLONOR,& - ZLAT,ZLON, & - TPFLYER%X_CUR, TPFLYER%Y_CUR ) - TPFLYER%FLY = .TRUE. - WRITE(ILUOUT,*) & - "INI_LAUCH: Current location read in FM file for ",TPFLYER%TITLE - IF (TPFLYER%TYPE== 'CVBALL') THEN - WRITE(ILUOUT,*) & - " Lat=",ZLAT," Lon=",ZLON," Alt=",TPFLYER%Z_CUR," Wasc=",TPFLYER%WASCENT - ELSE IF (TPFLYER%TYPE== 'ISODEN') THEN - WRITE(ILUOUT,*) & - " Lat=",ZLAT," Lon=",ZLON," Rho=",TPFLYER%RHO + ! Read in netCDF file (new structure since MesoNH 5.6) + IF ( ISP /= TPINIFILE%NMASTER_RANK ) CALL PRINT_MSG( NVERB_ERROR, 'IO', 'INI_LAUNCH', 'process is not the file master process') + + ISTATUS = NF90_INQ_NCID( TPINIFILE%NNCID, TRIM( TPFLYER%CTITLE ), IGROUPID ) + + IF ( ISTATUS == NF90_NOERR ) THEN + GREAD = .TRUE. + + TZFILE = TPINIFILE + TZFILE%NNCID = IGROUPID + + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'LAT', & + CSTDNAME = '', & + CLONGNAME = 'LAT', & + CUNITS = 'degree', & + CDIR = '--', & + CCOMMENT = 'latitude', & + NGRID = 0, & + NTYPE = TYPEREAL, & + NDIMS = 0, & + LTIMEDEP = .TRUE. ) + CALL IO_Field_read(TZFILE,TZFIELD,ZLAT) + + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'LON', & + CSTDNAME = '', & + CLONGNAME = 'LON', & + CUNITS = 'degree', & + CDIR = '--', & + CCOMMENT = 'longitude', & + NGRID = 0, & + NTYPE = TYPEREAL, & + NDIMS = 0, & + LTIMEDEP = .TRUE. ) + CALL IO_Field_read(TZFILE,TZFIELD,ZLON) + + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'ALT', & + CSTDNAME = '', & + CLONGNAME = 'ALT', & + CUNITS = 'm', & + CDIR = '--', & + CCOMMENT = 'altitude', & + NGRID = 0, & + NTYPE = TYPEREAL, & + NDIMS = 0, & + LTIMEDEP = .TRUE. ) + CALL IO_Field_read(TZFILE,TZFIELD,TPFLYER%XZ_CUR) + + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'WASCENT', & + CSTDNAME = '', & + CLONGNAME = 'WASCENT', & + CUNITS = 'm s-1', & + CDIR = '--', & + CCOMMENT = 'ascent vertical speed', & + NGRID = 0, & + NTYPE = TYPEREAL, & + NDIMS = 0, & + LTIMEDEP = .TRUE. ) + CALL IO_Field_read(TZFILE,TZFIELD,TPFLYER%XWASCENT) + + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'RHO', & + CSTDNAME = '', & + CLONGNAME = 'RHO', & + CUNITS = 'kg m-3', & + CDIR = '--', & + CCOMMENT = 'air density', & + NGRID = 0, & + NTYPE = TYPEREAL, & + NDIMS = 0, & + LTIMEDEP = .TRUE. ) + CALL IO_Field_read(TZFILE,TZFIELD,TPFLYER%XRHO) END IF - ! - TPFLYER%STEP = MAX ( PTSTEP, TPFLYER%STEP ) +#endif + END IF + + IF ( GREAD ) THEN + CALL SM_XYHAT( PLATOR, PLONOR, ZLAT, ZLON, TPFLYER%XX_CUR, TPFLYER%XY_CUR ) + + TPFLYER%LFLY = .TRUE. + TPFLYER%TPOS_CUR = TDTCUR + + CMNHMSG(1) = 'current location read from synchronous file for ' // TRIM( TPFLYER%CTITLE ) + IF (TPFLYER%CTYPE== 'CVBALL') THEN + WRITE( CMNHMSG(2), * ) " Lat=", ZLAT, " Lon=", ZLON + WRITE( CMNHMSG(3), * ) " Alt=", TPFLYER%XZ_CUR, " Wasc=", TPFLYER%XWASCENT + ELSE IF (TPFLYER%CTYPE== 'ISODEN') THEN + WRITE( CMNHMSG(2), * ) " Lat=", ZLAT, " Lon=", ZLON, " Rho=", TPFLYER%XRHO + END IF + CALL PRINT_MSG( NVERB_INFO, 'GEN', 'INI_LAUNCH' ) + ELSE + ! The position is not found, data is not in the synchronous file + ! Use the position given in namelist + CALL PRINT_MSG( NVERB_INFO, 'GEN', 'INI_LAUNCH', 'initial location taken from namelist for ' // TRIM( TPFLYER%CTITLE ) ) + END IF + + ! Correct timestep if necessary + ! This has to be done at first pass (when IMI=1) to have the correct value as soon as possible + ! If 'MOB', set balloon store timestep to be at least the timestep of the coarser model (IMI=1) (with higher timestep) + ! as the balloon can fly on any model + ! If 'FIX', set balloon store timestep to be at least the timestep of its model + ! It should also need to be a multiple of the model timestep + IF ( IMI == 1 ) THEN + IF ( TPFLYER%CMODEL == 'MOB' ) THEN + IMODEL = 1 + ELSE + IMODEL = TPFLYER%NMODEL + END IF + + CALL FLYER_TIMESTEP_CORRECT( DYN_MODEL(IMODEL)%XTSTEP, TPFLYER ) END IF ! -ELSE IF (CPROGRAM == 'DIAG ' ) THEN +ELSE IF ( CPROGRAM == 'DIAG ' ) THEN IF ( LAIRCRAFT_BALLOON ) THEN ! read the current location in MODD_DIAG_FLAG ! ZLAT=XLAT_BALLOON(KNBR) ZLON=XLON_BALLOON(KNBR) - TPFLYER%Z_CUR=XALT_BALLOON(KNBR) - IF (TPFLYER%Z_CUR /= XUNDEF .AND. ZLAT /= XUNDEF .AND. ZLON /= XUNDEF ) THEN - CALL SM_XYHAT(PLATOR,PLONOR, & - ZLAT,ZLON, & - TPFLYER%X_CUR, TPFLYER%Y_CUR ) - TPFLYER%FLY = .TRUE. - WRITE(ILUOUT,*) & - "INI_LAUCH: Current location read in MODD_DIAG_FLAG for ",TPFLYER%TITLE - WRITE(ILUOUT,*) & - " Lat=",ZLAT," Lon=",ZLON," Alt=",TPFLYER%Z_CUR + TPFLYER%XZ_CUR=XALT_BALLOON(KNBR) + IF (TPFLYER%XZ_CUR /= XUNDEF .AND. ZLAT /= XUNDEF .AND. ZLON /= XUNDEF ) THEN + CALL SM_XYHAT( PLATOR, PLONOR, ZLAT, ZLON, TPFLYER%XX_CUR, TPFLYER%XY_CUR ) + TPFLYER%LFLY = .TRUE. + CMNHMSG(1) = 'current location read from MODD_DIAG_FLAG for ' // TRIM( TPFLYER%CTITLE ) + WRITE( CMNHMSG(2), * ) " Lat=", ZLAT, " Lon=", ZLON," Alt=",TPFLYER%XZ_CUR + CALL PRINT_MSG( NVERB_INFO, 'GEN', 'INI_LAUNCH' ) END IF ! - TPFLYER%STEP = MAX (XSTEP_AIRCRAFT_BALLOON , TPFLYER%STEP ) + CALL FLYER_TIMESTEP_CORRECT( XSTEP_AIRCRAFT_BALLOON, TPFLYER ) END IF END IF -! -IF (TPFLYER%LAT==XUNDEF .OR.TPFLYER%LON==XUNDEF) THEN - WRITE(ILUOUT,*) 'Error in balloon initial position (balloon number ',KNBR,' )' - WRITE(ILUOUT,*) 'either LATitude or LONgitude is not given' - WRITE(ILUOUT,*) 'TPBALLOON%LAT=',TPFLYER%LAT - WRITE(ILUOUT,*) 'TPBALLOON%LON=',TPFLYER%LON - WRITE(ILUOUT,*) 'Check your INI_BALLOON routine' -!callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_AIRCRAFT_BALLOON','') -END IF -! -CALL SM_XYHAT(PLATOR,PLONOR, & - TPFLYER%LAT, TPFLYER%LON, & - TPFLYER%XLAUNCH, TPFLYER%YLAUNCH ) -! + +! Restore correct value of GSMONOPROC +GSMONOPROC = OMONOPROC_SAVE + END SUBROUTINE INI_LAUNCH !---------------------------------------------------------------------------- !---------------------------------------------------------------------------- SUBROUTINE INI_FLIGHT(KNBR,TPFLYER) -! -INTEGER, INTENT(IN) :: KNBR -TYPE(FLYER), INTENT(INOUT) :: TPFLYER -! -IF (TPFLYER%MODEL == 'MOB' .AND. TPFLYER%NMODEL /= 0) TPFLYER%NMODEL=1 -IF (TPFLYER%NMODEL > NMODEL) TPFLYER%NMODEL=0 + +INTEGER, INTENT(IN) :: KNBR +CLASS(TAIRCRAFTDATA), INTENT(INOUT) :: TPFLYER + +INTEGER :: IMODEL +INTEGER :: JSEG ! loop counter + IF ( IMI /= TPFLYER%NMODEL ) RETURN -! -LFLYER=.TRUE. -! -TPFLYER%STEP = MAX ( PTSTEP, TPFLYER%STEP ) -! -IF (TPFLYER%SEG==0) THEN - WRITE(ILUOUT,*) 'Error in aircraft flight path (aircraft number ',KNBR,' )' - WRITE(ILUOUT,*) 'There is ZERO flight segment defined.' - WRITE(ILUOUT,*) 'TPAIRCRAFT%SEG=',TPFLYER%SEG - WRITE(ILUOUT,*) 'Check your INI_AIRCRAFT routine' -!callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_FLIGHT','') -END IF -! -IF ( ANY(TPFLYER%SEGLAT(:)==XUNDEF) .OR. ANY(TPFLYER%SEGLON(:)==XUNDEF) ) THEN - WRITE(ILUOUT,*) 'Error in aircraft flight path (aircraft number ',KNBR,' )' - WRITE(ILUOUT,*) 'either LATitude or LONgitude segment' - WRITE(ILUOUT,*) 'definiton is not complete.' - WRITE(ILUOUT,*) 'TPAIRCRAFT%SEGLAT=',TPFLYER%SEGLAT - WRITE(ILUOUT,*) 'TPAIRCRAFT%SEGLON=',TPFLYER%SEGLON - WRITE(ILUOUT,*) 'Check your INI_AIRCRAFT routine' -!callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_AIRCRAFT_BALLOON','') + +! Correct timestep if necessary +! This has to be done at first pass (when IMI=1) to have the correct value as soon as possible +! If 'MOB', set balloon store timestep to be at least the timestep of the coarser model (IMI=1) (with higher timestep) +! as the balloon can fly on any model +! If 'FIX', set balloon store timestep to be at least the timestep of its model +! It should also need to be a multiple of the model timestep +IF ( IMI == 1 ) THEN + IF ( TPFLYER%CMODEL == 'MOB' ) THEN + IMODEL = 1 + ELSE + IMODEL = TPFLYER%NMODEL + END IF + + CALL FLYER_TIMESTEP_CORRECT( DYN_MODEL(IMODEL)%XTSTEP, TPFLYER ) END IF -! -ALLOCATE(TPFLYER%SEGX(TPFLYER%SEG+1)) -ALLOCATE(TPFLYER%SEGY(TPFLYER%SEG+1)) -! -DO JSEG=1,TPFLYER%SEG+1 - CALL SM_XYHAT(PLATOR,PLONOR, & - TPFLYER%SEGLAT(JSEG), TPFLYER%SEGLON(JSEG), & - TPFLYER%SEGX(JSEG), TPFLYER%SEGY(JSEG) ) + +ALLOCATE(TPFLYER%XPOSX(TPFLYER%NPOS)) +ALLOCATE(TPFLYER%XPOSY(TPFLYER%NPOS)) + +DO JSEG = 1, TPFLYER%NPOS + CALL SM_XYHAT( PLATOR, PLONOR, TPFLYER%XPOSLAT(JSEG), TPFLYER%XPOSLON(JSEG), TPFLYER%XPOSX(JSEG), TPFLYER%XPOSY(JSEG) ) END DO -! -IF ( ANY(TPFLYER%SEGTIME(:)==XUNDEF) ) THEN - WRITE(ILUOUT,*) 'Error in aircraft flight path (aircraft number ',KNBR,' )' - WRITE(ILUOUT,*) 'definiton of segment duration is not complete.' - WRITE(ILUOUT,*) 'TPAIRCRAFT%SEGTIME=',TPFLYER%SEGTIME - WRITE(ILUOUT,*) 'Check your INI_AIRCRAFT routine' -!callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_AIRCRAFT_BALLOON','') + +END SUBROUTINE INI_FLIGHT +!---------------------------------------------------------------------------- +!---------------------------------------------------------------------------- +SUBROUTINE FLYER_TIMESTEP_CORRECT( PTSTEP_MODEL, TPFLYER ) +! Timestep is set to a multiple of the PTSTEP_MODEL value +REAL, INTENT(IN) :: PTSTEP_MODEL +CLASS(TFLYERDATA), INTENT(INOUT) :: TPFLYER + +REAL :: ZTSTEP_OLD + +ZTSTEP_OLD = TPFLYER%TFLYER_TIME%XTSTEP + +TPFLYER%TFLYER_TIME%XTSTEP = MAX ( PTSTEP_MODEL, TPFLYER%TFLYER_TIME%XTSTEP ) +TPFLYER%TFLYER_TIME%XTSTEP = NINT( TPFLYER%TFLYER_TIME%XTSTEP / PTSTEP_MODEL ) * PTSTEP_MODEL + +IF ( ABS( TPFLYER%TFLYER_TIME%XTSTEP - ZTSTEP_OLD ) > 1E-6 ) THEN + WRITE( CMNHMSG(1), '( "Timestep for flyer ", A, " is set to ", EN12.3, " (instead of ", EN12.3, ")" )' ) & + TPFLYER%CTITLE, TPFLYER%TFLYER_TIME%XTSTEP, ZTSTEP_OLD + CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'INI_LAUNCH' ) END IF + +END SUBROUTINE FLYER_TIMESTEP_CORRECT +!---------------------------------------------------------------------------- + +!---------------------------------------------------------------------------- ! -! -IF (TPFLYER%TITLE==' ') THEN - WRITE(TPFLYER%TITLE,FMT='(A6,I2.2)') TPFLYER%TYPE,KNBR +END SUBROUTINE INI_AIRCRAFT_BALLOON + +!---------------------------------------------------------------------------- +!---------------------------------------------------------------------------- +SUBROUTINE ALLOCATE_FLYER( TPFLYER, KSTORE ) + +USE MODD_AIRCRAFT_BALLOON, ONLY: TFLYERDATA +USE MODD_CONF, ONLY: CPROGRAM +USE MODD_CONF_n, ONLY: NRR +USE MODD_DIAG_FLAG, ONLY: NTIME_AIRCRAFT_BALLOON +USE MODD_DIM_n, ONLY: NKMAX +USE MODD_DYN, ONLY: XSEGLEN +USE MODD_DYN_n, ONLY: DYN_MODEL +USE MODD_NSV, ONLY: NSV +USE MODD_PARAMETERS, ONLY: JPVEXT, NNEGUNDEF, XUNDEF +USE MODD_PARAM_n, ONLY: CCLOUD, CTURB +USE MODD_SURF_PAR, ONLY: XUNDEF_SFX => XUNDEF + +IMPLICIT NONE + +CLASS(TFLYERDATA), INTENT(INOUT) :: TPFLYER +INTEGER, OPTIONAL, INTENT(IN) :: KSTORE + +INTEGER :: IKU ! number of vertical levels +INTEGER :: ISTORE ! number of storage instants + +CALL PRINT_MSG( NVERB_DEBUG, 'GEN', 'ALLOCATE_FLYER', 'flyer: ' // TRIM(TPFLYER%CTITLE), OLOCAL = .TRUE. ) + +IKU = NKMAX + 2 * JPVEXT + +IF ( PRESENT( KSTORE ) ) THEN + ISTORE = KSTORE +ELSE + IF ( CPROGRAM == 'DIAG ' ) THEN + ISTORE = INT ( NTIME_AIRCRAFT_BALLOON / TPFLYER%TFLYER_TIME%XTSTEP ) + 1 + ELSE + ISTORE = NINT ( ( XSEGLEN - DYN_MODEL(1)%XTSTEP ) / TPFLYER%TFLYER_TIME%XTSTEP ) + 1 + ENDIF END IF ! -END SUBROUTINE INI_FLIGHT +ALLOCATE( TPFLYER%TFLYER_TIME%TPDATES(ISTORE) ) +ALLOCATE( TPFLYER%NMODELHIST(ISTORE) ) +ALLOCATE( TPFLYER%XX (ISTORE) ) +ALLOCATE( TPFLYER%XY (ISTORE) ) +ALLOCATE( TPFLYER%XZ (ISTORE) ) +ALLOCATE( TPFLYER%XLON (ISTORE) ) +ALLOCATE( TPFLYER%XLAT (ISTORE) ) +ALLOCATE( TPFLYER%XZON (ISTORE) ) +ALLOCATE( TPFLYER%XMER (ISTORE) ) +ALLOCATE( TPFLYER%XW (ISTORE) ) +ALLOCATE( TPFLYER%XP (ISTORE) ) +ALLOCATE( TPFLYER%XTH (ISTORE) ) +ALLOCATE( TPFLYER%XR (ISTORE, NRR) ) +ALLOCATE( TPFLYER%XSV (ISTORE, NSV) ) +ALLOCATE( TPFLYER%XRTZ (ISTORE, IKU) ) +ALLOCATE( TPFLYER%XRZ (ISTORE, IKU, NRR) ) +ALLOCATE( TPFLYER%XFFZ (ISTORE, IKU) ) +ALLOCATE( TPFLYER%XIWCZ(ISTORE, IKU) ) +ALLOCATE( TPFLYER%XLWCZ(ISTORE, IKU) ) +ALLOCATE( TPFLYER%XCIZ (ISTORE, IKU) ) +IF ( CCLOUD == 'LIMA' ) THEN + ALLOCATE( TPFLYER%XCCZ(ISTORE, IKU) ) + ALLOCATE( TPFLYER%XCRZ(ISTORE, IKU) ) +ELSE + ALLOCATE( TPFLYER%XCCZ(0, 0) ) + ALLOCATE( TPFLYER%XCRZ(0, 0) ) +ENDIF +ALLOCATE( TPFLYER%XCRARE (ISTORE, IKU) ) +ALLOCATE( TPFLYER%XCRARE_ATT(ISTORE, IKU) ) +ALLOCATE( TPFLYER%XWZ (ISTORE, IKU) ) +ALLOCATE( TPFLYER%XZZ (ISTORE, IKU) ) +IF ( CTURB == 'TKEL' ) THEN + ALLOCATE( TPFLYER%XTKE(ISTORE) ) +ELSE + ALLOCATE( TPFLYER%XTKE(0) ) +END IF +ALLOCATE( TPFLYER%XTKE_DISS(ISTORE) ) +ALLOCATE( TPFLYER%XTSRAD (ISTORE) ) +ALLOCATE( TPFLYER%XZS (ISTORE) ) + +ALLOCATE( TPFLYER%XTHW_FLUX(ISTORE) ) +ALLOCATE( TPFLYER%XRCW_FLUX(ISTORE) ) +ALLOCATE( TPFLYER%XSVW_FLUX(ISTORE, NSV) ) + +TPFLYER%NMODELHIST = NNEGUNDEF +TPFLYER%XX = XUNDEF +TPFLYER%XY = XUNDEF +TPFLYER%XZ = XUNDEF +TPFLYER%XLON = XUNDEF +TPFLYER%XLAT = XUNDEF +TPFLYER%XZON = XUNDEF +TPFLYER%XMER = XUNDEF +TPFLYER%XW = XUNDEF +TPFLYER%XP = XUNDEF +TPFLYER%XTH = XUNDEF +TPFLYER%XR = XUNDEF +TPFLYER%XSV = XUNDEF +TPFLYER%XRTZ = XUNDEF +TPFLYER%XRZ = XUNDEF +TPFLYER%XFFZ = XUNDEF +TPFLYER%XIWCZ = XUNDEF +TPFLYER%XLWCZ = XUNDEF +TPFLYER%XCIZ = XUNDEF +TPFLYER%XCCZ = XUNDEF +TPFLYER%XCRZ = XUNDEF +TPFLYER%XCRARE = XUNDEF +TPFLYER%XCRARE_ATT = XUNDEF +TPFLYER%XWZ = XUNDEF +TPFLYER%XZZ = XUNDEF +TPFLYER%XTKE = XUNDEF +TPFLYER%XTKE_DISS = XUNDEF +TPFLYER%XTSRAD = XUNDEF_SFX +TPFLYER%XZS = XUNDEF + +TPFLYER%XTHW_FLUX = XUNDEF +TPFLYER%XRCW_FLUX = XUNDEF +TPFLYER%XSVW_FLUX = XUNDEF + +END SUBROUTINE ALLOCATE_FLYER !---------------------------------------------------------------------------- !---------------------------------------------------------------------------- -! -END SUBROUTINE INI_AIRCRAFT_BALLOON +SUBROUTINE DEALLOCATE_FLYER( TPFLYER ) + +USE MODD_AIRCRAFT_BALLOON, ONLY: TAIRCRAFTDATA, TFLYERDATA + +IMPLICIT NONE + +CLASS(TFLYERDATA), INTENT(INOUT) :: TPFLYER + +CALL PRINT_MSG( NVERB_DEBUG, 'GEN', 'DEALLOCATE_FLYER', 'flyer: ' // TRIM(TPFLYER%CTITLE), OLOCAL = .TRUE. ) + +DEALLOCATE( TPFLYER%TFLYER_TIME%TPDATES ) +DEALLOCATE( TPFLYER%NMODELHIST ) +DEALLOCATE( TPFLYER%XX ) +DEALLOCATE( TPFLYER%XY ) +DEALLOCATE( TPFLYER%XZ ) +DEALLOCATE( TPFLYER%XLON ) +DEALLOCATE( TPFLYER%XLAT ) +DEALLOCATE( TPFLYER%XZON ) +DEALLOCATE( TPFLYER%XMER ) +DEALLOCATE( TPFLYER%XW ) +DEALLOCATE( TPFLYER%XP ) +DEALLOCATE( TPFLYER%XTH ) +DEALLOCATE( TPFLYER%XR ) +DEALLOCATE( TPFLYER%XSV ) +DEALLOCATE( TPFLYER%XRTZ ) +DEALLOCATE( TPFLYER%XRZ ) +DEALLOCATE( TPFLYER%XFFZ ) +DEALLOCATE( TPFLYER%XIWCZ ) +DEALLOCATE( TPFLYER%XLWCZ ) +DEALLOCATE( TPFLYER%XCIZ ) +DEALLOCATE( TPFLYER%XCCZ ) +DEALLOCATE( TPFLYER%XCRZ ) +DEALLOCATE( TPFLYER%XCRARE ) +DEALLOCATE( TPFLYER%XCRARE_ATT ) +DEALLOCATE( TPFLYER%XWZ ) +DEALLOCATE( TPFLYER%XZZ ) +DEALLOCATE( TPFLYER%XTKE ) +DEALLOCATE( TPFLYER%XTKE_DISS ) +DEALLOCATE( TPFLYER%XTSRAD ) +DEALLOCATE( TPFLYER%XZS ) + +DEALLOCATE( TPFLYER%XTHW_FLUX ) +DEALLOCATE( TPFLYER%XRCW_FLUX ) +DEALLOCATE( TPFLYER%XSVW_FLUX ) + +SELECT TYPE( TPFLYER ) + CLASS IS ( TAIRCRAFTDATA ) + DEALLOCATE( TPFLYER%XPOSLAT ) + DEALLOCATE( TPFLYER%XPOSLON ) + DEALLOCATE( TPFLYER%XPOSX ) + DEALLOCATE( TPFLYER%XPOSY ) + IF ( TPFLYER%LALTDEF ) THEN + DEALLOCATE( TPFLYER%XPOSP ) + ELSE + DEALLOCATE( TPFLYER%XPOSZ ) + END IF + DEALLOCATE( TPFLYER%XPOSTIME ) +END SELECT + +END SUBROUTINE DEALLOCATE_FLYER +!---------------------------------------------------------------------------- +!---------------------------------------------------------------------------- + +END MODULE MODE_INI_AIRCRAFT_BALLOON diff --git a/src/MNH/ini_balloon.f90 b/src/MNH/ini_balloon.f90 index 71e935021ef69f07716cc6491b7613de82328b4f..342eb5abfe3a76cc51e44df83376f90a728f3b7f 100644 --- a/src/MNH/ini_balloon.f90 +++ b/src/MNH/ini_balloon.f90 @@ -1,8 +1,18 @@ -!MNH_LIC Copyright 2000-2020 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2000-2023 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 MODE_INI_BALLOON + +IMPLICIT NONE + +PRIVATE + +PUBLIC :: INI_BALLOON + +CONTAINS + ! ###################### SUBROUTINE INI_BALLOON ! ###################### @@ -18,7 +28,7 @@ !! ------ !! !! For constant volume Balloon, horizontal advection using horizontal wind -!! vertical spped of the balloon calculated using the balloon equation +!! vertical speed of the balloon calculated using the balloon equation !! (Koffi et AL 2000, JAS vol 57 P.2007-2021) !! !! Must be defined (for each balloon): @@ -93,414 +103,284 @@ !! ------------- !! Original 15/05/2000 !! Apr,19, 2001 (G.Jaubert) add CVBALL type and switch in models -!! +! P. Wautelet 13/07/2022: give balloons characteristics in namelist instead of hardcoded !! -------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! USE MODD_AIRCRAFT_BALLOON -USE MODD_CST -! -! +USE MODD_CONF, ONLY: NMODEL_NEST => NMODEL +USE MODD_CST, ONLY: XPI +USE MODD_PARAMETERS, ONLY: XNEGUNDEF, XUNDEF + +USE MODE_MSG + +USE MODN_BALLOONS + IMPLICIT NONE -! -! -!* 0.1 declarations of arguments -! -! -!------------------------------------------------------------------------------- -! -! 0.2 declaration of local variables -! -! -!---------------------------------------------------------------------------- -! -!* 1. Balloon number 1 -! ---------------- -! -!* model number -! -TBALLOON1%NMODEL = 0 -TBALLOON1%MODEL = 'MOB' -! -!* balloon type -! -TBALLOON1%TYPE = 'CVBALL' -! -!* balloon name -! -TBALLOON1%TITLE = 'CVB1MOBI' -! -!* launching date and time -! -TBALLOON1%LAUNCH%nyear = 1999 -TBALLOON1%LAUNCH%nmonth = 09 -TBALLOON1%LAUNCH%nday = 19 -TBALLOON1%LAUNCH%xtime = 32460. -! -!* latitude and longitude of launching site (decimal degree) -! -TBALLOON1%LAT = 45.800 -TBALLOON1%LON = 8.629 -! -!* altitude of the launching site for 'RADIOS' -!* altitude or pressure of the flight level for 'ISODEN' -! -!TBALLOON1%ALT = 3959. -TBALLOON1%PRES = 98450. -! -!* time step for data storage (s) -! -TBALLOON1%STEP = 20. -! -!* ascentional vertical speed of the ballon (in calm air) (for 'RADIOS') -! -TBALLOON1%WASCENT = 0. -! -!* aerodynamic drag coefficient of the balloon (for 'CVBALL') -!* induced drag coefficient (i.e. air shifted by the balloon) (for 'CVBALL') -!* volume of the balloon (m3) (for 'CVBALL') -!* mass of the balloon (kg) (for 'CVBALL') -! -TBALLOON1%AERODRAG = 0.44 -TBALLOON1%INDDRAG = 0.014 -TBALLOON1%VOLUME = 3.040 -TBALLOON1%MASS = 2.4516 -TBALLOON1%DIAMETER = ((3.*TBALLOON1%VOLUME)/(4.*XPI))**(1./3.) -! -!---------------------------------------------------------------------------- -! -!* 2. Balloon number 2 -! ---------------- -! -!* model number -! -TBALLOON2%NMODEL = 0 -TBALLOON2%MODEL = 'MOB' -! -!* balloon type -! -TBALLOON2%TYPE = 'CVBALL' -! -!* balloon name -! -TBALLOON2%TITLE = 'CVB2MOBI' -! -!* launching date and time -! -TBALLOON2%LAUNCH%nyear = 1999 -TBALLOON2%LAUNCH%nmonth = 09 -TBALLOON2%LAUNCH%nday = 19 -TBALLOON2%LAUNCH%xtime = 39660. -! -!* latitude and longitude of launching site (decimal degree) -! -TBALLOON2%LAT = 45.800 -TBALLOON2%LON = 8.630 -! -!* altitude of the launching site for 'RADIOS' -!* altitude or pressure of the flight level for 'ISODEN' -! -!TBALLOON2%ALT = 3959. -TBALLOON2%PRES = 98490. -! -!* time step for data storage (s) -! -TBALLOON2%STEP = 20. -! -!* ascentional vertical speed of the ballon (in calm air) (for 'RADIOS') -! -TBALLOON2%WASCENT = 0. -! -!* aerodynamic drag coefficient of the balloon (for 'CVBALL') -!* induced drag coefficient (i.e. air shifted by the balloon) (for 'CVBALL') -!* volume of the balloon (m3) (for 'CVBALL') -!* mass of the balloon (kg) (for 'CVBALL') -! -TBALLOON2%AERODRAG = 0.44 -TBALLOON2%INDDRAG = 0.014 -TBALLOON2%VOLUME = 3.040 -TBALLOON2%MASS = 2.58087 -TBALLOON2%DIAMETER = ((3.*TBALLOON2%VOLUME)/(4.*XPI))**(1./3.) -! -!------------------------------------------------------------------------------- -!---------------------------------------------------------------------------- -! -!* 3. Balloon number 3 -! ---------------- -! -!* model number -! -TBALLOON3%NMODEL = 0 -TBALLOON3%MODEL = 'MOB' -! -!* balloon type -! -TBALLOON3%TYPE = 'RADIOS' -! -!* balloon name -! -TBALLOON3%TITLE = 'RSMASE19' -! -!* launching date and time -! -TBALLOON3%LAUNCH%nyear = 1999 -TBALLOON3%LAUNCH%nmonth = 09 -TBALLOON3%LAUNCH%nday = 19 -TBALLOON3%LAUNCH%xtime = 68400. -! -!* latitude and longitude of launching site (decimal degree) -! -TBALLOON3%LAT = 46.810 -TBALLOON3%LON = 9.39 -! -!* altitude of the launching site for 'RADIOS' -!* altitude or pressure of the flight level for 'ISODEN' -! -TBALLOON3%ALT = 865. -!TBALLOON3%PRES = 62360. -! -!* time step for data storage (s) -! -TBALLOON3%STEP = 20. -! -!* ascentional vertical speed of the ballon (in calm air) (for 'RADIOS') -! -TBALLOON3%WASCENT = 4.85 -! -!* aerodynamic drag coefficient of the balloon (for 'CVBALL') -!* induced drag coefficient (i.e. air shifted by the balloon) (for 'CVBALL') -!* volume of the balloon (m3) (for 'CVBALL') -!* mass of the balloon (kg) (for 'CVBALL') -! -TBALLOON3%AERODRAG = 0.44 -TBALLOON3%INDDRAG = 0.014 -TBALLOON3%VOLUME = 3.040 -TBALLOON3%MASS = 2.4516 -TBALLOON3%DIAMETER = ((3.*TBALLOON3%VOLUME)/(4.*XPI))**(1./3.) -! -! -!---------------------------------------------------------------------------- -! -!* 4. Balloon number 4 -! ---------------- -! -!* model number -! -TBALLOON4%NMODEL = 0 -TBALLOON4%MODEL = 'FIX' -! -!* balloon type -! -TBALLOON4%TYPE = 'CVBALL' -! -!* balloon name -! -TBALLOON4%TITLE = 'CVB1ACVB' -! -!* launching date and time -! -TBALLOON4%LAUNCH%nyear = 1999 -TBALLOON4%LAUNCH%nmonth = 09 -TBALLOON4%LAUNCH%nday = 19 -TBALLOON4%LAUNCH%xtime = 32460. -! -!* latitude and longitude of launching site (decimal degree) -! -TBALLOON4%LAT = 45.922 -TBALLOON4%LON = 8.646 -! -!* altitude of the launching site for 'RADIOS' -!* altitude or pressure of the flight level for 'ISODEN' -! -TBALLOON4%ALT = 3959. -!TBALLOON4%PRES = 62360. -! -!* time step for data storage (s) -! -TBALLOON4%STEP = 20. -! -!* ascentional vertical speed of the ballon (in calm air) (for 'RADIOS') -! -!TBALLOON4%WASCENT = 2.55 -! -!* aerodynamic drag coefficient of the balloon (for 'CVBALL') -!* induced drag coefficient (i.e. air shifted by the balloon) (for 'CVBALL') -!* volume of the balloon (m3) (for 'CVBALL') -!* mass of the balloon (kg) (for 'CVBALL') -! -TBALLOON4%AERODRAG = 0.44 -TBALLOON4%INDDRAG = 0.014 -TBALLOON4%VOLUME = 3.040 -TBALLOON4%MASS = 2.4516 -TBALLOON4%DIAMETER = ((3.*TBALLOON4%VOLUME)/(4.*XPI))**(1./3.) -! -!---------------------------------------------------------------------------- -! -!* 5. Balloon number 5 -! ---------------- -! -!* model number -! -TBALLOON5%NMODEL = 0 -TBALLOON5%MODEL = 'FIX' -! -!* balloon type -! -TBALLOON5%TYPE = 'CVBALL' -! -!* balloon name -! -TBALLOON5%TITLE = 'CVB1DEPA' -! -!* launching date and time -! -TBALLOON5%LAUNCH%nyear = 1999 -TBALLOON5%LAUNCH%nmonth = 09 -TBALLOON5%LAUNCH%nday = 19 -TBALLOON5%LAUNCH%xtime = 32435. -! -!* latitude and longitude of launching site (decimal degree) -! -TBALLOON5%LAT = 45.800 -TBALLOON5%LON = 8.630 -! -!* altitude of the launching site for 'RADIOS' -!* altitude or pressure of the flight level for 'ISODEN' -! -TBALLOON5%ALT = 340. -!TBALLOON5%PRES = 62360. -! -!* time step for data storage (s) -! -TBALLOON5%STEP = 20. -! -!* ascentional vertical speed of the ballon (in calm air) (for 'RADIOS') -! -!TBALLOON5%WASCENT = 2.55 -! -!* aerodynamic drag coefficient of the balloon (for 'CVBALL') -!* induced drag coefficient (i.e. air shifted by the balloon) (for 'CVBALL') -!* volume of the balloon (m3) (for 'CVBALL') -!* mass of the balloon (kg) (for 'CVBALL') -! -TBALLOON5%AERODRAG = 0.44 -TBALLOON5%INDDRAG = 0.014 -TBALLOON5%VOLUME = 3.040 -TBALLOON5%MASS = 2.4516 -TBALLOON5%DIAMETER = ((3.*TBALLOON5%VOLUME)/(4.*XPI))**(1./3.) -! -!---------------------------------------------------------------------------- -! -!* 6. Balloon number 6 -! ---------------- -! -!* model number -! -TBALLOON6%NMODEL = 0 -TBALLOON6%MODEL = 'FIX' -! -!* balloon type -! -TBALLOON6%TYPE = 'CVBALL' -! -!* balloon name -! -TBALLOON6%TITLE = 'CVB1RCVB' -! -!* launching date and time -! -TBALLOON6%LAUNCH%nyear = 1999 -TBALLOON6%LAUNCH%nmonth = 09 -TBALLOON6%LAUNCH%nday = 19 -TBALLOON6%LAUNCH%xtime = 32460. -! -!* latitude and longitude of launching site (decimal degree) -! -TBALLOON6%LAT = 45.922 -TBALLOON6%LON = 8.646 -! -!* altitude of the launching site for 'RADIOS' -!* altitude or pressure of the flight level for 'ISODEN' -! -!TBALLOON6%ALT = 3959. -!TBALLOON6%PRES = 62360. -! -!* time step for data storage (s) -! -TBALLOON6%STEP = 20. -! -!* ascentional vertical speed of the ballon (in calm air) (for 'RADIOS') -! -!TBALLOON6%WASCENT = 2.55 -! -!* aerodynamic drag coefficient of the balloon (for 'CVBALL') -!* induced drag coefficient (i.e. air shifted by the balloon) (for 'CVBALL') -!* volume of the balloon (m3) (for 'CVBALL') -!* mass of the balloon (kg) (for 'CVBALL') -! -TBALLOON6%AERODRAG = 0.44 -TBALLOON6%INDDRAG = 0.014 -TBALLOON6%VOLUME = 3.040 -TBALLOON6%MASS = 2.4516 -TBALLOON6%DIAMETER = ((3.*TBALLOON6%VOLUME)/(4.*XPI))**(1./3.) -! -!---------------------------------------------------------------------------- -! -!* 7. Balloon number 7 -! ---------------- -! -!* model number -! -TBALLOON7%NMODEL = 0 -TBALLOON7%MODEL = 'FIX' -! -!* balloon type -! -TBALLOON7%TYPE = 'CVBALL' -! -!* balloon name -! -TBALLOON7%TITLE = 'CVB1PISO' -! -!* launching date and time -! -TBALLOON7%LAUNCH%nyear = 1999 -TBALLOON7%LAUNCH%nmonth = 09 -TBALLOON7%LAUNCH%nday = 19 -TBALLOON7%LAUNCH%xtime = 32460. -! -!* latitude and longitude of launching site (decimal degree) -! -TBALLOON7%LAT = 45.922 -TBALLOON7%LON = 8.646 -! -!* altitude of the launching site for 'RADIOS' -!* altitude or pressure of the flight level for 'ISODEN' -! -!TBALLOON7%ALT = 3959. -TBALLOON7%PRES = 62360. -! -!* time step for data storage (s) -! -TBALLOON7%STEP = 20. -! -!* ascentional vertical speed of the ballon (in calm air) (for 'RADIOS') -! -!TBALLOON7%WASCENT = 2.55 -! -!* aerodynamic drag coefficient of the balloon (for 'CVBALL') -!* induced drag coefficient (i.e. air shifted by the balloon) (for 'CVBALL') -!* volume of the balloon (m3) (for 'CVBALL') -!* mass of the balloon (kg) (for 'CVBALL') -! -TBALLOON7%AERODRAG = 0.44 -TBALLOON7%INDDRAG = 0.014 -TBALLOON7%VOLUME = 3.040 -TBALLOON7%MASS = 2.4516 -TBALLOON7%DIAMETER = ((3.*TBALLOON7%VOLUME)/(4.*XPI))**(1./3.) -! + +INTEGER :: JI +TYPE(TBALLOONDATA), POINTER :: TZBALLOON + +!Treat balloon data read in namelist +DO JI = 1, NBALLOONS + ALLOCATE( TBALLOONS(JI)%TBALLOON ) + TZBALLOON => TBALLOONS(JI)%TBALLOON + + TZBALLOON%NID = JI + + IF ( CTITLE(JI) == '' ) THEN + WRITE( CTITLE(JI), FMT = '( A, I3.3) ') TRIM( CTYPE(JI) ), JI + + WRITE( CMNHMSG(1), FMT = '( A, I4 )' ) 'no title given to balloon number ', JI + CMNHMSG(2) = 'title set to ' // TRIM( CTITLE(JI) ) + CALL PRINT_MSG( NVERB_INFO, 'GEN', 'INI_BALLOON', OLOCAL = .TRUE. ) + END IF + TZBALLOON%CTITLE = CTITLE(JI) + + IF ( CMODEL(JI) == 'FIX' ) THEN + IF ( NMODEL(JI) < 1 .OR. NMODEL(JI) > NMODEL_NEST ) THEN + CMNHMSG(1) = 'invalid NMODEL balloon ' // TRIM( CTITLE(JI) ) + CMNHMSG(2) = 'NMODEL must be between 1 and the last nested model number' + CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'INI_BALLOON', OLOCAL = .TRUE. ) + NMODEL(JI) = 1 + END IF + ELSE IF ( CMODEL(JI) == 'MOB' ) THEN + IF ( NMODEL(JI) /= 0 .AND. NMODEL(JI) /= 1 ) THEN + CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'INI_BALLOON', & + 'NMODEL is set to 1 at start for a CMODEL="MOB" balloon (balloon ' // TRIM( CTITLE(JI) ) // ')', & + OLOCAL = .TRUE.) + END IF + IF ( NMODEL_NEST == 1 ) CMODEL(JI) = 'FIX' ! If only one model, FIX and MOB are the same + ! NMODEL set temporarily to 1. Will be set to the launch model in INI_LAUNCH + NMODEL(JI) = 1 + ELSE + CMNHMSG(1) = 'invalid CMODEL (' // TRIM( CMODEL(JI) ) // ') for balloon ' // TRIM( CTITLE(JI) ) + CMNHMSG(2) = 'CMODEL must be FIX or MOB (default="FIX")' + CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'INI_BALLOON', OLOCAL = .TRUE. ) + CMODEL(JI) = 'FIX' + NMODEL(JI) = 1 + END IF + TZBALLOON%CMODEL = CMODEL(JI) + TZBALLOON%NMODEL = NMODEL(JI) + + TZBALLOON%CTYPE = CTYPE(JI) + + IF ( .NOT. TLAUNCH(JI)%CHECK( TRIM( CTITLE(JI) ) ) ) & + CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'INI_BALLOON', & + 'problem with TLAUNCH (not set or incorrect values) for balloon ' // TRIM( CTITLE(JI) ), OLOCAL = .TRUE. ) + TZBALLOON%TLAUNCH = TLAUNCH(JI) + + IF ( XLATLAUNCH(JI) == XUNDEF ) & + CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'INI_BALLOON', 'XLATLAUNCH not provided for balloon ' // TRIM( CTITLE(JI) ), & + OLOCAL = .TRUE. ) + TZBALLOON%XLATLAUNCH = XLATLAUNCH(JI) + + IF ( XLONLAUNCH(JI) == XUNDEF ) & + CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'INI_BALLOON', 'XLONLAUNCH not provided for balloon ' // TRIM( CTITLE(JI) ), & + OLOCAL = .TRUE. ) + TZBALLOON%XLONLAUNCH = XLONLAUNCH(JI) + + IF ( XTSTEP(JI) == XNEGUNDEF ) THEN + CALL PRINT_MSG( NVERB_INFO, 'GEN', 'INI_BALLOON', & + 'data storage frequency not provided for balloon ' // TRIM( CTITLE(JI) ) // ' => set to 60s', OLOCAL = .TRUE. ) + XTSTEP(JI) = 60. + ELSE IF ( XTSTEP(JI) <=0. ) THEN + CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'INI_BALLOON', 'invalid data storage frequency for balloon ' // TRIM( CTITLE(JI) ), & + OLOCAL = .TRUE. ) + XTSTEP(JI) = 60. + END IF + TZBALLOON%TFLYER_TIME%XTSTEP = XTSTEP(JI) + + SELECT CASE ( CTYPE(JI) ) + CASE ( 'CVBALL' ) + IF ( XALTLAUNCH(JI) == XNEGUNDEF .AND. XPRES(JI) == XNEGUNDEF ) THEN + CMNHMSG(1) = 'altitude or pressure at launch not provided for CVBALL balloon ' // TRIM( CTITLE(JI) ) + CMNHMSG(2) = 'altitude with same air density than balloon will be used for the launch position' + CALL PRINT_MSG( NVERB_INFO, 'GEN', 'INI_BALLOON' , OLOCAL = .TRUE.) + END IF + IF ( XALTLAUNCH(JI) /= XNEGUNDEF .AND. XPRES(JI) /= XNEGUNDEF ) & + CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'INI_BALLOON', & + 'altitude or pressure at launch (not both) must be provided for ISODEN balloon ' // TRIM( CTITLE(JI) ), & + OLOCAL = .TRUE. ) + TZBALLOON%XALTLAUNCH = XALTLAUNCH(JI) + TZBALLOON%XPRES = XPRES(JI) + + IF ( XWASCENT(JI) == XNEGUNDEF ) THEN + CALL PRINT_MSG( NVERB_INFO, 'GEN', 'INI_BALLOON', & + 'initial vertical speed not provided for CVBALL balloon ' // TRIM( CTITLE(JI) ) // ' => set to 0.' , & + OLOCAL = .TRUE.) + XWASCENT(JI) = 0. + END IF + TZBALLOON%XWASCENT = XWASCENT(JI) + + + IF ( XAERODRAG(JI) == XNEGUNDEF ) THEN + CALL PRINT_MSG( NVERB_INFO, 'GEN', 'INI_BALLOON', & + 'aerodynamic drag coefficient not provided for CVBALL balloon ' // TRIM( CTITLE(JI) ) & + // ' => set to 0.44', OLOCAL = .TRUE.) + XAERODRAG(JI) = 0.44 + END IF + TZBALLOON%XAERODRAG = XAERODRAG(JI) + + IF ( XINDDRAG(JI) == XNEGUNDEF ) THEN + CALL PRINT_MSG( NVERB_INFO, 'GEN', 'INI_BALLOON', & + 'induced drag coefficient not provided for CVBALL balloon ' // TRIM( CTITLE(JI) ) // ' => set to 0.014', & + OLOCAL = .TRUE.) + XINDDRAG(JI) = 0.014 + END IF + TZBALLOON%XINDDRAG = XINDDRAG(JI) + + IF ( XMASS(JI) == XNEGUNDEF ) & + CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_BALLOON', 'mass not provided for CVBALL balloon ' // TRIM( CTITLE(JI) ), & + OLOCAL = .TRUE. ) + TZBALLOON%XMASS = XMASS(JI) + + IF ( XDIAMETER(JI) <= 0. .AND. XVOLUME(JI) <= 0. ) & + CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_BALLOON', & + 'diameter or volume not provided for CVBALL balloon ' // TRIM( CTITLE(JI) ), OLOCAL = .TRUE. ) + + IF ( XDIAMETER(JI) <= 0. ) THEN + TZBALLOON%XVOLUME = XVOLUME(JI) + TZBALLOON%XDIAMETER = ( (3. * XVOLUME(JI) ) / ( 4. * XPI ) ) ** ( 1. / 3. ) + ELSE IF ( XVOLUME(JI) <= 0 ) THEN + TZBALLOON%XDIAMETER = XDIAMETER(JI) + TZBALLOON%XVOLUME = XPI / 6 * XDIAMETER(JI)**3 + ELSE + CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'INI_BALLOON', & + 'diameter or volume (not both) must be provided for CVBALL balloon ' // TRIM( CTITLE(JI) ), & + OLOCAL = .TRUE. ) + END IF + + + CASE ( 'ISODEN' ) + IF ( XALTLAUNCH(JI) == XNEGUNDEF .AND. XPRES(JI) == XNEGUNDEF ) & + CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_BALLOON', & + 'altitude or pressure at launch must be provided for ISODEN balloon ' // TRIM( CTITLE(JI) ), & + OLOCAL = .TRUE. ) + IF ( XALTLAUNCH(JI) /= XNEGUNDEF .AND. XPRES(JI) /= XNEGUNDEF ) & + CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'INI_BALLOON', & + 'altitude or pressure at launch (not both) must be provided for ISODEN balloon ' // TRIM( CTITLE(JI) ), & + OLOCAL = .TRUE.) + TZBALLOON%XALTLAUNCH = XALTLAUNCH(JI) + TZBALLOON%XPRES = XPRES(JI) + + IF ( XWASCENT(JI) /= XNEGUNDEF ) THEN + CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'INI_BALLOON', & + 'initial vertical speed is not needed for ISODEN balloon ' // TRIM( CTITLE(JI) ) // ' => ignored', & + OLOCAL = .TRUE. ) + XWASCENT(JI) = XNEGUNDEF + END IF + TZBALLOON%XWASCENT = XWASCENT(JI) + + + IF ( XAERODRAG(JI) /= XNEGUNDEF ) THEN + CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'INI_BALLOON', & + 'aerodynamic drag coefficient is not needed for ISODEN balloon ' // TRIM( CTITLE(JI) ) // ' => ignored', & + OLOCAL = .TRUE. ) + XAERODRAG(JI) = XNEGUNDEF + END IF + TZBALLOON%XAERODRAG = XAERODRAG(JI) + + IF ( XINDDRAG(JI) /= XNEGUNDEF ) THEN + CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'INI_BALLOON', & + 'induced drag coefficient is not needed for ISODEN balloon ' // TRIM( CTITLE(JI) ) // ' => ignored' , & + OLOCAL = .TRUE.) + XINDDRAG(JI) = XNEGUNDEF + END IF + TZBALLOON%XINDDRAG = XINDDRAG(JI) + + IF ( XMASS(JI) /= XNEGUNDEF ) THEN + CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'INI_BALLOON', & + 'mass is not needed for ISODEN balloon ' // TRIM( CTITLE(JI) ) // ' => ignored', OLOCAL = .TRUE. ) + XMASS(JI) = XNEGUNDEF + END IF + TZBALLOON%XMASS = XMASS(JI) + + IF ( XDIAMETER(JI) /= XNEGUNDEF ) THEN + CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'INI_BALLOON', & + 'diameter is not needed for ISODEN balloon ' // TRIM( CTITLE(JI) ) // ' => ignored', OLOCAL = .TRUE. ) + XDIAMETER(JI) = XNEGUNDEF + END IF + TZBALLOON%XDIAMETER = XDIAMETER(JI) + + IF ( XVOLUME(JI) /= XNEGUNDEF ) THEN + CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'INI_BALLOON', & + 'volume is not needed for ISODEN balloon ' // TRIM( CTITLE(JI) ) // ' => ignored', OLOCAL = .TRUE. ) + XVOLUME(JI) = XNEGUNDEF + END IF + TZBALLOON%XVOLUME = XVOLUME(JI) + + + CASE ( 'RADIOS' ) + IF ( XALTLAUNCH(JI) == XNEGUNDEF ) & + CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_BALLOON', & + 'altitude of launch must be provided for radiosounding balloon ' // TRIM( CTITLE(JI) ), OLOCAL = .TRUE. ) + TZBALLOON%XALTLAUNCH = XALTLAUNCH(JI) + + IF ( XWASCENT(JI) == XNEGUNDEF ) THEN + CALL PRINT_MSG( NVERB_INFO, 'GEN', 'INI_BALLOON', & + 'initial vertical speed not provided for balloon ' // TRIM( CTITLE(JI) ) // ' => set to 5.', & + OLOCAL = .TRUE. ) + XWASCENT(JI) = 5. + END IF + TZBALLOON%XWASCENT = XWASCENT(JI) + + IF ( XPRES(JI) /= XNEGUNDEF ) THEN + CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'INI_BALLOON', & + 'initial pressure is not needed for radiosounding balloon ' & + // TRIM( CTITLE(JI) ) // ' => ignored', OLOCAL = .TRUE. ) + XPRES(JI) = XNEGUNDEF + END IF + TZBALLOON%XAERODRAG = XAERODRAG(JI) + + IF ( XAERODRAG(JI) /= XNEGUNDEF ) THEN + CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'INI_BALLOON', & + 'aerodynamic drag coefficient is not needed for radiosounding balloon ' & + // TRIM( CTITLE(JI) ) // ' => ignored', OLOCAL = .TRUE. ) + XAERODRAG(JI) = XNEGUNDEF + END IF + TZBALLOON%XAERODRAG = XAERODRAG(JI) + + IF ( XINDDRAG(JI) /= XNEGUNDEF ) THEN + CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'INI_BALLOON', & + 'induced drag coefficient is not needed for radiosounding balloon ' & + // TRIM( CTITLE(JI) ) // ' => ignored', OLOCAL = .TRUE. ) + XINDDRAG(JI) = XNEGUNDEF + END IF + TZBALLOON%XINDDRAG = XINDDRAG(JI) + + IF ( XMASS(JI) /= XNEGUNDEF ) THEN + CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'INI_BALLOON', & + 'mass is not needed for radiosounding balloon ' // TRIM( CTITLE(JI) ) // ' => ignored', OLOCAL = .TRUE. ) + XMASS(JI) = XNEGUNDEF + END IF + TZBALLOON%XMASS = XMASS(JI) + + IF ( XDIAMETER(JI) /= XNEGUNDEF ) THEN + CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'INI_BALLOON', & + 'diameter is not needed for radiosounding balloon ' // TRIM( CTITLE(JI) ) // ' => ignored', & + OLOCAL = .TRUE. ) + XDIAMETER(JI) = XNEGUNDEF + END IF + TZBALLOON%XDIAMETER = XDIAMETER(JI) + + IF ( XVOLUME(JI) /= XNEGUNDEF ) THEN + CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'INI_BALLOON', & + 'volume is not needed for radiosounding balloon ' // TRIM( CTITLE(JI) ) // ' => ignored', OLOCAL = .TRUE. ) + XVOLUME(JI) = XNEGUNDEF + END IF + TZBALLOON%XVOLUME = XVOLUME(JI) + + + CASE DEFAULT + CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_BALLOON', 'invalid balloon type (CTYPE=' & + // TRIM( CTYPE(JI ) ) // ') for balloon ' // TRIM( CTITLE(JI) ), OLOCAL = .TRUE. ) + + END SELECT +END DO + +IF ( NBALLOONS > 0 ) CALL BALLOONS_NML_DEALLOCATE() + !---------------------------------------------------------------------------- ! END SUBROUTINE INI_BALLOON + +END MODULE MODE_INI_BALLOON diff --git a/src/MNH/ini_budget.f90 b/src/MNH/ini_budget.f90 index cb8c3f2ac8bc507d3f240492521a4f8128a122b9..5a5bdb22d11cb0768fbdcff20a15acde53194b1b 100644 --- a/src/MNH/ini_budget.f90 +++ b/src/MNH/ini_budget.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1995-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1995-2022 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. @@ -26,7 +26,7 @@ use modd_budget, only: nbudgets, tbudgets, NBUDGET_U, NBUDGET_V, NBUDGET_W, NBUDGET_TH, NBUDGET_TKE, & NBUDGET_RV, NBUDGET_RC, NBUDGET_RR, NBUDGET_RI, NBUDGET_RS, & NBUDGET_RG, NBUDGET_RH, NBUDGET_SV1 -use modd_nsv, only: csvnames, nsv +use modd_nsv, only: nsv, tsvlist integer :: ibudget integer :: jsv @@ -91,8 +91,8 @@ tbudgets(NBUDGET_RH)%nid = NBUDGET_RH do jsv = 1, nsv ibudget = NBUDGET_SV1 - 1 + jsv - tbudgets(ibudget)%cname = Trim( csvnames(jsv) ) - tbudgets(ibudget)%ccomment = 'Budget for scalar variable ' // Trim( csvnames(jsv) ) + tbudgets(ibudget)%cname = Trim( tsvlist(jsv)%cmnhname ) + tbudgets(ibudget)%ccomment = 'Budget for scalar variable ' // Trim( tsvlist(jsv)%cmnhname ) tbudgets(ibudget)%nid = ibudget end do @@ -229,8 +229,7 @@ use modd_dyn_n, only: xtstep, locean use modd_elec_descr, only: linductive, lrelax2fw_ion use modd_field, only: TYPEREAL use modd_fire, only: lblaze -use modd_nsv, only: csvnames, & - nsv_aerbeg, nsv_aerend, nsv_aerdepbeg, nsv_aerdepend, nsv_c2r2beg, nsv_c2r2end, & +use modd_nsv, only: nsv_aerbeg, nsv_aerend, nsv_aerdepbeg, nsv_aerdepend, nsv_c2r2beg, nsv_c2r2end, & nsv_chembeg, nsv_chemend, nsv_chicbeg, nsv_chicend, nsv_csbeg, nsv_csend, & nsv_dstbeg, nsv_dstend, nsv_dstdepbeg, nsv_dstdepend, nsv_elecbeg, nsv_elecend, & #ifdef MNH_FOREFIRE @@ -239,21 +238,21 @@ use modd_nsv, only: csvnames, nsv_lgbeg, nsv_lgend, & nsv_lima_beg, nsv_lima_end, nsv_lima_ccn_acti, nsv_lima_ccn_free, nsv_lima_hom_haze, & nsv_lima_ifn_free, nsv_lima_ifn_nucl, nsv_lima_imm_nucl, & - nsv_lima_nc, nsv_lima_nr, nsv_lima_ni, nsv_lima_scavmass, nsv_lima_spro, & - nsv_lima_ns, nsv_lima_ng, nsv_lima_nh, & + nsv_lima_nc, nsv_lima_nr, nsv_lima_ni, nsv_lima_ns, nsv_lima_ng, nsv_lima_nh, & + nsv_lima_scavmass, nsv_lima_spro, & nsv_lnoxbeg, nsv_lnoxend, nsv_ppbeg, nsv_ppend, & nsv_sltbeg, nsv_sltend, nsv_sltdepbeg, nsv_sltdepend, nsv_snwbeg, nsv_snwend, & - nsv_user + nsv_user, tsvlist use modd_parameters, only: jphext use modd_param_c2r2, only: ldepoc_c2r2 => ldepoc, lrain_c2r2 => lrain, lsedc_c2r2 => lsedc, lsupsat_c2r2 => lsupsat use modd_param_ice, only: ladj_after, ladj_before, ldeposc_ice => ldeposc, lred, lsedic_ice => lsedic, lwarm_ice => lwarm use modd_param_n, only: cactccn, celec -use modd_param_lima, only: laero_mass_lima => laero_mass, lacti_lima => lacti, lcold_lima => lcold, ldepoc_lima => ldepoc, & - lhail_lima => lhail, lhhoni_lima => lhhoni, lmeyers_lima => lmeyers, lnucl_lima => lnucl, & - lptsplit, & - lrain_lima => lrain, lscav_lima => lscav, lsedc_lima => lsedc, lsedi_lima => lsedi, & - lsnow_lima => lsnow, lspro_lima => lspro, lwarm_lima => lwarm, lcibu, lrdsf, & - nmom_c, nmom_r, nmom_i, nmom_s, nmom_g, nmom_h, nmod_ccn, nmod_ifn, nmod_imm +use modd_param_lima, only: laero_mass_lima => laero_mass, lacti_lima => lacti, lcibu, lcold_lima => lcold, & + ldepoc_lima => ldepoc, lhail_lima => lhail, lhhoni_lima => lhhoni, lmeyers_lima => lmeyers, & + lnucl_lima => lnucl, lptsplit, & + lrain_lima => lrain, lrdsf, lscav_lima => lscav, lsedc_lima => lsedc, lsedi_lima => lsedi, & + lsnow_lima => lsnow, lspro_lima => lspro, lwarm_lima => lwarm, & + nmod_ccn, nmod_ifn, nmod_imm, nmom_i use modd_ref, only: lcouples use modd_salt, only: lsalt use modd_turb_n, only: lsubg_cond @@ -528,6 +527,7 @@ if ( lbu_rth .or. lbu_rtke .or. lbu_rrv .or. lbu_rrc .or. lbu_rrr .or. & tburhodj%xdata(:, :, :) = 0. end if + tzsource%ntype = TYPEREAL tzsource%ndims = 3 @@ -1030,6 +1030,12 @@ if ( lbu_rth ) then tzsource%cmnhname = 'DCONV' tzsource%clongname = 'KAFR convection' tzsource%lavailable = hdconv == 'KAFR' .OR. hsconv == 'KAFR' + + call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) + + tzsource%cmnhname = 'BLAZE' + tzsource%clongname = 'blaze fire model contribution' + tzsource%lavailable = lblaze call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) tzsource%cmnhname = 'VTURB' @@ -1115,7 +1121,7 @@ if ( lbu_rth ) then tzsource%cmnhname = 'HIN' tzsource%clongname = 'heterogeneous ice nucleation' - tzsource%lavailable = hcloud(1:3) == 'ICE' .or. (hcloud == 'LIMA' .and. nmom_i == 1) + tzsource%lavailable = hcloud(1:3) == 'ICE' .or. ( hcloud == 'LIMA' .and. nmom_i == 1 ) call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) tzsource%cmnhname = 'HIND' @@ -1271,11 +1277,6 @@ if ( lbu_rth ) then .and. celec == 'NONE' call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - tzsource%cmnhname = 'BLAZE' - tzsource%clongname = 'blaze fire model contribution' - tzsource%lavailable = lblaze - call Budget_source_add( tbudgets(NBUDGET_TH), tzsource ) - call Sourcelist_sort_compact( tbudgets(NBUDGET_TH) ) @@ -1462,6 +1463,11 @@ if ( tbudgets(NBUDGET_RV)%lenabled ) then tzsource%lavailable = hdconv == 'KAFR' .OR. hsconv == 'KAFR' call Budget_source_add( tbudgets(NBUDGET_RV), tzsource ) + tzsource%cmnhname = 'BLAZE' + tzsource%clongname = 'blaze fire model contribution' + tzsource%lavailable = lblaze + call Budget_source_add( tbudgets(NBUDGET_RV), tzsource ) + tzsource%cmnhname = 'VTURB' tzsource%clongname = 'vertical turbulent diffusion' tzsource%lavailable = hturb == 'TKEL' @@ -1599,10 +1605,6 @@ if ( tbudgets(NBUDGET_RV)%lenabled ) then .and. celec == 'NONE' call Budget_source_add( tbudgets(NBUDGET_RV), tzsource ) - tzsource%cmnhname = 'BLAZE' - tzsource%clongname = 'blaze fire model contribution' - tzsource%lavailable = lblaze - call Budget_source_add( tbudgets(NBUDGET_RV), tzsource ) call Sourcelist_sort_compact( tbudgets(NBUDGET_RV) ) @@ -2896,8 +2898,8 @@ if ( tbudgets(NBUDGET_RH)%lenabled ) then tzsource%cmnhname = 'COHG' tzsource%clongname = 'conversion from hail to graupel' - tzsource%lavailable = hcloud == 'LIMA' .and. ( lptsplit .or. (lhail_lima .and. lcold_lima & - .and. lwarm_lima .and. lsnow_lima) ) + tzsource%lavailable = hcloud == 'LIMA' .and. ( lptsplit .or. ( lhail_lima .and. lcold_lima & + .and. lwarm_lima .and. lsnow_lima ) ) call Budget_source_add( tbudgets(NBUDGET_RH), tzsource ) tzsource%cmnhname = 'HGCV' @@ -2955,7 +2957,7 @@ SV_BUDGETS: do jsv = 1, ksv tbudgets(ibudget)%tsources(:)%ngroup = 0 - tzsource%ccomment = 'Budget of scalar variable ' // csvnames(jsv) + tzsource%ccomment = 'Budget of scalar variable ' // tsvlist(jsv)%cmnhname tzsource%ngrid = 1 tzsource%cunits = '1' @@ -4336,7 +4338,7 @@ end subroutine Budget_source_add subroutine Ini_budget_groups( tpbudgets, kbudim1, kbudim2, kbudim3 ) use modd_budget, only: tbudgetdata use modd_field, only: TYPEINT, TYPEREAL - use modd_parameters, only: NMNHNAMELGTMAX, NSTDNAMELGTMAX + use modd_parameters, only: NMNHNAMELGTMAX, NSTDNAMELGTMAX, NLONGNAMELGTMAX, NUNITLGTMAX, NCOMMENTLGTMAX use mode_tools, only: Quicksort @@ -4347,9 +4349,9 @@ subroutine Ini_budget_groups( tpbudgets, kbudim1, kbudim2, kbudim3 ) character(len=NMNHNAMELGTMAX) :: ymnhname character(len=NSTDNAMELGTMAX) :: ystdname - character(len=32) :: ylongname - character(len=40) :: yunits - character(len=100) :: ycomment + character(len=NLONGNAMELGTMAX) :: ylongname + character(len=NUNITLGTMAX) :: yunits + character(len=NCOMMENTLGTMAX) :: ycomment integer :: ji, jj, jk integer :: isources ! Number of source terms in a budget integer :: inbgroups ! Number of budget groups diff --git a/src/MNH/ini_deep_convection.f90 b/src/MNH/ini_deep_convection.f90 index f4747410b9019c4081bb7335cd217cd6b0fb68ea..187d2e82048740e383f3d188647a576010565b25 100644 --- a/src/MNH/ini_deep_convection.f90 +++ b/src/MNH/ini_deep_convection.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1996-2020 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1996-2022 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. @@ -109,33 +109,23 @@ END MODULE MODI_INI_DEEP_CONVECTION !! for a correct restart this variable has to be writen in FM file !! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O ! P. Wautelet 14/02/2019: remove CLUOUT/CLUOUT0 and associated variables -! P. Wautelet 14/02/2019: move UPCASE function to tools.f90 +! P. Wautelet 04/02/2022: use TSVLIST to manage metadata of scalar variables !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ ! -USE MODD_CH_AEROSOL, ONLY: CAERONAMES -USE MODD_CH_M9_n, ONLY: CNAMES -USE MODD_CONVPAR -USE MODD_DUST, ONLY: CDUSTNAMES -USE MODD_ELEC_DESCR, ONLY: CELECNAMES -use modd_field, only: tfielddata, tfieldlist, TYPEREAL -USE MODD_ICE_C1R3_DESCR, ONLY: C1R3NAMES +use modd_field, only: tfieldmetadata, tfieldlist, TYPEREAL USE MODD_IO, ONLY: TFILEDATA -USE MODD_LG, ONLY: CLGNAMES -USE MODD_NSV, ONLY: NSV, NSV_USER, NSV_CHEMBEG, NSV_CHEMEND, NSV_C2R2BEG, NSV_C2R2END, & - NSV_LGBEG, NSV_LGEND, NSV_LNOXBEG, NSV_LNOXEND, & - NSV_DSTBEG, NSV_DSTEND, NSV_AERBEG, NSV_AEREND, & - NSV_SLTBEG, NSV_SLTEND, NSV_PPBEG, NSV_PPEND, & - NSV_C1R3BEG, NSV_C1R3END, NSV_ELECBEG, NSV_ELECEND -USE MODD_RAIN_C2R2_DESCR, ONLY: C2R2NAMES -USE MODD_SALT, ONLY: CSALTNAMES +USE MODD_NSV, ONLY: NSV, NSV_USER, TSVLIST, & + NSV_AERDEPBEG, NSV_CHICBEG, NSV_CSBEG, NSV_DSTDEPBEG, & + NSV_LIMA_BEG, NSV_PPBEG, NSV_SLTDEPBEG, NSV_SNWBEG, & + NSV_AERDEPEND, NSV_CHICEND, NSV_CSEND, NSV_DSTDEPEND, & + NSV_LIMA_END, NSV_PPEND, NSV_SLTDEPEND, NSV_SNWEND USE MODD_TIME ! use mode_field, only: Find_field_id_from_mnhname USE MODE_IO_FIELD_READ, only: IO_Field_read -USE MODE_TOOLS, ONLY: UPCASE ! IMPLICIT NONE ! @@ -180,10 +170,12 @@ REAL, DIMENSION(:,:), INTENT(INOUT) :: PCG_TOTAL_NUMBER ! Total number of CG !* 0.2 declarations of local variables ! ! -INTEGER :: IID -INTEGER :: IRESP -INTEGER :: JSV ! number of tracers -TYPE(TFIELDDATA) :: TZFIELD +INTEGER :: IID +INTEGER :: IRESP +INTEGER :: JSV ! number of tracers +LOGICAL :: GOLDFILEFORMAT +LOGICAL :: GREAD +TYPE(TFIELDMETADATA) :: TZFIELD ! !------------------------------------------------------------------------------- ! @@ -196,6 +188,10 @@ TYPE(TFIELDDATA) :: TZFIELD !* 2. INITIALIZE CONVECTIVE TENDENCIES ! -------------------------------- ! +!If TPINIFILE file was written with a MesoNH version < 5.6, some variables had different names or were not available +GOLDFILEFORMAT = ( TPINIFILE%NMNHVERSION(1) < 5 & + .OR. ( TPINIFILE%NMNHVERSION(1) == 5 .AND. TPINIFILE%NMNHVERSION(2) < 6 ) ) + PUMFCONV(:,:,:) = 0.0 PDMFCONV(:,:,:) = 0.0 PMFCONV(:,:,:) = 0.0 ! warning, restart may be incorrect @@ -233,19 +229,19 @@ ELSE CALL IO_Field_read(TPINIFILE,'DRICONV', PDRICONV) ! CALL FIND_FIELD_ID_FROM_MNHNAME('PRCONV',IID,IRESP) - TZFIELD = TFIELDLIST(IID) + TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) TZFIELD%CUNITS = 'mm hour-1' CALL IO_Field_read(TPINIFILE,TZFIELD,PPRCONV) PPRCONV=PPRCONV/(1000.*3600.) ! conversion into m/s units ! CALL FIND_FIELD_ID_FROM_MNHNAME('PRSCONV',IID,IRESP) - TZFIELD = TFIELDLIST(IID) + TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) TZFIELD%CUNITS = 'mm hour-1' CALL IO_Field_read(TPINIFILE,TZFIELD,PPRSCONV) PPRSCONV=PPRSCONV/(1000.*3600.) ! conversion into m/s units ! CALL FIND_FIELD_ID_FROM_MNHNAME('PACCONV',IID,IRESP) - TZFIELD = TFIELDLIST(IID) + TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) TZFIELD%CUNITS = 'mm' CALL IO_Field_read(TPINIFILE,TZFIELD,PPACCONV) PPACCONV=PPACCONV/1000. ! conversion into m unit @@ -258,83 +254,50 @@ ELSE END IF ! ! - SELECT CASE(HGETSVCONV) - CASE('READ') - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 's-1' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + GETSVCONV: SELECT CASE(HGETSVCONV) + CASE('READ') GETSVCONV + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'generic for ini_deep_convection', & !Temporary name to ease identification + CUNITS = 's-1', & + CDIR = 'XY', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ! - DO JSV = 1, NSV_USER - WRITE(TZFIELD%CMNHNAME,'(A7,I3.3)')'DSVCONV',JSV - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A7,I3.3)')'X_Y_Z_','DSVCONV',JSV - CALL IO_Field_read(TPINIFILE,TZFIELD,PDSVCONV(:,:,:,JSV)) + DO JSV = 1, NSV + GREAD = .TRUE. + + IF ( GOLDFILEFORMAT ) THEN + IF ( ( JSV >= 1 .AND. JSV <= NSV_USER ) .OR. & + ( JSV >= NSV_PPBEG .AND. JSV <= NSV_PPEND ) ) THEN + WRITE( TZFIELD%CMNHNAME, '( A7, I3.3 )' ) 'DSVCONV', JSV + TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) + ELSE IF ( ( JSV >= NSV_LIMA_BEG .AND. JSV <= NSV_LIMA_END ) .OR. & + ( JSV >= NSV_CSBEG .AND. JSV <= NSV_CSEND ) .OR. & + ( JSV >= NSV_CHICBEG .AND. JSV <= NSV_CHICEND ) .OR. & + ( JSV >= NSV_AERDEPBEG .AND. JSV <= NSV_AERDEPEND ) .OR. & + ( JSV >= NSV_DSTDEPBEG .AND. JSV <= NSV_DSTDEPEND ) .OR. & + ( JSV >= NSV_SLTDEPBEG .AND. JSV <= NSV_SLTDEPEND ) .OR. & + ( JSV >= NSV_SNWBEG .AND. JSV <= NSV_SNWEND ) ) THEN + PDSVCONV(:,:,:,JSV) = 0.0 + GREAD = .FALSE. !This variable was not written in pre-5.6 files + ELSE + TZFIELD%CMNHNAME = 'DSVCONV_' // TRIM( TSVLIST(JSV)%CMNHNAME ) + TZFIELD%CLONGNAME = 'DSVCONV_' // TRIM( TSVLIST(JSV)%CLONGNAME ) + END IF + ELSE + TZFIELD%CMNHNAME = 'DSVCONV_' // TRIM( TSVLIST(JSV)%CMNHNAME ) + TZFIELD%CLONGNAME = 'DSVCONV_' // TRIM( TSVLIST(JSV)%CLONGNAME ) + END IF + WRITE( TZFIELD%CCOMMENT, '( A, I3.3 )' )'X_Y_Z_DSVCONV', JSV + IF ( GREAD ) CALL IO_Field_read( TPINIFILE, TZFIELD, PDSVCONV(:,:,:,JSV) ) END DO - DO JSV = NSV_C2R2BEG, NSV_C2R2END - TZFIELD%CMNHNAME = 'DSVCONV_'//TRIM(C2R2NAMES(JSV-NSV_C2R2BEG+1)) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A7,I3.3)')'X_Y_Z_','DSVCONV',JSV - CALL IO_Field_read(TPINIFILE,TZFIELD,PDSVCONV(:,:,:,JSV)) - END DO - DO JSV = NSV_C1R3BEG, NSV_C1R3END - TZFIELD%CMNHNAME = 'DSVCONV_'//TRIM(C1R3NAMES(JSV-NSV_C1R3BEG+1)) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A7,I3.3)')'X_Y_Z_','DSVCONV',JSV - CALL IO_Field_read(TPINIFILE,TZFIELD,PDSVCONV(:,:,:,JSV)) - END DO - DO JSV = NSV_ELECBEG, NSV_ELECEND - TZFIELD%CMNHNAME = 'DSVCONV_'//TRIM(CELECNAMES(JSV-NSV_ELECBEG+1)) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A7,I3.3)')'X_Y_Z_','DSVCONV',JSV - CALL IO_Field_read(TPINIFILE,TZFIELD,PDSVCONV(:,:,:,JSV)) - END DO - DO JSV = NSV_CHEMBEG, NSV_CHEMEND - TZFIELD%CMNHNAME = 'DSVCONV_'//TRIM(UPCASE(CNAMES(JSV-NSV_CHEMBEG+1))) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A7,I3.3)')'X_Y_Z_','DSVCONV',JSV - CALL IO_Field_read(TPINIFILE,TZFIELD,PDSVCONV(:,:,:,JSV)) - END DO - DO JSV = NSV_AERBEG, NSV_AEREND - TZFIELD%CMNHNAME = 'DSVCONV_'//TRIM(UPCASE(CAERONAMES(JSV-NSV_AERBEG+1))) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A7,I3.3)')'X_Y_Z_','DSVCONV',JSV - CALL IO_Field_read(TPINIFILE,TZFIELD,PDSVCONV(:,:,:,JSV)) - END DO - DO JSV = NSV_LNOXBEG,NSV_LNOXEND - TZFIELD%CMNHNAME = 'DSVCONV_LINOX' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A7,I3.3)')'X_Y_Z_','DSVCONV',JSV - CALL IO_Field_read(TPINIFILE,TZFIELD,PDSVCONV(:,:,:,JSV)) - END DO - DO JSV = NSV_DSTBEG, NSV_DSTEND - TZFIELD%CMNHNAME = 'DSVCONV_'//TRIM(UPCASE(CDUSTNAMES(JSV-NSV_DSTBEG+1))) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A7,I3.3)')'X_Y_Z_','DSVCONV',JSV - CALL IO_Field_read(TPINIFILE,TZFIELD,PDSVCONV(:,:,:,JSV)) - END DO - DO JSV = NSV_SLTBEG, NSV_SLTEND - TZFIELD%CMNHNAME = 'DSVCONV_'//TRIM(UPCASE(CSALTNAMES(JSV-NSV_SLTBEG+1))) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A7,I3.3)')'X_Y_Z_','DSVCONV',JSV - CALL IO_Field_read(TPINIFILE,TZFIELD,PDSVCONV(:,:,:,JSV)) - END DO - DO JSV = NSV_LGBEG, NSV_LGEND - TZFIELD%CMNHNAME = 'DSVCONV_'//TRIM(CLGNAMES(JSV-NSV_LGBEG+1)) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A7,I3.3)')'X_Y_Z_','DSVCONV',JSV - CALL IO_Field_read(TPINIFILE,TZFIELD,PDSVCONV(:,:,:,JSV)) - END DO - DO JSV = NSV_PPBEG, NSV_PPEND - WRITE(TZFIELD%CMNHNAME,'(A7,I3.3)')'DSVCONV',JSV - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A7,I3.3)')'X_Y_Z_','DSVCONV',JSV - CALL IO_Field_read(TPINIFILE,TZFIELD,PDSVCONV(:,:,:,JSV)) - END DO - END SELECT + + CASE('INIT') GETSVCONV + PDSVCONV(:,:,:,:) = 0.0 + + END SELECT GETSVCONV ! ! END IF diff --git a/src/MNH/ini_diag_in_run.f90 b/src/MNH/ini_diag_in_run.f90 index d44800cdcd9db3fe83ddd67555e70ae68b186440..6f39e805a357747f41972243e967fbdbd58700e1 100644 --- a/src/MNH/ini_diag_in_run.f90 +++ b/src/MNH/ini_diag_in_run.f90 @@ -1,13 +1,8 @@ -!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2003-2022 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 version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. !----------------------------------------------------------------- -!--------------- special set of characters for RCS information -!----------------------------------------------------------------- -! $Source$ $Revision$ -! MASDEV4_7 profiler 2006/10/24 10:07:46 -!----------------------------------------------------------------- ! ######################### MODULE MODI_INI_DIAG_IN_RUN ! ######################### @@ -61,18 +56,19 @@ END MODULE MODI_INI_DIAG_IN_RUN !! !! MODIFICATIONS !! ------------- -!! Original 11/2003 -!! 02/2018 Q.Libois ECRAD -!! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes -!! -!! -------------------------------------------------------------------------- -! +! Original 11/2003 +! Q. Libois 02/2018: ECRAD +! S. Bielli 02/2019: sea salt: significant sea wave height influences salt emission; 5 salt modes +! P. Wautelet 30/09/2022: bugfix: use XUNDEF from SURFEX for surface variables computed by SURFEX +! -------------------------------------------------------------------------- +! !* 0. DECLARATIONS ! ------------ ! USE MODD_CONF, ONLY : CPROGRAM -USE MODD_PARAMETERS, ONLY : XUNDEF USE MODD_DIAG_IN_RUN +USE MODD_PARAMETERS, ONLY : XUNDEF +USE MODD_SURF_PAR, ONLY: XUNDEF_SFX => XUNDEF ! IMPLICIT NONE ! @@ -118,27 +114,27 @@ IF (LDIAG_IN_RUN) THEN ALLOCATE(XCURRENT_ZWS(KIU,KJU)) ! Significant height of waves ! ! - XCURRENT_RN = XUNDEF - XCURRENT_H = XUNDEF - XCURRENT_LE = XUNDEF - XCURRENT_LEI = XUNDEF - XCURRENT_GFLUX = XUNDEF + XCURRENT_RN = XUNDEF_SFX + XCURRENT_H = XUNDEF_SFX + XCURRENT_LE = XUNDEF_SFX + XCURRENT_LEI = XUNDEF_SFX + XCURRENT_GFLUX = XUNDEF_SFX XCURRENT_LWD = XUNDEF XCURRENT_LWU = XUNDEF XCURRENT_SWD = XUNDEF XCURRENT_SWU = XUNDEF XCURRENT_SWDIR = XUNDEF XCURRENT_SWDIFF= XUNDEF - XCURRENT_T2M = XUNDEF - XCURRENT_Q2M = XUNDEF - XCURRENT_HU2M = XUNDEF - XCURRENT_ZON10M= XUNDEF - XCURRENT_MER10M= XUNDEF + XCURRENT_T2M = XUNDEF_SFX + XCURRENT_Q2M = XUNDEF_SFX + XCURRENT_HU2M = XUNDEF_SFX + XCURRENT_ZON10M= XUNDEF_SFX + XCURRENT_MER10M= XUNDEF_SFX XCURRENT_DSTAOD= XUNDEF - XCURRENT_SFCO2 = XUNDEF + XCURRENT_SFCO2 = XUNDEF_SFX XCURRENT_TKE_DISS = XUNDEF XCURRENT_SLTAOD= XUNDEF - XCURRENT_ZWS = XUNDEF + XCURRENT_ZWS = XUNDEF_SFX ELSE ALLOCATE(XCURRENT_RN (0,0))! net radiation ALLOCATE(XCURRENT_H (0,0))! sensible heat flux diff --git a/src/MNH/ini_dynamics.f90 b/src/MNH/ini_dynamics.f90 index e4d00f5bb6aa29d04e9ce3cdb3cf10e0ae4187cb..add1cc9e389d189ec736e64cc2c1c4f87e6d4758 100644 --- a/src/MNH/ini_dynamics.f90 +++ b/src/MNH/ini_dynamics.f90 @@ -1,6 +1,6 @@ -!MNH_LIC Copyright 1994-2018 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1994-2022 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 version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. !----------------------------------------------------------------- ! ######################## @@ -8,7 +8,7 @@ ! ######################## INTERFACE SUBROUTINE INI_DYNAMICS(PLON,PLAT,PRHODJ,PTHVREF,PMAP,PZZ, & - PDXHAT,PDYHAT,PZHAT,HLBCX,HLBCY,PTSTEP, & + PDXHAT,PDYHAT,PZHAT,PZHATM,HLBCX,HLBCY,PTSTEP, & OVE_RELAX,OVE_RELAX_GRD,OHORELAX_UVWTH,OHORELAX_RV, & OHORELAX_RC,OHORELAX_RR,OHORELAX_RI,OHORELAX_RS,OHORELAX_RG, & OHORELAX_RH,OHORELAX_TKE,OHORELAX_SV, & @@ -41,7 +41,8 @@ REAL, DIMENSION(:,:), INTENT(IN) :: PMAP ! Map factor REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! height REAL, DIMENSION(:), INTENT(IN) :: PDXHAT ! Stretching in x direction REAL, DIMENSION(:), INTENT(IN) :: PDYHAT ! Stretching in y direction -REAL, DIMENSION(:), INTENT(IN) :: PZHAT ! Gal-Chen Height +REAL, DIMENSION(:), INTENT(IN) :: PZHAT ! Gal-Chen Height +REAL, DIMENSION(:), INTENT(IN) :: PZHATM ! ... at mass points CHARACTER(LEN=4), DIMENSION(:), INTENT(IN) :: HLBCX ! x-direction LBC type CHARACTER(LEN=4), DIMENSION(:), INTENT(IN) :: HLBCY ! y-direction LBC type LOGICAL, INTENT(IN) :: OVE_RELAX ! logical @@ -179,7 +180,7 @@ END INTERFACE END MODULE MODI_INI_DYNAMICS ! ###################################################################### SUBROUTINE INI_DYNAMICS(PLON,PLAT,PRHODJ,PTHVREF,PMAP,PZZ, & - PDXHAT,PDYHAT,PZHAT,HLBCX,HLBCY,PTSTEP, & + PDXHAT,PDYHAT,PZHAT,PZHATM,HLBCX,HLBCY,PTSTEP, & OVE_RELAX,OVE_RELAX_GRD,OHORELAX_UVWTH,OHORELAX_RV, & OHORELAX_RC,OHORELAX_RR,OHORELAX_RI,OHORELAX_RS,OHORELAX_RG, & OHORELAX_RH,OHORELAX_TKE,OHORELAX_SV, & @@ -312,6 +313,7 @@ REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! height REAL, DIMENSION(:), INTENT(IN) :: PDXHAT ! Stretching in x direction REAL, DIMENSION(:), INTENT(IN) :: PDYHAT ! Stretching in y direction REAL, DIMENSION(:), INTENT(IN) :: PZHAT ! Gal-Chen Height +REAL, DIMENSION(:), INTENT(IN) :: PZHATM ! ... at mass points CHARACTER(LEN=4), DIMENSION(:), INTENT(IN) :: HLBCX ! x-direction LBC type CHARACTER(LEN=4), DIMENSION(:), INTENT(IN) :: HLBCY ! y-direction LBC type LOGICAL, INTENT(IN) :: OVE_RELAX ! logical @@ -540,7 +542,7 @@ IF (GHORELAX .OR. OVE_RELAX.OR.OVE_RELAX_GRD) THEN OHORELAX_SVCHEM, OHORELAX_SVAER, OHORELAX_SVDST, OHORELAX_SVSLT, & OHORELAX_SVPP, OHORELAX_SVCS, OHORELAX_SVCHIC,OHORELAX_SVSNW, & PALKTOP,PALKGRD, PALZBOT,PALZBAS, & - PZZ, PZHAT, PTSTEP, & + PZZ, PZHAT, PZHATM, PTSTEP, & PRIMKMAX,KRIMX,KRIMY, & PALK, PALKW, KALBOT, & PALKBAS, PALKWBAS, KALBAS, & diff --git a/src/MNH/ini_elecn.f90 b/src/MNH/ini_elecn.f90 index 27ed168cdda2b4f23db4406621869b9161434049..1489ba1af8c26f75a239e04265df6024d392624f 100644 --- a/src/MNH/ini_elecn.f90 +++ b/src/MNH/ini_elecn.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2009-2019 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2009-2023 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. @@ -20,12 +20,12 @@ CHARACTER (LEN=4), INTENT(IN) :: HCLOUD ! microphysics scheme TYPE(TFILEDATA), INTENT(IN) :: TPINIFILE! Initial file REAL, INTENT(IN) :: PTSTEP ! Time STEP ! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! height z -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX ! metric coefficient dxx -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY ! metric coefficient dyy -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZX ! metric coefficient dzx -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZY ! metric coefficient dzy +REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! height z +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX ! metric coefficient dxx +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY ! metric coefficient dyy +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDZX ! metric coefficient dzx +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDZY ! metric coefficient dzy ! END SUBROUTINE INI_ELEC_n END INTERFACE @@ -130,12 +130,12 @@ CHARACTER (LEN=4), INTENT(IN) :: HCLOUD ! microphysics scheme TYPE(TFILEDATA), INTENT(IN) :: TPINIFILE! Initial file REAL, INTENT(IN) :: PTSTEP ! Time STEP ! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! height z -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX ! metric coefficient dxx -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY ! metric coefficient dyy -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZX ! metric coefficient dzx -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZY ! metric coefficient dzy +REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! height z +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX ! metric coefficient dxx +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY ! metric coefficient dyy +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDZX ! metric coefficient dzx +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDZY ! metric coefficient dzy ! !* 0.2 declarations of local variables ! diff --git a/src/MNH/ini_field_elec.f90 b/src/MNH/ini_field_elec.f90 index c5dcbb79a30d93761faecc41871205996584c396..49206a1d8d43a3d95d1fc8b59a8e2d74f7fc8f7e 100644 --- a/src/MNH/ini_field_elec.f90 +++ b/src/MNH/ini_field_elec.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2002-2020 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2002-2023 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. @@ -11,12 +11,12 @@ INTERFACE ! SUBROUTINE INI_FIELD_ELEC (PDXX, PDYY, PDZZ, PDZX, PDZY, PZZ) ! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX ! Metric coefficients -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY ! Metric coefficients -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! Metric coefficients -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZX ! Metric coefficients -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZY ! Metric coefficients -REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! vertical grid +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX ! Metric coefficients +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY ! Metric coefficients +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! Metric coefficients +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDZX ! Metric coefficients +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDZY ! Metric coefficients +REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! vertical grid ! END SUBROUTINE INI_FIELD_ELEC END INTERFACE @@ -85,12 +85,12 @@ IMPLICIT NONE ! !* 0.1 Declaration of dummy arguments ! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX ! Metric coefficients -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY ! Metric coefficients -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! Metric coefficients -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZX ! Metric coefficients -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZY ! Metric coefficients -REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! vertical grid +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX ! Metric coefficients +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY ! Metric coefficients +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! Metric coefficients +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDZX ! Metric coefficients +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDZY ! Metric coefficients +REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! vertical grid ! !* 0.2 Declaration of local variables ! diff --git a/src/MNH/ini_lb.f90 b/src/MNH/ini_lb.f90 index b07d03d4c2334d0ad1a23d773123a93ca33a9f6b..a5da9cfcf293144c5ec7f1611036efc5747cc6fe 100644 --- a/src/MNH/ini_lb.f90 +++ b/src/MNH/ini_lb.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1998-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1998-2022 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. @@ -131,37 +131,29 @@ SUBROUTINE INI_LB(TPINIFILE,OLSOURCE,KSV, & !! J.Escobar : 27/04/2016 : bug , test only on ANY(HGETSVM({{1:KSV}})=='READ' !! J.-P. Pinty 09/02/16 Add LIMA that is LBC for CCN and IFN !! M.Leriche 09/02/16 Treat gas and aq. chemicals separately -!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O +! P. Wautelet 05/2016-04/2018: new data structures and calls for I/O ! P. Wautelet 13/02/2019: initialize PLBXSVM and PLBYSVM in all cases -! P. Wautelet 14/02/2019: move UPCASE function to tools.f90 -!! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes +! S. Bielli 02/2019: Sea salt: significant sea wave height influences salt emission; 5 salt modes +! P. Wautelet 04/02/2022: use TSVLIST to manage metadata of scalar variables !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! -USE MODD_CH_AEROSOL -USE MODD_CH_M9_n, ONLY: CNAMES, CICNAMES -USE MODD_CTURB -USE MODD_CONF -USE MODD_DUST -USE MODD_ELEC_DESCR, ONLY: CELECNAMES -use modd_field, only: tfielddata, TYPELOG, TYPEREAL -USE MODD_ICE_C1R3_DESCR, ONLY: C1R3NAMES +USE MODD_CTURB, ONLY: XTKEMIN +USE MODD_CONF, ONLY: LCPL_AROME +use modd_field, only: NMNHDIM_UNKNOWN, tfieldmetadata, TYPELOG, TYPEREAL USE MODD_IO, ONLY: TFILEDATA -USE MODD_LG, ONLY: CLGNAMES -USE MODD_LUNIT_n, ONLY: TLUOUT -USE MODD_NSV -USE MODD_PARAMETERS, ONLY: JPHEXT,NMNHNAMELGTMAX -USE MODD_PARAM_LIMA -USE MODD_PARAM_LIMA_COLD, ONLY: CLIMA_COLD_NAMES -USE MODD_PARAM_LIMA_WARM, ONLY: CLIMA_WARM_NAMES -USE MODD_PARAM_n -USE MODD_RAIN_C2R2_DESCR, ONLY: C2R2NAMES -USE MODD_SALT +USE MODD_NSV, ONLY: NSV, NSV_CS, NSV_CSBEG, NSV_CSEND, NSV_LIMA_BEG, NSV_LIMA_END, & +#ifdef MNH_FOREFIRE + NSV_FF, NSV_FFBEG, NSV_FFEND, & +#endif + NSV_LIMA_CCN_FREE, NSV_LIMA_IFN_FREE, NSV_PP, NSV_PPBEG, NSV_PPEND, & + NSV_SNWBEG, NSV_SNWEND, NSV_USER, TSVLIST +USE MODD_PARAMETERS, ONLY: JPHEXT, JPSVNAMELGTMAX, NLONGNAMELGTMAX, NMNHNAMELGTMAX +USE MODD_PARAM_LIMA, ONLY: NMOD_CCN, NMOD_IFN ! USE MODE_IO_FIELD_READ, only: IO_Field_read, IO_Field_read_lb USE MODE_MSG -USE MODE_TOOLS, ONLY: UPCASE ! IMPLICIT NONE ! @@ -223,16 +215,18 @@ INTEGER :: JSV,JRR ! Loop index for MOIST AND ! additional scalar variables INTEGER :: IRR ! counter for moist variables INTEGER :: IRESP -INTEGER :: ILUOUT ! Logical unit number associated with TLUOUT -LOGICAL :: GHORELAX_UVWTH ! switch for the horizontal relaxation for U,V,W,TH in the FM file +LOGICAL :: GHORELAX_UVWTH ! switch for the horizontal relaxation for U,V,W,TH in the FM file LOGICAL :: GHORELAX_TKE ! switch for the horizontal relaxation for tke in the FM file LOGICAL :: GHORELAX_R, GHORELAX_SV ! switch for the horizontal relaxation ! for moist and scalar variables +LOGICAL :: GIS551 ! True if file was written with MNH 5.5.1 +LOGICAL :: GOLDFILEFORMAT CHARACTER (LEN= LEN(HGETRVM)), DIMENSION (7) :: YGETRXM ! Arrays with the get indicators ! for the moist variables CHARACTER (LEN=1), DIMENSION (7) :: YC ! array with the prefix of the moist variables -CHARACTER(LEN=2) :: INDICE ! to index CCN and IFN fields of LIMA scheme -TYPE(TFIELDDATA) :: TZFIELD +CHARACTER(LEN=NMNHNAMELGTMAX) :: YMNHNAME_BASE +CHARACTER(LEN=NLONGNAMELGTMAX) :: YLONGNAME_BASE +TYPE(TFIELDMETADATA) :: TZFIELD !------------------------------------------------------------------------------- ! ! @@ -248,7 +242,10 @@ ENDIF !* 1. SOME INITIALIZATIONS ! -------------------- ! -ILUOUT = TLUOUT%NLU +!If TPINIFILE file was written with a MesoNH version < 5.6, some variables had different names or were not available +GOLDFILEFORMAT = ( TPINIFILE%NMNHVERSION(1) < 5 & + .OR. ( TPINIFILE%NMNHVERSION(1) == 5 .AND. TPINIFILE%NMNHVERSION(2) < 6 ) ) +GIS551 = TPINIFILE%NMNHVERSION(1) == 5 .AND. TPINIFILE%NMNHVERSION(2) == 5 .AND. TPINIFILE%NMNHVERSION(3) == 1 ! ! !------------------------------------------------------------------------------- @@ -285,37 +282,14 @@ ELSE IL3DYV=2 + 2*JPHEXT ! 4 ENDIF ! -IF (KSIZELBXU_ll/= 0) THEN - CALL IO_Field_read_lb(TPINIFILE,'LBXUM',IL3DXU,IRIMXU,PLBXUM) -END IF - -IF ( KSIZELBX_ll /= 0) THEN - CALL IO_Field_read_lb(TPINIFILE,'LBXVM',IL3DX,IRIMX,PLBXVM) -ENDIF - -IF ( KSIZELBX_ll /= 0) THEN - CALL IO_Field_read_lb(TPINIFILE,'LBXWM',IL3DX,IRIMX,PLBXWM) -END IF - -IF ( KSIZELBY_ll /= 0) THEN - CALL IO_Field_read_lb(TPINIFILE,'LBYUM',IL3DY,IRIMY,PLBYUM) -END IF - -IF ( KSIZELBYV_ll /= 0) THEN - CALL IO_Field_read_lb(TPINIFILE,'LBYVM',IL3DYV,IRIMYV,PLBYVM) -END IF - -IF (KSIZELBY_ll /= 0) THEN - CALL IO_Field_read_lb(TPINIFILE,'LBYWM',IL3DY,IRIMY,PLBYWM) -END IF - -IF (KSIZELBX_ll /= 0) THEN - CALL IO_Field_read_lb(TPINIFILE,'LBXTHM',IL3DX,IRIMX,PLBXTHM) -END IF - -IF ( KSIZELBY_ll /= 0) THEN - CALL IO_Field_read_lb(TPINIFILE,'LBYTHM',IL3DY,IRIMY,PLBYTHM) -END IF +IF ( KSIZELBXU_ll /= 0 ) CALL IO_Field_read_lb( TPINIFILE, 'LBXUM', IL3DXU, IRIMXU, PLBXUM ) +IF ( KSIZELBX_ll /= 0 ) CALL IO_Field_read_lb( TPINIFILE, 'LBXVM', IL3DX, IRIMX, PLBXVM ) +IF ( KSIZELBX_ll /= 0 ) CALL IO_Field_read_lb( TPINIFILE, 'LBXWM', IL3DX, IRIMX, PLBXWM ) +IF ( KSIZELBY_ll /= 0 ) CALL IO_Field_read_lb( TPINIFILE, 'LBYUM', IL3DY, IRIMY, PLBYUM ) +IF ( KSIZELBYV_ll /= 0 ) CALL IO_Field_read_lb( TPINIFILE, 'LBYVM', IL3DYV, IRIMYV, PLBYVM ) +IF ( KSIZELBY_ll /= 0 ) CALL IO_Field_read_lb( TPINIFILE, 'LBYWM', IL3DY, IRIMY, PLBYWM ) +IF ( KSIZELBX_ll /= 0 ) CALL IO_Field_read_lb( TPINIFILE, 'LBXTHM', IL3DX, IRIMX, PLBXTHM ) +IF ( KSIZELBY_ll /= 0 ) CALL IO_Field_read_lb( TPINIFILE, 'LBYTHM', IL3DY, IRIMY, PLBYTHM ) ! !* 2.3 LB-TKE ! @@ -323,11 +297,10 @@ SELECT CASE(HGETTKEM) CASE('READ') IF (.NOT. LCPL_AROME .AND. OLSOURCE) THEN IF (PRESENT(PLBXTKEMM).AND.PRESENT(PLBYTKEMM)) THEN - WRITE ( ILUOUT,*) 'LBXTKES AND LBYTKES WILL BE INITIALIZED TO 0' + CALL PRINT_MSG( NVERB_INFO, 'IO', 'INI_LB', 'LBXTKES and LBYTKE are initialized to PLBXTKEMM and PLBYTKEMM' ) PLBXTKEM(:,:,:) = PLBXTKEMM(:,:,:) PLBYTKEM(:,:,:) = PLBYTKEMM(:,:,:) ELSE -!callabortstop CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize LBXTKES and LBYTKES') ENDIF ELSE @@ -361,17 +334,18 @@ END SELECT !* 2.5 LB-Rx ! IF(KSIZELBXR_ll > 0 ) THEN - TZFIELD%CMNHNAME = 'HORELAX_R' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'HORELAX_R' - TZFIELD%CUNITS = '' - TZFIELD%CDIR = '--' - TZFIELD%CCOMMENT = 'Switch to activate the HOrizontal RELAXation' - TZFIELD%CLBTYPE = 'NONE' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPELOG - TZFIELD%NDIMS = 0 - TZFIELD%LTIMEDEP = .FALSE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'HORELAX_R', & + CSTDNAME = '', & + CLONGNAME = 'HORELAX_R', & + CUNITS = '', & + CDIR = '--', & + CCOMMENT = 'Switch to activate the HOrizontal RELAXation', & + CLBTYPE = 'NONE', & + NGRID = 1, & + NTYPE = TYPELOG, & + NDIMS = 0, & + LTIMEDEP = .FALSE. ) ! CALL IO_Field_read(TPINIFILE,TZFIELD,GHORELAX_R) ! @@ -389,13 +363,13 @@ IF(KSIZELBXR_ll > 0 ) THEN IL3DY=2*JPHEXT ! 2 END IF ! - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'kg kg-1' - TZFIELD%CDIR = '' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CUNITS = 'kg kg-1', & + CDIR = '', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ! IRR=0 JRR=1 @@ -432,9 +406,8 @@ IF(KSIZELBXR_ll > 0 ) THEN IF (.NOT. LCPL_AROME .AND. OLSOURCE) THEN IF (PRESENT(PLBXRMM)) THEN PLBXRM(:,:,:,IRR)=PLBXRMM(:,:,:,IRR) - WRITE(ILUOUT,*) 'PLBXRS will be initialized to 0 for LBXR'//YC(JRR)//'M' + CALL PRINT_MSG( NVERB_INFO, 'IO', 'INI_LB', 'PLBXRM is initialized to PLBXRMM for LBXR'//YC(JRR)//'M' ) ELSE - !callabortstop CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize PLBXRM for LBXR'//YC(JRR)//'M') ENDIF ELSE @@ -450,9 +423,8 @@ IF(KSIZELBXR_ll > 0 ) THEN IF (.NOT. LCPL_AROME .AND. OLSOURCE) THEN IF (PRESENT(PLBYRMM)) THEN PLBYRM(:,:,:,IRR)=PLBYRMM(:,:,:,IRR) - WRITE(ILUOUT,*) 'PLBYRS will be initialized to 0 for LBYR'//YC(JRR)//'M' + CALL PRINT_MSG( NVERB_INFO, 'IO', 'INI_LB', 'PLBYRM is initialized to PLBYRMM for LBYR'//YC(JRR)//'M' ) ELSE - !callabortstop CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize PLBYRM for LBYR'//YC(JRR)//'M') ENDIF ELSE @@ -473,1138 +445,218 @@ END IF ! !* 2.6 LB-Scalar Variables ! -PLBXSVM(:,:,:,:) = 0. -PLBYSVM(:,:,:,:) = 0. -! IF (KSV > 0) THEN IF (ANY(HGETSVM(1:KSV)=='READ')) THEN - TZFIELD%CMNHNAME = 'HORELAX_SV' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'HORELAX_SV' - TZFIELD%CUNITS = '' - TZFIELD%CDIR = '--' - TZFIELD%CCOMMENT = '' - TZFIELD%CLBTYPE = 'NONE' - TZFIELD%NGRID = 0 - TZFIELD%NTYPE = TYPELOG - TZFIELD%NDIMS = 0 - TZFIELD%LTIMEDEP = .FALSE. - CALL IO_Field_read(TPINIFILE,TZFIELD,GHORELAX_SV) + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'HORELAX_SV', & + CSTDNAME = '', & + CLONGNAME = 'HORELAX_SV', & + CUNITS = '', & + CDIR = '--', & + CCOMMENT = '', & + CLBTYPE = 'NONE', & + NGRID = 0, & + NTYPE = TYPELOG, & + NDIMS = 0, & + LTIMEDEP = .FALSE. ) + CALL IO_Field_read( TPINIFILE, TZFIELD, GHORELAX_SV ) + IF ( GHORELAX_SV ) THEN - IRIMX=(KSIZELBXSV_ll-2*JPHEXT)/2 + IRIMX=(KSIZELBXSV_ll-2*JPHEXT)/2 IRIMY=(KSIZELBYSV_ll-2*JPHEXT)/2 IL3DX=2*ILBSIZEX+2*JPHEXT IL3DY=2*ILBSIZEY+2*JPHEXT ELSE IRIMX=0 IRIMY=0 - IL3DX=2*JPHEXT !2 - IL3DY=2*JPHEXT !2 + IL3DX=2*JPHEXT + IL3DY=2*JPHEXT END IF END IF END IF -! User scalar variables -IF (NSV_USER>0) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'kg kg-1' - TZFIELD%CDIR = '' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = 1, NSV_USER - SELECT CASE(HGETSVM(JSV)) - CASE ('READ') - IF ( KSIZELBXSV_ll /= 0 ) THEN - WRITE(TZFIELD%CMNHNAME,'(A6,I3.3)')'LBXSVM',JSV - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBX' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3,A8)')'2_Y_Z_','LBXSVM',JSV - CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DX,IRIMX,PLBXSVM(:,:,:,JSV),IRESP) - IF ( SIZE(PLBXSVM,1) /= 0 ) THEN - IF (IRESP/=0) THEN - IF (PRESENT(PLBXSVMM)) THEN - PLBXSVM(:,:,:,JSV)=PLBXSVMM(:,:,:,JSV) - WRITE(ILUOUT,*) 'PLXYSVM will be initialized to 0' - ELSE -!callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize PLBXSVM') - ENDIF - END IF - END IF - END IF - ! - IF (KSIZELBYSV_ll /= 0 ) THEN - WRITE(TZFIELD%CMNHNAME,'(A6,I3.3)')'LBYSVM',JSV - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBY' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3,A8)')'X_2_Z_','LBYSVM',JSV - CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DY,IRIMY,PLBYSVM(:,:,:,JSV),IRESP) - IF ( SIZE(PLBYSVM,1) /= 0 ) THEN - IF (IRESP/=0) THEN - IF (PRESENT(PLBYSVMM)) THEN - PLBYSVM(:,:,:,JSV)=PLBYSVMM(:,:,:,JSV) - WRITE(ILUOUT,*) 'PLBYSVM will be initialized to 0' - ELSE -!callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize PLBYSVM') - ENDIF - END IF - END IF - END IF - CASE('INIT') - IF ( SIZE(PLBXSVM,1) /= 0 ) PLBXSVM(:,:,:,JSV) = 0. - IF ( SIZE(PLBYSVM,1) /= 0 ) PLBYSVM(:,:,:,JSV) = 0. - END SELECT - END DO -END IF -! C2R2 scalar variables -IF (NSV_C2R2END>=NSV_C2R2BEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'm-3' - TZFIELD%CDIR = '' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_C2R2BEG, NSV_C2R2END - SELECT CASE(HGETSVM(JSV)) - CASE ('READ') - IF ( KSIZELBXSV_ll /= 0 ) THEN - TZFIELD%CMNHNAME = 'LBX_'//TRIM(C2R2NAMES(JSV-NSV_C2R2BEG+1)) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBX' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV - CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DX,IRIMX,PLBXSVM(:,:,:,JSV),IRESP) - IF ( SIZE(PLBXSVM,1) /= 0 ) THEN - IF (IRESP/=0) THEN - IF (PRESENT(PLBXSVMM)) THEN - PLBXSVM(:,:,:,JSV)=PLBXSVMM(:,:,:,JSV) - WRITE(ILUOUT,*) 'C2R2 PLBXSVM will be initialized to 0' - ELSE -!callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize C2R2 PLBXSVM') - ENDIF - END IF - END IF - END IF - ! - IF (KSIZELBYSV_ll /= 0 ) THEN - TZFIELD%CMNHNAME = 'LBY_'//TRIM(C2R2NAMES(JSV-NSV_C2R2BEG+1)) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBY' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV - CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DY,IRIMY,PLBYSVM(:,:,:,JSV),IRESP) - IF ( SIZE(PLBYSVM,1) /= 0 ) THEN - IF (IRESP/=0) THEN - IF (PRESENT(PLBYSVMM)) THEN - PLBYSVM(:,:,:,JSV)=PLBYSVMM(:,:,:,JSV) - WRITE(ILUOUT,*) 'C2R2 PLBYSVM will be initialized to 0' - ELSE -!callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize C2R2 PLBYSVM') - ENDIF + +! Scalar variables +DO JSV = 1, NSV + SELECT CASE( HGETSVM(JSV) ) + CASE ( 'READ' ) + TZFIELD = TSVLIST(JSV) + TZFIELD%CDIR = '' + TZFIELD%NDIMLIST(:) = NMNHDIM_UNKNOWN + YMNHNAME_BASE = TRIM( TZFIELD%CMNHNAME ) + YLONGNAME_BASE = TRIM( TZFIELD%CLONGNAME ) + + IF ( KSIZELBXSV_ll /= 0 .AND. SIZE( PLBXSVM, 1 ) /= 0 ) THEN + TZFIELD%CMNHNAME = 'LBX_' // TRIM( YMNHNAME_BASE ) + TZFIELD%CLONGNAME = 'LBX_' // TRIM( YLONGNAME_BASE ) + + !Some variables were written with an other name in MesoNH < 5.6 + IF ( GOLDFILEFORMAT ) THEN + IF ( JSV >= 1 .AND. JSV <= NSV_USER ) THEN + WRITE( TZFIELD%CMNHNAME, '( A6, I3.3 )' ) 'LBXSVM',JSV + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = TRIM( TZFIELD%CMNHNAME ) + ELSE IF ( JSV >= NSV_LIMA_BEG .AND. JSV <= NSV_LIMA_END ) THEN + ! Name was corrected in MNH 5.5.1 + IF ( .NOT. GIS551 ) CALL OLD_CMNHNAME_GENERATE_INTERN( TZFIELD%CMNHNAME, TZFIELD%CLONGNAME ) + TZFIELD%CSTDNAME = '' + ELSE IF ( JSV >= NSV_PPBEG .AND. JSV <= NSV_PPEND ) THEN + TZFIELD%CMNHNAME = 'LBX_PP' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'LBX_PP' + IF ( JSV == NSV_PPBEG .AND. NSV_PP > 1 ) THEN + CMNHMSG(1) = 'reading older file (<5.6) for LBX_PP scalar variables' + CMNHMSG(2) = 'they are bugged: there should be several LBX_PP variables' + CMNHMSG(3) = 'but they were all written with the same name ''LBX_PP''' + CALL PRINT_MSG( NVERB_WARNING, 'IO', 'INI_LB' ) END IF - END IF - END IF - CASE('INIT') - IF ( SIZE(PLBXSVM,1) /= 0 ) PLBXSVM(:,:,:,JSV) = 0. - IF ( SIZE(PLBYSVM,1) /= 0 ) PLBYSVM(:,:,:,JSV) = 0. - END SELECT - END DO -END IF -! C1R3 scalar variables -IF (NSV_C1R3END>=NSV_C1R3BEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'm-3' - TZFIELD%CDIR = '' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_C1R3BEG, NSV_C1R3END - SELECT CASE(HGETSVM(JSV)) - CASE ('READ') - IF ( KSIZELBXSV_ll /= 0 ) THEN - TZFIELD%CMNHNAME = 'LBX_'//TRIM(C1R3NAMES(JSV-NSV_C1R3BEG+1)) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBX' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV - CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DX,IRIMX,PLBXSVM(:,:,:,JSV),IRESP) - IF ( SIZE(PLBXSVM,1) /= 0 ) THEN - IF (IRESP/=0) THEN - IF (PRESENT(PLBXSVMM)) THEN - PLBXSVM(:,:,:,JSV)=PLBXSVMM(:,:,:,JSV) - WRITE(ILUOUT,*) 'C1R3 PLBXSVM will be initialized to 0' - ELSE -!callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize C1R3 PLBXSVM') - ENDIF +#ifdef MNH_FOREFIRE + ELSE IF ( JSV >= NSV_FFBEG .AND. JSV <= NSV_FFEND ) THEN + TZFIELD%CMNHNAME = 'LBX_FF' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'LBX_FF' + IF ( JSV == NSV_FFBEG .AND. NSV_FF > 1 ) THEN + CMNHMSG(1) = 'reading older file (<5.6) for LBX_FF scalar variables' + CMNHMSG(2) = 'they are bugged: there should be several LBX_FF variables' + CMNHMSG(3) = 'but they were all written with the same name ''LBX_FF''' + CALL PRINT_MSG( NVERB_WARNING, 'IO', 'INI_LB' ) END IF - END IF - END IF - ! - IF (KSIZELBYSV_ll /= 0 ) THEN - TZFIELD%CMNHNAME = 'LBY_'//TRIM(C1R3NAMES(JSV-NSV_C1R3BEG+1)) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBY' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV - CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DY,IRIMY,PLBYSVM(:,:,:,JSV),IRESP) - IF ( SIZE(PLBYSVM,1) /= 0 ) THEN - IF (IRESP/=0) THEN - IF (PRESENT(PLBYSVMM)) THEN - PLBYSVM(:,:,:,JSV)=PLBYSVMM(:,:,:,JSV) - WRITE(ILUOUT,*) 'C1R3 PLBYSVM will be initialized to 0' - ELSE -!callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize C1R3 PLBYSVM') - ENDIF +#endif + ELSE IF ( JSV >= NSV_CSBEG .AND. JSV <= NSV_CSEND ) THEN + TZFIELD%CMNHNAME = 'LBX_CS' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'LBX_CS' + IF ( JSV == NSV_CSBEG .AND. NSV_CS > 1 ) THEN + CMNHMSG(1) = 'reading older file (<5.6) for LBX_CS scalar variables' + CMNHMSG(2) = 'they are bugged: there should be several LBX_CS variables' + CMNHMSG(3) = 'but they were all written with the same name ''LBX_CS''' + CALL PRINT_MSG( NVERB_WARNING, 'IO', 'INI_LB' ) END IF END IF END IF - CASE('INIT') - IF ( SIZE(PLBXSVM,1) /= 0 ) PLBXSVM(:,:,:,JSV) = 0. - IF ( SIZE(PLBYSVM,1) /= 0 ) PLBYSVM(:,:,:,JSV) = 0. - END SELECT - END DO -END IF -! -! LIMA: CCN and IFN scalar variables -! -IF (CCLOUD=='LIMA' ) THEN - IF (NSV_LIMA_CCN_FREE+NMOD_CCN-1 >= NSV_LIMA_CCN_FREE) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'kg-1' - TZFIELD%CDIR = '' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_LIMA_CCN_FREE,NSV_LIMA_CCN_FREE+NMOD_CCN-1 - SELECT CASE(HGETSVM(JSV)) - CASE ('READ') - WRITE(INDICE,'(I2.2)')(JSV - NSV_LIMA_CCN_FREE + 1) - IF ( KSIZELBXSV_ll /= 0 ) THEN - IF ( TPINIFILE%NMNHVERSION(1) < 5 & - .OR. ( TPINIFILE%NMNHVERSION(1) == 5 .AND. TPINIFILE%NMNHVERSION(2) < 5 ) & - .OR. ( TPINIFILE%NMNHVERSION(1) == 5 .AND. TPINIFILE%NMNHVERSION(2) == 5 & - .AND. TPINIFILE%NMNHVERSION(3) < 1 ) ) THEN - TZFIELD%CMNHNAME = 'LBX_'//TRIM(UPCASE(CLIMA_WARM_NAMES(3)))//INDICE - ELSE - TZFIELD%CMNHNAME = 'LBX_'//TRIM(UPCASE(CLIMA_WARM_NAMES(3)))//INDICE - END IF - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBX' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV - CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DX,IRIMX,PLBXSVM(:,:,:,JSV),IRESP) - IF ( SIZE(PLBXSVM,1) /= 0 ) THEN - IF (IRESP/=0) THEN - IF (PRESENT(PLBXSVMM)) THEN - PLBXSVM(:,:,:,JSV)=PLBXSVMM(:,:,:,JSV) - WRITE(ILUOUT,*) 'CCN PLBXSVM will be initialized to 0' - ELSE -!callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize CCN PLBXSVM') - ENDIF - END IF - END IF - END IF - ! - IF (KSIZELBYSV_ll /= 0 ) THEN - IF ( TPINIFILE%NMNHVERSION(1) < 5 & - .OR. ( TPINIFILE%NMNHVERSION(1) == 5 .AND. TPINIFILE%NMNHVERSION(2) < 5 ) & - .OR. ( TPINIFILE%NMNHVERSION(1) == 5 .AND. TPINIFILE%NMNHVERSION(2) == 5 & - .AND. TPINIFILE%NMNHVERSION(3) < 1 ) ) THEN - TZFIELD%CMNHNAME = 'LBY_'//TRIM(UPCASE(CLIMA_WARM_NAMES(3)))//INDICE - ELSE - TZFIELD%CMNHNAME = 'LBY_'//TRIM(UPCASE(CLIMA_WARM_NAMES(3)))//INDICE - END IF - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBY' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV - CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DY,IRIMY,PLBYSVM(:,:,:,JSV),IRESP) - IF ( SIZE(PLBYSVM,1) /= 0 ) THEN - IF (IRESP/=0) THEN - IF (PRESENT(PLBYSVMM)) THEN - PLBYSVM(:,:,:,JSV)=PLBYSVMM(:,:,:,JSV) - WRITE(ILUOUT,*) 'CCN PLBYSVM will be initialized to 0' - ELSE -!callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize CCN PLBYSVM') - ENDIF - END IF - END IF - END IF - CASE('INIT') - IF ( SIZE(PLBXSVM,1) /= 0 ) PLBXSVM(:,:,:,JSV) = 0. - IF ( SIZE(PLBYSVM,1) /= 0 ) PLBYSVM(:,:,:,JSV) = 0. - END SELECT - END DO - END IF - ! - IF (NSV_LIMA_IFN_FREE+NMOD_IFN-1 >= NSV_LIMA_IFN_FREE) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'kg-1' - TZFIELD%CDIR = '' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_LIMA_IFN_FREE,NSV_LIMA_IFN_FREE+NMOD_IFN-1 - SELECT CASE(HGETSVM(JSV)) - CASE ('READ') - WRITE(INDICE,'(I2.2)')(JSV - NSV_LIMA_IFN_FREE + 1) - IF ( KSIZELBXSV_ll /= 0 ) THEN - IF ( TPINIFILE%NMNHVERSION(1) < 5 & - .OR. ( TPINIFILE%NMNHVERSION(1) == 5 .AND. TPINIFILE%NMNHVERSION(2) < 5 ) & - .OR. ( TPINIFILE%NMNHVERSION(1) == 5 .AND. TPINIFILE%NMNHVERSION(2) == 5 & - .AND. TPINIFILE%NMNHVERSION(3) < 1 ) ) THEN - TZFIELD%CMNHNAME = 'LBX_'//TRIM(UPCASE(CLIMA_COLD_NAMES(5)))//INDICE - ELSE - TZFIELD%CMNHNAME = 'LBX_'//TRIM(UPCASE(CLIMA_COLD_NAMES(5)))//INDICE - END IF - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBX' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV - CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DX,IRIMX,PLBXSVM(:,:,:,JSV),IRESP) - IF ( SIZE(PLBXSVM,1) /= 0 ) THEN - IF (IRESP/=0) THEN - IF (PRESENT(PLBXSVMM)) THEN - PLBXSVM(:,:,:,JSV)=PLBXSVMM(:,:,:,JSV) - WRITE(ILUOUT,*) 'IFN PLBXSVM will be initialized to 0' - ELSE -!callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize IFN') - ENDIF + + WRITE( TZFIELD%CCOMMENT, '( A6, A6, I3.3 )' ) '2_Y_Z_', 'LBXSVM', JSV + TZFIELD%CLBTYPE = 'LBX' + + CALL IO_Field_read_lb( TPINIFILE, TZFIELD, IL3DX, IRIMX, PLBXSVM(:,:,:,JSV), IRESP ) + + IF ( IRESP /= 0 ) THEN + IF ( PRESENT( PLBXSVMM ) ) THEN + PLBXSVM(:,:,:,JSV) = PLBXSVMM(:,:,:,JSV) + CALL PRINT_MSG( NVERB_INFO, 'IO', 'INI_LB', 'PLBXSVM is initialized to PLBXSVMM for ' // TRIM( YMNHNAME_BASE ) ) + ELSE + IF ( GOLDFILEFORMAT .AND. JSV >= NSV_LIMA_BEG .AND. JSV <= NSV_LIMA_END ) THEN + !In pre 5.6 files, only CCN_FREE and IFN_FREE LIMA scalar variables were available (for LIMA scalar variables) + IF ( JSV >= NSV_LIMA_CCN_FREE .AND. JSV <= (NSV_LIMA_CCN_FREE+NMOD_CCN-1) ) THEN + CALL PRINT_MSG( NVERB_FATAL, 'IO', 'INI_LB', 'problem to initialize LIMA CCN_FREE PLBXSVM' ) + ELSE IF ( JSV >= NSV_LIMA_IFN_FREE .AND. JSV <= (NSV_LIMA_IFN_FREE+NMOD_IFN-1) ) THEN + CALL PRINT_MSG( NVERB_FATAL, 'IO', 'INI_LB', 'problem to initialize LIMA IFN_FREE PLBXSVM' ) + ELSE + PLBXSVM(:,:,:,JSV) = 0. + CALL PRINT_MSG( NVERB_WARNING, 'IO', 'INI_LB', 'PLBXSVM is initialized to 0 for ' // TRIM( YMNHNAME_BASE ) ) END IF - END IF - END IF - ! - IF (KSIZELBYSV_ll /= 0 ) THEN - IF ( TPINIFILE%NMNHVERSION(1) < 5 & - .OR. ( TPINIFILE%NMNHVERSION(1) == 5 .AND. TPINIFILE%NMNHVERSION(2) < 5 ) & - .OR. ( TPINIFILE%NMNHVERSION(1) == 5 .AND. TPINIFILE%NMNHVERSION(2) == 5 & - .AND. TPINIFILE%NMNHVERSION(3) < 1 ) ) THEN - TZFIELD%CMNHNAME = 'LBY_'//TRIM(UPCASE(CLIMA_COLD_NAMES(5)))//INDICE + ELSE IF ( ( JSV >= NSV_PPBEG .AND. JSV <= NSV_PPEND ) .OR. & +#ifdef MNH_FOREFIRE + ( JSV >= NSV_FFBEG .AND. JSV <= NSV_FFEND ) .OR. & +#endif + ( JSV >= NSV_CSBEG .AND. JSV <= NSV_CSEND ) .OR. & + ( JSV >= NSV_SNWBEG .AND. JSV <= NSV_SNWEND .AND. GOLDFILEFORMAT ) ) THEN !Snow was not written in <5.6 + PLBXSVM(:,:,:,JSV) = 0. + CALL PRINT_MSG( NVERB_WARNING, 'IO', 'INI_LB', 'PLBXSVM is initialized to 0 for ' // TRIM( YMNHNAME_BASE ) ) ELSE - TZFIELD%CMNHNAME = 'LBY_'//TRIM(UPCASE(CLIMA_COLD_NAMES(5)))//INDICE - END IF - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBY' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV - CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DY,IRIMY,PLBYSVM(:,:,:,JSV),IRESP) - IF ( SIZE(PLBYSVM,1) /= 0 ) THEN - IF (IRESP/=0) THEN - IF (PRESENT(PLBYSVMM)) THEN - PLBYSVM(:,:,:,JSV)=PLBYSVMM(:,:,:,JSV) - WRITE(ILUOUT,*) 'IFN PLBYSVM will be initialized to 0' - ELSE -!callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize IFN') - ENDIF - END IF - END IF - END IF - CASE('INIT') - IF ( SIZE(PLBXSVM,1) /= 0 ) PLBXSVM(:,:,:,JSV) = 0. - IF ( SIZE(PLBYSVM,1) /= 0 ) PLBYSVM(:,:,:,JSV) = 0. - END SELECT - END DO - END IF -ENDIF -! ELEC scalar variables -IF (NSV_ELECEND>=NSV_ELECBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'kg kg-1' - TZFIELD%CDIR = '' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_ELECBEG, NSV_ELECEND - SELECT CASE(HGETSVM(JSV)) - CASE ('READ') - IF ( KSIZELBXSV_ll /= 0 ) THEN - TZFIELD%CMNHNAME = 'LBX_'//TRIM(CELECNAMES(JSV-NSV_ELECBEG+1)) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBX' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV - CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DX,IRIMX,PLBXSVM(:,:,:,JSV),IRESP) - IF ( SIZE(PLBXSVM,1) /= 0 ) THEN - IF (IRESP/=0) THEN - IF (PRESENT(PLBXSVMM)) THEN - PLBXSVM(:,:,:,JSV)=PLBXSVMM(:,:,:,JSV) - WRITE(ILUOUT,*) 'ELEC PLBXSVM will be initialized to 0' - ELSE -!callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize ELEC PLBXSVM') - ENDIF - END IF - END IF - END IF - ! - IF (KSIZELBYSV_ll /= 0 ) THEN - TZFIELD%CMNHNAME = 'LBY_'//TRIM(CELECNAMES(JSV-NSV_ELECBEG+1)) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBY' - CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DY,IRIMY,PLBYSVM(:,:,:,JSV),IRESP) - IF ( SIZE(PLBYSVM,1) /= 0 ) THEN - IF (IRESP/=0) THEN - IF (PRESENT(PLBYSVMM)) THEN - PLBYSVM(:,:,:,JSV)=PLBYSVMM(:,:,:,JSV) - WRITE(ILUOUT,*) 'ELEC PLBYSVM will be initialized to 0' - ELSE -!callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize ELEC PLBYSVM') - ENDIF - END IF - END IF - END IF - CASE('INIT') - IF ( SIZE(PLBXSVM,1) /= 0 ) PLBXSVM(:,:,:,JSV) = 0. - IF ( SIZE(PLBYSVM,1) /= 0 ) PLBYSVM(:,:,:,JSV) = 0. - END SELECT - END DO -END IF -! Chemical gas phase scalar variables -IF (NSV_CHGSEND>=NSV_CHGSBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'kg-1' - TZFIELD%CDIR = '' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_CHGSBEG, NSV_CHGSEND - SELECT CASE(HGETSVM(JSV)) - CASE ('READ') - IF ( KSIZELBXSV_ll /= 0 ) THEN - TZFIELD%CMNHNAME = 'LBX_'//TRIM(UPCASE(CNAMES(JSV-NSV_CHGSBEG+1))) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBX' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV - CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DX,IRIMX,PLBXSVM(:,:,:,JSV),IRESP) - IF ( SIZE(PLBXSVM,1) /= 0 ) THEN - IF (IRESP/=0) THEN - IF (PRESENT(PLBXSVMM)) THEN - PLBXSVM(:,:,:,JSV)=PLBXSVMM(:,:,:,JSV) - WRITE(ILUOUT,*) 'Chemical PLBXSVM will be initialized to 0' - ELSE -!callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize gas phase chemical PLBXSVM') - ENDIF - END IF - END IF - END IF - ! - IF (KSIZELBYSV_ll /= 0 ) THEN - TZFIELD%CMNHNAME = 'LBY_'//TRIM(UPCASE(CNAMES(JSV-NSV_CHGSBEG+1))) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBY' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV - CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DY,IRIMY,PLBYSVM(:,:,:,JSV),IRESP) - IF ( SIZE(PLBYSVM,1) /= 0 ) THEN - IF (IRESP/=0) THEN - IF (PRESENT(PLBYSVMM)) THEN - PLBYSVM(:,:,:,JSV)=PLBYSVMM(:,:,:,JSV) - WRITE(ILUOUT,*) 'Chemical PLBYSVM will be initialized to 0' - ELSE -!callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize gas phase chemical PLBYSVM') - ENDIF - END IF - END IF - END IF - CASE('INIT') - IF ( SIZE(PLBXSVM,1) /= 0 ) PLBXSVM(:,:,:,JSV) = 0. - IF ( SIZE(PLBYSVM,1) /= 0 ) PLBYSVM(:,:,:,JSV) = 0. - END SELECT - END DO -END IF -! Chemical aqueous phase scalar variables -IF (NSV_CHACEND>=NSV_CHACBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppp' - TZFIELD%CDIR = '' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_CHACBEG, NSV_CHACEND - SELECT CASE(HGETSVM(JSV)) - CASE ('READ') - IF ( KSIZELBXSV_ll /= 0 ) THEN - TZFIELD%CMNHNAME = 'LBX_'//TRIM(UPCASE(CNAMES(JSV-NSV_CHACBEG+NSV_CHGS+1))) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBX' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV - CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DX,IRIMX,PLBXSVM(:,:,:,JSV),IRESP) - IF ( SIZE(PLBXSVM,1) /= 0 ) THEN - IF (IRESP/=0) THEN - IF (PRESENT(PLBXSVMM)) THEN - PLBXSVM(:,:,:,JSV)=PLBXSVMM(:,:,:,JSV) - WRITE(ILUOUT,*) 'Chemical PLBXSVM will be initialized to 0' - ELSE -!callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize aqueous phase chemical PLBXSVM') - ENDIF - END IF - END IF - END IF - ! - IF (KSIZELBYSV_ll /= 0 ) THEN - TZFIELD%CMNHNAME = 'LBY_'//TRIM(UPCASE(CNAMES(JSV-NSV_CHACBEG+NSV_CHGS+1))) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBY' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV - CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DY,IRIMY,PLBYSVM(:,:,:,JSV),IRESP) - IF ( SIZE(PLBYSVM,1) /= 0 ) THEN - IF (IRESP/=0) THEN - IF (PRESENT(PLBYSVMM)) THEN - PLBYSVM(:,:,:,JSV)=PLBYSVMM(:,:,:,JSV) - WRITE(ILUOUT,*) 'Chemical PLBYSVM will be initialized to 0' - ELSE -!callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize aqueous phase chemical PLBYSVM') - ENDIF - END IF - END IF - END IF - CASE('INIT') - IF ( SIZE(PLBXSVM,1) /= 0 ) PLBXSVM(:,:,:,JSV) = 0. - IF ( SIZE(PLBYSVM,1) /= 0 ) PLBYSVM(:,:,:,JSV) = 0. - END SELECT - END DO -END IF -! Chemical ice phase scalar variables -IF (NSV_CHICEND>=NSV_CHICBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppp' - TZFIELD%CDIR = '' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_CHICBEG, NSV_CHICEND - SELECT CASE(HGETSVM(JSV)) - CASE ('READ') - IF ( KSIZELBXSV_ll /= 0 ) THEN - TZFIELD%CMNHNAME = 'LBX_'//TRIM(UPCASE(CICNAMES(JSV-NSV_CHICBEG+1))) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBX' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV - CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DX,IRIMX,PLBXSVM(:,:,:,JSV),IRESP) - IF ( SIZE(PLBXSVM,1) /= 0 ) THEN - IF (IRESP/=0) THEN - IF (PRESENT(PLBXSVMM)) THEN - PLBXSVM(:,:,:,JSV)=PLBXSVMM(:,:,:,JSV) - WRITE(ILUOUT,*) 'Ice phase chemical PLBXSVM will be initialized to 0' - ELSE -!callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize ice phase chemical PLBXSVM') - ENDIF - END IF - END IF - END IF - ! - IF (KSIZELBYSV_ll /= 0 ) THEN - TZFIELD%CMNHNAME = 'LBY_'//TRIM(UPCASE(CICNAMES(JSV-NSV_CHICBEG+1))) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBY' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV - CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DY,IRIMY,PLBYSVM(:,:,:,JSV),IRESP) - IF ( SIZE(PLBYSVM,1) /= 0 ) THEN - IF (IRESP/=0) THEN - IF (PRESENT(PLBYSVMM)) THEN - PLBYSVM(:,:,:,JSV)=PLBYSVMM(:,:,:,JSV) - WRITE(ILUOUT,*) 'Ice phase chemical PLBYSVM will be initialized to 0' - ELSE -!callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize ice phase chemical PLBYSVM') - ENDIF - END IF - END IF - END IF - CASE('INIT') - IF ( SIZE(PLBXSVM,1) /= 0 ) PLBXSVM(:,:,:,JSV) = 0. - IF ( SIZE(PLBYSVM,1) /= 0 ) PLBYSVM(:,:,:,JSV) = 0. - END SELECT - END DO -END IF -! Orilam aerosol scalar variables -IF (NSV_AEREND>=NSV_AERBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppp' - TZFIELD%CDIR = '' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_AERBEG, NSV_AEREND - SELECT CASE(HGETSVM(JSV)) - CASE ('READ') - IF ( KSIZELBXSV_ll /= 0 ) THEN - TZFIELD%CMNHNAME = 'LBX_'//TRIM(UPCASE(CAERONAMES(JSV-NSV_AERBEG+1))) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBX' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV - CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DX,IRIMX,PLBXSVM(:,:,:,JSV),IRESP) - IF ( SIZE(PLBXSVM,1) /= 0 ) THEN - IF (IRESP/=0) THEN - IF (PRESENT(PLBXSVMM)) THEN - PLBXSVM(:,:,:,JSV)=PLBXSVMM(:,:,:,JSV) - WRITE(ILUOUT,*) 'Aerosol PLBXSVM will be initialized to 0' - ELSE -!callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize aerosol PLBXSVM') - ENDIF - END IF - END IF - END IF - ! - IF (KSIZELBYSV_ll /= 0 ) THEN - TZFIELD%CMNHNAME = 'LBY_'//TRIM(UPCASE(CAERONAMES(JSV-NSV_AERBEG+1))) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBY' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV - CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DY,IRIMY,PLBYSVM(:,:,:,JSV),IRESP) - IF ( SIZE(PLBYSVM,1) /= 0 ) THEN - IF (IRESP/=0) THEN - IF (PRESENT(PLBYSVMM)) THEN - PLBYSVM(:,:,:,JSV)=PLBYSVMM(:,:,:,JSV) - WRITE(ILUOUT,*) 'Aerosol PLBYSVM will be initialized to 0' - ELSE -!callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize aerosol PLBYSVM') - ENDIF - END IF - END IF - END IF - CASE('INIT') - IF ( SIZE(PLBXSVM,1) /= 0 ) PLBXSVM(:,:,:,JSV) = 0. - IF ( SIZE(PLBYSVM,1) /= 0 ) PLBYSVM(:,:,:,JSV) = 0. - END SELECT - END DO -END IF -! Orilam aerosols moist scalar variables -IF (NSV_AERDEPEND>=NSV_AERDEPBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppp' - TZFIELD%CDIR = '' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_AERDEPBEG, NSV_AERDEPEND - SELECT CASE(HGETSVM(JSV)) - CASE ('READ') - IF ( KSIZELBXSV_ll /= 0 ) THEN - TZFIELD%CMNHNAME = 'LBX_'//TRIM(UPCASE(CDEAERNAMES(JSV-NSV_AERDEPBEG+1))) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBX' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV - CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DX,IRIMX,PLBXSVM(:,:,:,JSV),IRESP) - IF ( SIZE(PLBXSVM,1) /= 0 ) THEN - IF (IRESP/=0) THEN - IF (PRESENT(PLBXSVMM)) THEN - PLBXSVM(:,:,:,JSV)=PLBXSVMM(:,:,:,JSV) - WRITE(ILUOUT,*) 'Aerosol PLBXSVM will be initialized to 0' - ELSE -!callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize aerosol PLBXSVM') - ENDIF - END IF - END IF - END IF - ! - IF (KSIZELBYSV_ll /= 0 ) THEN - TZFIELD%CMNHNAME = 'LBY_'//TRIM(CDEAERNAMES(JSV-NSV_AERDEPBEG+1)) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBY' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV - CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DY,IRIMY,PLBYSVM(:,:,:,JSV),IRESP) - IF ( SIZE(PLBYSVM,1) /= 0 ) THEN - IF (IRESP/=0) THEN - IF (PRESENT(PLBYSVMM)) THEN - PLBYSVM(:,:,:,JSV)=PLBYSVMM(:,:,:,JSV) - WRITE(ILUOUT,*) 'Aerosol PLBYSVM will be initialized to 0' - ELSE -!callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize aerosol PLBYSVM') - ENDIF - END IF - END IF - END IF - CASE('INIT') - IF ( SIZE(PLBXSVM,1) /= 0 ) PLBXSVM(:,:,:,JSV) = 0. - IF ( SIZE(PLBYSVM,1) /= 0 ) PLBYSVM(:,:,:,JSV) = 0. - END SELECT - END DO -END IF -! Dust scalar variables -IF (NSV_DSTEND>=NSV_DSTBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppp' - TZFIELD%CDIR = '' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_DSTBEG, NSV_DSTEND - SELECT CASE(HGETSVM(JSV)) - CASE ('READ') - IF ( KSIZELBXSV_ll /= 0 ) THEN - TZFIELD%CMNHNAME = 'LBX_'//TRIM(UPCASE(CDUSTNAMES(JSV-NSV_DSTBEG+1))) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBX' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV - CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DX,IRIMX,PLBXSVM(:,:,:,JSV),IRESP) - IF ( SIZE(PLBXSVM,1) /= 0 ) THEN - IF (IRESP/=0) THEN - IF (PRESENT(PLBXSVMM)) THEN - PLBXSVM(:,:,:,JSV)=PLBXSVMM(:,:,:,JSV) - WRITE(ILUOUT,*) 'Dust PLBXSVM will be initialized to 0' - ELSE -!callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize dust PLBXSVM') - ENDIF - END IF - END IF - END IF - ! - IF (KSIZELBYSV_ll /= 0 ) THEN - TZFIELD%CMNHNAME = 'LBY_'//TRIM(UPCASE(CDUSTNAMES(JSV-NSV_DSTBEG+1))) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBY' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV - CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DY,IRIMY,PLBYSVM(:,:,:,JSV),IRESP) - IF ( SIZE(PLBYSVM,1) /= 0 ) THEN - IF (IRESP/=0) THEN - IF (PRESENT(PLBYSVMM)) THEN - PLBYSVM(:,:,:,JSV)=PLBYSVMM(:,:,:,JSV) - WRITE(ILUOUT,*) 'Dust PLBYSVM will be initialized to 0' - ELSE -!callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize dust PLBYSVM') - ENDIF - END IF - END IF - END IF - CASE('INIT') - IF ( SIZE(PLBXSVM,1) /= 0 ) PLBXSVM(:,:,:,JSV) = 0. - IF ( SIZE(PLBYSVM,1) /= 0 ) PLBYSVM(:,:,:,JSV) = 0. - END SELECT - END DO -END IF -! -IF (NSV_DSTDEPEND>=NSV_DSTDEPBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppp' - TZFIELD%CDIR = '' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_DSTDEPBEG, NSV_DSTDEPEND - SELECT CASE(HGETSVM(JSV)) - CASE ('READ') - IF ( KSIZELBXSV_ll /= 0 ) THEN - TZFIELD%CMNHNAME = 'LBX_'//TRIM(UPCASE(CDEDSTNAMES(JSV-NSV_DSTDEPBEG+1))) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBX' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV - CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DX,IRIMX,PLBXSVM(:,:,:,JSV),IRESP) - IF ( SIZE(PLBXSVM,1) /= 0 ) THEN - IF (IRESP/=0) THEN - IF (PRESENT(PLBXSVMM)) THEN - PLBXSVM(:,:,:,JSV)=PLBXSVMM(:,:,:,JSV) - WRITE(ILUOUT,*) 'Dust Desposition PLBXSVM will be initialized to 0' - ELSE -!callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize dust PLBXSVM') - ENDIF - END IF - END IF - END IF - ! - IF (KSIZELBYSV_ll /= 0 ) THEN - TZFIELD%CMNHNAME = 'LBY_'//TRIM(UPCASE(CDEDSTNAMES(JSV-NSV_DSTDEPBEG+1))) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBY' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV - CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DY,IRIMY,PLBYSVM(:,:,:,JSV),IRESP) - IF ( SIZE(PLBYSVM,1) /= 0 ) THEN - IF (IRESP/=0) THEN - IF (PRESENT(PLBYSVMM)) THEN - PLBYSVM(:,:,:,JSV)=PLBYSVMM(:,:,:,JSV) - WRITE(ILUOUT,*) 'Dust Depoistion PLBYSVM will be initialized to 0' - ELSE - WRITE(ILUOUT,*) 'Pb to initialize dust PLBYSVM ' -!callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize dust PLBYSVM') - ENDIF - END IF - END IF - END IF - CASE('INIT') - IF ( SIZE(PLBXSVM,1) /= 0 ) PLBXSVM(:,:,:,JSV) = 0. - IF ( SIZE(PLBYSVM,1) /= 0 ) PLBYSVM(:,:,:,JSV) = 0. - END SELECT - END DO -END IF -! Sea salt scalar variables -IF (NSV_SLTEND>=NSV_SLTBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppp' - TZFIELD%CDIR = '' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_SLTBEG, NSV_SLTEND - SELECT CASE(HGETSVM(JSV)) - CASE ('READ') - IF ( KSIZELBXSV_ll /= 0 ) THEN - TZFIELD%CMNHNAME = 'LBX_'//TRIM(UPCASE(CSALTNAMES(JSV-NSV_SLTBEG+1))) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBX' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV - CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DX,IRIMX,PLBXSVM(:,:,:,JSV),IRESP) - IF ( SIZE(PLBXSVM,1) /= 0 ) THEN - IF (IRESP/=0) THEN - IF (PRESENT(PLBXSVMM)) THEN - PLBXSVM(:,:,:,JSV)=PLBXSVMM(:,:,:,JSV) - WRITE(ILUOUT,*) 'Sea Salt PLBXSVM will be initialized to 0' - ELSE -!callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize sea salt PLBXSVM') - ENDIF - END IF - END IF - END IF - ! - IF (KSIZELBYSV_ll /= 0 ) THEN - TZFIELD%CMNHNAME = 'LBY_'//TRIM(CSALTNAMES(JSV-NSV_SLTBEG+1)) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBY' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV - CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DY,IRIMY,PLBYSVM(:,:,:,JSV),IRESP) - IF ( SIZE(PLBYSVM,1) /= 0 ) THEN - IF (IRESP/=0) THEN - IF (PRESENT(PLBYSVMM)) THEN - PLBYSVM(:,:,:,JSV)=PLBYSVMM(:,:,:,JSV) - WRITE(ILUOUT,*) 'Sea Salt PLBYSVM will be initialized to 0' - ELSE -!callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize sea salt PLBYSVM') - ENDIF - END IF - END IF - END IF - CASE('INIT') - IF ( SIZE(PLBXSVM,1) /= 0 ) PLBXSVM(:,:,:,JSV) = 0. - IF ( SIZE(PLBYSVM,1) /= 0 ) PLBYSVM(:,:,:,JSV) = 0. - END SELECT - END DO -END IF -! Passive pollutant variables -IF (NSV_PPEND>=NSV_PPBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'kg kg-1' - TZFIELD%CDIR = '' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_PPBEG, NSV_PPEND - SELECT CASE(HGETSVM(JSV)) - CASE ('READ') - IF ( KSIZELBXSV_ll /= 0 ) THEN - TZFIELD%CMNHNAME = 'LBX_PP' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBX' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV - CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DX,IRIMX,PLBXSVM(:,:,:,JSV),IRESP) - IF ( SIZE(PLBXSVM,1) /= 0 ) THEN - IF (IRESP/=0) THEN - IF (PRESENT(PLBXSVMM)) THEN - PLBXSVM(:,:,:,JSV)=PLBXSVMM(:,:,:,JSV) - WRITE(ILUOUT,*) 'Passive pollutant PLBXSVM will be initialized to 0' - ELSE - PLBXSVM(:,:,:,JSV)=0. - WRITE(ILUOUT,*) 'Passive pollutant PLBXSVM will be initialized to 0' - ENDIF + CALL PRINT_MSG( NVERB_FATAL, 'IO', 'INI_LB', 'problem to initialize PLBXSVM for ' // TRIM( YMNHNAME_BASE ) ) END IF END IF END IF - ! - IF (KSIZELBYSV_ll /= 0 ) THEN - TZFIELD%CMNHNAME = 'LBY_PP' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBY' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV - CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DY,IRIMY,PLBYSVM(:,:,:,JSV),IRESP) - IF ( SIZE(PLBYSVM,1) /= 0 ) THEN - IF (IRESP/=0) THEN - IF (PRESENT(PLBYSVMM)) THEN - PLBYSVM(:,:,:,JSV)=PLBYSVMM(:,:,:,JSV) - WRITE(ILUOUT,*) 'Passive pollutant PLBYSVM will be initialized to 0' - ELSE - PLBYSVM(:,:,:,JSV)=0. - WRITE(ILUOUT,*) 'Passive pollutant PLBYSVM will be initialized to 0' - ENDIF + END IF + + IF ( KSIZELBYSV_ll /= 0 .AND. SIZE( PLBYSVM, 1 ) /= 0 ) THEN + TZFIELD%CMNHNAME = 'LBY_' // TRIM( YMNHNAME_BASE ) + TZFIELD%CLONGNAME = 'LBY_' // TRIM( YLONGNAME_BASE ) + + !Some variables were written with an other name in MesoNH < 5.6 + IF ( GOLDFILEFORMAT ) THEN + IF ( JSV >= 1 .AND. JSV <= NSV_USER ) THEN + WRITE( TZFIELD%CMNHNAME, '( A6, I3.3 )' ) 'LBYSVM',JSV + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = TRIM( TZFIELD%CMNHNAME ) + ELSE IF ( JSV >= NSV_LIMA_BEG .AND. JSV <= NSV_LIMA_END ) THEN + ! Name was corrected in MNH 5.5.1 + IF ( .NOT. GIS551 ) CALL OLD_CMNHNAME_GENERATE_INTERN( TZFIELD%CMNHNAME, TZFIELD%CLONGNAME ) + TZFIELD%CSTDNAME = '' + ELSE IF ( JSV >= NSV_PPBEG .AND. JSV <= NSV_PPEND ) THEN + TZFIELD%CMNHNAME = 'LBY_PP' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'LBY_PP' + IF ( JSV == NSV_PPBEG .AND. NSV_PP > 1 ) THEN + CMNHMSG(1) = 'reading older file (<5.6) for LBY_PP scalar variables' + CMNHMSG(2) = 'they are bugged: there should be several LBY_PP variables' + CMNHMSG(3) = 'but they were all written with the same name ''LBY_PP''' + CALL PRINT_MSG( NVERB_WARNING, 'IO', 'INI_LB' ) END IF - END IF - END IF - CASE('INIT') - IF ( SIZE(PLBXSVM,1) /= 0 ) PLBXSVM(:,:,:,JSV) = 0. - IF ( SIZE(PLBYSVM,1) /= 0 ) PLBYSVM(:,:,:,JSV) = 0. - END SELECT - END DO -END IF #ifdef MNH_FOREFIRE -! ForeFire scalar variables -IF (NSV_FFEND>=NSV_FFBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'kg kg-1' - TZFIELD%CDIR = '' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_FFBEG, NSV_FFEND - SELECT CASE(HGETSVM(JSV)) - CASE ('READ') - IF ( KSIZELBXSV_ll /= 0 ) THEN - TZFIELD%CMNHNAME = 'LBX_FF' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBX' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV - CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DX,IRIMX,PLBXSVM(:,:,:,JSV),IRESP) - WRITE(ILUOUT,*) 'ForeFire LBX_FF ', IRESP - IF ( SIZE(PLBXSVM,1) /= 0 ) THEN - IF (IRESP/=0) THEN - IF (PRESENT(PLBXSVMM)) THEN - PLBXSVM(:,:,:,JSV)=PLBXSVMM(:,:,:,JSV) - WRITE(ILUOUT,*) 'ForeFire pollutant PLBXSVM will be initialized to 0' - ELSE - PLBXSVM(:,:,:,JSV)=0. - WRITE(ILUOUT,*) 'ForeFire pollutant PLBXSVM will be initialized to 0' - ENDIF + ELSE IF ( JSV >= NSV_FFBEG .AND. JSV <= NSV_FFEND ) THEN + TZFIELD%CMNHNAME = 'LBY_FF' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'LBY_FF' + IF ( JSV == NSV_FFBEG .AND. NSV_FF > 1 ) THEN + CMNHMSG(1) = 'reading older file (<5.6) for LBY_FF scalar variables' + CMNHMSG(2) = 'they are bugged: there should be several LBY_FF variables' + CMNHMSG(3) = 'but they were all written with the same name ''LBY_FF''' + CALL PRINT_MSG( NVERB_WARNING, 'IO', 'INI_LB' ) END IF - END IF - END IF - ! - IF (KSIZELBYSV_ll /= 0 ) THEN - TZFIELD%CMNHNAME = 'LBY_FF' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBY' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV - CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DY,IRIMY,PLBYSVM(:,:,:,JSV),IRESP) - IF ( SIZE(PLBYSVM,1) /= 0 ) THEN - IF (IRESP/=0) THEN - IF (PRESENT(PLBYSVMM)) THEN - PLBYSVM(:,:,:,JSV)=PLBYSVMM(:,:,:,JSV) - WRITE(ILUOUT,*) 'ForeFire scalar variable PLBYSVM will be initialized to 0' - ELSE - PLBYSVM(:,:,:,JSV)=0. - WRITE(ILUOUT,*) 'ForeFire scalar variable PLBYSVM will be initialized to 0' - ENDIF - END IF - END IF - END IF - CASE('INIT') - IF ( SIZE(PLBXSVM,1) /= 0 ) PLBXSVM(:,:,:,JSV) = 0. - IF ( SIZE(PLBYSVM,1) /= 0 ) PLBYSVM(:,:,:,JSV) = 0. - END SELECT - END DO -END IF #endif -! Conditional sampling variables -IF (NSV_CSEND>=NSV_CSBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'kg kg-1' - TZFIELD%CDIR = '' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_CSBEG, NSV_CSEND - SELECT CASE(HGETSVM(JSV)) - CASE ('READ') - IF ( KSIZELBXSV_ll /= 0 ) THEN - TZFIELD%CMNHNAME = 'LBX_CS' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBX' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV - CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DX,IRIMX,PLBXSVM(:,:,:,JSV),IRESP) - IF ( SIZE(PLBXSVM,1) /= 0 ) THEN - IF (IRESP/=0) THEN - IF (PRESENT(PLBXSVMM)) THEN - PLBXSVM(:,:,:,JSV)=PLBXSVMM(:,:,:,JSV) - WRITE(ILUOUT,*) 'Conditional sampling LBXSVM will be initialized to 0' - ELSE - PLBXSVM(:,:,:,JSV)=0. - WRITE(ILUOUT,*) 'Conditional sampling PLBXSVM will be initialized to 0' - ENDIF - END IF - END IF - END IF - ! - IF (KSIZELBYSV_ll /= 0 ) THEN - TZFIELD%CMNHNAME = 'LBY_CS' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBY' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV - CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DY,IRIMY,PLBYSVM(:,:,:,JSV),IRESP) - IF ( SIZE(PLBYSVM,1) /= 0 ) THEN - IF (IRESP/=0) THEN - IF (PRESENT(PLBYSVMM)) THEN - PLBYSVM(:,:,:,JSV)=PLBYSVMM(:,:,:,JSV) - WRITE(ILUOUT,*) 'Conditional sampling PLBYSVM will be initialized to 0' - ELSE - PLBYSVM(:,:,:,JSV)=0. - WRITE(ILUOUT,*) 'Conditional sampling PLBYSVM will be initialized to 0' - ENDIF - END IF - END IF - END IF - CASE('INIT') - IF ( SIZE(PLBXSVM,1) /= 0 ) PLBXSVM(:,:,:,JSV) = 0. - IF ( SIZE(PLBYSVM,1) /= 0 ) PLBYSVM(:,:,:,JSV) = 0. - END SELECT - END DO -END IF -! Linox scalar variables -IF (NSV_LNOXEND>=NSV_LNOXBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'kg kg-1' - TZFIELD%CDIR = '' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_LNOXBEG, NSV_LNOXEND - SELECT CASE(HGETSVM(JSV)) - CASE ('READ') - IF ( KSIZELBXSV_ll /= 0 ) THEN - TZFIELD%CMNHNAME = 'LBX_LINOX' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBX' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV - CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DX,IRIMX,PLBXSVM(:,:,:,JSV),IRESP) - IF ( SIZE(PLBXSVM,1) /= 0 ) THEN - IF (IRESP/=0) THEN - IF (PRESENT(PLBXSVMM)) THEN - PLBXSVM(:,:,:,JSV)=PLBXSVMM(:,:,:,JSV) - WRITE(ILUOUT,*) 'Linox PLBXSVM will be initialized to 0' - ELSE -!callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize linox PLBXSVM') - ENDIF + ELSE IF ( JSV >= NSV_CSBEG .AND. JSV <= NSV_CSEND ) THEN + TZFIELD%CMNHNAME = 'LBY_CS' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'LBY_CS' + IF ( JSV == NSV_CSBEG .AND. NSV_CS > 1 ) THEN + CMNHMSG(1) = 'reading older file (<5.6) for LBY_CS scalar variables' + CMNHMSG(2) = 'they are bugged: there should be several LBY_CS variables' + CMNHMSG(3) = 'but they were all written with the same name ''LBY_CS''' + CALL PRINT_MSG( NVERB_WARNING, 'IO', 'INI_LB' ) END IF END IF END IF - ! - IF (KSIZELBYSV_ll /= 0 ) THEN - TZFIELD%CMNHNAME = 'LBY_LINOX' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBY' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV - CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DY,IRIMY,PLBYSVM(:,:,:,JSV),IRESP) - IF ( SIZE(PLBYSVM,1) /= 0 ) THEN - IF (IRESP/=0) THEN - IF (PRESENT(PLBYSVMM)) THEN - PLBYSVM(:,:,:,JSV)=PLBYSVMM(:,:,:,JSV) - WRITE(ILUOUT,*) 'Linox PLBYSVM will be initialized to 0' - ELSE -!calla bortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize linox PLBYSVM') - ENDIF - END IF - END IF - END IF - CASE('INIT') - IF ( SIZE(PLBXSVM,1) /= 0 ) PLBXSVM(:,:,:,JSV) = 0. - IF ( SIZE(PLBYSVM,1) /= 0 ) PLBYSVM(:,:,:,JSV) = 0. - END SELECT - END DO -END IF -! Lagrangian variables -IF (NSV_LGEND>=NSV_LGBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'm' - TZFIELD%CDIR = '' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_LGBEG, NSV_LGEND - SELECT CASE(HGETSVM(JSV)) - CASE ('READ') - IF ( KSIZELBXSV_ll /= 0 ) THEN - TZFIELD%CMNHNAME = 'LBX_'//TRIM(CLGNAMES(JSV-NSV_LGBEG+1)) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBX' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV - CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DX,IRIMX,PLBXSVM(:,:,:,JSV),IRESP) - IF ( SIZE(PLBXSVM,1) /= 0 ) THEN - IF (IRESP/=0) THEN - IF (PRESENT(PLBXSVMM)) THEN - PLBXSVM(:,:,:,JSV)=PLBXSVMM(:,:,:,JSV) - WRITE(ILUOUT,*) 'lagrangian PLBXSVM will be initialized to 0' - ELSE -!callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize lagrangian PLBXSVM') - ENDIF - END IF - END IF - END IF - ! - IF (KSIZELBYSV_ll /= 0 ) THEN - TZFIELD%CMNHNAME = 'LBY_'//TRIM(CLGNAMES(JSV-NSV_LGBEG+1)) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBY' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV - CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DY,IRIMY,PLBYSVM(:,:,:,JSV),IRESP) - IF ( SIZE(PLBYSVM,1) /= 0 ) THEN - IF (IRESP/=0) THEN - IF (PRESENT(PLBYSVMM)) THEN - PLBYSVM(:,:,:,JSV)=PLBYSVMM(:,:,:,JSV) - WRITE(ILUOUT,*) 'lagrangian PLBYSVM will be initialized to 0' - ELSE -!callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize lagrangian PLBYSVM') - ENDIF + WRITE( TZFIELD%CCOMMENT, '( A6, A6, I3.3 )' ) 'X_2_Z_', 'LBYSVM', JSV + TZFIELD%CLBTYPE = 'LBY' + + CALL IO_Field_read_lb( TPINIFILE, TZFIELD, IL3DY, IRIMY, PLBYSVM(:,:,:,JSV), IRESP ) + + IF ( IRESP /= 0 ) THEN + IF ( PRESENT( PLBYSVMM ) ) THEN + PLBYSVM(:,:,:,JSV) = PLBYSVMM(:,:,:,JSV) + CALL PRINT_MSG( NVERB_INFO, 'IO', 'INI_LB', 'PLBYSVM is initialized to PLBYSVMM for ' // TRIM( YMNHNAME_BASE ) ) + ELSE + IF ( GOLDFILEFORMAT .AND. JSV >= NSV_LIMA_BEG .AND. JSV <= NSV_LIMA_END ) THEN + !In pre 5.6 files, only CCN_FREE and IFN_FREE LIMA scalar variables were available (for LIMA scalar variables) + IF ( JSV >= NSV_LIMA_CCN_FREE .AND. JSV <= (NSV_LIMA_CCN_FREE+NMOD_CCN-1) ) THEN + CALL PRINT_MSG( NVERB_FATAL, 'IO', 'INI_LB', 'problem to initialize LIMA CCN_FREE PLBYSVM' ) + ELSE IF ( JSV >= NSV_LIMA_IFN_FREE .AND. JSV <= (NSV_LIMA_IFN_FREE+NMOD_IFN-1) ) THEN + CALL PRINT_MSG( NVERB_FATAL, 'IO', 'INI_LB', 'problem to initialize LIMA IFN_FREE PLBYSVM' ) + ELSE + PLBYSVM(:,:,:,JSV) = 0. + CALL PRINT_MSG( NVERB_WARNING, 'IO', 'INI_LB', 'PLBYSVM is initialized to 0 for ' // TRIM( YMNHNAME_BASE ) ) + END IF + ELSE IF ( ( JSV >= NSV_PPBEG .AND. JSV <= NSV_PPEND ) .OR. & +#ifdef MNH_FOREFIRE + ( JSV >= NSV_FFBEG .AND. JSV <= NSV_FFEND ) .OR. & +#endif + ( JSV >= NSV_CSBEG .AND. JSV <= NSV_CSEND ) .OR. & + ( JSV >= NSV_SNWBEG .AND. JSV <= NSV_SNWEND .AND. GOLDFILEFORMAT ) ) THEN !Snow was not written in <5.6 + PLBYSVM(:,:,:,JSV) = 0. + CALL PRINT_MSG( NVERB_WARNING, 'IO', 'INI_LB', 'PLBYSVM is initialized to 0 for ' // TRIM( YMNHNAME_BASE ) ) + ELSE + CALL PRINT_MSG( NVERB_FATAL, 'IO', 'INI_LB', 'problem to initialize PLBYSVM for ' // TRIM( YMNHNAME_BASE ) ) END IF END IF END IF - ! - CASE('INIT') - IF ( SIZE(PLBXSVM,1) /= 0 ) PLBXSVM(:,:,:,JSV) = 0. - IF ( SIZE(PLBYSVM,1) /= 0 ) PLBYSVM(:,:,:,JSV) = 0. - END SELECT - END DO -END IF + END IF + + CASE( 'INIT' ) + IF ( SIZE(PLBXSVM,1) /= 0 ) PLBXSVM(:,:,:,JSV) = 0. + IF ( SIZE(PLBYSVM,1) /= 0 ) PLBYSVM(:,:,:,JSV) = 0. + END SELECT +END DO !------------------------------------------------------------------------------- ! !* 3. COMPUTE THE LB SOURCES @@ -1661,4 +713,32 @@ IF (OLSOURCE) THEN ! ENDIF ! +CONTAINS + + SUBROUTINE OLD_CMNHNAME_GENERATE_INTERN( YMNHNAME, YLONGNAME ) + + CHARACTER(LEN=*), INTENT(INOUT) :: YMNHNAME + CHARACTER(LEN=*), INTENT(INOUT) :: YLONGNAME + + INTEGER :: IPOS + INTEGER :: JI + + !Try to generate CMNHNAME with old format + !In the old format, an indice of 2 numbers was written after the name but without trimming it + IPOS = SCAN( YMNHNAME, '0123456789' ) + + !Unmodified part YMNHNAME(1:IPOS-1) = YMNHNAME(1:IPOS-1) + + !Move number part at the new end + IF ( 4+JPSVNAMELGTMAX+2 > LEN( YMNHNAME ) ) & + CALL PRINT_MSG(NVERB_FATAL,'GEN','OLD_CMNHNAME_GENERATE_INTERN','CMNHNAME too small') + YMNHNAME(4+JPSVNAMELGTMAX+1 : 4+JPSVNAMELGTMAX+2) = YMNHNAME(IPOS : IPOS+1) + DO JI = IPOS, 4+JPSVNAMELGTMAX + YMNHNAME(JI:JI) = ' ' + END DO + + YLONGNAME = TRIM( YMNHNAME ) + + END SUBROUTINE OLD_CMNHNAME_GENERATE_INTERN + END SUBROUTINE INI_LB diff --git a/src/MNH/ini_les_cart_maskn.f90 b/src/MNH/ini_les_cart_maskn.f90 index a3e9c7840171d597857e56403768981a86b0ff4a..822d415819808cb29a27cf69f9a6d16f5b3ea9e1 100644 --- a/src/MNH/ini_les_cart_maskn.f90 +++ b/src/MNH/ini_les_cart_maskn.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2000-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2000-2022 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. @@ -93,9 +93,6 @@ INTEGER, INTENT(OUT) :: KLES_JSUP ! ! 0.2 declaration of local variables ! ! -INTEGER :: IIMAX_ll ! total physical father domain I size -INTEGER :: IJMAX_ll ! total physical father domain J size -! INTEGER :: IIB_ll ! son domain index INTEGER :: IIE_ll ! son domain index INTEGER :: IJB_ll ! son domain index @@ -103,12 +100,12 @@ INTEGER :: IJE_ll ! son domain index ! INTEGER :: JI, JJ ! loop counters ! -REAL :: ZX, ZY ! coordinates of msak boundaries +REAL :: ZX, ZY ! coordinates of mask boundaries ! -INTEGER :: IINFO_ll, IRESP +INTEGER :: IINFO_ll ! -REAL, DIMENSION(:), ALLOCATABLE :: ZXHAT_ll ! father model coordinates -REAL, DIMENSION(:), ALLOCATABLE :: ZYHAT_ll ! +REAL, DIMENSION(:), POINTER :: ZXHAT_ll ! father model coordinates +REAL, DIMENSION(:), POINTER :: ZYHAT_ll ! INTEGER :: IMI ! IMI = GET_CURRENT_MODEL_INDEX() @@ -118,11 +115,8 @@ IMI = GET_CURRENT_MODEL_INDEX() ! -------------------------- ! CALL GO_TOMODEL_ll(IMI, IINFO_ll) -CALL GET_GLOBALDIMS_ll(IIMAX_ll,IJMAX_ll) -ALLOCATE(ZXHAT_ll(IIMAX_ll+ 2 * JPHEXT)) -ALLOCATE(ZYHAT_ll(IJMAX_ll+ 2 * JPHEXT)) -CALL GATHERALL_FIELD_ll('XX',XXHAT,ZXHAT_ll,IRESP) -CALL GATHERALL_FIELD_ll('YY',XYHAT,ZYHAT_ll,IRESP) +ZXHAT_ll => XXHAT_ll +ZYHAT_ll => XYHAT_ll ! CALL GO_TOMODEL_ll(KMI, IINFO_ll) ! @@ -208,9 +202,6 @@ ELSE END IF ! !------------------------------------------------------------------------------- -DEALLOCATE(ZXHAT_ll) -DEALLOCATE(ZYHAT_ll) -!------------------------------------------------------------------------------- ! CONTAINS ! @@ -219,8 +210,6 @@ DEALLOCATE(ZYHAT_ll) KLES_ISUP=IIE_ll-JPHEXT KLES_JINF=IJB_ll-JPHEXT KLES_JSUP=IJE_ll-JPHEXT - DEALLOCATE(ZXHAT_ll) - DEALLOCATE(ZYHAT_ll) END SUBROUTINE MASK_OVER_ALL_DOMAIN ! END SUBROUTINE INI_LES_CART_MASK_n diff --git a/src/MNH/ini_lesn.f90 b/src/MNH/ini_lesn.f90 index 378e43f533ddc33eac977c0cc9a82b5b9e72e6be..7caf12b44211de2f69700fbab021a42486aa40a7 100644 --- a/src/MNH/ini_lesn.f90 +++ b/src/MNH/ini_lesn.f90 @@ -46,8 +46,6 @@ !* 0. DECLARATIONS ! ------------ ! -USE MODE_ll -USE MODE_GATHER_ll USE MODE_MSG USE MODE_MODELN_HANDLER ! @@ -90,25 +88,20 @@ IMPLICIT NONE ! INTEGER :: ILUOUT, IRESP INTEGER :: JI,JJ, JK ! loop counters -INTEGER :: IIU_ll ! total domain I size -INTEGER :: IJU_ll ! total domain J size -INTEGER :: IIMAX_ll ! total physical domain I size -INTEGER :: IJMAX_ll ! total physical domain J size ! REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZZ_LES ! LES altitudes 3D array REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZZ_SPEC! " for spectra ! ! -REAL, DIMENSION(:), ALLOCATABLE :: ZXHAT_ll ! father model coordinates -REAL, DIMENSION(:), ALLOCATABLE :: ZYHAT_ll ! +REAL, DIMENSION(:), POINTER :: ZXHAT_ll ! father model coordinates +REAL, DIMENSION(:), POINTER :: ZYHAT_ll ! INTEGER :: IMI ! !------------------------------------------------------------------------------- IMI = GET_CURRENT_MODEL_INDEX() ! -CALL GET_GLOBALDIMS_ll(IIMAX_ll,IJMAX_ll) -IIU_ll = IIMAX_ll+2*JPHEXT -IJU_ll = IJMAX_ll+2*JPHEXT +ZXHAT_ll => NULL() +ZYHAT_ll => NULL() ! ILUOUT = TLUOUT%NLU ! @@ -208,19 +201,14 @@ IF (IMI==1) THEN ! ----------------------------------------------------- ! ELSE - ALLOCATE(ZXHAT_ll(IIU_ll)) - ALLOCATE(ZYHAT_ll(IJU_ll)) - CALL GATHERALL_FIELD_ll('XX',XXHAT,ZXHAT_ll,IRESP) - CALL GATHERALL_FIELD_ll('YY',XYHAT,ZYHAT_ll,IRESP) + ZXHAT_ll => XXHAT_ll !Use current (IMI) model XXHAT_ll + ZYHAT_ll => XYHAT_ll ! CALL GOTO_MODEL(NDAD(IMI)) CALL INI_LES_CART_MASK_n(IMI,ZXHAT_ll,ZYHAT_ll, & NLESn_IINF(IMI),NLESn_JINF(IMI), & NLESn_ISUP(IMI),NLESn_JSUP(IMI) ) CALL GOTO_MODEL(IMI) -! - DEALLOCATE(ZXHAT_ll) - DEALLOCATE(ZYHAT_ll) END IF ! !* in non cyclic boundary conditions, limitiation of masks due to u and v grids diff --git a/src/MNH/ini_lg.f90 b/src/MNH/ini_lg.f90 index 0ce0d7b1b535d813371881bfc2daf5d6b968aae2..8f5428cae1f9421a238f4c35a74b69ff17b81544 100644 --- a/src/MNH/ini_lg.f90 +++ b/src/MNH/ini_lg.f90 @@ -1,24 +1,19 @@ -!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2001-2022 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 version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. !----------------------------------------------------------------- -!--------------- special set of characters for RCS information -!----------------------------------------------------------------- -! $Source$ $Revision$ -! MASDEV4_7 init 2006/05/18 13:07:25 -!----------------------------------------------------------------- ! ################## MODULE MODI_INI_LG ! ################## INTERFACE ! - SUBROUTINE INI_LG(PXHAT,PYHAT,PZZ,PSVT,PLBXSVM,PLBYSVM) + SUBROUTINE INI_LG( PXHATM, PYHATM, PZZ, PSVT, PLBXSVM, PLBYSVM ) ! -REAL,DIMENSION(:), INTENT(IN) :: PXHAT,PYHAT ! Positions x,y in the cartesian plane -REAL,DIMENSION(:,:,:), INTENT(IN) :: PZZ ! True altitude of the w grid-point -REAL,DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVT ! scalar var. at t -REAL,DIMENSION(:,:,:,:), INTENT(INOUT) :: PLBXSVM,PLBYSVM ! LB in x and y-dir. +REAL, DIMENSION(:), INTENT(IN) :: PXHATM, PYHATM ! Positions x,y in the cartesian plane at mass points +REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! True altitude of the w grid-point +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVT ! scalar var. at t +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PLBXSVM, PLBYSVM ! LB in x and y-dir. ! END SUBROUTINE INI_LG ! @@ -28,9 +23,9 @@ END MODULE MODI_INI_LG ! ! ! -! ############################################################ - SUBROUTINE INI_LG(PXHAT,PYHAT,PZZ,PSVT,PLBXSVM,PLBYSVM) -! ############################################################ +! ################################################################ + SUBROUTINE INI_LG( PXHATM, PYHATM, PZZ, PSVT, PLBXSVM, PLBYSVM ) +! ################################################################ ! !!**** *INI_LG* - routine to initialize lagrangian variables !! @@ -78,10 +73,10 @@ IMPLICIT NONE ! !* 0.1 declarations of argument ! -REAL,DIMENSION(:), INTENT(IN) :: PXHAT,PYHAT ! Positions x,y in the cartesian plane -REAL,DIMENSION(:,:,:), INTENT(IN) :: PZZ ! True altitude of the w grid-point -REAL,DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVT ! scalar var. at t -REAL,DIMENSION(:,:,:,:), INTENT(INOUT) :: PLBXSVM,PLBYSVM ! LB in x and y-dir. +REAL, DIMENSION(:), INTENT(IN) :: PXHATM, PYHATM ! Positions x,y in the cartesian plane at mass points +REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! True altitude of the w grid-point +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVT ! scalar var. at t +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PLBXSVM, PLBYSVM ! LB in x and y-dir. ! ! !* 0.2 declarations of local variables @@ -103,7 +98,7 @@ IKU=SIZE(PZZ,3) DO JK=1,IKU DO JJ=1,IJU DO JI=1,IIU-1 - PSVT(JI,JJ,JK,NSV_LGBEG)=0.5*(PXHAT(JI)+PXHAT(JI+1)) + PSVT(JI,JJ,JK,NSV_LGBEG)=PXHATM(JI) END DO PSVT(IIU,JJ,JK,NSV_LGBEG)=2.*PSVT(IIU-1,JJ,JK,NSV_LGBEG)-PSVT(IIU-2,JJ,JK,NSV_LGBEG) END DO @@ -112,7 +107,7 @@ END DO DO JK=1,IKU DO JI=1,IIU DO JJ=1,IJU-1 - PSVT(JI,JJ,JK,NSV_LGBEG+1)=0.5*(PYHAT(JJ)+PYHAT(JJ+1)) + PSVT(JI,JJ,JK,NSV_LGBEG+1)=PYHATM(JJ) END DO PSVT(JI,IJU,JK,NSV_LGBEG+1)=2.*PSVT(JI,IJU-1,JK,NSV_LGBEG+1)-PSVT(JI,IJU-2,JK,NSV_LGBEG+1) END DO diff --git a/src/MNH/ini_modeln.f90 b/src/MNH/ini_modeln.f90 index fa29732f1731151599363366ff3e81c5ee736468..b6aacf7b131235b19427aa4ace8d8e08f9d96573 100644 --- a/src/MNH/ini_modeln.f90 +++ b/src/MNH/ini_modeln.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1994-2023 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. @@ -395,6 +395,7 @@ use MODD_SALT_OPT_LKT, only: NMAX_RADIUS_LKT_SALT=>NMAX_RADIUS_LKT, NMAX_SI USE MODD_SERIES, only: LSERIES USE MODD_SHADOWS_n USE MODD_STAND_ATM, only: XSTROATM, XSMLSATM, XSMLWATM, XSPOSATM, XSPOWATM +USE MODD_SURF_PAR, only: XUNDEF_SFX => XUNDEF USE MODD_TIME USE MODD_TIME_n USE MODD_TURB_CLOUD, only: NMODEL_CLOUD, CTURBLEN_CLOUD,XCEI @@ -402,6 +403,7 @@ USE MODD_TURB_n USE MODD_VAR_ll, only: IP USE MODE_GATHER_ll +USE MODE_INI_AIRCRAFT_BALLOON, only: INI_AIRCRAFT_BALLOON use mode_ini_budget, only: Budget_preallocate, Ini_budget USE MODE_INI_ONE_WAY_n USE MODE_IO @@ -412,6 +414,7 @@ USE MODE_ll USE MODE_MODELN_HANDLER USE MODE_MPPDB USE MODE_MSG +USE MODE_SET_GRID USE MODE_SPLITTINGZ_ll, only: GET_DIM_EXTZ_ll USE MODE_TYPE_ZDIFFU USE MODE_FIELD, ONLY: INI_FIELD_LIST @@ -429,8 +432,6 @@ USE MODI_INI_AEROSET3 USE MODI_INI_AEROSET4 USE MODI_INI_AEROSET5 USE MODI_INI_AEROSET6 -USE MODI_INI_AIRCRAFT_BALLOON -USE MODI_INI_AIRCRAFT_BALLOON USE MODI_INI_BIKHARDT_n USE MODI_INI_CPL USE MODI_INI_DEEP_CONVECTION @@ -463,7 +464,6 @@ USE MODI_MNHGET_SURF_PARAM_n USE MODI_MNHREAD_ZS_DUMMY_n USE MODI_READ_FIELD USE MODI_SET_DIRCOS -USE MODI_SET_GRID USE MODI_SET_REF #ifdef CPLOASIS USE MODI_SFX_OASIS_READ_NAM @@ -1023,10 +1023,13 @@ ALLOCATE(XXHAT(IIU)) ALLOCATE(XDXHAT(IIU)) ALLOCATE(XYHAT(IJU)) ALLOCATE(XDYHAT(IJU)) +ALLOCATE(XXHATM(IIU)) +ALLOCATE(XYHATM(IJU)) ALLOCATE(XZS(IIU,IJU)) ALLOCATE(XZSMT(IIU,IJU)) ALLOCATE(XZZ(IIU,IJU,IKU)) ALLOCATE(XZHAT(IKU)) +ALLOCATE(XZHATM(IKU)) ALLOCATE(XDIRCOSZW(IIU,IJU)) ALLOCATE(XDIRCOSXW(IIU,IJU)) ALLOCATE(XDIRCOSYW(IIU,IJU)) @@ -1513,7 +1516,7 @@ IF (CRAD /= 'NONE') THEN ALLOCATE(XDIR_ALB(IIU,IJU,NSWB_MNH)) ALLOCATE(XSCA_ALB(IIU,IJU,NSWB_MNH)) ALLOCATE(XEMIS (IIU,IJU,NLWB_MNH)) - ALLOCATE(XTSRAD (IIU,IJU)) ; XTSRAD = 0.0 + ALLOCATE(XTSRAD (IIU,IJU)) ; XTSRAD = XUNDEF_SFX ALLOCATE(XSEA (IIU,IJU)) ALLOCATE(XZS_XY (IIU,IJU)) ALLOCATE(NCLEARCOL_TM1(IIU,IJU)) @@ -1874,13 +1877,15 @@ END IF !* 7. INITIALIZE GRIDS AND METRIC COEFFICIENTS ! ---------------------------------------- ! -CALL SET_GRID(KMI,TPINIFILE,IKU,NIMAX_ll,NJMAX_ll, & - XTSTEP,XSEGLEN, & - XLONORI,XLATORI,XLON,XLAT, & - XXHAT,XYHAT,XDXHAT,XDYHAT, XMAP, & - XZS,XZZ,XZHAT,XZTOP,LSLEVE,XLEN1,XLEN2,XZSMT, & - ZJ, & - TDTMOD,TDTCUR,NSTOP,NBAK_NUMB,NOUT_NUMB,TBACKUPN,TOUTPUTN) +CALL SET_GRID( KMI, TPINIFILE, IKU, NIMAX_ll, NJMAX_ll, & + XTSTEP, XSEGLEN, & + XLONORI, XLATORI, XLON, XLAT, & + XXHAT, XYHAT, XDXHAT, XDYHAT, XXHATM, XYHATM, & + XXHAT_ll, XYHAT_ll, XXHATM_ll, XYHATM_ll, & + XHAT_BOUND, XHATM_BOUND, & + XMAP, XZS, XZZ, XZHAT, XZHATM, XZTOP, LSLEVE, & + XLEN1, XLEN2, XZSMT, ZJ, & + TDTMOD, TDTCUR, NSTOP, NBAK_NUMB, NOUT_NUMB, TBACKUPN, TOUTPUTN ) ! CALL METRICS(XMAP,XDXHAT,XDYHAT,XZZ,XDXX,XDYY,XDZX,XDZY,XDZZ) ! @@ -2158,10 +2163,10 @@ CALL READ_FIELD(KMI,TPINIFILE,IIU,IJU,IKU, & ! --------------------------- ! ! -CALL SET_REF(KMI,TPINIFILE, & - XZZ,XZHAT,ZJ,XDXX,XDYY,CLBCX,CLBCY, & - XREFMASS,XMASS_O_PHI0,XLINMASS, & - XRHODREF,XTHVREF,XRVREF,XEXNREF,XRHODJ ) +CALL SET_REF( KMI, TPINIFILE, & + XZZ, XZHATM, ZJ, XDXX, XDYY, CLBCX, CLBCY, & + XREFMASS, XMASS_O_PHI0, XLINMASS, & + XRHODREF, XTHVREF, XRVREF, XEXNREF, XRHODJ ) ! !------------------------------------------------------------------------------- ! @@ -2413,7 +2418,7 @@ END IF ! ------------------------------- ! IF (LLG .AND. LINIT_LG .AND. CPROGRAM=='MESONH') & - CALL INI_LG(XXHAT,XYHAT,XZZ,XSVT,XLBXSVM,XLBYSVM) + CALL INI_LG( XXHATM, XYHATM, XZZ, XSVT, XLBXSVM, XLBYSVM ) ! !------------------------------------------------------------------------------- @@ -2422,7 +2427,7 @@ IF (LLG .AND. LINIT_LG .AND. CPROGRAM=='MESONH') & ! ------------------------------------------ ! CALL INI_DYNAMICS(XLON,XLAT,XRHODJ,XTHVREF,XMAP,XZZ,XDXHAT,XDYHAT, & - XZHAT,CLBCX,CLBCY,XTSTEP, & + XZHAT,XZHATM,CLBCX,CLBCY,XTSTEP, & LVE_RELAX,LVE_RELAX_GRD,LHORELAX_UVWTH,LHORELAX_RV, & LHORELAX_RC,LHORELAX_RR,LHORELAX_RI,LHORELAX_RS,LHORELAX_RG, & LHORELAX_RH,LHORELAX_TKE,LHORELAX_SV, & @@ -2485,15 +2490,11 @@ IF (CRAD /= 'NONE') THEN IF (GINIRAD) CALL SUNPOS_n(XZENITH,PAZIMSOL=XAZIM) CALL SURF_SOLAR_GEOM (XZS, XZS_XY) ! - ALLOCATE(XXHAT_ll (IIU_ll)) - ALLOCATE(XYHAT_ll (IJU_ll)) ALLOCATE(XZS_ll (IIU_ll,IJU_ll)) ALLOCATE(XZS_XY_ll (IIU_ll,IJU_ll)) ! CALL GATHERALL_FIELD_ll('XY',XZS,XZS_ll,IRESP) CALL GATHERALL_FIELD_ll('XY',XZS_XY,XZS_XY_ll,IRESP) - CALL GATHERALL_FIELD_ll('XX',XXHAT,XXHAT_ll,IRESP) - CALL GATHERALL_FIELD_ll('YY',XYHAT,XYHAT_ll,IRESP) XZS_MAX_ll=MAXVAL(XZS_ll) ELSE XAZIM = XPI @@ -2781,27 +2782,21 @@ DEALLOCATE(XSPOWATM) !* 23. BALLOON and AIRCRAFT initializations ! ------------------------------------ ! -CALL INI_AIRCRAFT_BALLOON(TPINIFILE,XTSTEP, TDTSEG, XSEGLEN, NRR, NSV, & - IKU,CTURB=="TKEL" , & - XLATORI, XLONORI ) +CALL INI_AIRCRAFT_BALLOON( TPINIFILE, XLATORI, XLONORI ) ! !------------------------------------------------------------------------------- ! !* 24. STATION initializations ! ----------------------- ! -CALL INI_SURFSTATION_n(XTSTEP, XSEGLEN, NRR, NSV, & - CTURB=="TKEL" , KMI, & - XLATORI, XLONORI ) +CALL INI_SURFSTATION_n( ) ! !------------------------------------------------------------------------------- ! !* 25. PROFILER initializations ! ------------------------ ! -CALL INI_POSPROFILER_n(XTSTEP, XSEGLEN, NRR, NSV, & - CTURB=="TKEL", & - XLATORI, XLONORI ) +CALL INI_POSPROFILER_n( ) ! !------------------------------------------------------------------------------- ! diff --git a/src/MNH/ini_nsv.f90 b/src/MNH/ini_nsv.f90 index 2b29b251ca2f9349f74051b902db0c45efc5f9b6..86df18e2614f50b85e35d7a540fbdcd686e825fd 100644 --- a/src/MNH/ini_nsv.f90 +++ b/src/MNH/ini_nsv.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2001-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2001-2022 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. @@ -67,19 +67,21 @@ END MODULE MODI_INI_NSV !! Modification 07/2017 (V. Vionnet) Add blowing snow condition ! P. Wautelet 09/03/2021: move some chemistry initializations to ini_nsv ! P. Wautelet 10/03/2021: move scalar variable name initializations to ini_nsv -! P. Wautelet 10/03/2021: add CSVNAMES and CSVNAMES_A to store the name of all the scalar variables ! P. Wautelet 30/03/2021: move NINDICE_CCN_IMM and NIMM initializations from init_aerosol_properties to ini_nsv ! B. Vie 06/2021: add prognostic supersaturation for LIMA +! P. Wautelet 26/11/2021: initialize TSVLIST_A ! A. Costes 12/2021: smoke tracer for fire model -!! +! P. Wautelet 14/01/2022: add CSV_CHEM_LIST(_A) to store the list of all chemical variables +! + NSV_CHEM_LIST(_A) the size of the list !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ ! USE MODD_BLOWSNOW, ONLY: CSNOWNAMES, LBLOWSNOW, NBLOWSNOW3D, YPSNOW_INI -USE MODD_CH_AEROSOL, ONLY: CAERONAMES, CDEAERNAMES, JPMODE, LAERINIT, LDEPOS_AER, LORILAM, & - LVARSIGI, LVARSIGJ, NCARB, NM6_AER, NSOA, NSP +USE MODD_CH_AEROSOL +! USE MODD_CH_AEROSOL, ONLY: CAERONAMES, CDEAERNAMES, JPMODE, LAERINIT, LDEPOS_AER, LORILAM, & +! LVARSIGI, LVARSIGJ, NCARB, NM6_AER, NSOA, NSP USE MODD_CH_M9_n, ONLY: CICNAMES, CNAMES, NEQ, NEQAQ USE MODD_CH_MNHC_n, ONLY: LCH_PH, LUSECHEM, LUSECHAQ, LUSECHIC, CCH_SCHEME, LCH_CONV_LINOX USE MODD_CONDSAMP, ONLY: LCONDSAMP, NCONDSAMP @@ -89,7 +91,7 @@ USE MODD_DIAG_FLAG, ONLY: LCHEMDIAG, LCHAQDIAG USE MODD_DUST, ONLY: CDEDSTNAMES, CDUSTNAMES, JPDUSTORDER, LDEPOS_DST, LDSTINIT, LDSTPRES, LDUST, & LRGFIX_DST, LVARSIG, NMODE_DST, YPDEDST_INI, YPDUST_INI USE MODD_DYN_n, ONLY: LHORELAX_SV,LHORELAX_SVC2R2,LHORELAX_SVC1R3, & - LHORELAX_SVLIMA, & + LHORELAX_SVFIRE, LHORELAX_SVLIMA, & LHORELAX_SVELEC,LHORELAX_SVCHEM,LHORELAX_SVLG, & LHORELAX_SVDST,LHORELAX_SVAER, LHORELAX_SVSLT, & LHORELAX_SVPP,LHORELAX_SVCS, LHORELAX_SVCHIC, & @@ -99,21 +101,20 @@ USE MODD_DYN_n, ONLY: LHORELAX_SVFF #endif USE MODD_ELEC_DESCR, ONLY: LLNOX_EXPLICIT USE MODD_ELEC_DESCR, ONLY: CELECNAMES +USE MODD_FIELD, ONLY: TFIELDMETADATA, TYPEREAL +USE MODD_FIRE #ifdef MNH_FOREFIRE USE MODD_FOREFIRE #endif -!Blaze fire model -USE MODD_FIRE -USE MODD_DYN_n, ONLY : LHORELAX_SVFIRE -! USE MODD_ICE_C1R3_DESCR, ONLY: C1R3NAMES USE MODD_LG, ONLY: CLGNAMES, XLG1MIN, XLG2MIN, XLG3MIN USE MODD_LUNIT_n, ONLY: TLUOUT USE MODD_NSV USE MODD_PARAM_C2R2, ONLY: LSUPSAT +USE MODD_PARAMETERS, ONLY: NCOMMENTLGTMAX, NLONGNAMELGTMAX, NUNITLGTMAX USE MODD_PARAM_LIMA, ONLY: NINDICE_CCN_IMM, NIMM, NMOD_CCN, LSCAV, LAERO_MASS, & - NMOD_IFN, NMOD_IMM, LHHONI, LSNOW, LHAIL, & - LWARM, LCOLD, LRAIN, LSPRO, & + NMOD_IFN, NMOD_IMM, LHHONI, LSNOW, LHAIL, & + LWARM, LCOLD, LRAIN, LSPRO, & NMOM_C, NMOM_R, NMOM_I, NMOM_S, NMOM_G, NMOM_H USE MODD_PARAM_LIMA_COLD, ONLY: CLIMA_COLD_NAMES USE MODD_PARAM_LIMA_WARM, ONLY: CAERO_MASS, CLIMA_WARM_NAMES @@ -142,17 +143,28 @@ INTEGER, INTENT(IN) :: KMI ! model index ! CHARACTER(LEN=2) :: YNUM2 CHARACTER(LEN=3) :: YNUM3 +CHARACTER(LEN=NCOMMENTLGTMAX) :: YCOMMENT +CHARACTER(LEN=NUNITLGTMAX) :: YUNITS +CHARACTER(LEN=NLONGNAMELGTMAX), DIMENSION(:), ALLOCATABLE :: YAEROLONGNAMES +CHARACTER(LEN=NLONGNAMELGTMAX), DIMENSION(:), ALLOCATABLE :: YDUSTLONGNAMES +CHARACTER(LEN=NLONGNAMELGTMAX), DIMENSION(:), ALLOCATABLE :: YSALTLONGNAMES INTEGER :: ILUOUT +INTEGER :: ICHIDX ! Index for position in CSV_CHEM_LIST_A array INTEGER :: ISV ! total number of scalar variables -INTEGER :: IMODEIDX, IMOMENTS +INTEGER :: IMODEIDX +INTEGER :: JAER INTEGER :: JI, JJ, JSV INTEGER :: JMODE, JMOM, JSV_NAME +INTEGER :: INMOMENTS_DST, INMOMENTS_SLT !Number of moments for dust or salt ! !------------------------------------------------------------------------------- ! -LINI_NSV = .TRUE. +LINI_NSV(KMI) = .TRUE. ILUOUT = TLUOUT%NLU + +ICHIDX = 0 +NSV_CHEM_LIST_A(KMI) = 0 ! ! Users scalar variables are first considered ! @@ -199,16 +211,16 @@ END IF IF (CCLOUD == 'LIMA' ) THEN ISV = ISV+1 NSV_LIMA_BEG_A(KMI) = ISV - IF (LWARM .AND. NMOM_C.GE.2) THEN + IF ( LWARM .AND. NMOM_C >= 2 ) THEN ! Nc NSV_LIMA_NC_A(KMI) = ISV ISV = ISV+1 END IF ! Nr - IF (LWARM .AND. LRAIN .AND. NMOM_R.GE.2) THEN - NSV_LIMA_NR_A(KMI) = ISV - ISV = ISV+1 - END IF + IF ( LWARM .AND. LRAIN .AND. NMOM_R >= 2 ) THEN + NSV_LIMA_NR_A(KMI) = ISV + ISV = ISV+1 + END IF ! CCN IF (NMOD_CCN .GT. 0) THEN NSV_LIMA_CCN_FREE_A(KMI) = ISV @@ -222,22 +234,22 @@ IF (CCLOUD == 'LIMA' ) THEN ISV = ISV+1 END IF ! Ni - IF (LCOLD .AND. NMOM_I.GE.2) THEN + IF ( LCOLD .AND. NMOM_I >= 2 ) THEN NSV_LIMA_NI_A(KMI) = ISV ISV = ISV+1 END IF ! Ns - IF (LCOLD .AND. LSNOW .AND. NMOM_S.GE.2) THEN + IF ( LCOLD .AND. LSNOW .AND. NMOM_S >= 2 ) THEN NSV_LIMA_NS_A(KMI) = ISV ISV = ISV+1 END IF ! Ng - IF (LCOLD .AND. LWARM .AND. LSNOW .AND. NMOM_G.GE.2) THEN + IF ( LCOLD .AND. LWARM .AND. LSNOW .AND. NMOM_G >= 2) THEN NSV_LIMA_NG_A(KMI) = ISV ISV = ISV+1 END IF ! Nh - IF (LCOLD .AND. LWARM .AND. LSNOW .AND. LHAIL .AND. NMOM_H.GE.2) THEN + IF ( LCOLD .AND. LWARM .AND. LSNOW .AND. LHAIL .AND. NMOM_H >= 2 ) THEN NSV_LIMA_NH_A(KMI) = ISV ISV = ISV+1 END IF @@ -253,7 +265,7 @@ IF (CCLOUD == 'LIMA' ) THEN NSV_LIMA_IMM_NUCL_A(KMI) = ISV ISV = ISV + MAX(1,NMOD_IMM) END IF -! + IF ( NMOD_IFN > 0 ) THEN IF ( .NOT. ALLOCATED( NIMM ) ) ALLOCATE( NIMM(NMOD_CCN) ) NIMM(:) = 0 @@ -361,7 +373,6 @@ ELSE END IF ! #ifdef MNH_FOREFIRE - ! ForeFire tracers IF (LFOREFIRE .AND. NFFSCALARS .GT. 0) THEN NSV_FF_A(KMI) = NFFSCALARS @@ -416,6 +427,7 @@ IF (LUSECHEM .AND.(NEQ .GT. 0)) THEN NSV_CHEMBEG_A(KMI)= ISV+1 NSV_CHEMEND_A(KMI)= ISV+NSV_CHEM_A(KMI) ISV = NSV_CHEMEND_A(KMI) + NSV_CHEM_LIST_A(KMI) = NSV_CHEM_LIST_A(KMI) + NSV_CHEM_A(KMI) ELSE NSV_CHEM_A(KMI) = 0 ! force First index to be superior to last index @@ -439,6 +451,7 @@ IF ((LUSECHAQ .OR. LCHAQDIAG).AND.(NEQ .GT. 0)) THEN NSV_CHICBEG_A(KMI)= ISV+1 NSV_CHICEND_A(KMI)= ISV+NSV_CHIC_A(KMI) ISV = NSV_CHICEND_A(KMI) + NSV_CHEM_LIST_A(KMI) = NSV_CHEM_LIST_A(KMI) + NSV_CHIC_A(KMI) ELSE NSV_CHIC_A(KMI) = 0 NSV_CHICBEG_A(KMI)= 1 @@ -477,6 +490,9 @@ IF (LORILAM.AND.(NEQ .GT. 0)) THEN NSV_AERBEG_A(KMI)= ISV+1 NSV_AEREND_A(KMI)= ISV+NSV_AER_A(KMI) ISV = NSV_AEREND_A(KMI) + NSV_CHEM_LIST_A(KMI) = NSV_CHEM_LIST_A(KMI) + NSV_AER_A(KMI) + + ALLOCATE( YAEROLONGNAMES(NSV_AER_A(KMI)) ) ELSE NSV_AER_A(KMI) = 0 ! force First index to be superior to last index @@ -489,6 +505,7 @@ IF (LORILAM .AND. LDEPOS_AER(KMI)) THEN NSV_AERDEPBEG_A(KMI)= ISV+1 NSV_AERDEPEND_A(KMI)= ISV+NSV_AERDEP_A(KMI) ISV = NSV_AERDEPEND_A(KMI) + NSV_CHEM_LIST_A(KMI) = NSV_CHEM_LIST_A(KMI) + NSV_AERDEP_A(KMI) ELSE NSV_AERDEP_A(KMI) = 0 ! force First index to be superior to last index @@ -505,15 +522,22 @@ IF (LDUST) THEN IF (ALLOCATED(XT_LS).AND. .NOT.(LDSTPRES)) LDSTINIT=.TRUE. IF (CPROGRAM == 'IDEAL ') LVARSIG = .TRUE. IF ((CPROGRAM == 'REAL ').AND.LDSTINIT) LVARSIG = .TRUE. - NSV_DST_A(KMI) = NMODE_DST*2 - IF (LRGFIX_DST) THEN - NSV_DST_A(KMI) = NMODE_DST - LVARSIG = .FALSE. + !Determine number of moments + IF ( LRGFIX_DST ) THEN + INMOMENTS_DST = 1 + IF ( LVARSIG ) CALL Print_msg( NVERB_WARNING, 'GEN', 'INI_NSV', 'LVARSIG forced to FALSE because LRGFIX_DST is TRUE' ) + LVARSIG = .FALSE. + ELSE IF ( LVARSIG ) THEN + INMOMENTS_DST = 3 + ELSE + INMOMENTS_DST = 2 END IF - IF (LVARSIG) NSV_DST_A(KMI) = NSV_DST_A(KMI) + NMODE_DST + !Number of entries = number of moments multiplied by number of modes + NSV_DST_A(KMI) = NMODE_DST * INMOMENTS_DST NSV_DSTBEG_A(KMI)= ISV+1 NSV_DSTEND_A(KMI)= ISV+NSV_DST_A(KMI) ISV = NSV_DSTEND_A(KMI) + NSV_CHEM_LIST_A(KMI) = NSV_CHEM_LIST_A(KMI) + NSV_DST_A(KMI) ELSE NSV_DST_A(KMI) = 0 ! force First index to be superior to last index @@ -526,6 +550,7 @@ IF ( LDUST .AND. LDEPOS_DST(KMI) ) THEN NSV_DSTDEPBEG_A(KMI)= ISV+1 NSV_DSTDEPEND_A(KMI)= ISV+NSV_DSTDEP_A(KMI) ISV = NSV_DSTDEPEND_A(KMI) + NSV_CHEM_LIST_A(KMI) = NSV_CHEM_LIST_A(KMI) + NSV_DSTDEP_A(KMI) ELSE NSV_DSTDEP_A(KMI) = 0 ! force First index to be superior to last index @@ -542,15 +567,22 @@ IF (LSALT) THEN IF (ALLOCATED(XT_LS).AND. .NOT.(LSLTPRES)) LSLTINIT=.TRUE. IF (CPROGRAM == 'IDEAL ') LVARSIG_SLT = .TRUE. IF ((CPROGRAM == 'REAL ').AND. LSLTINIT ) LVARSIG_SLT = .TRUE. - NSV_SLT_A(KMI) = NMODE_SLT*2 - IF (LRGFIX_SLT) THEN - NSV_SLT_A(KMI) = NMODE_SLT - LVARSIG_SLT = .FALSE. + !Determine number of moments + IF ( LRGFIX_SLT ) THEN + INMOMENTS_SLT = 1 + IF ( LVARSIG_SLT ) CALL Print_msg( NVERB_WARNING, 'GEN', 'INI_NSV', 'LVARSIG_SLT forced to FALSE because LRGFIX_SLT is TRUE' ) + LVARSIG_SLT = .FALSE. + ELSE IF ( LVARSIG_SLT ) THEN + INMOMENTS_SLT = 3 + ELSE + INMOMENTS_SLT = 2 END IF - IF (LVARSIG_SLT) NSV_SLT_A(KMI) = NSV_SLT_A(KMI) + NMODE_SLT + !Number of entries = number of moments multiplied by number of modes + NSV_SLT_A(KMI) = NMODE_SLT * INMOMENTS_SLT NSV_SLTBEG_A(KMI)= ISV+1 NSV_SLTEND_A(KMI)= ISV+NSV_SLT_A(KMI) ISV = NSV_SLTEND_A(KMI) + NSV_CHEM_LIST_A(KMI) = NSV_CHEM_LIST_A(KMI) + NSV_SLT_A(KMI) ELSE NSV_SLT_A(KMI) = 0 ! force First index to be superior to last index @@ -563,6 +595,7 @@ IF ( LSALT .AND. LDEPOS_SLT(KMI) ) THEN NSV_SLTDEPBEG_A(KMI)= ISV+1 NSV_SLTDEPEND_A(KMI)= ISV+NSV_SLTDEP_A(KMI) ISV = NSV_SLTDEPEND_A(KMI) + NSV_CHEM_LIST_A(KMI) = NSV_CHEM_LIST_A(KMI) + NSV_SLTDEP_A(KMI) ELSE NSV_SLTDEP_A(KMI) = 0 ! force First index to be superior to last index @@ -596,6 +629,7 @@ IF (.NOT.(LUSECHEM.OR.LCHEMDIAG) .AND. (LCH_CONV_LINOX.OR.LLNOX_EXPLICIT)) THEN NSV_LNOXBEG_A(KMI)= ISV+1 NSV_LNOXEND_A(KMI)= ISV+NSV_LNOX_A(KMI) ISV = NSV_LNOXEND_A(KMI) + NSV_CHEM_LIST_A(KMI) = NSV_CHEM_LIST_A(KMI) + NSV_LNOX_A(KMI) ELSE NSV_LNOX_A(KMI) = 0 ! force First index to be superior to last index @@ -604,7 +638,7 @@ ELSE NSV_LNOXEND_A(KMI)= 0 END IF ! -! finale number of NSV variable +! Final number of NSV variables ! NSV_A(KMI) = ISV ! @@ -726,26 +760,39 @@ IF ( LDUST ) THEN ! Initialization of dust names IF( .NOT. ALLOCATED( CDUSTNAMES ) ) THEN - IMOMENTS = ( NSV_DSTEND_A(KMI) - NSV_DSTBEG_A(KMI) + 1 ) / NMODE_DST - ALLOCATE( CDUSTNAMES(IMOMENTS * NMODE_DST) ) + ALLOCATE( CDUSTNAMES(NSV_DST_A(KMI)) ) + ALLOCATE( YDUSTLONGNAMES(NSV_DST_A(KMI)) ) !Loop on all dust modes - IF ( IMOMENTS == 1 ) THEN + IF ( INMOMENTS_DST == 1 ) THEN DO JMODE = 1, NMODE_DST IMODEIDX = JPDUSTORDER(JMODE) JSV_NAME = ( IMODEIDX - 1 ) * 3 + 2 CDUSTNAMES(JMODE) = YPDUST_INI(JSV_NAME) + !Add meaning of the ppv unit (here for moment 3) + YDUSTLONGNAMES(JMODE) = TRIM( YPDUST_INI(JSV_NAME) ) // ' [molec_{aer}/molec_{air}]' END DO ELSE DO JMODE = 1,NMODE_DST !Find which mode we are dealing with IMODEIDX = JPDUSTORDER(JMODE) - DO JMOM = 1, IMOMENTS + DO JMOM = 1, INMOMENTS_DST !Find which number this is of the list of scalars - JSV = ( JMODE - 1 ) * IMOMENTS + JMOM + JSV = ( JMODE - 1 ) * INMOMENTS_DST + JMOM !Find what name this corresponds to, always 3 moments assumed in YPDUST_INI JSV_NAME = ( IMODEIDX - 1) * 3 + JMOM !Get the right CDUSTNAMES which should follow the list of scalars transported in XSVM/XSVT CDUSTNAMES(JSV) = YPDUST_INI(JSV_NAME) + !Add meaning of the ppv unit + IF ( JMOM == 1 ) THEN !Corresponds to moment 0 + YDUSTLONGNAMES(JSV) = TRIM( YPDUST_INI(JSV_NAME) ) // ' [nb_aerosols/molec_{air}]' + ELSE IF ( JMOM == 2 ) THEN !Corresponds to moment 3 + YDUSTLONGNAMES(JSV) = TRIM( YPDUST_INI(JSV_NAME) ) // ' [molec_{aer}/molec_{air}]' + ELSE IF ( JMOM == 3 ) THEN !Corresponds to moment 6 + YDUSTLONGNAMES(JSV) = TRIM( YPDUST_INI(JSV_NAME) ) // ' [um6/molec_{air}*(cm3/m3)]' + ELSE + CALL Print_msg( NVERB_WARNING, 'GEN', 'INI_NSV', 'unknown moment for DUST' ) + YDUSTLONGNAMES(JMODE) = TRIM( YPDUST_INI(JSV_NAME) ) + END IF ENDDO ! Loop on moments ENDDO ! Loop on dust modes END IF @@ -769,26 +816,39 @@ IF ( LSALT ) THEN IF ( NMODE_SLT < 1 .OR. NMODE_SLT > 8 ) CALL Print_msg( NVERB_FATAL, 'GEN', 'INI_NSV', 'NMODE_SLT must in the 1 to 8 interval' ) IF( .NOT. ALLOCATED( CSALTNAMES ) ) THEN - IMOMENTS = ( NSV_SLTEND_A(KMI) - NSV_SLTBEG_A(KMI) + 1 ) / NMODE_SLT - ALLOCATE( CSALTNAMES(IMOMENTS * NMODE_SLT) ) + ALLOCATE( CSALTNAMES(NSV_SLT_A(KMI)) ) + ALLOCATE( YSALTLONGNAMES(NSV_DST_A(KMI)) ) !Loop on all dust modes - IF ( IMOMENTS == 1 ) THEN + IF ( INMOMENTS_SLT == 1 ) THEN DO JMODE = 1, NMODE_SLT IMODEIDX = JPSALTORDER(JMODE) JSV_NAME = ( IMODEIDX - 1 ) * 3 + 2 CSALTNAMES(JMODE) = YPSALT_INI(JSV_NAME) + !Add meaning of the ppv unit (here for moment 3) + YSALTLONGNAMES(JMODE) = TRIM( YPSALT_INI(JSV_NAME) ) // ' [molec_{aer}/molec_{air}]' END DO ELSE DO JMODE = 1, NMODE_SLT !Find which mode we are dealing with IMODEIDX = JPSALTORDER(JMODE) - DO JMOM = 1, IMOMENTS + DO JMOM = 1, INMOMENTS_SLT !Find which number this is of the list of scalars - JSV = ( JMODE - 1 ) * IMOMENTS + JMOM + JSV = ( JMODE - 1 ) * INMOMENTS_SLT + JMOM !Find what name this corresponds to, always 3 moments assumed in YPSALT_INI JSV_NAME = ( IMODEIDX - 1 ) * 3 + JMOM !Get the right CSALTNAMES which should follow the list of scalars transported in XSVM/XSVT CSALTNAMES(JSV) = YPSALT_INI(JSV_NAME) + !Add meaning of the ppv unit + IF ( JMOM == 1 ) THEN !Corresponds to moment 0 + YSALTLONGNAMES(JSV) = TRIM( YPSALT_INI(JSV_NAME) ) // ' [nb_aerosols/molec_{air}]' + ELSE IF ( JMOM == 2 ) THEN !Corresponds to moment 3 + YSALTLONGNAMES(JSV) = TRIM( YPSALT_INI(JSV_NAME) ) // ' [molec_{aer}/molec_{air}]' + ELSE IF ( JMOM == 3 ) THEN !Corresponds to moment 6 + YSALTLONGNAMES(JSV) = TRIM( YPSALT_INI(JSV_NAME) ) // ' [um6/molec_{air}*(cm3/m3)]' + ELSE + CALL Print_msg( NVERB_WARNING, 'GEN', 'INI_NSV', 'unknown moment for SALT' ) + YSALTLONGNAMES(JMODE) = TRIM( YPSALT_INI(JSV_NAME) ) + END IF ENDDO ! Loop on moments ENDDO ! Loop on dust modes END IF @@ -809,131 +869,421 @@ END IF ! Initialize scalar variable names for snow IF ( LBLOWSNOW ) THEN IF( .NOT. ALLOCATED( CSNOWNAMES ) ) THEN - IMOMENTS = ( NSV_SNWEND_A(KMI) - NSV_SNWBEG_A(KMI) + 1 ) - ALLOCATE( CSNOWNAMES(IMOMENTS) ) - DO JMOM = 1, IMOMENTS + ALLOCATE( CSNOWNAMES(NSV_SNW_A(KMI)) ) + DO JMOM = 1, NSV_SNW_A(KMI) CSNOWNAMES(JMOM) = YPSNOW_INI(JMOM) - ENDDO ! Loop on moments + END DO END IF END IF -!Fill CSVNAMES_A for model KMI +!Fill metadata for model KMI DO JSV = 1, NSV_USER_A(KMI) WRITE( YNUM3, '( I3.3 )' ) JSV - CSVNAMES_A(JSV,KMI) = 'SVUSER'//YNUM3 + + TSVLIST_A(JSV, KMI) = TFIELDMETADATA( & + CMNHNAME = 'SVUSER' // YNUM3, & + CSTDNAME = '', & + CLONGNAME = 'SVUSER' // YNUM3, & + CUNITS = 'kg kg-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_' // 'SVUSER' // YNUM3, & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) END DO DO JSV = NSV_C2R2BEG_A(KMI), NSV_C2R2END_A(KMI) - CSVNAMES_A(JSV,KMI) = TRIM( C2R2NAMES(JSV-NSV_C2R2BEG_A(KMI)+1) ) + WRITE( YNUM3, '( I3.3 )' ) JSV + + TSVLIST_A(JSV, KMI) = TFIELDMETADATA( & + CMNHNAME = TRIM( C2R2NAMES(JSV-NSV_C2R2BEG_A(KMI)+1) ), & + CSTDNAME = '', & + CLONGNAME = TRIM( C2R2NAMES(JSV-NSV_C2R2BEG_A(KMI)+1) ), & + CUNITS = 'm-3', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_' // 'SVT' // YNUM3, & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) END DO DO JSV = NSV_C1R3BEG_A(KMI), NSV_C1R3END_A(KMI) - CSVNAMES_A(JSV,KMI) = TRIM( C1R3NAMES(JSV-NSV_C1R3BEG_A(KMI)+1) ) + WRITE( YNUM3, '( I3.3 )' ) JSV + + TSVLIST_A(JSV, KMI) = TFIELDMETADATA( & + CMNHNAME = TRIM( C1R3NAMES(JSV-NSV_C2R2BEG_A(KMI)+1) ), & + CSTDNAME = '', & + CLONGNAME = TRIM( C1R3NAMES(JSV-NSV_C2R2BEG_A(KMI)+1) ), & + CUNITS = 'm-3', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_' // 'SVT' // YNUM3, & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) END DO DO JSV = NSV_LIMA_BEG_A(KMI), NSV_LIMA_END_A(KMI) + WRITE( YNUM3, '( I3.3 )' ) JSV + + TSVLIST_A(JSV, KMI) = TFIELDMETADATA( & + CMNHNAME = 'SV LIMA ' // YNUM3, & + CSTDNAME = '', & + CLONGNAME = '', & + CUNITS = 'kg-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_' // 'SVT' // YNUM3, & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) + IF ( JSV == NSV_LIMA_NC_A(KMI) ) THEN - CSVNAMES_A(JSV,KMI) = TRIM( CLIMA_WARM_NAMES(1) ) + TSVLIST_A(JSV, KMI)%CMNHNAME = TRIM( CLIMA_WARM_NAMES(1) ) ELSE IF ( JSV == NSV_LIMA_NR_A(KMI) ) THEN - CSVNAMES_A(JSV,KMI) = TRIM( CLIMA_WARM_NAMES(2) ) + TSVLIST_A(JSV, KMI)%CMNHNAME = TRIM( CLIMA_WARM_NAMES(2) ) ELSE IF ( JSV >= NSV_LIMA_CCN_FREE_A(KMI) .AND. JSV < NSV_LIMA_CCN_ACTI_A(KMI) ) THEN WRITE( YNUM2, '( I2.2 )' ) JSV - NSV_LIMA_CCN_FREE_A(KMI) + 1 - CSVNAMES_A(JSV,KMI) = TRIM( CLIMA_WARM_NAMES(3) ) // YNUM2 + TSVLIST_A(JSV, KMI)%CMNHNAME = TRIM( CLIMA_WARM_NAMES(3) ) // YNUM2 ELSE IF (JSV >= NSV_LIMA_CCN_ACTI_A(KMI) .AND. JSV < ( NSV_LIMA_CCN_ACTI_A(KMI) + NMOD_CCN ) ) THEN WRITE( YNUM2, '( I2.2 )' ) JSV - NSV_LIMA_CCN_ACTI_A(KMI) + 1 - CSVNAMES_A(JSV,KMI) = TRIM( CLIMA_WARM_NAMES(4) ) // YNUM2 + TSVLIST_A(JSV, KMI)%CMNHNAME = TRIM( CLIMA_WARM_NAMES(4) ) // YNUM2 ELSE IF ( JSV == NSV_LIMA_SCAVMASS_A(KMI) ) THEN - CSVNAMES_A(JSV,KMI) = TRIM( CAERO_MASS(1) ) + TSVLIST_A(JSV, KMI)%CMNHNAME = TRIM( CAERO_MASS(1) ) + TSVLIST_A(JSV, KMI)%CUNITS = 'kg kg-1' ELSE IF ( JSV == NSV_LIMA_NI_A(KMI) ) THEN - CSVNAMES_A(JSV,KMI) = TRIM( CLIMA_COLD_NAMES(1) ) + TSVLIST_A(JSV, KMI)%CMNHNAME = TRIM( CLIMA_COLD_NAMES(1) ) ELSE IF ( JSV == NSV_LIMA_NS_A(KMI) ) THEN - CSVNAMES_A(JSV,KMI) = TRIM( CLIMA_COLD_NAMES(2) ) + TSVLIST_A(JSV, KMI)%CMNHNAME = TRIM( CLIMA_COLD_NAMES(2) ) ELSE IF ( JSV == NSV_LIMA_NG_A(KMI) ) THEN - CSVNAMES_A(JSV,KMI) = TRIM( CLIMA_COLD_NAMES(3) ) + TSVLIST_A(JSV, KMI)%CMNHNAME = TRIM( CLIMA_COLD_NAMES(3) ) ELSE IF ( JSV == NSV_LIMA_NH_A(KMI) ) THEN - CSVNAMES_A(JSV,KMI) = TRIM( CLIMA_COLD_NAMES(4) ) + TSVLIST_A(JSV, KMI)%CMNHNAME = TRIM( CLIMA_COLD_NAMES(4) ) ELSE IF ( JSV >= NSV_LIMA_IFN_FREE_A(KMI) .AND. JSV < NSV_LIMA_IFN_NUCL_A(KMI) ) THEN WRITE( YNUM2, '( I2.2 )' ) JSV - NSV_LIMA_IFN_FREE_A(KMI) + 1 - CSVNAMES_A(JSV,KMI) = TRIM( CLIMA_COLD_NAMES(5) ) // YNUM2 + TSVLIST_A(JSV, KMI)%CMNHNAME = TRIM( CLIMA_COLD_NAMES(5) ) // YNUM2 ELSE IF ( JSV >= NSV_LIMA_IFN_NUCL_A(KMI) .AND. JSV < ( NSV_LIMA_IFN_NUCL_A(KMI) + NMOD_IFN ) ) THEN WRITE( YNUM2, '( I2.2 )' ) JSV - NSV_LIMA_IFN_NUCL_A(KMI) + 1 - CSVNAMES_A(JSV,KMI) = TRIM( CLIMA_COLD_NAMES(6) ) // YNUM2 + TSVLIST_A(JSV, KMI)%CMNHNAME = TRIM( CLIMA_COLD_NAMES(6) ) // YNUM2 ELSE IF ( JSV >= NSV_LIMA_IMM_NUCL_A(KMI) .AND. JSV < ( NSV_LIMA_IMM_NUCL_A(KMI) + NMOD_IMM ) ) THEN WRITE( YNUM2, '( I2.2 )' ) NINDICE_CCN_IMM(JSV-NSV_LIMA_IMM_NUCL_A(KMI)+1) - CSVNAMES_A(JSV,KMI) = TRIM( CLIMA_COLD_NAMES(7) ) // YNUM2 + TSVLIST_A(JSV, KMI)%CMNHNAME = TRIM( CLIMA_COLD_NAMES(7) ) // YNUM2 ELSE IF ( JSV == NSV_LIMA_HOM_HAZE_A(KMI) ) THEN - CSVNAMES_A(JSV,KMI) = TRIM( CLIMA_COLD_NAMES(8) ) + TSVLIST_A(JSV, KMI)%CMNHNAME = TRIM( CLIMA_COLD_NAMES(8) ) ELSE IF ( JSV == NSV_LIMA_SPRO_A(KMI) ) THEN - CSVNAMES_A(JSV,KMI) = TRIM( CLIMA_WARM_NAMES(5) ) + TSVLIST_A(JSV, KMI)%CUNITS = '1' + TSVLIST_A(JSV, KMI)%CMNHNAME = TRIM( CLIMA_WARM_NAMES(5) ) ELSE CALL Print_msg( NVERB_FATAL, 'GEN', 'INI_NSV', 'invalid index for LIMA' ) END IF + + TSVLIST_A(JSV, KMI)%CLONGNAME = TRIM( TSVLIST_A(JSV, KMI)%CMNHNAME ) END DO DO JSV = NSV_ELECBEG_A(KMI), NSV_ELECEND_A(KMI) - CSVNAMES_A(JSV,KMI) = TRIM( CELECNAMES(JSV-NSV_ELECBEG_A(KMI)+1) ) + IF ( JSV > NSV_ELECBEG .AND. JSV < NSV_ELECEND ) THEN + YUNITS = 'C kg-1' + WRITE( YCOMMENT, '( A6, A3, I3.3 )' ) 'X_Y_Z_', 'SVT', JSV + ELSE + YUNITS = 'kg-1' + WRITE( YCOMMENT, '( A6, A3, I3.3, A8 )' ) 'X_Y_Z_', 'SVT', JSV, ' (nb ions/kg)' + END IF + + TSVLIST_A(JSV, KMI) = TFIELDMETADATA( & + CMNHNAME = TRIM( CELECNAMES(JSV-NSV_ELECBEG_A(KMI)+1) ), & + CSTDNAME = '', & + CLONGNAME = TRIM( CELECNAMES(JSV-NSV_ELECBEG_A(KMI)+1) ), & + CUNITS = TRIM( YUNITS ), & + CDIR = 'XY', & + CCOMMENT = TRIM( YCOMMENT ), & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) END DO DO JSV = NSV_LGBEG_A(KMI), NSV_LGEND_A(KMI) - CSVNAMES_A(JSV,KMI) = TRIM( CLGNAMES(JSV-NSV_LGBEG_A(KMI)+1) ) + WRITE( YNUM3, '( I3.3 )' ) JSV + + TSVLIST_A(JSV, KMI) = TFIELDMETADATA( & + CMNHNAME = TRIM( CLGNAMES(JSV-NSV_LGBEG_A(KMI)+1) ), & + CSTDNAME = '', & + CLONGNAME = TRIM( CLGNAMES(JSV-NSV_LGBEG_A(KMI)+1) ), & + CUNITS = 'm', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_' // 'SVT' // YNUM3, & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) END DO DO JSV = NSV_PPBEG_A(KMI), NSV_PPEND_A(KMI) WRITE( YNUM3, '( I3.3 )' ) JSV-NSV_PPBEG_A(KMI)+1 - CSVNAMES_A(JSV,KMI) = 'SVPP'//YNUM3 + + TSVLIST_A(JSV, KMI) = TFIELDMETADATA( & + CMNHNAME = 'SVPP' // YNUM3, & + CSTDNAME = '', & + CLONGNAME = 'SVPP' // YNUM3, & + CUNITS = 'kg kg-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_' // 'SVT' // YNUM3, & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) END DO #ifdef MNH_FOREFIRE DO JSV = NSV_FFBEG_A(KMI), NSV_FFEND_A(KMI) WRITE( YNUM3, '( I3.3 )' ) JSV-NSV_FFBEG_A(KMI)+1 - CSVNAMES_A(JSV,KMI) = 'SVFF'//YNUM3 + + TSVLIST_A(JSV, KMI) = TFIELDMETADATA( & + CMNHNAME = 'SVFF' // YNUM3, & + CSTDNAME = '', & + CLONGNAME = 'SVFF' // YNUM3, & + CUNITS = 'kg kg-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_' // 'SVT' // YNUM3, & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) END DO #endif DO JSV = NSV_CSBEG_A(KMI), NSV_CSEND_A(KMI) WRITE( YNUM3, '( I3.3 )' ) JSV-NSV_CSBEG_A(KMI) - CSVNAMES_A(JSV,KMI) = 'SVCS'//YNUM3 + + TSVLIST_A(JSV, KMI) = TFIELDMETADATA( & + CMNHNAME = 'SVCS' // YNUM3, & + CSTDNAME = '', & + CLONGNAME = 'SVCS' // YNUM3, & + CUNITS = 'kg kg-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_' // 'SVT' // YNUM3, & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) END DO DO JSV = NSV_CHEMBEG_A(KMI), NSV_CHEMEND_A(KMI) - CSVNAMES_A(JSV,KMI) = TRIM( CNAMES(JSV-NSV_CHEMBEG_A(KMI)+1) ) + ICHIDX = ICHIDX + 1 + CSV_CHEM_LIST_A(ICHIDX, KMI) = TRIM( CNAMES(JSV-NSV_CHEMBEG_A(KMI)+1) ) + + WRITE( YNUM3, '( I3.3 )' ) JSV + + TSVLIST_A(JSV, KMI) = TFIELDMETADATA( & + CMNHNAME = TRIM( CNAMES(JSV-NSV_CHEMBEG_A(KMI)+1) ), & + CSTDNAME = '', & + CLONGNAME = TRIM( CNAMES(JSV-NSV_CHEMBEG_A(KMI)+1) ), & + CUNITS = 'ppv', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_' // 'SVT' // YNUM3, & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) END DO DO JSV = NSV_CHICBEG_A(KMI), NSV_CHICEND_A(KMI) - CSVNAMES_A(JSV,KMI) = TRIM( CICNAMES(JSV-NSV_CHICBEG_A(KMI)+1) ) + ICHIDX = ICHIDX + 1 + CSV_CHEM_LIST_A(ICHIDX, KMI) = TRIM( CICNAMES(JSV-NSV_CHICBEG_A(KMI)+1) ) + + WRITE( YNUM3, '( I3.3 )' ) JSV + + TSVLIST_A(JSV, KMI) = TFIELDMETADATA( & + CMNHNAME = TRIM( CICNAMES(JSV-NSV_CHICBEG_A(KMI)+1) ), & + CSTDNAME = '', & + CLONGNAME = TRIM( CICNAMES(JSV-NSV_CHICBEG_A(KMI)+1) ), & + CUNITS = 'ppv', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_' // 'SVT' // YNUM3, & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) END DO DO JSV = NSV_AERBEG_A(KMI), NSV_AEREND_A(KMI) - CSVNAMES_A(JSV,KMI) = TRIM( CAERONAMES(JSV-NSV_AERBEG_A(KMI)+1) ) + ICHIDX = ICHIDX + 1 + CSV_CHEM_LIST_A(ICHIDX, KMI) = TRIM( CAERONAMES(JSV-NSV_AERBEG_A(KMI)+1) ) + + WRITE( YNUM3, '( I3.3 )' ) JSV + + !Determine moment to add meaning of the ppv unit + JAER = JSV - NSV_AERBEG_A(KMI) + 1 + IF ( ANY( JAER == [JP_CH_M0i, JP_CH_M0j] ) ) THEN + !Moment 0 + YAEROLONGNAMES = TRIM( CAERONAMES(JAER) ) // ' [nb_aerosols/molec_{air}]' + ELSE IF ( ANY( JAER == [ JP_CH_SO4i, JP_CH_SO4j, JP_CH_NO3i, JP_CH_NO3j, JP_CH_H2Oi, JP_CH_H2Oj, JP_CH_NH3i, JP_CH_NH3j, & + JP_CH_OCi, JP_CH_OCj, JP_CH_BCi, JP_CH_BCj, JP_CH_DSTi, JP_CH_DSTj ] ) & + .OR. ( NSOA == 10 .AND. & + ANY( JAER == [ JP_CH_SOA1i, JP_CH_SOA1j, JP_CH_SOA2i, JP_CH_SOA2j, JP_CH_SOA3i, JP_CH_SOA3j, JP_CH_SOA4i, & + JP_CH_SOA4j, JP_CH_SOA5i, JP_CH_SOA5j, JP_CH_SOA6i, JP_CH_SOA6j, JP_CH_SOA7i, JP_CH_SOA7j, & + JP_CH_SOA8i, JP_CH_SOA8j, JP_CH_SOA9i, JP_CH_SOA9j, JP_CH_SOA10i, JP_CH_SOA10j ] ) ) ) THEN + !Moment 3 + YAEROLONGNAMES = TRIM( CAERONAMES(JAER) ) // ' [molec_{aer}/molec_{air}]' + ELSE IF ( ( LVARSIGI .AND. JSV == JP_CH_M6i ) .OR. ( LVARSIGJ .AND. JSV == JP_CH_M6j ) ) THEN + !Moment 6 + YAEROLONGNAMES = TRIM( CAERONAMES(JAER) ) // ' [um6/molec_{air}*(cm3/m3)]' + ELSE + CALL Print_msg( NVERB_WARNING, 'GEN', 'INI_NSV', 'unknown moment for AER' ) + YAEROLONGNAMES = TRIM( CAERONAMES(JAER) ) + END IF + + TSVLIST_A(JSV, KMI) = TFIELDMETADATA( & + CMNHNAME = TRIM( CAERONAMES(JSV-NSV_AERBEG_A(KMI)+1) ), & + CSTDNAME = '', & + CLONGNAME = TRIM( YAEROLONGNAMES(JSV-NSV_AERBEG_A(KMI)+1) ), & + CUNITS = 'ppv', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_' // 'SVT' // YNUM3, & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) END DO DO JSV = NSV_AERDEPBEG_A(KMI), NSV_AERDEPEND_A(KMI) - CSVNAMES_A(JSV,KMI) = TRIM( CDEAERNAMES(JSV-NSV_AERDEPBEG_A(KMI)+1) ) + ICHIDX = ICHIDX + 1 + CSV_CHEM_LIST_A(ICHIDX, KMI) = TRIM( CDEAERNAMES(JSV-NSV_AERDEPBEG_A(KMI)+1) ) + + WRITE( YNUM3, '( I3.3 )' ) JSV + + TSVLIST_A(JSV, KMI) = TFIELDMETADATA( & + CMNHNAME = TRIM( CDEAERNAMES(JSV-NSV_AERDEPBEG_A(KMI)+1) ), & + CSTDNAME = '', & + CLONGNAME = TRIM( CDEAERNAMES(JSV-NSV_AERDEPBEG_A(KMI)+1) ), & + CUNITS = 'ppv', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_' // 'SVT' // YNUM3, & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) END DO DO JSV = NSV_DSTBEG_A(KMI), NSV_DSTEND_A(KMI) - CSVNAMES_A(JSV,KMI) = TRIM( CDUSTNAMES(JSV-NSV_DSTBEG_A(KMI)+1) ) + ICHIDX = ICHIDX + 1 + CSV_CHEM_LIST_A(ICHIDX, KMI) = TRIM( CDUSTNAMES(JSV-NSV_DSTBEG_A(KMI)+1) ) + + WRITE( YNUM3, '( I3.3 )' ) JSV + + TSVLIST_A(JSV, KMI) = TFIELDMETADATA( & + CMNHNAME = TRIM( CDUSTNAMES(JSV-NSV_DSTBEG_A(KMI)+1) ), & + CSTDNAME = '', & + CLONGNAME = TRIM( YDUSTLONGNAMES(JSV-NSV_DSTBEG_A(KMI)+1) ), & + CUNITS = 'ppv', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_' // 'SVT' // YNUM3, & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) END DO DO JSV = NSV_DSTDEPBEG_A(KMI), NSV_DSTDEPEND_A(KMI) - CSVNAMES_A(JSV,KMI) = TRIM( CDEDSTNAMES(JSV-NSV_DSTDEPBEG_A(KMI)+1) ) + ICHIDX = ICHIDX + 1 + CSV_CHEM_LIST_A(ICHIDX, KMI) = TRIM( CDEDSTNAMES(JSV-NSV_DSTDEPBEG_A(KMI)+1) ) + + WRITE( YNUM3, '( I3.3 )' ) JSV + + TSVLIST_A(JSV, KMI) = TFIELDMETADATA( & + CMNHNAME = TRIM( CDEDSTNAMES(JSV-NSV_DSTDEPBEG_A(KMI)+1) ), & + CSTDNAME = '', & + CLONGNAME = TRIM( CDEDSTNAMES(JSV-NSV_DSTDEPBEG_A(KMI)+1) ), & + CUNITS = 'ppv', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_' // 'SVT' // YNUM3, & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) END DO DO JSV = NSV_SLTBEG_A(KMI), NSV_SLTEND_A(KMI) - CSVNAMES_A(JSV,KMI) = TRIM( CSALTNAMES(JSV-NSV_SLTBEG_A(KMI)+1) ) + ICHIDX = ICHIDX + 1 + CSV_CHEM_LIST_A(ICHIDX, KMI) = TRIM( CSALTNAMES(JSV-NSV_SLTBEG_A(KMI)+1) ) + + WRITE( YNUM3, '( I3.3 )' ) JSV + + TSVLIST_A(JSV, KMI) = TFIELDMETADATA( & + CMNHNAME = TRIM( CSALTNAMES(JSV-NSV_SLTBEG_A(KMI)+1) ), & + CSTDNAME = '', & + CLONGNAME = TRIM( YSALTLONGNAMES(JSV-NSV_SLTBEG_A(KMI)+1) ), & + CUNITS = 'ppv', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_' // 'SVT' // YNUM3, & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) END DO DO JSV = NSV_SLTDEPBEG_A(KMI), NSV_SLTDEPEND_A(KMI) - CSVNAMES_A(JSV,KMI) = TRIM( CDESLTNAMES(JSV-NSV_SLTDEPBEG_A(KMI)+1) ) + ICHIDX = ICHIDX + 1 + CSV_CHEM_LIST_A(ICHIDX, KMI) = TRIM( CDESLTNAMES(JSV-NSV_SLTDEPBEG_A(KMI)+1) ) + + WRITE( YNUM3, '( I3.3 )' ) JSV + + TSVLIST_A(JSV, KMI) = TFIELDMETADATA( & + CMNHNAME = TRIM( CDESLTNAMES(JSV-NSV_SLTDEPBEG_A(KMI)+1) ), & + CSTDNAME = '', & + CLONGNAME = TRIM( CDESLTNAMES(JSV-NSV_SLTDEPBEG_A(KMI)+1) ), & + CUNITS = 'ppv', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_' // 'SVT' // YNUM3, & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) END DO DO JSV = NSV_SNWBEG_A(KMI), NSV_SNWEND_A(KMI) - CSVNAMES_A(JSV,KMI) = TRIM( CSNOWNAMES(JSV-NSV_SNWBEG_A(KMI)+1) ) + WRITE( YNUM3, '( I3.3 )' ) JSV + + TSVLIST_A(JSV, KMI) = TFIELDMETADATA( & + CMNHNAME = TRIM( CSNOWNAMES(JSV-NSV_SNWBEG_A(KMI)+1) ), & + CSTDNAME = '', & + CLONGNAME = TRIM( CSNOWNAMES(JSV-NSV_SNWBEG_A(KMI)+1) ), & + CUNITS = 'kg kg-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_' // 'SVT' // YNUM3, & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) END DO +!Check if there is at most 1 LINOX scalar variable +!if not, the name must be modified and different for all of them +IF ( NSV_LNOX_A(KMI) > 1 ) & + CALL Print_msg( NVERB_ERROR, 'GEN', 'INI_NSV', 'NSV_LNOX_A>1: problem with the names of the corresponding scalar variables' ) + DO JSV = NSV_LNOXBEG_A(KMI), NSV_LNOXEND_A(KMI) - WRITE( YNUM3, '( I3.3 )' ) JSV-NSV_LNOXBEG_A(KMI)+1 - CSVNAMES_A(JSV,KMI) = 'SVLNOX'//YNUM3 + ICHIDX = ICHIDX + 1 + CSV_CHEM_LIST_A(ICHIDX, KMI) = 'LINOX' + + WRITE( YNUM3, '( I3.3 )' ) JSV + + TSVLIST_A(JSV, KMI) = TFIELDMETADATA( & + CMNHNAME = 'LINOX', & + CSTDNAME = '', & + CLONGNAME = 'LINOX', & + CUNITS = 'ppv', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_' // 'SVT' // YNUM3, & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) END DO +IF ( ICHIDX /= NSV_CHEM_LIST_A(KMI) ) & + CALL Print_msg( NVERB_ERROR, 'GEN', 'INI_NSV', 'ICHIDX /= NSV_CHEM_LIST_A(KMI)' ) + END SUBROUTINE INI_NSV diff --git a/src/MNH/ini_one_wayn.f90 b/src/MNH/ini_one_wayn.f90 index 78e025b2a89dea147d8cac40f2124c1d7412ac72..c18ff402abe26556640f5cd8acbee57b5b75e108 100644 --- a/src/MNH/ini_one_wayn.f90 +++ b/src/MNH/ini_one_wayn.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1999-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1999-2022 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. @@ -104,7 +104,9 @@ USE MODD_NSV, only: NSV_A, NSV_C1R3BEG_A, NSV_C1R3_A, NSV_C2R2BEG_A, NSV_ELECBEG_A, NSV_ELEC_A, NSV_LGBEG_A, NSV_LG_A, NSV_LIMA_A, NSV_LIMA_BEG_A, & NSV_LNOXBEG_A, NSV_LNOX_A, NSV_PPBEG_A, NSV_PP_A, & NSV_SLTBEG_A, NSV_SLTDEPBEG_A, NSV_SLTDEP_A, NSV_SLT_A, NSV_USER_A - +#ifdef MNH_FOREFIRE +USE MODD_NSV, only: NSV_FF_A, NSV_FFBEG_A +#endif USE MODD_PARAM_n, only: CCLOUD USE MODD_REF, ONLY: LCOUPLES USE MODD_REF_n, only: XRHODJ, XRHODREF diff --git a/src/MNH/ini_posprofilern.f90 b/src/MNH/ini_posprofilern.f90 index 00279c8a81488360ebcc1e2ce4bb677094e55361..674dab0d8b87fa1096fce764af6ff069161da646 100644 --- a/src/MNH/ini_posprofilern.f90 +++ b/src/MNH/ini_posprofilern.f90 @@ -9,19 +9,7 @@ MODULE MODI_INI_POSPROFILER_n ! INTERFACE ! - SUBROUTINE INI_POSPROFILER_n(PTSTEP, PSEGLEN, & - KRR, KSV, OUSETKE, & - PLATOR, PLONOR ) -! -REAL, INTENT(IN) :: PTSTEP ! time step -REAL, INTENT(IN) :: PSEGLEN ! segment length -INTEGER, INTENT(IN) :: KRR ! number of moist variables -INTEGER, INTENT(IN) :: KSV ! number of scalar variables -LOGICAL, INTENT(IN) :: OUSETKE ! flag to use tke -REAL, INTENT(IN) :: PLATOR ! latitude of origine point -REAL, INTENT(IN) :: PLONOR ! longitude of origine point -! -!------------------------------------------------------------------------------- + SUBROUTINE INI_POSPROFILER_n( ) ! END SUBROUTINE INI_POSPROFILER_n ! @@ -29,11 +17,9 @@ END INTERFACE ! END MODULE MODI_INI_POSPROFILER_n ! -! ######################################################## - SUBROUTINE INI_POSPROFILER_n(PTSTEP, PSEGLEN, & - KRR, KSV, OUSETKE, & - PLATOR, PLONOR ) -! ######################################################## +! ############################### + SUBROUTINE INI_POSPROFILER_n( ) +! ############################### ! ! !!**** *INI_POSPROFILER_n* - @@ -66,219 +52,94 @@ END MODULE MODI_INI_POSPROFILER_n !! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O ! P. Wautelet 13/09/2019: budget: simplify and modernize date/time management ! M. Taufour 05/07/2021: modify RARE for hydrometeors containing ice and add bright band calculation for RARE +! P. Wautelet 04/2022: restructure profilers for better performance, reduce memory usage and correct some problems/bugs !! -------------------------------------------------------------------------- -! +! !* 0. DECLARATIONS ! ------------ ! -USE MODD_CONF -USE MODD_DYN_n -USE MODD_GRID -USE MODD_GRID_n -USE MODD_LUNIT_n, ONLY: TLUOUT -USE MODD_PARAMETERS -USE MODD_PROFILER_n -USE MODD_RADIATIONS_n, ONLY: NAER -USE MODD_TYPE_PROFILER -! -USE MODE_GRIDPROJ -USE MODE_ll +USE MODD_ALLPROFILER_n +USE MODD_CONF, ONLY: LCARTESIAN +USE MODD_DYN, ONLY: XSEGLEN +USE MODD_DYN_n, ONLY: DYN_MODEL, XTSTEP +USE MODD_PROFILER_n, ONLY: LPROFILER, NUMBPROFILER_LOC, TPROFILERS, TPROFILERS_TIME +USE MODD_TYPE_STATPROF, ONLY: TPROFILERDATA + USE MODE_MSG -! -USE MODI_INI_PROFILER_N -! +USE MODE_STATPROF_READER, ONLY: STATPROF_CSV_READ +USE MODE_STATPROF_TOOLS, ONLY: PROFILER_ADD, PROFILER_ALLOCATE, STATPROF_INI_INTERP, STATPROF_POSITION + IMPLICIT NONE ! ! !* 0.1 declarations of arguments ! -! -REAL, INTENT(IN) :: PTSTEP ! time step -REAL, INTENT(IN) :: PSEGLEN ! segment length -INTEGER, INTENT(IN) :: KRR ! number of moist variables -INTEGER, INTENT(IN) :: KSV ! number of scalar variables -LOGICAL, INTENT(IN) :: OUSETKE ! flag to use tke -REAL, INTENT(IN) :: PLATOR ! latitude of origine point -REAL, INTENT(IN) :: PLONOR ! longitude of origine point +! NONE ! !------------------------------------------------------------------------------- ! ! 0.2 declaration of local variables ! -INTEGER :: ISTORE ! number of storage instants -INTEGER :: ILUOUT ! logical unit -INTEGER :: IKU ! -! -!---------------------------------------------------------------------------- -ILUOUT = TLUOUT%NLU -!---------------------------------------------------------------------------- -! -!* 1. Default values -! -------------- -IKU = SIZE(XZZ,3) ! nombre de niveaux verticaux -! -CALL DEFAULT_PROFILER_n(TPROFILER) -! -! -!* 3. Stations initialization -! ----------------------- -! -CALL INI_PROFILER_n -LPROFILER = (NUMBPROFILER>0) -! -!---------------------------------------------------------------------------- -! -!* 4. Allocations of storage arrays -! ----------------------------- -! -IF(NUMBPROFILER>0) THEN - CALL ALLOCATE_PROFILER_n(TPROFILER) - CALL INI_INTERP_PROFILER_n(TPROFILER) -END IF -!---------------------------------------------------------------------------- -! -CONTAINS -! -!---------------------------------------------------------------------------- -SUBROUTINE DEFAULT_PROFILER_n(TPROFILER) -! -TYPE(PROFILER), INTENT(INOUT) :: TPROFILER -! -NUMBPROFILER = 0 -TPROFILER%T_CUR = XUNDEF -TPROFILER%N_CUR = 0 -TPROFILER%STEP = XTSTEP +INTEGER :: INUMBPROF ! Total number of profilers (inside physical domain of model) +INTEGER :: ISTORE ! number of storage instants +INTEGER :: JI +LOGICAL :: GINSIDE ! True if profiler is inside physical domain of model +LOGICAL :: GPRESENT ! True if profiler is present on the current process +TYPE(TPROFILERDATA) :: TZPROFILER ! -END SUBROUTINE DEFAULT_PROFILER_n -!---------------------------------------------------------------------------- !---------------------------------------------------------------------------- -SUBROUTINE ALLOCATE_PROFILER_n(TPROFILER) -! -TYPE(PROFILER), INTENT(INOUT) :: TPROFILER -! -ISTORE = NINT( ( PSEGLEN - DYN_MODEL(1)%XTSTEP ) / TPROFILER%STEP ) + 1 -! -allocate( tprofiler%tpdates( istore ) ) -ALLOCATE(TPROFILER%ERROR (NUMBPROFILER)) -ALLOCATE(TPROFILER%X (NUMBPROFILER)) -ALLOCATE(TPROFILER%Y (NUMBPROFILER)) -ALLOCATE(TPROFILER%ZON (ISTORE,IKU,NUMBPROFILER)) -ALLOCATE(TPROFILER%MER (ISTORE,IKU,NUMBPROFILER)) -ALLOCATE(TPROFILER%FF (ISTORE,IKU,NUMBPROFILER)) -ALLOCATE(TPROFILER%DD (ISTORE,IKU,NUMBPROFILER)) -ALLOCATE(TPROFILER%W (ISTORE,IKU,NUMBPROFILER)) -ALLOCATE(TPROFILER%P (ISTORE,IKU,NUMBPROFILER)) -ALLOCATE(TPROFILER%ZZ (ISTORE,IKU,NUMBPROFILER)) -ALLOCATE(TPROFILER%TH (ISTORE,IKU,NUMBPROFILER)) -ALLOCATE(TPROFILER%THV (ISTORE,IKU,NUMBPROFILER)) -ALLOCATE(TPROFILER%RHOD (ISTORE,IKU,NUMBPROFILER)) -ALLOCATE(TPROFILER%VISI (ISTORE,IKU,NUMBPROFILER)) -ALLOCATE(TPROFILER%VISIKUN(ISTORE,IKU,NUMBPROFILER)) -ALLOCATE(TPROFILER%CRARE (ISTORE,IKU,NUMBPROFILER)) -ALLOCATE(TPROFILER%CRARE_ATT(ISTORE,IKU,NUMBPROFILER)) -ALLOCATE(TPROFILER%LWCZ (ISTORE,IKU,NUMBPROFILER)) -ALLOCATE(TPROFILER%IWCZ (ISTORE,IKU,NUMBPROFILER)) -ALLOCATE(TPROFILER%CIZ (ISTORE,IKU,NUMBPROFILER)) -ALLOCATE(TPROFILER%R (ISTORE,IKU,NUMBPROFILER,KRR)) -ALLOCATE(TPROFILER%SV (ISTORE,IKU,NUMBPROFILER,KSV)) -ALLOCATE(TPROFILER%AER (ISTORE,IKU,NUMBPROFILER,NAER)) -IF (OUSETKE) THEN - ALLOCATE(TPROFILER%TKE (ISTORE,IKU,NUMBPROFILER)) + +TPROFILERS_TIME%XTSTEP = XSTEP_PROF + +if ( tprofilers_time%xtstep < xtstep ) then + call Print_msg( NVERB_WARNING, 'GEN', 'INI_POSPROFILER_n', 'Timestep for profilers was smaller than model timestep' ) + tprofilers_time%xtstep = xtstep +end if + +ISTORE = NINT ( ( XSEGLEN - DYN_MODEL(1)%XTSTEP ) / TPROFILERS_TIME%XTSTEP ) + 1 + +allocate( tprofilers_time%tpdates(istore) ) +! +! Profilers initialization +! +NUMBPROFILER_LOC = 0 + +IF (CFILE_PROF=="NO_INPUT_CSV") THEN + ! Treat namelist + INUMBPROF = 0 + IF ( NNUMB_PROF > 0 ) THEN + DO JI = 1, NNUMB_PROF + IF ( LCARTESIAN ) THEN + TZPROFILER%XX = XX_PROF(JI) + TZPROFILER%XY = XY_PROF(JI) + ELSE + TZPROFILER%XLAT = XLAT_PROF(JI) + TZPROFILER%XLON = XLON_PROF(JI) + CALL STATPROF_INI_INTERP( TZPROFILER ) + END IF + TZPROFILER%XZ = XZ_PROF(JI) + TZPROFILER%CNAME = CNAME_PROF(JI) + + CALL STATPROF_POSITION( TZPROFILER, GINSIDE, GPRESENT ) + + IF ( GINSIDE ) THEN + INUMBPROF = INUMBPROF + 1 + TZPROFILER%NID = INUMBPROF + END IF + + IF ( GPRESENT ) CALL PROFILER_ADD( TZPROFILER ) + END DO + END IF ELSE - ALLOCATE(TPROFILER%TKE (0,IKU,0)) -END IF -ALLOCATE(TPROFILER%T2M (ISTORE,NUMBPROFILER)) -ALLOCATE(TPROFILER%Q2M (ISTORE,NUMBPROFILER)) -ALLOCATE(TPROFILER%HU2M (ISTORE,NUMBPROFILER)) -ALLOCATE(TPROFILER%ZON10M (ISTORE,NUMBPROFILER)) -ALLOCATE(TPROFILER%MER10M (ISTORE,NUMBPROFILER)) -ALLOCATE(TPROFILER%RN (ISTORE,NUMBPROFILER)) -ALLOCATE(TPROFILER%H (ISTORE,NUMBPROFILER)) -ALLOCATE(TPROFILER%LE (ISTORE,NUMBPROFILER)) -ALLOCATE(TPROFILER%LEI (ISTORE,NUMBPROFILER)) -ALLOCATE(TPROFILER%GFLUX (ISTORE,NUMBPROFILER)) -ALLOCATE(TPROFILER%LWD (ISTORE,NUMBPROFILER)) -ALLOCATE(TPROFILER%LWU (ISTORE,NUMBPROFILER)) -ALLOCATE(TPROFILER%SWD (ISTORE,NUMBPROFILER)) -ALLOCATE(TPROFILER%SWU (ISTORE,NUMBPROFILER)) -ALLOCATE(TPROFILER%IWV (ISTORE,NUMBPROFILER)) -ALLOCATE(TPROFILER%ZTD (ISTORE,NUMBPROFILER)) -ALLOCATE(TPROFILER%ZWD (ISTORE,NUMBPROFILER)) -ALLOCATE(TPROFILER%ZHD (ISTORE,NUMBPROFILER)) -ALLOCATE(TPROFILER%TKE_DISS(ISTORE,IKU,NUMBPROFILER)) -! -! -TPROFILER%ERROR= .FALSE. -TPROFILER%ZON = XUNDEF -TPROFILER%MER = XUNDEF -TPROFILER%FF = XUNDEF -TPROFILER%DD = XUNDEF -TPROFILER%W = XUNDEF -TPROFILER%P = XUNDEF -TPROFILER%ZZ = XUNDEF -TPROFILER%TH = XUNDEF -TPROFILER%THV = XUNDEF -TPROFILER%RHOD = XUNDEF -TPROFILER%VISI = XUNDEF -TPROFILER%VISIKUN = XUNDEF -TPROFILER%CRARE = XUNDEF -TPROFILER%CRARE_ATT = XUNDEF -TPROFILER%LWCZ = XUNDEF -TPROFILER%IWCZ = XUNDEF -TPROFILER%CIZ = XUNDEF -TPROFILER%IWV = XUNDEF -TPROFILER%ZTD = XUNDEF -TPROFILER%ZWD = XUNDEF -TPROFILER%ZHD = XUNDEF -TPROFILER%R = XUNDEF -TPROFILER%SV = XUNDEF -TPROFILER%AER = XUNDEF -TPROFILER%TKE = XUNDEF -TPROFILER%T2M = XUNDEF -TPROFILER%Q2M = XUNDEF -TPROFILER%HU2M = XUNDEF -TPROFILER%ZON10M = XUNDEF -TPROFILER%MER10M = XUNDEF -TPROFILER%RN = XUNDEF -TPROFILER%H = XUNDEF -TPROFILER%LE = XUNDEF -TPROFILER%GFLUX = XUNDEF -TPROFILER%LEI = XUNDEF -TPROFILER%LWD = XUNDEF -TPROFILER%LWU = XUNDEF -TPROFILER%SWD = XUNDEF -TPROFILER%SWU = XUNDEF -TPROFILER%TKE_DISS = XUNDEF -! -END SUBROUTINE ALLOCATE_PROFILER_n -!---------------------------------------------------------------------------- -!---------------------------------------------------------------------------- -SUBROUTINE INI_INTERP_PROFILER_n(TPROFILER) -! -TYPE(PROFILER), INTENT(INOUT) :: TPROFILER -INTEGER :: III -INTEGER :: IIU, IJU -! -DO III=1,NUMBPROFILER - CALL GET_DIM_EXT_ll ('B',IIU,IJU) - CALL SM_XYHAT(PLATOR,PLONOR, & - TPROFILER%LAT(III), TPROFILER%LON(III), & - TPROFILER%X(III), TPROFILER%Y(III) ) -ENDDO -! -IF ( ANY(TPROFILER%LAT(:)==XUNDEF) .OR. ANY(TPROFILER%LON(:)==XUNDEF) ) THEN - WRITE(ILUOUT,*) 'Error in station position ' - WRITE(ILUOUT,*) 'either LATitude or LONgitude segment' - WRITE(ILUOUT,*) 'definiton is not complete.' -!callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_INTERP_PROFILER_n','') + !Treat CSV datafile + CALL STATPROF_CSV_READ( TZPROFILER, CFILE_PROF, INUMBPROF ) END IF -! -TPROFILER%STEP = MAX ( PTSTEP, TPROFILER%STEP ) -! -! -END SUBROUTINE INI_INTERP_PROFILER_n -!---------------------------------------------------------------------------- + +LPROFILER = ( INUMBPROF > 0 ) + +DO JI = 1, NUMBPROFILER_LOC + CALL PROFILER_ALLOCATE( TPROFILERS(JI), ISTORE ) +END DO !---------------------------------------------------------------------------- ! END SUBROUTINE INI_POSPROFILER_n diff --git a/src/MNH/ini_profilern.f90 b/src/MNH/ini_profilern.f90 deleted file mode 100644 index 598980099bb886c15140e56015a181624c94467f..0000000000000000000000000000000000000000 --- a/src/MNH/ini_profilern.f90 +++ /dev/null @@ -1,176 +0,0 @@ -!MNH_LIC Copyright 2002-2020 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. -!----------------------------------------------------------------- -! ####################### - SUBROUTINE INI_PROFILER_n -! ####################### -! -! -!!**** *INI_PROFILER_n* - user initializes the station location -!! -!! PURPOSE -!! ------- -! -! -!!** METHOD -!! ------ -!! -!! Must be defined (for each aircraft): -!! --------------- -!! -!! No default exist for these variables. -!! ************************************ -!! -!! 1) Number of stations -!! 2) the model in which these stations are -!! if NOT initialized, the stations are NOT used. -!! -!! 3) the (LAT, LON, ALT) latitude,longitude and altitude of the station location. -!! 4) the station name -!! -!! -!! -!! Can be defined (for each aircraft): -!! -------------- -!! -!! -!! 9) the time step for data storage. -!! default is 60s -!! -!! 10) the name or title describing the balloon (8 characters) -!! default is the balloon type (6 characters) + the balloon numbers (2 characters) -!! -!! -!! EXTERNAL -!! -------- -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! -!! REFERENCE -!! --------- -!! -!! AUTHOR -!! ------ -!! Pierre Tulet * Meteo-France * -!! -!! MODIFICATIONS -!! ------------- -!! Original 15/01/2002 -!! July, 2015 (O.Nuissier/F.Duffourg) Add microphysics diagnostic for -!! aircraft, ballon and profiler -!! -!! -------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -use modd_conf, only: lcartesian -USE MODD_PARAMETERS -USE MODD_PROFILER_n - -use mode_msg - -IMPLICIT NONE -! -! -!* 0.1 declarations of arguments -! -! -!------------------------------------------------------------------------------- -! -! 0.2 declaration of local variables -! -! -!---------------------------------------------------------------------------- -! -!* 1. Nameliste -! --------- -NUMBPROFILER = 0 - -if ( numbprofiler > 0 .and. lcartesian ) & - call Print_msg( NVERB_FATAL, 'GEN', 'INI_PROFILER_n', 'profilers are not available if LCARTESIAN=T' ) - -IF (NUMBPROFILER > 0) THEN -ALLOCATE(TPROFILER%LAT (NUMBPROFILER)) -ALLOCATE(TPROFILER%LON (NUMBPROFILER)) -ALLOCATE(TPROFILER%ALT (NUMBPROFILER)) -ALLOCATE(TPROFILER%NAME(NUMBPROFILER)) -ALLOCATE(TPROFILER%TYPE(NUMBPROFILER)) -! -TPROFILER%LON = XUNDEF -TPROFILER%LAT = XUNDEF -TPROFILER%ALT = XUNDEF -TPROFILER%NAME = " " -TPROFILER%TYPE = " " -! -TPROFILER%STEP = 900. -! -!* location (latitude, longitude, altitude) -! -! -TPROFILER%LAT = (/ 43.3000, 43.3300, 43.6200, 43.6550, 43.3400, & - 43.3000, 43.3500, 43.8128, 44.1711, 44.1689, & - 44.0833, 43.6200, 43.7164, 43.5333, 43.4833, & - 43.4800, 43.4856, & - 43.5423, 43.3000, 43.5000, 43.2568, 43.5000, & - 43.3333, 43.9070, 43.5430, 43.5300, 43.5000, & - 43.4300, & - 43.2780, 43.3277, 43.3396, 43.3230, 43.3559, & - 43.3060, 43.3724, 43.2568, 43.3834, 43.3417, & - 43.3165, 43.3873, 43.2833, 43.2900, 43.2842, & - 43.3597, 43.2788, 43.4999 /) -! -TPROFILER%LON = (/ 5.3790, 4.8200, 5.2000, 6.0986, 5.4100, & - 5.3833, 5.4000, 5.1506, 5.2875, 5.0692, & - 5.0500, 5.4000, 5.7653, 5.0667, 5.2833, & - 5.3200, 5.3405, & - 4.9010, 5.4000, 4.9300, 5.4054, 5.3700, & - 5.4167, 4.8988, 5.0740, 5.0700, 5.3700, & - 5.2300, & - 5.5762, 5.4782, 5.5873, 5.3668, 5.4550, & - 5.3951, 5.4842, 5.4054, 5.4253, 5.4113, & - 5.4369, 5.3893, 5.5114, 5.3788, 5.4611, & - 5.3994, 5.3538, 5.3674 /) -TPROFILER%ALT = (/ 2.,2.,2.,2.,2.,& - 2.,2.,2.,2.,2.,& - 2.,2.,2.,2.,2.,& - 2.,2., & - 2.,2.,2.,2.,2.,& - 2.,2.,2.,2.,2.,& - 2., & - 2.,2.,2.,2.,2.,& - 2.,2.,2.,2.,2.,& - 2.,2.,2.,2.,2.,& - 2.,2.,2. /) -! -TPROFILER%NAME = (/ 'CAAM ', 'CRAU ', 'BARD ', 'MONT ', 'IUTF ', & - 'OBSF ', 'VALF ', 'LUBE ', 'VENT ', 'DENT ', & - 'CARP ', 'DUPA ', 'VINO ', 'CHAM ', 'REA1 ', & - 'REA2 ', 'REA3 ', & - 'SOD_4M ', 'UHF_4M ', 'VHF_STM ', 'SOD_CO ', 'UHF_DEG ', & - 'SOD_EC ', 'SOD_E1 ', 'SOD_E2 ', 'UHF_ED ', 'VHF_LS ', & - 'UHF_DEP ', & - 'AGRI ', 'ALLA ', 'BOYE ', 'CANE ', 'CHAT ', & - 'CINQ ', 'COTE ', 'DR12 ', 'ETOI ', 'IUT1 ', & - 'JULI ', 'ONYX ', 'PENN ', 'TRIB ', 'VALB ', & - 'VALL ', 'MARS ', 'AIRB ' /) -! -TPROFILER%TYPE = (/ 'flux ', 'flux ', 'flux ', 'flux ', 'flux ', & - 'flux ', 'flux ', 'flux ', 'flux ', 'flux ', & - 'flux ', 'flux ', 'flux ', 'flux ', 'flux ', & - 'flux ', 'flux ', & - 'sodar ', 'uhf ', 'vhf ', 'sodar ', 'uhf ', & - 'sodar ', 'sodar ', 'sodar ', 'uhf ', 'vhf ', & - 'uhf ', & - 'gps ', 'gps ', 'gps ', 'gps ', 'gps ', & - 'gps ', 'gps ', 'gps ', 'gps ', 'gps ', & - 'gps ', 'gps ', 'gps ', 'gps ', 'gps ', & - 'gps ', 'gps ', 'gps ' /) -! -!---------------------------------------------------------------------------- -ENDIF -! -END SUBROUTINE INI_PROFILER_n diff --git a/src/MNH/ini_prog_var.f90 b/src/MNH/ini_prog_var.f90 index 24a1b3c83415ae7ff519b31c14d320f7781c9ac0..1864623ffbe8bd132b556b841d5c1f3a6840e8bd 100644 --- a/src/MNH/ini_prog_var.f90 +++ b/src/MNH/ini_prog_var.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1994-2022 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. @@ -36,8 +36,6 @@ END MODULE MODI_INI_PROG_VAR !! EXTERNAL !! -------- !! -!! Routine PGDFILTER : to filter a 2D field. -!! Module MODI_PGDFILTER !! !! IMPLICIT ARGUMENTS !! ------------------ @@ -99,50 +97,39 @@ END MODULE MODI_INI_PROG_VAR ! P. Wautelet 09/03/2021: move some chemistry initializations to ini_nsv ! P. Wautelet 10/03/2021: move scalar variable name initializations to ini_nsv ! P. Wautelet 10/03/2021: use scalar variable names for dust and salt +! P. Wautelet 04/02/2022: use TSVLIST to manage metadata of scalar variables !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ ! ! -USE MODD_CH_AEROSOL -USE MODD_CH_M9_n, ONLY: NEQ, CNAMES -USE MODD_CH_MNHC_n, ONLY: LUSECHEM, LUSECHAQ, LUSECHIC, LCH_PH -USE MODD_CONF -USE MODD_CONF_n -USE MODD_DIM_n -USE MODD_DUST -USE MODD_DYN_n -use modd_field, only: TFIELDDATA, TYPEREAL -USE MODD_FIELD_n +USE MODD_CH_M9_n, ONLY: NEQ +USE MODD_CH_MNHC_n, ONLY: LUSECHEM +USE MODD_CONF, ONLY: NVERB +USE MODD_CONF_n, ONLY: NRR +USE MODD_DIM_n, ONLY: NIMAX_ll, NJMAX_ll +USE MODD_DYN_n, ONLY: LHORELAX_SV, LHORELAX_TKE, NRIMX, NRIMY, & + NSIZELBXSV_ll, NSIZELBYSV_ll, NSIZELBXTKE_ll, NSIZELBYTKE_ll +use modd_field, only: TFIELDMETADATA +USE MODD_FIELD_n, ONLY: XRT, XSIGS, XSRCT, XSVT, XTKET, XWT USE MODD_IO, ONLY: TFILEDATA -USE MODD_LSFIELD_n -USE MODD_LUNIT +USE MODD_LSFIELD_n, ONLY: XLBXSVM, XLBYSVM, XLBXTKEM, XLBYTKEM USE MODD_LUNIT_n, ONLY: TLUOUT -USE MODD_NSV -USE MODD_PARAM_n -USE MODD_PARAMETERS -USE MODD_SALT -USE MODD_TURB_n -!UPG*PT -USE MODD_REF_n, ONLY : XRHODREF -USE MODD_CH_AERO_n -!UPG*PT +USE MODD_NSV, ONLY: NSV, NSV_AERBEG, NSV_AEREND, NSV_AERDEPBEG, NSV_AERDEPEND, NSV_CHEMBEG, NSV_CHEMEND, & + NSV_DSTBEG, NSV_DSTEND, NSV_DSTDEPBEG, NSV_DSTDEPEND, NSV_SLTBEG, NSV_SLTEND, & + NSV_SLTDEPBEG, NSV_SLTDEPEND, TSVLIST +USE MODD_PARAMETERS, ONLY: JPHEXT, JPVEXT +USE MODD_PARAM_n, ONLY: CTURB ! USE MODE_IO_FIELD_READ, only: IO_Field_read USE MODE_IO_FILE, ONLY: IO_File_close, IO_File_open USE MODE_IO_MANAGE_STRUCT, ONLY: IO_File_add2list -USE MODE_MODELN_HANDLER +USE MODE_MODELN_HANDLER, ONLY: GET_CURRENT_MODEL_INDEX USE MODE_MSG -USE MODE_POS -!UPG*PT -USE MODE_DUST_PSD -USE MODE_SALT_PSD -!UPG*PT +USE MODE_POS, ONLY: POSNAM use mode_tools_ll, only: GET_INDICE_ll ! -USE MODI_PGDFILTER -! USE MODN_CH_ORILAM USE MODN_DUST USE MODN_SALT @@ -171,7 +158,8 @@ INTEGER :: JSV ! Loop index INTEGER :: JMOM, IMOMENTS, JMODE, ISV_NAME_IDX, IMODEIDX ! dust and salt modes INTEGER :: ILUDES ! logical unit numbers of DESFM file LOGICAL :: GFOUND ! Return code when searching namelist -TYPE(TFIELDDATA) :: TZFIELD +LOGICAL :: GOLDFILEFORMAT +TYPE(TFIELDMETADATA) :: TZFIELD TYPE(TFILEDATA),POINTER :: TZCHEMFILE => NULL() !------------------------------------------------------------------------------- ! @@ -221,13 +209,16 @@ END IF !* 3. PASSIVE SCALAR ! -------------- ! -ALLOCATE(XSVT(0,0,0,0)) IF(PRESENT(HCHEMFILE)) THEN WRITE(ILUOUT,*) 'Routine INI_PROG_VAR: CHEMical species read in ',TRIM(HCHEMFILE) ! Read dimensions in chem file and checks with output file CALL IO_File_add2list(TZCHEMFILE,TRIM(HCHEMFILE),'MNH','READ',KLFITYPE=2,KLFIVERB=NVERB) CALL IO_File_open(TZCHEMFILE) - ! + + !If TZCHEMFILE file was written with a MesoNH version < 5.6, some variables had different names (or were not available) + GOLDFILEFORMAT = ( TZCHEMFILE%NMNHVERSION(1) < 5 & + .OR. ( TZCHEMFILE%NMNHVERSION(1) == 5 .AND. TZCHEMFILE%NMNHVERSION(2) < 6 ) ) + ILUDES = TZCHEMFILE%TDESFILE%NLU ! CALL IO_Field_read(TZCHEMFILE,'IMAX',IIMAX,IRESP) @@ -256,10 +247,7 @@ IF(PRESENT(HCHEMFILE)) THEN !callabortstop CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_PROG_VAR','') END IF ! IIMAX -!! UPG*PT pourquoi LDUST intervient ici ?? -!! IF (.NOT.LDUST) THEN - LUSECHEM = .TRUE. -!! END IF + LUSECHEM = .TRUE. IF (LORILAM) THEN CALL POSNAM(ILUDES,'NAM_CH_ORILAM',GFOUND,ILUOUT) IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_CH_ORILAM) @@ -275,51 +263,37 @@ IF(PRESENT(HCHEMFILE)) THEN LSLTPRES=.FALSE. CALL POSNAM(ILUDES,'NAM_SALT',GFOUND,ILUOUT) IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_SALT) - ! initialise NSV_* variables ENDIF + + ! initialise NSV_* variables CALL INI_NSV(IMI) ALLOCATE(XSVT(IIU,IJU,IKU,NSV)) - - ! Read scalars in chem file -!! UPG*PT ??? -!! IF (.NOT.LDUST) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppp' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_CHEMBEG,NSV_CHEMEND - TZFIELD%CMNHNAME = TRIM(CNAMES(JSV-NSV_CHEMBEG+1))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV - CALL IO_Field_read(TZCHEMFILE,TZFIELD,XSVT(:,:,:,JSV),IRESP) - IF (IRESP/=0) THEN - WRITE(ILUOUT,*) TRIM(TZFIELD%CMNHNAME),' NOT FOUND IN THE CHEM FILE ',HCHEMFILE - XSVT(:,:,:,JSV) = 0. - END IF !IRESP - END DO ! JSV - IF (ALL(XSVT(:,:,:,NSV_CHEMBEG:NSV_CHEMEND) == 0.)) THEN - LUSECHEM=.FALSE. - NEQ = 0 + + ! Read scalars in chem file + DO JSV = NSV_CHEMBEG, NSV_CHEMEND + TZFIELD = TSVLIST(JSV) + IF ( GOLDFILEFORMAT ) THEN + TZFIELD%CMNHNAME = TRIM( TZFIELD%CMNHNAME ) // 'T' + TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T' END IF -!! END IF + CALL IO_Field_read(TZCHEMFILE,TZFIELD,XSVT(:,:,:,JSV),IRESP) + IF (IRESP/=0) THEN + WRITE(ILUOUT,*) TRIM(TZFIELD%CMNHNAME),' NOT FOUND IN THE CHEM FILE ',HCHEMFILE + XSVT(:,:,:,JSV) = 0. + END IF !IRESP + END DO ! JSV + IF (ALL(XSVT(:,:,:,NSV_CHEMBEG:NSV_CHEMEND) == 0.)) THEN + LUSECHEM=.FALSE. + NEQ = 0 + END IF IF (LORILAM) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppp' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! DO JSV = NSV_AERBEG,NSV_AEREND - TZFIELD%CMNHNAME = TRIM(CAERONAMES(JSV-NSV_AERBEG+1))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV + TZFIELD = TSVLIST(JSV) + IF ( GOLDFILEFORMAT ) THEN + TZFIELD%CMNHNAME = TRIM( TZFIELD%CMNHNAME ) // 'T' + TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T' + END IF CALL IO_Field_read(TZCHEMFILE,TZFIELD,XSVT(:,:,:,JSV),IRESP) IF (IRESP/=0) THEN WRITE(ILUOUT,*) TRIM(TZFIELD%CMNHNAME),'NOT FOUND IN THE CHEM FILE ',HCHEMFILE @@ -328,18 +302,12 @@ IF(PRESENT(HCHEMFILE)) THEN END DO ! JSV ! IF (LDEPOS_AER(IMI)) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppp' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! DO JSV = NSV_AERDEPBEG,NSV_AERDEPEND - TZFIELD%CMNHNAME = TRIM(CDEAERNAMES(JSV-NSV_AERDEPBEG+1))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV + TZFIELD = TSVLIST(JSV) + IF ( GOLDFILEFORMAT ) THEN + TZFIELD%CMNHNAME = TRIM( TZFIELD%CMNHNAME ) // 'T' + TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T' + END IF CALL IO_Field_read(TZCHEMFILE,TZFIELD,XSVT(:,:,:,JSV),IRESP) IF (IRESP/=0) THEN WRITE(ILUOUT,*) TRIM(TZFIELD%CMNHNAME),'NOT FOUND IN THE CHEM FILE ',HCHEMFILE @@ -347,22 +315,15 @@ IF(PRESENT(HCHEMFILE)) THEN END IF !IRESP END DO ! JSV END IF ! ldepos_aer - END IF ! lorilam IF (LDUST) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppp' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! DO JSV = NSV_DSTBEG, NSV_DSTEND - TZFIELD%CMNHNAME = TRIM(CDUSTNAMES(JSV-NSV_DSTBEG+1))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV + TZFIELD = TSVLIST(JSV) + IF ( GOLDFILEFORMAT ) THEN + TZFIELD%CMNHNAME = TRIM( TZFIELD%CMNHNAME ) // 'T' + TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T' + END IF CALL IO_Field_read(TZCHEMFILE,TZFIELD,XSVT(:,:,:,JSV),IRESP) IF (IRESP/=0) THEN CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_PROG_VAR',TRIM(TZFIELD%CMNHNAME)//' not found in the CHEM file '//TRIM(HCHEMFILE)) @@ -370,18 +331,12 @@ IF(PRESENT(HCHEMFILE)) THEN END DO ! JSV IF (LDEPOS_DST(IMI)) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppp' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! DO JSV = NSV_DSTDEPBEG,NSV_DSTDEPEND - TZFIELD%CMNHNAME = TRIM(CDEDSTNAMES(JSV-NSV_DSTDEPBEG+1))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV + TZFIELD = TSVLIST(JSV) + IF ( GOLDFILEFORMAT ) THEN + TZFIELD%CMNHNAME = TRIM( TZFIELD%CMNHNAME ) // 'T' + TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T' + END IF CALL IO_Field_read(TZCHEMFILE,TZFIELD,XSVT(:,:,:,JSV),IRESP) IF (IRESP/=0) THEN WRITE(ILUOUT,*) TRIM(TZFIELD%CMNHNAME),'NOT FOUND IN THE CHEM FILE ',HCHEMFILE @@ -392,18 +347,12 @@ IF(PRESENT(HCHEMFILE)) THEN END IF ! LDUST IF (LSALT) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppp' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! DO JSV = NSV_SLTBEG, NSV_SLTEND - TZFIELD%CMNHNAME = TRIM(CSALTNAMES(JSV-NSV_SLTBEG+1))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV + TZFIELD = TSVLIST(JSV) + IF ( GOLDFILEFORMAT ) THEN + TZFIELD%CMNHNAME = TRIM( TZFIELD%CMNHNAME ) // 'T' + TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T' + END IF CALL IO_Field_read(TZCHEMFILE,TZFIELD,XSVT(:,:,:,JSV),IRESP) IF (IRESP/=0) THEN CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_PROG_VAR',TRIM(TZFIELD%CMNHNAME)//' not found in the CHEM file '//TRIM(HCHEMFILE)) @@ -411,18 +360,12 @@ IF(PRESENT(HCHEMFILE)) THEN END DO ! JSV ! IF (LDEPOS_SLT(IMI)) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppp' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! DO JSV = NSV_SLTDEPBEG,NSV_SLTDEPEND - TZFIELD%CMNHNAME = TRIM(CDESLTNAMES(JSV-NSV_SLTDEPBEG+1))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV + TZFIELD = TSVLIST(JSV) + IF ( GOLDFILEFORMAT ) THEN + TZFIELD%CMNHNAME = TRIM( TZFIELD%CMNHNAME ) // 'T' + TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T' + END IF CALL IO_Field_read(TZCHEMFILE,TZFIELD,XSVT(:,:,:,JSV),IRESP) IF (IRESP/=0) THEN WRITE(ILUOUT,*) TRIM(TZFIELD%CMNHNAME),'NOT FOUND IN THE CHEM FILE ',HCHEMFILE diff --git a/src/MNH/ini_segn.f90 b/src/MNH/ini_segn.f90 index e831472144f7d4480cc08d3c6a7aea3113c053cc..629da3473fcb06dfeb6b4ad9f50ca49eff9caa45 100644 --- a/src/MNH/ini_segn.f90 +++ b/src/MNH/ini_segn.f90 @@ -164,7 +164,7 @@ END MODULE MODI_INI_SEG_n !! 07/2017 add GBLOWSNOW (V. Vionnet) ! P. Wautelet 07/02/2019: force TYPE to a known value for IO_File_add2list ! P. Wautelet 14/02/2019: remove CLUOUT/CLUOUT0 and associated variables -! P. Wautelet 19/06/2019: add Fieldlist_nmodel_resize subroutine + provide KMODEL to INI_FIELD_LIST when known +! P. Wautelet 19/06/2019: provide KMODEL to INI_FIELD_LIST when known !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -183,7 +183,7 @@ USE MODD_PARAM_ICE USE MODD_PARAMETERS USE MODD_REF, ONLY: LBOUSS ! -use mode_field, only: Fieldlist_nmodel_resize, Ini_field_list, Ini_field_scalars +use mode_field, only: Ini_field_list, Ini_field_scalars USE MODE_IO_FIELD_READ, only: IO_Field_read USE MODE_IO_FILE, ONLY: IO_File_close, IO_File_open USE MODE_IO, only: IO_Config_set @@ -378,13 +378,11 @@ CALL READ_DESFM_n(KMI,TPINIFILE,YCONF,GFLAT,GUSERV,GUSERC, & ! -------------------- ! IF (KMI==1) THEN !Do this only 1 time - IF (CPROGRAM=='SPAWN ') THEN - CALL INI_FIELD_LIST(2) - ELSE IF (CPROGRAM=='DIAG ' .OR. CPROGRAM=='SPEC ') THEN - CALL INI_FIELD_LIST(1) - ELSE IF (CPROGRAM/='REAL ' .AND. CPROGRAM/='IDEAL ' ) THEN + IF ( CPROGRAM=='SPAWN ' .OR. CPROGRAM=='DIAG ' .OR. CPROGRAM=='SPEC ' & + .OR. ( CPROGRAM/='REAL ' .AND. CPROGRAM/='IDEAL ' ) ) THEN CALL INI_FIELD_LIST() END IF + IF (CPROGRAM=='SPAWN ' .OR. CPROGRAM=='DIAG ' .OR. CPROGRAM=='SPEC ' .OR. CPROGRAM=='MESONH') THEN CALL INI_FIELD_SCALARS() END IF @@ -464,11 +462,7 @@ CALL READ_EXSEG_n(KMI,TZFILE_DES,YCONF,GFLAT,GUSERV,GUSERC, & GLNOX_EXPLICIT, & GCONDSAMP,GBLOWSNOW, IRIMX,IRIMY,ISV, & YTURB,YTOM,GRMC01,YRAD,YDCONV,YSCONV,YCLOUD,YELEC,YEQNSYS, & - PTSTEP_ALL,CINIFILEPGD_n ) -! -if ( cprogram == 'MESONH' .and. kmi == 1 ) then !Do this only once - call Fieldlist_nmodel_resize(NMODEL) -end if + PTSTEP_ALL,CINIFILEPGD_n ) ! IF (CPROGRAM=='SPAWN ' .OR. CPROGRAM=='DIAG ' .OR. CPROGRAM=='SPEC ' & .OR. CPROGRAM=='REAL ') THEN diff --git a/src/MNH/ini_size_spawn.f90 b/src/MNH/ini_size_spawn.f90 index 0de2efdb4672b8e4e1402330d51dea5d6b759cb4..3695fe140491677c653e6c4af6d6909873b28bb0 100644 --- a/src/MNH/ini_size_spawn.f90 +++ b/src/MNH/ini_size_spawn.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1999-2020 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1999-2022 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. @@ -78,7 +78,7 @@ END MODULE MODI_INI_SIZE_SPAWN USE MODD_CONF USE MODD_DIM_n, ONLY: DIM_MODEL USE MODD_DYN_n, ONLY: CPRESOPT, NITR -use modd_field, only: tfielddata, tfieldlist +use modd_field, only: tfieldmetadata, tfieldlist USE MODD_GRID USE MODD_GRID_n USE MODD_IO, ONLY: ISNPROC, ISP, TFILEDATA @@ -137,7 +137,7 @@ INTEGER :: IDIMX, IDIMY, IIB, IJB, IIE, IJE !$ REAL :: ZLATOR, ZLONOR, ZXHATM, ZYHATM INTEGER :: IIMAX_ll,IJMAX_ll -TYPE(TFIELDDATA) :: TZFIELD +TYPE(TFIELDMETADATA) :: TZFIELD TYPE(TFILEDATA),POINTER :: TZDOMAIN => NULL() ! ! @@ -265,12 +265,12 @@ IF (LEN_TRIM(CDOMAIN)>0) THEN ! IF (TPINIFILE%NMNHVERSION(1)<4 .OR. (TPINIFILE%NMNHVERSION(1)==4 .AND. TPINIFILE%NMNHVERSION(2)<=5)) THEN CALL FIND_FIELD_ID_FROM_MNHNAME('LONORI',IID,IRESP) - TZFIELD = TFIELDLIST(IID) + TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) TZFIELD%CMNHNAME = 'LONOR' CALL IO_Field_read(TPINIFILE,TZFIELD,XPGDLONOR) ! CALL FIND_FIELD_ID_FROM_MNHNAME('LATORI',IID,IRESP) - TZFIELD = TFIELDLIST(IID) + TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) TZFIELD%CMNHNAME = 'LATOR' CALL IO_Field_read(TPINIFILE,TZFIELD,XPGDLATOR) ! @@ -287,7 +287,7 @@ IF (LEN_TRIM(CDOMAIN)>0) THEN CALL READ_HGRID(2,TZDOMAIN,YMY_NAME,YDAD_NAME,YSTORAGE_TYPE) CALL IO_File_close(TZDOMAIN) CALL RETRIEVE1_NEST_INFO_n(1,2,NXOR,NYOR,NXSIZE,NYSIZE,NDXRATIO,NDYRATIO) - DEALLOCATE(XZS,XZSMT,XXHAT,XYHAT) + DEALLOCATE( XZS, XZSMT, XXHAT, XYHAT, XXHATM, XYHATM) ! END IF ! diff --git a/src/MNH/ini_spectren.f90 b/src/MNH/ini_spectren.f90 index 1067f2ceffdbf2de2b8de02dcf94039a76a01378..b6e605ecc2f07a37d3b39b42f93646c8cc80da7c 100644 --- a/src/MNH/ini_spectren.f90 +++ b/src/MNH/ini_spectren.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2015-2019 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2015-2022 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. @@ -105,6 +105,7 @@ USE MODE_IO_FIELD_READ, only: IO_Field_read USE MODE_ll USE MODE_MODELN_HANDLER USE MODE_MSG +USE MODE_SET_GRID USE MODE_SPLITTINGZ_ll, ONLY: GET_DIM_EXTZ_ll USE MODE_TYPE_ZDIFFU ! @@ -114,7 +115,6 @@ USE MODI_INI_DYNAMICS USE MODI_INI_SPAWN_LS_n USE MODI_GET_SIZEX_LB USE MODI_GET_SIZEY_LB -USE MODI_SET_GRID USE MODI_METRICS USE MODI_SET_REF USE MODI_UPDATE_METRICS @@ -262,10 +262,13 @@ ALLOCATE(XXHAT(IIU)) ALLOCATE(XDXHAT(IIU)) ALLOCATE(XYHAT(IJU)) ALLOCATE(XDYHAT(IJU)) +ALLOCATE(XXHATM(IIU)) +ALLOCATE(XYHATM(IJU)) ALLOCATE(XZS(IIU,IJU)) ALLOCATE(XZSMT(IIU,IJU)) ALLOCATE(XZZ(IIU,IJU,IKU)) ALLOCATE(XZHAT(IKU)) +ALLOCATE(XZHATM(IKU)) ! ALLOCATE(XDXX(IIU,IJU,IKU)) ALLOCATE(XDYY(IIU,IJU,IKU)) @@ -682,13 +685,15 @@ CALL INI_BIKHARDT_n (NDXRATIO_ALL(KMI),NDYRATIO_ALL(KMI),KMI) !* 6. INITIALIZE GRIDS AND METRIC COEFFICIENTS ! ---------------------------------------- ! -CALL SET_GRID(KMI,TPINIFILE,IKU,NIMAX_ll,NJMAX_ll, & - XTSTEP,XSEGLEN, & - XLONORI,XLATORI,XLON,XLAT, & - XXHAT,XYHAT,XDXHAT,XDYHAT, XMAP, & - XZS,XZZ,XZHAT,XZTOP,LSLEVE,XLEN1,XLEN2,XZSMT, & - ZJ, & - TDTMOD,TDTCUR,NSTOP,NBAK_NUMB,NOUT_NUMB,TBACKUPN,TOUTPUTN) +CALL SET_GRID( KMI, TPINIFILE, IKU, NIMAX_ll, NJMAX_ll, & + XTSTEP, XSEGLEN, & + XLONORI, XLATORI, XLON, XLAT, & + XXHAT, XYHAT, XDXHAT, XDYHAT, XXHATM, XYHATM, & + XXHAT_ll, XYHAT_ll, XXHATM_ll, XYHATM_ll, & + XHAT_BOUND, XHATM_BOUND, & + XMAP, XZS, XZZ, XZHAT, XZHATM, XZTOP, LSLEVE, & + XLEN1, XLEN2, XZSMT, ZJ, & + TDTMOD, TDTCUR, NSTOP, NBAK_NUMB, NOUT_NUMB, TBACKUPN, TOUTPUTN ) ! CALL METRICS(XMAP,XDXHAT,XDYHAT,XZZ,XDXX,XDYY,XDZX,XDZY,XDZZ) ! @@ -743,10 +748,10 @@ END IF ! --------------------------- ! ! -CALL SET_REF(KMI,TPINIFILE, & - XZZ,XZHAT,ZJ,XDXX,XDYY,CLBCX,CLBCY, & - XREFMASS,XMASS_O_PHI0,XLINMASS, & - XRHODREF,XTHVREF,XRVREF,XEXNREF,XRHODJ) +CALL SET_REF( KMI, TPINIFILE, & + XZZ, XZHATM, ZJ, XDXX, XDYY, CLBCX, CLBCY, & + XREFMASS, XMASS_O_PHI0, XLINMASS, & + XRHODREF, XTHVREF, XRVREF, XEXNREF, XRHODJ ) !------------------------------------------------------------------------------- ! !* 11. INITIALIZE THE SOURCE OF TOTAL DRY MASS Md @@ -894,7 +899,7 @@ ALLOCATE(XALKBAS(0)) ALLOCATE(XALKWBAS(0)) ! CALL INI_DYNAMICS(XLON,XLAT,XRHODJ,XTHVREF,XMAP,XZZ,XDXHAT,XDYHAT, & - XZHAT,CLBCX,CLBCY,XTSTEP, & + XZHAT,XZHATM,CLBCX,CLBCY,XTSTEP, & LVE_RELAX,LVE_RELAX_GRD,LHORELAX_UVWTH,LHORELAX_RV, & LHORELAX_RC,LHORELAX_RR,LHORELAX_RI,LHORELAX_RS,LHORELAX_RG, & LHORELAX_RH,LHORELAX_TKE,LHORELAX_SV, & diff --git a/src/MNH/ini_stationn.f90 b/src/MNH/ini_stationn.f90 deleted file mode 100644 index 8bfe8866f73bfc3c855b971514bfb88027409cff..0000000000000000000000000000000000000000 --- a/src/MNH/ini_stationn.f90 +++ /dev/null @@ -1,144 +0,0 @@ -!MNH_LIC Copyright 2002-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. -!----------------------------------------------------------------- -! ####################### - SUBROUTINE INI_STATION_n -! ####################### -! -! -!!**** *INI_STATION_n* - user initializes the station location -!! -!! PURPOSE -!! ------- -! -! -!!** METHOD -!! ------ -!! -!! Must be defined (for each station): -!! --------------- -!! -!! No default exist for these variables. -!! ************************************ -!! -!! 1) Number of stations -!! 2) the model in which these stations are -!! if NOT initialized, the stations are NOT used. -!! -!! 3) the (LAT, LON, ALT) latitude,longitude and altitude of the station location. -!! 4) the station name -!! -!! -!! -!! Can be defined (for each station): -!! -------------- -!! -!! -!! 9) the time step for data storage. -!! default is 60s -!! -!! 10) the name or title describing the balloon (8 characters) -!! default is the balloon type (6 characters) + the balloon numbers (2 characters) -!! -!! -!! EXTERNAL -!! -------- -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! -!! REFERENCE -!! --------- -!! -!! AUTHOR -!! ------ -!! Pierre Tulet * Meteo-France * -!! -!! MODIFICATIONS -!! ------------- -!! Original 15/01/2002 -!! Modification: 02/2021 (E.Jezequel) Read stations from CVS file -!! -!! -------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_ALLSTATION_n -USE MODD_CONF, ONLY: LCARTESIAN -USE MODD_PARAMETERS -! -USE MODI_STATION_READER -! -! -IMPLICIT NONE -! -! -!* 0.1 declarations of arguments -! -! -!------------------------------------------------------------------------------- -! -! 0.2 declaration of local variables -! -INTEGER :: JI -! -!---------------------------------------------------------------------------- -! -!* 1. Nameliste -! --------- - -IF (CFILE_STAT=="NO_INPUT_CSV") THEN - NUMBSTAT = NNUMB_STAT - - IF (NUMBSTAT > 0) THEN - ALLOCATE (TSTATION%LAT(NUMBSTAT)) - ALLOCATE (TSTATION%LON(NUMBSTAT)) - ALLOCATE (TSTATION%X(NUMBSTAT)) - ALLOCATE (TSTATION%Y(NUMBSTAT)) - ALLOCATE (TSTATION%Z(NUMBSTAT)) - ALLOCATE (TSTATION%K(NUMBSTAT)) - ALLOCATE (TSTATION%NAME(NUMBSTAT)) - ALLOCATE (TSTATION%TYPE(NUMBSTAT)) - ! - TSTATION%LON = XUNDEF - TSTATION%LAT = XUNDEF - TSTATION%Z = XUNDEF - TSTATION%K = XUNDEF - TSTATION%X = XUNDEF - TSTATION%Y = XUNDEF - TSTATION%NAME = " " - TSTATION%TYPE = " " - ! - TSTATION%STEP = XSTEP_STAT - ! - IF (LCARTESIAN) THEN - DO JI=1,NUMBSTAT - TSTATION%X(JI)= XX_STAT(JI) - TSTATION%Y(JI)= XY_STAT(JI) - TSTATION%Z(JI)= XZ_STAT(JI) - TSTATION%NAME(JI)= CNAME_STAT(JI) - TSTATION%TYPE(JI)= CTYPE_STAT(JI) - END DO - ELSE - DO JI=1,NUMBSTAT - TSTATION%LAT(JI)= XLAT_STAT(JI) - TSTATION%LON(JI)= XLON_STAT(JI) - TSTATION%Z(JI)= XZ_STAT(JI) - TSTATION%NAME(JI)= CNAME_STAT(JI) - TSTATION%TYPE(JI)= CTYPE_STAT(JI) - END DO - ENDIF - ENDIF -ELSE -! -!* 2. CSV DATA -! - CALL READ_CSV_STATION(CFILE_STAT,TSTATION,LCARTESIAN) - TSTATION%STEP = XSTEP_STAT -END IF - -! -END SUBROUTINE INI_STATION_n diff --git a/src/MNH/ini_surf_rad.f90 b/src/MNH/ini_surf_rad.f90 index be7c6f342153a6991a14bc8e03b3cc5465b409ba..19b5f8df6efdff90a4f1250ad9bf7cc6c7a0fab6 100644 --- a/src/MNH/ini_surf_rad.f90 +++ b/src/MNH/ini_surf_rad.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2003-2020 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2003-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. @@ -63,7 +63,7 @@ END MODULE MODI_INI_SURF_RAD !* 0. DECLARATIONS ! ------------ ! -use modd_field, only: tfielddata, tfieldlist +use modd_field, only: tfieldmetadata, tfieldlist USE MODD_IO, ONLY: TFILEDATA ! use mode_field, only: Find_field_id_from_mnhname @@ -82,8 +82,8 @@ REAL, DIMENSION(:,:), INTENT(OUT) :: PTSRAD ! radiative surface temperature ! !* 0.2 declarations of local variables ! -INTEGER :: IID, IRESP -TYPE(TFIELDDATA) :: TZFIELD +INTEGER :: IID, IRESP +TYPE(TFIELDMETADATA) :: TZFIELD !------------------------------------------------------------------------------- ! CALL IO_Field_read(TPINIFILE,'DIR_ALB',PDIR_ALB) @@ -91,7 +91,7 @@ CALL IO_Field_read(TPINIFILE,'SCA_ALB',PSCA_ALB) ! CALL PRINT_MSG(NVERB_INFO,'IO','INI_SURF_RAD','EMIS: reading only first band (copy on others)') CALL FIND_FIELD_ID_FROM_MNHNAME('EMIS',IID,IRESP) -TZFIELD = TFIELDLIST(IID) +TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) TZFIELD%NDIMS = 2 CALL IO_Field_read(TPINIFILE,TZFIELD,PEMIS(:,:,1)) PEMIS(:,:,:) = SPREAD(SOURCE=PEMIS(:,:,1),DIM=3,NCOPIES=SIZE(PEMIS,3)) diff --git a/src/MNH/ini_surfstationn.f90 b/src/MNH/ini_surfstationn.f90 index 52c9df797e2008d15cd424e3f9e5c14140ab6036..c312cf819c8b45e50ab9d98bc5f955d4ab07c064 100644 --- a/src/MNH/ini_surfstationn.f90 +++ b/src/MNH/ini_surfstationn.f90 @@ -9,21 +9,7 @@ MODULE MODI_INI_SURFSTATION_n ! INTERFACE ! - SUBROUTINE INI_SURFSTATION_n(PTSTEP, PSEGLEN, & - KRR, KSV, OUSETKE, KMI, & - PLATOR, PLONOR ) -! -USE MODD_TYPE_DATE -REAL, INTENT(IN) :: PTSTEP ! time step -REAL, INTENT(IN) :: PSEGLEN ! segment length -INTEGER, INTENT(IN) :: KRR ! number of moist variables -INTEGER, INTENT(IN) :: KSV ! number of scalar variables -LOGICAL, INTENT(IN) :: OUSETKE ! flag to use tke -REAL, INTENT(IN) :: PLATOR ! latitude of origine point -REAL, INTENT(IN) :: PLONOR ! longitude of origine point -INTEGER, INTENT(IN) :: KMI ! MODEL NUMBER -! -!------------------------------------------------------------------------------- + SUBROUTINE INI_SURFSTATION_n( ) ! END SUBROUTINE INI_SURFSTATION_n ! @@ -31,11 +17,9 @@ END INTERFACE ! END MODULE MODI_INI_SURFSTATION_n ! -! ######################################################## - SUBROUTINE INI_SURFSTATION_n(PTSTEP, PSEGLEN, & - KRR, KSV, OUSETKE, KMI, & - PLATOR, PLONOR ) -! ######################################################## +! ############################### + SUBROUTINE INI_SURFSTATION_n( ) +! ############################### ! ! !!**** *INI_SURFSTATION_n* - @@ -63,214 +47,101 @@ END MODULE MODI_INI_SURFSTATION_n !! !! MODIFICATIONS !! ------------- -!! P. Tulet 15/01/2002 -!! A. Lemonsu 19/11/2002 +! P. Tulet 15/01/2002 +! A. Lemonsu 19/11/2002 ! P. Wautelet 05/2016-04/2018: new data structures and calls for I/O ! P. Wautelet 13/09/2019: budget: simplify and modernize date/time management ! R. Schoetter 11/2019: work for cartesian coordinates + parallel. ! E.Jezequel 02/2021: read stations from CVS file -!! -------------------------------------------------------------------------- +! P. Wautelet 04/2022: restructure stations for better performance, reduce memory usage and correct some problems/bugs +! -------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ ! USE MODD_ALLSTATION_n -USE MODD_CONF -USE MODD_DIM_n -USE MODD_DYN_n -USE MODD_GRID -USE MODD_GRID_n -USE MODD_LUNIT_n, ONLY: TLUOUT -USE MODD_NESTING -USE MODD_PARAMETERS -USE MODD_SHADOWS_n +USE MODD_CONF, ONLY: LCARTESIAN +USE MODD_DYN, ONLY: XSEGLEN +USE MODD_DYN_n, ONLY: DYN_MODEL, XTSTEP USE MODD_STATION_n -USE MODD_TYPE_DATE -USE MODD_VAR_ll, ONLY: IP +USE MODD_TYPE_STATPROF ! -USE MODE_GATHER_ll -USE MODE_GRIDPROJ -USE MODE_ll USE MODE_MSG -! -USE MODI_INI_STATION_N +USE MODE_STATPROF_READER, ONLY: STATPROF_CSV_READ +USE MODE_STATPROF_TOOLS, ONLY: STATION_ADD, STATION_ALLOCATE, STATPROF_INI_INTERP, STATPROF_POSITION ! IMPLICIT NONE ! ! !* 0.1 declarations of arguments ! -! -REAL, INTENT(IN) :: PTSTEP ! time step -REAL, INTENT(IN) :: PSEGLEN ! segment length -INTEGER, INTENT(IN) :: KRR ! number of moist variables -INTEGER, INTENT(IN) :: KSV ! number of scalar variables -LOGICAL, INTENT(IN) :: OUSETKE ! flag to use tke -REAL, INTENT(IN) :: PLATOR ! latitude of origine point -REAL, INTENT(IN) :: PLONOR ! longitude of origine point -INTEGER, INTENT(IN) :: KMI ! MODEL NUMBER +! NONE ! !------------------------------------------------------------------------------- ! ! 0.2 declaration of local variables ! -INTEGER :: ISTORE ! number of storage instants -INTEGER :: ILUOUT ! logical unit -INTEGER :: IIU_ll,IJU_ll,IRESP -! -!---------------------------------------------------------------------------- -ILUOUT = TLUOUT%NLU -!---------------------------------------------------------------------------- -! -!* 1. Default values -! -------------- -! -CALL DEFAULT_STATION_n(TSTATION) -! -! -!* 3. Stations initialization -! ----------------------- -! -CALL INI_STATION_n -LSTATION = (NUMBSTAT>0) +INTEGER :: INUMBSTAT ! Total number of stations (inside physical domain of model) +INTEGER :: ISTORE ! number of storage instants +INTEGER :: JI +LOGICAL :: GINSIDE ! True if station is inside physical domain of model +LOGICAL :: GPRESENT ! True if station is present on the current process +TYPE(TSTATIONDATA) :: TZSTATION ! !---------------------------------------------------------------------------- -! -!* 4. Allocations of storage arrays -! ----------------------------- -! -IF(NUMBSTAT>0) THEN - CALL ALLOCATE_STATION_n(TSTATION,KMI) - IF (.NOT. LCARTESIAN) CALL INI_INTERP_STATION_n(TSTATION) -ENDIF -!---------------------------------------------------------------------------- -! -CONTAINS -! -!---------------------------------------------------------------------------- -SUBROUTINE DEFAULT_STATION_n(TSTATION) -! -TYPE(STATION), INTENT(INOUT) :: TSTATION -! -NUMBSTAT = 0 -! -TSTATION%T_CUR = XUNDEF -TSTATION%N_CUR = 0 -TSTATION%STEP = XTSTEP -! -END SUBROUTINE DEFAULT_STATION_n -!---------------------------------------------------------------------------- -!---------------------------------------------------------------------------- -SUBROUTINE ALLOCATE_STATION_n(TSTATION,KMI) -! -TYPE(STATION), INTENT(INOUT) :: TSTATION ! -INTEGER, INTENT(IN) :: KMI ! Model Index -! -if ( tstation%step < xtstep ) then - call Print_msg( NVERB_ERROR, 'GEN', 'INI_SURFSTATION_n', 'TSTATION%STEP smaller than XTSTEP' ) - tstation%step = xtstep + +TSTATIONS_TIME%XTSTEP = XSTEP_STAT + +if ( tstations_time%xtstep < xtstep ) then + call Print_msg( NVERB_WARNING, 'GEN', 'INI_SURFSTATION_n', 'Timestep for stations was smaller than model timestep' ) + tstations_time%xtstep = xtstep end if -ISTORE = NINT ( ( PSEGLEN - DYN_MODEL(1)%XTSTEP ) / TSTATION%STEP ) + 1 +ISTORE = NINT ( ( XSEGLEN - DYN_MODEL(1)%XTSTEP ) / TSTATIONS_TIME%XTSTEP ) + 1 -allocate( tstation%tpdates( istore ) ) -ALLOCATE(TSTATION%ERROR (NUMBSTAT)) -ALLOCATE(TSTATION%X (NUMBSTAT)) -ALLOCATE(TSTATION%Y (NUMBSTAT)) -ALLOCATE(TSTATION%SV (ISTORE,NUMBSTAT,KSV)) -ALLOCATE(TSTATION%TSRAD (ISTORE,NUMBSTAT)) -ALLOCATE(TSTATION%ZS (NUMBSTAT)) -ALLOCATE(TSTATION%ZON (ISTORE,NUMBSTAT)) -ALLOCATE(TSTATION%MER (ISTORE,NUMBSTAT)) -ALLOCATE(TSTATION%W (ISTORE,NUMBSTAT)) -ALLOCATE(TSTATION%P (ISTORE,NUMBSTAT)) -ALLOCATE(TSTATION%TH (ISTORE,NUMBSTAT)) -ALLOCATE(TSTATION%R (ISTORE,NUMBSTAT,KRR)) -IF (OUSETKE) THEN - ALLOCATE(TSTATION%TKE (ISTORE,NUMBSTAT)) -ELSE - ALLOCATE(TSTATION%TKE (0,0)) -END IF -ALLOCATE(TSTATION%T2M (ISTORE,NUMBSTAT)) -ALLOCATE(TSTATION%Q2M (ISTORE,NUMBSTAT)) -ALLOCATE(TSTATION%HU2M (ISTORE,NUMBSTAT)) -ALLOCATE(TSTATION%ZON10M (ISTORE,NUMBSTAT)) -ALLOCATE(TSTATION%MER10M (ISTORE,NUMBSTAT)) -ALLOCATE(TSTATION%RN (ISTORE,NUMBSTAT)) -ALLOCATE(TSTATION%H (ISTORE,NUMBSTAT)) -ALLOCATE(TSTATION%LE (ISTORE,NUMBSTAT)) -ALLOCATE(TSTATION%GFLUX (ISTORE,NUMBSTAT)) -ALLOCATE(TSTATION%LEI (ISTORE,NUMBSTAT)) -ALLOCATE(TSTATION%SWD (ISTORE,NUMBSTAT)) -ALLOCATE(TSTATION%SWU (ISTORE,NUMBSTAT)) -ALLOCATE(TSTATION%SWDIR (ISTORE,NUMBSTAT)) -ALLOCATE(TSTATION%SWDIFF (ISTORE,NUMBSTAT)) -ALLOCATE(TSTATION%LWD (ISTORE,NUMBSTAT)) -ALLOCATE(TSTATION%LWU (ISTORE,NUMBSTAT)) -ALLOCATE(TSTATION%DSTAOD (ISTORE,NUMBSTAT)) -ALLOCATE(TSTATION%SFCO2 (ISTORE,NUMBSTAT)) +allocate( tstations_time%tpdates(istore) ) ! -TSTATION%ERROR = .FALSE. -TSTATION%ZON = XUNDEF -TSTATION%MER = XUNDEF -TSTATION%W = XUNDEF -TSTATION%P = XUNDEF -TSTATION%TH = XUNDEF -TSTATION%R = XUNDEF -TSTATION%SV = XUNDEF -TSTATION%TKE = XUNDEF -TSTATION%TSRAD = XUNDEF -TSTATION%ZS = XUNDEF -TSTATION%T2M = XUNDEF -TSTATION%Q2M = XUNDEF -TSTATION%HU2M = XUNDEF -TSTATION%ZON10M = XUNDEF -TSTATION%MER10M = XUNDEF -TSTATION%RN = XUNDEF -TSTATION%H = XUNDEF -TSTATION%LE = XUNDEF -TSTATION%GFLUX = XUNDEF -TSTATION%LEI = XUNDEF -TSTATION%SWD = XUNDEF -TSTATION%SWU = XUNDEF -TSTATION%SWDIR = XUNDEF -TSTATION%SWDIFF = XUNDEF -TSTATION%LWD = XUNDEF -TSTATION%LWU = XUNDEF -TSTATION%DSTAOD = XUNDEF -TSTATION%SFCO2 = XUNDEF +! Stations initialization ! -END SUBROUTINE ALLOCATE_STATION_n -!---------------------------------------------------------------------------- -!---------------------------------------------------------------------------- -SUBROUTINE INI_INTERP_STATION_n(TSTATION) -! -TYPE(STATION), INTENT(INOUT) :: TSTATION ! -INTEGER :: JII ! -INTEGER :: IIU, IJU ! -! -IF ( ALL(TSTATION%LAT(:)/=XUNDEF) .AND. ALL(TSTATION%LON(:)/=XUNDEF) ) THEN - DO JII=1,NUMBSTAT - CALL GET_DIM_EXT_ll ('B',IIU,IJU) - CALL SM_XYHAT(PLATOR,PLONOR, & - TSTATION%LAT(JII), TSTATION%LON(JII), & - TSTATION%X(JII), TSTATION%Y(JII) ) - ENDDO +NUMBSTAT_LOC = 0 + +IF (CFILE_STAT=="NO_INPUT_CSV") THEN + ! Treat namelist + INUMBSTAT = 0 + IF ( NNUMB_STAT > 0 ) THEN + DO JI = 1, NNUMB_STAT + IF ( LCARTESIAN ) THEN + TZSTATION%XX = XX_STAT(JI) + TZSTATION%XY = XY_STAT(JI) + ELSE + TZSTATION%XLAT = XLAT_STAT(JI) + TZSTATION%XLON = XLON_STAT(JI) + CALL STATPROF_INI_INTERP( TZSTATION ) + END IF + TZSTATION%XZ = XZ_STAT(JI) + TZSTATION%CNAME = CNAME_STAT(JI) + + CALL STATPROF_POSITION( TZSTATION, GINSIDE, GPRESENT ) + + IF ( GINSIDE ) THEN + INUMBSTAT = INUMBSTAT + 1 + TZSTATION%NID = INUMBSTAT + END IF + + IF ( GPRESENT ) CALL STATION_ADD( TZSTATION ) + END DO + END IF ELSE -! - WRITE(ILUOUT,*) 'Error in station position ' - WRITE(ILUOUT,*) 'either LATitude or LONgitude segment' - WRITE(ILUOUT,*) 'or I and J segment' - WRITE(ILUOUT,*) 'definition is not complete.' -!callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_SURFSTATION_n','') + !Treat CSV datafile + CALL STATPROF_CSV_READ( TZSTATION, CFILE_STAT, INUMBSTAT ) END IF -! -TSTATION%STEP = MAX ( PTSTEP, TSTATION%STEP ) -! -! -END SUBROUTINE INI_INTERP_STATION_n -!---------------------------------------------------------------------------- + +LSTATION = ( INUMBSTAT > 0 ) + +DO JI = 1, NUMBSTAT_LOC + CALL STATION_ALLOCATE( TSTATIONS(JI), ISTORE ) +END DO + !---------------------------------------------------------------------------- -! + END SUBROUTINE INI_SURFSTATION_n diff --git a/src/MNH/initial_guess.f90 b/src/MNH/initial_guess.f90 index cba1058bc1b554620e674215843be01b2218f9ae..5bfca50c547fa65da6e4f37a100e1667c7442e40 100644 --- a/src/MNH/initial_guess.f90 +++ b/src/MNH/initial_guess.f90 @@ -153,7 +153,7 @@ use modd_budget, only: lbudget_u, lbudget_v, lbudget_w, lbudget_th, lbudg NBUDGET_RR, NBUDGET_RI, NBUDGET_RS, NBUDGET_RG, NBUDGET_RH, NBUDGET_SV1, & lbu_beg, lbu_enable, tbudgets USE MODD_CONF -use modd_conf_n, only: luserv +use modd_conf_n, only: luserv USE MODD_GRID_n use mode_budget, only: Budget_store_init, Budget_store_end diff --git a/src/MNH/khko_notadjust.f90 b/src/MNH/khko_notadjust.f90 index 4ec4ecdab00f6597c1468a95ecef7af467dbf38b..a2639606ed11e7d29346623733c65567418888bf 100644 --- a/src/MNH/khko_notadjust.f90 +++ b/src/MNH/khko_notadjust.f90 @@ -101,7 +101,7 @@ use modd_budget, only: lbudget_th, lbudget_rv, lbudget_rc, lbudget_sv, tbudgets USE MODD_CONF USE MODD_CST -use modd_field, only: TFIELDDATA,TYPEREAL +use modd_field, only: TFIELDMETADATA, TYPEREAL USE MODD_IO, ONLY: TFILEDATA USE MODD_LUNIT_n, ONLY: TLUOUT USE MODD_NSV, ONLY: NSV_C2R2BEG @@ -183,8 +183,8 @@ INTEGER, DIMENSION(:), ALLOCATABLE :: IVEC1 ! Vectors of indices for REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) ::& ZEXNT,ZEXNS,ZT,ZRVSAT,ZWORK,ZLV,ZCPH, ZW1, & ZACT, ZDZ -INTEGER :: JK ! For loop -TYPE(TFIELDDATA) :: TZFIELD +INTEGER :: JK ! For loop +TYPE(TFIELDMETADATA) :: TZFIELD !------------------------------------------------------------------------------- ! @@ -389,28 +389,30 @@ END IF PNPRO(:,:,:) = ZACT(:,:,:) ! IF ( tpfile%lopened ) THEN - TZFIELD%CMNHNAME = 'SURSAT' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'SURSAT' - TZFIELD%CUNITS = '1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_NEB' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .FALSE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'SURSAT', & + CSTDNAME = '', & + CLONGNAME = 'SURSAT', & + CUNITS = '1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_NEB', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .FALSE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK) ! - TZFIELD%CMNHNAME = 'ACT_OD' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'ACT_OD' - TZFIELD%CUNITS = '1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_NEB' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .FALSE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'ACT_OD', & + CSTDNAME = '', & + CLONGNAME = 'ACT_OD', & + CUNITS = '1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_NEB', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .FALSE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZACT) END IF ! diff --git a/src/MNH/kid_model.f90 b/src/MNH/kid_model.f90 index 68fdb5dbc34cb4bceaf5e7b6fe6c3395d85455de..44c18b9eb86c0ce4e08a94c1339cd686a7d98520 100644 --- a/src/MNH/kid_model.f90 +++ b/src/MNH/kid_model.f90 @@ -1,13 +1,8 @@ -!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1999-2023 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 version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. !----------------------------------------------------------------- -!--------------- special set of characters for RCS information -!----------------------------------------------------------------- -! $Source$ $Revision$ -! MASDEV4_7 adiab 2006/05/18 13:07:25 -!----------------------------------------------------------------- !#################### MODULE MODI_KID_MODEL !#################### @@ -76,20 +71,23 @@ RECURSIVE SUBROUTINE KID_MODEL(KMODEL,KTEMP_MODEL,OEXIT) !! ------------- !! !! Original 09/04/99 -!! -!! +! +! P. Wautelet 13/01/2023: close backup files outside MODEL_n (to control close order) +! ! !* 0. DECLARATIONS ! ------------ ! USE MODD_CONF +USE MODD_IO, ONLY: TFILEDATA USE MODD_NESTING +USE MODD_TYPE_DATE, ONLY: DATE_TIME ! -USE MODI_MODEL_n +USE MODE_IO_FILE, ONLY: IO_FILE_CLOSE USE MODE_MODELN_HANDLER -! USE MODE_ll ! +USE MODI_MODEL_n ! !* 0.1 declarations of arguments ! @@ -105,6 +103,8 @@ INTEGER :: JTEMP_KID ! nested temporal loop for the kid model INTEGER :: ITEMP_LOOP ! number of the temporal iteration for the kid model LOGICAL :: GEXIT ! return value of the EXIT signal from MODEL INTEGER :: IINFO_ll ! return code of // routines +TYPE(TFILEDATA), POINTER :: TZBAKFILE ! Backup file +TYPE(DATE_TIME) :: TZDTMODELN ! Date/time of current model computation ! ! !------------------------------------------------------------------------------- @@ -112,7 +112,7 @@ INTEGER :: IINFO_ll ! return code of // routines !* 1. INITIALIZATION ! -------------- ! -DO JKID=KMODEL+1,NMODEL +DO JKID=KMODEL+1,NMODEL ! IF ( NDAD(JKID)==KMODEL ) THEN ! @@ -127,11 +127,15 @@ DO JKID=KMODEL+1,NMODEL ! call the model$n corresponding to JKID CALL GO_TOMODEL_ll(JKID,IINFO_ll) CALL GOTO_MODEL(JKID) - CALL MODEL_n(ITEMP_LOOP,GEXIT) + CALL MODEL_n( ITEMP_LOOP, TZBAKFILE, TZDTMODELN, GEXIT ) ! ! call to the kid models of model JKID CALL KID_MODEL(JKID,ITEMP_LOOP,GEXIT) ! + IF ( TZBAKFILE%LOPENED ) THEN + CALL IO_FILE_CLOSE( TZBAKFILE, TPDTMODELN = TZDTMODELN ) + NULLIFY( TZBAKFILE ) + END IF END DO ! END IF diff --git a/src/MNH/lap_m.f90 b/src/MNH/lap_m.f90 index f1936c828237a3c61b7f54fcb0ab6ee86376396a..5eceef4f0dcd0905c8c1e60b995ef9e4b44d08d1 100644 --- a/src/MNH/lap_m.f90 +++ b/src/MNH/lap_m.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2007-2020 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2007-2023 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. @@ -17,12 +17,12 @@ IMPLICIT NONE CHARACTER (LEN=4), DIMENSION(2), INTENT(IN) :: HLBCX ! x-direction LBC type CHARACTER (LEN=4), DIMENSION(2), INTENT(IN) :: HLBCY ! y-direction LBC type ! -! Metric coefficients: -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX ! d*xx -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY ! d*yy -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZX ! d*zx -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZY ! d*zy -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! d*zz + ! Metric coefficients: +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX ! d*xx +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY ! d*yy +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDZX ! d*zx +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDZY ! d*zy +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! d*zz ! REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! density_reference * J ! @@ -119,12 +119,12 @@ IMPLICIT NONE CHARACTER (LEN=4), DIMENSION(2), INTENT(IN) :: HLBCX ! x-direction LBC type CHARACTER (LEN=4), DIMENSION(2), INTENT(IN) :: HLBCY ! y-direction LBC type ! - ! Metric coefficients: -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX ! d*xx -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY ! d*yy -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZX ! d*zx -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZY ! d*zy -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! d*zz + ! Metric coefficients: +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX ! d*xx +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY ! d*yy +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDZX ! d*zx +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDZY ! d*zy +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! d*zz ! REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! density of reference * J ! diff --git a/src/MNH/latlon_to_xy.f90 b/src/MNH/latlon_to_xy.f90 index 972999064186796b7d4b1721bdd304e0d51f15c4..98b134a36a1cf7e21a18a8cb4c49a3627e5f8490 100644 --- a/src/MNH/latlon_to_xy.f90 +++ b/src/MNH/latlon_to_xy.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1995-2020 CNRS, Meteo-France and Universite Paul Sabatier +!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. @@ -137,7 +137,7 @@ CALL IO_Init() ! CALL INI_CST() ! -CALL INI_FIELD_LIST(1) +CALL INI_FIELD_LIST() ! !* 2. Reading of namelist file ! ------------------------ diff --git a/src/MNH/les_specn.f90 b/src/MNH/les_specn.f90 index 9be8e1f806c535837045c3199af39c14bac9815a..7bbdadc48adc06f7fbc306ecf66851b742cb656d 100644 --- a/src/MNH/les_specn.f90 +++ b/src/MNH/les_specn.f90 @@ -1,16 +1,16 @@ -!MNH_LIC Copyright 2000-2020 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2000-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. !----------------------------------------------------------------- ! Modifications: -! P. Wautelet 12/10/2020: restructure Les_diachro_spec subroutine to use tfield_metadata_base type +! P. Wautelet 12/10/2020: restructure Les_diachro_spec subroutine to use tfieldmetadata_base type !----------------------------------------------------------------- ! ###################### MODULE MODE_LES_SPEC_n ! ###################### -use modd_field, only: tfield_metadata_base +use modd_field, only: tfieldmetadata_base implicit none @@ -22,8 +22,8 @@ public :: Les_spec_n real, dimension(:,:,:,:), allocatable :: xspectrax ! spectra coeffcients for real, dimension(:,:,:,:), allocatable :: xspectray ! x and y direction spectra -type(tfield_metadata_base) :: tlesfieldx -type(tfield_metadata_base) :: tlesfieldy +type(tfieldmetadata_base) :: tlesfieldx +type(tfieldmetadata_base) :: tlesfieldy CONTAINS diff --git a/src/MNH/menu_diachro.f90 b/src/MNH/menu_diachro.f90 index 7c4fcea5abf4f33dfeb259ec7a071b8a9cb1ce44..f6d0ff1c90d5ec2142b8d5115a15e41faef833a6 100644 --- a/src/MNH/menu_diachro.f90 +++ b/src/MNH/menu_diachro.f90 @@ -65,7 +65,7 @@ contains ! ------------ ! USE MODD_CONF -use modd_field, only: tfielddata, TYPEINT +use modd_field, only: tfieldmetadata, TYPEINT USE MODD_IO, only: TFILEDATA use modd_parameters, only: NMNHNAMELGTMAX ! @@ -92,7 +92,7 @@ INTEGER :: IRESPDIA INTEGER,SAVE :: IGROUP=0 INTEGER,DIMENSION(:),ALLOCATABLE :: ITABCHAR LOGICAL :: GPACK -TYPE(TFIELDDATA) :: TZFIELD +TYPE(TFIELDMETADATA) :: TZFIELD type(tfiledata) :: tzfile !------------------------------------------------------------------------------ ! @@ -115,16 +115,17 @@ IF(HGROUP == 'END')THEN ILENG=NMNHNAMELGTMAX*IGROUP - TZFIELD%CMNHNAME = 'MENU_BUDGET.DIM' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'MENU_BUDGET.DIM' - TZFIELD%CUNITS = '' - TZFIELD%CDIR = '--' - TZFIELD%CCOMMENT = '' - TZFIELD%NGRID = 0 - TZFIELD%NTYPE = TYPEINT - TZFIELD%NDIMS = 0 - TZFIELD%LTIMEDEP = .FALSE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'MENU_BUDGET.DIM', & + CSTDNAME = '', & + CLONGNAME = 'MENU_BUDGET.DIM', & + CUNITS = '', & + CDIR = '--', & + CCOMMENT = '', & + NGRID = 0, & + NTYPE = TYPEINT, & + NDIMS = 0, & + LTIMEDEP = .FALSE. ) CALL IO_Field_write(tzfile,TZFIELD,ILENG) ALLOCATE(ITABCHAR(ILENG)) @@ -134,16 +135,17 @@ IF(HGROUP == 'END')THEN ENDDO ENDDO - TZFIELD%CMNHNAME = 'MENU_BUDGET' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'MENU_BUDGET' - TZFIELD%CUNITS = '' - TZFIELD%CDIR = '--' - TZFIELD%CCOMMENT = '' - TZFIELD%NGRID = 0 - TZFIELD%NTYPE = TYPEINT - TZFIELD%NDIMS = 1 - TZFIELD%LTIMEDEP = .FALSE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'MENU_BUDGET', & + CSTDNAME = '', & + CLONGNAME = 'MENU_BUDGET', & + CUNITS = '', & + CDIR = '--', & + CCOMMENT = '', & + NGRID = 0, & + NTYPE = TYPEINT, & + NDIMS = 1, & + LTIMEDEP = .FALSE. ) CALL IO_Field_write(tzfile,TZFIELD,ITABCHAR) DEALLOCATE(ITABCHAR) @@ -154,16 +156,17 @@ ELSE IF(HGROUP == 'READ')THEN tzfile = tpdiafile tzfile%cformat = 'LFI' - TZFIELD%CMNHNAME = 'MENU_BUDGET.DIM' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'MENU_BUDGET.DIM' - TZFIELD%CUNITS = '' - TZFIELD%CDIR = '--' - TZFIELD%CCOMMENT = '' - TZFIELD%NGRID = 0 - TZFIELD%NTYPE = TYPEINT - TZFIELD%NDIMS = 0 - TZFIELD%LTIMEDEP = .FALSE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'MENU_BUDGET.DIM', & + CSTDNAME = '', & + CLONGNAME = 'MENU_BUDGET.DIM', & + CUNITS = '', & + CDIR = '--', & + CCOMMENT = '', & + NGRID = 0, & + NTYPE = TYPEINT, & + NDIMS = 0, & + LTIMEDEP = .FALSE. ) CALL IO_Field_read(tzfile,TZFIELD,ILENG,IRESPDIA) IF(IRESPDIA == -47)THEN ! print *,' No record MENU_BUDGET ' @@ -172,16 +175,17 @@ ELSE IF(HGROUP == 'READ')THEN ENDIF ALLOCATE(ITABCHAR(ILENG)) - TZFIELD%CMNHNAME = 'MENU_BUDGET' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'MENU_BUDGET' - TZFIELD%CUNITS = '' - TZFIELD%CDIR = '--' - TZFIELD%CCOMMENT = '' - TZFIELD%NGRID = 0 - TZFIELD%NTYPE = TYPEINT - TZFIELD%NDIMS = 1 - TZFIELD%LTIMEDEP = .FALSE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'MENU_BUDGET', & + CSTDNAME = '', & + CLONGNAME = 'MENU_BUDGET', & + CUNITS = '', & + CDIR = '--', & + CCOMMENT = '', & + NGRID = 0, & + NTYPE = TYPEINT, & + NDIMS = 1, & + LTIMEDEP = .FALSE. ) CALL IO_Field_read(tzfile,TZFIELD,ITABCHAR) IGROUP=ILENG/NMNHNAMELGTMAX DO JJ=1,IGROUP diff --git a/src/MNH/mesonh.f90 b/src/MNH/mesonh.f90 index dd28504bb919d89831b3b9b1c56e8cc63828331d..ad132c9415468145cee0c8661da3f91204fe370c 100644 --- a/src/MNH/mesonh.f90 +++ b/src/MNH/mesonh.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1994-2023 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. @@ -77,6 +77,7 @@ !! J. Pianezze 01/08/2016 add sfxoasis coupling functions !! P. Wautelet 05/2016-04/2018 new data structures and calls for I/O !! P. Wautelet 06/07/2021 use FINALIZE_MNH +! P. Wautelet 13/01/2023: close backup files outside MODEL_n (to control close order) !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -89,14 +90,17 @@ #endif ! USE MODD_CONF, only: CPROGRAM, NMODEL -USE MODD_NESTING USE MODD_CONF_n +USE MODD_IO, ONLY: TFILEDATA +USE MODD_NESTING +USE MODD_TYPE_DATE, ONLY: DATE_TIME ! USE MODI_MODEL_n USE MODI_KID_MODEL ! USE MODE_FINALIZE_MNH, only: FINALIZE_MNH USE MODE_IO, only: IO_Init +USE MODE_IO_FILE, only: IO_FILE_CLOSE USE MODE_ll USE MODE_MODELN_HANDLER ! @@ -116,11 +120,17 @@ IMPLICIT NONE ! !* 0.1 declarations of local variables ! +TYPE TFILEPTR + TYPE(TFILEDATA), POINTER :: TPFILE +END TYPE TFILEPTR +! INTEGER :: JMODEL ! loop index INTEGER :: ITEMP_MODEL1 ! loop increment -LOGICAL :: GEXIT ! flag for the end of the - ! temporal loop +LOGICAL :: GEXIT ! flag for the end of the temporal loop INTEGER :: IINFO_ll ! return code of // routines +TYPE(TFILEDATA), POINTER :: TZBAKFILE ! Backup file +TYPE(DATE_TIME) :: TZDTMODELN ! Date/time of current model computation +TYPE(TFILEPTR), DIMENSION(:), ALLOCATABLE :: TZBAKFILES ! Array of pointers to backup files ! #ifdef CPLOASIS CHARACTER(LEN=28) :: CNAMELIST @@ -186,13 +196,27 @@ END IF !* 2. TEMPORAL LOOP ! ------------- ! +ALLOCATE( TZBAKFILES( NMODEL ) ) +! DO JMODEL=1,NMODEL CALL GO_TOMODEL_ll(JMODEL,IINFO_ll) CALL GOTO_MODEL(JMODEL) CSTORAGE_TYPE='TT' - CALL MODEL_n(1,GEXIT) + CALL MODEL_n( 1, TZBAKFILES(JMODEL)%TPFILE, TZDTMODELN, GEXIT ) END DO ! +! Close backup files +! This is done after previous loop because parent files must stay open for child files (ie to write balloon positions in restarts) +DO JMODEL = 1, NMODEL + TZBAKFILE => TZBAKFILES(JMODEL)%TPFILE + IF ( TZBAKFILE%LOPENED ) THEN + CALL IO_FILE_CLOSE( TZBAKFILE, TPDTMODELN = TZDTMODELN ) + NULLIFY( TZBAKFILE ) + END IF +END DO +! +DEALLOCATE( TZBAKFILES ) +! IF(GEXIT) THEN !callabortstop CALL ABORT @@ -205,10 +229,15 @@ DO ! CALL GO_TOMODEL_ll(1,IINFO_ll) CALL GOTO_MODEL(1) - CALL MODEL_n(ITEMP_MODEL1,GEXIT) + CALL MODEL_n( ITEMP_MODEL1, TZBAKFILE, TZDTMODELN, GEXIT ) ! CALL KID_MODEL(1,ITEMP_MODEL1,GEXIT) ! + IF ( TZBAKFILE%LOPENED ) THEN + CALL IO_FILE_CLOSE( TZBAKFILE, TPDTMODELN = TZDTMODELN ) + NULLIFY( TZBAKFILE ) + END IF + ! IF(GEXIT) EXIT ! END DO diff --git a/src/MNH/mnh2lpdm.f90 b/src/MNH/mnh2lpdm.f90 index d7ed74c744552ac516721d92bbf73dd793938b14..deb8dda2312cc5000d28482412cf5e4695292e0d 100644 --- a/src/MNH/mnh2lpdm.f90 +++ b/src/MNH/mnh2lpdm.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2002-2020 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2002-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. @@ -78,7 +78,7 @@ CALL GOTO_MODEL(1) CALL VERSION() CALL IO_Init() CALL INI_CST() -CALL INI_FIELD_LIST(1) +CALL INI_FIELD_LIST() CALL INI_FIELD_SCALARS() ! CALL IO_File_add2list(TLUOUT0,'OUTPUT_LISTING1','OUTPUTLISTING','WRITE') diff --git a/src/MNH/mnh2lpdm_ech.f90 b/src/MNH/mnh2lpdm_ech.f90 index 67eb3ed1cfee5dd9b9b67986bac802aa11071fb9..37bd578e933f53f0126b83fa6d3ca9c1cdadbec6 100644 --- a/src/MNH/mnh2lpdm_ech.f90 +++ b/src/MNH/mnh2lpdm_ech.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2009-2020 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2009-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. @@ -36,7 +36,7 @@ USE MODD_TIME ! USE MODD_MNH2LPDM ! -use modd_field, only: tfielddata, TYPEREAL +use modd_field, only: tfieldmetadata, TYPEREAL USE MODE_IO_FILE, only: IO_File_close, IO_File_open USE MODE_IO_FIELD_READ, only: IO_Field_read USE MODE_IO_MANAGE_STRUCT, only: IO_File_add2list @@ -61,7 +61,7 @@ INTEGER :: ICURAA,ICURMM,ICURJJ ! Date courante. INTEGER :: ICURHH,ICURMN,ICURSS ! Heure courante. INTEGER :: JI,JJ,JK TYPE(DATE_TIME) :: TZDTCUR -type(tfielddata) :: tzfield +type(tfieldmetadata) :: tzfield TYPE(TFILEDATA),POINTER :: TZFILE ! ! @@ -110,54 +110,59 @@ CALL IO_Field_read(TPFILE,'WT', XWT) CALL IO_Field_read(TPFILE,'THT', XTHT) CALL IO_Field_read(TPFILE,'TKET', XTKET) -tzfield%cmnhname = 'LM' -tzfield%clongname = '' -tzfield%cunits = 'm' -tzfield%cdir = 'XY' -tzfield%ccomment = 'Mixing length' -tzfield%ngrid = 1 -tzfield%ntype = TYPEREAL -tzfield%ndims = 3 +tzfield = tfieldmetadata( & + cmnhname = 'LM', & + clongname = '', & + cunits = 'm', & + cdir = 'XY', & + ccomment = 'Mixing length', & + ngrid = 1, & + ntype = TYPEREAL, & + ndims = 3 ) CALL IO_Field_read(TPFILE, tzfield, XLM) -tzfield%cmnhname = 'THW_FLX' -tzfield%clongname = '' -tzfield%cunits = 'K s-1' !correct? -tzfield%cdir = 'XY' -tzfield%ccomment = 'Conservative potential temperature vertical flux' -tzfield%ngrid = 4 -tzfield%ntype = TYPEREAL -tzfield%ndims = 3 +tzfield = tfieldmetadata(& + cmnhname = 'THW_FLX', & + clongname = '', & + cunits = 'K s-1', & !correct? + cdir = 'XY', & + ccomment = 'Conservative potential temperature vertical flux', & + ngrid = 4, & + ntype = TYPEREAL, & + ndims = 3 ) CALL IO_Field_read(TPFILE, tzfield, XWPTHP) -tzfield%cmnhname = 'DISS' -tzfield%clongname = '' -tzfield%cunits = '' !TODO: set units -tzfield%cdir = 'XY' -tzfield%ccomment = 'X_Y_Z_DISS' -tzfield%ngrid = 1 -tzfield%ntype = TYPEREAL -tzfield%ndims = 3 +tzfield = tfieldmetadata( & + cmnhname = 'DISS', & + clongname = '', & + cunits = '', & !TODO: set units + cdir = 'XY', & + ccomment = 'X_Y_Z_DISS', & + ngrid = 1, & + ntype = TYPEREAL, & + ndims = 3 ) CALL IO_Field_read(TPFILE, tzfield, XDISSIP) -tzfield%cmnhname = 'FMU' -tzfield%clongname = '' -tzfield%cunits = 'kg m-1 s-2' -tzfield%cdir = 'XY' -tzfield%ccomment = 'X_Y_FMU' -tzfield%ngrid = 4 -tzfield%ntype = TYPEREAL -tzfield%ndims = 2 +tzfield = tfieldmetadata( & + cmnhname = 'FMU', & + clongname = '', & + cunits = 'kg m-1 s-2', & + cdir = 'XY', & + ccomment = 'X_Y_FMU', & + ngrid = 4, & + ntype = TYPEREAL, & + ndims = 2 ) CALL IO_Field_read(TPFILE, tzfield, XSFU) -tzfield%cmnhname = 'FMV' -tzfield%clongname = '' -tzfield%cunits = 'kg m-1 s-2' -tzfield%cdir = 'XY' -tzfield%ccomment = 'X_Y_FMV' -tzfield%ngrid = 4 -tzfield%ntype = TYPEREAL -tzfield%ndims = 2 +tzfield = tfieldmetadata( & + cmnhname = 'FMV', & + clongname = '', & + cunits = 'kg m-1 s-2', & + cdir = 'XY', & + ccomment = 'X_Y_FMV', & + ngrid = 4, & + ntype = TYPEREAL, & + ndims = 2 ) CALL IO_Field_read(TPFILE, tzfield, XSFV) CALL IO_Field_read(TPFILE,'INPRT', XINRT) diff --git a/src/MNH/mnh2lpdm_ini.f90 b/src/MNH/mnh2lpdm_ini.f90 index a430219a2c3e26b0ff17d55d836544c41648e91c..4993f4c293ad828b9f59891251c85a2ca071abc3 100644 --- a/src/MNH/mnh2lpdm_ini.f90 +++ b/src/MNH/mnh2lpdm_ini.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2009-2020 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2009-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. @@ -34,7 +34,7 @@ ! USE MODD_CST USE MODD_DIM_n -use modd_field, only: tfielddata, TYPEREAL +use modd_field, only: tfieldmetadata, TYPEREAL USE MODD_GRID USE MODD_GRID_n USE MODD_IO, ONLY: TFILEDATA @@ -83,7 +83,7 @@ INTEGER, DIMENSION(:), ALLOCATABLE :: TAB1D INTEGER, DIMENSION(:,:), ALLOCATABLE :: TAB2D TYPE(DATE_TIME) :: TZDTCUR1,TZDTCUR2,TZDTEXP1 INTEGER :: IFDAT,IFGRI,IFLOG -type(tfielddata) :: tzfield +type(tfieldmetadata) :: tzfield ! ! ! @@ -207,14 +207,15 @@ CALL IO_Field_read(TPFILE1,'ZS',XZS) ! !* 2.8 Rugosite Z0. ! -tzfield%cmnhname = 'Z0' -tzfield%clongname = '' -tzfield%cunits = 'm' -tzfield%cdir = 'XY' -tzfield%ccomment = 'X_Y_Z0' -tzfield%ngrid = 4 -tzfield%ntype = TYPEREAL -tzfield%ndims = 2 +tzfield = tfieldmetadata( & + cmnhname = 'Z0', & + clongname = '', & + cunits = 'm', & + cdir = 'XY', & + ccomment = 'X_Y_Z0', & + ngrid = 4, & + ntype = TYPEREAL, & + ndims = 2 ) CALL IO_Field_read(TPFILE1,tzfield,XZ0) ! XXPTSOMNH=XXHAT(1)+(XXHAT(2)-XXHAT(1))/2 diff --git a/src/MNH/modd_aircraft_balloon.f90 b/src/MNH/modd_aircraft_balloon.f90 index 33d6f973fbc2407e4d9f72b8922e1d2e1179dc27..98bbd34ed663dd7037ed61a1122f139608284ae5 100644 --- a/src/MNH/modd_aircraft_balloon.f90 +++ b/src/MNH/modd_aircraft_balloon.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2000-2019 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2000-2023 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. @@ -34,165 +34,166 @@ !! Oct,2016 : G.DELAUTIER LIMA ! P. Wautelet 08/02/2019: add missing NULL association for pointers ! P. Wautelet 13/09/2019: budget: simplify and modernize date/time management +! P. Wautelet 06/2022: reorganize flyers !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ ! ! -use modd_type_date, only: date_time +use modd_parameters, only: NNEGUNDEF, XNEGUNDEF, XUNDEF +USE MODD_TYPE_STATPROF, ONLY: TSTATPROFTIME +use modd_type_date, only: date_time + +USE MODE_DATETIME, ONLY: TPREFERENCE_DATE implicit none -TYPE FLYER -! -! -!* general information -! -CHARACTER(LEN=3) :: MODEL ! type of model used for each balloon/aircraft - ! 'FIX' : NMODEL used during the run - ! 'MOB' : change od model depends of the - ! balloon/aircraft location -INTEGER :: NMODEL ! model number for each balloon/aircraft -CHARACTER(LEN=6) :: TYPE ! flyer type: - ! 'RADIOS' : radiosounding balloon - ! 'ISODEN' : iso-density balloon - ! 'AIRCRA' : aircraft - ! 'CVBALL' : Constant Volume balloon -CHARACTER(LEN=10) :: TITLE ! title or name for the balloon/aircraft -TYPE(DATE_TIME) :: LAUNCH ! launch/takeoff date and time -LOGICAL :: CRASH ! occurence of crash -LOGICAL :: FLY ! occurence of flying -! -!* storage monitoring -! -REAL :: T_CUR ! current time since last storage -INTEGER :: N_CUR ! current step of storage -REAL :: STEP ! storage time step -! -!* balloon dynamical characteristics -! -REAL :: LAT ! latitude of launch -REAL :: LON ! lontitude of launch -REAL :: XLAUNCH! X coordinate of launch -REAL :: YLAUNCH! Y coordinate of launch -REAL :: ALT ! altitude of launch (if 'RADIOS' or 'ISODEN' or 'CVBALL') -REAL :: WASCENT! ascent vertical speed (if 'RADIOS') -REAL :: RHO ! density of launch (if 'ISODEN') -REAL :: PRES ! pressure of launch (if 'ISODEN') -REAL :: DIAMETER! apparent diameter of the balloon (m) (if 'CVBALL') -REAL :: AERODRAG! aerodynamic drag coefficient of the balloon (if 'CVBALL') -REAL :: INDDRAG! induced drag coefficient (i.e. air shifted by the balloon) (if 'CVBALL') -REAL :: VOLUME ! volume of the balloon (m3) (if 'CVBALL') -REAL :: MASS ! mass of the balloon (kg) (if 'CVBALL') -! -!* aircraft flight definition -! -INTEGER :: SEG ! number of aircraft flight segments -INTEGER :: SEGCURN ! current flight segment number -REAL :: SEGCURT ! current flight segment time spent -REAL, DIMENSION(:), POINTER :: SEGLAT => NULL() ! latitude of flight segment extremities (LEG+1) -REAL, DIMENSION(:), POINTER :: SEGLON => NULL() ! longitude of flight segment extremities (LEG+1) -REAL, DIMENSION(:), POINTER :: SEGX => NULL() ! X of flight segment extremities (LEG+1) -REAL, DIMENSION(:), POINTER :: SEGY => NULL() ! Y of flight segment extremities (LEG+1) -REAL, DIMENSION(:), POINTER :: SEGP => NULL() ! pressure of flight segment extremities (LEG+1) -REAL, DIMENSION(:), POINTER :: SEGZ => NULL() ! altitude of flight segment extremities (LEG+1) -REAL, DIMENSION(:), POINTER :: SEGTIME => NULL() ! duration of flight segments (LEG ) -! -!* aircraft altitude type definition -! -LOGICAL :: ALTDEF ! TRUE == altitude given in pressure -! -!* current position of the balloon/aircraft -! -REAL :: X_CUR ! current x -REAL :: Y_CUR ! current y -REAL :: Z_CUR ! current z (if 'RADIOS' or 'AIRCRA' and 'ALTDEF' = T) -REAL :: P_CUR ! current p (if 'AIRCRA' and 'ALTDEF' = F) -! -!* data records -! -type(date_time), dimension(:), pointer :: tpdates => NULL() ! dates(n) (n: recording instants) -REAL, DIMENSION(:), POINTER :: X => NULL() ! X(n) -REAL, DIMENSION(:), POINTER :: Y => NULL() ! Y(n) -REAL, DIMENSION(:), POINTER :: Z => NULL() ! Z(n) -REAL, DIMENSION(:), POINTER :: XLON => NULL() ! longitude(n) -REAL, DIMENSION(:), POINTER :: YLAT => NULL() ! latitude (n) -REAL, DIMENSION(:), POINTER :: ZON => NULL() ! zonal wind(n) -REAL, DIMENSION(:), POINTER :: MER => NULL() ! meridian wind(n) -REAL, DIMENSION(:), POINTER :: W => NULL() ! w(n) (air vertical speed) -REAL, DIMENSION(:), POINTER :: P => NULL() ! p(n) -REAL, DIMENSION(:), POINTER :: TKE => NULL() ! tke(n) -REAL, DIMENSION(:), POINTER :: TKE_DISS => NULL() ! tke dissipation rate -REAL, DIMENSION(:), POINTER :: TH => NULL() ! th(n) -REAL, DIMENSION(:,:), POINTER :: R => NULL() ! r*(n) -REAL, DIMENSION(:,:), POINTER :: SV => NULL() ! Sv*(n) -REAL, DIMENSION(:,:), POINTER :: RTZ => NULL() ! tot hydrometeor mixing ratio -REAL, DIMENSION(:,:,:),POINTER :: RZ => NULL() ! water vapour mixing ratio -REAL, DIMENSION(:,:), POINTER :: FFZ => NULL() ! horizontal wind -REAL, DIMENSION(:,:), POINTER :: IWCZ => NULL() ! ice water content -REAL, DIMENSION(:,:), POINTER :: LWCZ => NULL() ! liquid water content -REAL, DIMENSION(:,:), POINTER :: CIZ => NULL() ! Ice concentration -REAL, DIMENSION(:,:), POINTER :: CCZ => NULL() ! Cloud concentration (LIMA) -REAL, DIMENSION(:,:), POINTER :: CRZ => NULL() ! Rain concentration (LIMA) -REAL, DIMENSION(:,:), POINTER :: CRARE => NULL() ! cloud radar reflectivity -REAL, DIMENSION(:,:), POINTER :: CRARE_ATT => NULL() ! attenuated (= more realistic) cloud radar reflectivity -REAL, DIMENSION(:,:), POINTER :: WZ => NULL() ! vertical profile of vertical velocity -REAL, DIMENSION(:,:), POINTER :: ZZ => NULL() ! vertical profile of mass point altitude (above sea) -REAL, DIMENSION(:,:), POINTER :: AER => NULL() ! Extinction at 550 nm -REAL, DIMENSION(:,:), POINTER :: DST_WL => NULL() ! Extinction by wavelength -REAL, DIMENSION(:), POINTER :: ZS => NULL() ! zs(n) -REAL, DIMENSION(:), POINTER :: TSRAD => NULL() ! Ts(n) -! -REAL, DIMENSION(:) , POINTER :: THW_FLUX => NULL() ! thw_flux(n) -REAL, DIMENSION(:) , POINTER :: RCW_FLUX => NULL() ! rcw_flux(n) -REAL, DIMENSION(:,:), POINTER :: SVW_FLUX => NULL() ! psw_flux(n) -END TYPE FLYER -REAL :: XLAM_CRAD ! cloud radar wavelength (m) -! -!------------------------------------------------------------------------------------------- -! -LOGICAL :: LFLYER ! flag to use aircraft/balloons -! -TYPE(FLYER) :: TBALLOON1 ! characteristics and records of a balloon -TYPE(FLYER) :: TBALLOON2 ! characteristics and records of a balloon -TYPE(FLYER) :: TBALLOON3 ! characteristics and records of a balloon -TYPE(FLYER) :: TBALLOON4 ! characteristics and records of a balloon -TYPE(FLYER) :: TBALLOON5 ! characteristics and records of a balloon -TYPE(FLYER) :: TBALLOON6 ! characteristics and records of a balloon -TYPE(FLYER) :: TBALLOON7 ! characteristics and records of a balloon -TYPE(FLYER) :: TBALLOON8 ! characteristics and records of a balloon -TYPE(FLYER) :: TBALLOON9 ! characteristics and records of a balloon -! -TYPE(FLYER) :: TAIRCRAFT1 ! characteristics and records of an aircraft -TYPE(FLYER) :: TAIRCRAFT2 ! characteristics and records of an aircraft -TYPE(FLYER) :: TAIRCRAFT3 ! characteristics and records of an aircraft -TYPE(FLYER) :: TAIRCRAFT4 ! characteristics and records of an aircraft -TYPE(FLYER) :: TAIRCRAFT5 ! characteristics and records of an aircraft -TYPE(FLYER) :: TAIRCRAFT6 ! characteristics and records of an aircraft -TYPE(FLYER) :: TAIRCRAFT7 ! characteristics and records of an aircraft -TYPE(FLYER) :: TAIRCRAFT8 ! characteristics and records of an aircraft -TYPE(FLYER) :: TAIRCRAFT9 ! characteristics and records of an aircraft -TYPE(FLYER) :: TAIRCRAFT10! characteristics and records of an aircraft -TYPE(FLYER) :: TAIRCRAFT11! characteristics and records of an aircraft -TYPE(FLYER) :: TAIRCRAFT12! characteristics and records of an aircraft -TYPE(FLYER) :: TAIRCRAFT13! characteristics and records of an aircraft -TYPE(FLYER) :: TAIRCRAFT14! characteristics and records of an aircraft -TYPE(FLYER) :: TAIRCRAFT15! characteristics and records of an aircraft -TYPE(FLYER) :: TAIRCRAFT16! characteristics and records of an aircraft -TYPE(FLYER) :: TAIRCRAFT17! characteristics and records of an aircraft -TYPE(FLYER) :: TAIRCRAFT18! characteristics and records of an aircraft -TYPE(FLYER) :: TAIRCRAFT19! characteristics and records of an aircraft -TYPE(FLYER) :: TAIRCRAFT20! characteristics and records of an aircraft -TYPE(FLYER) :: TAIRCRAFT21! characteristics and records of an aircraft -TYPE(FLYER) :: TAIRCRAFT22! characteristics and records of an aircraft -TYPE(FLYER) :: TAIRCRAFT23! characteristics and records of an aircraft -TYPE(FLYER) :: TAIRCRAFT24! characteristics and records of an aircraft -TYPE(FLYER) :: TAIRCRAFT25! characteristics and records of an aircraft -TYPE(FLYER) :: TAIRCRAFT26! characteristics and records of an aircraft -TYPE(FLYER) :: TAIRCRAFT27! characteristics and records of an aircraft -TYPE(FLYER) :: TAIRCRAFT28! characteristics and records of an aircraft -TYPE(FLYER) :: TAIRCRAFT29! characteristics and records of an aircraft -TYPE(FLYER) :: TAIRCRAFT30! characteristics and records of an aircraft -! +save + +INTEGER, PARAMETER :: NCRASH_NO = 0 ! Not crashed +INTEGER, PARAMETER :: NCRASH_OUT_HORIZ = 1 ! Flyer is outside of horizontal domain +INTEGER, PARAMETER :: NCRASH_OUT_LOW = 2 ! Flyer crashed on ground (or sea!) +INTEGER, PARAMETER :: NCRASH_OUT_HIGH = 3 ! Flyer is too high (outside of domain) + +INTEGER, PARAMETER :: NFLYER_DEFAULT_RANK = 1 + +LOGICAL :: LFLYER = .FALSE. ! flag to use aircraft/balloons + +TYPE :: TFLYERDATA + ! + !* general information + ! + CHARACTER(LEN=3) :: CMODEL = 'FIX' ! type of model used for each balloon/aircraft + ! 'FIX' : NMODEL used during the run + ! 'MOB' : change od model depends of the + ! balloon/aircraft location + INTEGER :: NMODEL = 0 ! model number for each balloon/aircraft (may change if CMODEL='MOB') + INTEGER :: NID = 0 ! Identification number + CHARACTER(LEN=6) :: CTYPE = '' ! flyer type: + ! 'RADIOS' : radiosounding balloon + ! 'ISODEN' : iso-density balloon + ! 'AIRCRA' : aircraft + ! 'CVBALL' : Constant Volume balloon + CHARACTER(LEN=10) :: CTITLE = '' ! title or name for the balloon/aircraft + TYPE(DATE_TIME) :: TLAUNCH = TPREFERENCE_DATE ! launch/takeoff date and time + LOGICAL :: LCRASH = .FALSE. ! occurence of crash + INTEGER :: NCRASH = NCRASH_NO + LOGICAL :: LFLY = .FALSE. ! occurence of flying + ! + !* storage monitoring + ! + LOGICAL :: LSTORE = .FALSE. ! Do we have to store data now + TYPE(TSTATPROFTIME) :: TFLYER_TIME ! Time management for flyer + ! + !* current position of the balloon/aircraft + ! + REAL :: XX_CUR = XNEGUNDEF ! current x + REAL :: XY_CUR = XNEGUNDEF ! current y + REAL :: XZ_CUR = XNEGUNDEF ! current z (if 'RADIOS' or 'AIRCRA' and 'ALTDEF' = T) + INTEGER :: NRANK_CUR = NFLYER_DEFAULT_RANK ! Rank of the process where the flyer is + ! + !* data records + ! + INTEGER, DIMENSION(:), ALLOCATABLE :: NMODELHIST ! List of models where data has been computed + REAL, DIMENSION(:), ALLOCATABLE :: XX ! X(n) + REAL, DIMENSION(:), ALLOCATABLE :: XY ! Y(n) + REAL, DIMENSION(:), ALLOCATABLE :: XZ ! Z(n) + REAL, DIMENSION(:), ALLOCATABLE :: XLAT ! latitude (n) + REAL, DIMENSION(:), ALLOCATABLE :: XLON ! longitude(n) + REAL, DIMENSION(:), ALLOCATABLE :: XZON ! zonal wind(n) + REAL, DIMENSION(:), ALLOCATABLE :: XMER ! meridian wind(n) + REAL, DIMENSION(:), ALLOCATABLE :: XW ! w(n) (air vertical speed) + REAL, DIMENSION(:), ALLOCATABLE :: XP ! p(n) + REAL, DIMENSION(:), ALLOCATABLE :: XTKE ! tke(n) + REAL, DIMENSION(:), ALLOCATABLE :: XTKE_DISS ! tke dissipation rate + REAL, DIMENSION(:), ALLOCATABLE :: XTH ! th(n) + REAL, DIMENSION(:,:), ALLOCATABLE :: XR ! r*(n) + REAL, DIMENSION(:,:), ALLOCATABLE :: XSV ! Sv*(n) + REAL, DIMENSION(:,:), ALLOCATABLE :: XRTZ ! tot hydrometeor mixing ratio + REAL, DIMENSION(:,:,:), ALLOCATABLE :: XRZ ! water vapour mixing ratio + REAL, DIMENSION(:,:), ALLOCATABLE :: XFFZ ! horizontal wind + REAL, DIMENSION(:,:), ALLOCATABLE :: XIWCZ ! ice water content + REAL, DIMENSION(:,:), ALLOCATABLE :: XLWCZ ! liquid water content + REAL, DIMENSION(:,:), ALLOCATABLE :: XCIZ ! Ice concentration + REAL, DIMENSION(:,:), ALLOCATABLE :: XCCZ ! Cloud concentration (LIMA) + REAL, DIMENSION(:,:), ALLOCATABLE :: XCRZ ! Rain concentration (LIMA) + REAL, DIMENSION(:,:), ALLOCATABLE :: XCRARE ! cloud radar reflectivity + REAL, DIMENSION(:,:), ALLOCATABLE :: XCRARE_ATT ! attenuated (= more realistic) cloud radar reflectivity + REAL, DIMENSION(:,:), ALLOCATABLE :: XWZ ! vertical profile of vertical velocity + REAL, DIMENSION(:,:), ALLOCATABLE :: XZZ ! vertical profile of mass point altitude (above sea) + REAL, DIMENSION(:), ALLOCATABLE :: XZS ! zs(n) + REAL, DIMENSION(:), ALLOCATABLE :: XTSRAD ! Ts(n) + ! + REAL, DIMENSION(:), ALLOCATABLE :: XTHW_FLUX ! thw_flux(n) + REAL, DIMENSION(:), ALLOCATABLE :: XRCW_FLUX ! rcw_flux(n) + REAL, DIMENSION(:,:), ALLOCATABLE :: XSVW_FLUX ! psw_flux(n) +END TYPE TFLYERDATA + +TYPE, EXTENDS( TFLYERDATA ) :: TAIRCRAFTDATA + LOGICAL :: LTOOKOFF = .FALSE. ! Set to true once the aircraft takes off + ! + !* aircraft flight definition + ! + INTEGER :: NPOS = 0 ! number of aircraft positions (segment extremities) + INTEGER :: NPOSCUR = 1 ! current flight segment number + REAL, DIMENSION(:), ALLOCATABLE :: XPOSLAT ! latitude of flight segment extremities (LEG+1) + REAL, DIMENSION(:), ALLOCATABLE :: XPOSLON ! longitude of flight segment extremities (LEG+1) + REAL, DIMENSION(:), ALLOCATABLE :: XPOSX ! X of flight segment extremities (LEG+1) + REAL, DIMENSION(:), ALLOCATABLE :: XPOSY ! Y of flight segment extremities (LEG+1) + REAL, DIMENSION(:), ALLOCATABLE :: XPOSP ! pressure of flight segment extremities (LEG+1) + REAL, DIMENSION(:), ALLOCATABLE :: XPOSZ ! altitude of flight segment extremities (LEG+1) + REAL, DIMENSION(:), ALLOCATABLE :: XPOSTIME ! time since launch (corresponding to flight segments extremities (LEG+1) + TYPE(DATE_TIME) :: TLAND = TPREFERENCE_DATE ! landing / end of flight date and time + ! + !* aircraft altitude type definition + ! + LOGICAL :: LALTDEF = .FALSE. ! TRUE == altitude given in pressure + REAL :: XP_CUR = XNEGUNDEF ! current p (only if LALTDEF = F) +END TYPE TAIRCRAFTDATA + +TYPE, EXTENDS( TFLYERDATA ) :: TBALLOONDATA + LOGICAL :: LPOSITION_INIT = .FALSE. ! True if initial position has been computed + ! + !* balloon dynamical characteristics + ! + REAL :: XLATLAUNCH = XUNDEF ! latitude of launch + REAL :: XLONLAUNCH = XUNDEF ! lontitude of launch + REAL :: XXLAUNCH = XUNDEF ! X coordinate of launch + REAL :: XYLAUNCH = XUNDEF ! Y coordinate of launch + REAL :: XALTLAUNCH = XNEGUNDEF ! altitude of launch (if 'RADIOS' or 'ISODEN' or 'CVBALL') + REAL :: XWASCENT = XNEGUNDEF ! ascent vertical speed, m/s (constant if 'RADIOS' or variable if 'CVBALL') + REAL :: XRHO = XNEGUNDEF ! density of launch (if 'ISODEN') + REAL :: XPRES = XNEGUNDEF ! pressure of launch (if 'ISODEN' or 'CVBALL') + REAL :: XDIAMETER = XNEGUNDEF ! apparent diameter of the balloon (m) (if 'CVBALL') + REAL :: XAERODRAG = XNEGUNDEF ! aerodynamic drag coefficient of the balloon (if 'CVBALL') + REAL :: XINDDRAG = XNEGUNDEF ! induced drag coefficient (i.e. air shifted by the balloon) (if 'CVBALL') + REAL :: XVOLUME = XNEGUNDEF ! volume of the balloon (m3) (if 'CVBALL') + REAL :: XMASS = XNEGUNDEF ! mass of the balloon (kg) (if 'CVBALL') + + TYPE(DATE_TIME) :: TPOS_CUR = TPREFERENCE_DATE ! Time corresponding to the current position (XX_CUR, XY_CUR...) + +END TYPE TBALLOONDATA + +INTEGER :: NAIRCRAFTS = 0 ! Total number of aircrafts +INTEGER :: NBALLOONS = 0 ! Total number of balloons + +TYPE TAIRCRAFT_PTR + TYPE(TAIRCRAFTDATA), POINTER :: TAIRCRAFT => NULL() +END TYPE TAIRCRAFT_PTR + +TYPE TBALLOON_PTR + TYPE(TBALLOONDATA), POINTER :: TBALLOON => NULL() +END TYPE TBALLOON_PTR + +TYPE(TAIRCRAFT_PTR), DIMENSION(:), ALLOCATABLE :: TAIRCRAFTS ! characteristics and records of the aircrafts + +TYPE(TBALLOON_PTR), DIMENSION(:), ALLOCATABLE :: TBALLOONS ! characteristics and records of the balloons + +INTEGER, DIMENSION(:), ALLOCATABLE :: NRANKCUR_AIRCRAFT ! Array to store the rank of the process where a given aircraft is present +INTEGER, DIMENSION(:), ALLOCATABLE :: NRANKNXT_AIRCRAFT ! Array to store the rank of the process where a given aircraft is going + +INTEGER, DIMENSION(:), ALLOCATABLE :: NRANKCUR_BALLOON ! Array to store the rank of the process where a given ballon is present +INTEGER, DIMENSION(:), ALLOCATABLE :: NRANKNXT_BALLOON ! Array to store the rank of the process where a given ballon is going + END MODULE MODD_AIRCRAFT_BALLOON diff --git a/src/MNH/modd_allprofilern.f90 b/src/MNH/modd_allprofilern.f90 new file mode 100644 index 0000000000000000000000000000000000000000..fd7cd8eb21b2e5938cb4f72068f2cfe466e72c65 --- /dev/null +++ b/src/MNH/modd_allprofilern.f90 @@ -0,0 +1,99 @@ +!MNH_LIC Copyright 2021-2022 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_ALLPROFILER_n +! ############################ +! +!!**** *MODD_PROFILER* - declaration of profilers +!! +!! PURPOSE +!! ------- +! The purpose of this declarative module is to define +! the different profilers. +! +!! +!!** IMPLICIT ARGUMENTS +!! ------------------ +!! NONE +!! +!! REFERENCE +!! --------- +!! +!! AUTHOR +!! ------ +!! E. Jezequel *Meteo France* +!! +!! MODIFICATIONS +!! ------------- +!! Original 01/06/21 +! P. Wautelet 04/2022: restructure stations for better performance, reduce memory usage and correct some problems/bugs +! P. Wautelet 27/04/2022: copied from modd_allstationn.f90 +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +! +USE MODD_PARAMETERS, ONLY: JPMODELMAX, NFILENAMELGTMAX, NSTATPROFNAMELGTMAX + +IMPLICIT NONE + +PRIVATE + +PUBLIC :: NNUMB_PROF, XSTEP_PROF, XX_PROF, XY_PROF, XLAT_PROF, XLON_PROF, XZ_PROF +PUBLIC :: CNAME_PROF, CFILE_PROF !, LDIAG_SURFRAD + +PUBLIC :: ALLPROFILER_GOTO_MODEL + +TYPE ALLPROFILER_t +! +!------------------------------------------------------------------------------------------- +! +! + INTEGER :: NNUMB_PROF !Number of stations as defined in namelist + REAL, DIMENSION(100) :: XX_PROF, XY_PROF, XZ_PROF, XLAT_PROF, XLON_PROF + CHARACTER(LEN=NSTATPROFNAMELGTMAX), DIMENSION(100) :: CNAME_PROF + CHARACTER(LEN=NFILENAMELGTMAX) :: CFILE_PROF + REAL :: XSTEP_PROF +! LOGICAL :: LDIAG_SURFRAD + ! +! +END TYPE ALLPROFILER_t + +TYPE(ALLPROFILER_t), DIMENSION(JPMODELMAX), TARGET, SAVE :: ALLPROFILER_MODEL + +INTEGER, POINTER :: NNUMB_PROF=>NULL() +REAL, POINTER :: XSTEP_PROF=>NULL() +REAL, DIMENSION(:), POINTER :: XX_PROF=>NULL() +REAL, DIMENSION(:), POINTER :: XY_PROF=>NULL() +REAL, DIMENSION(:), POINTER :: XLAT_PROF=>NULL() +REAL, DIMENSION(:), POINTER :: XLON_PROF=>NULL() +REAL, DIMENSION(:), POINTER :: XZ_PROF=>NULL() +CHARACTER (LEN=NSTATPROFNAMELGTMAX),DIMENSION(:), POINTER :: CNAME_PROF=>NULL() +CHARACTER (LEN=NFILENAMELGTMAX),POINTER :: CFILE_PROF=>NULL() +!LOGICAL, POINTER :: LDIAG_SURFRAD=>NULL() +CONTAINS + +SUBROUTINE ALLPROFILER_GOTO_MODEL(KFROM, KTO) +INTEGER, INTENT(IN) :: KFROM, KTO +! +! Save current state for allocated arrays +! +! Current model is set to model KTO + +NNUMB_PROF =>ALLPROFILER_MODEL(KTO)%NNUMB_PROF +XSTEP_PROF =>ALLPROFILER_MODEL(KTO)%XSTEP_PROF +XX_PROF =>ALLPROFILER_MODEL(KTO)%XX_PROF +XY_PROF =>ALLPROFILER_MODEL(KTO)%XY_PROF +XZ_PROF =>ALLPROFILER_MODEL(KTO)%XZ_PROF +XLAT_PROF =>ALLPROFILER_MODEL(KTO)%XLAT_PROF +XLON_PROF =>ALLPROFILER_MODEL(KTO)%XLON_PROF +CNAME_PROF =>ALLPROFILER_MODEL(KTO)%CNAME_PROF +CFILE_PROF =>ALLPROFILER_MODEL(KTO)%CFILE_PROF +!LDIAG_SURFRAD =>ALLPROFILER_MODEL(KTO)%LDIAG_SURFRAD +END SUBROUTINE ALLPROFILER_GOTO_MODEL + +END MODULE MODD_ALLPROFILER_n diff --git a/src/MNH/modd_allstationn.f90 b/src/MNH/modd_allstationn.f90 index 933c1657174cab1dfee31f99a8be37abddbb3a12..4fe0a7be7e95b4677d7a9dd3f4752d996ace1d7a 100644 --- a/src/MNH/modd_allstationn.f90 +++ b/src/MNH/modd_allstationn.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2021-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2021-2022 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. @@ -29,18 +29,24 @@ !! MODIFICATIONS !! ------------- !! Original 01/06/21 +! P. Wautelet 04/2022: restructure stations for better performance, reduce memory usage and correct some problems/bugs !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ ! ! -USE MODD_PARAMETERS, ONLY: JPMODELMAX -USE MODD_STATION_n -USE MODD_TYPE_STATION +USE MODD_PARAMETERS, ONLY: JPMODELMAX, NFILENAMELGTMAX, NSTATPROFNAMELGTMAX IMPLICIT NONE +PRIVATE + +PUBLIC :: NNUMB_STAT, XSTEP_STAT, XX_STAT, XY_STAT, XLAT_STAT, XLON_STAT, XZ_STAT +PUBLIC :: CNAME_STAT, CFILE_STAT, LDIAG_SURFRAD + +PUBLIC :: ALLSTATION_GOTO_MODEL + TYPE ALLSTATION_t ! !------------------------------------------------------------------------------------------- @@ -48,8 +54,8 @@ TYPE ALLSTATION_t ! INTEGER :: NNUMB_STAT !Number of stations as defined in namelist REAL, DIMENSION(100) :: XX_STAT, XY_STAT, XZ_STAT, XLAT_STAT, XLON_STAT - CHARACTER(LEN=7), DIMENSION(100) :: CNAME_STAT, CTYPE_STAT - CHARACTER(LEN=20) :: CFILE_STAT + CHARACTER(LEN=NSTATPROFNAMELGTMAX), DIMENSION(100) :: CNAME_STAT + CHARACTER(LEN=NFILENAMELGTMAX) :: CFILE_STAT REAL :: XSTEP_STAT LOGICAL :: LDIAG_SURFRAD ! @@ -65,9 +71,8 @@ REAL, DIMENSION(:), POINTER :: XY_STAT=>NULL() REAL, DIMENSION(:), POINTER :: XLAT_STAT=>NULL() REAL, DIMENSION(:), POINTER :: XLON_STAT=>NULL() REAL, DIMENSION(:), POINTER :: XZ_STAT=>NULL() -CHARACTER (LEN=7),DIMENSION(:), POINTER :: CNAME_STAT=>NULL() -CHARACTER (LEN=7),DIMENSION(:), POINTER :: CTYPE_STAT=>NULL() -CHARACTER (LEN=20),POINTER :: CFILE_STAT=>NULL() +CHARACTER (LEN=NSTATPROFNAMELGTMAX),DIMENSION(:), POINTER :: CNAME_STAT=>NULL() +CHARACTER (LEN=NFILENAMELGTMAX),POINTER :: CFILE_STAT=>NULL() LOGICAL, POINTER :: LDIAG_SURFRAD=>NULL() CONTAINS @@ -86,7 +91,6 @@ XZ_STAT =>ALLSTATION_MODEL(KTO)%XZ_STAT XLAT_STAT =>ALLSTATION_MODEL(KTO)%XLAT_STAT XLON_STAT =>ALLSTATION_MODEL(KTO)%XLON_STAT CNAME_STAT =>ALLSTATION_MODEL(KTO)%CNAME_STAT -CTYPE_STAT =>ALLSTATION_MODEL(KTO)%CTYPE_STAT CFILE_STAT =>ALLSTATION_MODEL(KTO)%CFILE_STAT LDIAG_SURFRAD =>ALLSTATION_MODEL(KTO)%LDIAG_SURFRAD END SUBROUTINE ALLSTATION_GOTO_MODEL diff --git a/src/MNH/modd_ch_flxn.f90 b/src/MNH/modd_ch_flxn.f90 index 47c729a93a24003e3a3b7871975de0cb25e07a9f..4a1e9930f89e90856336d4f43d5d06219972f102 100644 --- a/src/MNH/modd_ch_flxn.f90 +++ b/src/MNH/modd_ch_flxn.f90 @@ -1,13 +1,8 @@ -!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2016-2022 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 version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. !----------------------------------------------------------------- -!--------------- special set of characters for RCS information -!----------------------------------------------------------------- -! $Source: /home/cvsroot/MNH-VX-Y-Z/src/MNH/modd_ch_flxn.f90,v $ $Revision: 1.1 $ -! MASDEV5_2 modd 2016/06/27 14:05:40 -!----------------------------------------------------------------- ! ##################### MODULE MODD_CH_FLX_n ! ###################### @@ -42,7 +37,7 @@ IMPLICIT NONE TYPE CH_FLX_t ! - REAL, DIMENSION(:,:,:), POINTER :: XCHFLX=>NULL() ! chemical fluxes ppp.m/s at t + REAL, DIMENSION(:,:,:), POINTER :: XCHFLX=>NULL() ! chemical fluxes ppv.m/s at t ! END TYPE CH_FLX_t diff --git a/src/MNH/modd_gridn.f90 b/src/MNH/modd_gridn.f90 index 055d3c88f76b4634b987607db83365a12e58710f..c5fcc566b9620e98dcfc4ba13eced5232bed2cda 100644 --- a/src/MNH/modd_gridn.f90 +++ b/src/MNH/modd_gridn.f90 @@ -1,6 +1,6 @@ -!MNH_LIC Copyright 1994-2018 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1994-2022 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 version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. !----------------------------------------------------------------- ! ################## @@ -31,22 +31,45 @@ !! !! MODIFICATIONS !! ------------- -!! Original 05/05/94 -!! J. Stein 15/11/95 add the slope angle -!! V. Ducrocq 13/08/98 // : add XLATOR_ll and XLONOR_ll -!! V. Masson nov 2004 supress XLATOR,XLONOR,XLATOR_ll,XLONOR_ll -!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O +! Original 05/05/94 +! J. Stein 15/11/95: add the slope angle +! V. Ducrocq 13/08/98: //: add XLATOR_ll and XLONOR_ll +! V. Masson 11/2004: supress XLATOR, XLONOR, XLATOR_ll, XLONOR_ll +! P. Wautelet 05/2016-04/2018: new data structures and calls for I/O +! P. Wautelet 09/2022: add XXHATM, XYHATM, XZHATM, XHAT_BOUND, XHATM_BOUND, +! XXHAT_ll, XYHAT_ll, XXHATM_ll and XYHATM_ll !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ ! USE MODD_PARAMETERS, ONLY: JPMODELMAX + IMPLICIT NONE +SAVE + +! Parameters for XHAT_BOUND and XHATM_BOUND +INTEGER, PARAMETER :: NHAT_BOUND_SIZE = 12 +INTEGER, PARAMETER :: NPHYS_XMIN = 1 ! Position of minimum position in physical domain in x direction +INTEGER, PARAMETER :: NPHYS_XMAX = 2 ! Position of maximum position in physical domain in x direction +INTEGER, PARAMETER :: NPHYS_YMIN = 3 ! Position of minimum position in physical domain in y direction +INTEGER, PARAMETER :: NPHYS_YMAX = 4 ! Position of maximum position in physical domain in y direction +INTEGER, PARAMETER :: NPHYS_ZMIN = 5 ! Position of minimum position in physical domain in z direction +INTEGER, PARAMETER :: NPHYS_ZMAX = 6 ! Position of maximum position in physical domain in z direction +INTEGER, PARAMETER :: NEXTE_XMIN = 7 ! Position of minimum position in extended domain in x direction +INTEGER, PARAMETER :: NEXTE_XMAX = 8 ! Position of maximum position in extended domain in x direction +INTEGER, PARAMETER :: NEXTE_YMIN = 9 ! Position of minimum position in extended domain in y direction +INTEGER, PARAMETER :: NEXTE_YMAX = 10 ! Position of maximum position in extended domain in y direction +INTEGER, PARAMETER :: NEXTE_ZMIN = 11 ! Position of minimum position in extended domain in z direction +INTEGER, PARAMETER :: NEXTE_ZMAX = 12 ! Position of maximum position in extended domain in z direction + + REAL, DIMENSION(:,:), POINTER :: XLON=>NULL(),XLAT=>NULL() ! Longitude and latitude REAL, DIMENSION(:), POINTER :: XXHAT=>NULL() ! Position x in the conformal or cartesian plane REAL, DIMENSION(:), POINTER :: XYHAT=>NULL() ! Position y in the conformal or cartesian plane +REAL, DIMENSION(:), POINTER :: XXHATM=>NULL() ! Position x in the conformal or cartesian plane at mass points +REAL, DIMENSION(:), POINTER :: XYHATM=>NULL() ! Position y in the conformal or cartesian plane at mass points REAL, DIMENSION(:), POINTER :: XDXHAT=>NULL() ! horizontal stretching in x REAL, DIMENSION(:), POINTER :: XDYHAT=>NULL() ! horizontal stretching in y REAL, DIMENSION(:,:), POINTER :: XMAP=>NULL() ! Map factor @@ -54,6 +77,7 @@ REAL, DIMENSION(:,:), POINTER :: XZS=>NULL() ! orography REAL, DIMENSION(:,:,:),POINTER :: XZZ=>NULL() ! height z REAL, POINTER :: XZTOP=>NULL() ! model top (m) REAL, DIMENSION(:), POINTER :: XZHAT=>NULL() ! height level without orography +REAL, DIMENSION(:), POINTER :: XZHATM=>NULL() ! height level without orography at mass points REAL, DIMENSION(:,:), POINTER :: XDIRCOSXW=>NULL(),XDIRCOSYW=>NULL(),XDIRCOSZW=>NULL() ! director cosinus of the normal ! to the ground surface REAL, DIMENSION(:,:), POINTER :: XCOSSLOPE=>NULL() ! cosinus of the angle between i and the slope vector @@ -63,5 +87,11 @@ LOGICAL, POINTER :: LSLEVE=>NULL() ! Logical for SLEVE REAL, POINTER :: XLEN1=>NULL() ! Decay scale for smooth topography REAL, POINTER :: XLEN2=>NULL() ! Decay scale for small-scale topography deviation REAL, DIMENSION(:,:), POINTER :: XZSMT=>NULL() ! smooth orography for SLEVE coordinate +REAL, DIMENSION(:), POINTER :: XHAT_BOUND => NULL() ! Boundaries of global domain at u and v points +REAL, DIMENSION(:), POINTER :: XHATM_BOUND => NULL() ! Boundaries of global domain at mass points +REAL, DIMENSION(:), POINTER :: XXHAT_ll => NULL() ! Position x in the conformal or cartesian plane (all domain) +REAL, DIMENSION(:), POINTER :: XYHAT_ll => NULL() ! Position y in the conformal or cartesian plane (all domain) +REAL, DIMENSION(:), POINTER :: XXHATM_ll => NULL() ! Position x in the conformal or cartesian plane at mass points (all domain) +REAL, DIMENSION(:), POINTER :: XYHATM_ll => NULL() ! Position y in the conformal or cartesian plane (all domain) at mass points END MODULE MODD_GRID_n diff --git a/src/MNH/modd_nsv.f90 b/src/MNH/modd_nsv.f90 index 2ec859b7dc098d4fdbe5e13d0794ccea1e87d26c..47fce4f4f9d39bf81d85edc66542d4ee9c075ce6 100644 --- a/src/MNH/modd_nsv.f90 +++ b/src/MNH/modd_nsv.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2001-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2001-2022 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. @@ -28,30 +28,35 @@ !! Pialat/Tulet 15/02/12 add ForeFire !! Modification 01/2016 (JP Pinty) Add LIMA !! V. Vionnet 07/17 add blowing snow -! P. Wautelet 10/03/2021: add CSVNAMES and CSVNAMES_A to store the name of all the scalar variables ! B. Vie 06/2021: add prognostic supersaturation for LIMA +! P. Wautelet 26/11/2021: add TSVLIST and TSVLIST_A to store the metadata of all the scalar variables ! A. Costes 12/2021: add Blaze fire model smoke -! +! P. Wautelet 14/01/2022: add CSV_CHEM_LIST(_A) to store the list of all chemical variables +! + NSV_CHEM_LIST(_A) the size of the list !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ ! -USE MODD_PARAMETERS, ONLY : JPMODELMAX, & ! Maximum allowed number of nested models - JPSVMAX, & ! Maximum number of scalar variables - JPSVNAMELGTMAX ! Maximum length of a scalar variable name +USE MODD_FIELD, ONLY: tfieldmetadata +USE MODD_PARAMETERS, ONLY: JPMODELMAX, & ! Maximum allowed number of nested models + JPSVMAX, & ! Maximum number of scalar variables + JPSVNAMELGTMAX, & ! Maximum length of a scalar variable name + NMNHNAMELGTMAX ! IMPLICIT NONE SAVE ! REAL,DIMENSION(JPSVMAX) :: XSVMIN ! minimum value for SV variables ! -LOGICAL :: LINI_NSV = .FALSE. ! becomes True when routine INI_NSV is called +LOGICAL :: LINI_NSV(JPMODELMAX) = .FALSE. ! becomes True when routine INI_NSV is called ! -CHARACTER(LEN=JPSVNAMELGTMAX), DIMENSION(:,:), ALLOCATABLE, TARGET :: CSVNAMES_A !Names of all the scalar variables +CHARACTER(LEN=NMNHNAMELGTMAX), DIMENSION(:,:), ALLOCATABLE, TARGET :: CSV_CHEM_LIST_A !Names of all the chemical variables +TYPE(tfieldmetadata), DIMENSION(:,:), ALLOCATABLE, TARGET :: TSVLIST_A !Metadata of all the scalar variables INTEGER,DIMENSION(JPMODELMAX)::NSV_A = 0 ! total number of scalar variables ! NSV_A = NSV_USER_A+NSV_C2R2_A+NSV_CHEM_A+.. +INTEGER,DIMENSION(JPMODELMAX)::NSV_CHEM_LIST_A = 0 ! total number of chemical variables (including dust, salt...) INTEGER,DIMENSION(JPMODELMAX)::NSV_USER_A = 0 ! number of user scalar variables with ! indices in the range : 1...NSV_USER_A ! @@ -90,7 +95,7 @@ INTEGER,DIMENSION(JPMODELMAX)::NSV_LGEND_A = 0 ! NSV_LGBEG_A...NSV_LGEND_A ! INTEGER,DIMENSION(JPMODELMAX)::NSV_LNOX_A = 0 ! number of lightning NOx INTEGER,DIMENSION(JPMODELMAX)::NSV_LNOXBEG_A = 0 ! with indices in the range : -INTEGER,DIMENSION(JPMODELMAX)::NSV_LNOXEND_A = 0 ! NSV_LNOXBEG_A...NSV_LNOXEND_A ! +INTEGER,DIMENSION(JPMODELMAX)::NSV_LNOXEND_A = 0 ! NSV_LNOXBEG_A...NSV_LNOXEND_A INTEGER,DIMENSION(JPMODELMAX)::NSV_DST_A = 0 ! number of dust scalar INTEGER,DIMENSION(JPMODELMAX)::NSV_DSTBEG_A = 0 ! with indices in the range : INTEGER,DIMENSION(JPMODELMAX)::NSV_DSTEND_A = 0 ! NSV_DSTBEG_A...NSV_DSTEND_A @@ -145,6 +150,7 @@ INTEGER,DIMENSION(JPMODELMAX)::NSV_LIMA_SPRO_A = 0 ! Supersaturation INTEGER,DIMENSION(JPMODELMAX)::NSV_FF_A = 0 ! number of ForeFire scalar variables INTEGER,DIMENSION(JPMODELMAX)::NSV_FFBEG_A = 0 ! with indices in the range : INTEGER,DIMENSION(JPMODELMAX)::NSV_FFEND_A = 0 ! NSV_FFBEG_A...NSV_FFEND_A +! #endif ! Blaze smoke indexes INTEGER,DIMENSION(JPMODELMAX)::NSV_FIRE_A = 0 ! number of Blaze smoke scalar variables @@ -159,10 +165,15 @@ INTEGER,DIMENSION(JPMODELMAX)::NSV_SNWEND_A = 0 ! NSV_SNWBEG_A...NSV_SNWEND_A ! ! variables updated for the current model ! -CHARACTER(LEN=JPSVNAMELGTMAX), DIMENSION(:), POINTER :: CSVNAMES !Names of all the scalar variables +CHARACTER(LEN=NMNHNAMELGTMAX), DIMENSION(:), POINTER :: CSV_CHEM_LIST !Names of all the chemical variables +TYPE(tfieldmetadata), DIMENSION(:), POINTER :: TSVLIST !Metadata of all the scalar variables + CHARACTER(LEN=6), DIMENSION(:), ALLOCATABLE :: CSV ! name of the scalar variables + INTEGER :: NSV = 0 ! total number of user scalar variables ! +INTEGER :: NSV_CHEM_LIST = 0 ! total number of chemical variables (including dust, salt...) +! INTEGER :: NSV_USER = 0 ! number of user scalar variables with indices ! in the range : 1...NSV_USER INTEGER :: NSV_C2R2 = 0 ! number of liq scalar used in C2R2 and in C3R5 @@ -255,6 +266,7 @@ INTEGER :: NSV_LIMA_SPRO ! INTEGER :: NSV_FF = 0 ! number of ForeFire scalar variables INTEGER :: NSV_FFBEG = 0 ! with indices in the range : INTEGER :: NSV_FFEND = 0 ! NSV_FFBEG...NSV_FFEND +! #endif ! Blaze smoke INTEGER :: NSV_FIRE = 0 ! number of Blaze smoke scalar variables diff --git a/src/MNH/modd_parameters.f90 b/src/MNH/modd_parameters.f90 index c21c6e70955e1e1ecbe501225f6d3f83dd66a1ec..c848073f93201f6d291e7003dba2fa21601ae5aa 100644 --- a/src/MNH/modd_parameters.f90 +++ b/src/MNH/modd_parameters.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1994-2020 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1994-2022 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. @@ -39,10 +39,12 @@ !! Modification 17/05/04 (P.Jabouille) add JPOUTMAX !! J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 !! B.VIE 2016 LIMA -! P. Wautelet: 05/2016-04/2018: new data structures and calls for I/O -! Q. Rodier 29/03/2019: increase maximum number of outputs to 999 -! P. Wautelet 17/01/2020: add NBUNAMELGTMAX and NCOMMENTLGTMAX parameters -! P. Wautelet 13/03/2020: remove JPBUMAX and JPBUPROMAX +! P. Wautelet: 05/2016-04/2018: new data structures and calls for I/O +! Q. Rodier 29/03/2019: increase maximum number of outputs to 999 +! P. Wautelet 17/01/2020: add NBUNAMELGTMAX and NCOMMENTLGTMAX parameters +! P. Wautelet 13/03/2020: remove JPBUMAX and JPBUPROMAX +! P. Wautelet 24/09/2021: add NLONGNAMELGTMAX and NUNITLGTMAX parameters +! P. Wautelet 20/04/2022: add NSTATPROFNAMELGTMAX parameter !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -78,11 +80,15 @@ INTEGER, PARAMETER :: JPDUMMY = 20 ! Size of dummy array INTEGER, PARAMETER :: JPOUTMAX = 999 ! Maximum allowed number of OUTput files INTEGER, PARAMETER :: JPOUTVARMAX = 192 ! Maximum allowed number of variables in an output file ! -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 :: 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 :: NLONGNAMELGTMAX = 32 ! Maximum length of the long name of a variable (CF convention) +INTEGER, PARAMETER :: NUNITLGTMAX = 40 ! Maximum length of the canonical units of a variable (CF convention) ! +INTEGER, PARAMETER :: NSTATPROFNAMELGTMAX = 8 ! Maximum length for the name of a station or profiler + 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 diff --git a/src/MNH/modd_precision.f90 b/src/MNH/modd_precision.f90 index a759ddf1f11072a20864f52cc148e8e3fa66d79d..83db215583b5eda80510ea23e0baefafbb7866ac 100644 --- a/src/MNH/modd_precision.f90 +++ b/src/MNH/modd_precision.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2019-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2019-2022 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. @@ -10,6 +10,7 @@ ! P. Wautelet 27/03/2019: add MNHTIME and MNHTIME_MPI ! P. Wautelet 26/04/2019: add MNHLOG and MNHLOG_MPI/MNHLOG32_MPI/MNHLOG64_MPI ! P. Wautelet 06/01/2021: use kind=CDFINT to define parameters used in netCDF calls +! P. Wautelet 25/08/2022: add CDFINT_MPI parameter !----------------------------------------------------------------- module modd_precision @@ -37,7 +38,7 @@ public :: MNHTIME, MNHTIME_MPI public :: LFIINT #ifdef MNH_IOCDF4 -public :: CDFINT, MNHINT_NF90, MNHREAL_NF90 +public :: CDFINT, CDFINT_MPI, MNHINT_NF90, MNHREAL_NF90 #endif integer, parameter :: MNHINT32 = selected_int_kind( r = 9 ) @@ -117,6 +118,7 @@ integer, parameter :: LFIINT = MNHINT64 #ifdef MNH_IOCDF4 ! Kinds for netCDF integer, parameter :: CDFINT = selected_int_kind( r = 9 ) +integer, parameter :: CDFINT_MPI = MPI_INTEGER4 #if (MNH_INT == 4) integer(kind=CDFINT), parameter :: MNHINT_NF90 = NF90_INT diff --git a/src/MNH/modd_profilern.f90 b/src/MNH/modd_profilern.f90 index d8fb2469f8b7550feac893f47c6491287f7c840a..3abfe6611c28229209d7ccd573edb89995900643 100644 --- a/src/MNH/modd_profilern.f90 +++ b/src/MNH/modd_profilern.f90 @@ -1,23 +1,18 @@ -!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2002-2022 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 version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. !----------------------------------------------------------------- -!--------------- special set of characters for RCS information -!----------------------------------------------------------------- -! $Source$ $Revision$ -! MASDEV4_7 modd 2006/05/18 13:07:25 -!----------------------------------------------------------------- ! ############################ MODULE MODD_PROFILER_n ! ############################ ! -!!**** *MODD_PROFILER* - declaration of stations +!!**** *MODD_PROFILER* - declaration of profilers !! !! PURPOSE !! ------- ! The purpose of this declarative module is to define -! the different stations types. +! the different profilers types. ! !! !!** IMPLICIT ARGUMENTS @@ -34,32 +29,42 @@ !! MODIFICATIONS !! ------------- !! Original 15/01/02 +! P. Wautelet 04/2022: restructure profilers for better performance, reduce memory usage and correct some problems/bugs !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ ! ! -USE MODD_TYPE_PROFILER -USE MODD_PARAMETERS, ONLY: JPMODELMAX +USE MODD_PARAMETERS, ONLY: JPMODELMAX +USE MODD_TYPE_STATPROF, ONLY: TPROFILERDATA, TSTATPROFTIME + IMPLICIT NONE +PRIVATE + +PUBLIC :: LPROFILER, NUMBPROFILER_LOC, TPROFILERS_TIME, TPROFILERS + +PUBLIC :: PROFILER_GOTO_MODEL + TYPE PROFILER_t ! !------------------------------------------------------------------------------------------- ! - LOGICAL :: LPROFILER ! flag to use stations - INTEGER :: NUMBPROFILER ! number of stations + LOGICAL :: LPROFILER ! flag to use profilers + INTEGER :: NUMBPROFILER_LOC = 0 ! number of profilers on this process ! - TYPE(PROFILER) :: TPROFILER ! characteristics and records of an aircraft + TYPE(TSTATPROFTIME) :: TPROFILERS_TIME + TYPE(TPROFILERDATA), DIMENSION(:), POINTER :: TPROFILERS ! characteristics and records of the profilers ! END TYPE PROFILER_t TYPE(PROFILER_t), DIMENSION(JPMODELMAX), TARGET, SAVE :: PROFILER_MODEL LOGICAL, POINTER :: LPROFILER=>NULL() -INTEGER, POINTER :: NUMBPROFILER=>NULL() -TYPE(PROFILER), POINTER :: TPROFILER=>NULL() +INTEGER, POINTER :: NUMBPROFILER_LOC=>NULL() +TYPE(TSTATPROFTIME), POINTER :: TPROFILERS_TIME => NULL() +TYPE(TPROFILERDATA), DIMENSION(:), POINTER :: TPROFILERS => NULL() CONTAINS @@ -67,11 +72,13 @@ SUBROUTINE PROFILER_GOTO_MODEL(KFROM, KTO) INTEGER, INTENT(IN) :: KFROM, KTO ! ! Save current state for allocated arrays +PROFILER_MODEL(KFROM)%TPROFILERS => TPROFILERS ! ! Current model is set to model KTO -LPROFILER=>PROFILER_MODEL(KTO)%LPROFILER -NUMBPROFILER=>PROFILER_MODEL(KTO)%NUMBPROFILER -TPROFILER=>PROFILER_MODEL(KTO)%TPROFILER +LPROFILER => PROFILER_MODEL(KTO)%LPROFILER +NUMBPROFILER_LOC => PROFILER_MODEL(KTO)%NUMBPROFILER_LOC +TPROFILERS_TIME => PROFILER_MODEL(KTO)%TPROFILERS_TIME +TPROFILERS => PROFILER_MODEL(KTO)%TPROFILERS END SUBROUTINE PROFILER_GOTO_MODEL diff --git a/src/MNH/modd_shadowsn.f90 b/src/MNH/modd_shadowsn.f90 index b2ca81707df06b07af367dae7b3cfaa2fa989626..ebb1372e4bc024324ad861deaf87c0002511ab4b 100644 --- a/src/MNH/modd_shadowsn.f90 +++ b/src/MNH/modd_shadowsn.f90 @@ -1,13 +1,8 @@ -!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2012-2022 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 version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. !----------------------------------------------------------------- -!--------------- special set of characters for RCS information -!----------------------------------------------------------------- -! $Source$ $Revision$ -! MASDEV4_7 modd 2006/11/23 17:28:44 -!----------------------------------------------------------------- ! ######################## MODULE MODD_SHADOWS_n ! ######################## @@ -34,7 +29,7 @@ !! MODIFICATIONS !! ------------- !! Original 04/2012 -!! +! P. Wautelet 22/09/2022: remove XXHAT_ll and XYHAT_ll (now in modd_grid_n) !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -52,8 +47,6 @@ TYPE SHADOWS_t REAL, DIMENSION(:,:), POINTER :: XZS_XY=>NULL() ! orography at vort. points REAL, DIMENSION(:,:), POINTER :: XZS_ll=>NULL() ! orography at mass points (all domain) REAL, DIMENSION(:,:), POINTER :: XZS_XY_ll=>NULL() ! orography at vort. points (all domain) - REAL, DIMENSION(:), POINTER :: XXHAT_ll=>NULL() ! X coordinate (all domain) - REAL, DIMENSION(:), POINTER :: XYHAT_ll=>NULL() ! Y coordinate (all domain) ! ! END TYPE SHADOWS_t @@ -64,8 +57,6 @@ REAL, POINTER :: XZS_MAX_ll=>NULL() REAL, DIMENSION(:,:), POINTER :: XZS_XY=>NULL() REAL, DIMENSION(:,:), POINTER :: XZS_ll=>NULL() REAL, DIMENSION(:,:), POINTER :: XZS_XY_ll=>NULL() -REAL, DIMENSION(:), POINTER :: XXHAT_ll=>NULL() -REAL, DIMENSION(:), POINTER :: XYHAT_ll=>NULL() CONTAINS @@ -76,16 +67,12 @@ INTEGER, INTENT(IN) :: KFROM, KTO SHADOWS_MODEL(KFROM)%XZS_XY=>XZS_XY SHADOWS_MODEL(KFROM)%XZS_ll=>XZS_ll SHADOWS_MODEL(KFROM)%XZS_XY_ll=>XZS_XY_ll -SHADOWS_MODEL(KFROM)%XXHAT_ll=>XXHAT_ll -SHADOWS_MODEL(KFROM)%XYHAT_ll=>XYHAT_ll ! ! Current model is set to model KTO XZS_MAX_ll=>SHADOWS_MODEL(KTO)%XZS_MAX_ll XZS_XY=>SHADOWS_MODEL(KTO)%XZS_XY XZS_ll=>SHADOWS_MODEL(KTO)%XZS_ll XZS_XY_ll=>SHADOWS_MODEL(KTO)%XZS_XY_ll -XXHAT_ll=>SHADOWS_MODEL(KTO)%XXHAT_ll -XYHAT_ll=>SHADOWS_MODEL(KTO)%XYHAT_ll END SUBROUTINE SHADOWS_GOTO_MODEL diff --git a/src/MNH/modd_spawn.f90 b/src/MNH/modd_spawn.f90 index 8d432e588f5fbce395ee2385fb50883f8eb5f41e..6efedc643dbbef8fdf2a9e5e52c8f72c68afcaf7 100644 --- a/src/MNH/modd_spawn.f90 +++ b/src/MNH/modd_spawn.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1994-2018 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1999-2022 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. @@ -66,6 +66,7 @@ CHARACTER (LEN=28) :: CDADSPAFILE ! DAD fm-file for spawning file REAL,DIMENSION(:), SAVE,POINTER :: XXHAT1 => NULL() REAL,DIMENSION(:), SAVE,POINTER :: XYHAT1 => NULL() REAL,DIMENSION(:), SAVE,POINTER :: XZHAT1 => NULL() +REAL,DIMENSION(:), SAVE,POINTER :: XZHATM1 => NULL() REAL, SAVE,POINTER :: XZTOP1 => NULL() REAL,DIMENSION(:,:), SAVE,POINTER :: XZS1 => NULL() REAL,DIMENSION(:,:), SAVE,POINTER :: XZSMT1 => NULL() diff --git a/src/MNH/modd_stationn.f90 b/src/MNH/modd_stationn.f90 index fe16b769732e659cb6ec94f8683dafe2f1200f64..406d14909bec8ed563486f0ec51262b8f52ead70 100644 --- a/src/MNH/modd_stationn.f90 +++ b/src/MNH/modd_stationn.f90 @@ -1,13 +1,8 @@ -!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2002-2022 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 version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. !----------------------------------------------------------------- -!--------------- special set of characters for RCS information -!----------------------------------------------------------------- -! $Source$ $Revision$ -! MASDEV4_7 modd 2006/05/18 13:07:25 -!----------------------------------------------------------------- ! ############################ MODULE MODD_STATION_n ! ############################ @@ -34,34 +29,42 @@ !! MODIFICATIONS !! ------------- !! Original 15/01/02 +! P. Wautelet 04/2022: restructure stations for better performance, reduce memory usage and correct some problems/bugs !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ ! ! -USE MODD_TYPE_STATION -USE MODD_PARAMETERS, ONLY: JPMODELMAX +USE MODD_PARAMETERS, ONLY: JPMODELMAX +USE MODD_TYPE_STATPROF, ONLY: TSTATIONDATA, TSTATPROFTIME + IMPLICIT NONE +PRIVATE + +PUBLIC :: LSTATION, NUMBSTAT_LOC, TSTATIONS_TIME, TSTATIONS + +PUBLIC :: STATION_GOTO_MODEL + TYPE STATION_t ! !------------------------------------------------------------------------------------------- ! LOGICAL :: LSTATION ! flag to use stations - INTEGER :: NUMBSTAT ! number of stations - LOGICAL :: LSTATLAT ! positioning in lat/lon + INTEGER :: NUMBSTAT_LOC = 0 ! number of stations on this process ! - TYPE(STATION) :: TSTATION ! characteristics and records of a station + TYPE(TSTATPROFTIME) :: TSTATIONS_TIME + TYPE(TSTATIONDATA), DIMENSION(:), POINTER :: TSTATIONS ! characteristics and records of the stations ! END TYPE STATION_t TYPE(STATION_t), DIMENSION(JPMODELMAX), TARGET, SAVE :: STATION_MODEL LOGICAL, POINTER :: LSTATION=>NULL() -INTEGER, POINTER :: NUMBSTAT=>NULL() -LOGICAL, POINTER :: LSTATLAT=>NULL() -TYPE(STATION), POINTER :: TSTATION=>NULL() +INTEGER, POINTER :: NUMBSTAT_LOC=>NULL() +TYPE(TSTATPROFTIME), POINTER :: TSTATIONS_TIME => NULL() +TYPE(TSTATIONDATA), DIMENSION(:), POINTER :: TSTATIONS => NULL() CONTAINS @@ -69,12 +72,13 @@ SUBROUTINE STATION_GOTO_MODEL(KFROM, KTO) INTEGER, INTENT(IN) :: KFROM, KTO ! ! Save current state for allocated arrays +STATION_MODEL(KFROM)%TSTATIONS => TSTATIONS ! ! Current model is set to model KTO -LSTATION=>STATION_MODEL(KTO)%LSTATION -NUMBSTAT=>STATION_MODEL(KTO)%NUMBSTAT -LSTATLAT=>STATION_MODEL(KTO)%LSTATLAT -TSTATION=>STATION_MODEL(KTO)%TSTATION +LSTATION => STATION_MODEL(KTO)%LSTATION +NUMBSTAT_LOC => STATION_MODEL(KTO)%NUMBSTAT_LOC +TSTATIONS_TIME => STATION_MODEL(KTO)%TSTATIONS_TIME +TSTATIONS => STATION_MODEL(KTO)%TSTATIONS END SUBROUTINE STATION_GOTO_MODEL diff --git a/src/MNH/modd_sub_elecn.f90 b/src/MNH/modd_sub_elecn.f90 index d25df3084adf326595431c9d9e122baa7a90aa1e..1f5b6b9405c83f091bcb41bcf5bb6f5270b1d820 100644 --- a/src/MNH/modd_sub_elecn.f90 +++ b/src/MNH/modd_sub_elecn.f90 @@ -1,13 +1,8 @@ -!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2011-2022 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 version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. !----------------------------------------------------------------- -!--------------- special set of characters for RCS information -!----------------------------------------------------------------- -! $Source$ $Revision$ -! MASDEV4_7 modd 2006/06/27 12:43:28 -!----------------------------------------------------------------- !! ############################ MODULE MODD_SUB_ELEC_n !! ############################ @@ -32,6 +27,7 @@ !! MODIFICATIONS !! ------------- !! Original 07/11 +! P. Wautelet 31/08/2022: remove ZXMASS and ZYMASS (use XXHATM and XYHATM instead) !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -50,8 +46,6 @@ TYPE SUB_ELEC_t INTEGER , DIMENSION(:), POINTER :: ISNBSEG=>NULL() ! Number of flash segments INTEGER , DIMENSION(:), POINTER :: ISTCOUNT_NUMBER=>NULL() ! Temporal loop number of the flash INTEGER , DIMENSION(:), POINTER :: ISTYPE=>NULL() ! flash type :IC, CGN or CGP - REAL , DIMENSION(:), POINTER :: ZXMASS=>NULL() ! Coord. at mass points - REAL , DIMENSION(:), POINTER :: ZYMASS=>NULL() ! Coord. at mass points REAL , DIMENSION(:,:,:), POINTER :: ZZMASS=>NULL() ! Coord. at mass points REAL , DIMENSION(:,:,:), POINTER :: ZPRES_COEF=>NULL() ! Pressure effect for E REAL , DIMENSION(:,:,:), POINTER :: ZSCOORD_SEG=>NULL() ! Global coordinates of segments @@ -71,8 +65,6 @@ TYPE(SUB_ELEC_t), DIMENSION(JPMODELMAX), TARGET, SAVE :: SUB_ELEC_MODEL INTEGER , DIMENSION(:), POINTER :: ISNBSEG=>NULL() INTEGER , DIMENSION(:), POINTER :: ISTCOUNT_NUMBER=>NULL() INTEGER , DIMENSION(:), POINTER :: ISTYPE=>NULL() - REAL , DIMENSION(:), POINTER :: ZXMASS=>NULL() - REAL , DIMENSION(:), POINTER :: ZYMASS=>NULL() REAL , DIMENSION(:,:,:), POINTER :: ZZMASS=>NULL() REAL , DIMENSION(:,:,:), POINTER :: ZPRES_COEF=>NULL() REAL , DIMENSION(:,:,:), POINTER :: ZSCOORD_SEG=>NULL() @@ -92,8 +84,6 @@ SUB_ELEC_MODEL(KFROM)%ISCELL_NUMBER=>ISCELL_NUMBER SUB_ELEC_MODEL(KFROM)%ISNBSEG=>ISNBSEG SUB_ELEC_MODEL(KFROM)%ISTCOUNT_NUMBER=>ISTCOUNT_NUMBER SUB_ELEC_MODEL(KFROM)%ISTYPE=>ISTYPE -SUB_ELEC_MODEL(KFROM)%ZXMASS=>ZXMASS -SUB_ELEC_MODEL(KFROM)%ZYMASS=>ZYMASS SUB_ELEC_MODEL(KFROM)%ZZMASS=>ZZMASS SUB_ELEC_MODEL(KFROM)%ZPRES_COEF=>ZPRES_COEF SUB_ELEC_MODEL(KFROM)%ZSCOORD_SEG=>ZSCOORD_SEG @@ -109,8 +99,6 @@ ISCELL_NUMBER=>SUB_ELEC_MODEL(KTO)%ISCELL_NUMBER ISNBSEG=>SUB_ELEC_MODEL(KTO)%ISNBSEG ISTCOUNT_NUMBER=>SUB_ELEC_MODEL(KTO)%ISTCOUNT_NUMBER ISTYPE=>SUB_ELEC_MODEL(KTO)%ISTYPE -ZXMASS=>SUB_ELEC_MODEL(KTO)%ZXMASS -ZYMASS=>SUB_ELEC_MODEL(KTO)%ZYMASS ZZMASS=>SUB_ELEC_MODEL(KTO)%ZZMASS ZPRES_COEF=>SUB_ELEC_MODEL(KTO)%ZPRES_COEF ZSCOORD_SEG=>SUB_ELEC_MODEL(KTO)%ZSCOORD_SEG diff --git a/src/MNH/modd_sub_profilern.f90 b/src/MNH/modd_sub_profilern.f90 deleted file mode 100644 index 14582b74ba45f032c41dff8e0538b195e8fc56c9..0000000000000000000000000000000000000000 --- a/src/MNH/modd_sub_profilern.f90 +++ /dev/null @@ -1,109 +0,0 @@ -!MNH_LIC Copyright 1994-2014 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. -!----------------------------------------------------------------- -!--------------- special set of characters for RCS information -!----------------------------------------------------------------- -! $Source$ $Revision$ -! MASDEV4_7 modd 2006/06/27 12:30:56 -!----------------------------------------------------------------- -! ############################ - MODULE MODD_SUB_PROFILER_n -! ############################ -! -!!**** *MODD_PROFILER* - declaration of stations -!! -!! PURPOSE -!! ------- -! The purpose of this declarative module is to define -! the different stations types. -! -!! -!!** IMPLICIT ARGUMENTS -!! ------------------ -!! NONE -!! -!! REFERENCE -!! --------- -!! -!! AUTHOR -!! ------ -!! P. Tulet *Meteo France* -!! -!! MODIFICATIONS -!! ------------- -!! Original 15/01/02 -!------------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -! -USE MODD_PARAMETERS, ONLY: JPMODELMAX -IMPLICIT NONE - -TYPE SUB_PROFILER_t -! -!------------------------------------------------------------------------------------------- -! - LOGICAL :: GPROFILERFIRSTCALL = .TRUE. -! - INTEGER,DIMENSION(:), POINTER :: II=>NULL() ! mass lidar position (x index) - INTEGER,DIMENSION(:), POINTER :: IJ=>NULL() ! mass lidar position (y index) - INTEGER,DIMENSION(:), POINTER :: IU=>NULL() ! U flux point lidar position (x index) - INTEGER,DIMENSION(:), POINTER :: IV=>NULL() ! V flux point lidar position (y index) -! - REAL, DIMENSION(:), POINTER :: ZTHIS_PROCS=>NULL() -! - REAL,DIMENSION(:), POINTER :: ZXCOEF=>NULL() ! X direction interpolation coefficient - REAL,DIMENSION(:), POINTER :: ZUCOEF=>NULL() ! X direction interpolation coefficient (for U) - REAL,DIMENSION(:), POINTER :: ZYCOEF=>NULL() ! Y direction interpolation coefficient - REAL,DIMENSION(:), POINTER :: ZVCOEF=>NULL() ! Y direction interpolation coefficient (for V) - -END TYPE SUB_PROFILER_t - -TYPE(SUB_PROFILER_t), DIMENSION(JPMODELMAX), TARGET, SAVE :: SUB_PROFILER_MODEL - -LOGICAL, POINTER :: GPROFILERFIRSTCALL=>NULL() -INTEGER,DIMENSION(:), POINTER :: II=>NULL() -INTEGER,DIMENSION(:), POINTER :: IJ=>NULL() -INTEGER,DIMENSION(:), POINTER :: IU=>NULL() -INTEGER,DIMENSION(:), POINTER :: IV=>NULL() -REAL, DIMENSION(:), POINTER :: ZTHIS_PROCS=>NULL() -REAL,DIMENSION(:), POINTER :: ZXCOEF=>NULL() -REAL,DIMENSION(:), POINTER :: ZUCOEF=>NULL() -REAL,DIMENSION(:), POINTER :: ZYCOEF=>NULL() -REAL,DIMENSION(:), POINTER :: ZVCOEF=>NULL() - -CONTAINS - -SUBROUTINE SUB_PROFILER_GOTO_MODEL(KFROM, KTO) -INTEGER, INTENT(IN) :: KFROM, KTO -! -! Save current state for allocated arrays -SUB_PROFILER_MODEL(KFROM)%II=>II -SUB_PROFILER_MODEL(KFROM)%IJ=>IJ -SUB_PROFILER_MODEL(KFROM)%IU=>IU -SUB_PROFILER_MODEL(KFROM)%IV=>IV -SUB_PROFILER_MODEL(KFROM)%ZTHIS_PROCS=>ZTHIS_PROCS -SUB_PROFILER_MODEL(KFROM)%ZXCOEF=>ZXCOEF -SUB_PROFILER_MODEL(KFROM)%ZUCOEF=>ZUCOEF -SUB_PROFILER_MODEL(KFROM)%ZYCOEF=>ZYCOEF -SUB_PROFILER_MODEL(KFROM)%ZVCOEF=>ZVCOEF -! -! Current model is set to model KTO -GPROFILERFIRSTCALL=>SUB_PROFILER_MODEL(KTO)%GPROFILERFIRSTCALL -II=>SUB_PROFILER_MODEL(KTO)%II -IJ=>SUB_PROFILER_MODEL(KTO)%IJ -IU=>SUB_PROFILER_MODEL(KTO)%IU -IV=>SUB_PROFILER_MODEL(KTO)%IV -ZTHIS_PROCS=>SUB_PROFILER_MODEL(KTO)%ZTHIS_PROCS -ZXCOEF=>SUB_PROFILER_MODEL(KTO)%ZXCOEF -ZUCOEF=>SUB_PROFILER_MODEL(KTO)%ZUCOEF -ZYCOEF=>SUB_PROFILER_MODEL(KTO)%ZYCOEF -ZVCOEF=>SUB_PROFILER_MODEL(KTO)%ZVCOEF - -END SUBROUTINE SUB_PROFILER_GOTO_MODEL - -END MODULE MODD_SUB_PROFILER_n diff --git a/src/MNH/modd_sub_stationn.f90 b/src/MNH/modd_sub_stationn.f90 deleted file mode 100644 index d9fffb3ecf6ee5131fc7b45a8e4cb6e5ce0983f5..0000000000000000000000000000000000000000 --- a/src/MNH/modd_sub_stationn.f90 +++ /dev/null @@ -1,108 +0,0 @@ -!MNH_LIC Copyright 1994-2014 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. -!----------------------------------------------------------------- -!--------------- special set of characters for RCS information -!----------------------------------------------------------------- -! $Source$ $Revision$ -! MASDEV4_7 modd 2006/06/27 12:28:56 -!----------------------------------------------------------------- -! ############################ - MODULE MODD_SUB_STATION_n -! ############################ -! -!!**** *MODD_STATION* - declaration of stations -!! -!! PURPOSE -!! ------- -! The purpose of this declarative module is to define -! the different stations types. -! -!! -!!** IMPLICIT ARGUMENTS -!! ------------------ -!! NONE -!! -!! REFERENCE -!! --------- -!! -!! AUTHOR -!! ------ -!! P. Tulet *Meteo France* -!! -!! MODIFICATIONS -!! ------------- -!! Original 15/01/02 -!------------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -! -USE MODD_PARAMETERS, ONLY: JPMODELMAX -IMPLICIT NONE - -TYPE SUB_STATION_t -! - LOGICAL :: GSTATFIRSTCALL = .TRUE. ! -! - INTEGER,DIMENSION(:), POINTER :: II=>NULL() ! mass station position (x index) - INTEGER,DIMENSION(:), POINTER :: IJ=>NULL() ! mass station position (y index) - INTEGER,DIMENSION(:), POINTER :: IU=>NULL() ! U flux point station position (x index) - INTEGER,DIMENSION(:), POINTER :: IV=>NULL() ! V flux point station position (y index) -! - REAL, DIMENSION(:), POINTER :: ZTHIS_PROCS=>NULL() ! -! - REAL,DIMENSION(:), POINTER :: ZXCOEF=>NULL() ! X direction interpolation coefficient - REAL,DIMENSION(:), POINTER :: ZUCOEF=>NULL() ! X direction interpolation coefficient (for U) - REAL,DIMENSION(:), POINTER :: ZYCOEF=>NULL() ! Y direction interpolation coefficient - REAL,DIMENSION(:), POINTER :: ZVCOEF=>NULL() ! Y direction interpolation coefficient (for V) -! - -END TYPE SUB_STATION_t - -TYPE(SUB_STATION_t), DIMENSION(JPMODELMAX), TARGET, SAVE :: SUB_STATION_MODEL - -LOGICAL, POINTER :: GSTATFIRSTCALL=>NULL() -INTEGER,DIMENSION(:), POINTER :: II=>NULL() -INTEGER,DIMENSION(:), POINTER :: IJ=>NULL() -INTEGER,DIMENSION(:), POINTER :: IU=>NULL() -INTEGER,DIMENSION(:), POINTER :: IV=>NULL() -REAL, DIMENSION(:), POINTER :: ZTHIS_PROCS=>NULL() -REAL,DIMENSION(:), POINTER :: ZXCOEF=>NULL() -REAL,DIMENSION(:), POINTER :: ZUCOEF=>NULL() -REAL,DIMENSION(:), POINTER :: ZYCOEF=>NULL() -REAL,DIMENSION(:), POINTER :: ZVCOEF=>NULL() - -CONTAINS - -SUBROUTINE SUB_STATION_GOTO_MODEL(KFROM, KTO) -INTEGER, INTENT(IN) :: KFROM, KTO -! -! Save current state for allocated arrays -SUB_STATION_MODEL(KFROM)%II=>II -SUB_STATION_MODEL(KFROM)%IJ=>IJ -SUB_STATION_MODEL(KFROM)%IU=>IU -SUB_STATION_MODEL(KFROM)%IV=>IV -SUB_STATION_MODEL(KFROM)%ZTHIS_PROCS=>ZTHIS_PROCS -SUB_STATION_MODEL(KFROM)%ZXCOEF=>ZXCOEF -SUB_STATION_MODEL(KFROM)%ZUCOEF=>ZUCOEF -SUB_STATION_MODEL(KFROM)%ZYCOEF=>ZYCOEF -SUB_STATION_MODEL(KFROM)%ZVCOEF=>ZVCOEF -! -! Current model is set to model KTO -GSTATFIRSTCALL=>SUB_STATION_MODEL(KTO)%GSTATFIRSTCALL -II=>SUB_STATION_MODEL(KTO)%II -IJ=>SUB_STATION_MODEL(KTO)%IJ -IU=>SUB_STATION_MODEL(KTO)%IU -IV=>SUB_STATION_MODEL(KTO)%IV -ZTHIS_PROCS=>SUB_STATION_MODEL(KTO)%ZTHIS_PROCS -ZXCOEF=>SUB_STATION_MODEL(KTO)%ZXCOEF -ZUCOEF=>SUB_STATION_MODEL(KTO)%ZUCOEF -ZYCOEF=>SUB_STATION_MODEL(KTO)%ZYCOEF -ZVCOEF=>SUB_STATION_MODEL(KTO)%ZVCOEF - -END SUBROUTINE SUB_STATION_GOTO_MODEL - -END MODULE MODD_SUB_STATION_n diff --git a/src/MNH/modd_type_date.f90 b/src/MNH/modd_type_date.f90 index e9717d3217f8f2e43f1f56877fd1b8eb0c24df64..31b67ef896e1191e9906fb49569ae413da16662e 100644 --- a/src/MNH/modd_type_date.f90 +++ b/src/MNH/modd_type_date.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1997-2020 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1997-2022 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. @@ -32,6 +32,7 @@ module modd_type_date !! Original 11/08/97 ! P. Wautelet 24/07/2019: set default values ! P. Wautelet 17/12/2020: restructure type date_time +! P. Wautelet 11/07/2022: add Datetime_initialized_check function !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -46,9 +47,98 @@ type date integer :: nmonth = 0 integer :: nday = 0 end type date -! + +#if 0 +!GCC BUG: if an extended type is used in an array for a namelist, the reading fails +!GCC bug (at least from 5.5 to 12.1, see GCC bug 106065) type, extends( date ) :: date_time real :: xtime = XNEGUNDEF end type date_time -! +#else +type :: date_time + integer :: nyear = NNEGUNDEF + integer :: nmonth = 0 + integer :: nday = 0 + real :: xtime = XNEGUNDEF + + contains + procedure, pass(tpdt) :: check => Datetime_initialized_check +end type date_time +#endif + +contains + +logical function Datetime_initialized_check( tpdt, hname ) result( gok ) + !Check if the values of the date_time type have been set and are valid + !Remark: xtime must be inside the day (between 0. and 24h) + + use mode_msg + + class( date_time ), intent(in) :: tpdt + character(len=*), optional, intent(in) :: hname !Name of the variable (useful for messages) + + character(len=:), allocatable :: yname + logical :: gdayok + + gok = .true. + + if ( Present( hname ) ) then + yname = Trim( hname ) // ': ' + else + yname = '' + end if + + if ( tpdt%nyear == NNEGUNDEF ) then + call Print_msg( NVERB_WARNING, 'GEN', 'Datetime_initialized_check', yname // 'year has not been set' ) + gok = .false. + end if + + if ( tpdt%nmonth == 0 ) then + call Print_msg( NVERB_WARNING, 'GEN', 'Datetime_initialized_check', yname // 'month has not been set (=0)' ) + gok = .false. + else if ( tpdt%nmonth < 0 .or. tpdt%nmonth > 12 ) then + Write( cmnhmsg(1), '( A, "invalid month: ", I18 )' ) Trim( yname ), tpdt%nmonth + call Print_msg( NVERB_WARNING, 'GEN', 'Datetime_initialized_check' ) + gok = .false. + end if + + if ( tpdt%nday == 0 ) then + call Print_msg( NVERB_WARNING, 'GEN', 'Datetime_initialized_check', yname // 'day has not been set (=0)' ) + gdayok = .false. + gok = .false. + else + gdayok = .true. + if ( tpdt%nday < 1 ) then + gdayok = .false. + else if ( Any( tpdt%nmonth == [ 1, 3, 5, 7, 8, 10, 12 ] ) .and. tpdt%nday > 31 ) then + gdayok = .false. + else if ( Any( tpdt%nmonth == [ 4, 6, 9, 11 ] ) .and. tpdt%nday > 30 ) then + gdayok = .false. + else if ( tpdt%nmonth == 2 ) then + if ( ( Mod( tpdt%nyear, 4 ) == 0 .and. Mod( tpdt%nyear, 100 ) /= 0 ) .or. Mod( tpdt%nyear, 400 ) == 0 ) then + if ( tpdt%nday > 29 ) then + gdayok = .false. + end if + else if ( tpdt%nday > 28 ) then + gdayok = .false. + end if + end if + if ( .not. gdayok ) then + Write( cmnhmsg(1), '( A, "invalid day", I18, " for month: ", I18 )' ) Trim( yname ), tpdt%nday, tpdt%nmonth + call Print_msg( NVERB_WARNING, 'GEN', 'Datetime_initialized_check' ) + gok = .false. + end if + end if + + if ( tpdt%xtime == XNEGUNDEF ) then + call Print_msg( NVERB_WARNING, 'GEN', 'Datetime_initialized_check', yname // 'time has not been set' ) + gok = .false. + else if ( tpdt%xtime < 0 .or. tpdt%xtime > ( 3600. * 24 ) ) then + Write( cmnhmsg(1), '( A, "invalid time: ", EN12.3 )' ) Trim( yname ), tpdt%xtime + call Print_msg( NVERB_WARNING, 'GEN', 'Datetime_initialized_check' ) + gok = .false. + end if + +end function Datetime_initialized_check + end module modd_type_date diff --git a/src/MNH/modd_type_profiler.f90 b/src/MNH/modd_type_profiler.f90 deleted file mode 100644 index b5fedbf60ab7d849a2d04fc98d3047daa34cad64..0000000000000000000000000000000000000000 --- a/src/MNH/modd_type_profiler.f90 +++ /dev/null @@ -1,115 +0,0 @@ -!MNH_LIC Copyright 2002-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_TYPE_PROFILER -! ############################ -! -!!**** *MODD_PROFILER* - declaration of stations -!! -!! PURPOSE -!! ------- -! The purpose of this declarative module is to define -! the different stations types. -! -!! -!!** IMPLICIT ARGUMENTS -!! ------------------ -!! -!! -!! REFERENCE -!! --------- -!! -!! AUTHOR -!! ------ -!! P. Tulet *Meteo France* -!! -!! MODIFICATIONS -!! ------------- -!! Original 15/01/02 -!! C.Lac 10/2016 Add visibility diagnostic -! P. Wautelet 13/09/2019: budget: simplify and modernize date/time management -! M. Taufour 05/07/2021: modify RARE for hydrometeors containing ice and add bright band calculation for RARE -!------------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -use modd_type_date, only: date_time - -implicit none - -TYPE PROFILER -! -! -!* general information -! -! -!* storage monitoring -! -REAL :: T_CUR ! current time since last storage -INTEGER :: N_CUR ! current step of storage -REAL :: STEP ! storage time step -! -!* data records -! -CHARACTER(LEN=8),DIMENSION(:), POINTER :: NAME=>NULL() ! station name -CHARACTER(LEN=8),DIMENSION(:), POINTER :: TYPE=>NULL() ! station type -! -type(date_time), dimension(:), pointer :: tpdates => NULL() ! dates(n) (n: recording instants) -LOGICAL, DIMENSION(:), POINTER :: ERROR=>NULL() -REAL, DIMENSION(:), POINTER :: X=>NULL() ! X(n) -REAL, DIMENSION(:), POINTER :: Y=>NULL() ! Y(n) -REAL, DIMENSION(:), POINTER :: LON=>NULL() ! longitude(n) -REAL, DIMENSION(:), POINTER :: LAT=>NULL() ! latitude (n) -REAL, DIMENSION(:), POINTER :: ALT=>NULL() ! altitude (n) -REAL, DIMENSION(:,:,:), POINTER :: ZON=>NULL() ! zonal wind(n) -REAL, DIMENSION(:,:,:), POINTER :: MER=>NULL() ! meridian wind(n) -REAL, DIMENSION(:,:,:), POINTER :: FF=>NULL() ! wind intensity -REAL, DIMENSION(:,:,:), POINTER :: DD=>NULL() ! wind direction -REAL, DIMENSION(:,:,:), POINTER :: W=>NULL() ! w(n) (air vertical speed) -REAL, DIMENSION(:,:,:), POINTER :: P=>NULL() ! p(n) -REAL, DIMENSION(:,:,:), POINTER :: ZZ=>NULL() ! altitude(n) -REAL, DIMENSION(:,:,:), POINTER :: TKE=>NULL() ! tke(n) -REAL, DIMENSION(:,:,:), POINTER :: TH=>NULL() ! th(n) -REAL, DIMENSION(:,:,:), POINTER :: THV=>NULL() ! thv(n) -REAL, DIMENSION(:,:,:), POINTER :: VISI=>NULL() ! VISI(n) -REAL, DIMENSION(:,:,:), POINTER :: VISIKUN=>NULL() ! VISI KUNKEL(n) -REAL, DIMENSION(:,:,:), POINTER :: CRARE=>NULL() ! radar reflectivity (n) -REAL, DIMENSION(:,:,:), POINTER :: CRARE_ATT=>NULL() ! radar attenuated reflectivity (n) -REAL, DIMENSION(:,:,:), POINTER :: CIZ=>NULL() ! Ice number concentration ICE3 (n) -REAL, DIMENSION(:,:,:), POINTER :: LWCZ=>NULL() ! liquid water content (n) -REAL, DIMENSION(:,:,:), POINTER :: IWCZ=>NULL() ! ice water content (n) -REAL, DIMENSION(:,:,:), POINTER :: RHOD=>NULL() ! density of dry air/moist air -REAL, DIMENSION(:,:,:,:), POINTER :: R=>NULL() ! r*(n) -REAL, DIMENSION(:,:,:,:), POINTER :: SV=>NULL() ! Sv*(n) -REAL, DIMENSION(:,:,:,:), POINTER :: AER=>NULL() ! AER*(n) aerosol extinction -! -REAL, DIMENSION(:,:), POINTER :: T2M=>NULL() ! 2 m air temperature (°C) -REAL, DIMENSION(:,:), POINTER :: Q2M=>NULL() ! 2 m humidity (kg/kg) -REAL, DIMENSION(:,:), POINTER :: HU2M=>NULL() ! 2 m relative humidity (%) -REAL, DIMENSION(:,:), POINTER :: ZON10M=>NULL() ! 10 m zonal wind (m/s) -REAL, DIMENSION(:,:), POINTER :: MER10M=>NULL() ! 10 m merid. wind (m/s) -REAL, DIMENSION(:,:), POINTER :: RN=>NULL() ! net radiation (W m2) -REAL, DIMENSION(:,:), POINTER :: H=>NULL() ! sensible heat flux (W m2) -REAL, DIMENSION(:,:), POINTER :: LE=>NULL() ! Total latent heat flux (W m2) -REAL, DIMENSION(:,:), POINTER :: LEI=>NULL() ! Solid latent heat flux (W m2) -REAL, DIMENSION(:,:), POINTER :: GFLUX=>NULL() ! storage heat flux (W m2) -REAL, DIMENSION(:,:), POINTER :: LWD=>NULL() ! IR downward radiation (W m2) -REAL, DIMENSION(:,:), POINTER :: LWU=>NULL() ! IR upward radiation (W m2) -REAL, DIMENSION(:,:), POINTER :: SWD=>NULL() ! solar downward radiation (W m2) -REAL, DIMENSION(:,:), POINTER :: SWU=>NULL() ! solar upward radiation (W m2) -REAL, DIMENSION(:,:), POINTER :: IWV=>NULL() ! integrated water vpour(n) -REAL, DIMENSION(:,:), POINTER :: ZTD=>NULL() ! GPS zenith tropo delay(n) -REAL, DIMENSION(:,:), POINTER :: ZWD=>NULL() ! GPS zenith wet delay(n) -REAL, DIMENSION(:,:), POINTER :: ZHD=>NULL() ! GPS zenith hydro delay(n) -! -REAL, DIMENSION(:,:,:), POINTER :: TKE_DISS=>NULL() ! TKE dissipation rate -! -! -END TYPE PROFILER -! -END MODULE MODD_TYPE_PROFILER - diff --git a/src/MNH/modd_type_station.f90 b/src/MNH/modd_type_station.f90 deleted file mode 100644 index 3456ac2d272e30cd9ce2e85fbd58f6d4dd4019a3..0000000000000000000000000000000000000000 --- a/src/MNH/modd_type_station.f90 +++ /dev/null @@ -1,103 +0,0 @@ -!MNH_LIC Copyright 2002-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. -!----------------------------------------------------------------- -! ############################ - MODULE MODD_TYPE_STATION -! ############################ -! -!!**** *MODD_STATION* - declaration of stations -!! -!! PURPOSE -!! ------- -! The purpose of this declarative module is to define -! the different stations types. -! -!! -!!** IMPLICIT ARGUMENTS -!! ------------------ -!! NONE -!! -!! REFERENCE -!! --------- -!! -!! AUTHOR -!! ------ -!! P. Tulet *Meteo France* -!! -!! MODIFICATIONS -!! ------------- -!! Original 15/01/02 -! P. Wautelet 13/09/2019: budget: simplify and modernize date/time management -!------------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -! -use modd_type_date, only: date_time - -implicit none - -TYPE STATION -! -! -!* general information -! -! -!* storage monitoring -! -REAL :: T_CUR ! current time since last storage -INTEGER :: N_CUR ! current step of storage -REAL :: STEP ! storage time step -! -!* data records -! -CHARACTER(LEN=8),DIMENSION(:), POINTER :: NAME=>NULL() ! station name -CHARACTER(LEN=8),DIMENSION(:), POINTER :: TYPE=>NULL() ! station type -type(date_time), dimension(:), pointer :: tpdates => NULL() ! dates(n) (n: recording instants) -LOGICAL, DIMENSION(:), POINTER :: ERROR=>NULL() ! -REAL, DIMENSION(:), POINTER :: X=>NULL() ! X(n) -REAL, DIMENSION(:), POINTER :: Y=>NULL() ! Y(n) -REAL, DIMENSION(:), POINTER :: Z=>NULL() ! Z(n) -REAL, DIMENSION(:), POINTER :: LON=>NULL() ! longitude(n) -REAL, DIMENSION(:), POINTER :: LAT=>NULL() ! latitude (n) -REAL, DIMENSION(:,:), POINTER :: ZON=>NULL() ! zonal wind(n) -REAL, DIMENSION(:,:), POINTER :: MER=>NULL() ! meridian wind(n) -REAL, DIMENSION(:,:), POINTER :: W=>NULL() ! w(n) (air vertical speed) -REAL, DIMENSION(:,:), POINTER :: P=>NULL() ! p(n) -REAL, DIMENSION(:,:), POINTER :: TKE=>NULL() ! tke(n) -REAL, DIMENSION(:,:), POINTER :: TH=>NULL() ! th(n) -REAL, DIMENSION(:,:,:), POINTER :: R=>NULL() ! r*(n) -REAL, DIMENSION(:,:,:), POINTER :: SV=>NULL() ! Sv*(n) -REAL, DIMENSION(:), POINTER :: ZS=>NULL() ! zs(n) -REAL, DIMENSION(:,:), POINTER :: TSRAD=>NULL() ! Ts(n) -! -REAL, DIMENSION(:,:), POINTER :: T2M=>NULL() ! -REAL, DIMENSION(:,:), POINTER :: Q2M=>NULL() ! -REAL, DIMENSION(:,:), POINTER :: HU2M=>NULL() ! -REAL, DIMENSION(:,:), POINTER :: ZON10M=>NULL() ! -REAL, DIMENSION(:,:), POINTER :: MER10M=>NULL() ! -REAL, DIMENSION(:,:), POINTER :: RN=>NULL() ! -REAL, DIMENSION(:,:), POINTER :: H=>NULL() ! -REAL, DIMENSION(:,:), POINTER :: LE=>NULL() ! -REAL, DIMENSION(:,:), POINTER :: LEI=>NULL() ! -REAL, DIMENSION(:,:), POINTER :: GFLUX=>NULL() ! -REAL, DIMENSION(:,:), POINTER :: SWD=>NULL() ! -REAL, DIMENSION(:,:), POINTER :: SWU=>NULL() ! -REAL, DIMENSION(:,:), POINTER :: LWD=>NULL() ! -REAL, DIMENSION(:,:), POINTER :: LWU=>NULL() ! -REAL, DIMENSION(:,:), POINTER :: SWDIR=>NULL() ! -REAL, DIMENSION(:,:), POINTER :: SWDIFF=>NULL() ! -REAL, DIMENSION(:,:), POINTER :: DSTAOD=>NULL() ! Dust Aerosol Optical Depth -REAL, DIMENSION(:,:), POINTER :: SFCO2=>NULL() ! CO2 surface flux -! -INTEGER, DIMENSION(:), POINTER :: K=>NULL() ! Model level for altitude - ! comparisons -INTEGER, DIMENSION(:), POINTER :: I=>NULL() ! i index (n) -INTEGER, DIMENSION(:), POINTER :: J=>NULL() ! j index (n) - -END TYPE STATION -! -END MODULE MODD_TYPE_STATION diff --git a/src/MNH/modd_type_statprof.f90 b/src/MNH/modd_type_statprof.f90 new file mode 100644 index 0000000000000000000000000000000000000000..24d4d7e19bcf565891cc60958180732be5d35fde --- /dev/null +++ b/src/MNH/modd_type_statprof.f90 @@ -0,0 +1,156 @@ +!MNH_LIC Copyright 2002-2022 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_TYPE_STATPROF +! ############################ +! +!!**** *MODD_STATION* - declaration of stations +!! +!! PURPOSE +!! ------- +! The purpose of this declarative module is to define +! the different stations types. +! +!! +!!** IMPLICIT ARGUMENTS +!! ------------------ +!! NONE +!! +!! REFERENCE +!! --------- +!! +!! AUTHOR +!! ------ +!! P. Tulet *Meteo France* +!! +!! MODIFICATIONS +!! ------------- +!! Original 15/01/02 +! P. Wautelet 13/09/2019: budget: simplify and modernize date/time management +! P. Wautelet 04/2022: restructure stations/profilers for better performance, reduce memory usage and correct some problems/bugs +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +use modd_type_date, only: date_time +use modd_parameters, only: NNEGUNDEF, NSTATPROFNAMELGTMAX, XUNDEF + +implicit none + +private + +public :: TSTATPROFTIME +public :: TPROFILERDATA, TSTATIONDATA, TSTATPROFDATA + +TYPE :: TSTATPROFTIME + INTEGER :: N_CUR = 0 ! current step of storage + REAL :: XTSTEP = 60. ! storage time step (default reset later by INI_STATION_n) + type(date_time), dimension(:), ALLOCATABLE :: tpdates ! dates(n) (n: recording instants) +END TYPE TSTATPROFTIME + +TYPE :: TSTATPROFDATA + ! Type to store data common to stations and profilers + ! It is used as a basis for the TSTATIONDATA and TPROFILERDATA + ! and for common procedures for these 2 types + CHARACTER(LEN=NSTATPROFNAMELGTMAX) :: CNAME = '' ! Station/profiler name + + INTEGER :: NID = 0 ! Global identification number of the station/profiler (from 1 to total number) + + REAL :: XX = XUNDEF ! X(n) + REAL :: XY = XUNDEF ! Y(n) + REAL :: XZ = XUNDEF ! Z(n) + REAL :: XLON = XUNDEF ! longitude(n) + REAL :: XLAT = XUNDEF ! latitude (n) + + ! Position in the mesh + INTEGER :: NI_M = NNEGUNDEF ! X position for mass-point axis (between this one and the next one) + INTEGER :: NJ_M = NNEGUNDEF ! Y position for mass-point axis (between this one and the next one) + INTEGER :: NI_U = NNEGUNDEF ! X position for u-point axis (between this one and the next one) + INTEGER :: NJ_V = NNEGUNDEF ! Y position for v-point axis (between this one and the next one) + + ! Coefficient to interpolate values (stations are usually not exactly on mesh points) + REAL :: XXMCOEF = XUNDEF ! Interpolation coefficient for X (mass-point) + REAL :: XYMCOEF = XUNDEF ! Interpolation coefficient for Y (mass-point) + REAL :: XXUCOEF = XUNDEF ! Interpolation coefficient for X (U-point) + REAL :: XYVCOEF = XUNDEF ! Interpolation coefficient for Y (V-point) + + ! Dimension corresponds to recording instants + REAL, DIMENSION(:), ALLOCATABLE :: XT2M ! 2 m air temperature (C) + REAL, DIMENSION(:), ALLOCATABLE :: XQ2M ! 2 m humidity (kg/kg) + REAL, DIMENSION(:), ALLOCATABLE :: XHU2M ! 2 m relative humidity (%) + REAL, DIMENSION(:), ALLOCATABLE :: XZON10M ! 10 m zonal wind (m/s) + REAL, DIMENSION(:), ALLOCATABLE :: XMER10M ! 10 m merid. wind (m/s) + REAL, DIMENSION(:), ALLOCATABLE :: XRN ! net radiation (W m2) + REAL, DIMENSION(:), ALLOCATABLE :: XH ! sensible heat flux (W m2) + REAL, DIMENSION(:), ALLOCATABLE :: XLE ! Total latent heat flux (W m2) + REAL, DIMENSION(:), ALLOCATABLE :: XLEI ! Solid latent heat flux (W m2) + REAL, DIMENSION(:), ALLOCATABLE :: XGFLUX ! storage heat flux (W m2) + REAL, DIMENSION(:), ALLOCATABLE :: XSWD ! IR downward radiation (W m2) + REAL, DIMENSION(:), ALLOCATABLE :: XSWU ! IR upward radiation (W m2) + REAL, DIMENSION(:), ALLOCATABLE :: XLWD ! solar downward radiation (W m2) + REAL, DIMENSION(:), ALLOCATABLE :: XLWU ! solar upward radiation (W m2) +END TYPE + +TYPE, EXTENDS( TSTATPROFDATA ) :: TSTATIONDATA + ! Type to store all the data of 1 station + INTEGER :: NK = NNEGUNDEF ! Model level for altitude comparisons + + REAL :: XZS = XUNDEF ! zs(n) + + ! (n: recording instants) + REAL, DIMENSION(:), ALLOCATABLE :: XZON ! zonal wind(n) + REAL, DIMENSION(:), ALLOCATABLE :: XMER ! meridian wind(n) + REAL, DIMENSION(:), ALLOCATABLE :: XW ! w(n) (air vertical speed) + REAL, DIMENSION(:), ALLOCATABLE :: XP ! p(n) + REAL, DIMENSION(:), ALLOCATABLE :: XTKE ! tke(n) + REAL, DIMENSION(:), ALLOCATABLE :: XTH ! th(n) + REAL, DIMENSION(:,:), ALLOCATABLE :: XR ! r*(n) + REAL, DIMENSION(:,:), ALLOCATABLE :: XSV ! Sv*(n) + REAL, DIMENSION(:), ALLOCATABLE :: XTSRAD ! Ts(n) + + REAL, DIMENSION(:), ALLOCATABLE :: XSWDIR + REAL, DIMENSION(:), ALLOCATABLE :: XSWDIFF + REAL, DIMENSION(:), ALLOCATABLE :: XDSTAOD ! Dust Aerosol Optical Depth + REAL, DIMENSION(:), ALLOCATABLE :: XSFCO2 ! CO2 surface flux +END TYPE TSTATIONDATA + +TYPE, EXTENDS( TSTATPROFDATA ) :: TPROFILERDATA + ! Type to store all the data of 1 profiler + CHARACTER(LEN=NSTATPROFNAMELGTMAX) :: CTYPE = '' ! Profiler type + + ! (n: recording instants) + REAL, DIMENSION(:,:), ALLOCATABLE :: XZON ! zonal wind(n) + REAL, DIMENSION(:,:), ALLOCATABLE :: XMER ! meridian wind(n) + REAL, DIMENSION(:,:), ALLOCATABLE :: XFF ! wind intensity + REAL, DIMENSION(:,:), ALLOCATABLE :: XDD ! wind direction + REAL, DIMENSION(:,:), ALLOCATABLE :: XW ! w(n) (air vertical speed) + REAL, DIMENSION(:,:), ALLOCATABLE :: XP ! p(n) + REAL, DIMENSION(:,:), ALLOCATABLE :: XZZ ! altitude(n) + REAL, DIMENSION(:,:), ALLOCATABLE :: XTKE ! tke(n) + REAL, DIMENSION(:,:), ALLOCATABLE :: XTH ! th(n) + REAL, DIMENSION(:,:), ALLOCATABLE :: XTHV ! thv(n) + REAL, DIMENSION(:,:), ALLOCATABLE :: XVISIGUL ! VISI GULTEPE(n) + REAL, DIMENSION(:,:), ALLOCATABLE :: XVISIKUN ! VISI KUNKEL(n) + REAL, DIMENSION(:,:), ALLOCATABLE :: XCRARE ! radar reflectivity (n) + REAL, DIMENSION(:,:), ALLOCATABLE :: XCRARE_ATT ! radar attenuated reflectivity (n) + REAL, DIMENSION(:,:), ALLOCATABLE :: XCIZ ! Ice number concentration ICE3 (n) + REAL, DIMENSION(:,:), ALLOCATABLE :: XLWCZ ! liquid water content (n) + REAL, DIMENSION(:,:), ALLOCATABLE :: XIWCZ ! ice water content (n) + REAL, DIMENSION(:,:), ALLOCATABLE :: XRHOD ! density of dry air/moist air + REAL, DIMENSION(:,:,:), ALLOCATABLE :: XR ! r*(n) + REAL, DIMENSION(:,:,:), ALLOCATABLE :: XSV ! Sv*(n) + REAL, DIMENSION(:,:,:), ALLOCATABLE :: XAER ! AER*(n) aerosol extinction + + REAL, DIMENSION(:), ALLOCATABLE :: XIWV ! integrated water vpour(n) + REAL, DIMENSION(:), ALLOCATABLE :: XZTD ! GPS zenith tropo delay(n) + REAL, DIMENSION(:), ALLOCATABLE :: XZWD ! GPS zenith wet delay(n) + REAL, DIMENSION(:), ALLOCATABLE :: XZHD ! GPS zenith hydro delay(n) + + REAL, DIMENSION(:,:), ALLOCATABLE :: XTKE_DISS ! TKE dissipation rate +END TYPE + +END MODULE MODD_TYPE_STATPROF diff --git a/src/MNH/mode_aero_psd.f90 b/src/MNH/mode_aero_psd.f90 index 7a18e45152de412d236f0f35c820cabb92b3d311..04fb8c93082582f410f4467304335cd822649bdb 100644 --- a/src/MNH/mode_aero_psd.f90 +++ b/src/MNH/mode_aero_psd.f90 @@ -1,19 +1,14 @@ -!ORILAM_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!ORILAM_LIC Copyright 2006-2022 CNRS, Meteo-France and Universite Paul Sabatier !ORILAM_LIC This is part of the ORILAM software governed by the CeCILL-C licence !ORILAM_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !ORILAM_LIC for details. !----------------------------------------------------------------- -!----------------------------------------------------------------- -!--------------- special set of characters for RCS information -!----------------------------------------------------------------- -! $Source$ $Revision$ $Date$ -!----------------------------------------------------------------- !! ######################## MODULE MODE_AERO_PSD !! ######################## !! !! MODULE DUST PSD (Particle Size Distribution) -!! Purpose: Contains subroutines to convert from transported variables (ppp) +!! Purpose: Contains subroutines to convert from transported variables (ppv) !! to understandable aerosol variables, e.g. #/m3, kg/m3, sigma, R_{n} USE MODD_CH_AEROSOL @@ -32,7 +27,7 @@ CONTAINS ! ! ############################################################ SUBROUTINE PPP2AERO( & - PSVT & !I [ppp] input scalar variables (moment of distribution) + PSVT & !I [ppv] input scalar variables (moment of distribution) , PRHODREF & !I [kg/m3] density of air , PSIG3D & !O [-] standard deviation of aerosol distribution , PRG3D & !O [um] number median diameter of aerosol distribution @@ -46,7 +41,7 @@ CONTAINS !! !! PURPOSE !! ------- -!! Translate the three moments M0, M3 and M6 given in ppp into +!! Translate the three moments M0, M3 and M6 given in ppv into !! Values which can be understood more easily (R, sigma, N, M) !! !! CALLING STRUCTURE NOTE: OPTIONAL VARIABLES @@ -558,7 +553,7 @@ END SUBROUTINE CON2MIX ! ############################################################ SUBROUTINE AERO2PPP( & - PSVT & !IO [ppp] input scalar variables (moment of distribution) + PSVT & !IO [ppv] input scalar variables (moment of distribution) , PRHODREF & !I [kg/m3] density of air , PSIG3D & !I [-] standard deviation of aerosol distribution , PRG3D & !I [um] number median diameter of aerosol distribution @@ -569,7 +564,7 @@ END SUBROUTINE CON2MIX !! !! PURPOSE !! ------- -!! Translate the aerosol Mass, RG and SIGMA in the three moments M0, M3 and M6 given in ppp +!! Translate the aerosol Mass, RG and SIGMA in the three moments M0, M3 and M6 given in ppv !! !! REFERENCE !! --------- @@ -758,7 +753,7 @@ ZCTOTA(:,:,:,:,:) = 0. ZM(:,:,:,6) = ZM(:,:,:,4)*(PRG3D(:,:,:,2)**6) * & EXP(18 *(LOG(PSIG3D(:,:,:,2)))**2) -!* 6 return to ppp +!* 6 return to ppv ! PSVT(:,:,:,JP_CH_M0i) = ZM(:,:,:,1) * 1E-6 PSVT(:,:,:,JP_CH_M0j) = ZM(:,:,:,4) * 1E-6 @@ -776,7 +771,7 @@ END SUBROUTINE AERO2PPP ! ! ############################################################ SUBROUTINE PPP2AERO1D( & - PSVT & !I [ppp] input scalar variables (moment of distribution) + PSVT & !I [ppv] input scalar variables (moment of distribution) , PRHODREF & !I [kg/m3] density of air , PMI & !O molecular weight , PSIG1D & !O [-] standard deviation of aerosol distribution @@ -790,7 +785,7 @@ END SUBROUTINE AERO2PPP !! !! PURPOSE !! ------- -!! Translate the three moments M0, M3 and M6 given in ppp into +!! Translate the three moments M0, M3 and M6 given in ppv into !! Values which can be understood more easily (R, sigma, N, M) !! !! CALLING STRUCTURE NOTE: OPTIONAL VARIABLES diff --git a/src/MNH/mode_blowsnow_psd.f90 b/src/MNH/mode_blowsnow_psd.f90 index 71298e3319a0ac8cb37f974c727c40f38bc9b7a2..6e741809b34581a3a0f766a3c85094f92e8dbe0a 100644 --- a/src/MNH/mode_blowsnow_psd.f90 +++ b/src/MNH/mode_blowsnow_psd.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1994-2018 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2018-2022 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. @@ -32,7 +32,7 @@ CONTAINS ! !! ############################################################ SUBROUTINE PPP2SNOW( & - PSVT & !I [ppp] input scalar variables (moment of distribution) + PSVT & !I [ppv] input scalar variables (moment of distribution) , PRHODREF & !I [kg/m3] density of air , PBET3D & !O [m] scale parameter of snow distribution , PRG3D & !O [um] mean radius of snow distribution @@ -72,7 +72,7 @@ CONTAINS ! !* 0.1 declarations of arguments ! -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVT !I [ppp] first moment +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVT !I [ppv] first moment REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF !I [kg/m3] density of air REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(OUT) :: PBET3D !O [-] scale parameter diff --git a/src/MNH/mode_datetime.f90 b/src/MNH/mode_datetime.f90 index fc9f68267d6cca9e7d770dc7b3cfd86ba067ad52..fdcde8e7e56e367458a9b73c81964b27f81499d7 100644 --- a/src/MNH/mode_datetime.f90 +++ b/src/MNH/mode_datetime.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2018-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2018-2023 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. @@ -7,6 +7,8 @@ ! P. Wautelet 22/02/2019: use MOD intrinsics with same kind for all arguments (to respect Fortran standard) ! P. Wautelet 19/04/2019: use modd_precision kinds ! P. Wautelet 20/07/2021: modify DATETIME_TIME2REFERENCE and DATETIME_DISTANCE to allow correct computation with 32-bit floats +! P. Wautelet 27/10/2022: add +, -, <= and > operators and improve older comparison subroutines (more robust but slower) +! P. Wautelet 05/01/2023: fix: DATETIME_DISTANCE: need 64 bits integers computation for very distant dates !----------------------------------------------------------------- MODULE MODE_DATETIME ! @@ -19,8 +21,13 @@ IMPLICIT NONE PRIVATE ! PUBLIC :: DATETIME_DISTANCE, DATETIME_CORRECTDATE +PUBLIC :: TPREFERENCE_DATE PUBLIC :: OPERATOR(<) +PUBLIC :: OPERATOR(<=) +PUBLIC :: OPERATOR(>) PUBLIC :: OPERATOR(>=) +PUBLIC :: OPERATOR(+) +PUBLIC :: OPERATOR(-) ! !Reference date (do not change it) !To work with DATETIME_TIME2REFERENCE, we assume the year is a multiple of 400 + 1 and the date is January 1st (and time=0.) @@ -30,10 +37,26 @@ INTERFACE OPERATOR(<) MODULE PROCEDURE DATETIME_LT END INTERFACE ! +INTERFACE OPERATOR(<=) + MODULE PROCEDURE DATETIME_LE +END INTERFACE +! +INTERFACE OPERATOR(>) + MODULE PROCEDURE DATETIME_GT +END INTERFACE +! INTERFACE OPERATOR(>=) MODULE PROCEDURE DATETIME_GE END INTERFACE ! +INTERFACE OPERATOR(+) + MODULE PROCEDURE DATETIME_TIME_ADD +END INTERFACE +! +INTERFACE OPERATOR(-) + MODULE PROCEDURE DATETIME_TIME_SUBSTRACT +END INTERFACE +! CONTAINS ! SUBROUTINE DATETIME_TIME2REFERENCE( TPDATE, KDAYS, PSEC ) @@ -119,6 +142,8 @@ SUBROUTINE DATETIME_DISTANCE(TPDATEBEG,TPDATEEND,PDIST) ! !Compute distance (in seconds) between 2 dates ! +use modd_precision, only: MNHINT64 +! TYPE(DATE_TIME), INTENT(IN) :: TPDATEBEG TYPE(DATE_TIME), INTENT(IN) :: TPDATEEND REAL, INTENT(OUT) :: PDIST @@ -136,11 +161,11 @@ IF ( ZSECEND < ZSECBEG ) THEN IF ( ZSECEND < ZSECBEG ) CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'DATETIME_DISTANCE', 'unexpected: ZSECEND is too small' ) END IF ! -PDIST = REAL( ( IDAYSEND - IDAYSBEG ) * (24*60*60) ) + ZSECEND - ZSECBEG +PDIST = REAL( INT( IDAYSEND - IDAYSBEG, KIND=MNHINT64 ) * 24*60*60 ) + ZSECEND - ZSECBEG ! END SUBROUTINE DATETIME_DISTANCE ! -SUBROUTINE DATETIME_CORRECTDATE(TPDATE) +PURE SUBROUTINE DATETIME_CORRECTDATE(TPDATE) ! ! Correct the date if not in the correct interval ! Change the date if time is <0 or >=86400 s @@ -232,7 +257,7 @@ TPDATE%xtime = ZSEC END SUBROUTINE DATETIME_CORRECTDATE ! ! -SUBROUTINE DATETIME_GETMONTHLGT(KYEAR,KMONTH,KLGT) +PURE SUBROUTINE DATETIME_GETMONTHLGT(KYEAR,KMONTH,KLGT) ! INTEGER, INTENT(IN) :: KYEAR INTEGER, INTENT(IN) :: KMONTH @@ -254,16 +279,23 @@ SELECT CASE(KMONTH) END SELECT ! END SUBROUTINE DATETIME_GETMONTHLGT -! -! + + FUNCTION DATETIME_LT(TPT1, TPT2) RESULT (OLT) -IMPLICIT NONE -LOGICAL :: OLT -TYPE(DATE_TIME), INTENT(IN) :: TPT1, TPT2 ! ! TRUE if TPT1 .LT. TPT2 ! -! +IMPLICIT NONE + +TYPE(DATE_TIME), INTENT(IN) :: TPT1, TPT2 + +LOGICAL :: OLT + +INTEGER :: IDAYS1, IDAYS2 +REAL :: ZSEC1, ZSEC2 + +#if 0 +!Simpler but works only for correct dates (see DATETIME_CORRECTDATE) IF ( TPT1%nyear .EQ. TPT2%nyear ) THEN IF ( TPT1%nmonth .EQ. TPT2%nmonth ) THEN IF ( TPT1%nday .EQ. TPT2%nday ) THEN @@ -277,19 +309,125 @@ IF ( TPT1%nyear .EQ. TPT2%nyear ) THEN ELSE OLT = TPT1%nyear .LT. TPT2%nyear ENDIF -! +#else +CALL DATETIME_TIME2REFERENCE( TPT1, IDAYS1, ZSEC1 ) +CALL DATETIME_TIME2REFERENCE( TPT2, IDAYS2, ZSEC2 ) + +OLT = .FALSE. + +IF ( IDAYS1 < IDAYS2 ) THEN + OLT = .TRUE. +ELSE IF ( IDAYS1 == IDAYS2 ) THEN + IF ( ZSEC1 < ZSEC2 ) OLT = .TRUE. +END IF +#endif + END FUNCTION DATETIME_LT + + +FUNCTION DATETIME_LE(TPT1, TPT2) RESULT (OLE) ! +! TRUE if TPT1 <= TPT2 ! -FUNCTION DATETIME_GE(TPT1, TPT2) RESULT (OLT) IMPLICIT NONE -LOGICAL :: OLT + TYPE(DATE_TIME), INTENT(IN) :: TPT1, TPT2 + +LOGICAL :: OLE + +INTEGER :: IDAYS1, IDAYS2 +REAL :: ZSEC1, ZSEC2 + +#if 0 +!Simpler but works only for correct dates (see DATETIME_CORRECTDATE) +IF ( TPT1%nyear == TPT2%nyear ) THEN + IF ( TPT1%nmonth == TPT2%nmonth ) THEN + IF ( TPT1%nday == TPT2%nday ) THEN + OLE = TPT1%xtime <= TPT2%xtime + ELSE + OLE = TPT1%nday <= TPT2%nday + END IF + ELSE + OLE = TPT1%nmonth <= TPT2%nmonth + END IF +ELSE + OLE = TPT1%nyear <= TPT2%nyear +ENDIF +#else +CALL DATETIME_TIME2REFERENCE( TPT1, IDAYS1, ZSEC1 ) +CALL DATETIME_TIME2REFERENCE( TPT2, IDAYS2, ZSEC2 ) + +OLE = .FALSE. + +IF ( IDAYS1 < IDAYS2 ) THEN + OLE = .TRUE. +ELSE IF ( IDAYS1 == IDAYS2 ) THEN + IF ( ZSEC1 <= ZSEC2 ) OLE = .TRUE. +END IF +#endif ! -! TRUE if TPT1 .GE. TPT2 +END FUNCTION DATETIME_LE + + +FUNCTION DATETIME_GE(TPT1, TPT2) RESULT (OGE) ! -OLT = .NOT.DATETIME_LT(TPT1,TPT2) +! TRUE if TPT1 >=. TPT2 ! +IMPLICIT NONE + +TYPE(DATE_TIME), INTENT(IN) :: TPT1, TPT2 + +LOGICAL :: OGE + +OGE = .NOT. DATETIME_LT( TPT1, TPT2 ) + END FUNCTION DATETIME_GE + + +FUNCTION DATETIME_GT(TPT1, TPT2) RESULT (OGT) +! +! TRUE if TPT1 > TPT2 ! +IMPLICIT NONE + +TYPE(DATE_TIME), INTENT(IN) :: TPT1, TPT2 + +LOGICAL :: OGT + +OGT = .NOT. DATETIME_LE( TPT1, TPT2 ) + +END FUNCTION DATETIME_GT + + +FUNCTION DATETIME_TIME_ADD( TPIN, PTIME ) RESULT ( TPOUT ) + +IMPLICIT NONE + +TYPE(DATE_TIME), INTENT(IN) :: TPIN ! Start date +REAL, INTENT(IN) :: PTIME ! Added time +TYPE(DATE_TIME) :: TPOUT ! End date = start date + added time + +TPOUT = TPIN +TPOUT%XTIME = TPOUT%XTIME + PTIME + +CALL DATETIME_CORRECTDATE( TPOUT ) + +END FUNCTION DATETIME_TIME_ADD + + +FUNCTION DATETIME_TIME_SUBSTRACT( TPT1, TPT2 ) RESULT( PDIST ) +! +!Compute distance (in seconds) between 2 dates +! + +IMPLICIT NONE + +TYPE(DATE_TIME), INTENT(IN) :: TPT1 +TYPE(DATE_TIME), INTENT(IN) :: TPT2 +REAL :: PDIST + +CALL DATETIME_DISTANCE( TPT2, TPT1, PDIST ) + +END FUNCTION DATETIME_TIME_SUBSTRACT + END MODULE MODE_DATETIME diff --git a/src/MNH/mode_dust_psd.f90 b/src/MNH/mode_dust_psd.f90 index 016abf4f5c41b1bdd3d86c030a9dfecfbdda06df..dc34447c25f9559fa5e5ec4ec9f2a6d0c8c634b1 100644 --- a/src/MNH/mode_dust_psd.f90 +++ b/src/MNH/mode_dust_psd.f90 @@ -1,12 +1,8 @@ -!ORILAM_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!ORILAM_LIC Copyright 2005-2022 CNRS, Meteo-France and Universite Paul Sabatier !ORILAM_LIC This is part of the ORILAM software governed by the CeCILL-C licence !ORILAM_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !ORILAM_LIC for details. !----------------------------------------------------------------- -!--------------- special set of characters for RCS information -!----------------------------------------------------------------- -! $Source$ $Revision$ $Date$ -!----------------------------------------------------------------- !! ######################## MODULE MODE_DUST_PSD !! ######################## @@ -14,7 +10,7 @@ !! PURPOSE !! ------- !! MODULE DUST PSD (Particle Size Distribution) -!! Purpose: Contains subroutines to convert from transported variables (ppp) +!! Purpose: Contains subroutines to convert from transported variables (ppv) !! to understandable aerosol variables, e.g. #/m3, kg/m3, sigma, R_{n} !! !! AUTHOR @@ -45,7 +41,7 @@ CONTAINS ! !! ############################################################ SUBROUTINE PPP2DUST( & - PSVT & !I [ppp] input scalar variables (moment of distribution) + PSVT & !I [ppv] input scalar variables (moment of distribution) , PRHODREF & !I [kg/m3] density of air , PSIG3D & !O [-] standard deviation of aerosol distribution , PRG3D & !O [um] number median diameter of aerosol distribution @@ -58,7 +54,7 @@ CONTAINS !! !! PURPOSE !! ------- -!! Translate the three moments M0, M3 and M6 given in ppp into +!! Translate the three moments M0, M3 and M6 given in ppv into !! Values which can be understood more easily (R, sigma, N, M) !! !! CALLING STRUCTURE NOTE: OPTIONAL VARIABLES @@ -92,7 +88,7 @@ CONTAINS ! !* 0.1 declarations of arguments ! -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVT !I [ppp] first moment +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVT !I [ppv] first moment REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF !I [kg/m3] density of air REAL, DIMENSION(:,:,:,:), OPTIONAL, INTENT(OUT) :: PSIG3D !O [-] standard deviation @@ -326,7 +322,7 @@ END SUBROUTINE PPP2DUST !! ############################################################ SUBROUTINE DUST2PPP( & - PSVT & !IO [ppp] input scalar variables (moment of distribution) + PSVT & !IO [ppv] input scalar variables (moment of distribution) , PRHODREF & !I [kg/m3] density of air , PSIG3D & !I [-] standard deviation of aerosol distribution , PRG3D & !I [um] number median diameter of aerosol distribution @@ -336,7 +332,7 @@ END SUBROUTINE PPP2DUST !! !! PURPOSE !! ------- -!! Translate the dust Mass, RG and SIGMA in the three moments M0, M3 and M6 given in ppp +!! Translate the dust Mass, RG and SIGMA in the three moments M0, M3 and M6 given in ppv !! !! CALLING STRUCTURE NOTE: OPTIONAL VARIABLES !! ------- @@ -542,7 +538,7 @@ DEALLOCATE(NM0) END SUBROUTINE DUST2PPP !! ############################################################ SUBROUTINE PPP2DUST1D( & - PSVT & !I [ppp] input scalar variables (moment of distribution) + PSVT & !I [ppv] input scalar variables (moment of distribution) , PRHODREF & !I [kg/m3] density of air , PSIG1D & !O [-] standard deviation of aerosol distribution , PRG1D & !O [um] number median diameter of aerosol distribution @@ -555,7 +551,7 @@ END SUBROUTINE DUST2PPP !! !! PURPOSE !! ------- -!! Translate the three moments M0, M3 and M6 given in ppp into +!! Translate the three moments M0, M3 and M6 given in ppv into !! Values which can be understood more easily (R, sigma, N, M) !! !! CALLING STRUCTURE NOTE: OPTIONAL VARIABLES @@ -589,7 +585,7 @@ END SUBROUTINE DUST2PPP ! !* 0.1 declarations of arguments ! -REAL, DIMENSION(:,:), INTENT(INOUT) :: PSVT !I [ppp] first moment +REAL, DIMENSION(:,:), INTENT(INOUT) :: PSVT !I [ppv] first moment REAL, DIMENSION(:), INTENT(IN) :: PRHODREF !I [kg/m3] density of air REAL, DIMENSION(:,:), OPTIONAL, INTENT(OUT) :: PSIG1D !O [-] standard deviation diff --git a/src/MNH/mode_gridproj.f90 b/src/MNH/mode_gridproj.f90 index d907e68015248c67d0c3c1bcbc229c7a3cf6d1c5..77aa0c961c815d7cc8e082a74b88199309b001d6 100644 --- a/src/MNH/mode_gridproj.f90 +++ b/src/MNH/mode_gridproj.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1994-2020 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1994-2022 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. @@ -71,11 +71,11 @@ CONTAINS !* 1. ROUTINE SM_GRIDPROJ ! -------------------- !------------------------------------------------------------------------------- -! #################################################################### - SUBROUTINE SM_GRIDPROJ(PXHAT,PYHAT,PZHAT,PZS, & - OSLEVE,PLEN1,PLEN2,PZSMT,PLATOR,PLONOR, & - PMAP,PLAT,PLON,PDXHAT,PDYHAT,PZZ,PJ ) -! #################################################################### +! ###################################################################### + SUBROUTINE SM_GRIDPROJ( PXHAT, PYHAT, PZHAT, PXHATM, PYHATM, PZS, & + OSLEVE, PLEN1, PLEN2, PZSMT, PLATOR, PLONOR, & + PMAP, PLAT, PLON, PDXHAT, PDYHAT, PZZ, PJ ) +! ###################################################################### ! !!***** *SM_GRIDPROJ * - Computes Jacobian J, map factor M, !! horizontal grid-meshes, latitude and longitude at the @@ -199,8 +199,8 @@ IMPLICIT NONE ! !* 0.1 Declarations of arguments ! -REAL, DIMENSION(:), INTENT(IN) :: PXHAT,PYHAT,PZHAT ! Positions x,y,z in - ! the cartesian plane +REAL, DIMENSION(:), INTENT(IN) :: PXHAT,PYHAT,PZHAT ! Positions x,y,z in the cartesian plane +REAL, DIMENSION(:), INTENT(IN) :: PXHATM, PYHATM ! Positions x,y,z in the cartesian plane at mass points REAL, DIMENSION(:,:), INTENT(IN) :: PZS ! Orography LOGICAL, INTENT(IN) :: OSLEVE ! flag for SLEVE coordinate REAL, INTENT(IN) :: PLEN1 ! Decay scale for smooth topography @@ -332,21 +332,13 @@ END IF !* 4. COMPUTE ZXHAT AND ZYHAT AT MASS POINTS ! ------------------------------------- ! -ZXHATM(:,:) = 0. -ZYHATM(:,:) = 0. -ZXHATM(1:IIU-1,1) = .5*(PXHAT(1:IIU-1)+PXHAT(2:IIU)) -ZXHATM(IIU,1) = 2.*PXHAT(IIU)-ZXHATM(IIU-1,1) -ZXHATM(:,2:IJU) = SPREAD(ZXHATM(:,1),2,IJU-1) +ZXHATM(:,:) = SPREAD( PXHATM(:), 2 , IJU ) +ZYHATM(:,:) = SPREAD( PYHATM(:), 1 , IIU ) ! cancel MPPDB_CHECK if cprog=='SPAWN ' -IF(CPROGRAM/='SPAWN ')& -CALL MPPDB_CHECK2D(ZXHATM,"GRIDPROJ:ZXHATM",PRECISION) -! -ZYHATM(1,1:IJU-1) = .5*(PYHAT(1:IJU-1)+PYHAT(2:IJU)) -ZYHATM(1,IJU) = 2.*PYHAT(IJU)-ZYHATM(1,IJU-1) -ZYHATM(2:IIU,:) = SPREAD(ZYHATM(1,:),1,IIU-1) -! cancel MPPDB_CHECK if cprog=='SPAWN ' -IF(CPROGRAM/='SPAWN ')& -CALL MPPDB_CHECK2D(ZYHATM,"GRIDPROJ:ZYHATM",PRECISION) +IF( CPROGRAM /= 'SPAWN ') THEN + CALL MPPDB_CHECK2D(ZXHATM,"GRIDPROJ:ZXHATM",PRECISION) + CALL MPPDB_CHECK2D(ZYHATM,"GRIDPROJ:ZYHATM",PRECISION) +END IF ! ZXHATM and ZXHATM have to be updated CALL ADD2DFIELD_ll( TZHALO_ll, ZXHATM, 'SM_GRIDPROJ::ZXHATM' ) CALL ADD2DFIELD_ll( TZHALO_ll, ZYHATM, 'SM_GRIDPROJ::ZYHATM' ) diff --git a/src/MNH/mode_les_diachro.f90 b/src/MNH/mode_les_diachro.f90 index 7d8d698722653f0bb5255fcbe99e88a33992bf0e..8f848f4e91734d56a56461c4660af25ef0cc73ba 100644 --- a/src/MNH/mode_les_diachro.f90 +++ b/src/MNH/mode_les_diachro.f90 @@ -9,7 +9,7 @@ ! P. Wautelet 13/09/2019: budget: simplify and modernize date/time management ! P. Wautelet 20/09/2019: rewrite normalization of LES budgets ! P. Wautelet 14/08/2020: deduplicate LES_DIACHRO* subroutines -! P. Wautelet 10/2020: restructure subroutines to use tfield_metadata_base type +! P. Wautelet 10/2020: restructure subroutines to use tfieldmetadata_base type ! P. Wautelet 03/03/2021: budgets: add tbudiachrometadata type (useful to pass more information to Write_diachro) ! P. Wautelet 11/03/2021: budgets: remove ptrajx/y/z optional dummy arguments of Write_diachro ! P. Wautelet 22/03/2022: LES averaging periods are more reliable (compute with integers instead of reals) @@ -631,18 +631,18 @@ end function Les_time_avg_1pt subroutine Les_diachro_1D( tpdiafile, tpfield, hgroup, hgroupcomment, odoavg, odonorm, pfield ) !############################################################################################## -use modd_field, only: NMNHDIM_BUDGET_LES_TIME, NMNHDIM_UNUSED, tfield_metadata_base +use modd_field, only: NMNHDIM_BUDGET_LES_TIME, NMNHDIM_UNUSED, tfieldmetadata_base use modd_io, only: tfiledata type(tfiledata), intent(in) :: tpdiafile ! File to write -type(tfield_metadata_base), intent(in) :: tpfield ! Metadata of field +type(tfieldmetadata_base), intent(in) :: tpfield ! Metadata of field character(len=*), intent(in) :: hgroup ! Group of the field character(len=*), intent(in) :: hgroupcomment logical, intent(in) :: odoavg ! Compute and store time average logical, intent(in) :: odonorm ! Compute and store normalized field real, dimension(:), intent(in) :: pfield ! Data array -type(tfield_metadata_base) :: tzfield +type(tfieldmetadata_base) :: tzfield tzfield = tpfield @@ -676,18 +676,18 @@ subroutine Les_diachro_2D( tpdiafile, tpfield, hgroup, hgroupcomment, odoavg, od !############################################################################################## use modd_field, only: NMNHDIM_BUDGET_LES_LEVEL, NMNHDIM_BUDGET_LES_SV, NMNHDIM_BUDGET_LES_TIME, NMNHDIM_UNUSED, & - tfield_metadata_base + tfieldmetadata_base use modd_io, only: tfiledata type(tfiledata), intent(in) :: tpdiafile ! File to write -type(tfield_metadata_base), intent(in) :: tpfield ! Metadata of field +type(tfieldmetadata_base), intent(in) :: tpfield ! Metadata of field character(len=*), intent(in) :: hgroup ! Group of the field character(len=*), intent(in) :: hgroupcomment logical, intent(in) :: odoavg ! Compute and store time average logical, intent(in) :: odonorm ! Compute and store normalized field real, dimension(:,:), intent(in) :: pfield ! Data array -type(tfield_metadata_base) :: tzfield +type(tfieldmetadata_base) :: tzfield tzfield = tpfield @@ -733,11 +733,11 @@ subroutine Les_diachro_3D( tpdiafile, tpfield, hgroup, hgroupcomment, odoavg, od use modd_field, only: NMNHDIM_BUDGET_LES_LEVEL, NMNHDIM_BUDGET_LES_MASK, NMNHDIM_BUDGET_LES_SV, & NMNHDIM_BUDGET_LES_TIME, NMNHDIM_BUDGET_TERM, NMNHDIM_UNUSED, & - tfield_metadata_base + tfieldmetadata_base use modd_io, only: tfiledata type(tfiledata), intent(in) :: tpdiafile ! File to write -type(tfield_metadata_base), intent(in) :: tpfield ! Metadata of field +type(tfieldmetadata_base), intent(in) :: tpfield ! Metadata of field character(len=*), intent(in) :: hgroup ! Group of the field character(len=*), intent(in) :: hgroupcomment logical, intent(in) :: odoavg ! Compute and store time average @@ -747,7 +747,7 @@ character(len=*), dimension(:), optional, intent(in) :: hfieldnames character(len=*), dimension(:), optional, intent(in) :: hfieldcomments character(len=*), dimension(:), optional, intent(in) :: hmasks -type(tfield_metadata_base) :: tzfield +type(tfieldmetadata_base) :: tzfield tzfield = tpfield @@ -831,11 +831,11 @@ subroutine Les_diachro_4D( tpdiafile, tpfield, hgroup, hgroupcomment, odoavg, od use modd_field, only: NMNHDIM_BUDGET_LES_LEVEL, NMNHDIM_BUDGET_LES_MASK, NMNHDIM_BUDGET_LES_PDF, NMNHDIM_BUDGET_LES_SV, & NMNHDIM_BUDGET_LES_TIME, NMNHDIM_BUDGET_TERM, NMNHDIM_UNUSED, & - tfield_metadata_base + tfieldmetadata_base use modd_io, only: tfiledata type(tfiledata), intent(in) :: tpdiafile ! File to write -type(tfield_metadata_base), intent(in) :: tpfield ! Metadata of field +type(tfieldmetadata_base), intent(in) :: tpfield ! Metadata of field character(len=*), intent(in) :: hgroup ! Group of the field character(len=*), intent(in) :: hgroupcomment logical, intent(in) :: odoavg ! Compute and store time average @@ -845,7 +845,7 @@ character(len=*), dimension(:), optional, intent(in) :: hfieldnames character(len=*), dimension(:), optional, intent(in) :: hfieldcomments character(len=*), dimension(:), optional, intent(in) :: hmasks -type(tfield_metadata_base) :: tzfield +type(tfieldmetadata_base) :: tzfield tzfield = tpfield @@ -935,7 +935,7 @@ subroutine Les_diachro_common( tpdiafile, tpfield, hgroup, hgroupcomment, pfield hfieldnames, hfieldcomments, hmasks ) !################################################################################################### -use modd_field, only: tfield_metadata_base +use modd_field, only: tfieldmetadata_base use modd_io, only: tfiledata use modd_les, only: nles_current_iinf, nles_current_isup, nles_current_jinf, nles_current_jsup, & nles_levels, xles_current_z @@ -944,25 +944,25 @@ use modd_type_date, only: date_time implicit none -type(tfiledata), intent(in) :: tpdiafile ! File to write -type(tfield_metadata_base), intent(in) :: tpfield -character(len=*), intent(in) :: hgroup ! Group of the field -character(len=*), intent(in) :: hgroupcomment -real, dimension(:,:,:,:), intent(in) :: pfield ! Data array -logical, intent(in) :: odoavg ! Compute and store time average -logical, intent(in) :: odonorm ! Compute and store normalized field -character(len=*), dimension(:), optional, intent(in) :: hfieldnames -character(len=*), dimension(:), optional, intent(in) :: hfieldcomments -character(len=*), dimension(:), optional, intent(in) :: hmasks - -character(len=100), dimension(:), allocatable :: ycomment ! Comment string -character(len=100), dimension(:), allocatable :: ytitle ! Title -integer :: iles_k ! Number of vertical levels -integer :: iil, iih, ijl, ijh, ikl, ikh ! Cartesian area relatively to the - ! entire domain -integer :: jp ! Process loop counter -real, dimension(:,:,:), allocatable :: ztrajz ! x and y are not used for LES -type(tfield_metadata_base), dimension(:), allocatable :: tzfields +type(tfiledata), intent(in) :: tpdiafile ! File to write +type(tfieldmetadata_base), intent(in) :: tpfield +character(len=*), intent(in) :: hgroup ! Group of the field +character(len=*), intent(in) :: hgroupcomment +real, dimension(:,:,:,:), intent(in) :: pfield ! Data array +logical, intent(in) :: odoavg ! Compute and store time average +logical, intent(in) :: odonorm ! Compute and store normalized field +character(len=*), dimension(:), optional, intent(in) :: hfieldnames +character(len=*), dimension(:), optional, intent(in) :: hfieldcomments +character(len=*), dimension(:), optional, intent(in) :: hmasks + +character(len=100), dimension(:), allocatable :: ycomment ! Comment string +character(len=100), dimension(:), allocatable :: ytitle ! Title +integer :: iles_k ! Number of vertical levels +integer :: iil, iih, ijl, ijh, ikl, ikh ! Cartesian area relatively to the + ! entire domain +integer :: jp ! Process loop counter +real, dimension(:,:,:), allocatable :: ztrajz ! x and y are not used for LES +type(tfieldmetadata_base), dimension(:), allocatable :: tzfields !------------------------------------------------------------------------------ iles_k = Size( pfield, 1 ) @@ -1215,7 +1215,7 @@ subroutine Les_diachro_2pt( tpdiafile, tpfieldx, tpfieldy, pfieldx, pfieldy ) ! ! use modd_conf, only: l2d -use modd_field, only: tfield_metadata_base +use modd_field, only: tfieldmetadata_base use modd_io, only: tfiledata use modd_les, only: xles_temp_mean_start, xles_temp_mean_end use modd_parameters, only: XUNDEF @@ -1226,8 +1226,8 @@ IMPLICIT NONE !* 0.1 declarations of arguments ! type(tfiledata), intent(in) :: tpdiafile! file to write -type(tfield_metadata_base), intent(in) :: tpfieldx ! Metadata of field pfieldx -type(tfield_metadata_base), intent(in) :: tpfieldy ! Metadata of field pfieldy +type(tfieldmetadata_base), intent(in) :: tpfieldx ! Metadata of field pfieldx +type(tfieldmetadata_base), intent(in) :: tpfieldy ! Metadata of field pfieldy real, dimension(:,:,:), intent(in) :: pfieldx real, dimension(:,:,:), intent(in) :: pfieldy !------------------------------------------------------------------------------- @@ -1250,7 +1250,7 @@ subroutine Les_diachro_2pt_1d_intern( tpdiafile, tpfield, gavg, pfield ) use modd_field, only: NMNHDIM_BUDGET_LES_AVG_TIME, NMNHDIM_BUDGET_LES_TIME, NMNHDIM_UNUSED, & NMNHDIM_SPECTRA_2PTS_NI, NMNHDIM_SPECTRA_2PTS_NJ, & - NMNHMAXDIMS, tfield_metadata_base + NMNHMAXDIMS, tfieldmetadata_base use modd_io, only: tfiledata use modd_les, only: nles_current_iinf, nles_current_isup, nles_current_jinf, nles_current_jsup, & nles_current_times, nspectra_k, xles_current_domegax, xles_current_domegay @@ -1259,7 +1259,7 @@ use modd_type_date, only: date_time use mode_write_diachro, only: Write_diachro type(tfiledata), intent(in) :: tpdiafile! file to write -type(tfield_metadata_base), intent(in) :: tpfield ! Metadata of field pfield +type(tfieldmetadata_base), intent(in) :: tpfield ! Metadata of field pfield logical, intent(in) :: gavg real, dimension(:,:,:), intent(in) :: pfield @@ -1274,7 +1274,7 @@ integer :: jk ! level counter real, dimension(:,:,:,:,:,:), allocatable :: zwork6 ! contains physical field type(date_time), dimension(:), allocatable :: tzdates type(tbudiachrometadata) :: tzbudiachro -type(tfield_metadata_base) :: tzfield +type(tfieldmetadata_base) :: tzfield !* 1.0 Initialization of diachro variables for LES (z,t) profiles ! ---------------------------------------------------------- @@ -1423,14 +1423,14 @@ subroutine Les_diachro_spec( tpdiafile, tpfieldx, tpfieldy, pspectrax, pspectray ! ! use modd_conf, only: l2d -use modd_field, only: tfield_metadata_base +use modd_field, only: tfieldmetadata_base use modd_io, only: tfiledata implicit none type(tfiledata), intent(in) :: tpdiafile! file to write -type(tfield_metadata_base), intent(in) :: tpfieldx ! metadata of field pfieldx -type(tfield_metadata_base), intent(in) :: tpfieldy ! metadata of field pfieldy +type(tfieldmetadata_base), intent(in) :: tpfieldx ! metadata of field pfieldx +type(tfieldmetadata_base), intent(in) :: tpfieldy ! metadata of field pfieldy real, dimension(:,:,:,:), intent(in) :: pspectrax! spectra in x real, dimension(:,:,:,:), intent(in) :: pspectray! and y directions @@ -1446,7 +1446,7 @@ subroutine Les_diachro_spec_1D_intern( tpdiafile, tpfield, pspectra ) use modd_field, only: NMNHDIM_BUDGET_LES_AVG_TIME, NMNHDIM_BUDGET_LES_TIME, NMNHDIM_UNUSED, & NMNHDIM_SPECTRA_SPEC_NI, NMNHDIM_SPECTRA_SPEC_NJ, & - NMNHMAXDIMS, tfield_metadata_base + NMNHMAXDIMS, tfieldmetadata_base use modd_io, only: tfiledata use modd_les, only: nles_current_iinf, nles_current_isup, nles_current_jinf, nles_current_jsup, & nles_current_times, nspectra_k, & @@ -1459,7 +1459,7 @@ use mode_write_diachro, only: Write_diachro implicit none type(tfiledata), intent(in) :: tpdiafile ! file to write -type(tfield_metadata_base), intent(in) :: tpfield ! metadata of field pfield +type(tfieldmetadata_base), intent(in) :: tpfield ! metadata of field pfield real, dimension(:,:,:,:), intent(in) :: pspectra character(len=10) :: ygroup ! group title @@ -1473,7 +1473,7 @@ integer :: jk ! level counter real, dimension(:,:,:,:,:,:), allocatable :: zwork6 ! physical field type(date_time), dimension(:), allocatable :: tzdates type(tbudiachrometadata) :: tzbudiachro -type(tfield_metadata_base) :: tzfield +type(tfieldmetadata_base) :: tzfield ! !* 1.0 Initialization of diachro variables for LES (z,t) profiles ! ---------------------------------------------------------- diff --git a/src/MNH/mode_salt_psd.f90 b/src/MNH/mode_salt_psd.f90 index 1a4a9e799d5a6928e53e50f988b2f2f540cd86ad..28da713be516a68e6cd1ad11ac99517eec98e245 100644 --- a/src/MNH/mode_salt_psd.f90 +++ b/src/MNH/mode_salt_psd.f90 @@ -1,12 +1,8 @@ -!ORILAM_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!ORILAM_LIC Copyright 2005-2022 CNRS, Meteo-France and Universite Paul Sabatier !ORILAM_LIC This is part of the ORILAM software governed by the CeCILL-C licence !ORILAM_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !ORILAM_LIC for details. !----------------------------------------------------------------- -!--------------- special set of characters for RCS information -!----------------------------------------------------------------- -! $Source$ $Revision$ $Date$ -!----------------------------------------------------------------- !! ######################## MODULE MODE_SALT_PSD !! ######################## @@ -14,7 +10,7 @@ !! PURPOSE !! ------- !! MODULE SALT PSD (Particle Size Distribution) -!! Purpose: Contains subroutines to convert from transported variables (ppp) +!! Purpose: Contains subroutines to convert from transported variables (ppv) !! to understandable aerosol variables, e.g. #/m3, kg/m3, sigma, R_{n} !! !! AUTHOR @@ -50,7 +46,7 @@ CONTAINS ! !! ############################################################ SUBROUTINE PPP2SALT( & - PSVT & !I [ppp] input scalar variables (moment of distribution) + PSVT & !I [ppv] input scalar variables (moment of distribution) , PRHODREF & !I [kg/m3] density of air , PSIG3D & !O [-] standard deviation of aerosol distribution , PRG3D & !O [um] number median diameter of aerosol distribution @@ -63,7 +59,7 @@ CONTAINS !! !! PURPOSE !! ------- -!! Translate the three moments M0, M3 and M6 given in ppp into +!! Translate the three moments M0, M3 and M6 given in ppv into !! Values which can be understood more easily (R, sigma, N, M) !! !! CALLING STRUCTURE NOTE: OPTIONAL VARIABLES @@ -97,7 +93,7 @@ CONTAINS ! !* 0.1 declarations of arguments ! -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVT !I [ppp] first moment +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVT !I [ppv] first moment REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF !I [kg/m3] density of air REAL, DIMENSION(:,:,:,:), OPTIONAL, INTENT(OUT) :: PSIG3D !O [-] standard deviation @@ -340,7 +336,7 @@ END SUBROUTINE PPP2SALT !! ############################################################ SUBROUTINE SALT2PPP( & - PSVT & !IO [ppp] input scalar variables (moment of distribution) + PSVT & !IO [ppv] input scalar variables (moment of distribution) , PRHODREF & !I [kg/m3] density of air , PSIG3D & !I [-] standard deviation of aerosol distribution , PRG3D & !I [um] number median diameter of aerosol distribution @@ -350,7 +346,7 @@ END SUBROUTINE PPP2SALT !! !! PURPOSE !! ------- -!! Translate the sea salt Mass, RG and SIGMA in the three moments M0, M3 and M6 given in ppp +!! Translate the sea salt Mass, RG and SIGMA in the three moments M0, M3 and M6 given in ppv !! !! CALLING STRUCTURE NOTE: OPTIONAL VARIABLES !! ------- @@ -552,7 +548,7 @@ END SUBROUTINE SALT2PPP ! !! ############################################################ SUBROUTINE PPP2SALT1D( & - PSVT & !I [ppp] input scalar variables (moment of distribution) + PSVT & !I [ppv] input scalar variables (moment of distribution) , PRHODREF & !I [kg/m3] density of air , PSIG1D & !O [-] standard deviation of aerosol distribution , PRG1D & !O [um] number median diameter of aerosol distribution @@ -565,7 +561,7 @@ END SUBROUTINE SALT2PPP !! !! PURPOSE !! ------- -!! Translate the three moments M0, M3 and M6 given in ppp into +!! Translate the three moments M0, M3 and M6 given in ppv into !! Values which can be understood more easily (R, sigma, N, M) !! !! CALLING STRUCTURE NOTE: OPTIONAL VARIABLES @@ -599,7 +595,7 @@ END SUBROUTINE SALT2PPP ! !* 0.1 declarations of arguments ! -REAL, DIMENSION(:,:), INTENT(INOUT) :: PSVT !I [ppp] first moment +REAL, DIMENSION(:,:), INTENT(INOUT) :: PSVT !I [ppv] first moment REAL, DIMENSION(:), INTENT(IN) :: PRHODREF !I [kg/m3] density of air REAL, DIMENSION(:,:), OPTIONAL, INTENT(OUT) :: PSIG1D !O [-] standard deviation diff --git a/src/MNH/mode_salt_psd_wet.f90 b/src/MNH/mode_salt_psd_wet.f90 index cb5af52f838a83cd4997f9fad234eb1919262d24..2a679f193c5bfdfcf2dcb68761e89d2cbbf014e3 100644 --- a/src/MNH/mode_salt_psd_wet.f90 +++ b/src/MNH/mode_salt_psd_wet.f90 @@ -1,12 +1,8 @@ -!ORILAM_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!ORILAM_LIC Copyright 2005-2022 CNRS, Meteo-France and Universite Paul Sabatier !ORILAM_LIC This is part of the ORILAM software governed by the CeCILL-C licence !ORILAM_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !ORILAM_LIC for details. !----------------------------------------------------------------- -!--------------- special set of characters for RCS information -!----------------------------------------------------------------- -! $Source: /home/cvsroot/MNH-VX-Y-Z/src/MNH/Attic/mode_salt_psd.f90,v $ $Revision: 1.1.2.1.2.1.2.1.2.1 $ $Date: 2013/07/12 13:55:08 $ -!----------------------------------------------------------------- !! ######################## MODULE MODE_SALT_PSD_WET !! ######################## @@ -14,7 +10,7 @@ !! PURPOSE !! ------- !! MODULE SALT PSD (Particle Size Distribution) -!! Purpose: Contains subroutines to convert from transported variables (ppp) +!! Purpose: Contains subroutines to convert from transported variables (ppv) !! to understandable aerosol variables, e.g. #/m3, kg/m3, sigma, R_{n} !! !! AUTHOR @@ -56,7 +52,7 @@ CONTAINS ! !! ############################################################ SUBROUTINE PPP2SALT_WET( & - PSVT & !I [ppp] input scalar variables (moment of distribution) + PSVT & !I [ppv] input scalar variables (moment of distribution) , PRHODREF & !I [kg/m3] density of air , PPABST & !I Pression , PTHT & !I Potential temperature @@ -73,7 +69,7 @@ CONTAINS !! !! PURPOSE !! ------- -!! Translate the three moments M0, M3 and M6 given in ppp into +!! Translate the three moments M0, M3 and M6 given in ppv into !! Values which can be understood more easily (R, sigma, N, M) !! !! Calcul the wet radius of the particles, using RH and Gerber (1985) relation @@ -111,7 +107,7 @@ CONTAINS ! !* 0.1 declarations of arguments ! -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVT !I [ppp] first moment +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVT !I [ppv] first moment REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF !I [kg/m3] density of air REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST !I Pression REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT !I Potential temperature @@ -432,7 +428,7 @@ END SUBROUTINE PPP2SALT_WET !! ############################################################ SUBROUTINE SALT2PPP( & - PSVT & !IO [ppp] input scalar variables (moment of distribution) + PSVT & !IO [ppv] input scalar variables (moment of distribution) , PRHODREF & !I [kg/m3] density of air , PSIG3D & !I [-] standard deviation of aerosol distribution , PRG3D & !I [um] number median diameter of aerosol distribution @@ -442,7 +438,7 @@ END SUBROUTINE PPP2SALT_WET !! !! PURPOSE !! ------- -!! Translate the sea salt Mass, RG and SIGMA in the three moments M0, M3 and M6 given in ppp +!! Translate the sea salt Mass, RG and SIGMA in the three moments M0, M3 and M6 given in ppv !! !! CALLING STRUCTURE NOTE: OPTIONAL VARIABLES !! ------- @@ -645,7 +641,7 @@ END SUBROUTINE SALT2PPP ! !! ############################################################ SUBROUTINE PPP2SALT1D( & - PSVT & !I [ppp] input scalar variables (moment of distribution) + PSVT & !I [ppv] input scalar variables (moment of distribution) , PRHODREF & !I [kg/m3] density of air , PSIG1D & !O [-] standard deviation of aerosol distribution , PRG1D & !O [um] number median diameter of aerosol distribution @@ -658,7 +654,7 @@ END SUBROUTINE SALT2PPP !! !! PURPOSE !! ------- -!! Translate the three moments M0, M3 and M6 given in ppp into +!! Translate the three moments M0, M3 and M6 given in ppv into !! Values which can be understood more easily (R, sigma, N, M) !! !! CALLING STRUCTURE NOTE: OPTIONAL VARIABLES @@ -692,7 +688,7 @@ END SUBROUTINE SALT2PPP ! !* 0.1 declarations of arguments ! -REAL, DIMENSION(:,:), INTENT(INOUT) :: PSVT !I [ppp] first moment +REAL, DIMENSION(:,:), INTENT(INOUT) :: PSVT !I [ppv] first moment REAL, DIMENSION(:), INTENT(IN) :: PRHODREF !I [kg/m3] density of air REAL, DIMENSION(:,:), OPTIONAL, INTENT(OUT) :: PSIG1D !O [-] standard deviation diff --git a/src/MNH/modeln.f90 b/src/MNH/modeln.f90 index 3d8010abc27de107c3190cee67a9a330ef5a9e00..3ee78c99f06551d13aa7d2148cab112b21c0a9d5 100644 --- a/src/MNH/modeln.f90 +++ b/src/MNH/modeln.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1994-2023 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. @@ -9,10 +9,15 @@ ! INTERFACE ! - SUBROUTINE MODEL_n(KTCOUNT,OEXIT) + SUBROUTINE MODEL_n( KTCOUNT, TPBAKFILE, TPDTMODELN, OEXIT ) ! -INTEGER, INTENT(IN) :: KTCOUNT ! temporal loop index of model KMODEL -LOGICAL, INTENT(INOUT):: OEXIT ! switch for the end of the temporal loop +USE MODD_IO, ONLY: TFILEDATA +USE MODD_TYPE_DATE, ONLY: DATE_TIME +! +INTEGER, INTENT(IN) :: KTCOUNT ! Temporal loop index of model KMODEL +TYPE(TFILEDATA), POINTER, INTENT(OUT) :: TPBAKFILE ! Pointer for backup file +TYPE(DATE_TIME), INTENT(OUT) :: TPDTMODELN ! Time of current model computation +LOGICAL, INTENT(INOUT) :: OEXIT ! Switch for the end of the temporal loop ! END SUBROUTINE MODEL_n ! @@ -21,7 +26,7 @@ END INTERFACE END MODULE MODI_MODEL_n ! ################################### - SUBROUTINE MODEL_n(KTCOUNT, OEXIT) + SUBROUTINE MODEL_n( KTCOUNT, TPBAKFILE, TPDTMODELN, OEXIT ) ! ################################### ! !!**** *MODEL_n * -monitor of the model version _n @@ -274,6 +279,9 @@ END MODULE MODI_MODEL_n ! J.L. Redelsperger 03/2021: add Call NHOA_COUPLN (coupling O & A LES version) ! A. Costes 12/2021: add Blaze fire model ! C. Barthe 07/04/2022: deallocation of ZSEA +! P. Wautelet 08/12/2022: bugfix if no TDADFILE +! P. Wautelet 13/01/2023: manage close of backup files outside of MODEL_n +! (useful to close them in reverse model order (child before parent, needed by WRITE_BALLOON_n) !!------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -363,8 +371,10 @@ USE MODD_TIME_n USE MODD_TIMEZ USE MODD_TURB_CLOUD, ONLY: NMODEL_CLOUD,CTURBLEN_CLOUD,XCEI USE MODD_TURB_n +USE MODD_TYPE_DATE, ONLY: DATE_TIME USE MODD_VISCOSITY ! +USE MODE_AIRCRAFT_BALLOON use mode_budget, only: Budget_store_init, Budget_store_end USE MODE_DATETIME USE MODE_ELEC_ll @@ -382,9 +392,11 @@ USE MODE_MODELN_HANDLER USE MODE_MPPDB USE MODE_MSG USE MODE_ONE_WAY_n +USE MODE_WRITE_AIRCRAFT_BALLOON use mode_write_les_n, only: Write_les_n use mode_write_lfifmn_fordiachro_n, only: WRITE_LFIFMN_FORDIACHRO_n USE MODE_WRITE_PROFILER_n, ONLY: WRITE_PROFILER_n +USE MODE_WRITE_STATION_n, ONLY: WRITE_STATION_n ! USE MODI_ADDFLUCTUATIONS USE MODI_ADVECTION_METSV @@ -392,7 +404,6 @@ USE MODI_ADVECTION_UVW USE MODI_ADVECTION_UVW_CEN USE MODI_ADV_FORCING_n USE MODI_AER_MONITOR_n -USE MODI_AIRCRAFT_BALLOON USE MODI_BLOWSNOW USE MODI_BOUNDARIES USE MODI_BUDGET_FLAGS @@ -447,12 +458,10 @@ USE MODI_TURB_CLOUD_INDEX USE MODI_TWO_WAY USE MODI_UPDATE_NSV USE MODI_VISCOSITY -USE MODI_WRITE_AIRCRAFT_BALLOON USE MODI_WRITE_DESFM_n USE MODI_WRITE_DIAG_SURF_ATM_N USE MODI_WRITE_LFIFM_n USE MODI_WRITE_SERIES_n -USE MODI_WRITE_STATION_n USE MODI_WRITE_SURF_ATM_N ! USE MODD_FIRE @@ -462,8 +471,10 @@ IMPLICIT NONE ! ! ! -INTEGER, INTENT(IN) :: KTCOUNT -LOGICAL, INTENT(INOUT):: OEXIT +INTEGER, INTENT(IN) :: KTCOUNT ! Temporal loop index of model KMODEL +TYPE(TFILEDATA), POINTER, INTENT(OUT) :: TPBAKFILE ! Pointer for backup file +TYPE(DATE_TIME), INTENT(OUT) :: TPDTMODELN ! Time of current model computation +LOGICAL, INTENT(INOUT) :: OEXIT ! Switch for the end of the temporal loop ! !* 0.2 declarations of local variables ! @@ -482,6 +493,7 @@ REAL(kind=MNHTIME), DIMENSION(2) :: ZTIME_STEP,ZTIME_STEP_PTS CHARACTER :: YMI INTEGER :: IPOINTS CHARACTER(len=16) :: YTCOUNT,YPOINTS +CHARACTER(LEN=:), ALLOCATABLE :: YDADNAME ! INTEGER :: ISYNCHRO ! model synchronic index relative to its father ! = 1 for the first time step in phase with DAD @@ -552,16 +564,16 @@ LOGICAL :: GCLD ! conditionnal call for dust wet deposition LOGICAL :: GCLOUD_ONLY ! conditionnal radiation computations for ! the only cloudy columns REAL, DIMENSION(SIZE(XRSVS,1), SIZE(XRSVS,2), SIZE(XRSVS,3), NSV_AER) :: ZWETDEPAER - - ! -TYPE(TFILEDATA),POINTER :: TZBAKFILE, TZOUTFILE +TYPE(TFILEDATA),POINTER :: TZOUTFILE ! TYPE(TFILEDATA),SAVE :: TZDIACFILE !------------------------------------------------------------------------------- ! -TZBAKFILE=> NULL() +TPBAKFILE=> NULL() TZOUTFILE=> NULL() ! +TPDTMODELN = TDTCUR +! !* 0. MICROPHYSICAL SCHEME ! ------------------- SELECT CASE(CCLOUD) @@ -997,18 +1009,24 @@ IF ( nfile_backup_current < NBAK_NUMB ) THEN IF ( KTCOUNT == TBACKUPN(nfile_backup_current + 1)%NSTEP ) THEN nfile_backup_current = nfile_backup_current + 1 ! - TZBAKFILE => TBACKUPN(nfile_backup_current)%TFILE - IVERB = TZBAKFILE%NLFIVERB + TPBAKFILE => TBACKUPN(nfile_backup_current)%TFILE + IVERB = TPBAKFILE%NLFIVERB ! - CALL IO_File_open(TZBAKFILE) + CALL IO_File_open(TPBAKFILE) ! - CALL WRITE_DESFM_n(IMI,TZBAKFILE) + CALL WRITE_DESFM_n(IMI,TPBAKFILE) CALL IO_Header_write( TBACKUPN(nfile_backup_current)%TFILE ) - CALL WRITE_LFIFM_n( TBACKUPN(nfile_backup_current)%TFILE, TBACKUPN(nfile_backup_current)%TFILE%TDADFILE%CNAME ) - TOUTDATAFILE => TZBAKFILE - CALL MNHWRITE_ZS_DUMMY_n(TZBAKFILE) + IF ( ASSOCIATED( TBACKUPN(nfile_backup_current)%TFILE%TDADFILE ) ) THEN + YDADNAME = TBACKUPN(nfile_backup_current)%TFILE%TDADFILE%CNAME + ELSE + ! Set a dummy name for the dad file. Its non-zero size will allow the writing of some data in the backup file + YDADNAME = 'DUMMY' + END IF + CALL WRITE_LFIFM_n( TBACKUPN(nfile_backup_current)%TFILE, TRIM( YDADNAME ) ) + TOUTDATAFILE => TPBAKFILE + CALL MNHWRITE_ZS_DUMMY_n(TPBAKFILE) IF (CSURF=='EXTE') THEN - TFILE_SURFEX => TZBAKFILE + TFILE_SURFEX => TPBAKFILE CALL GOTO_SURFEX(IMI) CALL WRITE_SURF_ATM_n(YSURF_CUR,'MESONH','ALL',.FALSE.) IF ( KTCOUNT > 1) THEN @@ -1020,10 +1038,10 @@ IF ( nfile_backup_current < NBAK_NUMB ) THEN ! ! Reinitialize Lagragian variables at every model backup IF (LLG .AND. LINIT_LG .AND. CINIT_LG=='FMOUT') THEN - CALL INI_LG(XXHAT,XYHAT,XZZ,XSVT,XLBXSVM,XLBYSVM) + CALL INI_LG( XXHATM, XYHATM, XZZ, XSVT, XLBXSVM, XLBYSVM ) IF (IVERB>=5) THEN WRITE(UNIT=ILUOUT,FMT=*) '************************************' - WRITE(UNIT=ILUOUT,FMT=*) '*** Lagrangian variables refreshed after ',TRIM(TZBAKFILE%CNAME),' backup' + WRITE(UNIT=ILUOUT,FMT=*) '*** Lagrangian variables refreshed after ',TRIM(TPBAKFILE%CNAME),' backup' WRITE(UNIT=ILUOUT,FMT=*) '************************************' END IF END IF @@ -1034,11 +1052,11 @@ IF ( nfile_backup_current < NBAK_NUMB ) THEN ! ELSE !Necessary to have a 'valid' CNAME when calling some subroutines - TZBAKFILE => TFILE_DUMMY + TPBAKFILE => TFILE_DUMMY END IF ELSE !Necessary to have a 'valid' CNAME when calling some subroutines - TZBAKFILE => TFILE_DUMMY + TPBAKFILE => TFILE_DUMMY END IF ! IF ( nfile_output_current < NOUT_NUMB ) THEN @@ -1235,8 +1253,9 @@ IF (LCARTESIAN) THEN CALL SM_GRIDCART(XXHAT,XYHAT,XZHAT,XZS,LSLEVE,XLEN1,XLEN2,XZSMT,XDXHAT,XDYHAT,XZZ,ZJ) XMAP=1. ELSE - CALL SM_GRIDPROJ(XXHAT,XYHAT,XZHAT,XZS,LSLEVE,XLEN1,XLEN2,XZSMT,XLATORI,XLONORI, & - XMAP,XLAT,XLON,XDXHAT,XDYHAT,XZZ,ZJ) + CALL SM_GRIDPROJ( XXHAT, XYHAT, XZHAT, XXHATM, XYHATM, XZS, & + LSLEVE, XLEN1, XLEN2, XZSMT, XLATORI, XLONORI, & + XMAP, XLAT, XLON, XDXHAT, XDYHAT, XZZ, ZJ ) END IF ! IF ( LFORCING ) THEN @@ -1460,7 +1479,7 @@ XT_RELAX = XT_RELAX + ZTIME2 - ZTIME1 & ! ZTIME1 = ZTIME2 ! -CALL PHYS_PARAM_n( KTCOUNT, TZBAKFILE, & +CALL PHYS_PARAM_n( KTCOUNT, TPBAKFILE, & XT_RAD, XT_SHADOWS, XT_DCONV, XT_GROUND, & XT_MAFL, XT_DRAG, XT_EOL, XT_TURB, XT_TRACER, & ZTIME, ZWETDEPAER, GMASKkids, GCLOUD_ONLY ) @@ -1640,7 +1659,7 @@ XTIME_LES_BU_PROCESS = 0. ! CALL MPPDB_CHECK3DM("before ADVEC_METSV:XU/V/W/TH/TKE/T,XRHODJ",PRECISION,& & XUT, XVT, XWT, XTHT, XTKET,XRHODJ) - CALL ADVECTION_METSV ( TZBAKFILE, CUVW_ADV_SCHEME, & + CALL ADVECTION_METSV ( TPBAKFILE, CUVW_ADV_SCHEME, & CMET_ADV_SCHEME, CSV_ADV_SCHEME, CCLOUD, NSPLIT, & LSPLIT_CFL, XSPLIT_CFL, LCFL_WRIT, & CLBCX, CLBCY, NRR, NSV, TDTCUR, XTSTEP, & @@ -1742,7 +1761,7 @@ XT_ADVUVW = XT_ADVUVW + ZTIME2 - ZTIME1 - XTIME_LES_BU_PROCESS - XTIME_BU_PROCES !------------------------------------------------------------------------------- ! IF (NMODEL_CLOUD==IMI .AND. CTURBLEN_CLOUD/='NONE') THEN - CALL TURB_CLOUD_INDEX( XTSTEP, TZBAKFILE, & + CALL TURB_CLOUD_INDEX( XTSTEP, TPBAKFILE, & LTURB_DIAG, NRRI, & XRRS, XRT, XRHODJ, XDXX, XDYY, XDZZ, XDZX, XDZY, & XCEI ) @@ -1929,7 +1948,7 @@ IF (CCLOUD /= 'NONE' .AND. CELEC == 'NONE') THEN CALL MNHGET_SURF_PARAM_n (PSEA=ZSEA(:,:),PTOWN=ZTOWN(:,:)) CALL RESOLVED_CLOUD ( CCLOUD, CACTCCN, CSCONV, CMF_CLOUD, NRR, NSPLITR, & NSPLITG, IMI, KTCOUNT, & - CLBCX,CLBCY,TZBAKFILE, CRAD, CTURBDIM, & + CLBCX,CLBCY,TPBAKFILE, CRAD, CTURBDIM, & LSUBG_COND,LSIGMAS,CSUBG_AUCV,XTSTEP, & XZZ, XRHODJ, XRHODREF, XEXNREF, & ZPABST, XTHT,XRT,XSIGS,VSIGQSAT,XMFCONV,XTHM,XRCM, & @@ -1949,7 +1968,7 @@ IF (CCLOUD /= 'NONE' .AND. CELEC == 'NONE') THEN ELSE CALL RESOLVED_CLOUD ( CCLOUD, CACTCCN, CSCONV, CMF_CLOUD, NRR, NSPLITR, & NSPLITG, IMI, KTCOUNT, & - CLBCX,CLBCY,TZBAKFILE, CRAD, CTURBDIM, & + CLBCX,CLBCY,TPBAKFILE, CRAD, CTURBDIM, & LSUBG_COND,LSIGMAS,CSUBG_AUCV, & XTSTEP,XZZ, XRHODJ, XRHODREF, XEXNREF, & ZPABST, XTHT,XRT,XSIGS,VSIGQSAT,XMFCONV,XTHM,XRCM, & @@ -2151,16 +2170,14 @@ IF (LFLYER) THEN ALLOCATE(ZSEA(IIU,IJU)) ZSEA(:,:) = 0. CALL MNHGET_SURF_PARAM_n (PSEA=ZSEA(:,:)) - CALL AIRCRAFT_BALLOON(XTSTEP, & - XXHAT, XYHAT, XZZ, XMAP, XLONORI, XLATORI, & - XUT, XVT, XWT, XPABST, XTHT, XRT, XSVT, XTKET, XTSRAD, & - XRHODREF,XCIT,PSEA=ZSEA(:,:)) + CALL AIRCRAFT_BALLOON( XTSTEP, XZZ, XMAP, XLONORI, XLATORI, & + XUT, XVT, XWT, XPABST, XTHT, XRT, XSVT, XTKET, XTSRAD, & + XRHODREF, XCIT, PSEA = ZSEA(:,:) ) DEALLOCATE(ZSEA) ELSE - CALL AIRCRAFT_BALLOON(XTSTEP, & - XXHAT, XYHAT, XZZ, XMAP, XLONORI, XLATORI, & - XUT, XVT, XWT, XPABST, XTHT, XRT, XSVT, XTKET, XTSRAD, & - XRHODREF,XCIT) + CALL AIRCRAFT_BALLOON( XTSTEP, XZZ, XMAP, XLONORI, XLATORI, & + XUT, XVT, XWT, XPABST, XTHT, XRT, XSVT, XTKET, XTSRAD, & + XRHODREF, XCIT ) END IF END IF @@ -2169,10 +2186,8 @@ END IF !* 24.2 STATION (observation diagnostic) ! -------------------------------- ! -IF (LSTATION) & - CALL STATION_n(XTSTEP, & - XXHAT, XYHAT, XZZ, & - XUT, XVT, XWT, XTHT, XRT, XSVT, XTKET, XTSRAD, XPABST ) +IF ( LSTATION ) & + CALL STATION_n( XZZ, XUT, XVT, XWT, XTHT, XRT, XSVT, XTKET, XTSRAD, XPABST ) ! !--------------------------------------------------------- ! @@ -2184,16 +2199,14 @@ IF (LPROFILER) THEN ALLOCATE(ZSEA(IIU,IJU)) ZSEA(:,:) = 0. CALL MNHGET_SURF_PARAM_n (PSEA=ZSEA(:,:)) - CALL PROFILER_n(XTSTEP, & - XXHAT, XYHAT, XZZ,XRHODREF, & - XUT, XVT, XWT, XTHT, XRT, XSVT, XTKET, XTSRAD, XPABST, & - XAER, MAX(XCLDFR,XICEFR), XCIT,PSEA=ZSEA(:,:)) + CALL PROFILER_n( XZZ, XRHODREF, & + XUT, XVT, XWT, XTHT, XRT, XSVT, XTKET, & + XTSRAD, XPABST, XAER, XCIT, PSEA=ZSEA(:,:) ) DEALLOCATE(ZSEA) ELSE - CALL PROFILER_n(XTSTEP, & - XXHAT, XYHAT, XZZ,XRHODREF, & - XUT, XVT, XWT, XTHT, XRT, XSVT, XTKET, XTSRAD, XPABST, & - XAER, MAX(XCLDFR,XICEFR), XCIT) + CALL PROFILER_n( XZZ, XRHODREF, & + XUT, XVT, XWT, XTHT, XRT, XSVT, XTKET, & + XTSRAD, XPABST, XAER, XCIT ) END IF END IF ! @@ -2230,15 +2243,6 @@ XT_STEP_BUD = XT_STEP_BUD + ZTIME2 - ZTIME1 + XTIME_BU ! !------------------------------------------------------------------------------- ! -!* 26. FM FILE CLOSURE -! --------------- -! -IF ( tzbakfile%lopened ) THEN - CALL IO_File_close(TZBAKFILE) -END IF -! -!------------------------------------------------------------------------------- -! !* 27. CURRENT TIME REFRESH ! -------------------- ! @@ -2270,6 +2274,8 @@ IF (OEXIT) THEN CALL MENU_DIACHRO(TDIAFILE,'END') #endif CALL IO_File_close(TDIAFILE) + ! Free memory of flyer that is not present on the master process of the file (was allocated in WRITE_AIRCRAFT_BALLOON) + CALL AIRCRAFT_BALLOON_FREE_NONLOCAL( TDIAFILE ) END IF ! CALL IO_File_close(TINIFILE) diff --git a/src/MNH/modn_aircrafts.f90 b/src/MNH/modn_aircrafts.f90 new file mode 100644 index 0000000000000000000000000000000000000000..f4309dfc793e1387355328bb6af8844ef64066e1 --- /dev/null +++ b/src/MNH/modn_aircrafts.f90 @@ -0,0 +1,69 @@ +!MNH_LIC Copyright 2022-2022 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. +!----------------------------------------------------------------- +! Author: P. Wautelet 19/08/2022 +! Modifications: +!----------------------------------------------------------------- +!#################### +MODULE MODN_AIRCRAFTS +!#################### +! +! Namelist with the the characteristics of the aircrafts +! +USE MODD_AIRCRAFT_BALLOON +USE MODD_PARAMETERS, ONLY: NFILENAMELGTMAX +USE MODD_TYPE_DATE, ONLY: DATE_TIME + +IMPLICIT NONE + +!Use separated arrays for the different aircraft characteristics +!Using directly TAIRCRAFTDATA derived types does not work due to compiler bug (GCC at least from 5.5 to 12.1, see GCC bug 106065) + +CHARACTER(LEN=3), DIMENSION(:), ALLOCATABLE :: CMODEL +INTEGER, DIMENSION(:), ALLOCATABLE :: NMODEL +CHARACTER(LEN=6), DIMENSION(:), ALLOCATABLE :: CTYPE +CHARACTER(LEN=10), DIMENSION(:), ALLOCATABLE :: CTITLE +TYPE(DATE_TIME), DIMENSION(:), ALLOCATABLE :: TLAUNCH +REAL, DIMENSION(:), ALLOCATABLE :: XTSTEP +INTEGER, DIMENSION(:), ALLOCATABLE :: NPOS +LOGICAL, DIMENSION(:), ALLOCATABLE :: LALTDEF +CHARACTER(LEN=NFILENAMELGTMAX), DIMENSION(:), ALLOCATABLE :: CFILE !Names of CSV files with trajectory data + +!Do not read CTYPE, value is always forced to 'AIRCRA' +NAMELIST / NAM_AIRCRAFTS / CFILE, CMODEL, CTITLE, LALTDEF, NMODEL, NPOS, TLAUNCH, XTSTEP + +CONTAINS + +SUBROUTINE AIRCRAFTS_NML_ALLOCATE( KAIRCRAFTS ) + INTEGER, INTENT(IN) :: KAIRCRAFTS + + !Note: the default values are used/checked in ini_aircraft => be careful to ensure coherency + ALLOCATE( CMODEL (KAIRCRAFTS) ); CMODEL(:) = 'FIX' + ALLOCATE( CTITLE (KAIRCRAFTS) ); CTITLE(:) = '' + ALLOCATE( CTYPE (KAIRCRAFTS) ); CTYPE(:) = 'AIRCRA' + ALLOCATE( NMODEL (KAIRCRAFTS) ); NMODEL(:) = 0 + ALLOCATE( TLAUNCH(KAIRCRAFTS) ) + ALLOCATE( XTSTEP (KAIRCRAFTS) ); XTSTEP(:) = XNEGUNDEF + ALLOCATE( NPOS (KAIRCRAFTS) ); NPOS(:) = 0 + ALLOCATE( LALTDEF(KAIRCRAFTS) ); LALTDEF(:) = .FALSE. + ALLOCATE( CFILE (KAIRCRAFTS) ); CFILE(:) = '' +END SUBROUTINE AIRCRAFTS_NML_ALLOCATE + + +SUBROUTINE AIRCRAFTS_NML_DEALLOCATE( ) + !Deallocate namelist arrays + DEALLOCATE( CMODEL ) + DEALLOCATE( CTITLE ) + DEALLOCATE( CTYPE ) + DEALLOCATE( NMODEL ) + DEALLOCATE( TLAUNCH ) + DEALLOCATE( XTSTEP ) + DEALLOCATE( NPOS ) + DEALLOCATE( LALTDEF ) + DEALLOCATE( CFILE ) +END SUBROUTINE AIRCRAFTS_NML_DEALLOCATE + + +END MODULE MODN_AIRCRAFTS diff --git a/src/MNH/modn_balloons.f90 b/src/MNH/modn_balloons.f90 new file mode 100644 index 0000000000000000000000000000000000000000..f77356c88a006e722ae782e3e8b4330c86238a2a --- /dev/null +++ b/src/MNH/modn_balloons.f90 @@ -0,0 +1,93 @@ +!MNH_LIC Copyright 2022-2022 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. +!----------------------------------------------------------------- +! Author: P. Wautelet 13/07/2022 +! Modifications: +!----------------------------------------------------------------- +!################### +MODULE MODN_BALLOONS +!################### +! +! Namelist with the the characteristics of the balloons +! +USE MODD_AIRCRAFT_BALLOON +USE MODD_TYPE_DATE, ONLY: DATE_TIME + +IMPLICIT NONE + +!Use separated arrays for the different balloon characteristics +!Using directly TBALLOONDATA derived types does not work due to compiler bug (GCC at least from 5.5 to 12.1, see GCC bug 106065) + +CHARACTER(LEN=3), DIMENSION(:), ALLOCATABLE :: CMODEL +INTEGER, DIMENSION(:), ALLOCATABLE :: NMODEL +CHARACTER(LEN=6), DIMENSION(:), ALLOCATABLE :: CTYPE +CHARACTER(LEN=10), DIMENSION(:), ALLOCATABLE :: CTITLE +TYPE(DATE_TIME), DIMENSION(:), ALLOCATABLE :: TLAUNCH +REAL, DIMENSION(:), ALLOCATABLE :: XLATLAUNCH +REAL, DIMENSION(:), ALLOCATABLE :: XLONLAUNCH +!Not needed: XXLAUNCH +!Not needed: XYLAUNCH +REAL, DIMENSION(:), ALLOCATABLE :: XALTLAUNCH +REAL, DIMENSION(:), ALLOCATABLE :: XTSTEP +REAL, DIMENSION(:), ALLOCATABLE :: XWASCENT +!Not used in NML (computed): REAL, DIMENSION(:), ALLOCATABLE :: XRHO +REAL, DIMENSION(:), ALLOCATABLE :: XPRES +REAL, DIMENSION(:), ALLOCATABLE :: XDIAMETER +REAL, DIMENSION(:), ALLOCATABLE :: XAERODRAG +REAL, DIMENSION(:), ALLOCATABLE :: XINDDRAG +REAL, DIMENSION(:), ALLOCATABLE :: XVOLUME +REAL, DIMENSION(:), ALLOCATABLE :: XMASS + +NAMELIST / NAM_BALLOONS / CMODEL, CTITLE, CTYPE, NMODEL, TLAUNCH, & + XLATLAUNCH, XLONLAUNCH, XALTLAUNCH, XTSTEP, XWASCENT, XPRES, & + XDIAMETER, XAERODRAG, XINDDRAG, XVOLUME, XMASS + +CONTAINS + +SUBROUTINE BALLOONS_NML_ALLOCATE( KBALLOONS ) + INTEGER, INTENT(IN) :: KBALLOONS + + !Note: the default values are used/checked in ini_balloon => be careful to ensure coherency + ALLOCATE( CMODEL (KBALLOONS) ); CMODEL(:) = 'FIX' + ALLOCATE( CTITLE (KBALLOONS) ); CTITLE(:) = '' + ALLOCATE( CTYPE (KBALLOONS) ); CTYPE(:) = '' + ALLOCATE( NMODEL (KBALLOONS) ); NMODEL(:) = 0 + ALLOCATE( TLAUNCH(KBALLOONS) ) + ALLOCATE( XLATLAUNCH (KBALLOONS) ); XLATLAUNCH(:) = XUNDEF + ALLOCATE( XLONLAUNCH (KBALLOONS) ); XLONLAUNCH(:) = XUNDEF + ALLOCATE( XALTLAUNCH (KBALLOONS) ); XALTLAUNCH(:) = XNEGUNDEF + ALLOCATE( XTSTEP (KBALLOONS) ); XTSTEP(:) = XNEGUNDEF + ALLOCATE( XWASCENT (KBALLOONS) ); XWASCENT(:) = XNEGUNDEF + ALLOCATE( XPRES (KBALLOONS) ); XPRES(:) = XNEGUNDEF + ALLOCATE( XDIAMETER (KBALLOONS) ); XDIAMETER(:) = XNEGUNDEF + ALLOCATE( XAERODRAG (KBALLOONS) ); XAERODRAG(:) = XNEGUNDEF + ALLOCATE( XINDDRAG (KBALLOONS) ); XINDDRAG(:) = XNEGUNDEF + ALLOCATE( XVOLUME (KBALLOONS) ); XVOLUME(:) = XNEGUNDEF + ALLOCATE( XMASS (KBALLOONS) ); XMASS(:) = XNEGUNDEF +END SUBROUTINE BALLOONS_NML_ALLOCATE + + +SUBROUTINE BALLOONS_NML_DEALLOCATE( ) + !Deallocate namelist arrays + DEALLOCATE( CMODEL ) + DEALLOCATE( CTITLE ) + DEALLOCATE( CTYPE ) + DEALLOCATE( NMODEL ) + DEALLOCATE( TLAUNCH ) + DEALLOCATE( XLATLAUNCH ) + DEALLOCATE( XLONLAUNCH ) + DEALLOCATE( XALTLAUNCH ) + DEALLOCATE( XTSTEP ) + DEALLOCATE( XWASCENT ) + DEALLOCATE( XPRES ) + DEALLOCATE( XDIAMETER ) + DEALLOCATE( XAERODRAG ) + DEALLOCATE( XINDDRAG ) + DEALLOCATE( XVOLUME ) + DEALLOCATE( XMASS ) +END SUBROUTINE BALLOONS_NML_DEALLOCATE + + +END MODULE MODN_BALLOONS diff --git a/src/MNH/modn_flyers.f90 b/src/MNH/modn_flyers.f90 new file mode 100644 index 0000000000000000000000000000000000000000..0c8b6e3e2e3fc054affceee3e872dcf618953495 --- /dev/null +++ b/src/MNH/modn_flyers.f90 @@ -0,0 +1,21 @@ +!MNH_LIC Copyright 2022-2022 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. +!----------------------------------------------------------------- +! Author: P. Wautelet 13/07/2022 +! Modifications: +!----------------------------------------------------------------- +!################# +MODULE MODN_FLYERS +!################# +! +! Namelist to prepare the aircrafts and balloon namelists (dynamic allocation) +! +USE MODD_AIRCRAFT_BALLOON, ONLY: NAIRCRAFTS, NBALLOONS + +IMPLICIT NONE + +NAMELIST / NAM_FLYERS / NAIRCRAFTS, NBALLOONS + +END MODULE MODN_FLYERS diff --git a/src/MNH/modn_profilern.f90 b/src/MNH/modn_profilern.f90 new file mode 100644 index 0000000000000000000000000000000000000000..d050fddcf48abb54547f69c42a1180a4321397ee --- /dev/null +++ b/src/MNH/modn_profilern.f90 @@ -0,0 +1,91 @@ +!MNH_LIC Copyright 2020-2022 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 MODN_PROFILER_n +!! ##################### +!! +!!*** *MODN_PROFILER* +!! +!! PURPOSE +!! ------- +! Namelist to define the stations +!! +!!** AUTHOR +!! ------ +!! E. Jézéquel *CNRM & IFPEN* +! +!! MODIFICATIONS +!! ------------- +!! Original 10/03/20 +! P. Wautelet 04/2022: restructure stations for better performance, reduce memory usage and correct some problems/bugs +! P. Wautelet 27/07/2022: copied from modn_stationn.f90 +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +USE MODD_ALLPROFILER_n, ONLY:& + NNUMB_PROF_n =>NNUMB_PROF ,& + XSTEP_PROF_n =>XSTEP_PROF ,& + XX_PROF_n =>XX_PROF ,& + XY_PROF_n =>XY_PROF ,& + XLAT_PROF_n =>XLAT_PROF ,& + XLON_PROF_n =>XLON_PROF ,& + XZ_PROF_n =>XZ_PROF ,& + CNAME_PROF_n =>CNAME_PROF ,& + CFILE_PROF_n =>CFILE_PROF !,& +! LDIAG_SURFRAD_n =>LDIAG_SURFRAD +USE MODD_PARAMETERS, ONLY: NFILENAMELGTMAX, NSTATPROFNAMELGTMAX +! +!----------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ----------------- + +IMPLICIT NONE + +INTEGER ,SAVE:: NNUMB_PROF +REAL ,SAVE:: XSTEP_PROF +REAL, DIMENSION(100) ,SAVE:: XX_PROF, XY_PROF, XZ_PROF, XLAT_PROF, XLON_PROF +CHARACTER (LEN=NSTATPROFNAMELGTMAX), DIMENSION(100),SAVE:: CNAME_PROF +CHARACTER (LEN=NFILENAMELGTMAX), SAVE:: CFILE_PROF !filename +! LOGICAL ,SAVE:: LDIAG_SURFRAD + +NAMELIST /NAM_PROFILERn/ & + NNUMB_PROF, XSTEP_PROF, & + XX_PROF,XY_PROF,XZ_PROF,& + XLON_PROF,XLAT_PROF,& + CNAME_PROF,& + CFILE_PROF !,LDIAG_SURFRAD + +! +CONTAINS +! +SUBROUTINE INIT_NAM_PROFILERn + NNUMB_PROF = NNUMB_PROF_n + XSTEP_PROF = XSTEP_PROF_n + XX_PROF = XX_PROF_n + XY_PROF = XY_PROF_n + XLAT_PROF = XLAT_PROF_n + XLON_PROF = XLON_PROF_n + XZ_PROF = XZ_PROF_n + CNAME_PROF = CNAME_PROF_n + CFILE_PROF = CFILE_PROF_n +! LDIAG_SURFRAD= LDIAG_SURFRAD_n +END SUBROUTINE INIT_NAM_PROFILERn + +SUBROUTINE UPDATE_NAM_PROFILERn + NNUMB_PROF_n = NNUMB_PROF + XSTEP_PROF_n = XSTEP_PROF + XX_PROF_n = XX_PROF + XY_PROF_n = XY_PROF + XLAT_PROF_n = XLAT_PROF + XLON_PROF_n = XLON_PROF + XZ_PROF_n = XZ_PROF + CNAME_PROF_n = CNAME_PROF + CFILE_PROF_n = CFILE_PROF +! LDIAG_SURFRAD_n= LDIAG_SURFRAD +END SUBROUTINE UPDATE_NAM_PROFILERn +END MODULE MODN_PROFILER_n diff --git a/src/MNH/modn_stationn.f90 b/src/MNH/modn_stationn.f90 index f388061e72fd7fc36bf3abc91db723843803f80d..094b3dbb1c5325f2a8264a316a211ad131e7997f 100644 --- a/src/MNH/modn_stationn.f90 +++ b/src/MNH/modn_stationn.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2020-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2020-2022 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. @@ -21,10 +21,10 @@ !! MODIFICATIONS !! ------------- !! Original 10/03/20 +! P. Wautelet 04/2022: restructure stations for better performance, reduce memory usage and correct some problems/bugs !! !! IMPLICIT ARGUMENTS !! ------------------ -USE MODD_STATION_n USE MODD_ALLSTATION_n, ONLY:& NNUMB_STAT_n =>NNUMB_STAT ,& XSTEP_STAT_n =>XSTEP_STAT ,& @@ -34,27 +34,29 @@ USE MODD_ALLSTATION_n, ONLY:& XLON_STAT_n =>XLON_STAT ,& XZ_STAT_n =>XZ_STAT ,& CNAME_STAT_n =>CNAME_STAT ,& - CTYPE_STAT_n =>CTYPE_STAT ,& CFILE_STAT_n =>CFILE_STAT ,& - LDIAG_SURFRAD_n =>LDIAG_SURFRAD -!! + LDIAG_SURFRAD_n =>LDIAG_SURFRAD +USE MODD_PARAMETERS, ONLY: NFILENAMELGTMAX, NSTATPROFNAMELGTMAX +! !----------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ----------------- + IMPLICIT NONE + INTEGER ,SAVE:: NNUMB_STAT REAL ,SAVE:: XSTEP_STAT REAL, DIMENSION(100) ,SAVE:: XX_STAT, XY_STAT, XZ_STAT, XLAT_STAT, XLON_STAT -CHARACTER (LEN=7), DIMENSION(100),SAVE:: CNAME_STAT, CTYPE_STAT -CHARACTER (LEN=20) ,SAVE:: CFILE_STAT !filename +CHARACTER (LEN=NSTATPROFNAMELGTMAX), DIMENSION(100),SAVE:: CNAME_STAT +CHARACTER (LEN=NFILENAMELGTMAX), SAVE:: CFILE_STAT !filename LOGICAL ,SAVE:: LDIAG_SURFRAD NAMELIST /NAM_STATIONn/ & NNUMB_STAT, XSTEP_STAT, & XX_STAT,XY_STAT,XZ_STAT,& XLON_STAT,XLAT_STAT,& - CNAME_STAT,CTYPE_STAT,& + CNAME_STAT,& CFILE_STAT,LDIAG_SURFRAD ! @@ -69,7 +71,6 @@ SUBROUTINE INIT_NAM_STATIONn XLON_STAT = XLON_STAT_n XZ_STAT = XZ_STAT_n CNAME_STAT = CNAME_STAT_n - CTYPE_STAT = CTYPE_STAT_n CFILE_STAT = CFILE_STAT_n LDIAG_SURFRAD= LDIAG_SURFRAD_n END SUBROUTINE INIT_NAM_STATIONn @@ -83,7 +84,6 @@ SUBROUTINE UPDATE_NAM_STATIONn XLON_STAT_n = XLON_STAT XZ_STAT_n = XZ_STAT CNAME_STAT_n = CNAME_STAT - CTYPE_STAT_n = CTYPE_STAT CFILE_STAT_n = CFILE_STAT LDIAG_SURFRAD_n= LDIAG_SURFRAD END SUBROUTINE UPDATE_NAM_STATIONn diff --git a/src/MNH/one_wayn.f90 b/src/MNH/one_wayn.f90 index eac7238d63ed4e9ee1b641155964a222bdc1273e..aa78ac7811a3b9a60b93f245969f9da744894efe 100644 --- a/src/MNH/one_wayn.f90 +++ b/src/MNH/one_wayn.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1996-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1996-2022 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. @@ -137,7 +137,9 @@ USE MODD_NSV, only: NSV_A, NSV_C1R3BEG_A, NSV_C1R3_A, NSV_C2R2BEG_A, NSV_PPBEG_A, NSV_PP_A, & NSV_SLTBEG_A, NSV_SLT_A, NSV_USER_A, & NSV_AERBEG_A, NSV_AER_A, NSV_CSBEG_A, NSV_CS_A - +#ifdef MNH_FOREFIRE +USE MODD_NSV, only: NSV_FF_A, NSV_FFBEG_A +#endif USE MODD_PARAMETERS, only: JPHEXT, JPVEXT USE MODD_PARAM_n, only: CCLOUD USE MODD_REF, ONLY: LCOUPLES diff --git a/src/MNH/paspol.f90 b/src/MNH/paspol.f90 index b3043a864dd8f4d66b9f7bae9e3d5d3ded8f1a1a..af5da06658860e8f4f327f6f0e2052e4821546ce 100644 --- a/src/MNH/paspol.f90 +++ b/src/MNH/paspol.f90 @@ -69,7 +69,7 @@ END MODULE MODI_PASPOL USE MODD_PARAMETERS USE MODD_NSV USE MODD_CST -use modd_field, only: tfielddata, TYPEREAL +use modd_field, only: tfieldmetadata, TYPEREAL USE MODD_IO, ONLY: TFILEDATA USE MODE_GRIDPROJ USE MODD_PASPOL @@ -141,10 +141,10 @@ REAL :: ZP, ZTH, ZT, ZRHO, ZMASAIR !INTEGER :: J4PTI,J4PTJ,J9PTI,J9PTJ ! REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRHOM ! -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTEMPO, ZSVT ! Work arrays +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZSVT ! Work arrays ! -TYPE(DATE_TIME) :: TZDATE1,TZDATE2,TZDATE3,TZDATE4,TZDATE -TYPE(TFIELDDATA) :: TZFIELD +TYPE(DATE_TIME) :: TZDATE1,TZDATE2,TZDATE3,TZDATE4,TZDATE +TYPE(TFIELDMetaDATA) :: TZFIELD ! ! !-------------------------------------------------------------------------------------- @@ -579,27 +579,23 @@ END DO !* 3.4 Ecriture conditionnelle. ! IF ( tpfile%lopened ) THEN - ALLOCATE( ZTEMPO(IIU,IJU,IKU) ) - ! - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'm-3' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'generic for paspol', & !Temporary name to ease identification + CSTDNAME = '', & + CUNITS = 'm-3', & + CDIR = 'XY', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ! DO JSV=1,NSV_PP - ZTEMPO(:,:,:)=XATC(:,:,:,JSV) - ! WRITE(TZFIELD%CMNHNAME,'(A3,I3.3)')'ATC',JSV+NSV_PPBEG-1 TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','ATC',JSV+NSV_PPBEG-1 ! - CALL IO_Field_write(TPFILE,TZFIELD,ZTEMPO) + CALL IO_Field_write(TPFILE,TZFIELD,XATC(:,:,:,JSV)) END DO - ! - DEALLOCATE(ZTEMPO) ENDIF ! DEALLOCATE(ZRHOM, ZSVT) diff --git a/src/MNH/phys_paramn.f90 b/src/MNH/phys_paramn.f90 index c01f484c51e41dbe8029d077e254174719206c58..e94400bedbdec4ccb3e551a056dcb944ed15e1f5 100644 --- a/src/MNH/phys_paramn.f90 +++ b/src/MNH/phys_paramn.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1995-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1995-2022 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. @@ -237,13 +237,15 @@ END MODULE MODI_PHYS_PARAM_n ! C. Lac 11/2019: correction in the drag formula and application to building in addition to tree ! F. Auguste 02/2021: add IBM ! JL Redelsperger 03/2021: add the SW flux penetration for Ocean model case +! P. Wautelet 30/11/2022: compute XTHW_FLUX, XRCW_FLUX and XSVW_FLUX only when needed ! A. Costes 12/2021: add Blaze fire model !!------------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ ! -USE MODD_ADV_n, ONLY : XRTKEMS +USE MODD_ADV_n, ONLY : XRTKEMS +USE MODD_AIRCRAFT_BALLOON, ONLY: LFLYER USE MODD_ARGSLIST_ll, ONLY : LIST_ll USE MODD_BLOWSNOW, ONLY : LBLOWSNOW,XRSNOW USE MODD_BUDGET, ONLY: NBUDGET_TH, NBUDGET_RV, NBUDGET_RC, NBUDGET_RI, NBUDGET_SV1, & @@ -807,9 +809,9 @@ CALL SUNPOS_n ( XZENITH, ZCOSZEN, ZSINZEN, ZAZIMSOL ) ! ZTIME1 = ZTIME2 ! - CALL SURF_RAD_MODIF (XMAP, XXHAT, XYHAT, & - ZCOSZEN, ZSINZEN, ZAZIMSOL, XZS, XZS_XY, & - XDIRFLASWD, XDIRSRFSWD ) + CALL SURF_RAD_MODIF (XMAP, XDXHAT, XDYHAT, XXHATM, XYHATM, & + ZCOSZEN, ZSINZEN, ZAZIMSOL, XZS, XZS_XY, & + XDIRFLASWD, XDIRSRFSWD ) ! !* Azimuthal angle to be sent later to surface processes ! Defined in radian, clockwise, from North @@ -1510,25 +1512,25 @@ IF ( CTURB == 'TKEL' ) THEN END IF ! ! -IF(ALLOCATED(XTHW_FLUX)) THEN - DEALLOCATE(XTHW_FLUX) - ALLOCATE(XTHW_FLUX(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3))) +IF ( ALLOCATED( XTHW_FLUX ) ) DEALLOCATE( XTHW_FLUX ) +IF ( LFLYER ) THEN + ALLOCATE( XTHW_FLUX(SIZE( XTHT, 1 ), SIZE( XTHT, 2 ), SIZE( XTHT, 3 )) ) ELSE - ALLOCATE(XTHW_FLUX(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3))) + ALLOCATE( XTHW_FLUX(0, 0, 0) ) END IF -IF(ALLOCATED(XRCW_FLUX)) THEN - DEALLOCATE(XRCW_FLUX) - ALLOCATE(XRCW_FLUX(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3))) +IF ( ALLOCATED( XRCW_FLUX ) ) DEALLOCATE( XRCW_FLUX ) +IF ( LFLYER ) THEN + ALLOCATE( XRCW_FLUX(SIZE( XTHT, 1 ), SIZE( XTHT, 2 ), SIZE( XTHT, 3 )) ) ELSE - ALLOCATE(XRCW_FLUX(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3))) + ALLOCATE( XRCW_FLUX(0, 0, 0) ) END IF -! -IF(ALLOCATED(XSVW_FLUX)) THEN - DEALLOCATE(XSVW_FLUX) - ALLOCATE(XSVW_FLUX(SIZE(XSVT,1),SIZE(XSVT,2),SIZE(XSVT,3),SIZE(XSVT,4))) + +IF ( ALLOCATED( XSVW_FLUX ) ) DEALLOCATE( XSVW_FLUX ) +IF ( LFLYER ) THEN + ALLOCATE( XSVW_FLUX(SIZE( XSVT, 1 ), SIZE( XSVT, 2 ), SIZE( XSVT, 3 ), SIZE( XSVT, 4 )) ) ELSE - ALLOCATE(XSVW_FLUX(SIZE(XSVT,1),SIZE(XSVT,2),SIZE(XSVT,3),SIZE(XSVT,4))) + ALLOCATE( XSVW_FLUX(0, 0, 0, 0) ) END IF ! GCOMPUTE_SRC=SIZE(XSIGS, 3)/=0 diff --git a/src/MNH/position_tools.f90 b/src/MNH/position_tools.f90 new file mode 100644 index 0000000000000000000000000000000000000000..2fb03e7d5ce4366b0d794f72ddfd0a1b163cd085 --- /dev/null +++ b/src/MNH/position_tools.f90 @@ -0,0 +1,230 @@ +!MNH_LIC Copyright 2022-2022 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. +!----------------------------------------------------------------- +! Author: +! P. Wautelet 25/11/2022 +! Modifications: +!----------------------------------------------------------------- +! ################### +MODULE MODE_POSITION_TOOLS +! ################### + +USE MODE_MSG + +IMPLICIT NONE + +PRIVATE + +PUBLIC :: FIND_PROCESS_AND_MODEL_FROM_XY_POS + +CONTAINS + +!---------------------------------------------------------------------------- +SUBROUTINE FIND_PROCESS_FROM_XY_POS( PX, PY, TPMODEL, KRANK, GINSIDE ) + ! Find the rank of the process with the given position + USE MODD_FIELD, ONLY: TFIELDLIST + USE MODD_IO, ONLY: ISNPROC + USE MODD_PARAMETERS, ONLY: NNEGUNDEF + USE MODD_STRUCTURE_ll, ONLY: PROCONF_ll + + USE MODE_FIELD, ONLY: FIND_FIELD_ID_FROM_MNHNAME + + IMPLICIT NONE + + REAL, INTENT(IN) :: PX + REAL, INTENT(IN) :: PY + TYPE(PROCONF_ll), INTENT(IN) :: TPMODEL + INTEGER, INTENT(OUT) :: KRANK + LOGICAL, INTENT(OUT) :: GINSIDE + + INTEGER :: IID + INTEGER :: IRESP + INTEGER :: IXPOS + INTEGER :: IYPOS + INTEGER :: JP + REAL, DIMENSION(:), POINTER :: ZXHAT_ll + REAL, DIMENSION(:), POINTER :: ZYHAT_ll + + GINSIDE = .FALSE. + KRANK = NNEGUNDEF + + ZXHAT_ll => NULL() + ZYHAT_ll => NULL() + + call Find_field_id_from_mnhname( 'XHAT_ll', iid, iresp ) + ZXHAT_ll => tfieldlist(iid)%tfield_x1d(TPMODEL%NUMBER)%data + call Find_field_id_from_mnhname( 'YHAT_ll', iid, iresp ) + ZYHAT_ll => tfieldlist(iid)%tfield_x1d(TPMODEL%NUMBER)%data + + IXPOS = COUNT( ZXHAT_ll(:) <= PX ) + IYPOS = COUNT( ZYHAT_ll(:) <= PY ) + + DO JP = 1, ISNPROC + IF ( IXPOS >= TPMODEL%TSPLITS_B(JP)%NXORP .AND. IXPOS <= TPMODEL%TSPLITS_B(JP)%NXENDP & + .AND. IYPOS >= TPMODEL%TSPLITS_B(JP)%NYORP .AND. IYPOS <= TPMODEL%TSPLITS_B(JP)%NYENDP ) THEN + GINSIDE = .TRUE. + KRANK = JP + EXIT + END IF + END DO + +END SUBROUTINE FIND_PROCESS_FROM_XY_POS +!---------------------------------------------------------------------------- + +!---------------------------------------------------------------------------- +SUBROUTINE FIND_PROCESS_AND_MODEL_FROM_XY_POS( PX, PY, KRANK, KMODEL ) + ! Find the rank of the process with the given position + ! on the most refined model (except if model number is forced) + + USE MODD_IO, ONLY: ISNPROC + USE MODD_PARAMETERS, ONLY: NNEGUNDEF + USE MODD_STRUCTURE_ll, ONLY: PROCONF_ll + USE MODD_VAR_ll, ONLY: TCRRT_PROCONF + + IMPLICIT NONE + + REAL, INTENT(IN) :: PX + REAL, INTENT(IN) :: PY + INTEGER, INTENT(OUT) :: KRANK ! If < 1, position is outside domain(s) + INTEGER, INTENT(INOUT) :: KMODEL ! If > 0 at entry, model is fixed, else it is set by subroutine + + CHARACTER(LEN=3) :: YMODEL + LOGICAL :: GFOUND + LOGICAL :: OINSIDE + TYPE(PROCONF_ll), POINTER :: TZMODEL + + KRANK = NNEGUNDEF + + TZMODEL => TCRRT_PROCONF + + ! Go back to the root model + DO WHILE( ASSOCIATED( TZMODEL%TPARENT ) ) + TZMODEL => TZMODEL%TPARENT + END DO + + IF ( KMODEL > 0 ) THEN + ! Find the configuration corresponding to KMODEL + ! based on GO_TOMODEL_ll + + ! Find the model configuration + CALL FIND_MODEL( TZMODEL, KMODEL, GFOUND ) + + IF ( .NOT. GFOUND ) THEN + WRITE( YMODEL, '( I3 )' ) KMODEL + CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'FIND_PROCESS_AND_MODEL_FROM_XY_POS', 'model ' // YMODEL // ' not found' ) + END IF + + ! Find the rank of the process where the position is + CALL FIND_PROCESS_FROM_XY_POS( PX, PY, TZMODEL, KRANK, OINSIDE ) + ELSE + ! Model number is not fixed => find the finer model corresponding to the position + CALL FIND_FINER_MODEL_WITH_XY_POS( PX, PY, TZMODEL, KMODEL, KRANK, OINSIDE ) + END IF + +END SUBROUTINE FIND_PROCESS_AND_MODEL_FROM_XY_POS +!---------------------------------------------------------------------------- + + +!---------------------------------------------------------------------------- +RECURSIVE SUBROUTINE FIND_FINER_MODEL_WITH_XY_POS( PX, PY, TPMODEL, KMODEL, KRANK, OINSIDE ) + USE MODD_PARAMETERS, ONLY: NNEGUNDEF + USE MODD_STRUCTURE_ll, ONLY: LPROCONF_ll, PROCONF_ll + + IMPLICIT NONE + + REAL, INTENT(IN) :: PX + REAL, INTENT(IN) :: PY + TYPE(PROCONF_ll), POINTER, INTENT(INOUT) :: TPMODEL + INTEGER, INTENT(INOUT) :: KMODEL + INTEGER, INTENT(OUT) :: KRANK + LOGICAL, INTENT(OUT) :: OINSIDE + + INTEGER :: IRANK + LOGICAL :: GINSIDE + TYPE(PROCONF_ll), POINTER :: TZCHILD + TYPE(LPROCONF_ll), POINTER :: TZMODELS + + IRANK = NNEGUNDEF + GINSIDE = .FALSE. + + CALL FIND_PROCESS_FROM_XY_POS( PX, PY, TPMODEL, IRANK, GINSIDE ) + IF ( GINSIDE ) THEN + KMODEL = TPMODEL%NUMBER + KRANK = IRANK + END IF + OINSIDE = GINSIDE + + IF ( .NOT. GINSIDE ) RETURN + + !If the coordinates are inside the current model, look at its children + TZMODELS => TPMODEL%TCHILDREN + DO WHILE(ASSOCIATED(TZMODELS)) + TZCHILD => TZMODELS%TELT + + CALL FIND_FINER_MODEL_WITH_XY_POS( PX, PY, TZCHILD, KMODEL, IRANK, GINSIDE ) + + IF ( .NOT. GINSIDE ) THEN + TZMODELS => TZMODELS%TNEXT + ELSE + TPMODEL => TZCHILD + KMODEL = TPMODEL%NUMBER + KRANK = IRANK + OINSIDE = GINSIDE + RETURN + END IF + END DO + +END SUBROUTINE FIND_FINER_MODEL_WITH_XY_POS +!---------------------------------------------------------------------------- + + +!---------------------------------------------------------------------------- +RECURSIVE SUBROUTINE FIND_MODEL( TPMODEL, KMODEL, OFOUND ) + USE MODD_STRUCTURE_ll, ONLY: LPROCONF_ll, PROCONF_ll + + IMPLICIT NONE + + TYPE(PROCONF_ll), POINTER, INTENT(INOUT) :: TPMODEL + INTEGER, INTENT(IN) :: KMODEL + LOGICAL, INTENT(OUT) :: OFOUND + + TYPE(PROCONF_ll), POINTER :: TZCHILD + TYPE(LPROCONF_ll), POINTER :: TZMODELS + + OFOUND = .FALSE. + + ! Is the current model the searched one? + IF (TPMODEL%NUMBER == KMODEL) THEN + OFOUND = .TRUE. + RETURN + ENDIF + + ! no => explore all the children model of the current model + TZMODELS => TPMODEL%TCHILDREN + DO WHILE(ASSOCIATED(TZMODELS)) + + IF (TZMODELS%TELT%NUMBER == KMODEL) THEN + OFOUND = .TRUE. + TPMODEL => TZMODELS%TELT + RETURN + END IF + + TZCHILD => TZMODELS%TELT + + CALL FIND_MODEL( TZCHILD, KMODEL, OFOUND ) + + IF ( .NOT. OFOUND ) THEN + TZMODELS => TZMODELS%TNEXT + ELSE + TPMODEL => TZCHILD + RETURN + END IF + + END DO + +END SUBROUTINE FIND_MODEL +!---------------------------------------------------------------------------- + +END MODULE MODE_POSITION_TOOLS diff --git a/src/MNH/prep_ideal_case.f90 b/src/MNH/prep_ideal_case.f90 index ea749bd3cb1fbef2221e006a78929c3aa9675aa7..e83f7580a28ffb1e4a643493dbd323c6e28a870a 100644 --- a/src/MNH/prep_ideal_case.f90 +++ b/src/MNH/prep_ideal_case.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1994-2022 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. @@ -381,6 +381,7 @@ USE MODE_ll USE MODE_MODELN_HANDLER use mode_field, only: Alloc_field_scalars, Ini_field_list, Ini_field_scalars USE MODE_MSG +USE MODE_SET_GRID, only: INTERP_HORGRID_TO_MASSPOINTS, STORE_GLOB_HORGRID ! USE MODI_DEFAULT_DESFM_n ! Interface modules USE MODI_DEFAULT_EXPRE @@ -556,7 +557,6 @@ INTEGER :: IISIZEX4,IJSIZEX4,IISIZEX2,IJSIZEX2 ! West-east LB arrays INTEGER :: IISIZEYF,IJSIZEYF,IISIZEYFV,IJSIZEYFV ! dimensions of the INTEGER :: IISIZEY4,IJSIZEY4,IISIZEY2,IJSIZEY2 ! North-south LB arrays INTEGER :: IBEG,IEND,IXOR,IXDIM,IYOR,IYDIM,ILBX,ILBY -REAL, DIMENSION(:), ALLOCATABLE :: ZXHAT_ll, ZYHAT_ll ! REAL, DIMENSION(:,:,:), ALLOCATABLE ::ZTHL,ZT,ZRT,ZFRAC_ICE,& ZEXN,ZLVOCPEXN,ZLSOCPEXN,ZCPH, & @@ -719,7 +719,7 @@ IF (GFOUND) READ(UNIT=NLUPRE,NML=NAM_AERO_PRE) CALL POSNAM(NLUPRE,'NAM_IBM_LSF' ,GFOUND,NLUOUT) IF (GFOUND) READ(UNIT=NLUPRE,NML=NAM_IBM_LSF ) ! -CALL INI_FIELD_LIST(1) +CALL INI_FIELD_LIST() ! CALL INI_FIELD_SCALARS() ! Sea salt @@ -1248,7 +1248,8 @@ ELSE ! the MESONH horizontal grid is built from the PRE_IDEA1.nam informations !------------------------------------------------------------------------ ! - ALLOCATE(XXHAT(NIU),XYHAT(NJU)) + ALLOCATE( XXHAT(NIU), XYHAT(NJU) ) + ALLOCATE( XXHATM(NIU), XYHATM(NJU) ) ! ! define the grid localization at the earth surface by the central point ! coordinates @@ -1261,14 +1262,10 @@ ELSE ! conformal coordinates (0,0). This is to allow the centering of the model in ! a non-cyclic configuration regarding to XLATCEN or XLONCEN. ! - ALLOCATE(ZXHAT_ll(NIMAX_ll+2*JPHEXT),ZYHAT_ll(NJMAX_ll+2*JPHEXT)) - ZXHAT_ll=0. - ZYHAT_ll=0. CALL SM_LATLON(XLATCEN,XLONCEN, & -XDELTAX*(NIMAX_ll/2-0.5+JPHEXT), & -XDELTAY*(NJMAX_ll/2-0.5+JPHEXT), & XLATORI,XLONORI) - DEALLOCATE(ZXHAT_ll,ZYHAT_ll) ! WRITE(NLUOUT,FMT=*) 'PREP_IDEAL_CASE : XLATORI=' , XLATORI, & ' XLONORI= ', XLONORI @@ -1292,6 +1289,13 @@ ELSE XXHAT(:) = (/ (REAL(JLOOP-NIB)*XDELTAX, JLOOP=1,NIU) /) XYHAT(:) = (/ (REAL(JLOOP-NJB)*XDELTAY, JLOOP=1,NJU) /) END IF + + ! Interpolations of positions to mass points + CALL INTERP_HORGRID_TO_MASSPOINTS( XXHAT, XYHAT, XXHATM, XYHATM ) + + ! Collect global domain boundaries + CALL STORE_GLOB_HORGRID( XXHAT, XYHAT, XXHATM, XYHATM, XXHAT_ll, XYHAT_ll, XXHATM_ll, XYHATM_ll, XHAT_BOUND, XHATM_BOUND ) + END IF ! !* 5.1.2 Orography and Gal-Chen Sommerville transformation : @@ -1434,8 +1438,9 @@ IF (LCARTESIAN) THEN CALL SM_GRIDCART(XXHAT,XYHAT,XZHAT,XZS,LSLEVE,XLEN1,XLEN2,XZSMT,XDXHAT,XDYHAT,XZZ,XJ) XMAP=1. ELSE - CALL SM_GRIDPROJ(XXHAT,XYHAT,XZHAT,XZS,LSLEVE,XLEN1,XLEN2,XZSMT,XLATORI,XLONORI, & - XMAP,XLAT,XLON,XDXHAT,XDYHAT,XZZ,XJ) + CALL SM_GRIDPROJ( XXHAT, XYHAT, XZHAT, XXHATM, XYHATM, XZS, & + LSLEVE, XLEN1, XLEN2, XZSMT, XLATORI, XLONORI, & + XMAP, XLAT, XLON, XDXHAT, XDYHAT, XZZ, XJ ) END IF !* 5.4.1 metrics coefficients and update halos: ! @@ -1458,12 +1463,9 @@ IF (CTYPELOC =='LATLON' ) THEN END IF END IF ! -ALLOCATE(ZXHAT_ll(NIMAX_ll+ 2 * JPHEXT),ZYHAT_ll(NJMAX_ll+2 * JPHEXT)) -CALL GATHERALL_FIELD_ll('XX',XXHAT,ZXHAT_ll,NRESP) !// -CALL GATHERALL_FIELD_ll('YY',XYHAT,ZYHAT_ll,NRESP) !// IF (CTYPELOC /= 'IJGRID') THEN - NILOC = MINLOC(ABS(XXHATLOC-ZXHAT_ll(:))) - NJLOC = MINLOC(ABS(XYHATLOC-ZYHAT_ll(:))) + NILOC = MINLOC(ABS(XXHATLOC-XXHAT_ll(:))) + NJLOC = MINLOC(ABS(XYHATLOC-XYHAT_ll(:))) END IF ! IF ( L1D .AND. ( NILOC(1) /= 1 .OR. NJLOC(1) /= 1 ) ) THEN @@ -1489,7 +1491,7 @@ IF (CIDEAL == 'RSOU') THEN WRITE(NLUOUT,FMT=*) 'CIDEAL="RSOU", attempt to read DATE' CALL POSKEY(NLUPRE,NLUOUT,'RSOU') READ(NLUPRE,FMT=*) NYEAR,NMONTH,NDAY,XTIME - TDTCUR = DATE_TIME(DATE(NYEAR,NMONTH,NDAY),XTIME) + TDTCUR = DATE_TIME(NYEAR,NMONTH,NDAY,XTIME) TDTEXP = TDTCUR TDTSEG = TDTCUR TDTMOD = TDTCUR @@ -1508,7 +1510,7 @@ ELSE IF (CIDEAL == 'CSTN') THEN WRITE(NLUOUT,FMT=*) 'CIDEAL="CSTN", attempt to read DATE' CALL POSKEY(NLUPRE,NLUOUT,'CSTN') READ(NLUPRE,FMT=*) NYEAR,NMONTH,NDAY,XTIME - TDTCUR = DATE_TIME(DATE(NYEAR,NMONTH,NDAY),XTIME) + TDTCUR = DATE_TIME(NYEAR,NMONTH,NDAY,XTIME) TDTEXP = TDTCUR TDTSEG = TDTCUR TDTMOD = TDTCUR @@ -1559,10 +1561,10 @@ CALL UPDATE_METRICS(CLBCX,CLBCY,XDXX,XDYY,XDZX,XDZY,XDZZ) ! !* 5.4.2 3D reference state : ! -CALL SET_REF(0,TFILE_DUMMY, & - XZZ,XZHAT,XJ,XDXX,XDYY,CLBCX,CLBCY, & - XREFMASS,XMASS_O_PHI0,XLINMASS, & - XRHODREF,XTHVREF,XRVREF,XEXNREF,XRHODJ) +CALL SET_REF( 0, TFILE_DUMMY, & + XZZ, XZHATM, XJ, XDXX, XDYY, CLBCX, CLBCY, & + XREFMASS, XMASS_O_PHI0, XLINMASS, & + XRHODREF, XTHVREF, XRVREF, XEXNREF, XRHODJ ) ! ! !* 5.5.1 Absolute pressure : diff --git a/src/MNH/prep_nest_pgd.f90 b/src/MNH/prep_nest_pgd.f90 index 80b493fbcd6bcd3d097efeb2ccc6380bbe6bef6e..e894cd407d2d529ae44e19b2e4145dc68dfa2580 100644 --- a/src/MNH/prep_nest_pgd.f90 +++ b/src/MNH/prep_nest_pgd.f90 @@ -199,7 +199,7 @@ CALL READ_ALL_NAMELISTS(YSURF_CUR,'MESONH','PRE',.FALSE.) !* 3. READING OF THE GRIDS ! -------------------- ! -CALL INI_FIELD_LIST(NMODEL) +CALL INI_FIELD_LIST() ! CALL SET_DAD0_ll() DO JPGD=1,NMODEL diff --git a/src/MNH/prep_pgd.f90 b/src/MNH/prep_pgd.f90 index 046ddde7822141fefa4743338cfcb32469bca981..2df254d5ec8aab95ee4ad9713ccf8e65fc7f4af4 100644 --- a/src/MNH/prep_pgd.f90 +++ b/src/MNH/prep_pgd.f90 @@ -217,7 +217,7 @@ CALL SURFEX_ALLOC_LIST(1) YSURF_CUR => YSURF_LIST(1) CALL READ_ALL_NAMELISTS(YSURF_CUR,'MESONH','PRE',.FALSE.) ! -CALL INI_FIELD_LIST(1) +CALL INI_FIELD_LIST() ! CALL GOTO_MODEL(1) CALL GOTO_SURFEX(1) diff --git a/src/MNH/prep_real_case.f90 b/src/MNH/prep_real_case.f90 index a13872ff80c2eec2e81a2a89a9d84f17eb31ce5b..9424fbb3549ab46d6df213c8b3d00c9dbe5fd09e 100644 --- a/src/MNH/prep_real_case.f90 +++ b/src/MNH/prep_real_case.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1995-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1995-2022 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. @@ -678,7 +678,7 @@ IF (GFOUND) READ(IPRE_REAL1,NAM_REAL_CONF) CALL POSNAM(IPRE_REAL1,'NAM_PARAM_LIMA',GFOUND,ILUOUT0) IF (GFOUND) READ(IPRE_REAL1,NAM_PARAM_LIMA) ! -CALL INI_FIELD_LIST(1) +CALL INI_FIELD_LIST() ! CALL INI_FIELD_SCALARS() ! @@ -928,9 +928,9 @@ IF (LCARTESIAN) THEN CALL SM_GRIDCART(XXHAT,XYHAT,XZHAT,XZS,LSLEVE,XLEN1,XLEN2,XZSMT,XDXHAT,XDYHAT,XZZ,ZJ) XMAP=1. ELSE - CALL SM_GRIDPROJ(XXHAT,XYHAT,XZHAT,XZS, & - LSLEVE,XLEN1,XLEN2,XZSMT,XLATORI,XLONORI, & - XMAP,XLAT,XLON,XDXHAT,XDYHAT,XZZ,ZJ ) + CALL SM_GRIDPROJ( XXHAT, XYHAT, XZHAT, XXHATM, XYHATM, XZS, & + LSLEVE, XLEN1, XLEN2, XZSMT, XLATORI, XLONORI, & + XMAP, XLAT, XLON, XDXHAT, XDYHAT, XZZ, ZJ ) END IF ! CALL MPPDB_CHECK2D(XZS,"prep_real_case8:XZS",PRECISION) diff --git a/src/MNH/prep_surfex.f90 b/src/MNH/prep_surfex.f90 index 68ec7b3a8779d70d45f174ab868a07192b9dc4c5..547f5b1bc96757a740126f0b8ba53b4ab623cbdd 100644 --- a/src/MNH/prep_surfex.f90 +++ b/src/MNH/prep_surfex.f90 @@ -131,7 +131,7 @@ CALL IO_File_close(TZPRE_REAL1FILE) ! !* 4.2 reading of values of some configuration variables in namelist ! -CALL INI_FIELD_LIST(1) +CALL INI_FIELD_LIST() ! CALL INI_FIELD_SCALARS() ! diff --git a/src/MNH/pressure_in_prep.f90 b/src/MNH/pressure_in_prep.f90 index 6219e352f27f06e8a418d8073fdd8aed4031802d..e5d004e09378e6d12cd12d1fe1db3f6aea8e3d53 100644 --- a/src/MNH/pressure_in_prep.f90 +++ b/src/MNH/pressure_in_prep.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1998-2020 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1998-2023 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. @@ -11,11 +11,11 @@ INTERFACE ! SUBROUTINE PRESSURE_IN_PREP(PDXX,PDYY,PDZX,PDZY,PDZZ) ! -REAL,DIMENSION(:,:,:), INTENT(IN) :: PDXX ! metric coefficient dxx -REAL,DIMENSION(:,:,:), INTENT(IN) :: PDYY ! metric coefficient dyy -REAL,DIMENSION(:,:,:), INTENT(IN) :: PDZX ! metric coefficient dzx -REAL,DIMENSION(:,:,:), INTENT(IN) :: PDZY ! metric coefficient dzy -REAL,DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz +REAL,DIMENSION(:,:,:), INTENT(IN) :: PDXX ! metric coefficient dxx +REAL,DIMENSION(:,:,:), INTENT(IN) :: PDYY ! metric coefficient dyy +REAL,DIMENSION(:,:,:), INTENT(INOUT) :: PDZX ! metric coefficient dzx +REAL,DIMENSION(:,:,:), INTENT(INOUT) :: PDZY ! metric coefficient dzy +REAL,DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz ! END SUBROUTINE PRESSURE_IN_PREP ! @@ -97,11 +97,11 @@ IMPLICIT NONE !* 0.1 Declaration of dummy arguments ! ------------------------------ ! -REAL,DIMENSION(:,:,:), INTENT(IN) :: PDXX ! metric coefficient dxx -REAL,DIMENSION(:,:,:), INTENT(IN) :: PDYY ! metric coefficient dyy -REAL,DIMENSION(:,:,:), INTENT(IN) :: PDZX ! metric coefficient dzx -REAL,DIMENSION(:,:,:), INTENT(IN) :: PDZY ! metric coefficient dzy -REAL,DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz +REAL,DIMENSION(:,:,:), INTENT(IN) :: PDXX ! metric coefficient dxx +REAL,DIMENSION(:,:,:), INTENT(IN) :: PDYY ! metric coefficient dyy +REAL,DIMENSION(:,:,:), INTENT(INOUT) :: PDZX ! metric coefficient dzx +REAL,DIMENSION(:,:,:), INTENT(INOUT) :: PDZY ! metric coefficient dzy +REAL,DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz ! !* 0.2 Declaration of local variables ! ------------------------------ diff --git a/src/MNH/pressurez.f90 b/src/MNH/pressurez.f90 index 1f597f1046fe54250debe75b86c1098f011be758..320351512acff82a0abd13499b91e94cb11c600a 100644 --- a/src/MNH/pressurez.f90 +++ b/src/MNH/pressurez.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1994-2023 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. @@ -39,7 +39,8 @@ REAL, INTENT(IN) :: PRELAX ! relaxation coefficient for REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! density of reference state ! * J ! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX,PDYY,PDZZ,PDZX,PDZY ! metric coefficients +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX,PDYY,PDZZ +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDZX,PDZY ! metric coefficients ! REAL, INTENT(IN) :: PDXHATM ! mean grid increment in the x ! direction @@ -281,7 +282,8 @@ REAL, INTENT(IN) :: PRELAX ! relaxation coefficient for REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! density of reference state ! * J ! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX,PDYY,PDZZ,PDZX,PDZY ! metric coefficients +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX,PDYY,PDZZ +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDZX,PDZY ! metric coefficients ! REAL, INTENT(IN) :: PDXHATM ! mean grid increment in the x ! direction diff --git a/src/MNH/profilern.f90 b/src/MNH/profilern.f90 index 1e307b9eaa5f86571552630438a476abab2cc7c7..0b8083a90ca0eccec04eb651ff5b41b7b3d77f83 100644 --- a/src/MNH/profilern.f90 +++ b/src/MNH/profilern.f90 @@ -9,29 +9,24 @@ MODULE MODI_PROFILER_n ! INTERFACE ! - SUBROUTINE PROFILER_n(PTSTEP, & - PXHAT, PYHAT, PZ,PRHODREF, & - PU, PV, PW, PTH, PR, PSV, PTKE, & - PTS, PP, PAER, PCLDFR, PCIT, PSEA) + SUBROUTINE PROFILER_n( PZ, PRHODREF, & + PU, PV, PW, PTH, PR, PSV, PTKE, & + PTS, PP, PAER, PCIT, PSEA ) ! -REAL, INTENT(IN) :: PTSTEP ! time step -REAL, DIMENSION(:), INTENT(IN) :: PXHAT ! x coordinate -REAL, DIMENSION(:), INTENT(IN) :: PYHAT ! y coordinate REAL, DIMENSION(:,:,:), INTENT(IN) :: PZ ! z array REAL, DIMENSION(:,:,:), INTENT(IN) :: PU ! horizontal wind X component REAL, DIMENSION(:,:,:), INTENT(IN) :: PV ! horizontal wind Y component REAL, DIMENSION(:,:,:), INTENT(IN) :: PW ! vertical wind REAL, DIMENSION(:,:,:), INTENT(IN) :: PTH ! potential temperature -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PR ! water mixing ratios REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSV ! Scalar variables REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKE ! turbulent kinetic energy REAL, DIMENSION(:,:), INTENT(IN) :: PTS ! surface temperature REAL, DIMENSION(:,:,:), INTENT(IN) :: PP ! pressure REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PAER ! aerosol extinction -REAL, DIMENSION(:,:,:), INTENT(IN) :: PCLDFR ! cloud fraction REAL, DIMENSION(:,:,:), INTENT(IN) :: PCIT ! ice concentration -REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PSEA ! for radar +REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PSEA ! for radar ! !------------------------------------------------------------------------------- ! @@ -41,11 +36,10 @@ END INTERFACE ! END MODULE MODI_PROFILER_n ! -! ######################################################## - SUBROUTINE PROFILER_n(PTSTEP, & - PXHAT, PYHAT, PZ,PRHODREF, & - PU, PV, PW, PTH, PR, PSV, PTKE, & - PTS, PP, PAER, PCLDFR, PCIT, PSEA) +! ######################################################## + SUBROUTINE PROFILER_n( PZ, PRHODREF, & + PU, PV, PW, PTH, PR, PSV, PTKE, & + PTS, PP, PAER, PCIT, PSEA ) ! ######################################################## ! ! @@ -88,56 +82,52 @@ END MODULE MODI_PROFILER_n ! P. Wautelet 09/02/2022: add message when some variables not computed ! + bugfix: put values in variables in this case ! + move some operations outside a do loop +! P. Wautelet 04/2022: restructure profilers for better performance, reduce memory usage and correct some problems/bugs ! -------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ ! -USE MODD_CONF -USE MODD_CST +USE MODD_CST, ONLY: XCPD, XG, XLAM_CRAD, XLIGHTSPEED, XP00, XPI, XRD, XRHOLW, XRV, XTT USE MODD_DIAG_IN_RUN -USE MODD_GRID -USE MODD_SUB_PROFILER_n -USE MODD_NSV -USE MODD_PARAMETERS -USE MODD_PARAM_n, ONLY: CCLOUD, CRAD, CSURF +USE MODD_GRID, ONLY: XBETA, XLON0, XRPK +USE MODD_NSV, ONLY: NSV_C2R2, NSV_C2R2BEG, NSV_LIMA_NC, NSV_LIMA_NI, NSV_LIMA_NR +USE MODD_PARAMETERS, ONLY: JPVEXT, XUNDEF +USE MODD_PARAM_ICE, ONLY: LSNOW_T_I => LSNOW_T +USE MODD_PARAM_LIMA, ONLY: LSNOW_T_L => LSNOW_T, & + XALPHAR_L => XALPHAR, XNUR_L => XNUR, XALPHAS_L => XALPHAS, XNUS_L => XNUS, & + XALPHAG_L => XALPHAG, XNUG_L => XNUG, XALPHAI_L => XALPHAI, XNUI_L => XNUI, & + XRTMIN_L => XRTMIN, XALPHAC_L => XALPHAC, XNUC_L => XNUC +USE MODD_PARAM_LIMA_COLD, ONLY: XDI_L => XDI, XLBEXI_L => XLBEXI, XLBI_L => XLBI, XAI_L => XAI, XBI_L => XBI, XC_I_L => XC_I, & + XLBEXS_L => XLBEXS, XLBS_L => XLBS, XCCS_L => XCCS, & + XAS_L => XAS, XBS_L => XBS, XCXS_L => XCXS, XLBDAS_MAX, XLBDAS_MIN, XNS_L => XNS +USE MODD_PARAM_LIMA_MIXED, ONLY: XDG_L => XDG, XLBEXG_L => XLBEXG, XLBG_L => XLBG, XCCG_L => XCCG, & + XAG_L => XAG, XBG_L => XBG, XCXG_L => XCXG, XCG_L => XCG +USE MODD_PARAM_LIMA_WARM, ONLY: XLBEXR_L => XLBEXR, XLBR_L => XLBR, XBR_L => XBR, XAR_L => XAR, & + XBC_L => XBC, XAC_L => XAC +USE MODD_PARAM_n, ONLY: CCLOUD, CRAD, CSURF USE MODD_PROFILER_n -USE MODD_TIME, only: tdtexp -USE MODD_TIME_n, only: tdtcur -! -USE MODE_ll +USE MODD_RAIN_ICE_DESCR, ONLY: XALPHAR_I => XALPHAR, XNUR_I => XNUR, XLBEXR_I => XLBEXR, & + XLBR_I => XLBR, XCCR_I => XCCR, XBR_I => XBR, XAR_I => XAR, & + XALPHAC_I => XALPHAC, XNUC_I => XNUC, & + XLBC_I => XLBC, XBC_I => XBC, XAC_I => XAC, & + XALPHAC2_I => XALPHAC2, XNUC2_I => XNUC2, & + XALPHAS_I => XALPHAS, XNUS_I => XNUS, XLBEXS_I => XLBEXS, & + XLBS_I => XLBS, XCCS_I => XCCS, XAS_I => XAS, XBS_I => XBS, XCXS_I => XCXS, & + XALPHAG_I => XALPHAG, XNUG_I => XNUG, XDG_I => XDG, XLBEXG_I => XLBEXG, & + XLBG_I => XLBG, XCCG_I => XCCG, XAG_I => XAG, XBG_I => XBG, XCXG_I => XCXG, XCG_I => XCG, & + XALPHAI_I => XALPHAI, XNUI_I => XNUI, XDI_I => XDI, XLBEXI_I => XLBEXI, & + XLBI_I => XLBI, XAI_I => XAI, XBI_I => XBI, XC_I_I => XC_I, & + XNS_I => XNS, XRTMIN_I => XRTMIN, XCONC_LAND, XCONC_SEA +! +USE MODE_FGAU, ONLY: GAULAG +USE MODE_FSCATTER, ONLY: BHMIE, QEPSI, QEPSW, MG, MOMG USE MODE_MSG +USE MODE_STATPROF_TOOLS, ONLY: STATPROF_INSTANT, STATPROF_INTERP_2D, STATPROF_INTERP_3D, & + STATPROF_INTERP_3D_U, STATPROF_INTERP_3D_V ! USE MODI_GPS_ZENITH_GRID -USE MODI_LIDAR -USE MODI_RADAR_RAIN_ICE USE MODI_WATER_SUM -USE MODE_FGAU, ONLY : GAULAG -USE MODE_FSCATTER, ONLY: QEPSW,QEPSI,BHMIE,MOMG,MG -USE MODD_PARAM_LIMA, ONLY: XALPHAR_L=>XALPHAR,XNUR_L=>XNUR,XALPHAS_L=>XALPHAS,XNUS_L=>XNUS,& - XALPHAG_L=>XALPHAG,XNUG_L=>XNUG, XALPHAI_L=>XALPHAI,XNUI_L=>XNUI,& - XRTMIN_L=>XRTMIN,XALPHAC_L=>XALPHAC,XNUC_L=>XNUC, LSNOW_T_L=>LSNOW_T -USE MODD_PARAM_LIMA_COLD, ONLY: XDI_L=>XDI,XLBEXI_L=>XLBEXI,XLBI_L=>XLBI,XAI_L=>XAI,XBI_L=>XBI,XC_I_L=>XC_I,& - XLBEXS_L=>XLBEXS,XLBS_L=>XLBS,XCCS_L=>XCCS,XNS_L=>XNS,& - XAS_L=>XAS,XBS_L=>XBS,XCXS_L=>XCXS, & - XLBDAS_MIN,XLBDAS_MAX -USE MODD_PARAM_LIMA_MIXED, ONLY: XDG_L=>XDG,XLBEXG_L=>XLBEXG,XLBG_L=>XLBG,XCCG_L=>XCCG,& - XAG_L=>XAG,XBG_L=>XBG,XCXG_L=>XCXG,XCG_L=>XCG -USE MODD_PARAM_LIMA_WARM, ONLY: XLBEXR_L=>XLBEXR,XLBR_L=>XLBR,XBR_L=>XBR,XAR_L=>XAR,& - XBC_L=>XBC,XAC_L=>XAC -USE MODD_PARAM_ICE, ONLY: LSNOW_T_I=>LSNOW_T -USE MODD_RAIN_ICE_DESCR, ONLY: XALPHAR_I=>XALPHAR,XNUR_I=>XNUR,XLBEXR_I=>XLBEXR,& - XLBR_I=>XLBR,XCCR_I=>XCCR,XBR_I=>XBR,XAR_I=>XAR,& - XALPHAC_I=>XALPHAC,XNUC_I=>XNUC,& - XLBC_I=>XLBC,XBC_I=>XBC,XAC_I=>XAC,& - XALPHAC2_I=>XALPHAC2,XNUC2_I=>XNUC2,& - XALPHAS_I=>XALPHAS,XNUS_I=>XNUS,XLBEXS_I=>XLBEXS,& - XLBS_I=>XLBS,XCCS_I=>XCCS,XNS_I=>XNS,XAS_I=>XAS,XBS_I=>XBS,XCXS_I=>XCXS,& - XALPHAG_I=>XALPHAG,XNUG_I=>XNUG,XDG_I=>XDG,XLBEXG_I=>XLBEXG,& - XLBG_I=>XLBG,XCCG_I=>XCCG,XAG_I=>XAG,XBG_I=>XBG,XCXG_I=>XCXG,XCG_I=>XCG,& - XALPHAI_I=>XALPHAI,XNUI_I=>XNUI,XDI_I=>XDI,XLBEXI_I=>XLBEXI,& - XLBI_I=>XLBI,XAI_I=>XAI,XBI_I=>XBI,XC_I_I=>XC_I,& - XRTMIN_I=>XRTMIN,XCONC_LAND,XCONC_SEA ! ! IMPLICIT NONE @@ -146,52 +136,40 @@ IMPLICIT NONE !* 0.1 declarations of arguments ! ! -REAL, INTENT(IN) :: PTSTEP ! time step -REAL, DIMENSION(:), INTENT(IN) :: PXHAT ! x coordinate -REAL, DIMENSION(:), INTENT(IN) :: PYHAT ! y coordinate REAL, DIMENSION(:,:,:), INTENT(IN) :: PZ ! z array REAL, DIMENSION(:,:,:), INTENT(IN) :: PU ! horizontal wind X component REAL, DIMENSION(:,:,:), INTENT(IN) :: PV ! horizontal wind Y component REAL, DIMENSION(:,:,:), INTENT(IN) :: PW ! vertical wind REAL, DIMENSION(:,:,:), INTENT(IN) :: PTH ! potential temperature -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PR ! water mixing ratios REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSV ! Scalar variables REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKE ! turbulent kinetic energy REAL, DIMENSION(:,:), INTENT(IN) :: PTS ! surface temperature REAL, DIMENSION(:,:,:), INTENT(IN) :: PP ! pressure REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PAER ! aerosol extinction -REAL, DIMENSION(:,:,:), INTENT(IN) :: PCLDFR ! cloud fraction REAL, DIMENSION(:,:,:), INTENT(IN) :: PCIT ! ice concentration -REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PSEA ! for radar +REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PSEA ! for radar ! !------------------------------------------------------------------------------- ! ! 0.2 declaration of local variables ! ! -INTEGER :: IIB ! current processor domain sizes -INTEGER :: IJB +INTEGER, PARAMETER :: JPTS_GAULAG = 9 ! number of points for Gauss-Laguerre quadrature +! INTEGER :: IKB -INTEGER :: IIE -INTEGER :: IJE INTEGER :: IKE -INTEGER :: IIU -INTEGER :: IJU INTEGER :: IKU ! ! -REAL, DIMENSION(SIZE(PXHAT)) :: ZXHATM ! mass point coordinates -REAL, DIMENSION(SIZE(PYHAT)) :: ZYHATM ! mass point coordinates -! REAL, DIMENSION(SIZE(PSV,1),SIZE(PSV,2),SIZE(PSV,3),SIZE(PSV,4)) :: ZWORK REAL, DIMENSION(SIZE(PSV,1),SIZE(PSV,2),SIZE(PSV,3),SIZE(PAER,4)) :: ZWORK2 ! -LOGICAL :: GSTORE ! storage occurs at this time step -! INTEGER :: IN ! time index INTEGER :: JSV ! loop counter INTEGER :: JK ! loop +INTEGER :: JP ! loop for profilers INTEGER :: IKRAD ! REAL,DIMENSION(SIZE(PZ,3)) :: ZU_PROFILER ! horizontal wind speed profile at station location (along x) @@ -221,38 +199,29 @@ REAL :: ZZWD_PROFILER ! ZWD at station location REAL :: ZZHDR ! ZHD correction at station location REAL :: ZZWDR ! ZWD correction at station location ! -INTEGER :: IINFO_ll ! return code -INTEGER :: ILUOUT ! logical unit -INTEGER :: IRESP ! return code -INTEGER :: I ! loop for stations -! REAL,DIMENSION(SIZE(PTH,1),SIZE(PTH,2)) :: ZZTD,ZZHD,ZZWD -REAL,DIMENSION(SIZE(PTH,1),SIZE(PTH,2),SIZE(PTH,3)) :: ZTEMP,ZRARE,ZTHV,ZTEMPV -REAL,DIMENSION(SIZE(PTH,1),SIZE(PTH,2),SIZE(PTH,3)) :: ZWORK32,ZWORK33,ZWORK34 -REAL,DIMENSION(SIZE(PTH,1),SIZE(PTH,2),SIZE(PTH,3)) :: ZVISI,ZVISIKUN +REAL,DIMENSION(SIZE(PTH,1),SIZE(PTH,2),SIZE(PTH,3)) :: ZTEMP,ZTHV,ZTEMPV +REAL,DIMENSION(SIZE(PTH,1),SIZE(PTH,2),SIZE(PTH,3)) :: ZVISIGUL, ZVISIKUN REAL :: ZK1,ZK2,ZK3 ! k1, k2 and K3 atmospheric refractivity constants REAL :: ZRDSRV ! XRD/XRV ! ! specific to cloud radar -INTEGER :: JLOOP,JLOOP2 ! loop counter +INTEGER :: JLOOP ! loop counter REAL, DIMENSION(SIZE(PR,3)) :: ZTEMPZ! vertical profile of temperature REAL, DIMENSION(SIZE(PR,3)) :: ZRHODREFZ ! vertical profile of dry air density of the reference state REAL, DIMENSION(SIZE(PR,3)) :: ZCIT ! pristine ice concentration REAL, DIMENSION(SIZE(PR,3)) :: ZCCI,ZCCR,ZCCC ! ICE,RAIN CLOUD concentration (LIMA) -REAL, DIMENSION(SIZE(PR,1),SIZE(PR,2),SIZE(PR,3)) :: ZR REAL, DIMENSION(SIZE(PR,3),SIZE(PR,4)+1) :: ZRZ ! vertical profile of hydrometeor mixing ratios -REAL :: ZA,ZB,ZCC,ZCX,ZALPHA,ZNU,ZLB,ZLBEX,ZRHOHYD,XLAM_CRAD,ZNS ! generic microphysical parameters +REAL :: ZA, ZB, ZCC, ZCX, ZALPHA, ZNS, ZNU, ZLB, ZLBEX, ZRHOHYD ! generic microphysical parameters INTEGER :: JJ ! loop counter for quadrature COMPLEX :: QMW,QMI,QM,QB,QEPSIW,QEPSWI ! dielectric parameter REAL :: ZAETOT,ZAETMP,ZREFLOC,ZQSCA,ZQBACK,ZQEXT ! temporary scattering parameters REAL,DIMENSION(:),ALLOCATABLE :: ZAELOC,ZZMZ ! temporary arrays -INTEGER :: JPTS_GAULAG=9 ! number of points for Gauss-Laguerre quadrature REAL :: ZLBDA ! slope distribution parameter -REAL :: ZN ! number cocentration -REAL :: ZFRAC_ICE ! ice water fraction REAL :: ZDELTA_EQUIV ! mass-equivalent Gauss-Laguerre point REAL :: ZFW ! liquid fraction REAL :: ZFPW ! weight for mixed-phase reflectivity +REAL :: ZN ! number concentration REAL,DIMENSION(:),ALLOCATABLE :: ZX,ZW ! Gauss-Laguerre points and weights REAL,DIMENSION(:),ALLOCATABLE :: ZRTMIN ! local values for XRTMIN LOGICAL :: GCALC @@ -269,801 +238,468 @@ ZK2 = 0.704 ! K/Pa ZK3 = 3739. ! K2/Pa ZRDSRV=XRD/XRV ! -XLAM_CRAD = 3.154E-3 ! (in m) <=> 95.04 GHz = Rasta cloud radar frequency !* 2.1 Indices ! ------- ! -CALL GET_INDICE_ll (IIB,IJB,IIE,IJE) IKU = SIZE(PZ,3) ! nombre de niveaux sur la verticale IKB = JPVEXT+1 IKE = IKU-JPVEXT ! -! -!* 2.2 Interpolations of model variables to mass points -! ------------------------------------------------ -! -IIU=SIZE(PXHAT) -IJU=SIZE(PYHAT) -! -ZXHATM(1:IIU-1)=0.5*PXHAT(1:IIU-1)+0.5*PXHAT(2:IIU ) -ZXHATM( IIU )=1.5*PXHAT( IIU )-0.5*PXHAT( IIU-1) -! -ZYHATM(1:IJU-1)=0.5*PYHAT(1:IJU-1)+0.5*PYHAT(2:IJU ) -ZYHATM( IJU )=1.5*PYHAT( IJU )-0.5*PYHAT( IJU-1) -! !---------------------------------------------------------------------------- ! -! !* 3.4 instant of storage ! ------------------ ! -IF ( TPROFILER%T_CUR == XUNDEF ) TPROFILER%T_CUR = TPROFILER%STEP - PTSTEP -! -TPROFILER%T_CUR = TPROFILER%T_CUR + PTSTEP -! -IF ( TPROFILER%T_CUR >= TPROFILER%STEP - 1.E-10 ) THEN - GSTORE = .TRUE. - TPROFILER%T_CUR = TPROFILER%T_CUR - TPROFILER%STEP - TPROFILER%N_CUR = TPROFILER%N_CUR + 1 - IN = TPROFILER%N_CUR -ELSE - GSTORE = .FALSE. -END IF -! -IF (GSTORE) THEN -#if 0 - tprofiler%tpdates(in)%date%year = tdtexp%date%year - tprofiler%tpdates(in)%date%month = tdtexp%date%month - tprofiler%tpdates(in)%date%day = tdtexp%date%day - tprofiler%tpdates(in)%xtime = tdtexp%xtime + ( in - 1 ) * tprofiler%step -#else - tprofiler%tpdates(in) = tdtcur -#endif -END IF -! +CALL STATPROF_INSTANT( TPROFILERS_TIME, IN ) +IF ( IN < 1 ) RETURN !No profiler storage at this time step ! !---------------------------------------------------------------------------- ! -!* 4. PROFILER POSITION -! -------------- -! -!* 4.0 initialization of processor test -! -------------------------------- -IF (GPROFILERFIRSTCALL) THEN -GPROFILERFIRSTCALL=.FALSE. -! - IF (.NOT.(ASSOCIATED(ZTHIS_PROCS))) ALLOCATE(ZTHIS_PROCS(NUMBPROFILER)) -! -IF (.NOT.(ASSOCIATED(II))) ALLOCATE(II(NUMBPROFILER)) -IF (.NOT.(ASSOCIATED(IJ))) ALLOCATE(IJ(NUMBPROFILER)) -IF (.NOT.(ASSOCIATED(IV))) ALLOCATE(IV(NUMBPROFILER)) -IF (.NOT.(ASSOCIATED(IU))) ALLOCATE(IU(NUMBPROFILER)) -IF (.NOT.(ASSOCIATED(ZXCOEF))) ALLOCATE(ZXCOEF(NUMBPROFILER)) -IF (.NOT.(ASSOCIATED(ZUCOEF))) ALLOCATE(ZUCOEF(NUMBPROFILER)) -IF (.NOT.(ASSOCIATED(ZYCOEF))) ALLOCATE(ZYCOEF(NUMBPROFILER)) -IF (.NOT.(ASSOCIATED(ZVCOEF))) ALLOCATE(ZVCOEF(NUMBPROFILER)) -! -ZXCOEF(:)=XUNDEF -ZUCOEF(:)=XUNDEF -ZYCOEF(:)=XUNDEF -ZVCOEF(:)=XUNDEF -! -DO I=1,NUMBPROFILER - -ZTHIS_PROCS(I)=0. -! -!* 4.1 X position -! ---------- -! -IU(I)=COUNT( PXHAT (:)<=TPROFILER%X(I) ) -II(I)=COUNT( ZXHATM(:)<=TPROFILER%X(I) ) -! -IF (II(I)<=IIB-1 .AND. LWEST_ll() .AND. .NOT. L1D) TPROFILER%ERROR(I)=.TRUE. -IF (II(I)>=IIE .AND. LEAST_ll() .AND. .NOT. L1D) TPROFILER%ERROR(I)=.TRUE. -! -! -!* 4.2 Y position -! ---------- -! -IV(I)=COUNT( PYHAT (:)<=TPROFILER%Y(I) ) -IJ(I)=COUNT( ZYHATM(:)<=TPROFILER%Y(I) ) -! -IF (IJ(I)<=IJB-1 .AND. LSOUTH_ll() .AND. .NOT. L1D) TPROFILER%ERROR(I)=.TRUE. -IF (IJ(I)>=IJE .AND. LNORTH_ll() .AND. .NOT. L1D) TPROFILER%ERROR(I)=.TRUE. -! -! -!* 4.3 Position of station according to processors -! ------------------------------------------- -! -IF (IU(I)>=IIB .AND. IU(I)<=IIE .AND. IV(I)>=IJB .AND. IV(I)<=IJE) ZTHIS_PROCS(I)=1. -IF (L1D) ZTHIS_PROCS(I)=1. -! -! -!* 4.4 Computations only on correct processor -! -------------------------------------- -ZXCOEF(I) = 0. -ZYCOEF(I) = 0. -ZUCOEF(I) = 0. -ZVCOEF(I) = 0. -IF (ZTHIS_PROCS(I) >0. .AND. .NOT. L1D) THEN -! -!* 6.1 Interpolation coefficient for X -! ------------------------------- -! - ZXCOEF(I) = (TPROFILER%X(I) - ZXHATM(II(I))) / (ZXHATM(II(I)+1) - ZXHATM(II(I))) -! -! -! -!* 6.2 Interpolation coefficient for y -! ------------------------------- -! - ZYCOEF(I) = (TPROFILER%Y(I) - ZYHATM(IJ(I))) / (ZYHATM(IJ(I)+1) - ZYHATM(IJ(I))) -! -!---------------------------------------------------------------------------- -! -!* 7. INITIALIZATIONS FOR INTERPOLATIONS OF U AND V -! --------------------------------------------- -! -!* 7.1 Interpolation coefficient for X (for U) -! ------------------------------- -! - ZUCOEF(I) = (TPROFILER%X(I) - PXHAT(IU(I))) / (PXHAT(IU(I)+1) - PXHAT(IU(I))) -! -!* 7.2 Interpolation coefficient for y (for V) -! ------------------------------- -! - ZVCOEF(I) = (TPROFILER%Y(I) - PYHAT(IV(I))) / (PYHAT(IV(I)+1) - PYHAT(IV(I))) -! -END IF -ENDDO -END IF -!---------------------------------------------------------------------------- -! !* 8. DATA RECORDING ! -------------- ! +!PW: TODO: ne faire le calcul que si necessaire (presence de profileurs locaux,...) ZTEMP(:,:,:)=PTH(:,:,:)*(PP(:,:,:)/ XP00) **(XRD/XCPD) ! Theta_v ZTHV(:,:,:) = PTH(:,:,:) / (1.+WATER_SUM(PR(:,:,:,:)))*(1.+PR(:,:,:,1)/ZRDSRV) ! virtual temperature ZTEMPV(:,:,:)=ZTHV(:,:,:)*(PP(:,:,:)/ XP00) **(XRD/XCPD) CALL GPS_ZENITH_GRID(PR(:,:,:,1),ZTEMP,PP,ZZTD,ZZHD,ZZWD) -! Kunkel formulation -IF (SIZE(PR,4) >= 2) THEN + +IF ( CCLOUD == 'C2R2' .OR. CCLOUD == 'KHKO' ) THEN + ! Gultepe formulation + ZVISIGUL(:,:,:) = 10E5 !default value + WHERE ( (PR(:,:,:,2) /=0. ) .AND. (PSV(:,:,:,NSV_C2R2BEG+1) /=0. ) ) + ZVISIGUL(:,:,:) =1.002/(PR(:,:,:,2)*PRHODREF(:,:,:)*PSV(:,:,:,NSV_C2R2BEG+1))**0.6473 + END WHERE +END IF + +IF ( CCLOUD /= 'NONE' .AND. CCLOUD /= 'REVE' ) THEN + ! Kunkel formulation ZVISIKUN(:,:,:) = 10E5 !default value WHERE ( PR(:,:,:,2) /=0 ) ZVISIKUN(:,:,:) =0.027/(10**(-8)+(PR(:,:,:,2)/(1+PR(:,:,:,2))*PRHODREF(:,:,:)*1000))**0.88 END WHERE END IF -! Gultepe formulation -IF ((SIZE(PR,4) >= 2) .AND. NSV_C2R2END /= 0 ) THEN - WHERE ( (PR(:,:,:,2) /=0. ) .AND. (PSV(:,:,:,NSV_C2R2BEG+1) /=0. ) ) - ZVISI(:,:,:) =1.002/(PR(:,:,:,2)*PRHODREF(:,:,:)*PSV(:,:,:,NSV_C2R2BEG+1))**0.6473 - END WHERE -END IF ! -IF (GSTORE) THEN - DO I=1,NUMBPROFILER - IF ((ZTHIS_PROCS(I)==1.).AND.(.NOT. TPROFILER%ERROR(I))) THEN - ! - ZZ(:) = PROFILER_INTERP(PZ) - ZRHOD(:) = PROFILER_INTERP(PRHODREF) - ZPRES(:) = PROFILER_INTERP(PP) - ZU_PROFILER(:) = PROFILER_INTERP_U(PU) - ZV_PROFILER(:) = PROFILER_INTERP_V(PV) - ZGAM = (XRPK * (TPROFILER%LON(I) - XLON0) - XBETA)*(XPI/180.) - ZFF(:) = SQRT(ZU_PROFILER(:)**2 + ZV_PROFILER(:)**2) - DO JK=1,IKU - IF (ZU_PROFILER(JK) >=0. .AND. ZV_PROFILER(JK) > 0.) & - ZDD(JK) = ATAN(ABS(ZU_PROFILER(JK)/ZV_PROFILER(JK))) * 180./XPI + 180. - IF (ZU_PROFILER(JK) >0. .AND. ZV_PROFILER(JK) <= 0.) & - ZDD(JK) = ATAN(ABS(ZV_PROFILER(JK)/ZU_PROFILER(JK))) * 180./XPI + 270. - IF (ZU_PROFILER(JK) <=0. .AND. ZV_PROFILER(JK) < 0.) & - ZDD(JK) = ATAN(ABS(ZU_PROFILER(JK)/ZV_PROFILER(JK))) * 180./XPI - IF (ZU_PROFILER(JK) <0. .AND. ZV_PROFILER(JK) >= 0.) & - ZDD(JK) = ATAN(ABS(ZV_PROFILER(JK)/ZU_PROFILER(JK))) * 180./XPI + 90. - IF (ZU_PROFILER(JK) == 0. .AND. ZV_PROFILER(JK) == 0.) & - ZDD(JK) = XUNDEF +PROFILER: DO JP = 1, NUMBPROFILER_LOC + ZZ(:) = STATPROF_INTERP_3D( TPROFILERS(JP), PZ ) + ZRHOD(:) = STATPROF_INTERP_3D( TPROFILERS(JP), PRHODREF ) + ZPRES(:) = STATPROF_INTERP_3D( TPROFILERS(JP), PP ) + ZU_PROFILER(:) = STATPROF_INTERP_3D_U( TPROFILERS(JP), PU ) + ZV_PROFILER(:) = STATPROF_INTERP_3D_V( TPROFILERS(JP), PV ) + ZGAM = (XRPK * (TPROFILERS(JP)%XLON - XLON0) - XBETA)*(XPI/180.) + ZFF(:) = SQRT(ZU_PROFILER(:)**2 + ZV_PROFILER(:)**2) + DO JK=1,IKU + IF (ZU_PROFILER(JK) >=0. .AND. ZV_PROFILER(JK) > 0.) & + ZDD(JK) = ATAN(ABS(ZU_PROFILER(JK)/ZV_PROFILER(JK))) * 180./XPI + 180. + IF (ZU_PROFILER(JK) >0. .AND. ZV_PROFILER(JK) <= 0.) & + ZDD(JK) = ATAN(ABS(ZV_PROFILER(JK)/ZU_PROFILER(JK))) * 180./XPI + 270. + IF (ZU_PROFILER(JK) <=0. .AND. ZV_PROFILER(JK) < 0.) & + ZDD(JK) = ATAN(ABS(ZU_PROFILER(JK)/ZV_PROFILER(JK))) * 180./XPI + IF (ZU_PROFILER(JK) <0. .AND. ZV_PROFILER(JK) >= 0.) & + ZDD(JK) = ATAN(ABS(ZV_PROFILER(JK)/ZU_PROFILER(JK))) * 180./XPI + 90. + IF (ZU_PROFILER(JK) == 0. .AND. ZV_PROFILER(JK) == 0.) & + ZDD(JK) = XUNDEF + END DO + ! GPS IWV and ZTD + XZS_GPS=TPROFILERS(JP)%XZ + IF ( ABS( ZZ(IKB)-XZS_GPS ) < 150 ) THEN ! distance between real and model orography ok + ZRV(:) = STATPROF_INTERP_3D( TPROFILERS(JP), PR(:,:,:,1) ) + ZT(:) = STATPROF_INTERP_3D( TPROFILERS(JP), ZTEMP ) + ZE(:) = ZPRES(:)*ZRV(:)/(ZRDSRV+ZRV(:)) + ZTV(:) = STATPROF_INTERP_3D( TPROFILERS(JP), ZTEMPV ) + ZZTD_PROFILER = STATPROF_INTERP_2D( TPROFILERS(JP), ZZTD ) + ZZHD_PROFILER = STATPROF_INTERP_2D( TPROFILERS(JP), ZZHD ) + ZZWD_PROFILER = STATPROF_INTERP_2D( TPROFILERS(JP), ZZWD ) + ZIWV = 0. + DO JK=IKB,IKE + ZIWV=ZIWV+ZRHOD(JK)*ZRV(JK)*(ZZ(JK+1)-ZZ(JK)) + END DO + IF (ZZ(IKB) < XZS_GPS) THEN ! station above the model orography + DO JK=IKB+1,IKE + IF ( ZZ(JK) < XZS_GPS) THEN ! whole layer to remove + ZZHDR=( 1.E-6 * ZK1 * ZPRES(JK-1) * ( ZZ(JK) - ZZ(JK-1) ) / ZTV(JK-1)) + ZZWDR=( 1.E-6 * ( (ZK2-ZRDSRV*ZK1) + ( ZK3/ZT(JK-1) ) ) * & + ZE(JK-1)* ( ZZ(JK) - ZZ(JK-1) ) / ZT(JK-1) ) + ZZHD_PROFILER=ZZHD_PROFILER-ZZHDR + ZZWD_PROFILER=ZZWD_PROFILER-ZZWDR + ZZTD_PROFILER=ZZTD_PROFILER-ZZHDR-ZZWDR + ELSE ! partial layer to remove + ZZHDR=( 1.E-6 * ZK1 * ZPRES(JK-1) * ( XZS_GPS - ZZ(JK-1) ) / ZTV(JK-1)) + ZZWDR=( 1.E-6 * ( (ZK2-ZRDSRV*ZK1) + ( ZK3/ZT(JK-1) ) ) * & + ZE(JK-1)* ( XZS_GPS - ZZ(JK-1) ) / ZT(JK-1) ) + ZZHD_PROFILER=ZZHD_PROFILER-ZZHDR + ZZWD_PROFILER=ZZWD_PROFILER-ZZWDR + ZZTD_PROFILER=ZZTD_PROFILER-ZZHDR-ZZWDR + EXIT + END IF END DO - ! GPS IWV and ZTD - XZS_GPS=TPROFILER%ALT(I) - IF ( ABS( ZZ(IKB)-XZS_GPS ) < 150 ) THEN ! distance between real and model orography ok - ZRV(:) = PROFILER_INTERP(PR(:,:,:,1)) - ZT(:) = PROFILER_INTERP(ZTEMP) - ZE(:) = ZPRES(:)*ZRV(:)/(ZRDSRV+ZRV(:)) - ZTV(:) = PROFILER_INTERP(ZTEMPV) - ZZTD_PROFILER = PROFILER_INTERP_2D(ZZTD) - ZZHD_PROFILER = PROFILER_INTERP_2D(ZZHD) - ZZWD_PROFILER = PROFILER_INTERP_2D(ZZWD) - ZIWV = 0. - DO JK=IKB,IKE - ZIWV=ZIWV+ZRHOD(JK)*ZRV(JK)*(ZZ(JK+1)-ZZ(JK)) - END DO - IF (ZZ(IKB) < XZS_GPS) THEN ! station above the model orography - DO JK=IKB+1,IKE - IF ( ZZ(JK) < XZS_GPS) THEN ! whole layer to remove - ZZHDR=( 1.E-6 * ZK1 * ZPRES(JK-1) * ( ZZ(JK) - ZZ(JK-1) ) / ZTV(JK-1)) - ZZWDR=( 1.E-6 * ( (ZK2-ZRDSRV*ZK1) + ( ZK3/ZT(JK-1) ) ) * & - ZE(JK-1)* ( ZZ(JK) - ZZ(JK-1) ) / ZT(JK-1) ) - ZZHD_PROFILER=ZZHD_PROFILER-ZZHDR - ZZWD_PROFILER=ZZWD_PROFILER-ZZWDR - ZZTD_PROFILER=ZZTD_PROFILER-ZZHDR-ZZWDR - ELSE ! partial layer to remove - ZZHDR=( 1.E-6 * ZK1 * ZPRES(JK-1) * ( XZS_GPS - ZZ(JK-1) ) / ZTV(JK-1)) - ZZWDR=( 1.E-6 * ( (ZK2-ZRDSRV*ZK1) + ( ZK3/ZT(JK-1) ) ) * & - ZE(JK-1)* ( XZS_GPS - ZZ(JK-1) ) / ZT(JK-1) ) - ZZHD_PROFILER=ZZHD_PROFILER-ZZHDR - ZZWD_PROFILER=ZZWD_PROFILER-ZZWDR - ZZTD_PROFILER=ZZTD_PROFILER-ZZHDR-ZZWDR - EXIT - END IF - END DO - ELSE ! station below the model orography + ELSE ! station below the model orography ! Extrapolate variables below the model orography assuming constant T&Tv gradients, ! constant rv and hydrostatic law - ZZHATM(:)=0.5*(ZZ(1:IKU-1)+ZZ(2:IKU)) - ZZM_STAT=0.5*(XZS_GPS+ZZ(IKB)) - ZTM_STAT=ZT(IKB) + ( (ZZM_STAT-ZZHATM(IKB))*& - ( ZT(IKB)- ZT(IKB+1) )/(ZZHATM(IKB)-ZZHATM(IKB+1)) ) - ZTV_STAT=ZTV(IKB) + ( (ZZM_STAT-ZZHATM(IKB))*& - ( ZTV(IKB)- ZTV(IKB+1) )/(ZZHATM(IKB)-ZZHATM(IKB+1)) ) - ZPM_STAT = ZPRES(IKB) * EXP(XG *(ZZM_STAT-ZZHATM(IKB))& - /(XRD* 0.5 *(ZTV_STAT+ZTV(IKB)))) - ZEM_STAT = ZPM_STAT * ZRV(IKB) / ( ZRDSRV + ZRV(IKB) ) -! add contribution below the model orography - ZZHDR=( 1.E-6 * ZK1 * ZPM_STAT * ( ZZ(IKB) - XZS_GPS ) / ZTV_STAT ) - ZZWDR=( 1.E-6 * ( (ZK2-ZRDSRV*ZK1) + (ZK3/ZTM_STAT) )& - * ZEM_STAT* ( ZZ(IKB) - XZS_GPS ) / ZTM_STAT ) - ZZHD_PROFILER=ZZHD_PROFILER+ZZHDR - ZZWD_PROFILER=ZZWD_PROFILER+ZZWDR - ZZTD_PROFILER=ZZTD_PROFILER+ZZHDR+ZZWDR - END IF - TPROFILER%IWV(IN,I)= ZIWV - TPROFILER%ZTD(IN,I)= ZZTD_PROFILER - TPROFILER%ZWD(IN,I)= ZZWD_PROFILER - TPROFILER%ZHD(IN,I)= ZZHD_PROFILER - ELSE - CMNHMSG(1) = 'altitude of profiler ' // TRIM( TPROFILER%NAME(I) ) // ' is too far from orography' - CMNHMSG(2) = 'some variables are therefore not computed (IWV, ZTD, ZWD, ZHD)' - CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'PROFILER_n' ) - TPROFILER%IWV(IN,I)= XUNDEF - TPROFILER%ZTD(IN,I)= XUNDEF - TPROFILER%ZWD(IN,I)= XUNDEF - TPROFILER%ZHD(IN,I)= XUNDEF - END IF - TPROFILER%ZON (IN,:,I) = ZU_PROFILER(:) * COS(ZGAM) + ZV_PROFILER(:) * SIN(ZGAM) - TPROFILER%MER (IN,:,I) = - ZU_PROFILER(:) * SIN(ZGAM) + ZV_PROFILER(:) * COS(ZGAM) - TPROFILER%FF (IN,:,I) = ZFF(:) - TPROFILER%DD (IN,:,I) = ZDD(:) - TPROFILER%W (IN,:,I) = PROFILER_INTERP(PW) - TPROFILER%TH (IN,:,I) = PROFILER_INTERP(PTH) - TPROFILER%THV (IN,:,I) = PROFILER_INTERP(ZTHV) - TPROFILER%VISI(IN,:,I) = PROFILER_INTERP(ZVISI) - TPROFILER%VISIKUN(IN,:,I) = PROFILER_INTERP(ZVISIKUN) - TPROFILER%ZZ (IN,:,I) = ZZ(:) - TPROFILER%RHOD(IN,:,I) = ZRHOD(:) - TPROFILER%CIZ(IN,:,I) = PROFILER_INTERP(PCIT) + ZZHATM(:)=0.5*(ZZ(1:IKU-1)+ZZ(2:IKU)) + ZZM_STAT=0.5*(XZS_GPS+ZZ(IKB)) + ZTM_STAT=ZT(IKB) + ( (ZZM_STAT-ZZHATM(IKB))*& + ( ZT(IKB)- ZT(IKB+1) )/(ZZHATM(IKB)-ZZHATM(IKB+1)) ) + ZTV_STAT=ZTV(IKB) + ( (ZZM_STAT-ZZHATM(IKB))*& + ( ZTV(IKB)- ZTV(IKB+1) )/(ZZHATM(IKB)-ZZHATM(IKB+1)) ) + ZPM_STAT = ZPRES(IKB) * EXP(XG *(ZZM_STAT-ZZHATM(IKB))& + /(XRD* 0.5 *(ZTV_STAT+ZTV(IKB)))) + ZEM_STAT = ZPM_STAT * ZRV(IKB) / ( ZRDSRV + ZRV(IKB) ) +! add contribution below the model orography + ZZHDR=( 1.E-6 * ZK1 * ZPM_STAT * ( ZZ(IKB) - XZS_GPS ) / ZTV_STAT ) + ZZWDR=( 1.E-6 * ( (ZK2-ZRDSRV*ZK1) + (ZK3/ZTM_STAT) )& + * ZEM_STAT* ( ZZ(IKB) - XZS_GPS ) / ZTM_STAT ) + ZZHD_PROFILER=ZZHD_PROFILER+ZZHDR + ZZWD_PROFILER=ZZWD_PROFILER+ZZWDR + ZZTD_PROFILER=ZZTD_PROFILER+ZZHDR+ZZWDR + END IF + TPROFILERS(JP)%XIWV(IN)= ZIWV + TPROFILERS(JP)%XZTD(IN)= ZZTD_PROFILER + TPROFILERS(JP)%XZWD(IN)= ZZWD_PROFILER + TPROFILERS(JP)%XZHD(IN)= ZZHD_PROFILER + ELSE + CMNHMSG(1) = 'altitude of profiler ' // TRIM( TPROFILERS(JP)%CNAME ) // ' is too far from orography' + CMNHMSG(2) = 'some variables are therefore not computed (IWV, ZTD, ZWD, ZHD)' + CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'PROFILER_n', OLOCAL = .TRUE. ) + TPROFILERS(JP)%XIWV(IN)= XUNDEF + TPROFILERS(JP)%XZTD(IN)= XUNDEF + TPROFILERS(JP)%XZWD(IN)= XUNDEF + TPROFILERS(JP)%XZHD(IN)= XUNDEF + END IF + TPROFILERS(JP)%XZON (IN,:) = ZU_PROFILER(:) * COS(ZGAM) + ZV_PROFILER(:) * SIN(ZGAM) + TPROFILERS(JP)%XMER (IN,:) = - ZU_PROFILER(:) * SIN(ZGAM) + ZV_PROFILER(:) * COS(ZGAM) + TPROFILERS(JP)%XFF (IN,:) = ZFF(:) + TPROFILERS(JP)%XDD (IN,:) = ZDD(:) + TPROFILERS(JP)%XW (IN,:) = STATPROF_INTERP_3D( TPROFILERS(JP), PW ) + TPROFILERS(JP)%XTH (IN,:) = STATPROF_INTERP_3D( TPROFILERS(JP), PTH ) + TPROFILERS(JP)%XTHV (IN,:) = STATPROF_INTERP_3D( TPROFILERS(JP), ZTHV ) + IF ( CCLOUD == 'C2R2' .OR. CCLOUD == 'KHKO' ) TPROFILERS(JP)%XVISIGUL(IN,:) = STATPROF_INTERP_3D( TPROFILERS(JP), ZVISIGUL ) + IF ( CCLOUD /= 'NONE' .AND. CCLOUD /= 'REVE' ) TPROFILERS(JP)%XVISIKUN(IN,:) = STATPROF_INTERP_3D( TPROFILERS(JP), ZVISIKUN ) + TPROFILERS(JP)%XZZ (IN,:) = ZZ(:) + TPROFILERS(JP)%XRHOD(IN,:) = ZRHOD(:) + IF ( CCLOUD == 'ICE3' .OR. CCLOUD == 'ICE4' ) & + TPROFILERS(JP)%XCIZ(IN,:) = STATPROF_INTERP_3D( TPROFILERS(JP), PCIT ) ! add RARE - ! initialization CRARE and CRARE_ATT + LWC and IWC - TPROFILER%CRARE(IN,:,I) = 0. - TPROFILER%CRARE_ATT(IN,:,I) = 0. - TPROFILER%LWCZ (IN,:,I) = 0. - TPROFILER%IWCZ (IN,:,I) = 0. - IF (CCLOUD=="LIMA" .OR. CCLOUD=="ICE3" ) THEN ! only for ICE3 and LIMA - TPROFILER%LWCZ (IN,:,I) = PROFILER_INTERP((PR(:,:,:,2)+PR(:,:,:,3))*PRHODREF(:,:,:)) - TPROFILER%IWCZ (IN,:,I) = PROFILER_INTERP((PR(:,:,:,4)+PR(:,:,:,5)+PR(:,:,:,6))*PRHODREF(:,:,:)) - ZTEMPZ(:)=PROFILER_INTERP(ZTEMP(:,:,:)) - ZRHODREFZ(:)=PROFILER_INTERP(PRHODREF(:,:,:)) - ZCIT(:)=PROFILER_INTERP(PCIT(:,:,:)) - IF (CCLOUD=="LIMA") THEN - ZCCI(:)=PROFILER_INTERP(PSV(:,:,:,NSV_LIMA_NI)) - ZCCR(:)=PROFILER_INTERP(PSV(:,:,:,NSV_LIMA_NR)) - ZCCC(:)=PROFILER_INTERP(PSV(:,:,:,NSV_LIMA_NC)) - ENDIF - DO JLOOP=3,6 - ZRZ(:,JLOOP)=PROFILER_INTERP(PR(:,:,:,JLOOP)) - END DO - IF (CSURF=="EXTE") THEN - DO JK=1,IKU - ZRZ(JK,2)=PROFILER_INTERP_2D(PR(:,:,JK,2)*PSEA(:,:)) ! becomes cloud mixing ratio over sea - ZRZ(JK,7)=PROFILER_INTERP_2D(PR(:,:,JK,2)*(1.-PSEA(:,:))) ! becomes cloud mixing ratio over land - END DO - ELSE - ZRZ(:,2)=PROFILER_INTERP(PR(:,:,:,2)) - ZRZ(:,7)=0. - END IF - ALLOCATE(ZAELOC(IKU)) - ! - ZAELOC(:)=0. - ! initialization of quadrature points and weights - ALLOCATE(ZX(JPTS_GAULAG),ZW(JPTS_GAULAG)) - CALL GAULAG(JPTS_GAULAG,ZX,ZW) ! for integration over diameters - ! initialize minimum values - ALLOCATE(ZRTMIN(SIZE(PR,4)+1)) - IF (CCLOUD == 'LIMA') THEN - ZRTMIN(2)=XRTMIN_L(2) ! cloud water over sea - ZRTMIN(3)=XRTMIN_L(3) - ZRTMIN(4)=XRTMIN_L(4) - ZRTMIN(5)=1E-10 - ZRTMIN(6)=XRTMIN_L(6) - ZRTMIN(7)=XRTMIN_L(2) ! cloud water over land - ELSE - ZRTMIN(2)=XRTMIN_I(2) ! cloud water over sea - ZRTMIN(3)=XRTMIN_I(3) - ZRTMIN(4)=XRTMIN_I(4) - ZRTMIN(5)=1E-10 - ZRTMIN(6)=XRTMIN_I(6) - ZRTMIN(7)=XRTMIN_I(2) ! cloud water over land - ENDIF - ! compute cloud radar reflectivity from vertical profiles of temperature - ! and mixing ratios - DO JK=1,IKU - QMW=SQRT(QEPSW(ZTEMPZ(JK),XLIGHTSPEED/XLAM_CRAD)) - QMI=SQRT(QEPSI(ZTEMPZ(JK),XLIGHTSPEED/XLAM_CRAD)) - DO JLOOP=2,7 - IF (CCLOUD == 'LIMA') THEN - GCALC=(ZRZ(JK,JLOOP)>ZRTMIN(JLOOP).AND.(JLOOP.NE.4.OR.ZCCI(JK)>0.).AND.& - (JLOOP.NE.3.OR.ZCCR(JK)>0.).AND.((JLOOP.NE.2.AND.JLOOP.NE.7).OR.ZCCC(JK)>0.)) - ELSE - GCALC=(ZRZ(JK,JLOOP)>ZRTMIN(JLOOP).AND.(JLOOP.NE.4.OR.ZCIT(JK)>0.)) - ENDIF - IF(GCALC) THEN - SELECT CASE(JLOOP) - CASE(2) ! cloud water over sea - IF (CCLOUD == 'LIMA') THEN - ZA=XAC_L - ZB=XBC_L - ZCC=ZCCC(JK)*ZRHODREFZ(JK) - ZCX=0. - ZALPHA=XALPHAC_L - ZNU=XNUC_L - ZLBEX=1.0/(ZCX-ZB) - ZLB=( ZA*ZCC*MOMG(ZALPHA,ZNU,ZB) )**(-ZLBEX) - ELSE - ZA=XAC_I - ZB=XBC_I - ZCC=XCONC_SEA - ZCX=0. - ZALPHA=XALPHAC2_I - ZNU=XNUC2_I - ZLBEX=1.0/(ZCX-ZB) - ZLB=( ZA*ZCC*MOMG(ZALPHA,ZNU,ZB) )**(-ZLBEX) - ENDIF - CASE(3) ! rain water - IF (CCLOUD == 'LIMA') THEN - ZA=XAR_L - ZB=XBR_L - ZCC=ZCCR(JK)*ZRHODREFZ(JK) - ZCX=0. - ZALPHA=XALPHAR_L - ZNU=XNUR_L - ZLBEX=1.0/(ZCX-ZB) - ZLB=( ZA*ZCC*MOMG(ZALPHA,ZNU,ZB) )**(-ZLBEX) - ELSE - ZA=XAR_I - ZB=XBR_I - ZCC=XCCR_I - ZCX=-1. - ZALPHA=XALPHAR_I - ZNU=XNUR_I - ZLB=XLBR_I - ZLBEX=XLBEXR_I - ENDIF - CASE(4) ! pristine ice - IF (CCLOUD == 'LIMA') THEN - ZA=XAI_L - ZB=XBI_L - ZCC=ZCCI(JK)*ZRHODREFZ(JK) - ZCX=0. - ZALPHA=XALPHAI_L - ZNU=XNUI_L - ZLBEX=1.0/(ZCX-ZB) - ZLB=( ZA*ZCC*MOMG(ZALPHA,ZNU,ZB) )**(-ZLBEX) ! because ZCC not included in XLBI - ZFW=0 - ELSE - ZA=XAI_I - ZB=XBI_I - ZCC=ZCIT(JK) - ZCX=0. - ZALPHA=XALPHAI_I - ZNU=XNUI_I - ZLBEX=XLBEXI_I - ZLB=XLBI_I*ZCC**(-ZLBEX) ! because ZCC not included in XLBI - ZFW=0 - ENDIF - CASE(5) ! snow - IF (CCLOUD == 'LIMA') THEN - ZA=XAS_L - ZB=XBS_L - ZCC=XCCS_L - ZCX=XCXS_L - ZALPHA=XALPHAS_L - ZNU=XNUS_L - ZNS=XNS_L - ZLB=XLBS_L - ZLBEX=XLBEXS_L - ZFW=0 - ELSE - ZA=XAS_I - ZB=XBS_I - ZCC=XCCS_I - ZCX=XCXS_I - ZALPHA=XALPHAS_I - ZNU=XNUS_I - ZNS=XNS_I - ZLB=XLBS_I - ZLBEX=XLBEXS_I - ZFW=0 - ENDIF - CASE(6) ! graupel - !If temperature between -10 and 10B0C and Mr and Mg over min - !threshold: melting graupel - ! with liquid water fraction Fw=Mr/(Mr+Mg) else dry graupel - ! (Fw=0) - IF( ZTEMPZ(JK) > XTT-10 .AND. ZTEMPZ(JK) < XTT+10 & - .AND. ZRZ(JK,3) > ZRTMIN(3) ) THEN - ZFW=ZRZ(JK,3)/(ZRZ(JK,3)+ZRZ(JK,JLOOP)) - ELSE - ZFW=0 - ENDIF - IF (CCLOUD == 'LIMA') THEN - ZA=XAG_L - ZB=XBG_L - ZCC=XCCG_L - ZCX=XCXG_L - ZALPHA=XALPHAG_L - ZNU=XNUG_L - ZLB=XLBG_L - ZLBEX=XLBEXG_L - ELSE - ZA=XAG_I - ZB=XBG_I - ZCC=XCCG_I - ZCX=XCXG_I - ZALPHA=XALPHAG_I - ZNU=XNUG_I - ZLB=XLBG_I - ZLBEX=XLBEXG_I - ENDIF - CASE(7) ! cloud water over land - IF (CCLOUD == 'LIMA') THEN - ZA=XAC_L - ZB=XBC_L - ZCC=ZCCC(JK)*ZRHODREFZ(JK) - ZCX=0. - ZALPHA=XALPHAC_L - ZNU=XNUC_L - ZLBEX=1.0/(ZCX-ZB) - ZLB=( ZA*ZCC*MOMG(ZALPHA,ZNU,ZB) )**(-ZLBEX) - ELSE - ZA=XAC_I - ZB=XBC_I - ZCC=XCONC_LAND - ZCX=0. - ZALPHA=XALPHAC_I - ZNU=XNUC_I - ZLBEX=1.0/(ZCX-ZB) - ZLB=( ZA*ZCC*MOMG(ZALPHA,ZNU,ZB) )**(-ZLBEX) - ENDIF - END SELECT - IF (JLOOP.EQ.5 .AND. ( (CCLOUD=='LIMA'.AND.LSNOW_T_L).OR. & + ! initialization CRARE and CRARE_ATT + LWC and IWC + TPROFILERS(JP)%XCRARE(IN,:) = 0. + TPROFILERS(JP)%XCRARE_ATT(IN,:) = 0. + TPROFILERS(JP)%XLWCZ (IN,:) = 0. + TPROFILERS(JP)%XIWCZ (IN,:) = 0. + IF (CCLOUD=="LIMA" .OR. CCLOUD=="ICE3" ) THEN ! only for ICE3 and LIMA + TPROFILERS(JP)%XLWCZ (IN,:) = STATPROF_INTERP_3D( TPROFILERS(JP), (PR(:,:,:,2)+PR(:,:,:,3))*PRHODREF(:,:,:) ) + TPROFILERS(JP)%XIWCZ (IN,:) = STATPROF_INTERP_3D( TPROFILERS(JP), (PR(:,:,:,4)+PR(:,:,:,5)+PR(:,:,:,6))*PRHODREF(:,:,:) ) + ZTEMPZ(:)=STATPROF_INTERP_3D( TPROFILERS(JP), ZTEMP(:,:,:) ) + ZRHODREFZ(:)=STATPROF_INTERP_3D( TPROFILERS(JP), PRHODREF(:,:,:) ) + ZCIT(:)=STATPROF_INTERP_3D( TPROFILERS(JP), PCIT(:,:,:) ) + IF (CCLOUD=="LIMA") THEN + ZCCI(:)=STATPROF_INTERP_3D( TPROFILERS(JP), PSV(:,:,:,NSV_LIMA_NI) ) + ZCCR(:)=STATPROF_INTERP_3D( TPROFILERS(JP), PSV(:,:,:,NSV_LIMA_NR) ) + ZCCC(:)=STATPROF_INTERP_3D( TPROFILERS(JP), PSV(:,:,:,NSV_LIMA_NC) ) + END IF + DO JLOOP=3,6 + ZRZ(:,JLOOP)=STATPROF_INTERP_3D( TPROFILERS(JP), PR(:,:,:,JLOOP) ) + END DO + IF (CSURF=="EXTE") THEN + DO JK=1,IKU + ZRZ(JK,2)=STATPROF_INTERP_2D( TPROFILERS(JP), PR(:,:,JK,2)*PSEA(:,:) ) ! becomes cloud mixing ratio over sea + ZRZ(JK,7)=STATPROF_INTERP_2D( TPROFILERS(JP), PR(:,:,JK,2)*(1.-PSEA(:,:)) ) ! becomes cloud mixing ratio over land + END DO + ELSE + ZRZ(:,2)=STATPROF_INTERP_3D( TPROFILERS(JP), PR(:,:,:,2) ) + ZRZ(:,7)=0. + END IF + ALLOCATE(ZAELOC(IKU)) + ! + ZAELOC(:)=0. + ! initialization of quadrature points and weights + ALLOCATE(ZX(JPTS_GAULAG),ZW(JPTS_GAULAG)) + CALL GAULAG(JPTS_GAULAG,ZX,ZW) ! for integration over diameters + ! initialize minimum values + ALLOCATE(ZRTMIN(SIZE(PR,4)+1)) + IF (CCLOUD == 'LIMA') THEN + ZRTMIN(2)=XRTMIN_L(2) ! cloud water over sea + ZRTMIN(3)=XRTMIN_L(3) + ZRTMIN(4)=XRTMIN_L(4) + ZRTMIN(5)=1E-10 + ZRTMIN(6)=XRTMIN_L(6) + ZRTMIN(7)=XRTMIN_L(2) ! cloud water over land + ELSE + ZRTMIN(2)=XRTMIN_I(2) ! cloud water over sea + ZRTMIN(3)=XRTMIN_I(3) + ZRTMIN(4)=XRTMIN_I(4) + ZRTMIN(5)=1E-10 + ZRTMIN(6)=XRTMIN_I(6) + ZRTMIN(7)=XRTMIN_I(2) ! cloud water over land + END IF + ! compute cloud radar reflectivity from vertical profiles of temperature + ! and mixing ratios + DO JK=1,IKU + QMW=SQRT(QEPSW(ZTEMPZ(JK),XLIGHTSPEED/XLAM_CRAD)) + QMI=SQRT(QEPSI(ZTEMPZ(JK),XLIGHTSPEED/XLAM_CRAD)) + DO JLOOP=2,7 + IF (CCLOUD == 'LIMA') THEN + GCALC=(ZRZ(JK,JLOOP)>ZRTMIN(JLOOP).AND.(JLOOP.NE.4.OR.ZCCI(JK)>0.).AND.& + (JLOOP.NE.3.OR.ZCCR(JK)>0.).AND.((JLOOP.NE.2.AND.JLOOP.NE.7).OR.ZCCC(JK)>0.)) + ELSE + GCALC=(ZRZ(JK,JLOOP)>ZRTMIN(JLOOP).AND.(JLOOP.NE.4.OR.ZCIT(JK)>0.)) + END IF + IF (GCALC) THEN + SELECT CASE(JLOOP) + CASE(2) ! cloud water over sea + IF (CCLOUD == 'LIMA') THEN + ZA=XAC_L + ZB=XBC_L + ZCC=ZCCC(JK)*ZRHODREFZ(JK) + ZCX=0. + ZALPHA=XALPHAC_L + ZNU=XNUC_L + ZLBEX=1.0/(ZCX-ZB) + ZLB=( ZA*ZCC*MOMG(ZALPHA,ZNU,ZB) )**(-ZLBEX) + ELSE + ZA=XAC_I + ZB=XBC_I + ZCC=XCONC_SEA + ZCX=0. + ZALPHA=XALPHAC2_I + ZNU=XNUC2_I + ZLBEX=1.0/(ZCX-ZB) + ZLB=( ZA*ZCC*MOMG(ZALPHA,ZNU,ZB) )**(-ZLBEX) + END IF + CASE(3) ! rain water + IF (CCLOUD == 'LIMA') THEN + ZA=XAR_L + ZB=XBR_L + ZCC=ZCCR(JK)*ZRHODREFZ(JK) + ZCX=0. + ZALPHA=XALPHAR_L + ZNU=XNUR_L + ZLBEX=1.0/(ZCX-ZB) + ZLB=( ZA*ZCC*MOMG(ZALPHA,ZNU,ZB) )**(-ZLBEX) + ELSE + ZA=XAR_I + ZB=XBR_I + ZCC=XCCR_I + ZCX=-1. + ZALPHA=XALPHAR_I + ZNU=XNUR_I + ZLB=XLBR_I + ZLBEX=XLBEXR_I + END IF + CASE(4) ! pristine ice + IF (CCLOUD == 'LIMA') THEN + ZA=XAI_L + ZB=XBI_L + ZCC=ZCCI(JK)*ZRHODREFZ(JK) + ZCX=0. + ZALPHA=XALPHAI_L + ZNU=XNUI_L + ZLBEX=1.0/(ZCX-ZB) + ZLB=( ZA*ZCC*MOMG(ZALPHA,ZNU,ZB) )**(-ZLBEX) ! because ZCC not included in XLBI + ZFW=0 + ELSE + ZA=XAI_I + ZB=XBI_I + ZCC=ZCIT(JK) + ZCX=0. + ZALPHA=XALPHAI_I + ZNU=XNUI_I + ZLBEX=XLBEXI_I + ZLB=XLBI_I*ZCC**(-ZLBEX) ! because ZCC not included in XLBI + ZFW=0 + END IF + CASE(5) ! snow + IF (CCLOUD == 'LIMA') THEN + ZA=XAS_L + ZB=XBS_L + ZCC=XCCS_L + ZCX=XCXS_L + ZALPHA=XALPHAS_L + ZNU=XNUS_L + ZNS=XNS_L + ZLB=XLBS_L + ZLBEX=XLBEXS_L + ZFW=0 + ELSE + ZA=XAS_I + ZB=XBS_I + ZCC=XCCS_I + ZCX=XCXS_I + ZALPHA=XALPHAS_I + ZNU=XNUS_I + ZNS=XNS_I + ZLB=XLBS_I + ZLBEX=XLBEXS_I + ZFW=0 + END IF + CASE(6) ! graupel + !If temperature between -10 and 10B0C and Mr and Mg over min + !threshold: melting graupel + ! with liquid water fraction Fw=Mr/(Mr+Mg) else dry graupel + ! (Fw=0) + IF( ZTEMPZ(JK) > XTT-10 .AND. ZTEMPZ(JK) < XTT+10 & + .AND. ZRZ(JK,3) > ZRTMIN(3) ) THEN + ZFW=ZRZ(JK,3)/(ZRZ(JK,3)+ZRZ(JK,JLOOP)) + ELSE + ZFW=0 + END IF + IF (CCLOUD == 'LIMA') THEN + ZA=XAG_L + ZB=XBG_L + ZCC=XCCG_L + ZCX=XCXG_L + ZALPHA=XALPHAG_L + ZNU=XNUG_L + ZLB=XLBG_L + ZLBEX=XLBEXG_L + ELSE + ZA=XAG_I + ZB=XBG_I + ZCC=XCCG_I + ZCX=XCXG_I + ZALPHA=XALPHAG_I + ZNU=XNUG_I + ZLB=XLBG_I + ZLBEX=XLBEXG_I + END IF + CASE(7) ! cloud water over land + IF (CCLOUD == 'LIMA') THEN + ZA=XAC_L + ZB=XBC_L + ZCC=ZCCC(JK)*ZRHODREFZ(JK) + ZCX=0. + ZALPHA=XALPHAC_L + ZNU=XNUC_L + ZLBEX=1.0/(ZCX-ZB) + ZLB=( ZA*ZCC*MOMG(ZALPHA,ZNU,ZB) )**(-ZLBEX) + ELSE + ZA=XAC_I + ZB=XBC_I + ZCC=XCONC_LAND + ZCX=0. + ZALPHA=XALPHAC_I + ZNU=XNUC_I + ZLBEX=1.0/(ZCX-ZB) + ZLB=( ZA*ZCC*MOMG(ZALPHA,ZNU,ZB) )**(-ZLBEX) + END IF + END SELECT + IF ( JLOOP == 5 .AND. ( (CCLOUD=='LIMA'.AND.LSNOW_T_L).OR. & (CCLOUD=='ICE3'.AND.LSNOW_T_I) ) ) THEN - IF (ZTEMPZ(JK)>-10.) THEN - ZLBDA = MAX(MIN(XLBDAS_MAX, 10**(14.554-0.0423*(ZTEMPZ(JK)+273.15))),XLBDAS_MIN) - ELSE - ZLBDA = MAX(MIN(XLBDAS_MAX, 10**(6.226-0.0106*(ZTEMPZ(JK)+273.15))),XLBDAS_MIN) - END IF - ZN=ZNS*ZRHODREFZ(JK)*ZRZ(JK,JLOOP)*ZLBDA**ZB + IF (ZTEMPZ(JK)>-10.) THEN + ZLBDA = MAX(MIN(XLBDAS_MAX, 10**(14.554-0.0423*(ZTEMPZ(JK)+273.15))),XLBDAS_MIN) ELSE - ZLBDA=ZLB*(ZRHODREFZ(JK)*ZRZ(JK,JLOOP))**ZLBEX - ZN=ZCC*ZLBDA**ZCX + ZLBDA = MAX(MIN(XLBDAS_MAX, 10**(6.226-0.0106*(ZTEMPZ(JK)+273.15))),XLBDAS_MIN) END IF - ZREFLOC=0. - ZAETMP=0. - DO JJ=1,JPTS_GAULAG ! Gauss-Laguerre quadrature - ZDELTA_EQUIV=ZX(JJ)**(1./ZALPHA)/ZLBDA - SELECT CASE(JLOOP) - CASE(2,3,7) - QM=QMW - CASE(4,5,6) - ! pristine ice, snow, dry graupel - ZRHOHYD=MIN(6.*ZA*ZDELTA_EQUIV**(ZB-3.)/XPI,.92*XRHOLW) - QM=sqrt(MG(QMI**2,CMPLX(1,0),ZRHOHYD/.92/XRHOLW)) - ! water inclusions in ice in air - QEPSWI=MG(QMW**2,QM**2,ZFW) - ! ice in air inclusions in water - QEPSIW=MG(QM**2,QMW**2,1.-ZFW) - !MG weighted rule (Matrosov 2008) - IF(ZFW .LT. 0.37) THEN - ZFPW=0 - ELSE IF(ZFW .GT. 0.63) THEN - ZFPW=1 - ELSE - ZFPW=(ZFW-0.37)/(0.63-0.37) - ENDIF - QM=sqrt(QEPSWI*(1.-ZFPW)+QEPSIW*ZFPW) - END SELECT - CALL BHMIE(XPI/XLAM_CRAD*ZDELTA_EQUIV,QM,ZQEXT,ZQSCA,ZQBACK) - ZREFLOC=ZREFLOC+ZQBACK*ZX(JJ)**(ZNU-1)*ZDELTA_EQUIV**2*ZW(JJ) - ZAETMP =ZAETMP +ZQEXT *ZX(JJ)**(ZNU-1)*ZDELTA_EQUIV**2*ZW(JJ) - END DO - ZREFLOC=ZREFLOC*(XLAM_CRAD/XPI)**4*ZN/(4.*GAMMA(ZNU)*.93) - ZAETMP=ZAETMP * XPI *ZN/(4.*GAMMA(ZNU)) - TPROFILER%CRARE(IN,JK,I)=TPROFILER%CRARE(IN,JK,I)+ZREFLOC - ZAELOC(JK)=ZAELOC(JK)+ZAETMP - END IF - END DO - END DO - ! apply attenuation - ALLOCATE(ZZMZ(IKU)) - ZZMZ = ZZ(:) ! PROFILER_INTERP(ZZM(:,:,:)) + ZN=ZNS*ZRHODREFZ(JK)*ZRZ(JK,JLOOP)*ZLBDA**ZB + ELSE + ZLBDA=ZLB*(ZRHODREFZ(JK)*ZRZ(JK,JLOOP))**ZLBEX + ZN=ZCC*ZLBDA**ZCX + END IF + ZREFLOC=0. + ZAETMP=0. + DO JJ=1,JPTS_GAULAG ! Gauss-Laguerre quadrature + ZDELTA_EQUIV=ZX(JJ)**(1./ZALPHA)/ZLBDA + SELECT CASE(JLOOP) + CASE(2,3,7) + QM=QMW + CASE(4,5,6) + ! pristine ice, snow, dry graupel + ZRHOHYD=MIN(6.*ZA*ZDELTA_EQUIV**(ZB-3.)/XPI,.92*XRHOLW) + QM=sqrt(MG(QMI**2,CMPLX(1,0),ZRHOHYD/.92/XRHOLW)) + ! water inclusions in ice in air + QEPSWI=MG(QMW**2,QM**2,ZFW) + ! ice in air inclusions in water + QEPSIW=MG(QM**2,QMW**2,1.-ZFW) + !MG weighted rule (Matrosov 2008) + IF(ZFW .LT. 0.37) THEN + ZFPW=0 + ELSE IF(ZFW .GT. 0.63) THEN + ZFPW=1 + ELSE + ZFPW=(ZFW-0.37)/(0.63-0.37) + ENDIF + QM=sqrt(QEPSWI*(1.-ZFPW)+QEPSIW*ZFPW) + END SELECT + CALL BHMIE(XPI/XLAM_CRAD*ZDELTA_EQUIV,QM,ZQEXT,ZQSCA,ZQBACK) + ZREFLOC=ZREFLOC+ZQBACK*ZX(JJ)**(ZNU-1)*ZDELTA_EQUIV**2*ZW(JJ) + ZAETMP =ZAETMP +ZQEXT *ZX(JJ)**(ZNU-1)*ZDELTA_EQUIV**2*ZW(JJ) + END DO + ZREFLOC=ZREFLOC*(XLAM_CRAD/XPI)**4*ZN/(4.*GAMMA(ZNU)*.93) + ZAETMP=ZAETMP * XPI *ZN/(4.*GAMMA(ZNU)) + TPROFILERS(JP)%XCRARE(IN,JK)=TPROFILERS(JP)%XCRARE(IN,JK)+ZREFLOC + ZAELOC(JK)=ZAELOC(JK)+ZAETMP + END IF + END DO + END DO + ! apply attenuation + ALLOCATE(ZZMZ(IKU)) + ZZMZ = ZZ(:) ! STATPROF_INTERP_3D( TPROFILERS(JP), ZZM(:,:,:) ) ! ZZMZ(1)=ZZM_STAT - ! zenith - ZAETOT=1. - DO JK = 2,IKU - ! attenuation from ZAELOC(JK) and ZAELOC(JK-1) - ZAETOT=ZAETOT*EXP(-(ZAELOC(JK-1)+ZAELOC(JK))*(ZZMZ(JK)-ZZMZ(JK-1))) - TPROFILER%CRARE_ATT(IN,JK,I)=TPROFILER%CRARE(IN,JK,I)*ZAETOT - END DO -! TPROFILER%ZZ (IN,:,I) = ZZMZ(:) - DEALLOCATE(ZZMZ,ZAELOC) - ! m^3 bmm^6/m^3 bdBZ - WHERE(TPROFILER%CRARE(IN,:,I)>0) - TPROFILER%CRARE(IN,:,I)=10.*LOG10(1.E18*TPROFILER%CRARE(IN,:,I)) - ELSEWHERE - TPROFILER%CRARE(IN,:,I)=XUNDEF - END WHERE - WHERE(TPROFILER%CRARE_ATT(IN,:,I)>0) - TPROFILER%CRARE_ATT(IN,:,I)=10.*LOG10(1.E18*TPROFILER%CRARE_ATT(IN,:,I)) - ELSEWHERE - TPROFILER%CRARE_ATT(IN,:,I)=XUNDEF - END WHERE - DEALLOCATE(ZX,ZW,ZRTMIN) - END IF ! end LOOP ICE3 + ! zenith + ZAETOT=1. + DO JK = 2,IKU + ! attenuation from ZAELOC(JK) and ZAELOC(JK-1) + ZAETOT=ZAETOT*EXP(-(ZAELOC(JK-1)+ZAELOC(JK))*(ZZMZ(JK)-ZZMZ(JK-1))) + TPROFILERS(JP)%XCRARE_ATT(IN,JK)=TPROFILERS(JP)%XCRARE(IN,JK)*ZAETOT + END DO + DEALLOCATE(ZZMZ,ZAELOC) + ! m^3 b mm^6/m^3 b dBZ + WHERE(TPROFILERS(JP)%XCRARE(IN,:)>0) + TPROFILERS(JP)%XCRARE(IN,:)=10.*LOG10(1.E18*TPROFILERS(JP)%XCRARE(IN,:)) + ELSEWHERE + TPROFILERS(JP)%XCRARE(IN,:)=XUNDEF + END WHERE + WHERE(TPROFILERS(JP)%XCRARE_ATT(IN,:)>0) + TPROFILERS(JP)%XCRARE_ATT(IN,:)=10.*LOG10(1.E18*TPROFILERS(JP)%XCRARE_ATT(IN,:)) + ELSEWHERE + TPROFILERS(JP)%XCRARE_ATT(IN,:)=XUNDEF + END WHERE + DEALLOCATE(ZX,ZW,ZRTMIN) + END IF ! end LOOP ICE3 ! end add RARE !! - IF (.NOT. L1D) THEN - TPROFILER%P (IN,:,I) = PROFILER_INTERP(PP(II(I):II(I)+1,IJ(I):IJ(I)+1,:)) - ELSE - TPROFILER%P (IN,:,I) = PROFILER_INTERP(PP) - END IF - ! - DO JSV=1,SIZE(PR,4) - TPROFILER%R (IN,:,I,JSV) = PROFILER_INTERP(PR(:,:,:,JSV)) - END DO - ZWORK(:,:,:,:)=PSV(:,:,:,:) - ZWORK(:,:,1,:)=PSV(:,:,2,:) - DO JSV=1,SIZE(PSV,4) - TPROFILER%SV (IN,:,I,JSV) = PROFILER_INTERP(ZWORK(:,:,:,JSV)) - END DO - ZWORK2(:,:,:,:) = 0. - DO JK=IKB,IKE - IKRAD = JK - JPVEXT - ZWORK2(:,:,JK,:)=PAER(:,:,IKRAD,:) - ENDDO - DO JSV=1,SIZE(PAER,4) - TPROFILER%AER(IN,:,I,JSV) = PROFILER_INTERP(ZWORK2(:,:,:,JSV)) - ENDDO - IF (SIZE(PTKE)>0) TPROFILER%TKE (IN,:,I) = PROFILER_INTERP(PTKE) - ! - IF (LDIAG_IN_RUN) THEN - TPROFILER%T2M (IN,I) = PROFILER_INTERP_2D(XCURRENT_T2M ) - TPROFILER%Q2M (IN,I) = PROFILER_INTERP_2D(XCURRENT_Q2M ) - TPROFILER%HU2M (IN,I) = PROFILER_INTERP_2D(XCURRENT_HU2M ) - TPROFILER%ZON10M(IN,I) = PROFILER_INTERP_2D(XCURRENT_ZON10M) - TPROFILER%MER10M(IN,I) = PROFILER_INTERP_2D(XCURRENT_MER10M) - TPROFILER%RN (IN,I) = PROFILER_INTERP_2D(XCURRENT_RN ) - TPROFILER%H (IN,I) = PROFILER_INTERP_2D(XCURRENT_H ) - TPROFILER%LE (IN,I) = PROFILER_INTERP_2D(XCURRENT_LE ) - TPROFILER%LEI (IN,I) = PROFILER_INTERP_2D(XCURRENT_LEI ) - TPROFILER%GFLUX (IN,I) = PROFILER_INTERP_2D(XCURRENT_GFLUX ) - IF (CRAD /= 'NONE') THEN - TPROFILER%SWD (IN,I) = PROFILER_INTERP_2D(XCURRENT_SWD ) - TPROFILER%SWU (IN,I) = PROFILER_INTERP_2D(XCURRENT_SWU ) - TPROFILER%LWD (IN,I) = PROFILER_INTERP_2D(XCURRENT_LWD ) - TPROFILER%LWU (IN,I) = PROFILER_INTERP_2D(XCURRENT_LWU ) - END IF - TPROFILER%TKE_DISS(IN,:,I) = PROFILER_INTERP(XCURRENT_TKE_DISS) - ENDIF - ENDIF -! -!---------------------------------------------------------------------------- -! -!* 11. EXCHANGE OF INFORMATION BETWEEN PROCESSORS -! ------------------------------------------ -! -!* 11.2 data stored -! ----------- -! - CALL DISTRIBUTE_PROFILER(TPROFILER%X (I)) - CALL DISTRIBUTE_PROFILER(TPROFILER%Y (I)) - CALL DISTRIBUTE_PROFILER(TPROFILER%LON (I)) - CALL DISTRIBUTE_PROFILER(TPROFILER%LAT (I)) - ! - IF (LDIAG_IN_RUN) THEN - CALL DISTRIBUTE_PROFILER(TPROFILER%T2M (IN,I)) - CALL DISTRIBUTE_PROFILER(TPROFILER%Q2M (IN,I)) - CALL DISTRIBUTE_PROFILER(TPROFILER%HU2M (IN,I)) - CALL DISTRIBUTE_PROFILER(TPROFILER%ZON10M(IN,I)) - CALL DISTRIBUTE_PROFILER(TPROFILER%MER10M(IN,I)) - CALL DISTRIBUTE_PROFILER(TPROFILER%RN (IN,I)) - CALL DISTRIBUTE_PROFILER(TPROFILER%H (IN,I)) - CALL DISTRIBUTE_PROFILER(TPROFILER%LE (IN,I)) - CALL DISTRIBUTE_PROFILER(TPROFILER%LEI (IN,I)) - CALL DISTRIBUTE_PROFILER(TPROFILER%GFLUX (IN,I)) - IF (CRAD /= 'NONE') THEN - CALL DISTRIBUTE_PROFILER(TPROFILER%LWD (IN,I)) - CALL DISTRIBUTE_PROFILER(TPROFILER%LWU (IN,I)) - CALL DISTRIBUTE_PROFILER(TPROFILER%SWD (IN,I)) - CALL DISTRIBUTE_PROFILER(TPROFILER%SWU (IN,I)) - ENDIF - ENDIF - DO JK=1,IKU - CALL DISTRIBUTE_PROFILER(TPROFILER%ZON (IN,JK,I)) - CALL DISTRIBUTE_PROFILER(TPROFILER%MER (IN,JK,I)) - CALL DISTRIBUTE_PROFILER(TPROFILER%FF (IN,JK,I)) - CALL DISTRIBUTE_PROFILER(TPROFILER%DD (IN,JK,I)) - CALL DISTRIBUTE_PROFILER(TPROFILER%W (IN,JK,I)) - CALL DISTRIBUTE_PROFILER(TPROFILER%P (IN,JK,I)) - CALL DISTRIBUTE_PROFILER(TPROFILER%ZZ (IN,JK,I)) - CALL DISTRIBUTE_PROFILER(TPROFILER%TH (IN,JK,I)) - CALL DISTRIBUTE_PROFILER(TPROFILER%THV (IN,JK,I)) - CALL DISTRIBUTE_PROFILER(TPROFILER%VISI(IN,JK,I)) - CALL DISTRIBUTE_PROFILER(TPROFILER%VISIKUN(IN,JK,I)) - CALL DISTRIBUTE_PROFILER(TPROFILER%RHOD(IN,JK,I)) - CALL DISTRIBUTE_PROFILER(TPROFILER%CRARE(IN,JK,I)) - CALL DISTRIBUTE_PROFILER(TPROFILER%CRARE_ATT(IN,JK,I)) - CALL DISTRIBUTE_PROFILER(TPROFILER%CIZ(IN,JK,I)) - - ! - IF (LDIAG_IN_RUN) CALL DISTRIBUTE_PROFILER(TPROFILER%TKE_DISS(IN,JK,I)) + TPROFILERS(JP)%XP (IN,:) = STATPROF_INTERP_3D( TPROFILERS(JP), PP ) ! DO JSV=1,SIZE(PR,4) - CALL DISTRIBUTE_PROFILER(TPROFILER%R (IN,JK,I,JSV)) + TPROFILERS(JP)%XR (IN,:,JSV) = STATPROF_INTERP_3D( TPROFILERS(JP), PR(:,:,:,JSV) ) END DO + ZWORK(:,:,:,:)=PSV(:,:,:,:) + ZWORK(:,:,1,:)=PSV(:,:,2,:) DO JSV=1,SIZE(PSV,4) - CALL DISTRIBUTE_PROFILER(TPROFILER%SV (IN,JK,I,JSV)) + TPROFILERS(JP)%XSV (IN,:,JSV) = STATPROF_INTERP_3D( TPROFILERS(JP), ZWORK(:,:,:,JSV) ) END DO - IF (SIZE(PTKE)>0) CALL DISTRIBUTE_PROFILER(TPROFILER%TKE (IN,JK,I)) - ENDDO - - CALL DISTRIBUTE_PROFILER(TPROFILER%IWV(IN,I)) - CALL DISTRIBUTE_PROFILER(TPROFILER%ZTD(IN,I)) - CALL DISTRIBUTE_PROFILER(TPROFILER%ZHD(IN,I)) - CALL DISTRIBUTE_PROFILER(TPROFILER%ZWD(IN,I)) -ENDDO -! -END IF -! -!---------------------------------------------------------------------------- -!---------------------------------------------------------------------------- -! -CONTAINS -! -!---------------------------------------------------------------------------- -!---------------------------------------------------------------------------- -FUNCTION PROFILER_INTERP_2D(PA) RESULT(PB) -! -REAL, DIMENSION(:,:), INTENT(IN) :: PA -REAL :: PB -! -INTEGER :: JI, JJ -! -IF (SIZE(PA,1)==2) THEN - JI=1 - JJ=1 -ELSEIF (L1D) THEN - JI=2 - JJ=2 -ELSE - JI=II(I) - JJ=IJ(I) -END IF -! -! -PB = (1.-ZYCOEF(I)) * (1.-ZXCOEF(I)) * PA(JI,JJ) + & - (1.-ZYCOEF(I)) * (ZXCOEF(I)) * PA(JI+1,JJ) + & - ( ZYCOEF(I)) * (1.-ZXCOEF(I)) * PA(JI,JJ+1) + & - ( ZYCOEF(I)) * (ZXCOEF(I)) * PA(JI+1,JJ+1) -! -END FUNCTION PROFILER_INTERP_2D -!---------------------------------------------------------------------------- -!---------------------------------------------------------------------------- -FUNCTION PROFILER_INTERP(PA) RESULT(PB) -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PA -REAL, DIMENSION(SIZE(PA,3)) :: PB -! -INTEGER :: JI, JJ,JK -! -IF (SIZE(PA,1)==2) THEN - JI=1 - JJ=1 -ELSEIF (L1D) THEN - JI=2 - JJ=2 -ELSE - JI=II(I) - JJ=IJ(I) -END IF -! -! -DO JK=1,SIZE(PA,3) - IF ( (PA(JI,JJ,JK) /= XUNDEF) .AND. (PA(JI+1,JJ,JK) /= XUNDEF) .AND. & - (PA(JI,JJ+1,JK) /= XUNDEF) .AND. (PA(JI+1,JJ+1,JK) /= XUNDEF) ) THEN - PB(JK) = (1.-ZYCOEF(I)) * (1.-ZXCOEF(I)) * PA(JI,JJ,JK) + & - (1.-ZYCOEF(I)) * (ZXCOEF(I)) * PA(JI+1,JJ,JK) + & - (ZYCOEF(I)) * (1.-ZXCOEF(I)) * PA(JI,JJ+1,JK) + & - (ZYCOEF(I)) * (ZXCOEF(I)) * PA(JI+1,JJ+1,JK) - ELSE - PB(JK) = XUNDEF - END IF -END DO -! -END FUNCTION PROFILER_INTERP -!---------------------------------------------------------------------------- -!---------------------------------------------------------------------------- -FUNCTION PROFILER_INTERP_U(PA) RESULT(PB) -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PA -REAL, DIMENSION(SIZE(PA,3)) :: PB -! -INTEGER :: JI, JJ -! -IF (SIZE(PA,1)==2) THEN - JI=1 - JJ=1 -ELSEIF (L1D) THEN - JI=2 - JJ=2 -ELSE - JI=IU(I) - JJ=IJ(I) -END IF -! -PB(:) = (1.- ZYCOEF(I)) * (1.-ZUCOEF(I)) * PA(JI ,JJ ,:) & - + (1.- ZYCOEF(I)) * ( ZUCOEF(I)) * PA(JI+1,JJ ,:) & - + ( ZYCOEF(I)) * (1.-ZUCOEF(I)) * PA(JI ,JJ+1,:) & - + ( ZYCOEF(I)) * ( ZUCOEF(I)) * PA(JI+1,JJ+1,:) -! -END FUNCTION PROFILER_INTERP_U -!---------------------------------------------------------------------------- -!---------------------------------------------------------------------------- -FUNCTION PROFILER_INTERP_V(PA) RESULT(PB) -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PA -REAL, DIMENSION(SIZE(PA,3)) :: PB -! -INTEGER :: JI, JJ -! -IF (SIZE(PA,1)==2) THEN - JI=1 - JJ=1 -ELSEIF (L1D) THEN - JI=2 - JJ=2 -ELSE - JI=II(I) - JJ=IV(I) -END IF -! -PB(:) = (1.- ZVCOEF(I)) * (1.-ZXCOEF(I)) * PA(JI ,JJ ,:) & - + (1.- ZVCOEF(I)) * ( ZXCOEF(I)) * PA(JI+1,JJ ,:) & - + ( ZVCOEF(I)) * (1.-ZXCOEF(I)) * PA(JI ,JJ+1,:) & - + ( ZVCOEF(I)) * ( ZXCOEF(I)) * PA(JI+1,JJ+1,:) -! -END FUNCTION PROFILER_INTERP_V -!---------------------------------------------------------------------------- -!---------------------------------------------------------------------------- -SUBROUTINE DISTRIBUTE_PROFILER(PAS) -! -REAL, INTENT(INOUT) :: PAS -! -PAS = PAS * ZTHIS_PROCS(I) - -CALL REDUCESUM_ll(PAS,IINFO_ll) + ZWORK2(:,:,:,:) = 0. + DO JK=IKB,IKE + IKRAD = JK - JPVEXT + ZWORK2(:,:,JK,:)=PAER(:,:,IKRAD,:) + END DO + DO JSV=1,SIZE(PAER,4) + TPROFILERS(JP)%XAER(IN,:,JSV) = STATPROF_INTERP_3D( TPROFILERS(JP), ZWORK2(:,:,:,JSV) ) + END DO + IF (SIZE(PTKE)>0) TPROFILERS(JP)%XTKE (IN,:) = STATPROF_INTERP_3D( TPROFILERS(JP), PTKE ) + ! + IF (LDIAG_IN_RUN) THEN + TPROFILERS(JP)%XT2M (IN) = STATPROF_INTERP_2D( TPROFILERS(JP), XCURRENT_T2M ) + TPROFILERS(JP)%XQ2M (IN) = STATPROF_INTERP_2D( TPROFILERS(JP), XCURRENT_Q2M ) + TPROFILERS(JP)%XHU2M (IN) = STATPROF_INTERP_2D( TPROFILERS(JP), XCURRENT_HU2M ) + TPROFILERS(JP)%XZON10M(IN) = STATPROF_INTERP_2D( TPROFILERS(JP), XCURRENT_ZON10M ) + TPROFILERS(JP)%XMER10M(IN) = STATPROF_INTERP_2D( TPROFILERS(JP), XCURRENT_MER10M ) + TPROFILERS(JP)%XRN (IN) = STATPROF_INTERP_2D( TPROFILERS(JP), XCURRENT_RN ) + TPROFILERS(JP)%XH (IN) = STATPROF_INTERP_2D( TPROFILERS(JP), XCURRENT_H ) + TPROFILERS(JP)%XLE (IN) = STATPROF_INTERP_2D( TPROFILERS(JP), XCURRENT_LE ) + TPROFILERS(JP)%XLEI (IN) = STATPROF_INTERP_2D( TPROFILERS(JP), XCURRENT_LEI ) + TPROFILERS(JP)%XGFLUX (IN) = STATPROF_INTERP_2D( TPROFILERS(JP), XCURRENT_GFLUX ) + IF (CRAD /= 'NONE') THEN + TPROFILERS(JP)%XSWD (IN) = STATPROF_INTERP_2D( TPROFILERS(JP), XCURRENT_SWD ) + TPROFILERS(JP)%XSWU (IN) = STATPROF_INTERP_2D( TPROFILERS(JP), XCURRENT_SWU ) + TPROFILERS(JP)%XLWD (IN) = STATPROF_INTERP_2D( TPROFILERS(JP), XCURRENT_LWD ) + TPROFILERS(JP)%XLWU (IN) = STATPROF_INTERP_2D( TPROFILERS(JP), XCURRENT_LWU ) + END IF + TPROFILERS(JP)%XTKE_DISS(IN,:) = STATPROF_INTERP_3D( TPROFILERS(JP), XCURRENT_TKE_DISS ) + END IF +END DO PROFILER ! -END SUBROUTINE DISTRIBUTE_PROFILER !---------------------------------------------------------------------------- ! END SUBROUTINE PROFILER_n diff --git a/src/MNH/qlap.f90 b/src/MNH/qlap.f90 index 24c49ab38f58702aec4c40a6996f0575a3d2f8e5..4502200a9da8c2bfd2a4174794fc8280afe874e6 100644 --- a/src/MNH/qlap.f90 +++ b/src/MNH/qlap.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1994-2023 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. @@ -17,12 +17,12 @@ IMPLICIT NONE CHARACTER (LEN=4), DIMENSION(2), INTENT(IN) :: HLBCX ! x-direction LBC type CHARACTER (LEN=4), DIMENSION(2), INTENT(IN) :: HLBCY ! y-direction LBC type ! - ! Metric coefficients: -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX ! d*xx -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY ! d*yy -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZX ! d*zx -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZY ! d*zy -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! d*zz + ! Metric coefficients: +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX ! d*xx +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY ! d*yy +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDZX ! d*zx +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDZY ! d*zy +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! d*zz ! REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! density of reference * J REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHETAV ! virtual potential temp. at time t @@ -138,12 +138,12 @@ IMPLICIT NONE CHARACTER (LEN=4), DIMENSION(2), INTENT(IN) :: HLBCX ! x-direction LBC type CHARACTER (LEN=4), DIMENSION(2), INTENT(IN) :: HLBCY ! y-direction LBC type ! - ! Metric coefficients: -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX ! d*xx -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY ! d*yy -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZX ! d*zx -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZY ! d*zy -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! d*zz + ! Metric coefficients: +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX ! d*xx +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY ! d*yy +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDZX ! d*zx +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDZY ! d*zy +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! d*zz ! REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! density of reference * J REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHETAV ! virtual potential temp. at time t diff --git a/src/MNH/radar_simulator.f90 b/src/MNH/radar_simulator.f90 index b855afc924ed0d8a391fc7d21a9d572158c6fd7f..d03bfb6571bbe080898d4b8396b266d560c68036 100644 --- a/src/MNH/radar_simulator.f90 +++ b/src/MNH/radar_simulator.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2004-2019 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2004-2022 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. @@ -204,8 +204,6 @@ REAL :: ZCLAT0,ZSLAT0 ! cos and sin REAL :: ZMAP ! Map factor REAL :: ZGAMMA,ZCOSG,ZSING ! angle of projection and its cos and sin values ! -REAL, DIMENSION(:), ALLOCATABLE :: ZXHATM ! X values of the mass points -REAL, DIMENSION(:), ALLOCATABLE :: ZYHATM ! Y values of the mass points REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZZM ! Z values of the mass points REAL, DIMENSION(:,:,:,:,:,:),ALLOCATABLE, TARGET :: ZT_RAY ! temperature interpolated along the rays REAL, DIMENSION(:,:,:,:,:,:),ALLOCATABLE, TARGET :: ZR_RAY ! rain mixing ratio interpolated along the rays @@ -519,16 +517,8 @@ ZSLAT0 = SIN(ZRDSDG*ZLAT0) ! ! Positions of the mass points in the MESO-NH conformal projection ! -ALLOCATE(ZXHATM(IIU)) -ALLOCATE(ZYHATM(IJU)) ALLOCATE(ZZM(IIU,IJU,IKU)) ! -ZXHATM(1:IIU-1) = .5*(XXHAT(1:IIU-1)+XXHAT(2:IIU)) -ZXHATM(IIU) = 2.*XXHAT(IIU)-ZXHATM(IIU-1) -! -ZYHATM(1:IJU-1) = .5*(XYHAT(1:IJU-1)+XYHAT(2:IJU)) -ZYHATM(IJU) = 2.*XYHAT(IJU)-ZYHATM(IJU-1) -! ZZM(:,:,1:IKU-1)= .5*(XZZ(:,:,1:IKU-1)+XZZ(:,:,2:IKU)) ZZM(:,:,IKU)= 2. * XZZ(:,:,IKU) - ZZM(:,:,IKU-1) ! @@ -626,7 +616,7 @@ DO JI=1,NBRAD ! first compute vertical position (height) ! compute the index of refraction at the radar gate boundaries CALL INTERPOL_BEAM(ZN(:,:,:),ZN1,ZX_RAY(JI,JEL,JAZ,JL,JH,JV),& - ZY_RAY(JI,JEL,JAZ,JL,JH,JV),ZZ_RAY(JI,JEL,JAZ,JL,JH,JV),ZXHATM(:),ZYHATM(:),ZZM(:,:,:)) + ZY_RAY(JI,JEL,JAZ,JL,JH,JV),ZZ_RAY(JI,JEL,JAZ,JL,JH,JV),XXHATM(:),XYHATM(:),ZZM(:,:,:)) IF(LREFR) ZN_RAY(JI,JEL,JAZ,JL,JH,JV)=(ZN1-1.)*1.E6 !LREFR: if true writes out refractivity (N ≡ (n − 1) × 106) IF(LDNDZ) THEN !LDNDZ: if true writes out vertical gradient of refractivity IF(JL==1) THEN @@ -654,7 +644,7 @@ DO JI=1,NBRAD ZDNDZ1=(ZN1-ZN0)/(ZZ_RAY(JI,JEL,JAZ,JL,1,1)-ZZ_RAY(JI,JEL,JAZ,JL-1,1,1)) ELSE ! for first gate DNDZ1 is the local value at radar CALL INTERPOL_BEAM(ZDNDZ(:,:,:),ZDNDZ1,ZX_RAY(JI,JEL,JAZ,JL,JH,JV),& - ZY_RAY(JI,JEL,JAZ,JL,JH,JV),ZZ_RAY(JI,JEL,JAZ,JL,JH,JV),ZXHATM(:),ZYHATM(:),ZZM(:,:,:)) + ZY_RAY(JI,JEL,JAZ,JL,JH,JV),ZZ_RAY(JI,JEL,JAZ,JL,JH,JV),XXHATM(:),XYHATM(:),ZZM(:,:,:)) END IF IF(ZDNDZ1>-ZN1/XRADIUS/COS(ZELEV(JI,JEL,JL,JV))) THEN ZKE=1./(1.+XRADIUS/ZN1*ZDNDZ1*COS(ZELEV(JI,JEL,JL,JV))) @@ -802,10 +792,10 @@ ENDIF !interpolation from TVARMOD to TVARRAD of the model variables in the radar projection, using the position (ZX_RAY, ZY_RAY, ZZ_RAY) !of the beam in the model grid CALL INTERPOL_BEAM(TVARMOD,TVARRAD,ZX_RAY(:,:,:,:,:,:),& - ZY_RAY(:,:,:,:,:,:),ZZ_RAY(:,:,:,:,:,:),ZXHATM(:),ZYHATM(:),ZZM(:,:,:)) + ZY_RAY(:,:,:,:,:,:),ZZ_RAY(:,:,:,:,:,:),XXHATM(:),XYHATM(:),ZZM(:,:,:)) ! DEALLOCATE(ZBU_MASK) -DEALLOCATE(ZXHATM,ZYHATM,ZZM) +DEALLOCATE(ZZM) DEALLOCATE(ZX_RAY,ZY_RAY) DEALLOCATE(TVARMOD,TVARRAD) ! diff --git a/src/MNH/radiations.f90 b/src/MNH/radiations.f90 index 67dba74ce1cb8bd2ac34828a4c76762d5c1056f1..5c0191e379d5870cb55395474020775638db9efe 100644 --- a/src/MNH/radiations.f90 +++ b/src/MNH/radiations.f90 @@ -134,7 +134,7 @@ USE MODD_CH_AEROSOL, ONLY: LORILAM USE MODD_CONF, ONLY: LCARTESIAN USE MODD_CST USE MODD_DUST, ONLY: LDUST -use modd_field, only: tfielddata, TYPEREAL +use modd_field, only: tfieldmetadata, TYPEREAL USE MODD_GRID , ONLY: XLAT0, XLON0 USE MODD_GRID_n , ONLY: XLAT, XLON USE MODD_IO, ONLY: TFILEDATA @@ -536,7 +536,7 @@ CHARACTER (LEN=2) :: YDIR ! Type of the data field INTEGER :: ISWB ! number of SW spectral bands (between radiations and surface schemes) INTEGER :: JSWB ! loop on SW spectral bands INTEGER :: JAE ! loop on aerosol class -TYPE(TFIELDDATA) :: TZFIELD +TYPE(TFIELDMeTaDATA) :: TZFIELD2D, TZFIELD3D ! REAL, DIMENSION(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3)) :: ZDZPABST REAL :: ZMINVAL @@ -898,7 +898,7 @@ IF (CAOP=='EXPL') THEN IF (LORILAM) THEN CALL AEROOPT_GET( & - PSVT(IIB:IIE,IJB:IJE,:,NSV_AERBEG:NSV_AEREND) & !I [ppp] aerosols concentration + PSVT(IIB:IIE,IJB:IJE,:,NSV_AERBEG:NSV_AEREND) & !I [ppv] aerosols concentration ,PZZ(IIB:IIE,IJB:IJE,:) & !I [m] height of layers ,PRHODREF(IIB:IIE,IJB:IJE,:) & !I [kg/m3] density of air ,ZPIZA_AER_TMP(IIB:IIE,IJB:IJE,IKB-JPVEXT:IKE-JPVEXT,:) & !O [-] single scattering albedo of aerosols @@ -912,7 +912,7 @@ IF (CAOP=='EXPL') THEN ENDIF IF(LDUST) THEN CALL DUSTOPT_GET( & - PSVT(IIB:IIE,IJB:IJE,:,NSV_DSTBEG:NSV_DSTEND) & !I [ppp] Dust scalar concentration + PSVT(IIB:IIE,IJB:IJE,:,NSV_DSTBEG:NSV_DSTEND) & !I [ppv] Dust scalar concentration ,PZZ(IIB:IIE,IJB:IJE,:) & !I [m] height of layers ,PRHODREF(IIB:IIE,IJB:IJE,:) & !I [kg/m3] density of air ,ZPIZA_DST_TMP(IIB:IIE,IJB:IJE,IKB-JPVEXT:IKE-JPVEXT,:) & !O [-] single scattering albedo of dust @@ -927,7 +927,7 @@ IF (CAOP=='EXPL') THEN ENDIF IF(LSALT) THEN CALL SALTOPT_GET( & - PSVT(IIB:IIE,IJB:IJE,:,NSV_SLTBEG:NSV_SLTEND) & !I [ppp] sea salt scalar concentration + PSVT(IIB:IIE,IJB:IJE,:,NSV_SLTBEG:NSV_SLTEND) & !I [ppv] sea salt scalar concentration ,PZZ(IIB:IIE,IJB:IJE,:) & !I [m] height of layers ,PRHODREF(IIB:IIE,IJB:IJE,:) & !I [kg/m3] density of air ,PTHT(IIB:IIE,IJB:IJE,:) & !I [K] potential temperature @@ -2686,6 +2686,24 @@ IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN ZSTORE_3D2(:,:,:) = 0.0 ZSTORE_2D(:,:) = 0.0 ! + TZFIELD2D = TFIELDMETADATA( & + CMNHNAME = 'generic 2D for radiations', & !Temporary name to ease identification + CSTDNAME = '', & + CDIR = 'XY', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) + + TZFIELD3D = TFIELDMETADATA( & + CMNHNAME = 'generic 3D for radiations', & !Temporary name to ease identification + CSTDNAME = '', & + CDIR = 'XY', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) + IF( KRAD_DIAG >= 1) THEN ! ILUOUT = TLUOUT%NLU @@ -2700,17 +2718,11 @@ IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN END DO END DO END DO - TZFIELD%CMNHNAME = 'SWF_DOWN' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'SWF_DOWN' - TZFIELD%CUNITS = 'W m-2' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_SWF_DOWN' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,ZSTORE_3D) + TZFIELD3D%CMNHNAME = 'SWF_DOWN' + TZFIELD3D%CLONGNAME = 'SWF_DOWN' + TZFIELD3D%CUNITS = 'W m-2' + TZFIELD3D%CCOMMENT = 'X_Y_Z_SWF_DOWN' + CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D) ! DO JK=IKB,IKE JKRAD = JK - JPVEXT @@ -2721,17 +2733,11 @@ IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN END DO END DO END DO - TZFIELD%CMNHNAME = 'SWF_UP' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'SWF_UP' - TZFIELD%CUNITS = 'W m-2' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_SWF_UP' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,ZSTORE_3D) + TZFIELD3D%CMNHNAME = 'SWF_UP' + TZFIELD3D%CLONGNAME = 'SWF_UP' + TZFIELD3D%CUNITS = 'W m-2' + TZFIELD3D%CCOMMENT = 'X_Y_Z_SWF_UP' + CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D) ! DO JK=IKB,IKE JKRAD = JK - JPVEXT @@ -2742,17 +2748,11 @@ IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN END DO END DO END DO - TZFIELD%CMNHNAME = 'LWF_DOWN' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'LWF_DOWN' - TZFIELD%CUNITS = 'W m-2' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_LWF_DOWN' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,ZSTORE_3D) + TZFIELD3D%CMNHNAME = 'LWF_DOWN' + TZFIELD3D%CLONGNAME = 'LWF_DOWN' + TZFIELD3D%CUNITS = 'W m-2' + TZFIELD3D%CCOMMENT = 'X_Y_Z_LWF_DOWN' + CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D) ! DO JK=IKB,IKE JKRAD = JK - JPVEXT @@ -2763,17 +2763,11 @@ IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN END DO END DO END DO - TZFIELD%CMNHNAME = 'LWF_UP' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'LWF_UP' - TZFIELD%CUNITS = 'W m-2' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_LWF_UP' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,ZSTORE_3D) + TZFIELD3D%CMNHNAME = 'LWF_UP' + TZFIELD3D%CLONGNAME = 'LWF_UP' + TZFIELD3D%CUNITS = 'W m-2' + TZFIELD3D%CCOMMENT = 'X_Y_Z_LWF_UP' + CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D) ! DO JK=IKB,IKE JKRAD = JK - JPVEXT @@ -2784,17 +2778,11 @@ IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN END DO END DO END DO - TZFIELD%CMNHNAME = 'LWF_NET' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'LWF_NET' - TZFIELD%CUNITS = 'W m-2' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_LWF_NET' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,ZSTORE_3D) + TZFIELD3D%CMNHNAME = 'LWF_NET' + TZFIELD3D%CLONGNAME = 'LWF_NET' + TZFIELD3D%CUNITS = 'W m-2' + TZFIELD3D%CCOMMENT = 'X_Y_Z_LWF_NET' + CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D) ! DO JK=IKB,IKE JKRAD = JK - JPVEXT @@ -2805,17 +2793,11 @@ IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN END DO END DO END DO - TZFIELD%CMNHNAME = 'SWF_NET' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'SWF_NET' - TZFIELD%CUNITS = 'W m-2' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_SWF_NET' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,ZSTORE_3D) + TZFIELD3D%CMNHNAME = 'SWF_NET' + TZFIELD3D%CLONGNAME = 'SWF_NET' + TZFIELD3D%CUNITS = 'W m-2' + TZFIELD3D%CCOMMENT = 'X_Y_Z_SWF_NET' + CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D) ! DO JK=IKB,IKE DO JJ=IJB,IJE @@ -2824,17 +2806,11 @@ IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN END DO END DO END DO - TZFIELD%CMNHNAME = 'DTRAD_LW' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'DTRAD_LW' - TZFIELD%CUNITS = 'K day-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_DTRAD_LW' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,ZSTORE_3D) + TZFIELD3D%CMNHNAME = 'DTRAD_LW' + TZFIELD3D%CLONGNAME = 'DTRAD_LW' + TZFIELD3D%CUNITS = 'K day-1' + TZFIELD3D%CCOMMENT = 'X_Y_Z_DTRAD_LW' + CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D) ! DO JK=IKB,IKE DO JJ=IJB,IJE @@ -2843,17 +2819,11 @@ IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN END DO END DO END DO - TZFIELD%CMNHNAME = 'DTRAD_SW' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'DTRAD_SW' - TZFIELD%CUNITS = 'K day-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_DTRAD_SW' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,ZSTORE_3D) + TZFIELD3D%CMNHNAME = 'DTRAD_SW' + TZFIELD3D%CLONGNAME = 'DTRAD_SW' + TZFIELD3D%CUNITS = 'K day-1' + TZFIELD3D%CCOMMENT = 'X_Y_Z_DTRAD_SW' + CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D) ! DO JJ=IJB,IJE DO JI=IIB,IIE @@ -2861,17 +2831,11 @@ IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN ZSTORE_2D(JI,JJ) = ZFLUX_TOP_GND_IRVISNIR(IIJ,5) END DO END DO - TZFIELD%CMNHNAME = 'RADSWD_VIS' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'RADSWD_VIS' - TZFIELD%CUNITS = '' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_RADSWD_VIS' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 2 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,ZSTORE_2D) + TZFIELD2D%CMNHNAME = 'RADSWD_VIS' + TZFIELD2D%CLONGNAME = 'RADSWD_VIS' + TZFIELD2D%CUNITS = '' + TZFIELD2D%CCOMMENT = 'X_Y_RADSWD_VIS' + CALL IO_Field_write(TPFILE,TZFIELD2D,ZSTORE_2D) ! DO JJ=IJB,IJE DO JI=IIB,IIE @@ -2879,17 +2843,11 @@ IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN ZSTORE_2D(JI,JJ) = ZFLUX_TOP_GND_IRVISNIR(IIJ,6) END DO END DO - TZFIELD%CMNHNAME = 'RADSWD_NIR' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'RADSWD_NIR' - TZFIELD%CUNITS = '' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_RADSWD_NIR' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 2 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,ZSTORE_2D) + TZFIELD2D%CMNHNAME = 'RADSWD_NIR' + TZFIELD2D%CLONGNAME = 'RADSWD_NIR' + TZFIELD2D%CUNITS = '' + TZFIELD2D%CCOMMENT = 'X_Y_RADSWD_NIR' + CALL IO_Field_write(TPFILE,TZFIELD2D,ZSTORE_2D) ! DO JJ=IJB,IJE DO JI=IIB,IIE @@ -2897,17 +2855,11 @@ IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN ZSTORE_2D(JI,JJ) = ZFLUX_TOP_GND_IRVISNIR(IIJ,4) END DO END DO - TZFIELD%CMNHNAME = 'RADLWD' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'RADLWD' - TZFIELD%CUNITS = '' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_RADLWD' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 2 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,ZSTORE_2D) + TZFIELD2D%CMNHNAME = 'RADLWD' + TZFIELD2D%CLONGNAME = 'RADLWD' + TZFIELD2D%CUNITS = '' + TZFIELD2D%CCOMMENT = 'X_Y_RADLWD' + CALL IO_Field_write(TPFILE,TZFIELD2D,ZSTORE_2D) END IF ! ! @@ -2921,17 +2873,11 @@ IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN END DO END DO END DO - TZFIELD%CMNHNAME = 'SWF_DOWN_CS' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'SWF_DOWN_CS' - TZFIELD%CUNITS = 'W m-2' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_SWF_DOWN_CS' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,ZSTORE_3D) + TZFIELD3D%CMNHNAME = 'SWF_DOWN_CS' + TZFIELD3D%CLONGNAME = 'SWF_DOWN_CS' + TZFIELD3D%CUNITS = 'W m-2' + TZFIELD3D%CCOMMENT = 'X_Y_Z_SWF_DOWN_CS' + CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D) ! DO JK=IKB,IKE JKRAD = JK - JPVEXT @@ -2942,17 +2888,11 @@ IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN END DO END DO END DO - TZFIELD%CMNHNAME = 'SWF_UP_CS' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'SWF_UP_CS' - TZFIELD%CUNITS = 'W m-2' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_SWF_UP_CS' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,ZSTORE_3D) + TZFIELD3D%CMNHNAME = 'SWF_UP_CS' + TZFIELD3D%CLONGNAME = 'SWF_UP_CS' + TZFIELD3D%CUNITS = 'W m-2' + TZFIELD3D%CCOMMENT = 'X_Y_Z_SWF_UP_CS' + CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D) ! DO JK=IKB,IKE JKRAD = JK - JPVEXT @@ -2963,17 +2903,11 @@ IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN END DO END DO END DO - TZFIELD%CMNHNAME = 'LWF_DOWN_CS' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'LWF_DOWN_CS' - TZFIELD%CUNITS = 'W m-2' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_LWF_DOWN_CS' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,ZSTORE_3D) + TZFIELD3D%CMNHNAME = 'LWF_DOWN_CS' + TZFIELD3D%CLONGNAME = 'LWF_DOWN_CS' + TZFIELD3D%CUNITS = 'W m-2' + TZFIELD3D%CCOMMENT = 'X_Y_Z_LWF_DOWN_CS' + CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D) ! DO JK=IKB,IKE JKRAD = JK - JPVEXT @@ -2984,17 +2918,11 @@ IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN END DO END DO END DO - TZFIELD%CMNHNAME = 'LWF_UP_CS' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'LWF_UP_CS' - TZFIELD%CUNITS = 'W m-2' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_LWF_UP_CS' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,ZSTORE_3D) + TZFIELD3D%CMNHNAME = 'LWF_UP_CS' + TZFIELD3D%CLONGNAME = 'LWF_UP_CS' + TZFIELD3D%CUNITS = 'W m-2' + TZFIELD3D%CCOMMENT = 'X_Y_Z_LWF_UP_CS' + CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D) ! DO JK=IKB,IKE JKRAD = JK - JPVEXT @@ -3005,17 +2933,11 @@ IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN END DO END DO END DO - TZFIELD%CMNHNAME = 'LWF_NET_CS' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'LWF_NET_CS' - TZFIELD%CUNITS = 'W m-2' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_LWF_NET_CS' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,ZSTORE_3D) + TZFIELD3D%CMNHNAME = 'LWF_NET_CS' + TZFIELD3D%CLONGNAME = 'LWF_NET_CS' + TZFIELD3D%CUNITS = 'W m-2' + TZFIELD3D%CCOMMENT = 'X_Y_Z_LWF_NET_CS' + CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D) ! DO JK=IKB,IKE JKRAD = JK - JPVEXT @@ -3026,17 +2948,11 @@ IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN END DO END DO END DO - TZFIELD%CMNHNAME = 'SWF_NET_CS' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'SWF_NET_CS' - TZFIELD%CUNITS = 'W m-2' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_SWF_NET_CS' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,ZSTORE_3D) + TZFIELD3D%CMNHNAME = 'SWF_NET_CS' + TZFIELD3D%CLONGNAME = 'SWF_NET_CS' + TZFIELD3D%CUNITS = 'W m-2' + TZFIELD3D%CCOMMENT = 'X_Y_Z_SWF_NET_CS' + CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D) ! DO JK=IKB,IKE JKRAD = JK-JPVEXT @@ -3047,17 +2963,11 @@ IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN END DO END DO END DO - TZFIELD%CMNHNAME = 'DTRAD_SW_CS' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'DTRAD_SW_CS' - TZFIELD%CUNITS = 'K day-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_DTRAD_SW_CS' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,ZSTORE_3D) + TZFIELD3D%CMNHNAME = 'DTRAD_SW_CS' + TZFIELD3D%CLONGNAME = 'DTRAD_SW_CS' + TZFIELD3D%CUNITS = 'K day-1' + TZFIELD3D%CCOMMENT = 'X_Y_Z_DTRAD_SW_CS' + CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D) ! DO JK=IKB,IKE JKRAD = JK-JPVEXT @@ -3068,17 +2978,11 @@ IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN END DO END DO END DO - TZFIELD%CMNHNAME = 'DTRAD_LW_CS' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'DTRAD_LW_CS' - TZFIELD%CUNITS = 'K day-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_DTRAD_LW_CS' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,ZSTORE_3D) + TZFIELD3D%CMNHNAME = 'DTRAD_LW_CS' + TZFIELD3D%CLONGNAME = 'DTRAD_LW_CS' + TZFIELD3D%CUNITS = 'K day-1' + TZFIELD3D%CCOMMENT = 'X_Y_Z_DTRAD_LW_CS' + CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D) ! DO JJ=IJB,IJE DO JI=IIB,IIE @@ -3086,17 +2990,11 @@ IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN ZSTORE_2D(JI,JJ) = ZFLUX_TOP_GND_IRVISNIR_CS(IIJ,5) END DO END DO - TZFIELD%CMNHNAME = 'RADSWD_VIS_CS' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'RADSWD_VIS_CS' - TZFIELD%CUNITS = '' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_RADSWD_VIS_CS' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 2 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,ZSTORE_2D) + TZFIELD2D%CMNHNAME = 'RADSWD_VIS_CS' + TZFIELD2D%CLONGNAME = 'RADSWD_VIS_CS' + TZFIELD2D%CUNITS = '' + TZFIELD2D%CCOMMENT = 'X_Y_RADSWD_VIS_CS' + CALL IO_Field_write(TPFILE,TZFIELD2D,ZSTORE_2D) ! DO JJ=IJB,IJE DO JI=IIB,IIE @@ -3104,17 +3002,11 @@ IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN ZSTORE_2D(JI,JJ) = ZFLUX_TOP_GND_IRVISNIR_CS(IIJ,6) END DO END DO - TZFIELD%CMNHNAME = 'RADSWD_NIR_CS' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'RADSWD_NIR_CS' - TZFIELD%CUNITS = '' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_RADSWD_NIR_CS' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 2 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,ZSTORE_2D) + TZFIELD2D%CMNHNAME = 'RADSWD_NIR_CS' + TZFIELD2D%CLONGNAME = 'RADSWD_NIR_CS' + TZFIELD2D%CUNITS = '' + TZFIELD2D%CCOMMENT = 'X_Y_RADSWD_NIR_CS' + CALL IO_Field_write(TPFILE,TZFIELD2D,ZSTORE_2D) ! DO JJ=IJB,IJE DO JI=IIB,IIE @@ -3122,17 +3014,11 @@ IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN ZSTORE_2D(JI,JJ) = ZFLUX_TOP_GND_IRVISNIR_CS(IIJ,4) END DO END DO - TZFIELD%CMNHNAME = 'RADLWD_CS' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'RADLWD_CS' - TZFIELD%CUNITS = '' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_RADLWD_CS' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 2 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,ZSTORE_2D) + TZFIELD2D%CMNHNAME = 'RADLWD_CS' + TZFIELD2D%CLONGNAME = 'RADLWD_CS' + TZFIELD2D%CUNITS = '' + TZFIELD2D%CCOMMENT = 'X_Y_RADLWD_CS' + CALL IO_Field_write(TPFILE,TZFIELD2D,ZSTORE_2D) END IF ! ! @@ -3143,17 +3029,11 @@ IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN ZSTORE_2D(JI,JJ) = ZPLAN_ALB_VIS(IIJ) END DO END DO - TZFIELD%CMNHNAME = 'PLAN_ALB_VIS' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'PLAN_ALB_VIS' - TZFIELD%CUNITS = '' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_PLAN_ALB_VIS' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 2 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,ZSTORE_2D) + TZFIELD2D%CMNHNAME = 'PLAN_ALB_VIS' + TZFIELD2D%CLONGNAME = 'PLAN_ALB_VIS' + TZFIELD2D%CUNITS = '' + TZFIELD2D%CCOMMENT = 'X_Y_PLAN_ALB_VIS' + CALL IO_Field_write(TPFILE,TZFIELD2D,ZSTORE_2D) ! DO JJ=IJB,IJE DO JI=IIB,IIE @@ -3161,17 +3041,11 @@ IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN ZSTORE_2D(JI,JJ) = ZPLAN_ALB_NIR(IIJ) END DO END DO - TZFIELD%CMNHNAME = 'PLAN_ALB_NIR' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'PLAN_ALB_NIR' - TZFIELD%CUNITS = '' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_PLAN_ALB_NIR' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 2 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,ZSTORE_2D) + TZFIELD2D%CMNHNAME = 'PLAN_ALB_NIR' + TZFIELD2D%CLONGNAME = 'PLAN_ALB_NIR' + TZFIELD2D%CUNITS = '' + TZFIELD2D%CCOMMENT = 'X_Y_PLAN_ALB_NIR' + CALL IO_Field_write(TPFILE,TZFIELD2D,ZSTORE_2D) ! DO JJ=IJB,IJE DO JI=IIB,IIE @@ -3179,17 +3053,11 @@ IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN ZSTORE_2D(JI,JJ) = ZPLAN_TRA_VIS(IIJ) END DO END DO - TZFIELD%CMNHNAME = 'PLAN_TRA_VIS' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'PLAN_TRA_VIS' - TZFIELD%CUNITS = '' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_PLAN_TRA_VIS' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 2 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,ZSTORE_2D) + TZFIELD2D%CMNHNAME = 'PLAN_TRA_VIS' + TZFIELD2D%CLONGNAME = 'PLAN_TRA_VIS' + TZFIELD2D%CUNITS = '' + TZFIELD2D%CCOMMENT = 'X_Y_PLAN_TRA_VIS' + CALL IO_Field_write(TPFILE,TZFIELD2D,ZSTORE_2D) ! DO JJ=IJB,IJE DO JI=IIB,IIE @@ -3197,17 +3065,11 @@ IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN ZSTORE_2D(JI,JJ) = ZPLAN_TRA_NIR(IIJ) END DO END DO - TZFIELD%CMNHNAME = 'PLAN_TRA_NIR' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'PLAN_TRA_NIR' - TZFIELD%CUNITS = '' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_PLAN_TRA_NIR' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 2 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,ZSTORE_2D) + TZFIELD2D%CMNHNAME = 'PLAN_TRA_NIR' + TZFIELD2D%CLONGNAME = 'PLAN_TRA_NIR' + TZFIELD2D%CUNITS = '' + TZFIELD2D%CCOMMENT = 'X_Y_PLAN_TRA_NIR' + CALL IO_Field_write(TPFILE,TZFIELD2D,ZSTORE_2D) ! DO JJ=IJB,IJE DO JI=IIB,IIE @@ -3215,17 +3077,11 @@ IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN ZSTORE_2D(JI,JJ) = ZPLAN_ABS_VIS(IIJ) END DO END DO - TZFIELD%CMNHNAME = 'PLAN_ABS_VIS' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'PLAN_ABS_VIS' - TZFIELD%CUNITS = '' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_PLAN_ABS_VIS' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 2 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,ZSTORE_2D) + TZFIELD2D%CMNHNAME = 'PLAN_ABS_VIS' + TZFIELD2D%CLONGNAME = 'PLAN_ABS_VIS' + TZFIELD2D%CUNITS = '' + TZFIELD2D%CCOMMENT = 'X_Y_PLAN_ABS_VIS' + CALL IO_Field_write(TPFILE,TZFIELD2D,ZSTORE_2D) ! DO JJ=IJB,IJE DO JI=IIB,IIE @@ -3233,17 +3089,11 @@ IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN ZSTORE_2D(JI,JJ) = ZPLAN_ABS_NIR(IIJ) END DO END DO - TZFIELD%CMNHNAME = 'PLAN_ABS_NIR' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'PLAN_ABS_NIR' - TZFIELD%CUNITS = '' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_PLAN_ABS_NIR' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 2 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,ZSTORE_2D) + TZFIELD2D%CMNHNAME = 'PLAN_ABS_NIR' + TZFIELD2D%CLONGNAME = 'PLAN_ABS_NIR' + TZFIELD2D%CUNITS = '' + TZFIELD2D%CCOMMENT = 'X_Y_PLAN_ABS_NIR' + CALL IO_Field_write(TPFILE,TZFIELD2D,ZSTORE_2D) ! ! END IF @@ -3259,17 +3109,11 @@ IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN END DO END DO END DO - TZFIELD%CMNHNAME = 'EFNEB_DOWN' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'EFNEB_DOWN' - TZFIELD%CUNITS = '' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_EFNEB_DOWN' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,ZSTORE_3D) + TZFIELD3D%CMNHNAME = 'EFNEB_DOWN' + TZFIELD3D%CLONGNAME = 'EFNEB_DOWN' + TZFIELD3D%CUNITS = '' + TZFIELD3D%CCOMMENT = 'X_Y_Z_EFNEB_DOWN' + CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D) ! DO JK=IKB,IKE JKRAD = JK - JPVEXT @@ -3280,17 +3124,11 @@ IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN END DO END DO END DO - TZFIELD%CMNHNAME = 'EFNEB_UP' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'EFNEB_UP' - TZFIELD%CUNITS = '' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_EFNEB_UP' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,ZSTORE_3D) + TZFIELD3D%CMNHNAME = 'EFNEB_UP' + TZFIELD3D%CLONGNAME = 'EFNEB_UP' + TZFIELD3D%CUNITS = '' + TZFIELD3D%CCOMMENT = 'X_Y_Z_EFNEB_UP' + CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D) ! DO JK=IKB,IKE JKRAD = JK - JPVEXT @@ -3301,17 +3139,11 @@ IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN END DO END DO END DO - TZFIELD%CMNHNAME = 'FLWP' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'FLWP' - TZFIELD%CUNITS = '' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_FLWP' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,ZSTORE_3D) + TZFIELD3D%CMNHNAME = 'FLWP' + TZFIELD3D%CLONGNAME = 'FLWP' + TZFIELD3D%CUNITS = '' + TZFIELD3D%CCOMMENT = 'X_Y_Z_FLWP' + CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D) ! DO JK=IKB,IKE JKRAD = JK - JPVEXT @@ -3322,17 +3154,11 @@ IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN END DO END DO END DO - TZFIELD%CMNHNAME = 'FIWP' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'FIWP' - TZFIELD%CUNITS = '' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_FIWP' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,ZSTORE_3D) + TZFIELD3D%CMNHNAME = 'FIWP' + TZFIELD3D%CLONGNAME = 'FIWP' + TZFIELD3D%CUNITS = '' + TZFIELD3D%CCOMMENT = 'X_Y_Z_FIWP' + CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D) ! DO JK=IKB,IKE JKRAD = JK - JPVEXT @@ -3343,17 +3169,11 @@ IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN END DO END DO END DO - TZFIELD%CMNHNAME = 'EFRADL' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'EFRADL' - TZFIELD%CUNITS = '' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_RAD_microm' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,ZSTORE_3D) + TZFIELD3D%CMNHNAME = 'EFRADL' + TZFIELD3D%CLONGNAME = 'EFRADL' + TZFIELD3D%CUNITS = '' + TZFIELD3D%CCOMMENT = 'X_Y_Z_RAD_microm' + CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D) ! DO JK=IKB,IKE JKRAD = JK - JPVEXT @@ -3364,17 +3184,11 @@ IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN END DO END DO END DO - TZFIELD%CMNHNAME = 'EFRADI' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'EFRADI' - TZFIELD%CUNITS = '' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_RAD_microm' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,ZSTORE_3D) + TZFIELD3D%CMNHNAME = 'EFRADI' + TZFIELD3D%CLONGNAME = 'EFRADI' + TZFIELD3D%CUNITS = '' + TZFIELD3D%CCOMMENT = 'X_Y_Z_RAD_microm' + CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D) ! DO JK=IKB,IKE JKRAD = JK - JPVEXT @@ -3385,17 +3199,11 @@ IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN END DO END DO END DO - TZFIELD%CMNHNAME = 'SW_NEB' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'SW_NEB' - TZFIELD%CUNITS = '' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_SW_NEB' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,ZSTORE_3D) + TZFIELD3D%CMNHNAME = 'SW_NEB' + TZFIELD3D%CLONGNAME = 'SW_NEB' + TZFIELD3D%CUNITS = '' + TZFIELD3D%CCOMMENT = 'X_Y_Z_SW_NEB' + CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D) ! DO JK=IKB,IKE JKRAD = JK - JPVEXT @@ -3406,17 +3214,11 @@ IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN END DO END DO END DO - TZFIELD%CMNHNAME = 'RRTM_LW_NEB' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'RRTM_LW_NEB' - TZFIELD%CUNITS = '' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_LW_NEB' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,ZSTORE_3D) + TZFIELD3D%CMNHNAME = 'RRTM_LW_NEB' + TZFIELD3D%CLONGNAME = 'RRTM_LW_NEB' + TZFIELD3D%CUNITS = '' + TZFIELD3D%CCOMMENT = 'X_Y_Z_LW_NEB' + CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D) ! ! spectral bands IF (KSWB_OLD==6) THEN @@ -3433,41 +3235,23 @@ IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN END DO ! DO JBAND=1,KSWB_OLD - TZFIELD%CMNHNAME = 'ODAER_'//YBAND_NAME(JBAND) - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = '' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_OD_'//YBAND_NAME(JBAND) - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,ZTAUAZ(:,:,:,JBAND)) + TZFIELD3D%CMNHNAME = 'ODAER_'//YBAND_NAME(JBAND) + TZFIELD3D%CLONGNAME = 'ODAER_'//YBAND_NAME(JBAND) + TZFIELD3D%CUNITS = '' + TZFIELD3D%CCOMMENT = 'X_Y_Z_OD_'//YBAND_NAME(JBAND) + CALL IO_Field_write(TPFILE,TZFIELD3D,ZTAUAZ(:,:,:,JBAND)) ! - TZFIELD%CMNHNAME = 'SSAAER_'//YBAND_NAME(JBAND) - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = '' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_SSA_'//YBAND_NAME(JBAND) - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,ZPIZAZ(:,:,:,JBAND)) + TZFIELD3D%CMNHNAME = 'SSAAER_'//YBAND_NAME(JBAND) + TZFIELD3D%CLONGNAME = 'SSAAER_'//YBAND_NAME(JBAND) + TZFIELD3D%CUNITS = '' + TZFIELD3D%CCOMMENT = 'X_Y_Z_SSA_'//YBAND_NAME(JBAND) + CALL IO_Field_write(TPFILE,TZFIELD3D,ZPIZAZ(:,:,:,JBAND)) ! - TZFIELD%CMNHNAME = 'GAER_'//YBAND_NAME(JBAND) - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = '' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_G_'//YBAND_NAME(JBAND) - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,ZCGAZ(:,:,:,JBAND)) + TZFIELD3D%CMNHNAME = 'GAER_'//YBAND_NAME(JBAND) + TZFIELD3D%CLONGNAME = 'GAER_'//YBAND_NAME(JBAND) + TZFIELD3D%CUNITS = '' + TZFIELD3D%CCOMMENT = 'X_Y_Z_G_'//YBAND_NAME(JBAND) + CALL IO_Field_write(TPFILE,TZFIELD3D,ZCGAZ(:,:,:,JBAND)) ENDDO DO JBAND=1,KSWB_OLD @@ -3480,17 +3264,11 @@ IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN END DO END DO END DO - TZFIELD%CMNHNAME = 'OTH_'//YBAND_NAME(JBAND) - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = '' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_OTH_'//YBAND_NAME(JBAND) - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,ZSTORE_3D) + TZFIELD3D%CMNHNAME = 'OTH_'//YBAND_NAME(JBAND) + TZFIELD3D%CLONGNAME = 'OTH_'//YBAND_NAME(JBAND) + TZFIELD3D%CUNITS = '' + TZFIELD3D%CCOMMENT = 'X_Y_Z_OTH_'//YBAND_NAME(JBAND) + CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D) ! DO JK=IKB,IKE JKRAD = JK - JPVEXT @@ -3501,17 +3279,11 @@ IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN END DO END DO END DO - TZFIELD%CMNHNAME = 'SSA_'//YBAND_NAME(JBAND) - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = '' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_SSA_'//YBAND_NAME(JBAND) - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,ZSTORE_3D) + TZFIELD3D%CMNHNAME = 'SSA_'//YBAND_NAME(JBAND) + TZFIELD3D%CLONGNAME = 'SSA_'//YBAND_NAME(JBAND) + TZFIELD3D%CUNITS = '' + TZFIELD3D%CCOMMENT = 'X_Y_Z_SSA_'//YBAND_NAME(JBAND) + CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D) ! DO JK=IKB,IKE JKRAD = JK - JPVEXT @@ -3522,17 +3294,11 @@ IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN END DO END DO END DO - TZFIELD%CMNHNAME = 'ASF_'//YBAND_NAME(JBAND) - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = '' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_ASF_'//YBAND_NAME(JBAND) - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,ZSTORE_3D) + TZFIELD3D%CMNHNAME = 'ASF_'//YBAND_NAME(JBAND) + TZFIELD3D%CLONGNAME = 'ASF_'//YBAND_NAME(JBAND) + TZFIELD3D%CUNITS = '' + TZFIELD3D%CCOMMENT = 'X_Y_Z_ASF_'//YBAND_NAME(JBAND) + CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D) END DO END IF ! @@ -3550,17 +3316,11 @@ IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN END DO END DO END DO - TZFIELD%CMNHNAME = 'O3CLIM' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'O3CLIM' - TZFIELD%CUNITS = 'Pa Pa-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_O3' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,ZSTORE_3D) + TZFIELD3D%CMNHNAME = 'O3CLIM' + TZFIELD3D%CLONGNAME = 'O3CLIM' + TZFIELD3D%CUNITS = 'Pa Pa-1' + TZFIELD3D%CCOMMENT = 'X_Y_Z_O3' + CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D) ! !cumulated optical thickness of aerosols !cumul begin from the top of the domain, not from the TOA ! @@ -3581,17 +3341,11 @@ IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN ZSTORE_2D(:,:) = ZSTORE_2D(:,:) + ZSTORE_3D(:,:,JK1) ZSTORE_3D2(:,:,JK1) = ZSTORE_2D(:,:) END DO - TZFIELD%CMNHNAME = 'CUM_AER_LAND' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'CUM_AER_LAND' - TZFIELD%CUNITS = '' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_CUM_AER_OPT' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,ZSTORE_3D2) + TZFIELD3D%CMNHNAME = 'CUM_AER_LAND' + TZFIELD3D%CLONGNAME = 'CUM_AER_LAND' + TZFIELD3D%CUNITS = '' + TZFIELD3D%CCOMMENT = 'X_Y_Z_CUM_AER_OPT' + CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D2) ! ! sea DO JK=IKB,IKE @@ -3610,17 +3364,11 @@ IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN ZSTORE_3D2(:,:,JK1) = ZSTORE_2D(:,:) END DO ! - TZFIELD%CMNHNAME = 'CUM_AER_SEA' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'CUM_AER_SEA' - TZFIELD%CUNITS = '' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_CUM_AER_OPT' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,ZSTORE_3D2) + TZFIELD3D%CMNHNAME = 'CUM_AER_SEA' + TZFIELD3D%CLONGNAME = 'CUM_AER_SEA' + TZFIELD3D%CUNITS = '' + TZFIELD3D%CCOMMENT = 'X_Y_Z_CUM_AER_OPT' + CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D2) ! ! desert DO JK=IKB,IKE @@ -3639,17 +3387,11 @@ IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN ZSTORE_3D2(:,:,JK1) = ZSTORE_2D(:,:) END DO ! - TZFIELD%CMNHNAME = 'CUM_AER_DES' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'CUM_AER_DES' - TZFIELD%CUNITS = '' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_CUM_AER_OPT' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,ZSTORE_3D2) + TZFIELD3D%CMNHNAME = 'CUM_AER_DES' + TZFIELD3D%CLONGNAME = 'CUM_AER_DES' + TZFIELD3D%CUNITS = '' + TZFIELD3D%CCOMMENT = 'X_Y_Z_CUM_AER_OPT' + CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D2) ! ! urban DO JK=IKB,IKE @@ -3668,17 +3410,11 @@ IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN ZSTORE_3D2(:,:,JK1) = ZSTORE_2D(:,:) END DO ! - TZFIELD%CMNHNAME = 'CUM_AER_URB' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'CUM_AER_URB' - TZFIELD%CUNITS = '' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_CUM_AER_OPT' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,ZSTORE_3D2) + TZFIELD3D%CMNHNAME = 'CUM_AER_URB' + TZFIELD3D%CLONGNAME = 'CUM_AER_URB' + TZFIELD3D%CUNITS = '' + TZFIELD3D%CCOMMENT = 'X_Y_Z_CUM_AER_OPT' + CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D2) ! ! Volcanoes DO JK=IKB,IKE @@ -3697,17 +3433,11 @@ IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN ZSTORE_3D2(:,:,JK1) = ZSTORE_2D(:,:) END DO ! - TZFIELD%CMNHNAME = 'CUM_AER_VOL' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'CUM_AER_VOL' - TZFIELD%CUNITS = '' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_CUM_AER_OPT' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,ZSTORE_3D2) + TZFIELD3D%CMNHNAME = 'CUM_AER_VOL' + TZFIELD3D%CLONGNAME = 'CUM_AER_VOL' + TZFIELD3D%CUNITS = '' + TZFIELD3D%CCOMMENT = 'X_Y_Z_CUM_AER_OPT' + CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D2) ! ! stratospheric background DO JK=IKB,IKE @@ -3726,17 +3456,11 @@ IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN ZSTORE_3D2(:,:,JK1) = ZSTORE_2D(:,:) END DO ! - TZFIELD%CMNHNAME = 'CUM_AER_STRB' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'CUM_AER_STRB' - TZFIELD%CUNITS = '' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_CUM_AER_OPT' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,ZSTORE_3D2) + TZFIELD3D%CMNHNAME = 'CUM_AER_STRB' + TZFIELD3D%CLONGNAME = 'CUM_AER_STRB' + TZFIELD3D%CUNITS = '' + TZFIELD3D%CCOMMENT = 'X_Y_Z_CUM_AER_OPT' + CALL IO_Field_write(TPFILE,TZFIELD3D,ZSTORE_3D2) ENDIF END IF ! diff --git a/src/MNH/read_all_data_grib_case.f90 b/src/MNH/read_all_data_grib_case.f90 index ec83d1da95759f639525edda2af8fe611b989ce3..4e03378378ef394b67c2644ca79352602f39b2e6 100644 --- a/src/MNH/read_all_data_grib_case.f90 +++ b/src/MNH/read_all_data_grib_case.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1998-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1998-2022 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. @@ -371,12 +371,8 @@ ALLOCATE (ZXM(IIU,IJU)) ALLOCATE (ZYM(IIU,IJU)) ALLOCATE (ZLONM(IIU,IJU)) ALLOCATE (ZLATM(IIU,IJU)) -ZXM(1:IIU-1,1) = (XXHAT(1:IIU-1) + XXHAT(2:IIU) ) / 2. -ZXM(IIU,1) = XXHAT(IIU) - XXHAT(IIU-1) + ZXM(IIU-1,1) -ZXM(:,2:IJU) = SPREAD(ZXM(:,1),2,IJU-1) -ZYM(1,1:IJU-1) = (XYHAT(1:IJU-1) + XYHAT(2:IJU)) / 2. -ZYM(1,IJU) = XYHAT(IJU) - XYHAT(IJU-1) + ZYM(1,IJU-1) -ZYM(2:IIU,:) = SPREAD(ZYM(1,:),1,IIU-1) +ZXM(:,:) = SPREAD(XXHATM(:),2,IJU) +ZYM(:,:) = SPREAD(XYHATM(:),1,IIU) CALL SM_XYTOLATLON_A (XLAT0,XLON0,XRPK,XLATORI,XLONORI,ZXM,ZYM,ZLATM,ZLONM, & IIU,IJU) ALLOCATE (ZLONOUT(INO)) @@ -1363,7 +1359,7 @@ IF (IMODEL==5) THEN XSV_LS(:,:,:,:) = 0. ILEV1=-1 ! - WRITE (ILUOUT0,'(A,A4,A)') ' | Reading Mocage species (ppp) from ',HFILE,' file' + WRITE (ILUOUT0,'(A,A4,A)') ' | Reading Mocage species (ppv) from ',HFILE,' file' ! !* 2.6.1 read mocage species ! diff --git a/src/MNH/read_cams_data_netcdf_case.f90 b/src/MNH/read_cams_data_netcdf_case.f90 index 89ab3518c9bb0b4ad0152fdc980b49cd1d630355..ec6421713a1541e9b1f4f2f32460b345398177e1 100644 --- a/src/MNH/read_cams_data_netcdf_case.f90 +++ b/src/MNH/read_cams_data_netcdf_case.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2012-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2012-2022 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. @@ -88,8 +88,8 @@ END MODULE MODI_READ_CAMS_DATA_NETCDF_CASE !------------ ! USE MODD_CH_AEROSOL, ONLY: CORGANIC, NCARB, NSOA, NSP, LORILAM,& - JPMODE, LVARSIGI, LVARSIGJ,CAERONAMES -USE MODD_CH_M9_n, ONLY: NEQ , CNAMES + JPMODE, LVARSIGI, LVARSIGJ +USE MODD_CH_M9_n, ONLY: NEQ USE MODD_CH_MNHC_n, ONLY: LUSECHEM,LUSECHAQ,LUSECHIC,LCH_PH USE MODD_CONF USE MODD_CONF_n @@ -207,12 +207,8 @@ ALLOCATE (ZXM(IIU,IJU)) ALLOCATE (ZYM(IIU,IJU)) ALLOCATE (ZLONM(IIU,IJU)) ALLOCATE (ZLATM(IIU,IJU)) -ZXM(1:IIU-1,1) = (XXHAT(1:IIU-1) + XXHAT(2:IIU) ) / 2. -ZXM(IIU,1) = XXHAT(IIU) - XXHAT(IIU-1) + ZXM(IIU-1,1) -ZXM(:,2:IJU) = SPREAD(ZXM(:,1),2,IJU-1) -ZYM(1,1:IJU-1) = (XYHAT(1:IJU-1) + XYHAT(2:IJU)) / 2. -ZYM(1,IJU) = XYHAT(IJU) - XYHAT(IJU-1) + ZYM(1,IJU-1) -ZYM(2:IIU,:) = SPREAD(ZYM(1,:),1,IIU-1) +ZXM(:,:) = SPREAD(XXHATM(:),2,IJU) +ZYM(:,:) = SPREAD(XYHATM(:),1,IIU) CALL SM_XYTOLATLON_A (XLAT0,XLON0,XRPK,XLATORI,XLONORI,ZXM,ZYM,ZLATM,ZLONM, & IIU,IJU) ALLOCATE (ZLONOUT(INO)) diff --git a/src/MNH/read_chem_data_netcdf_case.f90 b/src/MNH/read_chem_data_netcdf_case.f90 index 3ecc3f594c36347e046515c7e9a5995490a3ad02..2648709e0c93aed6ecd7ca7c21a4727a94d9881b 100644 --- a/src/MNH/read_chem_data_netcdf_case.f90 +++ b/src/MNH/read_chem_data_netcdf_case.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2012-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2012-2022 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. @@ -238,12 +238,8 @@ ALLOCATE (ZXM(IIU,IJU)) ALLOCATE (ZYM(IIU,IJU)) ALLOCATE (ZLONM(IIU,IJU)) ALLOCATE (ZLATM(IIU,IJU)) -ZXM(1:IIU-1,1) = (XXHAT(1:IIU-1) + XXHAT(2:IIU) ) / 2. -ZXM(IIU,1) = XXHAT(IIU) - XXHAT(IIU-1) + ZXM(IIU-1,1) -ZXM(:,2:IJU) = SPREAD(ZXM(:,1),2,IJU-1) -ZYM(1,1:IJU-1) = (XYHAT(1:IJU-1) + XYHAT(2:IJU)) / 2. -ZYM(1,IJU) = XYHAT(IJU) - XYHAT(IJU-1) + ZYM(1,IJU-1) -ZYM(2:IIU,:) = SPREAD(ZYM(1,:),1,IIU-1) +ZXM(:,:) = SPREAD(XXHATM(:),2,IJU) +ZYM(:,:) = SPREAD(XYHATM(:),1,IIU) CALL SM_XYTOLATLON_A (XLAT0,XLON0,XRPK,XLATORI,XLONORI,ZXM,ZYM,ZLATM,ZLONM, & IIU,IJU) ALLOCATE (ZLONOUT(INO)) @@ -443,7 +439,7 @@ enddo ALLOCATE (XSV_LS(IIU,IJU,ilevlen,NSV)) XSV_LS(:,:,:,:) = 0. ! - WRITE (ILUOUT0,'(A,A4,A)') ' | Reading MOZART species (ppp) from ',HFILE,' file' + WRITE (ILUOUT0,'(A,A4,A)') ' | Reading MOZART species (ppv) from ',HFILE,' file' where (ZLONOUT(:) < 0.) ZLONOUT(:) = ZLONOUT(:) + 360. ! diff --git a/src/MNH/read_desfmn.f90 b/src/MNH/read_desfmn.f90 index 7485c40400d62925d39db8b9d8ee33b2fba9bc5b..8a69a7f9c641da3c0015298e0e6768db47c3e196 100644 --- a/src/MNH/read_desfmn.f90 +++ b/src/MNH/read_desfmn.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1994-2023 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. @@ -196,7 +196,8 @@ END MODULE MODI_READ_DESFM_n !! Modification 02/2021 (F.Auguste) add IBM !! (T.Nagel) add turbulence recycling !! (E.Jezequel) add stations read from CSV file -!! Modifications 12/2021 (A. Costes) add Blaze fire model +! A. Costes 12/2021: add Blaze fire model +! P. Wautelet 27/04/2022: add namelist for profilers !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -265,9 +266,11 @@ USE MODN_LATZ_EDFLX USE MODN_2D_FRC USE MODN_BLOWSNOW_n USE MODN_BLOWSNOW +USE MODN_PROFILER_n USE MODN_STATION_n ! USE MODN_PARAM_LIMA +! USE MODN_FLYERS ! USE MODE_MSG USE MODE_POS @@ -477,6 +480,12 @@ IF (GFOUND) THEN READ(UNIT=ILUDES,NML=NAM_BLANKn) CALL UPDATE_NAM_BLANKn END IF +CALL POSNAM(ILUDES,'NAM_PROFILERN',GFOUND,ILUOUT) +CALL INIT_NAM_PROFILERn +IF (GFOUND) THEN + READ(UNIT=ILUDES,NML=NAM_PROFILERN) + CALL UPDATE_NAM_PROFILERn +END IF CALL POSNAM(ILUDES,'NAM_STATIONN',GFOUND,ILUOUT) CALL INIT_NAM_STATIONn IF (GFOUND) THEN @@ -544,7 +553,7 @@ IF (KMI == 1) THEN READ(UNIT=ILUDES,NML=NAM_OUTPUT) END IF ! 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 +! The values 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) @@ -622,7 +631,15 @@ IF (KMI == 1) THEN IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_LATZ_EDFLX) CALL POSNAM(ILUDES,'NAM_VISC',GFOUND,ILUOUT) IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_VISC) -END IF +! Note: it is not useful to read the FLYERS/AIRCRAFTS/BALLOONS namelists in the .des files +! The values here (if present in file) don't need to be compared with the ones in the EXSEGn files +! CALL POSNAM(ILUDES,'NAM_FLYERS',GFOUND,ILUOUT) +! IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_FLYERS) +! CALL POSNAM(ILUSEG,'NAM_AIRCRAFTS',GFOUND,ILUOUT) +! IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_AIRCRAFTS) +! CALL POSNAM(ILUSEG,'NAM_BALLOONS',GFOUND,ILUOUT) +! IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_BALLOONS) +END IF ! !------------------------------------------------------------------------------- ! @@ -652,7 +669,7 @@ OSALT = LSALT OORILAM = LORILAM OLG = LLG OPASPOL = LPASPOL -OFIRE = LBLAZE +OFIRE = LBLAZE #ifdef MNH_FOREFIRE OFOREFIRE = LFOREFIRE #endif @@ -741,6 +758,9 @@ IF (NVERB >= 10) THEN ! WRITE(UNIT=ILUOUT,FMT="('********** BLANKn ******************')") WRITE(UNIT=ILUOUT,NML=NAM_BLANKn) +! + WRITE(UNIT=ILUOUT,FMT="('********** PROFILERn *****************')") + WRITE(UNIT=ILUOUT,NML=NAM_PROFILERn) ! WRITE(UNIT=ILUOUT,FMT="('********** STATIONn ******************')") WRITE(UNIT=ILUOUT,NML=NAM_STATIONn) @@ -826,16 +846,16 @@ IF (NVERB >= 10) THEN WRITE(UNIT=ILUOUT,NML=NAM_VISC) ! #ifdef MNH_FOREFIRE - WRITE(UNIT=ILUOUT,FMT="('************ FOREFIRE ***************')") - WRITE(UNIT=ILUOUT,NML=NAM_FOREFIRE) + WRITE(UNIT=ILUOUT,FMT="('************ FOREFIRE ***************')") + WRITE(UNIT=ILUOUT,NML=NAM_FOREFIRE) ! -#endif +#endif +! + IF ( LBLAZE ) THEN + WRITE(UNIT=ILUOUT,FMT="('******************** BLAZE ********************')") + WRITE(UNIT=ILUOUT,NML=NAM_FIRE) + END IF ! -IF (LBLAZE) THEN - WRITE(UNIT=ILUOUT,FMT="('******************** BLAZE ********************')") - WRITE(UNIT=ILUOUT,NML=NAM_FIRE) -END IF -! WRITE(UNIT=ILUOUT,FMT="('************ CONDITIONAL SAMPLING *************')") WRITE(UNIT=ILUOUT,NML=NAM_CONDSAMP) ! diff --git a/src/MNH/read_dummy_gr_fieldn.f90 b/src/MNH/read_dummy_gr_fieldn.f90 index 80f9ceefd4eb572e8c9f69a5eace441a7a0d2da6..edb10fbbff5cce332b47fe0b5307f160680a56c4 100644 --- a/src/MNH/read_dummy_gr_fieldn.f90 +++ b/src/MNH/read_dummy_gr_fieldn.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1995-2020 CNRS, Meteo-France and Universite Paul Sabatier +!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. @@ -74,7 +74,7 @@ END MODULE MODI_READ_DUMMY_GR_FIELD_n !* 0. DECLARATIONS ! USE MODD_DUMMY_GR_FIELD_n -use modd_field, only: tfielddata, TYPEINT, TYPEREAL +use modd_field, only: tfieldmetadata, TYPEINT, TYPEREAL USE MODD_GRID_n USE MODD_IO, ONLY: TFILEDATA USE MODD_PARAMETERS, ONLY: JPHEXT, NMNHNAMELGTMAX @@ -106,7 +106,7 @@ INTEGER :: IIINF ! lower I index INTEGER :: IISUP ! upper I index INTEGER :: IJINF ! lower J index INTEGER :: IJSUP ! upper J index -TYPE(TFIELDDATA) :: TZFIELD +TYPE(TFIELDMETADATA) :: TZFIELD ! !------------------------------------------------------------------------------- ! @@ -147,16 +147,17 @@ END IF ! ! IF (TPINIFILE%NMNHVERSION(1)>=4) THEN - TZFIELD%CMNHNAME = 'DUMMY_GR_NBR' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'DUMMY_GR_NBR' - TZFIELD%CUNITS = '' - TZFIELD%CDIR = '--' - TZFIELD%CCOMMENT = 'number of dummy pgd fields chosen by user' - TZFIELD%NGRID = 0 - TZFIELD%NTYPE = TYPEINT - TZFIELD%NDIMS = 0 - TZFIELD%LTIMEDEP = .FALSE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'DUMMY_GR_NBR', & + CSTDNAME = '', & + CLONGNAME = 'DUMMY_GR_NBR', & + CUNITS = '', & + CDIR = '--', & + CCOMMENT = 'number of dummy pgd fields chosen by user', & + NGRID = 0, & + NTYPE = TYPEINT, & + NDIMS = 0, & + LTIMEDEP = .FALSE. ) ! CALL IO_Field_read(TPINIFILE,TZFIELD,NDUMMY_GR_NBR,IRESP) ! @@ -176,18 +177,19 @@ ALLOCATE(XDUMMY_GR_FIELDS(SIZE(XXHAT),SIZE(XYHAT),NDUMMY_GR_NBR)) ! DO JDUMMY=1,NDUMMY_GR_NBR WRITE(YRECFM,'(A8,I3.3)') 'DUMMY_GR',JDUMMY - TZFIELD%CMNHNAME = TRIM(YRECFM) - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM(YRECFM) - TZFIELD%CUNITS = '' - TZFIELD%CDIR = 'XY' - ! Expected comment is not known but is in the following form: - ! 'X_Y_'//TRIM(YRECFM)//YSTRING20//YSTRING03 - TZFIELD%CCOMMENT = '' - TZFIELD%NGRID = 4 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 2 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = TRIM(YRECFM), & + CSTDNAME = '', & + CLONGNAME = TRIM(YRECFM), & + CUNITS = '', & + CDIR = 'XY', & + ! Expected comment is not known but is in the following form: + ! 'X_Y_'//TRIM(YRECFM)//YSTRING20//YSTRING03 + CCOMMENT = '', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) ! CALL IO_Field_read(TPINIFILE,TZFIELD,ZWORK(:,:),IRESP) ! diff --git a/src/MNH/read_exsegn.f90 b/src/MNH/read_exsegn.f90 index 0b419f28d03401f39a5a83a42ca2155b1ec632b8..0f2ceab346b4416ee5aa1546b9a018094fec621c 100644 --- a/src/MNH/read_exsegn.f90 +++ b/src/MNH/read_exsegn.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1994-2022 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. @@ -304,11 +304,15 @@ END MODULE MODI_READ_EXSEG_n ! R. Honnert 23/04/2021: add ADAP mixing length and delete HRIO and BOUT from CMF_UPDRAFT ! S. Riette 11/05/2021 HighLow cloud ! A. Costes 12/2021: add Blaze fire model +! P. Wautelet 27/04/2022: add namelist for profilers ! P. Wautelet 24/06/2022: remove check on CSTORAGE_TYPE for restart of ForeFire variables +! P. Wautelet 13/07/2022: add namelist for flyers and balloons +! P. Wautelet 19/08/2022: add namelist for aircrafts !------------------------------------------------------------------------------ ! !* 0. DECLARATIONS ! ------------ +USE MODD_AIRCRAFT_BALLOON, ONLY: NAIRCRAFTS, NBALLOONS USE MODD_BLOWSNOW USE MODD_BUDGET USE MODD_CH_AEROSOL @@ -342,7 +346,9 @@ 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_AIRCRAFTS, ONLY: AIRCRAFTS_NML_ALLOCATE, NAM_AIRCRAFTS USE MODN_BACKUP +USE MODN_BALLOONS, ONLY: BALLOONS_NML_ALLOCATE, NAM_BALLOONS USE MODN_BLANK_n USE MODN_BLOWSNOW USE MODN_BLOWSNOW_n @@ -364,6 +370,7 @@ USE MODN_ELEC USE MODN_EOL USE MODN_EOL_ADNR USE MODN_EOL_ALM +USE MODN_FLYERS #ifdef MNH_FOREFIRE USE MODN_FOREFIRE #endif @@ -393,6 +400,7 @@ 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_PROFILER_n USE MODN_RECYCL_PARAM_n USE MODN_SALT USE MODN_SERIES @@ -502,6 +510,7 @@ CALL INIT_NAM_CH_MNHCN CALL INIT_NAM_CH_SOLVERN CALL INIT_NAM_SERIESN CALL INIT_NAM_BLOWSNOWN +CALL INIT_NAM_PROFILERn CALL INIT_NAM_STATIONn ! WRITE(UNIT=ILUOUT,FMT="(/,'READING THE EXSEG.NAM FILE')") @@ -557,6 +566,8 @@ CALL POSNAM(ILUSEG,'NAM_EOL_ADNR',GFOUND,ILUOUT) IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_EOL_ADNR) CALL POSNAM(ILUSEG,'NAM_EOL_ALM',GFOUND,ILUOUT) IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_EOL_ALM) +CALL POSNAM(ILUSEG,'NAM_PROFILERN',GFOUND,ILUOUT) +IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_PROFILERn) CALL POSNAM(ILUSEG,'NAM_STATIONN',GFOUND,ILUOUT) IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_STATIONn) ! @@ -847,6 +858,21 @@ IF (KMI == 1) THEN IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_BLOWSNOW) CALL POSNAM(ILUSEG,'NAM_VISC',GFOUND,ILUOUT) IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_VISC) + + CALL POSNAM(ILUSEG,'NAM_FLYERS',GFOUND,ILUOUT) + IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_FLYERS) + + IF ( NAIRCRAFTS > 0 ) THEN + CALL AIRCRAFTS_NML_ALLOCATE( NAIRCRAFTS ) + CALL POSNAM(ILUSEG,'NAM_AIRCRAFTS',GFOUND,ILUOUT) + IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_AIRCRAFTS) + END IF + + IF ( NBALLOONS > 0 ) THEN + CALL BALLOONS_NML_ALLOCATE( NBALLOONS ) + CALL POSNAM(ILUSEG,'NAM_BALLOONS',GFOUND,ILUOUT) + IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_BALLOONS) + END IF END IF ! !------------------------------------------------------------------------------- @@ -3035,6 +3061,7 @@ CALL UPDATE_NAM_CH_MNHCN CALL UPDATE_NAM_CH_SOLVERN CALL UPDATE_NAM_SERIESN CALL UPDATE_NAM_BLOWSNOWN +CALL UPDATE_NAM_PROFILERn CALL UPDATE_NAM_STATIONn !------------------------------------------------------------------------------- WRITE(UNIT=ILUOUT,FMT='(/)') diff --git a/src/MNH/read_field.f90 b/src/MNH/read_field.f90 index 32ef01869fd487a49b35919b4b0fb0f881de477a..b55c45de3ce68f708be765dc50f95eaa0c7001ab 100644 --- a/src/MNH/read_field.f90 +++ b/src/MNH/read_field.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1994-2023 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. @@ -47,8 +47,9 @@ CHARACTER (LEN=*), INTENT(IN) :: HGETTKET, & HGETRVT,HGETRCT,HGETRRT, & HGETRIT,HGETRST,HGETRGT,HGETRHT, & HGETCIT,HGETSRCT, HGETZWS, & - HGETSIGS,HGETCLDFR,HGETICEFR,HGETBL_DEPTH, & - HGETSBL_DEPTH,HGETPHC,HGETPHR + HGETSIGS, HGETCLDFR, HGETICEFR, & + HGETBL_DEPTH, HGETSBL_DEPTH, & + HGETPHC, HGETPHR CHARACTER (LEN=*), DIMENSION(:),INTENT(IN) :: HGETSVT ! ! GET indicators to know wether a given variable should or not be read in the @@ -259,61 +260,50 @@ END MODULE MODI_READ_FIELD !! C.Lac 10/16 CEN4TH with RKC4 + Correction on RK loop !! 09/2017 Q.Rodier add LTEND_UV_FRC !! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O -!! V. Vionnet 07/17 add blowing snow scheme -!! P. Wautelet 01/2019 corrected intent of PDUM,PDVM,PDWM (OUT->INOUT) +! V. Vionnet 07/17: add blowing snow scheme +! P. Wautelet 01/2019: corrected intent of PDUM,PDVM,PDWM (OUT->INOUT) ! P. Wautelet 13/02/2019: removed PPABSM and PTSTEP dummy arguments (bugfix: PPABSM was intent(OUT)) -!! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes +! S. Bielli 02/2019: Sea salt : significant sea wave height influences salt emission; 5 salt modes ! P. Wautelet 14/03/2019: correct ZWS when variable not present in file ! M. Leriche 10/06/2019: in restart case read all immersion modes for LIMA -!! B. Vie 06/2020: Add prognostic supersaturation for LIMA -!! F. Auguste 02/2021: add fields necessary for IBM -!! T. Nagel 02/2021: add fields necessary for turbulence recycling -!! J.L. Redelsperger 03/2021: add necessary variables for Ocean LES case -!! A. Costes 12/2021: add Blaze fire model +! B. Vie 06/2020: Add prognostic supersaturation for LIMA +! F. Auguste 02/2021: add fields necessary for IBM +! T. Nagel 02/2021: add fields necessary for turbulence recycling +! JL. Redelsperger 03/2021: add necessary variables for Ocean LES case +! A. Costes 12/2021: add Blaze fire model +! P. Wautelet 04/02/2022: use TSVLIST to manage metadata of scalar variables !!------------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ ! -USE MODD_2D_FRC -USE MODD_ADV_n -USE MODD_BLOWSNOW -USE MODD_BLOWSNOW_n -USE MODD_CH_AEROSOL -USE MODD_CH_M9_n, ONLY: CNAMES, CICNAMES -USE MODD_CONF -USE MODD_CONF_n -USE MODD_CST -USE MODD_CTURB -USE MODD_DUST +USE MODD_2D_FRC, ONLY: L2D_ADV_FRC, L2D_REL_FRC +USE MODD_ADV_n, ONLY: CTEMP_SCHEME, LSPLIT_CFL +USE MODD_BLOWSNOW_n, ONLY: XSNWCANO +USE MODD_CONF, ONLY: CCONF, CPROGRAM, L1D, LFORCING, NVERB +USE MODD_CONF_n, ONLY: IDX_RVT, IDX_RCT, IDX_RRT, IDX_RIT, IDX_RST, IDX_RGT, IDX_RHT +USE MODD_CST, ONLY: XALPW, XBETAW, XCPD, XGAMW, XMD, XMV, XP00, XRD +USE MODD_CTURB, ONLY: XTKEMIN USE MODD_DYN_n, ONLY: LOCEAN -USE MODD_ELEC_DESCR, ONLY: CELECNAMES -use modd_field, only: tfielddata, tfieldlist, TYPEDATE, TYPEREAL,TYPELOG,TYPEINT +use modd_field, only: tfieldmetadata, tfieldlist, TYPEDATE, TYPEREAL, TYPELOG, TYPEINT USE MODD_FIELD_n, only: XZWS_DEFAULT -#ifdef MNH_FOREFIRE -USE MODD_FOREFIRE -#endif +USE MODD_FIRE, ONLY: CWINDFILTER, LBLAZE, LRESTA_ASE, LRESTA_AWC, LRESTA_EWAM, LRESTA_WLIM, LWINDFILTER USE MODD_IBM_PARAM_n, ONLY: LIBM -USE MODD_ICE_C1R3_DESCR, ONLY: C1R3NAMES USE MODD_IO, ONLY: TFILEDATA -USE MODD_LATZ_EDFLX -USE MODD_LG, ONLY: CLGNAMES +USE MODD_LATZ_EDFLX, ONLY: LTH_FLX, LUV_FLX USE MODD_LUNIT_N, ONLY: TLUOUT -USE MODD_NSV -USE MODD_OCEANH +USE MODD_NSV, ONLY: NSV, NSV_C2R2BEG, NSV_C2R2END, NSV_CSBEG, NSV_CSEND, & +#ifdef MNH_FOREFIRE + NSV_FFBEG, NSV_FFEND, & +#endif + NSV_PPBEG, NSV_PPEND, NSV_SNW, NSV_USER, TSVLIST +USE MODD_OCEANH, ONLY: NFRCLT, NINFRT, XSSOLA_T, XSSUFL_T, XSSTFL_T, XSSVFL_T USE MODD_PARAM_C2R2, ONLY: LSUPSAT -! -USE MODD_PARAM_LIMA , ONLY: NMOD_CCN, LSCAV, LAERO_MASS, & - NMOD_IFN, NMOD_IMM, NINDICE_CCN_IMM, LHHONI -USE MODD_PARAM_LIMA_COLD, ONLY: CLIMA_COLD_NAMES -USE MODD_PARAM_LIMA_WARM, ONLY: CLIMA_WARM_NAMES, CAERO_MASS +USE MODD_PARAMETERS, ONLY: XUNDEF USE MODD_PARAM_n, ONLY: CSCONV -USE MODD_PASPOL -USE MODD_RAIN_C2R2_DESCR, ONLY: C2R2NAMES -USE MODD_RECYCL_PARAM_n +USE MODD_RECYCL_PARAM_n, ONLY: LRECYCLE, LRECYCLN, LRECYCLS, LRECYCLW, NR_COUNT USE MODD_REF, ONLY: LCOUPLES -USE MODD_SALT -USE MODD_TIME ! for type DATE_TIME +USE MODD_TIME, ONLY: DATE_TIME ! use mode_field, only: Find_field_id_from_mnhname USE MODE_IO_FIELD_READ, only: IO_Field_read @@ -323,8 +313,6 @@ USE MODE_TOOLS, ONLY: UPCASE USE MODI_INI_LB USE MODI_INI_LS ! -USE MODD_FIRE, ONLY: LBLAZE, LRESTA_ASE, LRESTA_AWC, LWINDFILTER, LRESTA_EWAM, LRESTA_WLIM, CWINDFILTER -! IMPLICIT NONE ! !* 0.1 declarations of arguments @@ -339,9 +327,10 @@ INTEGER, INTENT(IN) :: KIU, KJU, KKU CHARACTER (LEN=*), INTENT(IN) :: HGETTKET, & HGETRVT,HGETRCT,HGETRRT, & HGETRIT,HGETRST,HGETRGT,HGETRHT, & - HGETCIT,HGETSRCT,HGETZWS, & - HGETSIGS,HGETCLDFR,HGETICEFR,HGETBL_DEPTH, & - HGETSBL_DEPTH,HGETPHC,HGETPHR + HGETCIT,HGETSRCT, HGETZWS, & + HGETSIGS, HGETCLDFR, HGETICEFR, & + HGETBL_DEPTH, HGETSBL_DEPTH, & + HGETPHC, HGETPHR CHARACTER (LEN=*), DIMENSION(:),INTENT(IN) :: HGETSVT ! ! GET indicators to know wether a given variable should or not be read in the @@ -447,11 +436,12 @@ INTEGER :: IIUP,IJUP ! size of working window arrays INTEGER :: JT ! loop index LOGICAL :: GLSOURCE ! switch for the source term (for ini_ls and ini_lb) LOGICAL :: ZLRECYCL ! switch if turbulence recycling is activated -CHARACTER(LEN=2) :: INDICE +LOGICAL :: GOLDFILEFORMAT CHARACTER(LEN=3) :: YFRC ! To mark the different forcing dates +CHARACTER(LEN=3) :: YNUM3 CHARACTER(LEN=15) :: YVAL REAL, DIMENSION(KIU,KJU,KKU) :: ZWORK ! to compute supersaturation -TYPE(TFIELDDATA) :: TZFIELD +TYPE(TFIELDMETADATA) :: TZFIELD ! !------------------------------------------------------------------------------- ! @@ -461,6 +451,9 @@ TYPE(TFIELDDATA) :: TZFIELD GLSOURCE=.FALSE. ZWORK = 0.0 ! +!If TPINIFILE file was written with a MesoNH version < 5.6, some variables had different names or were not available +GOLDFILEFORMAT = ( TPINIFILE%NMNHVERSION(1) < 5 & + .OR. ( TPINIFILE%NMNHVERSION(1) == 5 .AND. TPINIFILE%NMNHVERSION(2) < 6 ) ) !------------------------------------------------------------------------------- ! !* 2. READ PROGNOSTIC VARIABLES @@ -470,27 +463,27 @@ ZWORK = 0.0 ! IF (TPINIFILE%NMNHVERSION(1)<5) THEN CALL FIND_FIELD_ID_FROM_MNHNAME('UT',IID,IRESP) - TZFIELD = TFIELDLIST(IID) + TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) TZFIELD%CMNHNAME = 'UM' CALL IO_Field_read(TPINIFILE,TZFIELD,PUT) ! CALL FIND_FIELD_ID_FROM_MNHNAME('VT',IID,IRESP) - TZFIELD = TFIELDLIST(IID) + TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) TZFIELD%CMNHNAME = 'VM' CALL IO_Field_read(TPINIFILE,TZFIELD,PVT) ! CALL FIND_FIELD_ID_FROM_MNHNAME('WT',IID,IRESP) - TZFIELD = TFIELDLIST(IID) + TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) TZFIELD%CMNHNAME = 'WM' CALL IO_Field_read(TPINIFILE,TZFIELD,PWT) ! CALL FIND_FIELD_ID_FROM_MNHNAME('THT',IID,IRESP) - TZFIELD = TFIELDLIST(IID) + TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) TZFIELD%CMNHNAME = 'THM' CALL IO_Field_read(TPINIFILE,TZFIELD,PTHT) ! CALL FIND_FIELD_ID_FROM_MNHNAME('PABST',IID,IRESP) - TZFIELD = TFIELDLIST(IID) + TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) TZFIELD%CMNHNAME = 'PABSM' CALL IO_Field_read(TPINIFILE,TZFIELD,PPABST) ELSE @@ -505,7 +498,7 @@ SELECT CASE(HGETTKET) CASE('READ') IF (TPINIFILE%NMNHVERSION(1)<5) THEN CALL FIND_FIELD_ID_FROM_MNHNAME('TKET',IID,IRESP) - TZFIELD = TFIELDLIST(IID) + TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) TZFIELD%CMNHNAME = 'TKEM' CALL IO_Field_read(TPINIFILE,TZFIELD,PTKET) ELSE @@ -539,7 +532,7 @@ SELECT CASE(HGETRVT) ! vapor CASE('READ') IF (TPINIFILE%NMNHVERSION(1)<5) THEN CALL FIND_FIELD_ID_FROM_MNHNAME('RVT',IID,IRESP) - TZFIELD = TFIELDLIST(IID) + TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) TZFIELD%CMNHNAME = 'RVM' CALL IO_Field_read(TPINIFILE,TZFIELD,PRT(:,:,:,IDX_RVT)) ELSE @@ -553,7 +546,7 @@ SELECT CASE(HGETRCT) ! cloud CASE('READ') IF (TPINIFILE%NMNHVERSION(1)<5) THEN CALL FIND_FIELD_ID_FROM_MNHNAME('RCT',IID,IRESP) - TZFIELD = TFIELDLIST(IID) + TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) TZFIELD%CMNHNAME = 'RCM' CALL IO_Field_read(TPINIFILE,TZFIELD,PRT(:,:,:,IDX_RCT)) ELSE @@ -567,7 +560,7 @@ SELECT CASE(HGETRRT) ! rain CASE('READ') IF (TPINIFILE%NMNHVERSION(1)<5) THEN CALL FIND_FIELD_ID_FROM_MNHNAME('RRT',IID,IRESP) - TZFIELD = TFIELDLIST(IID) + TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) TZFIELD%CMNHNAME = 'RRM' CALL IO_Field_read(TPINIFILE,TZFIELD,PRT(:,:,:,IDX_RRT)) ELSE @@ -581,7 +574,7 @@ SELECT CASE(HGETRIT) ! cloud ice CASE('READ') IF (TPINIFILE%NMNHVERSION(1)<5) THEN CALL FIND_FIELD_ID_FROM_MNHNAME('RIT',IID,IRESP) - TZFIELD = TFIELDLIST(IID) + TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) TZFIELD%CMNHNAME = 'RIM' CALL IO_Field_read(TPINIFILE,TZFIELD,PRT(:,:,:,IDX_RIT)) ELSE @@ -595,7 +588,7 @@ SELECT CASE(HGETRST) ! snow CASE('READ') IF (TPINIFILE%NMNHVERSION(1)<5) THEN CALL FIND_FIELD_ID_FROM_MNHNAME('RST',IID,IRESP) - TZFIELD = TFIELDLIST(IID) + TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) TZFIELD%CMNHNAME = 'RSM' CALL IO_Field_read(TPINIFILE,TZFIELD,PRT(:,:,:,IDX_RST)) ELSE @@ -609,7 +602,7 @@ SELECT CASE(HGETRGT) ! graupel CASE('READ') IF (TPINIFILE%NMNHVERSION(1)<5) THEN CALL FIND_FIELD_ID_FROM_MNHNAME('RGT',IID,IRESP) - TZFIELD = TFIELDLIST(IID) + TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) TZFIELD%CMNHNAME = 'RGM' CALL IO_Field_read(TPINIFILE,TZFIELD,PRT(:,:,:,IDX_RGT)) ELSE @@ -623,7 +616,7 @@ SELECT CASE(HGETRHT) ! hail CASE('READ') IF (TPINIFILE%NMNHVERSION(1)<5) THEN CALL FIND_FIELD_ID_FROM_MNHNAME('RHT',IID,IRESP) - TZFIELD = TFIELDLIST(IID) + TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) TZFIELD%CMNHNAME = 'RHM' CALL IO_Field_read(TPINIFILE,TZFIELD,PRT(:,:,:,IDX_RHT)) ELSE @@ -836,554 +829,30 @@ IF (ZLRECYCL) THEN ENDIF ENDIF ENDIF -! -! Scalar Variables Reading : Users, C2R2, C1R3, LIMA, ELEC, Chemical SV -! -ISV= SIZE(PSVT,4) -! -IF (NSV_USER>0) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'kg kg-1' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = 1, NSV_USER ! initialize according to the get indicators - SELECT CASE(HGETSVT(JSV)) - CASE ('READ') - WRITE(TZFIELD%CMNHNAME,'(A3,I3.3)')'SVT',JSV - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CCOMMENT = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME) - CALL IO_Field_read(TPINIFILE,TZFIELD,PSVT(:,:,:,JSV)) - CASE ('INIT') - PSVT(:,:,:,JSV) = 0. - END SELECT - END DO -END IF -! -IF (NSV_C2R2END>=NSV_C2R2BEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'm-3' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_C2R2BEG,NSV_C2R2END - SELECT CASE(HGETSVT(JSV)) - CASE ('READ') - TZFIELD%CMNHNAME = TRIM(C2R2NAMES(JSV-NSV_C2R2BEG+1))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV - CALL IO_Field_read(TPINIFILE,TZFIELD,PSVT(:,:,:,JSV)) - CASE ('INIT') - PSVT(:,:,:,JSV) = 0. - IF (LSUPSAT .AND. (HGETRVT == 'READ') ) THEN - ZWORK(:,:,:) = (PPABST(:,:,:)/XP00 )**(XRD/XCPD) - ZWORK(:,:,:) = PTHT(:,:,:)*ZWORK(:,:,:) - ZWORK(:,:,:) = EXP(XALPW-XBETAW/ZWORK(:,:,:)-XGAMW*ALOG(ZWORK(:,:,:))) - !rvsat - ZWORK(:,:,:) = (XMV / XMD)*ZWORK(:,:,:)/(PPABST(:,:,:)-ZWORK(:,:,:)) - ZWORK(:,:,:) = PRT(:,:,:,1)/ZWORK(:,:,:) - PSVT(:,:,:,NSV_C2R2END ) = ZWORK(:,:,:) - END IF - END SELECT - END DO -END IF -! -IF (NSV_C1R3END>=NSV_C1R3BEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'm-3' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_C1R3BEG,NSV_C1R3END - SELECT CASE(HGETSVT(JSV)) - CASE ('READ') - TZFIELD%CMNHNAME = TRIM(C1R3NAMES(JSV-NSV_C1R3BEG+1))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV - CALL IO_Field_read(TPINIFILE,TZFIELD,PSVT(:,:,:,JSV)) - CASE ('INIT') - PSVT(:,:,:,JSV) = 0. - END SELECT - END DO -END IF -! -! LIMA variables -! -DO JSV = NSV_LIMA_BEG,NSV_LIMA_END - SELECT CASE(HGETSVT(JSV)) - CASE ('READ') - TZFIELD%CSTDNAME = '' - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV - TZFIELD%CDIR = 'XY' - TZFIELD%CUNITS = 'kg-1' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. -! Nc - IF (JSV .EQ. NSV_LIMA_NC) THEN - TZFIELD%CMNHNAME = TRIM(CLIMA_WARM_NAMES(1))//'T' - END IF -! Nr - IF (JSV .EQ. NSV_LIMA_NR) THEN - TZFIELD%CMNHNAME = TRIM(CLIMA_WARM_NAMES(2))//'T' - END IF -! N CCN free - IF (JSV .GE. NSV_LIMA_CCN_FREE .AND. JSV .LT. NSV_LIMA_CCN_ACTI) THEN - WRITE(INDICE,'(I2.2)')(JSV - NSV_LIMA_CCN_FREE + 1) - TZFIELD%CMNHNAME = TRIM(CLIMA_WARM_NAMES(3))//INDICE//'T' - END IF -! N CCN acti - IF (JSV .GE. NSV_LIMA_CCN_ACTI .AND. JSV .LT. NSV_LIMA_CCN_ACTI + NMOD_CCN) THEN - WRITE(INDICE,'(I2.2)')(JSV - NSV_LIMA_CCN_ACTI + 1) - TZFIELD%CMNHNAME = TRIM(CLIMA_WARM_NAMES(4))//INDICE//'T' - END IF -! Scavenging - IF (JSV .EQ. NSV_LIMA_SCAVMASS) THEN - TZFIELD%CMNHNAME = TRIM(CAERO_MASS(1))//'T' - TZFIELD%CUNITS = 'kg kg-1' - END IF -! Ni - IF (JSV .EQ. NSV_LIMA_NI) THEN - TZFIELD%CMNHNAME = TRIM(CLIMA_COLD_NAMES(1))//'T' - END IF -! Ns - IF (JSV .EQ. NSV_LIMA_NS) THEN - TZFIELD%CMNHNAME = TRIM(CLIMA_COLD_NAMES(2))//'T' - END IF -! Ng - IF (JSV .EQ. NSV_LIMA_NG) THEN - TZFIELD%CMNHNAME = TRIM(CLIMA_COLD_NAMES(3))//'T' - END IF -! Nh - IF (JSV .EQ. NSV_LIMA_NH) THEN - TZFIELD%CMNHNAME = TRIM(CLIMA_COLD_NAMES(4))//'T' - END IF -! N IFN free - IF (JSV .GE. NSV_LIMA_IFN_FREE .AND. JSV .LT. NSV_LIMA_IFN_NUCL) THEN - WRITE(INDICE,'(I2.2)')(JSV - NSV_LIMA_IFN_FREE + 1) - TZFIELD%CMNHNAME = TRIM(CLIMA_COLD_NAMES(5))//INDICE//'T' - END IF -! N IFN nucl - IF (JSV .GE. NSV_LIMA_IFN_NUCL .AND. JSV .LT. NSV_LIMA_IFN_NUCL + NMOD_IFN) THEN - WRITE(INDICE,'(I2.2)')(JSV - NSV_LIMA_IFN_NUCL + 1) - TZFIELD%CMNHNAME = TRIM(CLIMA_COLD_NAMES(6))//INDICE//'T' - END IF -! N IMM nucl - IF (JSV .GE. NSV_LIMA_IMM_NUCL .AND. JSV .LT. NSV_LIMA_IMM_NUCL + NMOD_IMM) THEN - WRITE(INDICE,'(I2.2)')(NINDICE_CCN_IMM(JSV - NSV_LIMA_IMM_NUCL + 1)) - TZFIELD%CMNHNAME = TRIM(CLIMA_COLD_NAMES(7))//INDICE//'T' - END IF -! Hom. freez. of CCN - IF (JSV .EQ. NSV_LIMA_HOM_HAZE) THEN - TZFIELD%CMNHNAME = TRIM(CLIMA_COLD_NAMES(8))//'T' - END IF -! -! Super saturation - IF (JSV .EQ. NSV_LIMA_SPRO) THEN - TZFIELD%CMNHNAME = TRIM(CLIMA_WARM_NAMES(5))//'T' - END IF -! - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - CALL IO_Field_read(TPINIFILE,TZFIELD,PSVT(:,:,:,JSV)) - CASE ('INIT') - PSVT(:,:,:,JSV) = 0. - END SELECT -END DO -! -IF (NSV_ELECEND>=NSV_ELECBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_ELECBEG,NSV_ELECEND - SELECT CASE(HGETSVT(JSV)) - CASE ('READ') - TZFIELD%CMNHNAME = TRIM(CELECNAMES(JSV-NSV_ELECBEG+1))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - IF (JSV .GT. NSV_ELECBEG .AND. JSV .LT. NSV_ELECEND) THEN - TZFIELD%CUNITS = 'C m-3' - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV - ELSE - TZFIELD%CUNITS = 'm-3' - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3,A8)')'X_Y_Z_','SVT',JSV,' (nb ions/m3)' - END IF - CALL IO_Field_read(TPINIFILE,TZFIELD,PSVT(:,:,:,JSV)) - CASE ('INIT') - PSVT(:,:,:,JSV) = 0. - END SELECT - END DO -END IF -! -IF (NSV_CHGSEND>=NSV_CHGSBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppbv' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_CHGSBEG,NSV_CHGSEND - CNAMES(JSV-NSV_CHGSBEG+1) = UPCASE(CNAMES(JSV-NSV_CHGSBEG+1)) - SELECT CASE(HGETSVT(JSV)) - CASE ('READ') - TZFIELD%CMNHNAME = TRIM(CNAMES(JSV-NSV_CHGSBEG+1))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A4,I3.3)')'X_Y_Z_','CHIM',JSV - CALL IO_Field_read(TPINIFILE,TZFIELD,PSVT(:,:,:,JSV)) - CASE ('INIT') - PSVT(:,:,:,JSV) = 0. - END SELECT - END DO -END IF -! -IF (NSV_CHACEND>=NSV_CHACBEG) THEN - TZFIELD%CSTDNAME = '' - !PW TODO: check units - TZFIELD%CUNITS = '' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_CHACBEG,NSV_CHACEND - CNAMES(JSV-NSV_CHACBEG+NSV_CHGS+1) = UPCASE(CNAMES(JSV-NSV_CHACBEG+NSV_CHGS+1)) - SELECT CASE(HGETSVT(JSV)) - CASE ('READ') - TZFIELD%CMNHNAME = TRIM(CNAMES(JSV-NSV_CHACBEG+NSV_CHGS+1))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A4,I3.3,A4)')'X_Y_Z_','CHAQ',JSV,' (M)' - CALL IO_Field_read(TPINIFILE,TZFIELD,PSVT(:,:,:,JSV)) -!***ATTENTION: BUG ? field written with a M suffix, read with a T suffix - CASE ('INIT') - PSVT(:,:,:,JSV) = 0. - END SELECT - END DO -END IF -! -IF (NSV_CHICEND>=NSV_CHICBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppp' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_CHICBEG,NSV_CHICEND - CICNAMES(JSV-NSV_CHICBEG+1) = UPCASE(CICNAMES(JSV-NSV_CHICBEG+1)) - SELECT CASE(HGETSVT(JSV)) - CASE ('READ') - TZFIELD%CMNHNAME = TRIM(CICNAMES(JSV-NSV_CHICBEG+1))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV - CALL IO_Field_read(TPINIFILE,TZFIELD,PSVT(:,:,:,JSV)) - CASE ('INIT') - PSVT(:,:,:,JSV) = 0. - END SELECT - END DO -END IF -! -IF (NSV_SLTEND>=NSV_SLTBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppp' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_SLTBEG,NSV_SLTEND - SELECT CASE(HGETSVT(JSV)) - CASE ('READ') - TZFIELD%CMNHNAME = TRIM(CSALTNAMES(JSV-NSV_SLTBEG+1))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV - CALL IO_Field_read(TPINIFILE,TZFIELD,PSVT(:,:,:,JSV)) - CASE ('INIT') - PSVT(:,:,:,JSV) = 0. - END SELECT - END DO -END IF -! -IF (NSV_SLTDEPEND>=NSV_SLTDEPBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppp' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_SLTDEPBEG,NSV_SLTDEPEND - SELECT CASE(HGETSVT(JSV)) - CASE ('READ') - TZFIELD%CMNHNAME = TRIM(CDESLTNAMES(JSV-NSV_SLTDEPBEG+1))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV - CALL IO_Field_read(TPINIFILE,TZFIELD,PSVT(:,:,:,JSV)) - CASE ('INIT') - PSVT(:,:,:,JSV) = 0. - END SELECT - END DO -END IF -! -IF (NSV_DSTEND>=NSV_DSTBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppp' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_DSTBEG,NSV_DSTEND - SELECT CASE(HGETSVT(JSV)) - CASE ('READ') - TZFIELD%CMNHNAME = TRIM(CDUSTNAMES(JSV-NSV_DSTBEG+1))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV - CALL IO_Field_read(TPINIFILE,TZFIELD,PSVT(:,:,:,JSV)) - CASE ('INIT') - PSVT(:,:,:,JSV) = 0. - END SELECT - END DO -END IF -! -IF (NSV_DSTDEPEND>=NSV_DSTDEPBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppp' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_DSTDEPBEG,NSV_DSTDEPEND - SELECT CASE(HGETSVT(JSV)) - CASE ('READ') - TZFIELD%CMNHNAME = TRIM(CDEDSTNAMES(JSV-NSV_DSTDEPBEG+1))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV - CALL IO_Field_read(TPINIFILE,TZFIELD,PSVT(:,:,:,JSV)) - CASE ('INIT') - PSVT(:,:,:,JSV) = 0. - END SELECT - END DO -END IF -! -IF (NSV_AEREND>=NSV_AERBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppp' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_AERBEG,NSV_AEREND - SELECT CASE(HGETSVT(JSV)) - CASE ('READ') - TZFIELD%CMNHNAME = TRIM(UPCASE(CAERONAMES(JSV-NSV_AERBEG+1)))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV - CALL IO_Field_read(TPINIFILE,TZFIELD,PSVT(:,:,:,JSV)) - CASE ('INIT') - PSVT(:,:,:,JSV) = 0. - END SELECT - END DO -END IF -! -IF (NSV_AERDEPEND>=NSV_AERDEPBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppp' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_AERDEPBEG,NSV_AERDEPEND - SELECT CASE(HGETSVT(JSV)) - CASE ('READ') - TZFIELD%CMNHNAME = TRIM(CDEAERNAMES(JSV-NSV_AERDEPBEG+1))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV - CALL IO_Field_read(TPINIFILE,TZFIELD,PSVT(:,:,:,JSV)) - CASE ('INIT') - PSVT(:,:,:,JSV) = 0. - END SELECT - END DO -END IF -! -IF (NSV_LGEND>=NSV_LGBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'm' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_LGBEG,NSV_LGEND - SELECT CASE(HGETSVT(JSV)) - CASE ('READ') - TZFIELD%CMNHNAME = TRIM(CLGNAMES(JSV-NSV_LGBEG+1))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV - CALL IO_Field_read(TPINIFILE,TZFIELD,PSVT(:,:,:,JSV)) - CASE ('INIT') - PSVT(:,:,:,JSV) = 0. - END SELECT - END DO -END IF -! -IF (NSV_PPEND>=NSV_PPBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_PPBEG,NSV_PPEND - SELECT CASE(HGETSVT(JSV)) - CASE ('READ') - WRITE(TZFIELD%CMNHNAME,'(A3,I3.3)')'SVT',JSV - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CCOMMENT = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'kg kg-1' - CALL IO_Field_read(TPINIFILE,TZFIELD,PSVT(:,:,:,JSV),IRESP) - IF (IRESP/=0) THEN - PSVT(:,:,:,JSV) = 0. - END IF - ! - WRITE(TZFIELD%CMNHNAME,'(A3,I3.3)')'ATC',JSV+NSV_PPBEG-1 - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','ATC',JSV+NSV_PPBEG-1 - TZFIELD%CUNITS = 'm-3' - CALL IO_Field_read(TPINIFILE,TZFIELD,PATC(:,:,:,JSV-NSV_PPBEG+1),IRESP) - IF (IRESP/=0) THEN - PATC(:,:,:,JSV-NSV_PPBEG+1) = 0. - ENDIF - CASE ('INIT') - PSVT(:,:,:,JSV) = 0. - PATC(:,:,:,JSV-NSV_PPBEG+1) = 0. - END SELECT - END DO -END IF -! -#ifdef MNH_FOREFIRE -IF (NSV_FFEND>=NSV_FFBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'kg kg-1' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_FFBEG,NSV_FFEND - SELECT CASE(HGETSVT(JSV)) - CASE ('READ') - WRITE(TZFIELD%CMNHNAME,'(A3,I3.3)')'SVT',JSV - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CCOMMENT = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME) - CALL IO_Field_read(TPINIFILE,TZFIELD,PSVT(:,:,:,JSV),IRESP) - IF (IRESP /= 0) THEN - PSVT(:,:,:,JSV) = 0. - END IF - CASE ('INIT') - PSVT(:,:,:,JSV) = 0. - END SELECT - END DO -END IF -#endif -! Blaze smoke variables -IF (NSV_FIREEND>=NSV_FIREBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'kg kg-1' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_FIREBEG,NSV_FIREEND - SELECT CASE(HGETSVT(JSV)) - CASE ('READ') - WRITE(TZFIELD%CMNHNAME,'(A3,I3.3)')'SVT',JSV - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CCOMMENT = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME) - CALL IO_Field_read(TPINIFILE,TZFIELD,PSVT(:,:,:,JSV),IRESP) - IF (IRESP /= 0) THEN - PSVT(:,:,:,JSV) = 0. - END IF - CASE ('INIT') - PSVT(:,:,:,JSV) = 0. - END SELECT - END DO -END IF -! -IF (NSV_CSEND>=NSV_CSBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'kg kg-1' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_CSBEG,NSV_CSEND - SELECT CASE(HGETSVT(JSV)) - CASE ('READ') - WRITE(TZFIELD%CMNHNAME,'(A3,I3.3)')'SVT',JSV - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CCOMMENT = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME) - CALL IO_Field_read(TPINIFILE,TZFIELD,PSVT(:,:,:,JSV),IRESP) - IF (IRESP /= 0) THEN - PSVT(:,:,:,JSV) = 0. - END IF - CASE ('INIT') - PSVT(:,:,:,JSV) = 0. - END SELECT - END DO -END IF + ! Blaze fire model IF (LBLAZE .AND. CCONF=='RESTA') THEN ! Blaze is not compliant with MNHVERSION(1)<5 ! Blaze begins with MNH 5.3.1 CALL IO_Field_read(TPINIFILE,'LSPHI',PLSPHI,IRESP) - IF (IRESP /= 0) PLSPHI = 0. + IF (IRESP /= 0) PLSPHI(:,:,:) = 0. CALL IO_Field_read(TPINIFILE,'BMAP',PBMAP,IRESP) - IF (IRESP /= 0) PBMAP = -1. + IF (IRESP /= 0) PBMAP(:,:,:) = -1. CALL IO_Field_read(TPINIFILE,'FMASE',PFMASE,IRESP) IF(IRESP == 0) THEN ! flag for the use of restart value for ASE initialization LRESTA_ASE = .TRUE. ELSE - PFMASE = 0. + CALL PRINT_MSG( NVERB_WARNING, 'IO', 'READ_FIELD', 'PFMASE set to 0' ) + PFMASE(:,:,:) = 0. END IF CALL IO_Field_read(TPINIFILE,'FMAWC',PFMAWC,IRESP) ! flag for the use of restart value for AWC initialization IF(IRESP == 0) THEN LRESTA_AWC = .TRUE. ELSE - PFMAWC = 0. + CALL PRINT_MSG( NVERB_WARNING, 'IO', 'READ_FIELD', 'PFMAWC set to 0' ) + PFMAWC(:,:,:) = 0. END IF ! read wind on fire grid if present IF (LWINDFILTER) THEN @@ -1396,7 +865,8 @@ IF (LBLAZE .AND. CCONF=='RESTA') THEN IF(IRESP == 0) THEN LRESTA_EWAM = .TRUE. ELSE - PFMWINDU = 0. + CALL PRINT_MSG( NVERB_WARNING, 'IO', 'READ_FIELD', 'PFMWINDU set to 0' ) + PFMWINDU(:,:,:) = 0. END IF ! read v CALL IO_Field_read(TPINIFILE,'FMWINDV',PFMWINDV,IRESP) @@ -1408,7 +878,10 @@ IF (LBLAZE .AND. CCONF=='RESTA') THEN ! u or v fields NOT found LRESTA_EWAM = .FALSE. END IF - IF (IRESP /= 0) PFMWINDV = 0. + IF (IRESP /= 0) THEN + CALL PRINT_MSG( NVERB_WARNING, 'IO', 'READ_FIELD', 'PFMWINDV set to 0' ) + PFMWINDV(:,:,:) = 0. + END IF ! read w CALL IO_Field_read(TPINIFILE,'FMWINDW',PFMWINDW,IRESP) ! flag for EWAM filtered w wind @@ -1419,7 +892,10 @@ IF (LBLAZE .AND. CCONF=='RESTA') THEN ! u or v or w fields NOT found LRESTA_EWAM = .FALSE. END IF - IF (IRESP /= 0) PFMWINDW = 0. + IF (IRESP /= 0) THEN + CALL PRINT_MSG( NVERB_WARNING, 'IO', 'READ_FIELD', 'PFMWINDW set to 0' ) + PFMWINDW(:,:,:) = 0. + END IF CASE('WLIM') CALL IO_Field_read(TPINIFILE,'FMHWS',PFMHWS,IRESP) @@ -1427,55 +903,96 @@ IF (LBLAZE .AND. CCONF=='RESTA') THEN IF(IRESP == 0) THEN LRESTA_WLIM = .TRUE. ELSE - PFMHWS = 0. + CALL PRINT_MSG( NVERB_WARNING, 'IO', 'READ_FIELD', 'PFMHWS set to 0' ) + PFMHWS(:,:,:) = 0. END IF END SELECT END IF END IF ! -IF (NSV_LNOXEND>=NSV_LNOXBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppp' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_LNOXBEG,NSV_LNOXEND - SELECT CASE(HGETSVT(JSV)) - CASE ('READ') - TZFIELD%CMNHNAME = 'LINOXT' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)') 'X_Y_Z_','SVT',JSV - CALL IO_Field_read(TPINIFILE,TZFIELD,PSVT(:,:,:,JSV)) - CASE ('INIT') - PSVT(:,:,:,JSV) = 0. - END SELECT - END DO -END IF +! Scalar Variables Reading : Users, C2R2, C1R3, LIMA, ELEC, Chemical SV ! -IF (NSV_SNWEND>=NSV_SNWBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'kg kg-1' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - DO JSV = NSV_SNWBEG,NSV_SNWEND - SELECT CASE(HGETSVT(JSV)) - CASE ('READ') - TZFIELD%CMNHNAME = TRIM(CSNOWNAMES(JSV-NSV_SNWBEG+1))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)') 'X_Y_Z_','SVT',JSV - CALL IO_Field_read(TPINIFILE,TZFIELD,PSVT(:,:,:,JSV)) - CASE ('INIT') +ISV= SIZE(PSVT,4) +! +DO JSV = 1, NSV ! initialize according to the get indicators + SELECT CASE( HGETSVT(JSV) ) + CASE ('READ') + TZFIELD = TSVLIST(JSV) + + IF ( GOLDFILEFORMAT ) THEN + IF ( ( JSV >= 1 .AND. JSV <= NSV_USER ) .OR. & + ( JSV >= NSV_PPBEG .AND. JSV <= NSV_PPEND ) .OR. & +#ifdef MNH_FOREFIRE + ( JSV >= NSV_FFBEG .AND. JSV <= NSV_FFEND ) .OR. & +#endif + ( JSV >= NSV_CSBEG .AND. JSV <= NSV_CSEND ) ) THEN + !Some variables were written with an other name in MesoNH < 5.6 + WRITE(TZFIELD%CMNHNAME,'(A3,I3.3)')'SVT',JSV + TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) + TZFIELD%CSTDNAME = '' + TZFIELD%CCOMMENT = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME) + ELSE + !Scalar variables were written with a T suffix in older versions + TZFIELD%CMNHNAME = TRIM( TZFIELD%CMNHNAME ) // 'T' + TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T' + END IF + END IF + + CALL IO_Field_read( TPINIFILE, TZFIELD, PSVT(:,:,:,JSV), IRESP ) + + IF ( IRESP /= 0 ) THEN + CALL PRINT_MSG( NVERB_WARNING, 'IO', 'READ_FIELD', 'PSVT set to 0 for ' // TRIM( TZFIELD%CMNHNAME ) ) PSVT(:,:,:,JSV) = 0. - END SELECT - END DO -END IF -IF (NSV_SNW>=1) THEN + END IF + + CASE ('INIT') + PSVT(:,:,:,JSV) = 0. + + IF ( JSV == NSV_C2R2END ) THEN + IF ( LSUPSAT .AND. (HGETRVT == 'READ') ) THEN + ZWORK(:,:,:) = (PPABST(:,:,:)/XP00 )**(XRD/XCPD) + ZWORK(:,:,:) = PTHT(:,:,:)*ZWORK(:,:,:) + ZWORK(:,:,:) = EXP(XALPW-XBETAW/ZWORK(:,:,:)-XGAMW*LOG(ZWORK(:,:,:))) + !rvsat + ZWORK(:,:,:) = (XMV / XMD)*ZWORK(:,:,:)/(PPABST(:,:,:)-ZWORK(:,:,:)) + ZWORK(:,:,:) = PRT(:,:,:,IDX_RVT)/ZWORK(:,:,:) + PSVT(:,:,:,NSV_C2R2END ) = ZWORK(:,:,:) + END IF + END IF + + END SELECT +END DO + +DO JSV = NSV_PPBEG, NSV_PPEND + SELECT CASE( HGETSVT(JSV) ) + CASE ('READ') + WRITE( YNUM3, '( I3.3 )' ) JSV + + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'ATC' // YNUM3, & + CSTDNAME = '', & + CLONGNAME = 'ATC' // YNUM3, & + CCOMMENT = 'X_Y_Z_ATC' // YNUM3, & + CUNITS = 'm-3', & + CDIR = 'XY', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) + + CALL IO_Field_read( TPINIFILE, TZFIELD, PATC(:,:,:,JSV-NSV_PPBEG+1), IRESP ) + + IF ( IRESP /= 0 ) THEN + PATC(:,:,:,JSV-NSV_PPBEG+1) = 0. + ENDIF + + CASE ('INIT') + PATC(:,:,:,JSV-NSV_PPBEG+1) = 0. + + END SELECT +END DO + +IF ( NSV_SNW >= 1 ) THEN TZFIELD%CSTDNAME = '' TZFIELD%CUNITS = 'kg kg-1' TZFIELD%CDIR = 'XY' @@ -1483,20 +1000,18 @@ IF (NSV_SNW>=1) THEN TZFIELD%NTYPE = TYPEREAL TZFIELD%NDIMS = 2 TZFIELD%LTIMEDEP = .TRUE. - DO JSV = 1,NSV_SNW + DO JSV = 1, NSV_SNW SELECT CASE(HGETSVT(JSV)) CASE ('READ') - WRITE(TZFIELD%CMNHNAME,'(A10,I3.3)')'SNOWCANO_M',JSV + WRITE(TZFIELD%CMNHNAME,'(A10,I3.3)')'SNOWCANO_M',JSV TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) WRITE(TZFIELD%CCOMMENT,'(A6,A8,I3.3)') 'X_Y_Z_','SNOWCANO',JSV - CALL IO_Field_read(TPINIFILE,TZFIELD,XSNWCANO(:,:,JSV)) + CALL IO_Field_read( TPINIFILE, TZFIELD, XSNWCANO(:,:,JSV) ) CASE ('INIT') XSNWCANO(:,:,JSV) = 0. END SELECT END DO - END IF - ! IF (CCONF == 'RESTA') THEN IF (CTEMP_SCHEME/='LEFR') THEN @@ -1598,7 +1113,13 @@ CALL INI_LB(TPINIFILE,GLSOURCE,ISV, & ! CALL IO_Field_read(TPINIFILE,'DRYMASST',PDRYMASST) ! dry mass IF (CCONF=='RESTA') THEN - CALL IO_Field_read(TPINIFILE,'DRYMASSS',PDRYMASSS) ! dry mass tendency + CALL IO_Field_read(TPINIFILE,'DRYMASSS',PDRYMASSS,IRESP) ! dry mass tendency + + ! DRYMASSS was not written in backup files before MesoNH 5.5.1 + IF ( IRESP /= 0 ) THEN + CALL PRINT_MSG( NVERB_WARNING, 'IO', 'READ_FIELD', 'PDRYMASSS set to 0 for ' // TRIM( TZFIELD%CMNHNAME ) ) + PDRYMASSS = 0. + END IF ELSE PDRYMASSS=XUNDEF ! should not be used END IF diff --git a/src/MNH/read_hgrid.f90 b/src/MNH/read_hgrid.f90 index c695be83b8a5a090518995350f0966ca72c00e2f..30a92650b1f57ff963a98821611c274cf4e69445 100644 --- a/src/MNH/read_hgrid.f90 +++ b/src/MNH/read_hgrid.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1996-2020 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1996-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. @@ -81,7 +81,7 @@ END MODULE MODI_READ_HGRID !* 0. DECLARATIONS ! USE MODD_CONF, ONLY: CPROGRAM -use modd_field, only: tfielddata, tfieldlist +use modd_field, only: tfieldmetadata, tfieldlist USE MODD_GRID USE MODD_IO, ONLY: TFILEDATA USE MODD_PARAMETERS @@ -117,7 +117,7 @@ INTEGER :: IID, IMI LOGICAL :: G1D,G2D,GPACK INTEGER :: IINFO_ll REAL :: ZLATOR, ZLONOR, ZXHATM, ZYHATM -TYPE(TFIELDDATA) :: TZFIELD +TYPE(TFIELDMETADATA) :: TZFIELD !------------------------------------------------------------------------------- ! !* 1. TEST ON MODEL INDEX @@ -201,12 +201,12 @@ CALL IO_Pack_set(G1D,G2D,GPACK) !------------------------------------------------------------------------------- IF (TPFMFILE%NMNHVERSION(1)<4 .OR. (TPFMFILE%NMNHVERSION(1)==4 .AND. TPFMFILE%NMNHVERSION(2)<=5)) THEN CALL FIND_FIELD_ID_FROM_MNHNAME('LONORI',IID,IRESP) - TZFIELD = TFIELDLIST(IID) + TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) TZFIELD%CMNHNAME = 'LONOR' CALL IO_Field_read(TPFMFILE,TZFIELD,XPGDLONOR) ! CALL FIND_FIELD_ID_FROM_MNHNAME('LATORI',IID,IRESP) - TZFIELD = TFIELDLIST(IID) + TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) TZFIELD%CMNHNAME = 'LATOR' CALL IO_Field_read(TPFMFILE,TZFIELD,XPGDLATOR) ! diff --git a/src/MNH/read_hgridn.f90 b/src/MNH/read_hgridn.f90 index 41385f588e3808e85c1438f8f4eb9ee7fc763edc..1ac466b48e61249026080ac6614027b04b287399 100644 --- a/src/MNH/read_hgridn.f90 +++ b/src/MNH/read_hgridn.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1996-2020 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1996-2022 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. @@ -80,7 +80,7 @@ END MODULE MODI_READ_HGRID_n ! USE MODD_CONF USE MODD_DIM_n -use modd_field, only: tfielddata, tfieldlist +use modd_field, only: tfieldmetadata, tfieldlist USE MODD_GRID USE MODD_GRID_n USE MODD_IO, ONLY: TFILEDATA @@ -93,6 +93,7 @@ USE MODE_IO, only: IO_Pack_set USE MODE_IO_FIELD_READ, only: IO_Field_read USE MODE_MSG USE MODE_MODELN_HANDLER +USE MODE_SET_GRID, only: INTERP_HORGRID_TO_MASSPOINTS, STORE_GLOB_HORGRID use MODE_TOOLS_ll, only: GET_DIM_EXT_ll, GET_DIM_PHYS_ll, GET_INDICE_ll ! IMPLICIT NONE @@ -106,21 +107,21 @@ CHARACTER(LEN=2) , INTENT(OUT) :: HSTORAGE_TYPE ! !* 0.2 declarations of local variables ! -INTEGER :: ILUOUT -INTEGER :: IRESP -REAL :: ZLAT0,ZLON0,ZRPK,ZBETA -REAL :: ZEPS = 1.E-10 -INTEGER :: IID, IMI +INTEGER :: ILUOUT +INTEGER :: IRESP +REAL :: ZLAT0,ZLON0,ZRPK,ZBETA +REAL :: ZEPS = 1.E-10 +INTEGER :: IID, IMI ! !------------------------------------------------------------------------------- REAL :: ZLATOR, ZLONOR, ZXHATM, ZYHATM !------------------------------------------------------------------------------- !JUAN REALZ -INTEGER :: IIU,IJU +INTEGER :: IIU,IJU !JUAN REALZ -INTEGER :: IXOR, IYOR, IXEND, IYEND -INTEGER :: IJPHEXT -TYPE(TFIELDDATA) :: TZFIELD +INTEGER :: IXOR, IYOR, IXEND, IYEND +INTEGER :: IJPHEXT +TYPE(TFIELDMETADATA) :: TZFIELD ! ILUOUT = TLUOUT%NLU ! @@ -250,7 +251,16 @@ ENDIF CALL IO_Field_read(TPFMFILE,'XHAT',XXHAT) CALL IO_Field_read(TPFMFILE,'YHAT',XYHAT) -! + +IF ( .NOT. ASSOCIATED(XXHATM) ) ALLOCATE( XXHATM(SIZE( XXHAT )) ) +IF ( .NOT. ASSOCIATED(XYHATM) ) ALLOCATE( XYHATM(SIZE( XYHAT )) ) + +! Interpolations of positions to mass points +CALL INTERP_HORGRID_TO_MASSPOINTS( XXHAT, XYHAT, XXHATM, XYHATM ) + +! Collect global domain boundaries +CALL STORE_GLOB_HORGRID( XXHAT, XYHAT, XXHATM, XYHATM, XXHAT_ll, XYHAT_ll, XXHATM_ll, XYHATM_ll, XHAT_BOUND, XHATM_BOUND ) + !JUAN REALZ IF ( CPROGRAM .EQ. "REAL " ) THEN IF (.NOT. (ASSOCIATED(XZS))) ALLOCATE(XZS(IIU,IJU)) @@ -279,12 +289,12 @@ END IF !------------------------------------------------------------------------------- IF (TPFMFILE%NMNHVERSION(1)<4 .OR. (TPFMFILE%NMNHVERSION(1)==4 .AND. TPFMFILE%NMNHVERSION(2)<=5)) THEN CALL FIND_FIELD_ID_FROM_MNHNAME('LONORI',IID,IRESP) - TZFIELD = TFIELDLIST(IID) + TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) TZFIELD%CMNHNAME = 'LONOR' CALL IO_Field_read(TPFMFILE,TZFIELD,XLONORI) ! CALL FIND_FIELD_ID_FROM_MNHNAME('LATORI',IID,IRESP) - TZFIELD = TFIELDLIST(IID) + TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) TZFIELD%CMNHNAME = 'LATOR' CALL IO_Field_read(TPFMFILE,TZFIELD,XLATORI) ! diff --git a/src/MNH/read_precip_field.f90 b/src/MNH/read_precip_field.f90 index 0946c03a882fbcf524a7f2b76846cfb4400c879f..0d74aaf464ddaa6aad01cdf66a4d0fccdc272d1d 100644 --- a/src/MNH/read_precip_field.f90 +++ b/src/MNH/read_precip_field.f90 @@ -98,7 +98,7 @@ END MODULE MODI_READ_PRECIP_FIELD ! !* 0. DECLARATIONS -use modd_field, only: tfielddata, tfieldlist +use modd_field, only: tfieldmetadata, tfieldlist USE MODD_IO, ONLY: TFILEDATA USE MODD_PARAM_ICE, ONLY: LDEPOSC USE MODD_PARAM_C2R2, ONLY: LDEPOC @@ -138,10 +138,10 @@ REAL, DIMENSION(:,:), INTENT(INOUT) :: PACPRH ! Hail accumulated precip REAL, DIMENSION(SIZE(PINPRR,1),SIZE(PINPRR,2)) :: Z2D ! 2D array to read data REAL, DIMENSION(SIZE(PINPRR3D,1),SIZE(PINPRR3D,2),SIZE(PINPRR3D,3)) :: Z3D ! 3D array to read data ! in initial file -INTEGER :: IID -INTEGER :: IRESP -CHARACTER(LEN=4) :: YGETRCT,YGETRRT,YGETRST,YGETRGT,YGETRHT -TYPE(TFIELDDATA) :: TZFIELD +INTEGER :: IID +INTEGER :: IRESP +CHARACTER(LEN=4) :: YGETRCT,YGETRRT,YGETRST,YGETRGT,YGETRHT +TYPE(TFIELDMETADATA) :: TZFIELD ! !------------------------------------------------------------------------------- ! @@ -170,13 +170,13 @@ IF (SIZE(PINPRC) /= 0 ) THEN SELECT CASE(YGETRCT) CASE ('READ') CALL FIND_FIELD_ID_FROM_MNHNAME('INPRC',IID,IRESP) - TZFIELD = TFIELDLIST(IID) + TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) TZFIELD%CUNITS = 'mm hour-1' CALL IO_Field_read(TPINIFILE,TZFIELD,Z2D,IRESP) IF (IRESP == 0) PINPRC(:,:)=Z2D(:,:)/(1000.*3600.) ! CALL FIND_FIELD_ID_FROM_MNHNAME('ACPRC',IID,IRESP) - TZFIELD = TFIELDLIST(IID) + TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) TZFIELD%CUNITS = 'mm' CALL IO_Field_read(TPINIFILE,TZFIELD,Z2D,IRESP) IF (IRESP == 0) PACPRC(:,:)=Z2D(:,:)/(1000.) @@ -190,13 +190,13 @@ IF (SIZE(PINDEP) /= 0 ) THEN SELECT CASE(YGETRCT) CASE ('READ') CALL FIND_FIELD_ID_FROM_MNHNAME('INDEP',IID,IRESP) - TZFIELD = TFIELDLIST(IID) + TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) TZFIELD%CUNITS = 'mm hour-1' CALL IO_Field_read(TPINIFILE,TZFIELD,Z2D,IRESP) IF (IRESP == 0) PINDEP(:,:)=Z2D(:,:)/(1000.*3600.) ! CALL FIND_FIELD_ID_FROM_MNHNAME('ACDEP',IID,IRESP) - TZFIELD = TFIELDLIST(IID) + TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) TZFIELD%CUNITS = 'mm' CALL IO_Field_read(TPINIFILE,TZFIELD,Z2D,IRESP) IF (IRESP == 0) PACDEP(:,:)=Z2D(:,:)/(1000.) @@ -210,7 +210,7 @@ IF (SIZE(PINPRR) /= 0 ) THEN SELECT CASE(YGETRRT) CASE ('READ') CALL FIND_FIELD_ID_FROM_MNHNAME('INPRR',IID,IRESP) - TZFIELD = TFIELDLIST(IID) + TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) TZFIELD%CUNITS = 'mm hour-1' CALL IO_Field_read(TPINIFILE,TZFIELD,Z2D,IRESP) IF (IRESP == 0) PINPRR(:,:)=Z2D(:,:)/(1000.*3600.) @@ -222,7 +222,7 @@ IF (SIZE(PINPRR) /= 0 ) THEN IF (IRESP == 0) PEVAP3D(:,:,:)=Z3D(:,:,:) ! CALL FIND_FIELD_ID_FROM_MNHNAME('ACPRR',IID,IRESP) - TZFIELD = TFIELDLIST(IID) + TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) TZFIELD%CUNITS = 'mm' CALL IO_Field_read(TPINIFILE,TZFIELD,Z2D,IRESP) IF (IRESP == 0) PACPRR(:,:)=Z2D(:,:)/(1000.) @@ -238,13 +238,13 @@ IF (SIZE(PINPRS) /= 0 ) THEN SELECT CASE(YGETRST) CASE ('READ') CALL FIND_FIELD_ID_FROM_MNHNAME('INPRS',IID,IRESP) - TZFIELD = TFIELDLIST(IID) + TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) TZFIELD%CUNITS = 'mm hour-1' CALL IO_Field_read(TPINIFILE,TZFIELD,Z2D,IRESP) IF (IRESP == 0) PINPRS(:,:)=Z2D(:,:)/(1000.*3600.) ! CALL FIND_FIELD_ID_FROM_MNHNAME('ACPRS',IID,IRESP) - TZFIELD = TFIELDLIST(IID) + TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) TZFIELD%CUNITS = 'mm' CALL IO_Field_read(TPINIFILE,TZFIELD,Z2D,IRESP) IF (IRESP == 0) PACPRS(:,:)=Z2D(:,:)/(1000.) @@ -258,13 +258,13 @@ IF (SIZE(PINPRG) /= 0 ) THEN SELECT CASE(YGETRGT) CASE ('READ') CALL FIND_FIELD_ID_FROM_MNHNAME('INPRG',IID,IRESP) - TZFIELD = TFIELDLIST(IID) + TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) TZFIELD%CUNITS = 'mm hour-1' CALL IO_Field_read(TPINIFILE,TZFIELD,Z2D,IRESP) IF (IRESP == 0) PINPRG(:,:)=Z2D(:,:)/(1000.*3600.) ! CALL FIND_FIELD_ID_FROM_MNHNAME('ACPRG',IID,IRESP) - TZFIELD = TFIELDLIST(IID) + TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) TZFIELD%CUNITS = 'mm' CALL IO_Field_read(TPINIFILE,TZFIELD,Z2D,IRESP) IF (IRESP == 0) PACPRG(:,:)=Z2D(:,:)/(1000.) @@ -278,13 +278,13 @@ IF (SIZE(PINPRH) /= 0 ) THEN SELECT CASE(YGETRHT) CASE ('READ') CALL FIND_FIELD_ID_FROM_MNHNAME('INPRH',IID,IRESP) - TZFIELD = TFIELDLIST(IID) + TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) TZFIELD%CUNITS = 'mm hour-1' CALL IO_Field_read(TPINIFILE,TZFIELD,Z2D,IRESP) IF (IRESP == 0) PINPRH(:,:)=Z2D(:,:)/(1000.*3600.) ! CALL FIND_FIELD_ID_FROM_MNHNAME('ACPRH',IID,IRESP) - TZFIELD = TFIELDLIST(IID) + TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) TZFIELD%CUNITS = 'mm' CALL IO_Field_read(TPINIFILE,TZFIELD,Z2D,IRESP) IF (IRESP == 0) PACPRH(:,:)=Z2D(:,:)/(1000.) diff --git a/src/MNH/read_surf_mnh.f90 b/src/MNH/read_surf_mnh.f90 index 30b2a93712df54151a1f2dd8927e3e2de626d8d9..96693291f32ee2a1d2e1cb0260b2f7f5d6604ffb 100644 --- a/src/MNH/read_surf_mnh.f90 +++ b/src/MNH/read_surf_mnh.f90 @@ -18,7 +18,7 @@ CONTAINS SUBROUTINE PREPARE_METADATA_READ_SURF(HREC,HDIR,KGRID,KTYPE,KDIMS,HSUBR,TPFIELD) ! -use modd_field, only: tfielddata, tfieldlist, TYPECHAR, TYPEDATE, TYPELOG +use modd_field, only: tfieldmetadata, tfieldlist use mode_field, only: Find_field_id_from_mnhname ! CHARACTER(LEN=LEN_HREC),INTENT(IN) :: HREC ! name of the article to write @@ -27,14 +27,14 @@ INTEGER, INTENT(IN) :: KGRID ! Localization on the model grid INTEGER, INTENT(IN) :: KTYPE ! Datatype INTEGER, INTENT(IN) :: KDIMS ! Number of dimensions CHARACTER(LEN=*), INTENT(IN) :: HSUBR ! name of the subroutine calling -TYPE(TFIELDDATA), INTENT(OUT) :: TPFIELD ! metadata of field +TYPE(TFIELDMETADATA), INTENT(OUT) :: TPFIELD ! metadata of field ! CHARACTER(LEN=32) :: YTXT INTEGER :: IID, IRESP ! CALL FIND_FIELD_ID_FROM_MNHNAME(TRIM(HREC),IID,IRESP,ONOWARNING=.TRUE.) IF (IRESP==0) THEN - TPFIELD = TFIELDLIST(IID) + TPFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) !Modify and check CLONGNAME IF (TRIM(TPFIELD%CLONGNAME)/=TRIM(HREC) & .AND. TRIM(HREC)/='VERSION' .AND. TRIM(HREC)/='BUG') THEN @@ -71,25 +71,24 @@ IF (IRESP==0) THEN END IF ELSE CALL PRINT_MSG(NVERB_DEBUG,'IO',TRIM(HSUBR),TRIM(HREC)//' not found in FIELDLIST. Generating default metadata') - TPFIELD%CMNHNAME = TRIM(HREC) - TPFIELD%CSTDNAME = '' - TPFIELD%CLONGNAME = TRIM(HREC) - TPFIELD%CUNITS = '' - TPFIELD%CDIR = HDIR - TPFIELD%CCOMMENT = '' !Expected comment is not known - TPFIELD%NGRID = KGRID - TPFIELD%NTYPE = KTYPE - TPFIELD%NDIMS = KDIMS + TPFIELD = TFIELDMETADATA( & + CMNHNAME = TRIM(HREC), & + CSTDNAME = '', & + CLONGNAME = TRIM(HREC), & + CUNITS = '', & + CDIR = HDIR, & + CCOMMENT = '', & !Expected comment is not known + NGRID = KGRID, & + NTYPE = KTYPE, & + NDIMS = KDIMS, & + LTIMEDEP = .FALSE. ) #if 0 IF (TPFIELD%NDIMS==0 .OR. TPFIELD%NTYPE==TYPECHAR .OR. TPFIELD%NTYPE==TYPEDATE .OR. TPFIELD%NTYPE==TYPELOG) THEN TPFIELD%LTIMEDEP = .FALSE. ELSE TPFIELD%LTIMEDEP = .TRUE. END IF -#else - TPFIELD%LTIMEDEP = .FALSE. #endif - END IF ! END SUBROUTINE PREPARE_METADATA_READ_SURF @@ -141,7 +140,7 @@ END MODULE MODE_READ_SURF_MNH_TOOLS ! ------------ ! USE MODD_CONF, ONLY: CPROGRAM -use modd_field, only: tfielddata, tfieldlist, TYPEREAL +use modd_field, only: tfieldmetadata, tfieldlist, TYPEREAL USE MODD_GRID, ONLY: XRPK,XBETA,XLAT0,XLON0 USE MODD_IO_SURF_MNH, ONLY: TOUT, TPINFILE USE MODD_PARAMETERS, ONLY: JPHEXT, XUNDEF @@ -165,15 +164,15 @@ CHARACTER(LEN=*), INTENT(OUT) :: HCOMMENT ! comment ! !* 0.2 Declarations of local variables ! -INTEGER :: IGRID ! IGRID : grid indicator -INTEGER :: ILENCH ! ILENCH : length of comment string -INTEGER :: ILUOUT -INTEGER :: IID,IRESP -INTEGER :: IIMAX,IJMAX +INTEGER :: IGRID ! IGRID : grid indicator +INTEGER :: ILENCH ! ILENCH : length of comment string +INTEGER :: ILUOUT +INTEGER :: IID,IRESP +INTEGER :: IIMAX,IJMAX REAL,DIMENSION(:), ALLOCATABLE :: ZXHAT,ZYHAT -REAL :: ZLATOR,ZLONOR,ZXHATM,ZYHATM,ZLATORI,ZLONORI -REAL :: ZRPK, ZBETA, ZLAT0, ZLON0 -TYPE(TFIELDDATA) :: TZFIELD +REAL :: ZLATOR,ZLONOR,ZXHATM,ZYHATM,ZLATORI,ZLONORI +REAL :: ZRPK, ZBETA, ZLAT0, ZLON0 +TYPE(TFIELDMETADATA) :: TZFIELD !------------------------------------------------------------------------------- ! CALL PRINT_MSG(NVERB_DEBUG,'IO','READ_SURFX0_MNH',TRIM(TPINFILE%CNAME)//': reading '//TRIM(HREC)) @@ -203,12 +202,12 @@ IF (HREC=='LONORI' .OR. HREC=='LATORI') THEN CALL IO_Field_read(TPINFILE,'YHAT',ZYHAT) ! CALL FIND_FIELD_ID_FROM_MNHNAME('LONORI',IID,IRESP) - TZFIELD = TFIELDLIST(IID) + TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) TZFIELD%CMNHNAME = 'LONOR' CALL IO_Field_read(TPINFILE,TZFIELD,ZLONOR) ! CALL FIND_FIELD_ID_FROM_MNHNAME('LATORI',IID,IRESP) - TZFIELD = TFIELDLIST(IID) + TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) TZFIELD%CMNHNAME = 'LATOR' CALL IO_Field_read(TPINFILE,TZFIELD,ZLATOR) ! @@ -291,7 +290,7 @@ END SUBROUTINE READ_SURFX0_MNH ! ------------ ! USE MODD_CST, ONLY: XPI -use modd_field, only: tfielddata, tfieldlist, TYPEREAL +use modd_field, only: tfieldmetadata, tfieldlist, TYPEREAL USE MODD_IO_SURF_MNH, ONLY: TOUT, TPINFILE, NMASK, & NIU, NJU, NIB, NJB, NIE, NJE, & NIU_ALL, NJU_ALL, NIB_ALL, & @@ -337,11 +336,11 @@ REAL :: ZW ! work value CHARACTER(LEN=LEN_HREC) :: YREC CHARACTER(LEN=2) :: YSTORAGE_TYPE ! -INTEGER :: IID, IRESP -INTEGER :: IIU, IJU, IIB, IJB, IIE, IJE ! dimensions of horizontal fields +INTEGER :: IID, IRESP +INTEGER :: IIU, IJU, IIB, IJB, IIE, IJE ! dimensions of horizontal fields INTEGER, DIMENSION(:), ALLOCATABLE :: IMASK ! mask for packing -REAL :: ZUNDEF ! undefined value in SURFEX -TYPE(TFIELDDATA) :: TZFIELD +REAL :: ZUNDEF ! undefined value in SURFEX +TYPE(TFIELDMETADATA) :: TZFIELD !------------------------------------------------------------------------------- ! CALL PRINT_MSG(NVERB_DEBUG,'IO','READ_SURFX1_MNH',TRIM(TPINFILE%CNAME)//': reading '//TRIM(HREC)) @@ -392,7 +391,7 @@ ELSE IF (HREC=='XX') THEN ALLOCATE(ZWORK (IIU,IJU)) ZWORK(:,:) = 0. CALL FIND_FIELD_ID_FROM_MNHNAME('XHAT',IID,IRESP) - TZFIELD = TFIELDLIST(IID) + TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) IF (HDIR/='A'.AND.HDIR/='E') THEN TZFIELD%CDIR = 'XX' ELSE @@ -412,7 +411,7 @@ ELSE IF (HREC=='DX') THEN ALLOCATE(ZWORK (IIU,IJU)) ZWORK(:,:) = 0. CALL FIND_FIELD_ID_FROM_MNHNAME('XHAT',IID,IRESP) - TZFIELD = TFIELDLIST(IID) + TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) IF (HDIR/='A'.AND.HDIR/='E') THEN TZFIELD%CDIR = 'XX' ELSE @@ -432,7 +431,7 @@ ELSE IF (HREC=='YY') THEN ALLOCATE(ZWORK (IIU,IJU)) ZWORK(:,:) = 0. CALL FIND_FIELD_ID_FROM_MNHNAME('YHAT',IID,IRESP) - TZFIELD = TFIELDLIST(IID) + TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) IF (HDIR/='A'.AND.HDIR/='E') THEN TZFIELD%CDIR = 'YY' ELSE @@ -452,7 +451,7 @@ ELSE IF (HREC=='DY') THEN ALLOCATE(ZWORK (IIU,IJU)) ZWORK(:,:) = 0. CALL FIND_FIELD_ID_FROM_MNHNAME('YHAT',IID,IRESP) - TZFIELD = TFIELDLIST(IID) + TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) IF (HDIR/='A'.AND.HDIR/='E') THEN TZFIELD%CDIR = 'YY' ELSE @@ -581,7 +580,7 @@ END SUBROUTINE READ_SURFX1_MNH !* 0. DECLARATIONS ! ------------ ! -use modd_field, only: tfielddata, TYPEREAL +use modd_field, only: tfieldmetadata, TYPEREAL USE MODD_IO_SURF_MNH, ONLY: TOUT, TPINFILE, NMASK, NIU, NJU, NIB, NJB, NIE, NJE, & NIU_ALL, NJU_ALL, NIB_ALL, NJB_ALL, NIE_ALL, NJE_ALL, NMASK_ALL USE MODD_PARAMETERS, ONLY: XUNDEF @@ -611,14 +610,14 @@ CHARACTER(LEN=1), INTENT(IN) :: HDIR ! type of field : ! !* 0.2 Declarations of local variables ! -INTEGER :: IGRID ! IGRID : grid indicator -INTEGER :: ILENCH ! ILENCH : length of comment string -INTEGER :: ILUOUT -INTEGER :: JP ! loop index +INTEGER :: IGRID ! IGRID : grid indicator +INTEGER :: ILENCH ! ILENCH : length of comment string +INTEGER :: ILUOUT +INTEGER :: JP ! loop index REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZWORK ! work array read in the file -REAL :: ZUNDEF ! undefined value in SURFEX -TYPE(TFIELDDATA) :: TZFIELD +REAL :: ZUNDEF ! undefined value in SURFEX +TYPE(TFIELDMETADATA) :: TZFIELD !------------------------------------------------------------------------------- ! CALL PRINT_MSG(NVERB_DEBUG,'IO','READ_SURFX2_MNH',TRIM(TPINFILE%CNAME)//': reading '//TRIM(HREC)) @@ -717,7 +716,7 @@ END SUBROUTINE READ_SURFX2_MNH ! USE MODD_CST, ONLY: XPI USE MODD_DATA_COVER_PAR, ONLY: JPCOVER -use modd_field, only: tfielddata, TYPELOG, TYPEREAL +use modd_field, only: tfieldmetadata, TYPELOG, TYPEREAL USE MODD_IO_SURF_MNH, ONLY: TOUT, TPINFILE, NMASK, & NIU, NJU, NIB, NJB, NIE, NJE, & NIU_ALL, NJU_ALL, NIB_ALL, & @@ -766,7 +765,7 @@ REAL,DIMENSION(:,:,:), ALLOCATABLE :: ZWORK3D INTEGER :: IRESP INTEGER :: IVERSION, IBUGFIX LOGICAL :: GCOVER_PACKED ! .T. if COVER are all packed into one field -TYPE(TFIELDDATA) :: TZFIELD +TYPE(TFIELDMETADATA) :: TZFIELD !------------------------------------------------------------------------------- ! CALL PRINT_MSG(NVERB_DEBUG,'IO','READ_SURFX2COV_MNH',TRIM(TPINFILE%CNAME)//': reading '//TRIM(HREC)) @@ -810,33 +809,36 @@ CALL IO_Field_read(TPINFILE,'BUG', IBUGFIX) IF (IVERSION<7 .OR. (IVERSION==7 .AND. IBUGFIX==0)) THEN GCOVER_PACKED = .FALSE. ELSE - TZFIELD%CMNHNAME = 'COVER_PACKED' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'COVER_PACKED' - TZFIELD%CUNITS = '' - TZFIELD%CDIR = '--' - TZFIELD%CCOMMENT = '' - TZFIELD%NGRID = 0 - TZFIELD%NTYPE = TYPELOG - TZFIELD%NDIMS = 0 - TZFIELD%LTIMEDEP = .FALSE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'COVER_PACKED', & + CSTDNAME = '', & + CLONGNAME = 'COVER_PACKED', & + CUNITS = '', & + CDIR = '--', & + CCOMMENT = '', & + NGRID = 0, & + NTYPE = TYPELOG, & + NDIMS = 0, & + LTIMEDEP = .FALSE. ) CALL IO_Field_read(TPINFILE,TZFIELD,GCOVER_PACKED) END IF ! IF (.NOT. GCOVER_PACKED) THEN ICOVER=0 - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = '' - TZFIELD%NGRID = 4 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 2 - TZFIELD%LTIMEDEP = .FALSE. + TZFIELD = TFIELDMETADATA(& + CMNHNAME = 'generic no COVER_PACKED', & !Temporary name to ease identification + CSTDNAME = '', & + CUNITS = '', & + CDIR = YDIR, & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .FALSE. ) DO JL2=1,SIZE(OFLAG) WRITE(YREC,'(A5,I3.3)') 'COVER',JL2 TZFIELD%CMNHNAME = TRIM(YREC) TZFIELD%CLONGNAME = TRIM(YREC) TZFIELD%CCOMMENT = 'X_Y_'//TRIM(YREC) - TZFIELD%CDIR = YDIR IF (OFLAG(JL2)) THEN ICOVER=ICOVER+1 CALL IO_Field_read(TPINFILE,TZFIELD,ZWORK3D(:,:,ICOVER),IRESP) @@ -911,7 +913,7 @@ END SUBROUTINE READ_SURFX2COV_MNH ! ------------ ! USE MODD_CST, ONLY: XPI -use modd_field, only: tfielddata, TYPELOG, TYPEREAL +use modd_field, only: tfieldmetadata, TYPELOG, TYPEREAL USE MODD_IO_SURF_MNH, ONLY: TOUT, TPINFILE, NMASK, & NIU, NJU, NIB, NJB, NIE, NJE, & NIU_ALL, NJU_ALL, NIB_ALL, & @@ -959,7 +961,7 @@ REAL,DIMENSION(:,:), ALLOCATABLE :: ZWORK2D INTEGER :: IVERSION, IBUGFIX LOGICAL :: GCOVER_PACKED ! .T. if COVER are all packed into one field CHARACTER(LEN=1) :: YDIR1 -TYPE(TFIELDDATA) :: TZFIELD +TYPE(TFIELDMETADATA) :: TZFIELD !------------------------------------------------------------------------------- ! CALL PRINT_MSG(NVERB_DEBUG,'IO','READ_SURFX2COV_1COV_MNH',TRIM(TPINFILE%CNAME)//': reading '//TRIM(HREC)) @@ -1004,31 +1006,33 @@ CALL IO_Field_read(TPINFILE,'BUG', IBUGFIX) IF (IVERSION<7 .OR. (IVERSION==7 .AND. IBUGFIX==0)) THEN GCOVER_PACKED = .FALSE. ELSE - TZFIELD%CMNHNAME = 'COVER_PACKED' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'COVER_PACKED' - TZFIELD%CUNITS = '' - TZFIELD%CDIR = '--' - TZFIELD%CCOMMENT = '' - TZFIELD%NGRID = 0 - TZFIELD%NTYPE = TYPELOG - TZFIELD%NDIMS = 0 - TZFIELD%LTIMEDEP = .FALSE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'COVER_PACKED', & + CSTDNAME = '', & + CLONGNAME = 'COVER_PACKED', & + CUNITS = '', & + CDIR = '--', & + CCOMMENT = '', & + NGRID = 0, & + NTYPE = TYPELOG, & + NDIMS = 0, & + LTIMEDEP = .FALSE. ) CALL IO_Field_read(TPINFILE,TZFIELD,GCOVER_PACKED,KRESP) END IF ! IF (.NOT. GCOVER_PACKED) THEN WRITE(YREC,'(A5,I3.3)') 'COVER',KCOVER - TZFIELD%CMNHNAME = TRIM(YREC) - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM(YREC) - TZFIELD%CUNITS = '' - TZFIELD%CDIR = YDIR - TZFIELD%CCOMMENT = 'X_Y_'//TRIM(YREC) - TZFIELD%NGRID = 4 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 2 - TZFIELD%LTIMEDEP = .FALSE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = TRIM(YREC), & + CSTDNAME = '', & + CLONGNAME = TRIM(YREC), & + CUNITS = '', & + CDIR = YDIR, & + CCOMMENT = 'X_Y_'//TRIM(YREC), & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .FALSE. ) CALL IO_Field_read(TPINFILE,TZFIELD,ZWORK2D,KRESP) ELSE call Print_msg( NVERB_FATAL, 'IO', 'READ_SURFX2COV_1COV_MNH', 'GCOVER_PACKED=TRUE and we try to read the covers one by one' ) @@ -1094,7 +1098,7 @@ END SUBROUTINE READ_SURFX2COV_1COV_MNH ! ------------ ! USE MODD_CONF, ONLY: CPROGRAM -use modd_field, only: tfielddata, TYPEINT +use modd_field, only: tfieldmetadata, TYPEINT USE MODD_IO_SURF_MNH, ONLY: TOUT, TPINFILE, NMASK, & NIU, NJU, NIB, NJB, NIE, NJE @@ -1114,9 +1118,9 @@ CHARACTER(LEN=*), INTENT(OUT) :: HCOMMENT ! comment ! !* 0.2 Declarations of local variables ! -INTEGER :: IIMAX, IJMAX -INTEGER :: ILUOUT -TYPE(TFIELDDATA) :: TZFIELD +INTEGER :: IIMAX, IJMAX +INTEGER :: ILUOUT +TYPE(TFIELDMETADATA) :: TZFIELD ! !------------------------------------------------------------------------------- ! @@ -1189,7 +1193,7 @@ END SUBROUTINE READ_SURFN0_MNH !* 0. DECLARATIONS ! ------------ ! -use modd_field, only: tfielddata, TYPEINT +use modd_field, only: tfieldmetadata, TYPEINT USE MODD_IO_SURF_MNH, ONLY: TOUT, TPINFILE, NMASK, & NIU, NJU, NIB, NJB, NIE, NJE ! @@ -1220,7 +1224,7 @@ INTEGER :: ILENCH ! ILENCH : length of comment string INTEGER :: ILUOUT ! INTEGER, DIMENSION(:,:), ALLOCATABLE :: IWORK ! work array read in the file -TYPE(TFIELDDATA) :: TZFIELD +TYPE(TFIELDMETADATA) :: TZFIELD !--------------------------------------------------------------------- ! CALL PRINT_MSG(NVERB_DEBUG,'IO','READ_SURFN1_MNH',TRIM(TPINFILE%CNAME)//': reading '//TRIM(HREC)) @@ -1298,7 +1302,7 @@ END SUBROUTINE READ_SURFN1_MNH ! ------------ ! USE MODD_CONF, ONLY: LCARTESIAN, CPROGRAM -use modd_field, only: tfielddata, TYPECHAR +use modd_field, only: tfieldmetadata, TYPECHAR USE MODD_IO_SURF_MNH, ONLY: TOUT, TPINFILE USE MODD_LUNIT, ONLY: TPGDFILE @@ -1319,17 +1323,17 @@ CHARACTER(LEN=*), INTENT(OUT) :: HCOMMENT ! comment ! !* 0.2 Declarations of local variables ! -INTEGER :: IRESP ! return code -INTEGER :: IGRID ! IGRID : grid indicator -INTEGER :: ILENCH ! ILENCH : length of comment string -INTEGER :: ILUOUT +INTEGER :: IRESP ! return code +INTEGER :: IGRID ! IGRID : grid indicator +INTEGER :: ILENCH ! ILENCH : length of comment string +INTEGER :: ILUOUT ! -INTEGER :: ILUDES ! .des file logical unit +INTEGER :: ILUDES ! .des file logical unit ! -LOGICAL :: GFOUND -CHARACTER(LEN=4) :: CTURB,CRAD,CGROUND,CCLOUD,CDCONV,CELEC -CHARACTER(LEN=6) :: CSEA_FLUX -TYPE(TFIELDDATA) :: TZFIELD +LOGICAL :: GFOUND +CHARACTER(LEN=4) :: CTURB,CRAD,CGROUND,CCLOUD,CDCONV,CELEC +CHARACTER(LEN=6) :: CSEA_FLUX +TYPE(TFIELDMETADATA) :: TZFIELD ! NAMELIST/NAM_PARAMn/CTURB,CRAD,CGROUND,CCLOUD,CDCONV,CSEA_FLUX, CELEC !---------------------------------------------------------------------------- @@ -1453,7 +1457,7 @@ END SUBROUTINE READ_SURFC0_MNH !* 0. DECLARATIONS ! ------------ ! -use modd_field, only: tfielddata, TYPEINT, TYPELOG +use modd_field, only: tfieldmetadata, TYPEINT, TYPELOG USE MODD_IO_SURF_MNH, ONLY: TOUT, TPINFILE, NMASK, & NIU, NJU, NIB, NJB, NIE, NJE ! @@ -1479,12 +1483,12 @@ CHARACTER(LEN=1), INTENT(IN) :: HDIR ! type of field : ! !* 0.2 Declarations of local variables ! -INTEGER :: IGRID ! IGRID : grid indicator -INTEGER :: ILENCH ! ILENCH : length of comment string -INTEGER :: ILUOUT +INTEGER :: IGRID ! IGRID : grid indicator +INTEGER :: ILENCH ! ILENCH : length of comment string +INTEGER :: ILUOUT LOGICAL, DIMENSION(:,:), ALLOCATABLE :: GWORK ! work array read in the file INTEGER, DIMENSION(:,:), ALLOCATABLE :: IWORK ! work array read in the file -TYPE(TFIELDDATA) :: TZFIELD +TYPE(TFIELDMETADATA) :: TZFIELD !------------------------------------------------------------------------------- CALL PRINT_MSG(NVERB_DEBUG,'IO','READ_SURFL1_MNH',TRIM(TPINFILE%CNAME)//': reading '//TRIM(HREC)) ! @@ -1569,7 +1573,7 @@ END SUBROUTINE READ_SURFL1_MNH !* 0. DECLARATIONS ! ------------ ! -use modd_field, only: tfielddata, TYPELOG +use modd_field, only: tfieldmetadata, TYPELOG USE MODD_IO_SURF_MNH, ONLY: TOUT, TPINFILE USE MODE_IO_FIELD_READ, only: IO_Field_read @@ -1588,7 +1592,7 @@ CHARACTER(LEN=*), INTENT(OUT) :: HCOMMENT ! comment !* 0.2 Declarations of local variables ! INTEGER :: ILUOUT -TYPE(TFIELDDATA) :: TZFIELD +TYPE(TFIELDMETADATA) :: TZFIELD !------------------------------------------------------------------------------- CALL PRINT_MSG(NVERB_DEBUG,'IO','READ_SURFL0_MNH',TRIM(TPINFILE%CNAME)//': reading '//TRIM(HREC)) ! @@ -1665,7 +1669,7 @@ END SUBROUTINE READ_SURFL0_MNH !* 0. DECLARATIONS ! ------------ ! -use modd_field, only: tfielddata, TYPECHAR +use modd_field, only: tfieldmetadata, TYPECHAR USE MODD_IO_SURF_MNH, ONLY: TOUT, TPINFILE USE MODD_TYPE_DATE @@ -1693,9 +1697,9 @@ INTEGER :: ILUOUT CHARACTER(LEN=LEN_HREC) :: YRECFM ! Name of the article to be written CHARACTER(LEN=40) :: YFILETYPE40! MESONH file type CHARACTER(LEN=2) :: YFILETYPE2 ! MESONH file type -INTEGER, DIMENSION(3) :: ITDATE -TYPE(TFIELDDATA) :: TZFIELD -TYPE(DATE_TIME) :: TZDATETIME +INTEGER, DIMENSION(3) :: ITDATE +TYPE(TFIELDMETADATA) :: TZFIELD +TYPE(DATE_TIME) :: TZDATETIME !------------------------------------------------------------------------------- ! CALL PRINT_MSG(NVERB_DEBUG,'IO','READ_SURFT0_MNH',TRIM(TPINFILE%CNAME)//': reading '//TRIM(HREC)) @@ -1706,16 +1710,17 @@ HCOMMENT = '' IF (TPINFILE%NMNHVERSION(1)<4 .OR. (TPINFILE%NMNHVERSION(1)==4 .AND. TPINFILE%NMNHVERSION(2)<6)) THEN CALL IO_Field_read(TPINFILE,'STORAGE_TYPE',YFILETYPE2) ELSE - TZFIELD%CMNHNAME = 'STORAGETYPE' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'STORAGETYPE' - TZFIELD%CUNITS = '' - TZFIELD%CDIR = '--' - TZFIELD%CCOMMENT = '' - TZFIELD%NGRID = 0 - TZFIELD%NTYPE = TYPECHAR - TZFIELD%NDIMS = 0 - TZFIELD%LTIMEDEP = .FALSE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'STORAGETYPE', & + CSTDNAME = '', & + CLONGNAME = 'STORAGETYPE', & + CUNITS = '', & + CDIR = '--', & + CCOMMENT = '', & + NGRID = 0, & + NTYPE = TYPECHAR, & + NDIMS = 0, & + LTIMEDEP = .FALSE. ) CALL IO_Field_read(TPINFILE,TZFIELD,YFILETYPE40) YFILETYPE2 = YFILETYPE40(1:2) END IF @@ -1788,7 +1793,7 @@ END SUBROUTINE READ_SURFT0_MNH !* 0. DECLARATIONS ! ------------ ! -use modd_field, only: tfielddata, TYPECHAR, TYPEINT, TYPEREAL +use modd_field, only: tfieldmetadata, TYPECHAR, TYPEINT, TYPEREAL USE MODD_IO_SURF_MNH, ONLY: TOUT, TPINFILE USE MODE_IO_FIELD_READ, only: IO_Field_read @@ -1817,8 +1822,8 @@ INTEGER :: ILUOUT CHARACTER(LEN=LEN_HREC) :: YRECFM ! Name of the article to be written CHARACTER(LEN=40) :: YFILETYPE40! MESONH file type CHARACTER(LEN=2) :: YFILETYPE2 ! MESONH file type -INTEGER, DIMENSION(3,KL1) :: ITDATE -TYPE(TFIELDDATA) :: TZFIELD +INTEGER, DIMENSION(3,KL1) :: ITDATE +TYPE(TFIELDMETADATA) :: TZFIELD !------------------------------------------------------------------------------- ! CALL PRINT_MSG(NVERB_DEBUG,'IO','READ_SURFT1_MNH',TRIM(TPINFILE%CNAME)//': reading '//TRIM(HREC)) @@ -1829,16 +1834,17 @@ HCOMMENT = '' IF (TPINFILE%NMNHVERSION(1)<4 .OR. (TPINFILE%NMNHVERSION(1)==4 .AND. TPINFILE%NMNHVERSION(2)<6)) THEN CALL IO_Field_read(TPINFILE,'STORAGE_TYPE',YFILETYPE2) ELSE - TZFIELD%CMNHNAME = 'STORAGETYPE' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'STORAGETYPE' - TZFIELD%CUNITS = '' - TZFIELD%CDIR = '--' - TZFIELD%CCOMMENT = '' - TZFIELD%NGRID = 0 - TZFIELD%NTYPE = TYPECHAR - TZFIELD%NDIMS = 0 - TZFIELD%LTIMEDEP = .FALSE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'STORAGETYPE', & + CSTDNAME = '', & + CLONGNAME = 'STORAGETYPE', & + CUNITS = '', & + CDIR = '--', & + CCOMMENT = '', & + NGRID = 0, & + NTYPE = TYPECHAR, & + NDIMS = 0, & + LTIMEDEP = .FALSE. ) CALL IO_Field_read(TPINFILE,TZFIELD,YFILETYPE40) YFILETYPE2 = YFILETYPE40(1:2) END IF @@ -1852,16 +1858,17 @@ END IF ! RETURN !END IF ! -TZFIELD%CMNHNAME = TRIM(HREC)//'%TDATE' -TZFIELD%CSTDNAME = '' -TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) -TZFIELD%CUNITS = '' -TZFIELD%CDIR = '--' -TZFIELD%CCOMMENT = '' -TZFIELD%NGRID = 0 -TZFIELD%NTYPE = TYPEINT -TZFIELD%NDIMS = 2 -TZFIELD%LTIMEDEP = .FALSE. +TZFIELD = TFIELDMETADATA( & + CMNHNAME = TRIM(HREC)//'%TDATE', & + CSTDNAME = '', & + CLONGNAME = TRIM(HREC)//'%TDATE', & + CUNITS = '', & + CDIR = '--', & + CCOMMENT = '', & + NGRID = 0, & + NTYPE = TYPEINT, & + NDIMS = 2, & + LTIMEDEP = .FALSE. ) ! CALL IO_Field_read(TPINFILE,TZFIELD,ITDATE(:,:),KRESP) ! @@ -1877,16 +1884,17 @@ IF (KRESP /=0) THEN WRITE(ILUOUT,*) ' ' ENDIF ! -TZFIELD%CMNHNAME = TRIM(HREC)//'%xtime' -TZFIELD%CSTDNAME = '' -TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) -TZFIELD%CUNITS = '' -TZFIELD%CDIR = '--' -TZFIELD%CCOMMENT = '' -TZFIELD%NGRID = 0 -TZFIELD%NTYPE = TYPEREAL -TZFIELD%NDIMS = 1 -TZFIELD%LTIMEDEP = .FALSE. +TZFIELD = TFIELDMETADATA( & + CMNHNAME = TRIM(HREC)//'%xtime', & + CSTDNAME = '', & + CLONGNAME = TRIM(HREC)//'%xtime', & + CUNITS = '', & + CDIR = '--', & + CCOMMENT = '', & + NGRID = 0, & + NTYPE = TYPEREAL, & + NDIMS = 1, & + LTIMEDEP = .FALSE. ) ! CALL IO_Field_read(TPINFILE,TZFIELD,PTIME(:),KRESP) ! diff --git a/src/MNH/read_ver_grid.f90 b/src/MNH/read_ver_grid.f90 index 2f8b1fc47b98956bea3fd157a989b8b733546377..44665594e92d8c833c04c902e3a38c96287524e7 100644 --- a/src/MNH/read_ver_grid.f90 +++ b/src/MNH/read_ver_grid.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1994-2022 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. @@ -7,7 +7,7 @@ MODULE MODI_READ_VER_GRID ! ######################### INTERFACE - SUBROUTINE READ_VER_GRID(TPPRE_REAL1,PZHAT,OSLEVE,PLEN1,PLEN2) + SUBROUTINE READ_VER_GRID( TPPRE_REAL1, PZHAT, OSLEVE, PLEN1, PLEN2 ) ! USE MODD_IO, ONLY : TFILEDATA ! @@ -21,9 +21,9 @@ END SUBROUTINE READ_VER_GRID END INTERFACE END MODULE MODI_READ_VER_GRID ! -! ############################################################## - SUBROUTINE READ_VER_GRID(TPPRE_REAL1,PZHAT,OSLEVE,PLEN1,PLEN2) -! ############################################################## +! #################################################################### + SUBROUTINE READ_VER_GRID( TPPRE_REAL1, PZHAT, OSLEVE, PLEN1, PLEN2 ) +! #################################################################### ! !!**** *READ_VER_GRID* - reads namelist data in file PRE_REAL1 for the !! initialization of the vertical grid for real cases. @@ -111,6 +111,7 @@ USE MODD_PARAMETERS ! USE MODE_MSG USE MODE_POS +USE MODE_SET_GRID, ONLY: INTERP_VERGRID_TO_MASSPOINTS, STORE_GLOB_VERGRID ! USE MODI_DEFAULT_SLEVE ! @@ -121,10 +122,10 @@ IMPLICIT NONE !* 0.1 Declaration of arguments ! ------------------------ TYPE(TFILEDATA),POINTER, INTENT(IN) :: TPPRE_REAL1! namelist file +REAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: PZHAT ! vertival grid of input fmfile LOGICAL, OPTIONAL, INTENT(IN) :: OSLEVE ! flag for SLEVE coordinate REAL, OPTIONAL, INTENT(IN) :: PLEN1 ! Decay scale for smooth topography REAL, OPTIONAL, INTENT(IN) :: PLEN2 ! Decay scale for small-scale topography deviation -REAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: PZHAT ! vertival grid of input fmfile ! !* 0.2 Declaration of local variables ! ------------------------------ @@ -193,7 +194,8 @@ XLEN1_n = XLEN1 XLEN2_n = XLEN2 ! IF (CPROGRAM=='REAL ') THEN - IF (ASSOCIATED (XZHAT) ) DEALLOCATE(XZHAT) + IF (ASSOCIATED (XZHAT) ) DEALLOCATE(XZHAT) + IF (ASSOCIATED (XZHATM) ) DEALLOCATE(XZHATM) CALL POSNAM(IPRE_REAL1,'NAM_BLANKN',GFOUND,ILUOUT0) IF (GFOUND) THEN CALL INIT_NAM_BLANKn @@ -214,9 +216,10 @@ SELECT CASE(YZGRID_TYPE) CASE('SAMEGR') IF (PRESENT(PZHAT) .AND. PRESENT(OSLEVE) .AND. PRESENT(PLEN1) .AND. PRESENT(PLEN2)) THEN IF (NKMAX_n==0) NKMAX_n=SIZE(PZHAT)-2*JPVEXT - ALLOCATE(XZHAT(NKMAX_n+2*JPVEXT)) + ALLOCATE( XZHAT (IKU) ) + ALLOCATE( XZHATM(IKU) ) - IF ( (NKMAX_n+2*JPVEXT) > SIZE(PZHAT) ) THEN + IF ( (IKU) > SIZE(PZHAT) ) THEN WRITE(ILUOUT0,*) 'ERROR IN READ_VER_GRID :' WRITE(ILUOUT0,*) ' YOU WANT TO KEEP THE SAME VERTICAL GRID, BUT YOU ASK' WRITE(ILUOUT0,*) ' FOR MORE LEVELS THAN IN INPUT FM FILE.' @@ -226,13 +229,13 @@ CASE('SAMEGR') CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_VER_GRID','') END IF - XZHAT(:)=PZHAT(1:NKMAX_n+2*JPVEXT) + XZHAT(:) = PZHAT (1:IKU) LTHINSHELL = GTHINSHELL LSLEVE_n = OSLEVE XLEN1_n = PLEN1 XLEN2_n = PLEN2 - IF ( (NKMAX_n+2*JPVEXT) == SIZE(PZHAT) ) THEN + IF ( (IKU) == SIZE(PZHAT) ) THEN WRITE(ILUOUT0,*) 'same vertical grid kept.' ELSE WRITE(ILUOUT0,*) NKMAX_n,' first levels in vertical grid kept.' @@ -257,7 +260,8 @@ CASE('SAMEGR') ! CASE('FUNCTN') ! - IF (.NOT. ASSOCIATED(XZHAT)) ALLOCATE(XZHAT(IKU)) + IF ( .NOT. ASSOCIATED(XZHAT) ) ALLOCATE( XZHAT (IKU) ) + IF ( .NOT. ASSOCIATED(XZHATM) ) ALLOCATE( XZHATM(IKU) ) ! IF (ABS(ZDZTOP-ZDZGRD) < 1.E-10) THEN XZHAT(:) = (/ (REAL(JK-IKB)*ZDZGRD, JK=1,IKU) /) @@ -297,7 +301,8 @@ CASE('FUNCTN') ! CASE('MANUAL') ! - IF (.NOT. ASSOCIATED(XZHAT)) ALLOCATE(XZHAT(IKU)) + IF ( .NOT. ASSOCIATED(XZHAT) ) ALLOCATE( XZHAT (IKU) ) + IF ( .NOT. ASSOCIATED(XZHATM) ) ALLOCATE( XZHATM(IKU) ) ! WRITE(ILUOUT0,FMT=*) 'YZGRID_TYPE="MANUAL", ATTEMPT TO READ VECTOR XZHAT(2,NKU)' CALL POSKEY(IPRE_REAL1,ILUOUT0,'ZHAT') @@ -322,7 +327,13 @@ END SELECT ! !Set model top XZTOP = XZHAT(IKU) -! + +! Interpolations of positions to mass points +CALL INTERP_VERGRID_TO_MASSPOINTS( XZHAT, XZHATM ) + +! Collect global domain boundaries +CALL STORE_GLOB_VERGRID( XZHAT, XZHATM, XHAT_BOUND, XHATM_BOUND ) + !------------------------------------------------------------------------------- ! !* 5. TEST ON STRETCHING : diff --git a/src/MNH/relaxdef.f90 b/src/MNH/relaxdef.f90 index 41665139b06cfe2cdd71187dbf66dba9ac34f17a..216dc038972b2c009df0b4b67e5ee19c2759440d 100644 --- a/src/MNH/relaxdef.f90 +++ b/src/MNH/relaxdef.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1994-2019 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1994-2022 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. @@ -17,7 +17,7 @@ INTERFACE OHORELAX_SVCHEM, OHORELAX_SVAER, OHORELAX_SVDST, OHORELAX_SVSLT, & OHORELAX_SVPP,OHORELAX_SVCS, OHORELAX_SVCHIC,OHORELAX_SVSNW, & PALKTOP,PALKGRD, PALZBOT,PALZBAS, & - PZZ, PZHAT, PTSTEP, & + PZZ, PZHAT, PZHATM, PTSTEP, & PRIMKMAX,KRIMX, KRIMY, & PALK, PALKW, KALBOT,PALKBAS,PALKWBAS,KALBAS, & OMASK_RELAX,PKURELAX, PKVRELAX, PKWRELAX ) @@ -79,8 +79,9 @@ REAL, INTENT(IN) :: PALZBOT ! Height of the abs. REAL, INTENT(IN) :: PALZBAS ! Height of the abs. ! layer base REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Height -REAL, DIMENSION(:), INTENT(IN) :: PZHAT ! Gal-Chen Height -REAL, INTENT(IN) :: PTSTEP ! Time step +REAL, DIMENSION(:), INTENT(IN) :: PZHAT ! Gal-Chen Height +REAL, DIMENSION(:), INTENT(IN) :: PZHATM ! ... at mass points +REAL, INTENT(IN) :: PTSTEP ! Time step REAL, INTENT(IN) :: PRIMKMAX !Max. value of the horiz. ! relaxation coefficients INTEGER, INTENT(IN) :: KRIMX,KRIMY ! Number of points in @@ -122,7 +123,7 @@ END MODULE MODI_RELAXDEF OHORELAX_SVCHEM, OHORELAX_SVAER, OHORELAX_SVDST, OHORELAX_SVSLT, & OHORELAX_SVPP,OHORELAX_SVCS, OHORELAX_SVCHIC,OHORELAX_SVSNW, & PALKTOP,PALKGRD, PALZBOT,PALZBAS, & - PZZ, PZHAT, PTSTEP, & + PZZ, PZHAT, PZHATM, PTSTEP, & PRIMKMAX,KRIMX, KRIMY, & PALK, PALKW, KALBOT,PALKBAS,PALKWBAS,KALBAS, & OMASK_RELAX,PKURELAX, PKVRELAX, PKWRELAX ) @@ -306,7 +307,8 @@ REAL, INTENT(IN) :: PALZBAS ! Height of the abs. ! layer base REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Height REAL, DIMENSION(:), INTENT(IN) :: PZHAT ! Gal-Chen Height -REAL, INTENT(IN) :: PTSTEP ! Time step +REAL, DIMENSION(:), INTENT(IN) :: PZHATM ! ... at mass points +REAL, INTENT(IN) :: PTSTEP ! Time step REAL, INTENT(IN) :: PRIMKMAX !Max. value of the horiz. ! relaxation coefficients INTEGER, INTENT(IN) :: KRIMX,KRIMY ! Number of points in @@ -341,8 +343,6 @@ REAL :: ZZSHAT REAL :: ZZTOP ! Height of the model top REAL :: ZALZHAT ! Gal-Chen height of the abs. layer ! base -REAL :: ZZHATK ! Gal-Chen height of u(k), v(k), and - ! theta(k) ! INTEGER :: IKRIMAX ! Maximum width of the rim zone ! (number of points) @@ -445,8 +445,7 @@ IF(OVE_RELAX) THEN END DO ! DO JK = KALBOT, IKE - ZZHATK = 0.5 * (PZHAT(JK) +PZHAT(JK+1)) - PALK(JK) = PALKTOP * SIN ( ZWORK * (ZZHATK - PZHAT(KALBOT))) **2 + PALK(JK) = PALKTOP * SIN ( ZWORK * (PZHATM(JK) - PZHAT(KALBOT))) **2 PALK(JK) = PALK(JK) / (1. + 2. * PTSTEP * PALK(JK)) END DO ! @@ -469,8 +468,7 @@ IF (OVE_RELAX_GRD) THEN END DO ! DO JK = 1,KALBAS - ZZHATK = 0.5 * (PZHAT(JK) +PZHAT(JK+1)) - PALKBAS(JK) = PALKGRD * SIN ( ZWORK * (-ZZHATK + PZHAT(KALBAS))) **2 + PALKBAS(JK) = PALKGRD * SIN ( ZWORK * (-PZHATM(JK) + PZHAT(KALBAS))) **2 PALKBAS(JK) = PALKBAS(JK) / (1. + 2. * PTSTEP * PALKBAS(JK)) END DO END IF diff --git a/src/MNH/richardson.f90 b/src/MNH/richardson.f90 index 492454276f2ffcfaaa52e9c4e0b917b6ea70b963..7f80f4a6df8e2859592ca7a8b810173ad44fc84e 100644 --- a/src/MNH/richardson.f90 +++ b/src/MNH/richardson.f90 @@ -1,13 +1,8 @@ -!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1994-2023 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. !----------------------------------------------------------------- -!--------------- special set of characters for RCS information -!----------------------------------------------------------------- -! $Source$ $Revision$ -! MASDEV4_7 solver 2006/05/18 13:07:25 -!----------------------------------------------------------------- ! ######spl MODULE MODI_RICHARDSON ! ###################### @@ -23,12 +18,12 @@ IMPLICIT NONE CHARACTER (LEN=4), DIMENSION(2), INTENT(IN) :: HLBCX ! x-direction LBC type CHARACTER (LEN=4), DIMENSION(2), INTENT(IN) :: HLBCY ! y-direction LBC type ! - ! Metric coefficients: -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX ! d*xx -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY ! d*yy -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZX ! d*zx -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZY ! d*zy -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! d*zz + ! Metric coefficients: +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX ! d*xx +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY ! d*yy +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDZX ! d*zx +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDZY ! d*zy +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! d*zz ! REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! density of reference * J REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHETAV ! virtual potential temp. at @@ -148,12 +143,12 @@ IMPLICIT NONE CHARACTER (LEN=4), DIMENSION(2), INTENT(IN) :: HLBCX ! x-direction LBC type CHARACTER (LEN=4), DIMENSION(2), INTENT(IN) :: HLBCY ! y-direction LBC type ! - ! Metric coefficients: -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX ! d*xx -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY ! d*yy -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZX ! d*zx -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZY ! d*zy -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! d*zz + ! Metric coefficients: +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX ! d*xx +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY ! d*yy +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDZX ! d*zx +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDZY ! d*zy +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! d*zz ! REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! density of reference * J REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHETAV ! virtual potential temp. at diff --git a/src/MNH/sedim_blowsnow.f90 b/src/MNH/sedim_blowsnow.f90 index 2cb0f82646a9748e9cca38b64e336699bb01c983..75985a3dced721aaeb21c8f4f324bb50f396b968 100644 --- a/src/MNH/sedim_blowsnow.f90 +++ b/src/MNH/sedim_blowsnow.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2018-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2018-2022 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. @@ -17,7 +17,7 @@ SUBROUTINE SEDIM_BLOWSNOW( & ,PDTMONITOR & !I Time step ,PRHODREF & !I [kg/m3] air density ,PZZ & !I [m] height of layers - ,PSVT & !IO [scalar variable, ppp] Blowing snow concentration + ,PSVT & !IO [scalar variable, ppv] Blowing snow concentration ,PSVS & !IO ! Blowing snow variable source ,PVGK & !I [m/s] Blowing snow variable settling velocity ) diff --git a/src/MNH/sedim_dust.f90 b/src/MNH/sedim_dust.f90 index 145939e1f3a17796398f5ddc29ccfcd0ffc95fdd..339f4cfa757042e35c40fd7ec2f3dca87a620469 100644 --- a/src/MNH/sedim_dust.f90 +++ b/src/MNH/sedim_dust.f90 @@ -1,4 +1,4 @@ -!ORILAM_LIC Copyright 2006-2019 CNRS, Meteo-France and Universite Paul Sabatier +!ORILAM_LIC Copyright 2006-2022 CNRS, Meteo-France and Universite Paul Sabatier !ORILAM_LIC This is part of the ORILAM software governed by the CeCILL-C licence !ORILAM_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !ORILAM_LIC for details. @@ -15,7 +15,7 @@ SUBROUTINE SEDIM_DUST( & ,PRHODREF & !I [kg/m3] air density ,PPABST & !I [Pa] pressure ,PZZ & !I [m] height of layers - ,PSVT & !IO [scalar variable, ppp] sea salt concentration + ,PSVT & !IO [scalar variable, ppv] sea salt concentration ) IMPLICIT NONE @@ -241,7 +241,7 @@ ELSE LSEDFIX = .TRUE. END IF ! -!* 5. Return to concentration in ppp (#/molec_{air}) +!* 5. Return to concentration in ppv (#/molec_{air}) ! DO JN=1,NMODE_DST IF (LVARSIG) THEN diff --git a/src/MNH/sedim_salt.f90 b/src/MNH/sedim_salt.f90 index 43e407a88308b2ce2a49928bb14d1cbd0aba0875..7027377414104596a76b390405a941fe023bc382 100644 --- a/src/MNH/sedim_salt.f90 +++ b/src/MNH/sedim_salt.f90 @@ -1,4 +1,4 @@ -!ORILAM_LIC Copyright 2006-2019 CNRS, Meteo-France and Universite Paul Sabatier +!ORILAM_LIC Copyright 2006-2022 CNRS, Meteo-France and Universite Paul Sabatier !ORILAM_LIC This is part of the ORILAM software governed by the CeCILL-C licence !ORILAM_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !ORILAM_LIC for details. @@ -15,7 +15,7 @@ SUBROUTINE SEDIM_SALT( & ,PRHODREF & !I [kg/m3] air density ,PPABST & !I [Pa] pressure ,PZZ & !I [m] height of layers - ,PSVT & !IO [scalar variable, ppp] sea salt concentration + ,PSVT & !IO [scalar variable, ppv] sea salt concentration ) IMPLICIT NONE @@ -241,7 +241,7 @@ ELSE LSEDFIX = .TRUE. END IF ! -!* 5. Return to concentration in ppp (#/molec_{air}) +!* 5. Return to concentration in ppv (#/molec_{air}) ! DO JN=1,NMODE_SLT IF (LVARSIG_SLT) THEN diff --git a/src/MNH/series_cloud_elec.f90 b/src/MNH/series_cloud_elec.f90 index cb4d18b427e80960d528689416df35526711dc03..05ced2f2a1366d29bc2d76b3ae5dea0a280cd3ff 100644 --- a/src/MNH/series_cloud_elec.f90 +++ b/src/MNH/series_cloud_elec.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2010-2020 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2010-2022 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. @@ -94,7 +94,6 @@ USE MODD_CST USE MODD_DYN_n, ONLY: XDXHATM, XDYHATM USE MODD_ELEC_DESCR USE MODD_ELEC_PARAM -USE MODD_GRID_n, ONLY: XXHAT, XYHAT, XZHAT USE MODD_IO, ONLY: TFILEDATA USE MODD_NSV, ONLY: NSV_ELECBEG, NSV_ELECEND USE MODD_PARAMETERS diff --git a/src/MNH/set_advfrc.f90 b/src/MNH/set_advfrc.f90 index 395660c8837f8278d7a8544a33a4f1208464dc9c..eac8ea7b8a8ca0741394ab1d1e84f03f1ee875e4 100644 --- a/src/MNH/set_advfrc.f90 +++ b/src/MNH/set_advfrc.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2013-2020 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2013-2022 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. @@ -126,7 +126,6 @@ CHARACTER(LEN=48) :: CFNAM_MEANVAR_ADV CHARACTER(LEN=48) :: CFNAM_ADV ! REAL, DIMENSION(:), ALLOCATABLE:: ZHEIGHTMF,ZHEIGHTF,ZTHVUF -REAL, DIMENSION(:), ALLOCATABLE:: ZZHATM REAL, DIMENSION(:), ALLOCATABLE:: ZTHDF,ZRVF,ZPRESS_ADV,ZTHVF REAL, DIMENSION(:,:,:), ALLOCATABLE:: ZTHFRC,ZRVFRC REAL, DIMENSION(:,:,:), ALLOCATABLE:: ZDRVFRC1D,ZDTHFRC1D,ZDVFRC1D @@ -190,7 +189,6 @@ ALLOCATE(XDTHFRC(IIU,IJU,IKU,NADVFRC)) ALLOCATE(XDRVFRC(IIU,IJU,IKU,NADVFRC)) ! ! For reading in PRE_IDEA1.nam -ALLOCATE(ZZHATM(IKU)) ALLOCATE(ZDRVFRC1D(IIU,IKU,NADVFRC)) ALLOCATE(ZDTHFRC1D(IIU,IKU,NADVFRC)) ALLOCATE(ZDVFRC1D(IIU,IKU,NADVFRC)) @@ -245,26 +243,24 @@ print*," ! 3.2 READ AND INTERPOLATE FORCING" ! END IF ! - ZZHATM(1:IKU-1) = 0.5*(XZHAT(2:IKU)+XZHAT(1:IKU-1)) - ZZHATM(IKU) = 2.*XZHAT(IKU)-ZZHATM(IKU-1) print*," !! 3.2.2 Vertical interpolation" DO JK = 1,IKU - IF (ZZHATM(JK) <= ZHEIGHTF(1)) THEN + IF (XZHATM(JK) <= ZHEIGHTF(1)) THEN ! print*,"! extrapolation below the first level" ! - ZDZSDH = (ZZHATM(JK)-ZHEIGHTF(1)) / (ZHEIGHTF(2)-ZHEIGHTF(1)) + ZDZSDH = (XZHATM(JK)-ZHEIGHTF(1)) / (ZHEIGHTF(2)-ZHEIGHTF(1)) ZDRVFRC1D(IIB:IIE,JK,JKT) = ZRVFRC(IIB:IIE,1,JKT) + & (ZRVFRC(IIB:IIE,2,JKT) - ZRVFRC(IIB:IIE,1,JKT)) * ZDZSDH ZDTHFRC1D(IIB:IIE,JK,JKT) = ZTHFRC(IIB:IIE,1,JKT) + & (ZTHFRC(IIB:IIE,2,JKT) - ZTHFRC(IIB:IIE,1,JKT)) * ZDZSDH - ELSE IF (ZZHATM(JK) > ZHEIGHTF(NPRESSLEV_ADV) ) THEN + ELSE IF (XZHATM(JK) > ZHEIGHTF(NPRESSLEV_ADV) ) THEN ! print*,"! extrapolation above the last level" ! - ZDZSDH = (ZZHATM(JK) - ZHEIGHTF(NPRESSLEV_ADV)) / & + ZDZSDH = (XZHATM(JK) - ZHEIGHTF(NPRESSLEV_ADV)) / & (ZHEIGHTF(NPRESSLEV_ADV) - ZHEIGHTF(NPRESSLEV_ADV-1)) ZDRVFRC1D(IIB:IIE,JK,JKT) = ZRVFRC(IIB:IIE,NPRESSLEV_ADV,JKT) + & (ZRVFRC(IIB:IIE,NPRESSLEV_ADV,JKT)-ZRVFRC(IIB:IIE,NPRESSLEV_ADV-1,JKT)) * ZDZSDH @@ -275,9 +271,9 @@ print*,"! extrapolation above the last level" print*,"! interpolation between first and last levels" ! DO JKLEV = 1,NPRESSLEV_ADV-1 - IF ( (ZZHATM(JK) > ZHEIGHTF(JKLEV)).AND. & - (ZZHATM(JK) <= ZHEIGHTF(JKLEV+1)) ) THEN - ZDZ1SDH = (ZZHATM(JK) - ZHEIGHTF(JKLEV)) / & + IF ( (XZHATM(JK) > ZHEIGHTF(JKLEV)).AND. & + (XZHATM(JK) <= ZHEIGHTF(JKLEV+1)) ) THEN + ZDZ1SDH = (XZHATM(JK) - ZHEIGHTF(JKLEV)) / & (ZHEIGHTF(JKLEV+1)-ZHEIGHTF(JKLEV)) ZDZ2SDH = 1.- ZDZ1SDH ZDRVFRC1D(IIB:IIE,JK,JKT) = ZRVFRC(IIB:IIE,JKLEV,JKT)*ZDZ2SDH & @@ -360,7 +356,6 @@ DEALLOCATE(ZHEIGHTMF) DEALLOCATE(ZHEIGHTF) DEALLOCATE(ZTHVUF) ! pour lecture dans PREIDEA -DEALLOCATE(ZZHATM) DEALLOCATE(ZDRVFRC1D) DEALLOCATE(ZDTHFRC1D) DEALLOCATE(ZDVFRC1D) diff --git a/src/MNH/set_frc.f90 b/src/MNH/set_frc.f90 index 6c49fbbf288028ccd6c579aeddf88cc7988c05d8..3f82878d97a8f76f650a7aa1f5c919e2288507e9 100644 --- a/src/MNH/set_frc.f90 +++ b/src/MNH/set_frc.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1995-2020 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1995-2022 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. @@ -153,8 +153,6 @@ REAL, DIMENSION(:), ALLOCATABLE :: ZHEIGHTMF ! Height at mass levels REAL, DIMENSION(:), ALLOCATABLE :: ZTHVF ! Thetav at mass levels REAL, DIMENSION(:), ALLOCATABLE :: ZTHDF ! Theta (dry) at mass levels REAL, DIMENSION(:), ALLOCATABLE :: ZMRF ! Vapor mixing ratio at mass lev. -REAL, DIMENSION(SIZE(XZHAT)) :: ZZHATM ! Height of mass model grid - ! levels without orography REAL, DIMENSION(SIZE(XZHAT)) :: ZSHEAR ! vertical wind shear CHARACTER(LEN=4) :: YZP ! choice of zfrc or pfrc CHARACTER(LEN=100) :: YMSG @@ -385,12 +383,9 @@ DO JKT = 1,NFRC ! ! Interpolate and extrapolate Ufrc on u-vertical-grid levels ! the other forcing variables. -! - ZZHATM(1:IKU-1) = 0.5*(XZHAT(2:IKU)+XZHAT(1:IKU-1)) - ZZHATM(IKU) = 2.*XZHAT(IKU)-ZZHATM(IKU-1) ! DO JK = 1,IKU - IF (ZZHATM(JK) <= ZHEIGHTF(1)) THEN + IF (XZHATM(JK) <= ZHEIGHTF(1)) THEN ! ! copy below the first level ! @@ -402,7 +397,7 @@ DO JKT = 1,NFRC XTENDRVFRC(JK,JKT) = ZGYRF(1) XTENDUFRC(JK,JKT) = ZTUF(1) XTENDVFRC(JK,JKT) = ZTVF(1) - ELSE IF (ZZHATM(JK) > ZHEIGHTF(ILEVELF) ) THEN + ELSE IF (XZHATM(JK) > ZHEIGHTF(ILEVELF) ) THEN ! ! copy above the last level ! @@ -419,9 +414,9 @@ DO JKT = 1,NFRC ! interpolation between first and last levels ! DO JKLEV = 1,ILEVELF-1 - IF ( (ZZHATM(JK) > ZHEIGHTF(JKLEV)).AND. & - (ZZHATM(JK) <= ZHEIGHTF(JKLEV+1)) ) THEN - ZDZ1SDH = (ZZHATM(JK) - ZHEIGHTF(JKLEV)) / & + IF ( (XZHATM(JK) > ZHEIGHTF(JKLEV)).AND. & + (XZHATM(JK) <= ZHEIGHTF(JKLEV+1)) ) THEN + ZDZ1SDH = (XZHATM(JK) - ZHEIGHTF(JKLEV)) / & (ZHEIGHTF(JKLEV+1)-ZHEIGHTF(JKLEV)) ZDZ2SDH = 1.- ZDZ1SDH XUFRC(JK,JKT) = ZUF(JKLEV)*ZDZ2SDH + ZUF(JKLEV+1)*ZDZ1SDH diff --git a/src/MNH/set_geosbal.f90 b/src/MNH/set_geosbal.f90 index 28e528d8b1fbc1d269681cc40769c4f31e2ed273..2f8bd2e68e437c0c2158e26f8ac63d57380c7fca 100644 --- a/src/MNH/set_geosbal.f90 +++ b/src/MNH/set_geosbal.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2010-2020 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2010-2022 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. @@ -49,7 +49,7 @@ END MODULE MODI_SET_GEOSBAL ! fields (at w-grid levels without ororgraphy i.e. at height XZHAT, ! with u along latitude circles and v along meridians.) ! The vertical profile of mass variable is given at mass-grid levels -! (without orography), i.e. at height ZZHATM. +! (without orography), i.e. at height XZHATM. ! The thermal wind balance is used to compute the potential virtual ! temperature from wind field and the vertical profile of thetav. ! The vapor mixing ratio is taken uniform in horizontal plane, i.e. @@ -289,9 +289,6 @@ REAL, DIMENSION(:,:,:), INTENT(OUT) :: PTHV ! potential virtual temperature ! !* 0.2 Declarations of local variables : ! -REAL, DIMENSION(SIZE(XZHAT)) :: ZZHATM ! Height of mass model grid levels - ! (without orography) - INTEGER :: IITRREF ! iteration number for the determination of ! the thetav field REAL,DIMENSION(:,:),ALLOCATABLE :: ZGAMMA,ZGAMMA_ll ! K(lambda-lambda0) -beta @@ -311,7 +308,7 @@ REAL, DIMENSION(SIZE(XXHAT),SIZE(XYHAT),SIZE(XZHAT)) :: ZDXX,ZDYY ! metric ! coefficients dxx,dyy for the grid ! without orography REAL, DIMENSION(SIZE(XZHAT)) :: ZDZHATM,ZDZHAT ! deltaz - ! for ZZHATM and XZHAT levels + ! for XZHATM and XZHAT levels REAL :: ZRADSDG,ZRVSRD !Pi/180,Rv/Rd INTEGER :: IKB,IKE ! useful area in z direction INTEGER :: IIU,IJU,IKU ! Upper bounds in x,y,z directions @@ -351,14 +348,7 @@ CALL GET_OR_ll('B',IXOR_ll,IYOR_ll) ! IN X,Y DIRECTION AND COMPUTE CORIOLIS PARAMETER, AND METRIC ! COEFFICIENTS : ! ------------------------------------------------------------- - ZZHATM(1:IKU-1) = 0.5 * (XZHAT(2:IKU)+XZHAT(1:IKU-1)) ! ZHATm(k)= - ! 0.5(ZHAT(k+1) +ZHAT(k) - ZZHATM(IKU) = 2.* XZHAT(IKU) - ZZHATM(IKU-1) ! extrapolation for IKU - ! based on deltazhat(iku+1) = - ! deltazhat(iku) and Zhatm(k) - ! is the middle point between - ! Zhat(k) and Zhat(k+1) -! +! !* 2.1 Compute a first guess of the dry density ! IF (LTHINSHELL .OR. LCARTESIAN) THEN @@ -402,7 +392,7 @@ END IF ! ZTHV3D(:,:,:) = SPREAD(SPREAD(PTHVM(:),1,IIU),2,IJU) ! initialize with ! (KILOC,KJLOC) vertical profile - ZDZHATM(2:IKU) = ZZHATM(2:IKU)-ZZHATM(1:IKU-1) + ZDZHATM(2:IKU) = XZHATM(2:IKU)-XZHATM(1:IKU-1) ZDZHAT(1:IKU-1) = XZHAT(2:IKU) - XZHAT(1:IKU-1) ! IF (OBOUSS) THEN @@ -652,28 +642,28 @@ ZZM(:,:,:) = MZF(XZZ) ! compute height at mass level ! of grid with orography ! ZZM(:,:,IKU) = 2. * XZZ(:,:,IKU) - ZZM(:,:,IKU-1) ! extrapolate on IKU mass level -! ZZM(:,:,1) is always greater than or equal to ZZHATM(1) -! ZZM(:,:,IKU) is always smaller than or equal to ZZHATM(IKU) +! ZZM(:,:,1) is always greater than or equal to XZHATM(1) +! ZZM(:,:,IKU) is always smaller than or equal to XZHATM(IKU) ! DO JI = 1,IIU DO JJ = 1,IJU ! DO JK = 1,IKU ! loop on vertical levels of grid with orography ! - IF (ZZM(JI,JJ,JK) >= ZZHATM(IKU)) THEN ! copy out when - PTHV(JI,JJ,JK) = ZTHV3D (JI,JJ,IKU) ! ZZM(IKU)= ZZHATM(IKU) + IF (ZZM(JI,JJ,JK) >= XZHATM(IKU)) THEN ! copy out when + PTHV(JI,JJ,JK) = ZTHV3D (JI,JJ,IKU) ! ZZM(IKU)= XZHATM(IKU) XRT(JI,JJ,JK,1) = PMRM(IKU) ! (in case zs=0.) ! - ELSEIF (ZZM(JI,JJ,JK) < ZZHATM(1)) THEN ! copy out when - PTHV(JI,JJ,JK) = ZTHV3D (JI,JJ,1) ! ZZM(1)< ZZHATM(1) + ELSEIF (ZZM(JI,JJ,JK) < XZHATM(1)) THEN ! copy out when + PTHV(JI,JJ,JK) = ZTHV3D (JI,JJ,1) ! ZZM(1)< XZHATM(1) XRT(JI,JJ,JK,1) = PMRM(1) ! (in case zs=0.) ! ELSE ! search levels on the mass grid without orography DO JKS = 2,IKU ! that surrounded JK - IF((ZZM(JI,JJ,JK) >= ZZHATM(JKS-1)).AND.(ZZM(JI,JJ,JK) < ZZHATM(JKS))) & + IF((ZZM(JI,JJ,JK) >= XZHATM(JKS-1)).AND.(ZZM(JI,JJ,JK) < XZHATM(JKS))) & THEN ! interpolation with the values on the grid without ! orography - ZDZ1SDH = (ZZM(JI,JJ,JK)-ZZHATM(JKS-1))/ (ZZHATM(JKS)-ZZHATM(JKS-1)) + ZDZ1SDH = (ZZM(JI,JJ,JK)-XZHATM(JKS-1))/ (XZHATM(JKS)-XZHATM(JKS-1)) ZDZ2SDH = 1. - ZDZ1SDH PTHV(JI,JJ,JK) = (ZDZ1SDH * ZTHV3D(JI,JJ,JKS) ) & + (ZDZ2SDH * ZTHV3D(JI,JJ,JKS-1) ) diff --git a/src/MNH/set_grid.f90 b/src/MNH/set_grid.f90 index 80b75a18778e0127d1c9792f21fc9e387e76c193..4ecfdf8979259f43fdb27dbb497156adcd8ffea0 100644 --- a/src/MNH/set_grid.f90 +++ b/src/MNH/set_grid.f90 @@ -1,96 +1,41 @@ -!MNH_LIC Copyright 1994-2020 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1994-2022 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 31/08/2022: add PXHATM and PYHATM variables +! P. Wautelet 07/09/2022: add INTERP_HORGRID_1DIR_TO_MASSPOINTS, INTERP_HORGRID_TO_MASSPOINTS, INTERP_VERGRID_TO_MASSPOINTS +!----------------------------------------------------------------- ! #################### - MODULE MODI_SET_GRID + MODULE MODE_SET_GRID ! #################### -! -INTERFACE -! - SUBROUTINE SET_GRID(KMI,TPINIFILE, & - KKU,KIMAX_ll,KJMAX_ll, & - PTSTEP,PSEGLEN, & - PLONORI,PLATORI,PLON,PLAT, & - PXHAT,PYHAT,PDXHAT,PDYHAT, PMAP, & - PZS,PZZ,PZHAT,PZTOP,OSLEVE,PLEN1,PLEN2,PZSMT, & - PJ, & - TPDTMOD,TPDTCUR,KSTOP, & - KBAK_NUMB,KOUT_NUMB,TPBACKUPN,TPOUTPUTN ) -! -USE MODD_TYPE_DATE -USE MODD_IO, ONLY: TFILEDATA,TOUTBAK -! -INTEGER, INTENT(IN) :: KMI ! Model index -TYPE(TFILEDATA), INTENT(IN) :: TPINIFILE !Initial file -INTEGER, INTENT(IN) :: KKU ! Upper dimension in z direction - ! for domain arrays -INTEGER, INTENT(IN) :: KIMAX_ll ! Dimensions in x direction - ! of the physical domain, -INTEGER, INTENT(IN) :: KJMAX_ll ! Dimensions in y direction - ! of the physical domain, -! -REAL, INTENT(IN) :: PTSTEP ! time step of model KMI -REAL, INTENT(INOUT) :: PSEGLEN ! segment duration (in seconds) -! -REAL, INTENT(OUT) :: PLONORI ! Longitude of the - ! Origine point of - ! conformal projection -REAL, INTENT(OUT) :: PLATORI ! Latitude of the - ! Origine point of - ! conformal projection -REAL, DIMENSION(:,:), INTENT(OUT) :: PLON,PLAT ! Longitude and latitude -REAL, DIMENSION(:), INTENT(OUT) :: PXHAT ! Position x in the conformal - ! plane or on the cartesian plane -REAL, DIMENSION(:), INTENT(OUT) :: PYHAT ! Position y in the conformal - ! plane or on the cartesian plane -REAL, DIMENSION(:), INTENT(OUT) :: PDXHAT ! horizontal stretching in x -REAL, DIMENSION(:), INTENT(OUT) :: PDYHAT ! horizontal stretching in y -REAL, DIMENSION(:,:), INTENT(OUT) :: PMAP ! Map factor -! -REAL, DIMENSION(:,:), INTENT(OUT) :: PZS ! orography -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PZZ ! Height z -REAL, DIMENSION(:), INTENT(OUT) :: PZHAT ! Height level -REAL, INTENT(OUT) :: PZTOP ! Model top -LOGICAL, INTENT(OUT) :: OSLEVE ! flag for SLEVE coordinate -REAL, INTENT(OUT) :: PLEN1 ! Decay scale for smooth topography -REAL, INTENT(OUT) :: PLEN2 ! Decay scale for small-scale topography deviation -REAL, DIMENSION(:,:), INTENT(OUT) :: PZSMT ! smooth-orography -! -TYPE (DATE_TIME), INTENT(OUT) :: TPDTMOD ! date and time of the model - ! beginning -TYPE (DATE_TIME), INTENT(OUT) :: TPDTCUR ! Current date and time -INTEGER, INTENT(OUT) :: KSTOP ! number of time steps for - ! current segment -INTEGER,POINTER, INTENT(OUT) :: KBAK_NUMB ! number of backups -INTEGER,POINTER, INTENT(OUT) :: KOUT_NUMB ! number of outputs -TYPE(TOUTBAK),DIMENSION(:),POINTER,INTENT(OUT) :: TPBACKUPN ! List of backups -TYPE(TOUTBAK),DIMENSION(:),POINTER,INTENT(OUT) :: TPOUTPUTN ! List of outputs -! -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PJ ! Jacobian -! -END SUBROUTINE SET_GRID -! -END INTERFACE -! -END MODULE MODI_SET_GRID -! -! -! -! -! -! ######################################################################### - SUBROUTINE SET_GRID(KMI,TPINIFILE, & - KKU,KIMAX_ll,KJMAX_ll, & - PTSTEP,PSEGLEN, & - PLONORI,PLATORI,PLON,PLAT, & - PXHAT,PYHAT,PDXHAT,PDYHAT, PMAP, & - PZS,PZZ,PZHAT,PZTOP,OSLEVE,PLEN1,PLEN2,PZSMT, & - PJ, & - TPDTMOD,TPDTCUR,KSTOP, & - KBAK_NUMB,KOUT_NUMB,TPBACKUPN,TPOUTPUTN ) -! ######################################################################### + +IMPLICIT NONE + +PRIVATE + +PUBLIC :: SET_GRID + +PUBLIC :: INTERP_HORGRID_1DIR_TO_MASSPOINTS, INTERP_HORGRID_TO_MASSPOINTS, INTERP_VERGRID_TO_MASSPOINTS + +PUBLIC :: STORE_GLOB_GRID, STORE_GLOB_HORGRID, STORE_GLOB_VERGRID + +CONTAINS + +! ##################################################################### + SUBROUTINE SET_GRID( KMI, TPINIFILE, & + KKU, KIMAX_ll, KJMAX_ll, & + PTSTEP, PSEGLEN, & + PLONORI, PLATORI, PLON, PLAT, & + PXHAT, PYHAT, PDXHAT, PDYHAT, PXHATM, PYHATM, & + PXHAT_ll, PYHAT_ll, PXHATM_ll, PYHATM_ll, & + PHAT_BOUND, PHATM_BOUND, & + PMAP, PZS, PZZ, PZHAT, PZHATM, PZTOP, OSLEVE, & + PLEN1, PLEN2, PZSMT, PJ, & + TPDTMOD, TPDTCUR, KSTOP, & + KBAK_NUMB, KOUT_NUMB, TPBACKUPN, TPOUTPUTN ) +! ##################################################################### ! !!**** *SET_GRID* - routine to set grid variables !! @@ -207,6 +152,7 @@ END MODULE MODI_SET_GRID !! V.MASSON 12/10/00 read of the orography in all cases, even if LFLAT=T !! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O ! P. Wautelet 19/04/2019: removed unused dummy arguments and variables +! P. Wautelet 31/08/2022: add PXHATM and PYHATM variables !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -214,7 +160,7 @@ END MODULE MODI_SET_GRID USE MODD_CONF USE MODD_CONF_n USE MODD_DYN -use modd_field, only: tfielddata, tfieldlist +use modd_field, only: tfieldmetadata, tfieldlist USE MODD_GRID USE MODD_IO, ONLY: TFILEDATA,TOUTBAK USE MODD_LUNIT_n, ONLY: TLUOUT @@ -260,11 +206,20 @@ REAL, DIMENSION(:), INTENT(OUT) :: PYHAT ! Position y in the conformal ! plane or on the cartesian plane REAL, DIMENSION(:), INTENT(OUT) :: PDXHAT ! horizontal stretching in x REAL, DIMENSION(:), INTENT(OUT) :: PDYHAT ! horizontal stretching in y +REAL, DIMENSION(:), INTENT(OUT) :: PXHATM ! Position x in the conformal plane or on the cartesian plane at mass points +REAL, DIMENSION(:), INTENT(OUT) :: PYHATM ! Position y in the conformal plane or on the cartesian plane at mass points +REAL, DIMENSION(:), POINTER, INTENT(INOUT) :: PXHAT_ll ! Position x, y or z in the conformal or cartesian plane (all domain) +REAL, DIMENSION(:), POINTER, INTENT(INOUT) :: PYHAT_ll ! Position x, y or z in the conformal or cartesian plane (all domain) +REAL, DIMENSION(:), POINTER, INTENT(INOUT) :: PXHATM_ll ! id at mass points +REAL, DIMENSION(:), POINTER, INTENT(INOUT) :: PYHATM_ll ! id at mass points +REAL, DIMENSION(:), POINTER, INTENT(INOUT) :: PHAT_BOUND ! Boundaries of global domain in the conformal or cartesian plane +REAL, DIMENSION(:), POINTER, INTENT(INOUT) :: PHATM_BOUND ! idem at mass points REAL, DIMENSION(:,:), INTENT(OUT) :: PMAP ! Map factor ! REAL, DIMENSION(:,:), INTENT(OUT) :: PZS ! orography REAL, DIMENSION(:,:,:), INTENT(OUT) :: PZZ ! Height z -REAL, DIMENSION(:), INTENT(OUT) :: PZHAT ! Height level +REAL, DIMENSION(:), INTENT(OUT) :: PZHAT ! Height level +REAL, DIMENSION(:), INTENT(OUT) :: PZHATM ! Height level at mass points REAL, INTENT(OUT) :: PZTOP ! Model top LOGICAL, INTENT(OUT) :: OSLEVE ! flag for SLEVE coordinate REAL, INTENT(OUT) :: PLEN1 ! Decay scale for smooth topography @@ -299,7 +254,7 @@ INTEGER :: IIUP,IJUP ,ISUP=1 ! size of working ! window arrays, ! supp. time steps ! -TYPE(TFIELDDATA) :: TZFIELD +TYPE(TFIELDMETADATA) :: TZFIELD !------------------------------------------------------------------------------- ! !* 1. READ GRID VARIABLES IN INITIAL FILE @@ -334,14 +289,15 @@ IF (.NOT.LCARTESIAN) THEN CALL IO_Field_read(TPINIFILE,'LONORI',PLONORI) CALL IO_Field_read(TPINIFILE,'LATORI',PLATORI) ! - ELSE + ELSE + ! If file comes from MesoNH < 4.6.0 CALL FIND_FIELD_ID_FROM_MNHNAME('LONORI',IID,IRESP) - TZFIELD = TFIELDLIST(IID) + TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) TZFIELD%CMNHNAME = 'LONOR' CALL IO_Field_read(TPINIFILE,TZFIELD,PLONORI) ! CALL FIND_FIELD_ID_FROM_MNHNAME('LATORI',IID,IRESP) - TZFIELD = TFIELDLIST(IID) + TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) TZFIELD%CMNHNAME = 'LATOR' CALL IO_Field_read(TPINIFILE,TZFIELD,PLATORI) ! @@ -396,11 +352,21 @@ CALL IO_Field_read(TPINIFILE,'DTSEG',TDTSEG) ! !* 2.1 Spatial grid ! + +! Interpolations of positions to mass points +CALL INTERP_HORGRID_TO_MASSPOINTS( PXHAT, PYHAT, PXHATM, PYHATM ) +CALL INTERP_VERGRID_TO_MASSPOINTS( PZHAT, PZHATM ) + +! Collect global domain boundaries +CALL STORE_GLOB_GRID( PXHAT, PYHAT, PZHAT, PXHATM, PYHATM, PZHATM, & + PXHAT_ll, PYHAT_ll, PXHATM_ll, PYHATM_ll, PHAT_BOUND, PHATM_BOUND ) + IF (LCARTESIAN) THEN CALL SM_GRIDCART(PXHAT,PYHAT,PZHAT,PZS,OSLEVE,PLEN1,PLEN2,PZSMT,PDXHAT,PDYHAT,PZZ,PJ) ELSE - CALL SM_GRIDPROJ(PXHAT,PYHAT,PZHAT,PZS,OSLEVE,PLEN1,PLEN2,PZSMT,PLATORI,PLONORI, & - PMAP,PLAT,PLON,PDXHAT,PDYHAT,PZZ,PJ) + CALL SM_GRIDPROJ( PXHAT, PYHAT, PZHAT, PXHATM, PYHATM, PZS, & + OSLEVE, PLEN1, PLEN2, PZSMT, PLATORI, PLONORI, & + PMAP, PLAT, PLON, PDXHAT, PDYHAT, PZZ, PJ ) END IF ! !* 2.2 Temporal grid - segment length @@ -477,3 +443,274 @@ CALL SM_PRINT_TIME(TDTSEG,TLUOUT,YTITLE) !------------------------------------------------------------------------------- ! END SUBROUTINE SET_GRID + + +!----------------------------------------------------------------- +SUBROUTINE INTERP_HORGRID_1DIR_TO_MASSPOINTS( HDIR, PHAT, PHATM ) + ! Interpolate 1 direction of horizontal grid to mass points + + USE MODD_ARGSLIST_ll, ONLY: LIST1D_ll + + USE MODE_ARGSLIST_ll, ONLY: ADD1DFIELD_ll, CLEANLIST1D_ll + USE MODE_EXCHANGE_ll, ONLY: UPDATE_1DHALO_ll + USE MODE_MSG + + IMPLICIT NONE + + CHARACTER(LEN=1), INTENT(IN) :: HDIR ! Direction ('X' or 'Y') + REAL, DIMENSION(:), INTENT(IN) :: PHAT ! Position x or y in the conformal or cartesian plane + REAL, DIMENSION(:), INTENT(OUT) :: PHATM ! Position x or y in the conformal or cartesian plane at mass points + + CHARACTER(LEN=:), ALLOCATABLE :: YNAME + INTEGER :: IINFO_ll ! return code + TYPE(LIST1D_ll), POINTER :: TZLIST ! pointer for the list of 1D fields to be communicated + + + ! Interpolate inside subdomain + PHATM( : UBOUND(PHATM,1)-1 ) = 0.5 * PHAT( : UBOUND(PHAT,1)-1 ) + 0.5 * PHAT( LBOUND(PHAT,1)+1 : UBOUND(PHAT,1) ) + PHATM( UBOUND(PHATM,1) ) = 1.5 * PHAT( UBOUND(PHAT,1) ) - 0.5 * PHAT( UBOUND(PHAT,1)-1 ) + + ! Update data between subdomains + NULLIFY( TZLIST ) + + IF ( HDIR == 'X' ) THEN + YNAME = 'XHATM' + ELSE IF ( HDIR == 'Y' ) THEN + YNAME = 'YHATM' + ELSE + CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'INTERP_HORGRID_1DIR_TO_MASSPOINTS', 'invalid direction (valid: X or Y)' ) + END IF + + CALL ADD1DFIELD_ll( HDIR, TZLIST, PHATM, YNAME ) + CALL UPDATE_1DHALO_ll( TZLIST, IINFO_ll ) + CALL CLEANLIST1D_ll( TZLIST ) + +END SUBROUTINE INTERP_HORGRID_1DIR_TO_MASSPOINTS +!----------------------------------------------------------------- + + +!----------------------------------------------------------------- +SUBROUTINE INTERP_HORGRID_TO_MASSPOINTS( PXHAT, PYHAT, PXHATM, PYHATM ) + + IMPLICIT NONE + + REAL, DIMENSION(:), INTENT(IN) :: PXHAT ! Position x in the conformal or cartesian plane + REAL, DIMENSION(:), INTENT(IN) :: PYHAT ! Position y in the conformal or cartesian plane + REAL, DIMENSION(:), INTENT(OUT) :: PXHATM ! Position x in the conformal or cartesian plane at mass points + REAL, DIMENSION(:), INTENT(OUT) :: PYHATM ! Position y in the conformal or cartesian plane at mass points + + CALL INTERP_HORGRID_1DIR_TO_MASSPOINTS( 'X', PXHAT, PXHATM ) + CALL INTERP_HORGRID_1DIR_TO_MASSPOINTS( 'Y', PYHAT, PYHATM ) + +END SUBROUTINE INTERP_HORGRID_TO_MASSPOINTS +!----------------------------------------------------------------- + + +!----------------------------------------------------------------- +PURE SUBROUTINE INTERP_VERGRID_TO_MASSPOINTS( PZHAT, PZHATM ) + ! Interpolate vertical grid to mass points + + IMPLICIT NONE + + REAL, DIMENSION(:), INTENT(IN) :: PZHAT ! Position z in the conformal or cartesian plane + REAL, DIMENSION(:), INTENT(OUT) :: PZHATM ! Position z in the conformal or cartesian plane at mass points + + PZHATM( : UBOUND(PZHATM,1)-1 ) = 0.5 * PZHAT( : UBOUND(PZHAT,1)-1 ) + 0.5 * PZHAT( LBOUND(PZHAT,1)+1 : UBOUND(PZHAT,1) ) + PZHATM( UBOUND(PZHATM,1) ) = 1.5 * PZHAT( UBOUND(PZHAT,1) ) - 0.5 * PZHAT( UBOUND(PZHAT,1)-1 ) + +END SUBROUTINE INTERP_VERGRID_TO_MASSPOINTS +!----------------------------------------------------------------- + + +!----------------------------------------------------------------- +SUBROUTINE STORE_GRID_1DIR( HDIR, PHAT, PHATM, PHAT_ll, PHATM_ll, PHAT_BOUND, PHATM_BOUND ) + + USE MODD_GRID_n + USE MODD_PARAMETERS, ONLY: JPHEXT, JPVEXT, XNEGUNDEF + + USE MODE_ALLOCBUFFER_ll, ONLY: ALLOCBUFFER_ll + USE MODE_GATHER_ll, ONLY: GATHERALL_FIELD_ll + USE MODE_MSG + + IMPLICIT NONE + + CHARACTER(LEN=1), INTENT(IN) :: HDIR ! Direction ('X', 'Y' or 'Z') + REAL, DIMENSION(:), TARGET, INTENT(IN) :: PHAT ! Position x, y or z in the conformal or cartesian plane + REAL, DIMENSION(:), TARGET, INTENT(IN) :: PHATM ! id at mass points + REAL, DIMENSION(:), POINTER, INTENT(INOUT) :: PHAT_ll ! Position x, y or z in the conformal or cartesian plane (all domain) + REAL, DIMENSION(:), POINTER, INTENT(INOUT) :: PHATM_ll ! id at mass points + REAL, DIMENSION(:), POINTER, INTENT(INOUT) :: PHAT_BOUND ! Boundaries of global domain in the conformal or cartesian plane + REAL, DIMENSION(:), POINTER, INTENT(INOUT) :: PHATM_BOUND ! idem at mass points + + INTEGER :: IERR + LOGICAL :: GALLOC, GALLOCM !Remark: do not deallocate (PHAT_ll/PHATM_ll may be used outside this subroutine) + + GALLOC = .FALSE. + GALLOCM = .FALSE. + + + IF ( .NOT. ASSOCIATED( PHAT_BOUND ) ) THEN + ALLOCATE( PHAT_BOUND(NHAT_BOUND_SIZE) ) + PHAT_BOUND(:) = XNEGUNDEF + END IF + + IF ( .NOT. ASSOCIATED( PHATM_BOUND ) ) THEN + ALLOCATE( PHATM_BOUND(NHAT_BOUND_SIZE) ) + PHATM_BOUND(:) = XNEGUNDEF + END IF + + SELECT CASE (HDIR) + CASE ( 'X' ) + IF ( .NOT. ASSOCIATED( PHAT_ll ) ) THEN + CALL ALLOCBUFFER_ll( PHAT_ll, PHAT, 'XX', GALLOC ) + CALL GATHERALL_FIELD_ll( 'XX', PHAT, PHAT_ll, IERR ) + END IF + IF ( .NOT. ASSOCIATED( PHATM_ll ) ) THEN + CALL ALLOCBUFFER_ll( PHATM_ll, PHATM, 'XX', GALLOCM ) + CALL GATHERALL_FIELD_ll( 'XX', PHATM, PHATM_ll, IERR ) + END IF + + ! Global boundaries on u points + PHAT_BOUND(NEXTE_XMIN) = PHAT_ll( 1 ) + PHAT_BOUND(NEXTE_XMAX) = PHAT_ll( UBOUND( PHAT_ll, 1 ) ) + PHAT_BOUND(NPHYS_XMIN) = PHAT_ll( JPHEXT + 1 ) + PHAT_BOUND(NPHYS_XMAX) = PHAT_ll( UBOUND( PHAT_ll, 1 ) ) + + ! Global boundaries on m points + PHATM_BOUND(NEXTE_XMIN) = PHATM_ll( 1 ) + PHATM_BOUND(NEXTE_XMAX) = PHATM_ll( UBOUND( PHATM_ll, 1 ) ) + PHATM_BOUND(NPHYS_XMIN) = PHATM_ll( JPHEXT + 1 ) + PHATM_BOUND(NPHYS_XMAX) = PHATM_ll( UBOUND( PHATM_ll, 1 ) - JPHEXT ) + + CASE ( 'Y' ) + IF ( .NOT. ASSOCIATED( PHAT_ll ) ) THEN + CALL ALLOCBUFFER_ll( PHAT_ll, PHAT, 'YY', GALLOC ) + CALL GATHERALL_FIELD_ll( 'YY', PHAT, PHAT_ll, IERR ) + END IF + IF ( .NOT. ASSOCIATED( PHATM_ll ) ) THEN + CALL ALLOCBUFFER_ll( PHATM_ll, PHATM, 'YY', GALLOCM ) + CALL GATHERALL_FIELD_ll( 'YY', PHATM, PHATM_ll, IERR ) + END IF + + ! Global boundaries on v points + PHAT_BOUND(NEXTE_YMIN) = PHAT_ll( 1 ) + PHAT_BOUND(NEXTE_YMAX) = PHAT_ll( UBOUND( PHAT_ll, 1 ) ) + PHAT_BOUND(NPHYS_YMIN) = PHAT_ll( JPHEXT + 1 ) + PHAT_BOUND(NPHYS_YMAX) = PHAT_ll( UBOUND( PHAT_ll, 1 ) ) + + ! Global boundaries on m points + PHATM_BOUND(NEXTE_YMIN) = PHATM_ll( 1 ) + PHATM_BOUND(NEXTE_YMAX) = PHATM_ll( UBOUND( PHATM_ll, 1 ) ) + PHATM_BOUND(NPHYS_YMIN) = PHATM_ll( JPHEXT + 1 ) + PHATM_BOUND(NPHYS_YMAX) = PHATM_ll( UBOUND( PHATM_ll, 1 ) - JPHEXT ) + + CASE ( 'Z' ) + PHAT_ll => PHAT + PHATM_ll => PHATM + + ! Global boundaries on w points + PHAT_BOUND(NEXTE_ZMIN) = PHAT_ll( 1 ) + PHAT_BOUND(NEXTE_ZMAX) = PHAT_ll( UBOUND( PHAT_ll, 1 ) ) + PHAT_BOUND(NPHYS_ZMIN) = PHAT_ll( JPVEXT + 1 ) + PHAT_BOUND(NPHYS_ZMAX) = PHAT_ll( UBOUND( PHAT_ll, 1 ) ) + + ! Global boundaries on m points + PHATM_BOUND(NEXTE_ZMIN) = PHATM_ll( 1 ) + PHATM_BOUND(NEXTE_ZMAX) = PHATM_ll( UBOUND( PHATM_ll, 1 ) ) + PHATM_BOUND(NPHYS_ZMIN) = PHATM_ll( JPVEXT + 1 ) + PHATM_BOUND(NPHYS_ZMAX) = PHATM_ll( UBOUND( PHATM_ll, 1 ) - JPVEXT ) + + CASE DEFAULT + CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'STORE_GRID_1DIR', 'invalid direction (valid: X, Y or Z)' ) + + END SELECT + +END SUBROUTINE STORE_GRID_1DIR +!----------------------------------------------------------------- + + +!----------------------------------------------------------------- +SUBROUTINE STORE_GLOB_GRID( PXHAT, PYHAT, PZHAT, PXHATM, PYHATM, PZHATM, & + PXHAT_ll, PYHAT_ll, PXHATM_ll, PYHATM_ll, PHAT_BOUND, PHATM_BOUND ) + + IMPLICIT NONE + + REAL, DIMENSION(:), INTENT(IN) :: PXHAT ! Position x in the conformal or cartesian plane + REAL, DIMENSION(:), INTENT(IN) :: PYHAT ! Position y in the conformal or cartesian plane + REAL, DIMENSION(:), INTENT(IN) :: PZHAT ! Position y in the conformal or cartesian plane + REAL, DIMENSION(:), INTENT(IN) :: PXHATM ! idem at mass points + REAL, DIMENSION(:), INTENT(IN) :: PYHATM ! idem at mass points + REAL, DIMENSION(:), INTENT(IN) :: PZHATM ! idem at mass points + REAL, DIMENSION(:), POINTER, INTENT(INOUT) :: PXHAT_ll ! Position x, y or z in the conformal or cartesian plane (all domain) + REAL, DIMENSION(:), POINTER, INTENT(INOUT) :: PYHAT_ll ! Position x, y or z in the conformal or cartesian plane (all domain) + REAL, DIMENSION(:), POINTER, INTENT(INOUT) :: PXHATM_ll ! id at mass points + REAL, DIMENSION(:), POINTER, INTENT(INOUT) :: PYHATM_ll ! id at mass points + REAL, DIMENSION(:), POINTER, INTENT(INOUT) :: PHAT_BOUND ! Boundaries of global domain in the conformal or cartesian plane + REAL, DIMENSION(:), POINTER, INTENT(INOUT) :: PHATM_BOUND ! idem at mass points + + REAL, DIMENSION(:), POINTER :: PZHAT_DUMMY_ll + REAL, DIMENSION(:), POINTER :: PZHATM_DUMMY_ll + + PZHAT_DUMMY_ll => NULL() + PZHATM_DUMMY_ll => NULL() + + CALL STORE_GLOB_HORGRID( PXHAT, PYHAT, PXHATM, PYHATM, PXHAT_ll, PYHAT_ll, PXHATM_ll, PYHATM_ll, PHAT_BOUND, PHATM_BOUND ) + CALL STORE_GLOB_VERGRID( PZHAT, PZHATM, PHAT_BOUND, PHATM_BOUND ) + + PZHAT_DUMMY_ll => NULL() + PZHATM_DUMMY_ll => NULL() + +END SUBROUTINE STORE_GLOB_GRID +!----------------------------------------------------------------- + + +!----------------------------------------------------------------- +SUBROUTINE STORE_GLOB_HORGRID( PXHAT, PYHAT, PXHATM, PYHATM, & + PXHAT_ll, PYHAT_ll, PXHATM_ll, PYHATM_ll, PHAT_BOUND, PHATM_BOUND ) + + IMPLICIT NONE + + REAL, DIMENSION(:), INTENT(IN) :: PXHAT ! Position x in the conformal or cartesian plane + REAL, DIMENSION(:), INTENT(IN) :: PYHAT ! Position y in the conformal or cartesian plane + REAL, DIMENSION(:), INTENT(IN) :: PXHATM ! idem at mass points + REAL, DIMENSION(:), INTENT(IN) :: PYHATM ! idem at mass points + REAL, DIMENSION(:), POINTER, INTENT(INOUT) :: PXHAT_ll ! Position x, y or z in the conformal or cartesian plane (all domain) + REAL, DIMENSION(:), POINTER, INTENT(INOUT) :: PYHAT_ll ! Position x, y or z in the conformal or cartesian plane (all domain) + REAL, DIMENSION(:), POINTER, INTENT(INOUT) :: PXHATM_ll ! id at mass points + REAL, DIMENSION(:), POINTER, INTENT(INOUT) :: PYHATM_ll ! id at mass points + REAL, DIMENSION(:), POINTER, INTENT(INOUT) :: PHAT_BOUND ! Boundaries of global domain in the conformal or cartesian plane + REAL, DIMENSION(:), POINTER, INTENT(INOUT) :: PHATM_BOUND ! idem at mass points + + CALL STORE_GRID_1DIR( 'X', PXHAT, PXHATM, PXHAT_ll, PXHATM_ll, PHAT_BOUND, PHATM_BOUND ) + CALL STORE_GRID_1DIR( 'Y', PYHAT, PYHATM, PYHAT_ll, PYHATM_ll, PHAT_BOUND, PHATM_BOUND ) + +END SUBROUTINE STORE_GLOB_HORGRID +!----------------------------------------------------------------- + + +!----------------------------------------------------------------- +SUBROUTINE STORE_GLOB_VERGRID( PZHAT, PZHATM, PHAT_BOUND, PHATM_BOUND ) + + IMPLICIT NONE + + REAL, DIMENSION(:), INTENT(IN) :: PZHAT ! Position z in the conformal or cartesian plane + REAL, DIMENSION(:), INTENT(IN) :: PZHATM ! idem at mass points + REAL, DIMENSION(:), POINTER, INTENT(INOUT) :: PHAT_BOUND ! Boundaries of global domain in the conformal or cartesian plane + REAL, DIMENSION(:), POINTER, INTENT(INOUT) :: PHATM_BOUND ! idem at mass points + + REAL, DIMENSION(:), POINTER :: PZHAT_DUMMY_ll + REAL, DIMENSION(:), POINTER :: PZHATM_DUMMY_ll + + PZHAT_DUMMY_ll => NULL() + PZHATM_DUMMY_ll => NULL() + + CALL STORE_GRID_1DIR( 'Z', PZHAT, PZHATM, PZHAT_DUMMY_ll, PZHATM_DUMMY_ll, PHAT_BOUND, PHATM_BOUND ) + + PZHAT_DUMMY_ll => NULL() + PZHATM_DUMMY_ll => NULL() + +END SUBROUTINE STORE_GLOB_VERGRID +!----------------------------------------------------------------- + + +END MODULE MODE_SET_GRID diff --git a/src/MNH/set_perturb.f90 b/src/MNH/set_perturb.f90 index 42e384c2a602a5eff3e16415e897edff93ae7922..7c4ea5e2e9c224c4d9d1d2022b8fcc0c372d1d8f 100644 --- a/src/MNH/set_perturb.f90 +++ b/src/MNH/set_perturb.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1994-2022 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. @@ -164,10 +164,6 @@ REAL,DIMENSION(:,:),ALLOCATABLE :: ZCY_ll,ZSY_ll ! and y directions REAL, DIMENSION(SIZE(XXHAT),SIZE(XYHAT),SIZE(XZHAT)) :: ZT ! temperature REAL, DIMENSION(SIZE(XXHAT),SIZE(XYHAT),SIZE(XZHAT)) :: ZHU ! rel. humidity ! -REAL, DIMENSION(:), ALLOCATABLE :: ZXHAT_ll ! Position x in the conformal - ! plane (array on the complete domain) -REAL, DIMENSION(:), ALLOCATABLE :: ZYHAT_ll ! Position y in the conformal - ! plane (array on the complete domain) INTEGER :: IIU_ll,IJU_ll ! horizontal,vertical size of the extended global domain INTEGER :: IIB_ll,IJB_ll ! global coordinate of the physical global domain INTEGER :: IIE_ll,IJE_ll ! @@ -241,9 +237,6 @@ IJE=IJU-JPHEXT ! IIU_ll=NIMAX_ll+2*JPHEXT IJU_ll=NJMAX_ll+2*JPHEXT -ALLOCATE(ZXHAT_ll(IIU_ll),ZYHAT_ll(IJU_ll)) -CALL GATHERALL_FIELD_ll('XX',XXHAT,ZXHAT_ll,IRESP) -CALL GATHERALL_FIELD_ll('YY',XYHAT,ZYHAT_ll,IRESP) ! CALL GET_INDICE_ll (IIB,IJB,IIE,IJE) IIB_ll=1+JPHEXT @@ -269,17 +262,16 @@ SELECT CASE(CPERT_KIND) CASE('TH') ZDIST(:,:,:) = 2. ! C grid shift - ZCENTERX=(ZXHAT_ll(2)+ZXHAT_ll(IIU_ll))*0.5 - ZCENTERY=(ZYHAT_ll(2)+ZYHAT_ll(IJU_ll))*0.5 + ZCENTERX=(XXHAT_ll(2)+XXHAT_ll(IIU_ll))*0.5 + ZCENTERY=(XYHAT_ll(2)+XYHAT_ll(IJU_ll))*0.5 ! DO JK =IKB,IKE DO JJ = IJB,IJE DO JI = IIB,IIE - ZDIST(JI,JJ,JK) = SQRT( & - (( (XXHAT(JI)+XXHAT(JI+1))*0.5 - ZCENTERX ) / XRADX)**2 + & - (( (XYHAT(JJ)+XYHAT(JJ+1))*0.5 - ZCENTERY ) / XRADY)**2 + & - (( (XZHAT(JK)+XZHAT(JK+1))*0.5 - XCENTERZ ) / XRADZ)**2 & - ) + ZDIST(JI,JJ,JK) = SQRT( & + ( ( XXHATM(JI) - ZCENTERX ) / XRADX)**2 + & + ( ( XYHATM(JJ) - ZCENTERY ) / XRADY)**2 + & + ( ( XZHATM(JK) - XCENTERZ ) / XRADZ)**2 ) END DO END DO END DO @@ -340,8 +332,8 @@ SELECT CASE(CPERT_KIND) ! DO JI = 1,IIU_ll DO JJ = 1,IJU_ll - ZPHI_ll(JI,JJ) = XAMPLIUV*EXP(-((ZYHAT_ll(JJ)-ZYHAT_ll(IJ0))/XRADY)**2) & - * COS(2.*XPI/XRADX*ZXHAT_ll(JI)) + ZPHI_ll(JI,JJ) = XAMPLIUV*EXP(-((XYHAT_ll(JJ)-XYHAT_ll(IJ0))/XRADY)**2) & + * COS(2.*XPI/XRADX*XXHAT_ll(JI)) END DO END DO ! @@ -349,8 +341,8 @@ SELECT CASE(CPERT_KIND) ! DO JI = 1,IIU_ll DO JJ = IJMIN,IJMAX - ZPU_ll(JI,JJ) = (ZPHI_ll(JI,JJ+1)-ZPHI_ll(JI,JJ)) / (-ZYHAT_ll(JJ+1)+ZYHAT_ll(JJ) ) - ZPV_ll(JI,JJ) = (ZPHI_ll(JI+1,JJ)-ZPHI_ll(JI,JJ)) / ( ZXHAT_ll(JI+1)-ZXHAT_ll(JI) ) + ZPU_ll(JI,JJ) = (ZPHI_ll(JI,JJ+1)-ZPHI_ll(JI,JJ)) / (-XYHAT_ll(JJ+1)+XYHAT_ll(JJ) ) + ZPV_ll(JI,JJ) = (ZPHI_ll(JI+1,JJ)-ZPHI_ll(JI,JJ)) / ( XXHAT_ll(JI+1)-XXHAT_ll(JI) ) END DO END DO ! @@ -559,8 +551,6 @@ SELECT CASE(CPERT_KIND) ! END SELECT ! -DEALLOCATE(ZXHAT_ll,ZYHAT_ll) -! !------------------------------------------------------------------------------- ! END SUBROUTINE SET_PERTURB diff --git a/src/MNH/set_ref.f90 b/src/MNH/set_ref.f90 index 3fbd530b720dad8acead062a8a9854cfbc3950a0..02496e9208ff2a06760bf878f1626b76a2616898 100644 --- a/src/MNH/set_ref.f90 +++ b/src/MNH/set_ref.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1994-2022 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. @@ -10,7 +10,7 @@ MODULE MODI_SET_REF INTERFACE ! SUBROUTINE SET_REF(KMI,TPINIFILE, & - PZZ,PZHAT,PJ,PDXX,PDYY,HLBCX,HLBCY, & + PZZ,PZHATM,PJ,PDXX,PDYY,HLBCX,HLBCY, & PREFMASS,PMASS_O_PHI0,PLINMASS, & PRHODREF,PTHVREF,PRVREF,PEXNREF,PRHODJ ) ! @@ -20,7 +20,7 @@ INTEGER, INTENT(IN) :: KMI ! Model index TYPE(TFILEDATA), INTENT(IN) :: TPINIFILE ! Initial file REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Height of the w levels ! with orography -REAL, DIMENSION(:), INTENT(IN) :: PZHAT ! Height of the w levels +REAL, DIMENSION(:), INTENT(IN) :: PZHATM ! Height of the w levels at mass points ! in the transformed space (GCS transf.) or without orography REAL, DIMENSION(:,:,:), INTENT(IN) :: PJ ! Jacobian REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX ! metric coefficient dxx @@ -54,7 +54,7 @@ END MODULE MODI_SET_REF ! ! ######################################################################### SUBROUTINE SET_REF(KMI,TPINIFILE, & - PZZ,PZHAT,PJ,PDXX,PDYY,HLBCX,HLBCY, & + PZZ,PZHATM,PJ,PDXX,PDYY,HLBCX,HLBCY, & PREFMASS,PMASS_O_PHI0,PLINMASS, & PRHODREF,PTHVREF,PRVREF,PEXNREF,PRHODJ ) ! ######################################################################### @@ -176,7 +176,7 @@ INTEGER, INTENT(IN) :: KMI ! Model index TYPE(TFILEDATA), INTENT(IN) :: TPINIFILE ! Initial file REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Height of the w levels ! with orography -REAL, DIMENSION(:), INTENT(IN) :: PZHAT ! Height of the w levels +REAL, DIMENSION(:), INTENT(IN) :: PZHATM ! Height of the w levels at mass points ! in the transformed space (GCS transf.) or without orography REAL, DIMENSION(:,:,:), INTENT(IN) :: PJ ! Jacobian REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX ! metric coefficient dxx @@ -210,8 +210,6 @@ REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)) :: ZZM ! with orography REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)) :: ZRHOREF ! Reference density -REAL, DIMENSION(SIZE(PZZ,3)) :: ZZHATM ! height of the mass levels - ! in the transformed space (GCS transf.) or without orography REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)) :: ZDENSOC,ZPFLUX,ZPMASS ! INTEGER :: IIU ! Upper dimension in x direction @@ -282,11 +280,9 @@ END IF ! DO JK = 1,IKU-1 ZZM(:,:,JK) = 0.5*(PZZ(:,:,JK) + PZZ(:,:,JK+1)) - ZZHATM(JK) = 0.5*(PZHAT(JK)+PZHAT(JK+1)) END DO -ZZHATM(IKU) = 2.* PZHAT(IKU) -ZZHATM(IKU-1) ZZM(:,:,IKU) = 2.* PZZ(:,:,IKU) -ZZM(:,:,IKU-1) -! ZZM(:,:,IKU) is always smaller than or equal ZZHATM(IKU) +! ZZM(:,:,IKU) is always smaller than or equal PZHATM(IKU) ! ! CALL MPPDB_CHECK3D(ZZM,"SET_REF::ZZM",PRECISION) @@ -304,16 +300,16 @@ ELSE ! DO JK = 1,IKU ! - IF (ZZM(JI,JJ,JK) >= ZZHATM(IKU)) THEN ! copy out when - PTHVREF(JI,JJ,JK) = XTHVREFZ(IKU) ! ZZM(IKU)= ZZHATM(IKU) + IF (ZZM(JI,JJ,JK) >= PZHATM(IKU)) THEN ! copy out when + PTHVREF(JI,JJ,JK) = XTHVREFZ(IKU) ! ZZM(IKU)= PZHATM(IKU) PRHODREF(JI,JJ,JK) = XRHODREFZ(IKU) ! (in case zs=0.) ! ELSE ! search levels on the mass grid without orography - IF (ZZM(JI,JJ,JK) < ZZHATM(2)) THEN + IF (ZZM(JI,JJ,JK) < PZHATM(2)) THEN IKS=3 ELSE SEARCH : DO JKS = 3,IKU - IF((ZZM(JI,JJ,JK) >= ZZHATM(JKS-1)).AND.(ZZM(JI,JJ,JK) < ZZHATM(JKS))) & + IF((ZZM(JI,JJ,JK) >= PZHATM(JKS-1)).AND.(ZZM(JI,JJ,JK) < PZHATM(JKS))) & THEN ! interpolation with the values on the grid without ! orography IKS=JKS @@ -321,7 +317,7 @@ ELSE END IF END DO SEARCH END IF - ZDZ1SDZ = (ZZM(JI,JJ,JK)-ZZHATM(IKS-1)) / (ZZHATM(IKS)-ZZHATM(IKS-1)) + ZDZ1SDZ = (ZZM(JI,JJ,JK)-PZHATM(IKS-1)) / (PZHATM(IKS)-PZHATM(IKS-1)) ZDZ2SDZ = 1. - ZDZ1SDZ PTHVREF(JI,JJ,JK) = ( ZDZ1SDZ* XTHVREFZ(IKS) ) & + (ZDZ2SDZ* XTHVREFZ(IKS-1) ) diff --git a/src/MNH/set_refz.f90 b/src/MNH/set_refz.f90 index f6e82cd85f4e20a2e30627462ed593af03d6d0b8..7822c7e60b1cc345e89cfa995891195401abd656 100644 --- a/src/MNH/set_refz.f90 +++ b/src/MNH/set_refz.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1994-2020 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1994-2022 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. @@ -193,8 +193,7 @@ XTHVREFZ(:)=-999. !ocl scalar !!!!!!!!!!!!!!!! FUJI compiler directive !!!!!!!!!! DO JK=IKB,IKU-1 - XTHVREFZ(JK)= ZSECT(0.5*(XZHAT(JK)+XZHAT(JK+1)), & - ZZMASS(:,:,IKB:IKE+1),PTHV(:,:,IKB:IKE+1)) + XTHVREFZ(JK) = ZSECT( XZHATM(JK), ZZMASS(:,:,IKB:IKE+1), PTHV(:,:,IKB:IKE+1) ) END DO XTHVREFZ(IKU)=XTHVREFZ(IKU-1) & +(XTHVREFZ(IKU-1)-XTHVREFZ(IKU-2)) & @@ -217,8 +216,7 @@ XTHVREFZ(1)=XTHVREFZ(2) ZRREFZ(:)=-999. !ocl scalar DO JK=IKB,IKU-1 - ZRREFZ(JK)= ZSECT(0.5*(XZHAT(JK)+XZHAT(JK+1)), & - ZZMASS(:,:,IKB:IKE+1),PRV(:,:,IKB:IKE+1)) + ZRREFZ(JK) = ZSECT( XZHATM(JK), ZZMASS(:,:,IKB:IKE+1), PRV(:,:,IKB:IKE+1) ) END DO ZRREFZ(IKU)=ZRREFZ(IKU-1) & +(ZRREFZ(IKU-1)-ZRREFZ(IKU-2)) & @@ -233,7 +231,7 @@ IF (ZRREFZ(IMINLEVEL)==0) THEN ELSE ZCOEFB=-(LOG(ZRREFZ(IMINLEVEL+1))-LOG(ZRREFZ(IMINLEVEL))) & /(0.5*(XZHAT(IMINLEVEL+2)-XZHAT(IMINLEVEL))) - ZCOEFA=ZRREFZ(IMINLEVEL)*EXP(ZCOEFB*0.5*(XZHAT(IMINLEVEL+1)+XZHAT(IMINLEVEL))) + ZCOEFA=ZRREFZ(IMINLEVEL)*EXP(ZCOEFB*XZHATM(IMINLEVEL)) WHERE (ZRREFZ==-999.) ZRREFZ(:)=ZCOEFA*EXP(-ZCOEFB*0.5*(XZHAT(:)+EOSHIFT(XZHAT(:),1))) END WHERE diff --git a/src/MNH/set_relfrc.f90 b/src/MNH/set_relfrc.f90 index d53c5ae3696c64ed0033d848869479f61bab9f88..857e92ede1b7d77173aff94e05a03c809f730a6e 100644 --- a/src/MNH/set_relfrc.f90 +++ b/src/MNH/set_relfrc.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2013-2020 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2013-2022 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. @@ -126,7 +126,6 @@ CHARACTER(LEN=48) :: CFNAM_MEANVAR_REL CHARACTER(LEN=28) :: CFNAM_REL ! REAL, DIMENSION(:), ALLOCATABLE:: ZHEIGHTMFR,ZHEIGHTFR,ZTHVUFR,ZTHVUF -REAL, DIMENSION(:), ALLOCATABLE:: ZZHATM REAL, DIMENSION(:), ALLOCATABLE:: ZPRESS_REL REAL, DIMENSION(:), ALLOCATABLE:: ZTHDFR,ZTHVFR,ZRVFR ! @@ -192,9 +191,6 @@ ALLOCATE(ZHEIGHTFR(NPRESSLEV_REL)) ! allocations pour le module moddb_advfrc ! Adv forcing ! -! For reading in PRE_IDEA1.nam -ALLOCATE(ZZHATM(IKU)) -! ! relaxation profile ALLOCATE(ZRVREL1D(IIU,IKU,NRELFRC)) ALLOCATE(ZVREL1D(IIU,IKU,NRELFRC)) @@ -259,15 +255,11 @@ DO JKT = 1,NRELFRC END IF ! - ZZHATM(1:IKU-1) = 0.5*(XZHAT(2:IKU)+XZHAT(1:IKU-1)) - ZZHATM(IKU) = 2.*XZHAT(IKU)-ZZHATM(IKU-1) -! - DO JK = 1,IKU - IF (ZZHATM(JK) <= ZHEIGHTFR(1)) THEN + IF (XZHATM(JK) <= ZHEIGHTFR(1)) THEN ! ! extrapolation below the first level - ZDZSDH = (ZZHATM(JK)-ZHEIGHTFR(1)) / (ZHEIGHTFR(2)-ZHEIGHTFR(1)) + ZDZSDH = (XZHATM(JK)-ZHEIGHTFR(1)) / (ZHEIGHTFR(2)-ZHEIGHTFR(1)) ! ZRVREL1D(IIB:IIE,JK,JKT) = ZRVREL(IIB:IIE,1,JKT) + & (ZRVREL(IIB:IIE,2,JKT) - ZRVREL(IIB:IIE,1,JKT)) * ZDZSDH @@ -276,10 +268,10 @@ DO JKT = 1,NRELFRC ZTHREL1D(IIB:IIE,JK,JKT) = ZtHREL(IIB:IIE,1,JKT) + & (ZTHREL(IIB:IIE,2,JKT) - ZTHREL(IIB:IIE,1,JKT)) * ZDZSDH - ELSE IF (ZZHATM(JK) > ZHEIGHTFR(NPRESSLEV_REL) ) THEN + ELSE IF (XZHATM(JK) > ZHEIGHTFR(NPRESSLEV_REL) ) THEN ! ! extrapolation above the last level - ZDZSDH = (ZZHATM(JK) - ZHEIGHTFR(NPRESSLEV_REL)) / & + ZDZSDH = (XZHATM(JK) - ZHEIGHTFR(NPRESSLEV_REL)) / & (ZHEIGHTFR(NPRESSLEV_REL) - ZHEIGHTFR(NPRESSLEV_REL-1)) ! ZRVREL1D(IIB:IIE,JK,JKT) = ZRVREL(IIB:IIE,NPRESSLEV_REL,JKT) + & @@ -294,9 +286,9 @@ DO JKT = 1,NRELFRC ! interpolation between first and last levels ! DO JKLEV = 1,NPRESSLEV_REL-1 - IF ( (ZZHATM(JK) > ZHEIGHTFR(JKLEV)).AND. & - (ZZHATM(JK) <= ZHEIGHTFR(JKLEV+1)) ) THEN - ZDZ1SDH = (ZZHATM(JK) - ZHEIGHTFR(JKLEV)) / & + IF ( (XZHATM(JK) > ZHEIGHTFR(JKLEV)).AND. & + (XZHATM(JK) <= ZHEIGHTFR(JKLEV+1)) ) THEN + ZDZ1SDH = (XZHATM(JK) - ZHEIGHTFR(JKLEV)) / & (ZHEIGHTFR(JKLEV+1)-ZHEIGHTFR(JKLEV)) ZDZ2SDH = 1.- ZDZ1SDH ZRVREL1D(IIB:IIE,JK,JKT) = ZRVREL(IIB:IIE,JKLEV,JKT)*ZDZ2SDH & @@ -376,8 +368,6 @@ DEALLOCATE(ZTHVUFR) DEALLOCATE(ZRVFR) DEALLOCATE(ZHEIGHTFR) -! pour lecture dans PREIDEA -DEALLOCATE(ZZHATM) DEALLOCATE(ZPRESS_REL) DEALLOCATE(ZRVREL1D) diff --git a/src/MNH/setlb_lg.f90 b/src/MNH/setlb_lg.f90 index 89bb3d3ecd0a556b7194a93f99b29c8540740641..bbdf91a69606292a347431757efb7364bc078968 100644 --- a/src/MNH/setlb_lg.f90 +++ b/src/MNH/setlb_lg.f90 @@ -1,6 +1,6 @@ -!MNH_LIC Copyright 1994-2018 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2001-2022 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 version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. !----------------------------------------------------------------- ! ################### @@ -50,13 +50,13 @@ ! ------------ ! ! -USE MODD_TIME -USE MODD_TIME_n -USE MODD_LBC_n -USE MODD_LSFIELD_n USE MODD_GRID_n +USE MODD_LBC_n USE MODD_LG +USE MODD_LSFIELD_n USE MODD_NSV, ONLY : NSV_LGBEG,NSV_LGEND +USE MODD_TIME +USE MODD_TIME_n ! USE MODE_DATETIME USE MODE_ll @@ -80,19 +80,12 @@ IKU=SIZE(XZZ,3) CALL DATETIME_DISTANCE(TDTEXP,TDTCUR,ZTEMP_DIST) ! IF ( CLBCX(1) /= "CYCL" .AND. LWEST_ll()) THEN - DO JK=1,IKU - DO JJ=1,IJU - XLBXSVM(1,JJ,JK,NSV_LGBEG)=0.5*(XXHAT(1)+XXHAT(2))-ZTEMP_DIST*XLGSPEED - END DO - END DO -! - DO JK=1,IKU - DO JJ=1,IJU-1 - XLBXSVM(1,JJ,JK,NSV_LGBEG+1)=0.5*(XYHAT(JJ)+XYHAT(JJ+1)) - END DO - XLBXSVM(1,IJU,JK,NSV_LGBEG+1)=1.5*XYHAT(IJU)-0.5*XYHAT(IJU-1) + XLBXSVM(1,1:IJU,1:IKU,NSV_LGBEG) = XXHATM(1) - ZTEMP_DIST * XLGSPEED + + DO JK = 1, IKU + XLBXSVM(1,1:IJU,JK,NSV_LGBEG+1) = XYHATM(1:IJU) END DO - ! + DO JJ=1,IJU DO JK=1,IKU-1 XLBXSVM(1,JJ,JK,NSV_LGEND)=0.5*(XZZ(1,JJ,JK)+XZZ(1,JJ,JK+1)) @@ -100,69 +93,44 @@ IF ( CLBCX(1) /= "CYCL" .AND. LWEST_ll()) THEN XLBXSVM(1,JJ,IKU,NSV_LGEND)=1.5*XZZ(1,JJ,IKU) -0.5*XZZ(1,JJ,IKU-1) END DO END IF - ! + IF ( CLBCX(1) /= "CYCL" .AND. LEAST_ll()) THEN - DO JK=1,IKU - DO JJ=1,IJU - XLBXSVM(SIZE(XLBXSVM,1),JJ,JK,NSV_LGBEG)=0.5*(XXHAT(IIU-1)+XXHAT(IIU))+ZTEMP_DIST*XLGSPEED - END DO - END DO -! - DO JK=1,IKU - DO JJ=1,IJU-1 - XLBXSVM(SIZE(XLBXSVM,1),JJ,JK,NSV_LGBEG+1)=0.5*(XYHAT(JJ)+XYHAT(JJ+1)) - END DO - XLBXSVM(SIZE(XLBXSVM,1),IJU,JK,NSV_LGBEG+1)=1.5*XYHAT(IJU)-0.5*XYHAT(IJU-1) + XLBXSVM(SIZE(XLBXSVM,1),1:IJU,1:IKU,NSV_LGBEG) = XXHATM(IIU-1) + ZTEMP_DIST * XLGSPEED + + DO JK = 1, IKU + XLBXSVM(SIZE(XLBXSVM,1),1:IJU,JK,NSV_LGBEG+1) = XYHATM(1:IJU) END DO -! + DO JJ=1,IJU DO JK=1,IKU-1 XLBXSVM(SIZE(XLBXSVM,1),JJ,JK,NSV_LGEND)=0.5*(XZZ(IIU,JJ,JK)+XZZ(IIU,JJ,JK+1)) END DO XLBXSVM(SIZE(XLBXSVM,1),JJ,IKU,NSV_LGEND)=1.5*XZZ(IIU,JJ,IKU)-0.5*XZZ(IIU,JJ,IKU-1) END DO - ! -ENDIF - ! +END IF + IF (SIZE(XLBYSVM,1) .NE. 0 .AND. CLBCY(1) /= "CYCL" .AND. LSOUTH_ll()) THEN -! - DO JK=1,IKU - DO JI=1,IIU-1 - XLBYSVM(JI,1,JK,NSV_LGBEG)=0.5*(XXHAT(JI)+XXHAT(JI+1)) - END DO - XLBYSVM(IIU,1,JK,NSV_LGBEG)=1.5*XXHAT(IIU)-0.5*XXHAT(IIU-1) - END DO - ! - DO JK=1,IKU - DO JI=1,IIU - XLBYSVM(JI,1,JK,NSV_LGBEG+1)=0.5*(XYHAT(1)+XYHAT(2))-ZTEMP_DIST*XLGSPEED - END DO + DO JK = 1, IKU + XLBYSVM(1:IIU,1,JK,NSV_LGBEG) = XXHATM(1:IIU) END DO - ! + + XLBYSVM(1:IIU,1,1:IKU,NSV_LGBEG+1) = XYHATM(1) - ZTEMP_DIST * XLGSPEED + DO JI=1,IIU DO JK=1,IKU-1 XLBYSVM(JI,1,JK,NSV_LGEND)=0.5*(XZZ(JI,1,JK)+XZZ(JI,1,JK+1)) END DO XLBYSVM(JI,1,IKU,NSV_LGEND)=1.5*XZZ(JI,1,IKU) -0.5*XZZ(JI,1,IKU-1) END DO +END IF -ENDIF - ! IF (SIZE(XLBYSVM,1) .NE. 0 .AND. CLBCY(1) /= "CYCL" .AND. LNORTH_ll()) THEN -! - DO JK=1,IKU - DO JI=1,IIU-1 - XLBYSVM(JI,SIZE(XLBYSVM,2),JK,NSV_LGBEG)=0.5*(XXHAT(JI)+XXHAT(JI+1)) - END DO - XLBYSVM(IIU,SIZE(XLBYSVM,2),JK,NSV_LGBEG)=1.5*XXHAT(IIU)-0.5*XXHAT(IIU-1) - END DO -! - DO JK=1,IKU - DO JI=1,IIU - XLBYSVM(JI,SIZE(XLBYSVM,2),JK,NSV_LGBEG+1)=0.5*(XYHAT(IJU-1)+XYHAT(IJU))+ZTEMP_DIST*XLGSPEED - END DO + DO JK = 1, IKU + XLBYSVM(1:IIU,SIZE(XLBYSVM,2),JK,NSV_LGBEG) = XXHATM(1:IIU) END DO -! + + XLBYSVM(1:IIU,SIZE(XLBYSVM,2),1:IKU,NSV_LGBEG+1) = XYHATM(IJU-1) + ZTEMP_DIST * XLGSPEED + DO JI=1,IIU DO JK=1,IKU-1 XLBYSVM(JI,SIZE(XLBYSVM,2),JK,NSV_LGEND)=0.5*(XZZ(JI,IJU,JK)+XZZ(JI,IJU,JK+1)) diff --git a/src/MNH/shallow_mf_pack.f90 b/src/MNH/shallow_mf_pack.f90 index ee2f7e2fb5d794175d12979085583f31a02a53fd..c7ad64d47c3b250dedc7d1006c3ea1200efffc58 100644 --- a/src/MNH/shallow_mf_pack.f90 +++ b/src/MNH/shallow_mf_pack.f90 @@ -128,7 +128,7 @@ USE MODE_FILL_DIMPHYEX, ONLY: FILL_DIMPHYEX USE MODD_BUDGET, ONLY: TBUDGETS,TBUCONF,lbudget_th,nbudget_th USE MODD_CONF USE MODD_IO, ONLY: TFILEDATA -USE modd_field, ONLY: tfielddata, TYPEREAL +use modd_field, only: tfieldmetadata, TYPEREAL USE MODD_NSV, ONLY: XSVMIN, NSV_LGBEG, NSV_LGEND USE MODD_PARAMETERS USE MODD_PARAM_ICE, ONLY: CFRAC_ICE_SHALLOW_MF @@ -181,6 +181,7 @@ REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSIGMF,PRC_MF,PRI_MF,PCF_MF ! cloud REAL, DIMENSION(:,:,:), INTENT(OUT) :: PFLXZTHVMF ! Thermal production for TKE scheme ! REAL, INTENT(IN) :: PDX,PDY ! Size of mesh in X/Y directions +! ! 0.2 Declaration of local variables ! REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) :: ZDUDT_TURB ! tendency of U by turbulence only @@ -219,12 +220,11 @@ INTEGER,DIMENSION(SIZE(PTHM,1)*SIZE(PTHM,2)) :: IKLCL,IKETL,IKCTL ! level of INTEGER :: IIU, IJU, IKU, IKB, IKE, IRR, ISV INTEGER :: JK,JRR,JSV ! Loop counters - LOGICAL :: LSTATNW ! switch for HARMONIE-AROME turb physics option ! TODO: linked with modd_turbn + init at default_desfmn -TYPE(TFIELDDATA) :: TZFIELD -TYPE(DIMPHYEX_t) :: YLDIMPHYEXPACK +TYPE(TFIELDMETADATA) :: TZFIELD +TYPE(DIMPHYEX_t) :: YLDIMPHYEXPACK !------------------------------------------------------------------------ ! !!! 1. Initialisation @@ -301,69 +301,74 @@ END DO ! IF ( OMF_FLX .AND. tpfile%lopened ) THEN ! stores the conservative potential temperature vertical flux - TZFIELD%CMNHNAME = 'MF_THW_FLX' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'MF_THW_FLX' - TZFIELD%CUNITS = 'K m s-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_MF_THW_FLX' - TZFIELD%NGRID = 4 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'MF_THW_FLX', & + CSTDNAME = '', & + CLONGNAME = 'MF_THW_FLX', & + CUNITS = 'K m s-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_MF_THW_FLX', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZFLXZTHMF) ! ! stores the conservative mixing ratio vertical flux - TZFIELD%CMNHNAME = 'MF_RCONSW_FLX' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'MF_RCONSW_FLX' - TZFIELD%CUNITS = 'K m s-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_MF_RCONSW_FLX' - TZFIELD%NGRID = 4 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'MF_RCONSW_FLX', & + CSTDNAME = '', & + CLONGNAME = 'MF_RCONSW_FLX', & + CUNITS = 'K m s-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_MF_RCONSW_FLX', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZFLXZRMF) ! ! stores the theta_v vertical flux - TZFIELD%CMNHNAME = 'MF_THVW_FLX' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'MF_THVW_FLX' - TZFIELD%CUNITS = 'K m s-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_MF_THVW_FLX' - TZFIELD%NGRID = 4 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'MF_THVW_FLX', & + CSTDNAME = '', & + CLONGNAME = 'MF_THVW_FLX', & + CUNITS = 'K m s-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_MF_THVW_FLX', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,PFLXZTHVMF) ! IF (PARAM_MFSHALLN%LMIXUV) THEN ! stores the U momentum vertical flux - TZFIELD%CMNHNAME = 'MF_UW_FLX' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'MF_UW_FLX' - TZFIELD%CUNITS = 'm2 s-2' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_MF_UW_FLX' - TZFIELD%NGRID = 4 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'MF_UW_FLX', & + CSTDNAME = '', & + CLONGNAME = 'MF_UW_FLX', & + CUNITS = 'm2 s-2', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_MF_UW_FLX', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZFLXZUMF) ! ! stores the V momentum vertical flux - TZFIELD%CMNHNAME = 'MF_VW_FLX' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'MF_VW_FLX' - TZFIELD%CUNITS = 'm2 s-2' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_MF_VW_FLX' - TZFIELD%NGRID = 4 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'MF_VW_FLX', & + CSTDNAME = '', & + CLONGNAME = 'MF_VW_FLX', & + CUNITS = 'm2 s-2', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_MF_VW_FLX', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZFLXZVMF) ! END IF diff --git a/src/MNH/spawn_field2.f90 b/src/MNH/spawn_field2.f90 index 881fd4e6b57fdd0eddef14baf93d6fb0bcc075be..50047fb02056b2cf69a0a7b247ff23c5353c1cb5 100644 --- a/src/MNH/spawn_field2.f90 +++ b/src/MNH/spawn_field2.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1995-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1995-2022 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. @@ -152,43 +152,31 @@ END MODULE MODI_SPAWN_FIELD2 !! 29/04/2016 (J.Escobar) bug in use of ZSVT_C in SET_LSFIELD_1WAY_ll !! Modification 01/2016 (JP Pinty) Add LIMA !! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O -!! Modification 05/03/2018 (J.Escobar) bypass gridnesting special case KD(X/Y)RATIO == 1 not parallelized -!! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes +! J. Escobar 05/03/2018: bypass gridnesting special case KD(X/Y)RATIO == 1 not parallelized +! S. Bielli S. 02/2019: Sea salt: significant sea wave height influences salt emission; 5 salt modes ! P. Wautelet 14/03/2019: correct ZWS when variable not present in file -!! B. Vie 06/2020 Add prognostic supersaturation for LIMA +! B. Vie 06/2020: Add prognostic supersaturation for LIMA ! P. Wautelet 11/03/2021: bugfix: correct name for NSV_LIMA_IMM_NUCL +! P. Wautelet 04/02/2022: use TSVLIST to manage metadata of scalar variables !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ ! -USE MODD_2D_FRC -USE MODD_ADVFRC_n -USE MODD_BIKHARDT_n -USE MODD_CH_AEROSOL, ONLY: CAERONAMES -USE MODD_CH_M9_n, ONLY: CNAMES, CICNAMES -USE MODD_CONF -USE MODD_CST +USE MODD_2D_FRC, ONLY: L2D_ADV_FRC, L2D_REL_FRC +USE MODD_ADVFRC_n, ONLY: ADVFRC_MODEL +USE MODD_BIKHARDT_N, ONLY: XBFX1, XBFX2, XBFX3, XBFX4, XBFY1, XBFY2, XBFY3, XBFY4, & + XBMX1, XBMX2, XBMX3, XBMX4, XBMY1, XBMY2, XBMY3, XBMY4 +USE MODD_CST, ONLY: XCPD, XP00, XRD, XRV USE MODD_CONF_n, ONLY: CONF_MODEL -USE MODD_DUST, ONLY: CDUSTNAMES -USE MODD_ELEC_DESCR, ONLY: CELECNAMES -use modd_field, only: tfielddata, TYPEREAL +use modd_field, only: tfieldmetadata, TYPEREAL USE MODD_FIELD_n, ONLY: FIELD_MODEL, XZWS_DEFAULT USE MODD_IO, ONLY: TFILEDATA -USE MODD_LATZ_EDFLX +USE MODD_LATZ_EDFLX, ONLY: LTH_FLX, LUV_FLX USE MODD_LBC_n, ONLY: LBC_MODEL -USE MODD_LG, ONLY: CLGNAMES -USE MODD_LUNIT_n, ONLY: LUNIT_MODEL,TLUOUT -USE MODD_NSV -USE MODD_REF_n, ONLY: REF_MODEL -USE MODD_PARAMETERS -USE MODD_PARAM_LIMA, ONLY: NMOD_CCN, NMOD_IFN, NMOD_IMM, NINDICE_CCN_IMM,& - LSCAV, LAERO_MASS, LHHONI -USE MODD_PARAM_LIMA_COLD, ONLY: CLIMA_COLD_NAMES -USE MODD_PARAM_LIMA_WARM, ONLY: CLIMA_WARM_NAMES, CAERO_MASS -USE MODD_RAIN_C2R2_DESCR, ONLY: C2R2NAMES -USE MODD_RELFRC_n -USE MODD_SALT, ONLY: CSALTNAMES +USE MODD_LUNIT_n, ONLY: TLUOUT +USE MODD_NSV, ONLY: NSV, NSV_CSBEG, NSV_CSEND, NSV_PPBEG, NSV_PPEND, NSV_USER, TSVLIST +USE MODD_RELFRC_n, ONLY: RELFRC_MODEL USE MODD_SPAWN ! use mode_bikhardt @@ -198,7 +186,6 @@ USE MODE_MSG USE MODE_MODELN_HANDLER USE MODE_MPPDB USE MODE_THERMO -USE MODE_TOOLS, ONLY: UPCASE ! IMPLICIT NONE ! @@ -269,6 +256,7 @@ INTEGER :: IMI, JI,KI INTEGER :: IDIMX_C, IDIMY_C INTEGER :: IINFO_ll !$ +LOGICAL :: GOLDFILEFORMAT ! Arrays for reading fields of input SON 1 file REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZWORK3D REAL, DIMENSION(:,:), ALLOCATABLE :: ZWORK2D @@ -277,9 +265,9 @@ REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZPABST1,ZHUT1 REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZRT1 LOGICAL :: GUSERV ! +CHARACTER(LEN=3) :: YNUM3 CHARACTER(LEN=15) :: YVAL -CHARACTER(LEN=2) :: INDICE -TYPE(TFIELDDATA) :: TZFIELD +TYPE(TFIELDMETADATA) :: TZFIELD ! !------------------------------------------------------------------------------- ! @@ -289,6 +277,12 @@ TYPE(TFIELDDATA) :: TZFIELD IMI = GET_CURRENT_MODEL_INDEX() CALL GOTO_MODEL(2) CALL GO_TOMODEL_ll(2, IINFO_ll) + +IF (PRESENT(TPSONFILE)) THEN + !If TPSONFILE file was written with a MesoNH version < 5.6, some variables had different names or were not available + GOLDFILEFORMAT = ( TPSONFILE%NMNHVERSION(1) < 5 & + .OR. ( TPSONFILE%NMNHVERSION(1) == 5 .AND. TPSONFILE%NMNHVERSION(2) <6 ) ) +END IF ! !* 1.0 recovers logical unit number of output listing ! @@ -839,396 +833,53 @@ IF (PRESENT(TPSONFILE)) THEN ! ! Scalar variables ! - IF (NSV /= 0) THEN - ! User scalar variables - IF (NSV_USER>0) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'kg kg-1' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = 1, NSV_USER ! Users Scalar Variables - WRITE(TZFIELD%CMNHNAME,'(A3,I3.3)')'SVT',JSV - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CCOMMENT = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME) - CALL IO_Field_read(TPSONFILE,TZFIELD,ZWORK3D,IRESP) - IF(IRESP==0) PSVT(KIB2:KIE2,KJB2:KJE2,:,JSV)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:) - END DO - END IF - ! - ! microphysical C2R2 scheme scalar variables - IF (NSV_C2R2END>=NSV_C2R2BEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'm-3' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_C2R2BEG,NSV_C2R2END - TZFIELD%CMNHNAME = TRIM(C2R2NAMES(JSV-NSV_C2R2BEG+1))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV - CALL IO_Field_read(TPSONFILE,TZFIELD,ZWORK3D,IRESP) - IF(IRESP==0) PSVT(KIB2:KIE2,KJB2:KJE2,:,JSV)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:) - END DO - END IF - ! - ! LIMA variables - ! - DO JSV = NSV_LIMA_BEG,NSV_LIMA_END - TZFIELD%CSTDNAME = '' - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV - TZFIELD%CDIR = 'XY' - TZFIELD%CUNITS = 'kg-1' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! Nc - IF (JSV .EQ. NSV_LIMA_NC) THEN - TZFIELD%CMNHNAME = TRIM(CLIMA_WARM_NAMES(1))//'T' - END IF - ! Nr - IF (JSV .EQ. NSV_LIMA_NR) THEN - TZFIELD%CMNHNAME = TRIM(CLIMA_WARM_NAMES(2))//'T' - END IF - ! N CCN free - IF (JSV .GE. NSV_LIMA_CCN_FREE .AND. JSV .LT. NSV_LIMA_CCN_ACTI) THEN - WRITE(INDICE,'(I2.2)')(JSV - NSV_LIMA_CCN_FREE + 1) - TZFIELD%CMNHNAME = TRIM(CLIMA_WARM_NAMES(3))//INDICE//'T' - END IF - ! N CCN acti - IF (JSV .GE. NSV_LIMA_CCN_ACTI .AND. JSV .LT. NSV_LIMA_CCN_ACTI + NMOD_CCN) THEN - WRITE(INDICE,'(I2.2)')(JSV - NSV_LIMA_CCN_ACTI + 1) - TZFIELD%CMNHNAME = TRIM(CLIMA_WARM_NAMES(4))//INDICE//'T' - END IF - ! Scavenging - IF (JSV .EQ. NSV_LIMA_SCAVMASS) THEN - TZFIELD%CMNHNAME = TRIM(CAERO_MASS(1))//'T' - TZFIELD%CUNITS = 'kg kg-1' - END IF - ! Ni - IF (JSV .EQ. NSV_LIMA_NI) THEN - TZFIELD%CMNHNAME = TRIM(CLIMA_COLD_NAMES(1))//'T' - END IF - ! Ns - IF (JSV .EQ. NSV_LIMA_NS) THEN - TZFIELD%CMNHNAME = TRIM(CLIMA_COLD_NAMES(2))//'T' - END IF - ! Ng - IF (JSV .EQ. NSV_LIMA_NG) THEN - TZFIELD%CMNHNAME = TRIM(CLIMA_COLD_NAMES(3))//'T' - END IF - ! Nh - IF (JSV .EQ. NSV_LIMA_NH) THEN - TZFIELD%CMNHNAME = TRIM(CLIMA_COLD_NAMES(4))//'T' - END IF - ! N IFN free - IF (JSV .GE. NSV_LIMA_IFN_FREE .AND. JSV .LT. NSV_LIMA_IFN_NUCL) THEN - WRITE(INDICE,'(I2.2)')(JSV - NSV_LIMA_IFN_FREE + 1) - TZFIELD%CMNHNAME = TRIM(CLIMA_COLD_NAMES(5))//INDICE//'T' - END IF - ! N IFN nucl - IF (JSV .GE. NSV_LIMA_IFN_NUCL .AND. JSV .LT. NSV_LIMA_IFN_NUCL + NMOD_IFN) THEN - WRITE(INDICE,'(I2.2)')(JSV - NSV_LIMA_IFN_NUCL + 1) - TZFIELD%CMNHNAME = TRIM(CLIMA_COLD_NAMES(6))//INDICE//'T' - END IF - ! N IMM nucl - IF (JSV .GE. NSV_LIMA_IMM_NUCL .AND. JSV .LT. NSV_LIMA_IMM_NUCL + NMOD_IMM) THEN - WRITE(INDICE,'(I2.2)')(NINDICE_CCN_IMM(JSV - NSV_LIMA_IMM_NUCL + 1)) - TZFIELD%CMNHNAME = TRIM(CLIMA_COLD_NAMES(7))//INDICE//'T' - END IF - ! Hom. freez. of CCN - IF (JSV .EQ. NSV_LIMA_HOM_HAZE) THEN - TZFIELD%CMNHNAME = TRIM(CLIMA_COLD_NAMES(8))//'T' - END IF - ! Supersaturation - IF (JSV .EQ. NSV_LIMA_SPRO) THEN - TZFIELD%CMNHNAME = TRIM(CLIMA_WARM_NAMES(5))//'T' - END IF - ! time t - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - CALL IO_Field_read(TPSONFILE,TZFIELD,ZWORK3D,IRESP) - IF(IRESP==0) PSVT(KIB2:KIE2,KJB2:KJE2,:,JSV)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:) - END DO - ! - ! ELEC Scalar Variables - ! - IF (NSV_ELECEND>=NSV_ELECBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_ELECBEG,NSV_ELECEND - TZFIELD%CMNHNAME = TRIM(CELECNAMES(JSV-NSV_ELECBEG+1))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - IF (JSV .GT. NSV_ELECBEG .AND. JSV .LT. NSV_ELECEND) THEN - TZFIELD%CUNITS = 'C m-3' - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV - ELSE - TZFIELD%CUNITS = 'm-3' - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3,A)')'X_Y_Z_','SVT',JSV,' (nb ions/m3)' - END IF - CALL IO_Field_read(TPSONFILE,TZFIELD,ZWORK3D,IRESP) - IF(IRESP==0) PSVT(KIB2:KIE2,KJB2:KJE2,:,JSV)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:) - END DO - END IF - ! - ! Chemical Scalar Variables - ! - IF (NSV_CHEMEND>=NSV_CHEMBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppp' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_CHEMBEG,NSV_CHEMEND - TZFIELD%CMNHNAME = TRIM(CNAMES(JSV-NSV_CHEMBEG+1))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV - CALL IO_Field_read(TPSONFILE,TZFIELD,ZWORK3D,IRESP) - IF(IRESP==0) PSVT(KIB2:KIE2,KJB2:KJE2,:,JSV)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:) - END DO - END IF - ! - ! Ice phase chemical Scalar Variables - ! - IF (NSV_CHICEND>=NSV_CHICBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppp' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_CHICBEG,NSV_CHICEND - CICNAMES(JSV-NSV_CHICBEG+1) = UPCASE(CICNAMES(JSV-NSV_CHICBEG+1)) - TZFIELD%CMNHNAME = TRIM(CICNAMES(JSV-NSV_CHICBEG+1))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV - CALL IO_Field_read(TPSONFILE,TZFIELD,ZWORK3D,IRESP) - IF(IRESP==0) PSVT(KIB2:KIE2,KJB2:KJE2,:,JSV)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:) - END DO - END IF - ! - ! Orilam Scalar Variables - ! - IF (NSV_AEREND>=NSV_AERBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppp' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_AERBEG,NSV_AEREND - TZFIELD%CMNHNAME = TRIM(UPCASE(CAERONAMES(JSV-NSV_AERBEG+1)))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV - CALL IO_Field_read(TPSONFILE,TZFIELD,ZWORK3D,IRESP) - IF(IRESP==0) PSVT(KIB2:KIE2,KJB2:KJE2,:,JSV)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:) - END DO - END IF - ! - ! Dust Scalar Variables - ! - IF (NSV_DSTEND>=NSV_DSTBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppp' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_DSTBEG,NSV_DSTEND - TZFIELD%CMNHNAME = TRIM(CDUSTNAMES(JSV-NSV_DSTBEG+1))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV - CALL IO_Field_read(TPSONFILE,TZFIELD,ZWORK3D,IRESP) - IF(IRESP==0) PSVT(KIB2:KIE2,KJB2:KJE2,:,JSV)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:) - END DO - END IF - ! - ! Sea Salt Scalar Variables - ! - IF (NSV_SLTEND>=NSV_SLTBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppp' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_SLTBEG,NSV_SLTEND - TZFIELD%CMNHNAME = TRIM(CSALTNAMES(JSV-NSV_SLTBEG+1))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV - CALL IO_Field_read(TPSONFILE,TZFIELD,ZWORK3D,IRESP) - IF(IRESP==0) PSVT(KIB2:KIE2,KJB2:KJE2,:,JSV)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:) - END DO - END IF - ! - ! LG Scalar Variables - ! - IF (NSV_LGEND>=NSV_LGBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'm' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_LGBEG,NSV_LGEND - TZFIELD%CMNHNAME = TRIM(CLGNAMES(JSV-NSV_LGBEG+1))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV - CALL IO_Field_read(TPSONFILE,TZFIELD,ZWORK3D,IRESP) - IF(IRESP==0) PSVT(KIB2:KIE2,KJB2:KJE2,:,JSV)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:) - END DO - END IF - ! - ! LNOx Scalar Variables - ! -!PW:TODO/bug1?: LINOX or LINOXT? -!PW:TODO/bug2?: Same name of variable in a loop! - IF (NSV_LNOXEND>=NSV_LNOXBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppp' !PW: TODO: not sure (depends if LINOX or LINOXT) - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_LNOXBEG,NSV_LNOXEND - TZFIELD%CMNHNAME = 'LINOX' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV - CALL IO_Field_read(TPSONFILE,TZFIELD,ZWORK3D,IRESP) - IF(IRESP==0) PSVT(KIB2:KIE2,KJB2:KJE2,:,JSV)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:) - END DO - END IF - ! - ! Passive scalar variables - ! - IF (NSV_PPEND>=NSV_PPBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'kg kg-1' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_PPBEG,NSV_PPEND - WRITE(TZFIELD%CMNHNAME,'(A3,I3.3)')'SVT',JSV - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CCOMMENT = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME) - CALL IO_Field_read(TPSONFILE,TZFIELD,ZWORK3D,IRESP) - IF(IRESP==0) PSVT(KIB2:KIE2,KJB2:KJE2,:,JSV)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:) - END DO - END IF + DO JSV = 1, NSV + TZFIELD = TSVLIST(JSV) + IF ( GOLDFILEFORMAT ) THEN + IF ( ( JSV >= 1 .AND. JSV <= NSV_USER ) .OR. & + ( JSV >= NSV_PPBEG .AND. JSV <= NSV_PPEND ) .OR. & #ifdef MNH_FOREFIRE - ! - ! ForeFire variables - ! - IF (NSV_FFEND>=NSV_FFBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'kg kg-1' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_FFBEG,NSV_FFEND - WRITE(TZFIELD%CMNHNAME,'(A3,I3.3)')'SVT',JSV - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CCOMMENT = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME) - CALL IO_Field_read(TPSONFILE,TZFIELD,ZWORK3D,IRESP) - IF(IRESP==0) PSVT(KIB2:KIE2,KJB2:KJE2,:,JSV)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:) - END DO - END IF + ( JSV >= NSV_FFBEG .AND. JSV <= NSV_FFEND ) .OR. & #endif - ! - ! Passive scalar variables - ! - IF (NSV_CSEND>=NSV_CSBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'kg kg-1' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_CSBEG,NSV_CSEND + ( JSV >= NSV_CSBEG .AND. JSV <= NSV_CSEND ) ) THEN + !Some variables were written with an other name in MesoNH < 5.6 WRITE(TZFIELD%CMNHNAME,'(A3,I3.3)')'SVT',JSV TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) + TZFIELD%CSTDNAME = '' TZFIELD%CCOMMENT = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME) - CALL IO_Field_read(TPSONFILE,TZFIELD,ZWORK3D,IRESP) - IF(IRESP==0) PSVT(KIB2:KIE2,KJB2:KJE2,:,JSV)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:) - END DO - END IF - ! - ! Passive scalar variables - ! - IF (NSV_PP>=1) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'm-3' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = 1,NSV_PP - WRITE(TZFIELD%CMNHNAME,'(A3,I3.3)')'ATC',JSV+NSV_PPBEG-1 - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','ATC',JSV+NSV_PPBEG-1 - CALL IO_Field_read(TPSONFILE,TZFIELD,ZWORK3D,IRESP) - IF(IRESP==0) PATC(KIB2:KIE2,KJB2:KJE2,:,JSV)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:) - END DO - END IF -#ifdef MNH_FOREFIRE - ! - ! ForeFire variables - ! - IF (NSV_FF>=1) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'm-3' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = 1,NSV_FF - WRITE(TZFIELD%CMNHNAME,'(A3,I3.3)')'ATC',JSV+NSV_FFBEG-1 - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','ATC',JSV+NSV_FFBEG-1 - CALL IO_Field_read(TPSONFILE,TZFIELD,ZWORK3D,IRESP) - IF(IRESP==0) PATC(KIB2:KIE2,KJB2:KJE2,:,JSV)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:) - END DO + ELSE + !Scalar variables were written with a T suffix in older versions + TZFIELD%CMNHNAME = TRIM( TZFIELD%CMNHNAME ) // 'T' + TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T' + END IF END IF -#endif - END IF + + CALL IO_Field_read( TPSONFILE, TZFIELD, ZWORK3D, IRESP ) + + IF( IRESP == 0 ) PSVT(KIB2:KIE2, KJB2:KJE2, :, JSV) = ZWORK3D(KIB1:KIE1, KJB1:KJE1, :) + END DO + ! + ! Passive scalar variables + ! + DO JSV = NSV_PPBEG, NSV_PPEND + WRITE( YNUM3, '( I3.3 )' ) JSV + + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'ATC' // YNUM3, & + CSTDNAME = '', & + CLONGNAME = 'ATC' // YNUM3, & + CCOMMENT = 'X_Y_Z_ATC' // YNUM3, & + CUNITS = 'm-3', & + CDIR = 'XY', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) + + CALL IO_Field_read( TPSONFILE, TZFIELD, ZWORK3D, IRESP ) + + IF( IRESP == 0 ) PATC(KIB2:KIE2, KJB2:KJE2, :, JSV-NSV_PPBEG+1) = ZWORK3D(KIB1:KIE1, KJB1:KJE1, :) + END DO ! ! Secondary pronostic variables ! diff --git a/src/MNH/spawn_grid2.f90 b/src/MNH/spawn_grid2.f90 index 4ba0d58a36220aa6703065ab8e356a3a0494bfaa..8521be04db1d670e423d1277eb0daefcb5d1efa3 100644 --- a/src/MNH/spawn_grid2.f90 +++ b/src/MNH/spawn_grid2.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1995-2019 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1995-2022 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. @@ -9,11 +9,13 @@ MODULE MODI_SPAWN_GRID2 ! INTERFACE ! - SUBROUTINE SPAWN_GRID2 (KXOR,KYOR,KXEND,KYEND,KDXRATIO,KDYRATIO, & - PLONOR,PLATOR,PXHAT,PYHAT,PZHAT,PZTOP, & - OSLEVE,PLEN1,PLEN2, & - PZS,PZSMT,PZS_LS,PZSMT_LS, & - TPDTMOD,TPDTCUR ) + SUBROUTINE SPAWN_GRID2( KXOR, KYOR, KXEND, KYEND, KDXRATIO, KDYRATIO, & + PLONOR, PLATOR, PXHAT, PYHAT, PZHAT, PXHATM, PYHATM, PZHATM, & + PXHAT_ll, PYHAT_ll, PXHATM_ll, PYHATM_ll, & + PHAT_BOUND, PHATM_BOUND, & + PZTOP, OSLEVE, PLEN1, PLEN2, & + PZS, PZSMT, PZS_LS, PZSMT_LS, & + TPDTMOD, TPDTCUR ) ! USE MODD_TIME ! @@ -23,22 +25,29 @@ INTEGER, INTENT(IN) :: KYOR,KYEND ! of the model 2 domain, relative to model INTEGER, INTENT(IN) :: KDXRATIO ! x and y-direction Resolution ratio INTEGER, INTENT(IN) :: KDYRATIO ! between model 2 and model 1 ! -REAL, INTENT(INOUT) :: PLATOR ! Latitude of the origine point -REAL, INTENT(INOUT) :: PLONOR ! Longitude of the origine point -REAL, DIMENSION(:), INTENT(INOUT) :: PXHAT,PYHAT,PZHAT ! positions x,y,z in the +REAL, INTENT(OUT) :: PLATOR ! Latitude of the origine point +REAL, INTENT(OUT) :: PLONOR ! Longitude of the origine point +REAL, DIMENSION(:), INTENT(OUT) :: PXHAT,PYHAT,PZHAT ! positions x,y,z in the ! conformal plane or on the cartesian plane +REAL, DIMENSION(:), INTENT(OUT) :: PXHATM, PYHATM, PZHATM ! positions x,y in the + ! conformal plane or on the cartesian plane at mass points +REAL, DIMENSION(:), POINTER, INTENT(INOUT) :: PXHAT_ll ! Position x, y or z in the conformal or cartesian plane (all domain) +REAL, DIMENSION(:), POINTER, INTENT(INOUT) :: PYHAT_ll ! Position x, y or z in the conformal or cartesian plane (all domain) +REAL, DIMENSION(:), POINTER, INTENT(INOUT) :: PXHATM_ll ! id at mass points +REAL, DIMENSION(:), POINTER, INTENT(INOUT) :: PYHATM_ll ! id at mass points +REAL, DIMENSION(:), POINTER, INTENT(INOUT) :: PHAT_BOUND ! Boundaries of global domain in the conformal or cartesian plane +REAL, DIMENSION(:), POINTER, INTENT(INOUT) :: PHATM_BOUND ! idem at mass points REAL, INTENT(OUT) :: PZTOP ! model top (m) LOGICAL, INTENT(OUT) :: OSLEVE ! flag for SLEVE coordinate REAL, INTENT(OUT) :: PLEN1 ! Decay scale for smooth topography REAL, INTENT(OUT) :: PLEN2 ! Decay scale for small-scale topography deviation -REAL, DIMENSION(:,:), INTENT(INOUT) :: PZS ! orography -REAL, DIMENSION(:,:), INTENT(INOUT) :: PZSMT ! smooth orography +REAL, DIMENSION(:,:), INTENT(OUT) :: PZS ! orography +REAL, DIMENSION(:,:), INTENT(OUT) :: PZSMT ! smooth orography REAL, DIMENSION(:,:), INTENT(OUT) :: PZS_LS ! interpolated orography REAL, DIMENSION(:,:), INTENT(OUT) :: PZSMT_LS ! interpolated smooth orography ! -! -TYPE (DATE_TIME), INTENT(INOUT) :: TPDTMOD ! Date and Time of MODel beginning -TYPE (DATE_TIME), INTENT(INOUT) :: TPDTCUR ! CURent date and time +TYPE (DATE_TIME), INTENT(OUT) :: TPDTMOD ! Date and Time of MODel beginning +TYPE (DATE_TIME), INTENT(OUT) :: TPDTCUR ! CURent date and time ! END SUBROUTINE SPAWN_GRID2 ! @@ -47,13 +56,15 @@ END INTERFACE END MODULE MODI_SPAWN_GRID2 ! ! -! ######################################################################### - SUBROUTINE SPAWN_GRID2 (KXOR,KYOR,KXEND,KYEND,KDXRATIO,KDYRATIO, & - PLONOR,PLATOR,PXHAT,PYHAT,PZHAT,PZTOP, & - OSLEVE,PLEN1,PLEN2, & - PZS,PZSMT,PZS_LS,PZSMT_LS, & - TPDTMOD,TPDTCUR ) -! ######################################################################### +! ###################################################################################### + SUBROUTINE SPAWN_GRID2( KXOR, KYOR, KXEND, KYEND, KDXRATIO, KDYRATIO, & + PLONOR, PLATOR, PXHAT, PYHAT, PZHAT, PXHATM, PYHATM, PZHATM, & + PXHAT_ll, PYHAT_ll, PXHATM_ll, PYHATM_ll, & + PHAT_BOUND, PHATM_BOUND, & + PZTOP, OSLEVE, PLEN1, PLEN2, & + PZS, PZSMT, PZS_LS, PZSMT_LS, & + TPDTMOD, TPDTCUR ) +! ###################################################################################### ! !!**** *SPAWN_GRID2 * - subroutine to define spatial and temporal grid. !! @@ -166,6 +177,7 @@ USE MODD_BIKHARDT_n USE MODD_VAR_ll use mode_bikhardt USE MODE_ll +USE MODE_SET_GRID, only: INTERP_HORGRID_TO_MASSPOINTS, STORE_GLOB_GRID USE MODE_TIME USE MODE_GRIDPROJ ! @@ -184,10 +196,18 @@ INTEGER, INTENT(IN) :: KYOR,KYEND ! of the model 2 domain, relative to model INTEGER, INTENT(IN) :: KDXRATIO ! x and y-direction Resolution ratio INTEGER, INTENT(IN) :: KDYRATIO ! between model 2 and model 1 ! -REAL, INTENT(INOUT) :: PLATOR ! Latitude of the origine point -REAL, INTENT(INOUT) :: PLONOR ! Longitude of the origine point -REAL, DIMENSION(:), INTENT(INOUT) :: PXHAT,PYHAT,PZHAT ! positions x,y,z in the +REAL, INTENT(OUT) :: PLATOR ! Latitude of the origine point +REAL, INTENT(OUT) :: PLONOR ! Longitude of the origine point +REAL, DIMENSION(:), INTENT(OUT) :: PXHAT,PYHAT,PZHAT ! positions x,y,z in the ! conformal plane or on the cartesian plane +REAL, DIMENSION(:), INTENT(OUT) :: PXHATM, PYHATM, PZHATM ! positions x,y in the + ! conformal plane or on the cartesian plane at mass points +REAL, DIMENSION(:), POINTER, INTENT(INOUT) :: PXHAT_ll ! Position x, y or z in the conformal or cartesian plane (all domain) +REAL, DIMENSION(:), POINTER, INTENT(INOUT) :: PYHAT_ll ! Position x, y or z in the conformal or cartesian plane (all domain) +REAL, DIMENSION(:), POINTER, INTENT(INOUT) :: PXHATM_ll ! id at mass points +REAL, DIMENSION(:), POINTER, INTENT(INOUT) :: PYHATM_ll ! id at mass points +REAL, DIMENSION(:), POINTER, INTENT(INOUT) :: PHAT_BOUND ! Boundaries of global domain in the conformal or cartesian plane +REAL, DIMENSION(:), POINTER, INTENT(INOUT) :: PHATM_BOUND ! idem at mass points REAL, INTENT(OUT) :: PZTOP ! model top (m) LOGICAL, INTENT(OUT) :: OSLEVE ! flag for SLEVE coordinate REAL, INTENT(OUT) :: PLEN1 ! Decay scale for smooth topography @@ -197,9 +217,8 @@ REAL, DIMENSION(:,:), INTENT(OUT) :: PZSMT ! smooth orography REAL, DIMENSION(:,:), INTENT(OUT) :: PZS_LS ! interpolated orography REAL, DIMENSION(:,:), INTENT(OUT) :: PZSMT_LS ! interpolated smooth orography ! -! -TYPE (DATE_TIME), INTENT(INOUT) :: TPDTMOD ! Date and Time of MODel beginning -TYPE (DATE_TIME), INTENT(INOUT) :: TPDTCUR ! CURent date and time +TYPE (DATE_TIME), INTENT(OUT) :: TPDTMOD ! Date and Time of MODel beginning +TYPE (DATE_TIME), INTENT(OUT) :: TPDTCUR ! CURent date and time ! !* 0.2 Declarations of local variables for print on FM file ! @@ -304,7 +323,8 @@ END IF ! -------------------------------------- ! PZTOP = XZTOP1 -PZHAT(:) = XZHAT1(:) +PZHAT(:) = XZHAT1(:) +PZHATM(:) = XZHATM1(:) OSLEVE = LSLEVE1 PLEN1 = XLEN11 PLEN2 = XLEN21 @@ -449,6 +469,14 @@ PLEN2 = XLEN21 DEALLOCATE(ZYHAT_2D_F) DEALLOCATE(ZYHAT_EXTENDED_C) DEALLOCATE(ZYHAT_2D_C) + + ! Interpolations of positions to mass points + CALL INTERP_HORGRID_TO_MASSPOINTS( PXHAT, PYHAT, PXHATM, PYHATM ) + + ! Collect global domain boundaries + CALL STORE_GLOB_GRID( PXHAT, PYHAT, PZHAT, PXHATM, PYHATM, PZHATM, & + PXHAT_ll, PYHAT_ll, PXHATM_ll, PYHATM_ll, PHAT_BOUND, PHATM_BOUND ) + !!$======= !!$ IXSIZE1=SIZE(XXHAT1) !!$ ALLOCATE(ZXHAT_EXTENDED(IXSIZE1+1)) diff --git a/src/MNH/spawn_model2.f90 b/src/MNH/spawn_model2.f90 index cea25a6b4983f6f107bf671ebb1d45fe1567f216..b592b2651b91459fccb3739cc2f962e426195e91 100644 --- a/src/MNH/spawn_model2.f90 +++ b/src/MNH/spawn_model2.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1995-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1995-2022 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. @@ -737,6 +737,7 @@ END IF !* 4.4 Grid variables (module MODD_GRID2 and MODD_METRICS2): ! ALLOCATE(XXHAT(IIU),XYHAT(IJU),XZHAT(IKU)) +ALLOCATE(XXHATM(IIU),XYHATM(IJU),XZHATM(IKU)) ALLOCATE(XZTOP) ALLOCATE(XMAP(IIU,IJU)) ALLOCATE(XLAT(IIU,IJU)) @@ -1061,9 +1062,12 @@ ELSE NYEND_TMP = NYEND ENDIF XZS=0. -CALL SPAWN_GRID2 (NXOR,NYOR,NXEND,NYEND,NDXRATIO,NDYRATIO, & - XLONORI,XLATORI,XXHAT,XYHAT,XZHAT,XZTOP,LSLEVE,XLEN1,XLEN2, & - XZS,XZSMT,ZZS_LS,ZZSMT_LS,TDTMOD,TDTCUR ) +CALL SPAWN_GRID2( NXOR, NYOR, NXEND, NYEND, NDXRATIO, NDYRATIO, & + XLONORI, XLATORI, XXHAT, XYHAT, XZHAT, XXHATM, XYHATM, XZHATM, & + XXHAT_ll, XYHAT_ll, XXHATM_ll, XYHATM_ll, & + XHAT_BOUND, XHATM_BOUND, & + XZTOP, LSLEVE, XLEN1, XLEN2, & + XZS, XZSMT, ZZS_LS, ZZSMT_LS, TDTMOD, TDTCUR ) ! CALL MPPDB_CHECK2D(ZZS_LS,"SPAWN_MOD2:ZZS_LS",PRECISION) CALL MPPDB_CHECK2D(ZZSMT_LS,"SPAWN_MOD2:ZZSMT_LS",PRECISION) @@ -1082,10 +1086,12 @@ IF (LCARTESIAN) THEN CALL SM_GRIDCART(XXHAT,XYHAT,XZHAT,ZZS_LS,LSLEVE,XLEN1,XLEN2,ZZSMT_LS,XDXHAT,XDYHAT,ZZZ_LS,ZJ) CALL SM_GRIDCART(XXHAT,XYHAT,XZHAT,XZS ,LSLEVE,XLEN1,XLEN2,XZSMT ,XDXHAT,XDYHAT,XZZ ,ZJ) ELSE - CALL SM_GRIDPROJ(XXHAT,XYHAT,XZHAT,ZZS_LS,LSLEVE,XLEN1,XLEN2,ZZSMT_LS,& - XLATORI,XLONORI,XMAP,XLAT,XLON,XDXHAT,XDYHAT,ZZZ_LS,ZJ) - CALL SM_GRIDPROJ(XXHAT,XYHAT,XZHAT,XZS ,LSLEVE,XLEN1,XLEN2,XZSMT ,& - XLATORI,XLONORI,XMAP,XLAT,XLON,XDXHAT,XDYHAT,XZZ ,ZJ) + CALL SM_GRIDPROJ( XXHAT, XYHAT, XZHAT, XXHATM, XYHATM, ZZS_LS, & + LSLEVE, XLEN1, XLEN2, ZZSMT_LS, XLATORI, XLONORI, & + XMAP, XLAT, XLON, XDXHAT, XDYHAT, ZZZ_LS, ZJ ) + CALL SM_GRIDPROJ( XXHAT, XYHAT, XZHAT, XXHATM, XYHATM, XZS, & + LSLEVE, XLEN1, XLEN2, XZSMT, XLATORI, XLONORI, & + XMAP, XLAT, XLON, XDXHAT, XDYHAT, XZZ, ZJ ) END IF ! !* 5.4 Compute the metric coefficients @@ -1111,10 +1117,10 @@ CALL MPPDB_CHECK3D(XDZY,"spawnmod2-aftrupdate_metrics:XDZY",PRECISION) ! !* 5.5 3D Reference state variables : ! -CALL SET_REF(0,TFILE_DUMMY, & - XZZ,XZHAT,ZJ,XDXX,XDYY,CLBCX,CLBCY, & - XREFMASS,XMASS_O_PHI0,XLINMASS, & - XRHODREF,XTHVREF,XRVREF,XEXNREF,XRHODJ) +CALL SET_REF( 0, TFILE_DUMMY, & + XZZ, XZHATM, ZJ, XDXX, XDYY, CLBCX, CLBCY, & + XREFMASS, XMASS_O_PHI0, XLINMASS, & + XRHODREF, XTHVREF, XRVREF, XEXNREF, XRHODJ ) ! CALL SECOND_MNH(ZTIME2) ! diff --git a/src/MNH/spawning.f90 b/src/MNH/spawning.f90 index 15c7d98b76f599f4f2b5329cc09333df5c484bfb..f0ef283104e3c88829e862df850bdd5a11a39c2e 100644 --- a/src/MNH/spawning.f90 +++ b/src/MNH/spawning.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1995-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1995-2022 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. @@ -280,6 +280,7 @@ USE MODD_PRECIP_n XXHAT1 => XXHAT XYHAT1 => XYHAT XZHAT1 => XZHAT +XZHATM1 => XZHATM XZTOP1 => XZTOP XZS1 => XZS XZSMT1 => XZSMT diff --git a/src/MNH/station_reader.f90 b/src/MNH/station_reader.f90 deleted file mode 100644 index 0f6b74663480f8dc78a48531f285837929fdfad6..0000000000000000000000000000000000000000 --- a/src/MNH/station_reader.f90 +++ /dev/null @@ -1,153 +0,0 @@ -!MNH_LIC Copyright 2020-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 MODI_STATION_READER -! ####################### -! -INTERFACE -! -SUBROUTINE READ_CSV_STATION(HFILE,TPSTATION,OCARTESIAN) - USE MODD_STATION_n - CHARACTER(LEN=*), INTENT(IN) :: HFILE ! file to read - TYPE(STATION), INTENT(OUT) :: TPSTATION ! stored blade data - LOGICAL, INTENT(IN) :: OCARTESIAN -END SUBROUTINE READ_CSV_STATION -! -END INTERFACE -! -END MODULE MODI_STATION_READER -!------------------------------------------------------------------- -! -!!**** *EOL_READER* - -!! -!! PURPOSE -!! ------- -!! Prescribe probes through a CSV file -!! -!! AUTHOR -!! ------ -!! E. Jézéquel *CNRM & IFPEN* -!! -!! MODIFICATIONS -!! ------------- -!! 03/2020 Original -!! -!!--------------------------------------------------------------- -! -!######################################################### -SUBROUTINE READ_CSV_STATION(HFILE,TPSTATION,OCARTESIAN) -USE MODD_ALLSTATION_n -USE MODD_STATION_n -USE MODD_PARAMETERS -USE MODD_TYPE_STATION -USE MODI_INI_SURFSTATION_n - -! -CHARACTER(LEN=*), INTENT(IN) :: HFILE ! file to read -TYPE(STATION), INTENT(INOUT) :: TPSTATION ! dummy stored -LOGICAL, INTENT(IN) :: OCARTESIAN -! -INTEGER :: INBLINE ! Nb of line in csv file -! -CHARACTER(LEN=80) :: YERROR -CHARACTER(LEN=400) :: YSTRING -INTEGER :: ILU ! logical unit of the file -! - -! Open file -OPEN(NEWUNIT=ILU,FILE=HFILE, FORM='formatted') -! Count lines -REWIND(ILU) -INBLINE=0 -DO - READ(ILU,END=101,FMT='(A400)') YSTRING -!* analyses if the record has been written in French convention - CALL FRENCH_TO_ENGLISH(YSTRING) ! analyse de convention fr ou eng - IF (LEN_TRIM(YSTRING) > 0) THEN - INBLINE = INBLINE + 1 - END IF -END DO -! -101 CONTINUE - IF (INBLINE == 0) THEN - YERROR = 'Data not found in file : '//TRIM(HFILE) - PRINT*, YERROR - ELSE - ! Save number of station - NUMBSTAT = INBLINE - 1 - ! - ! Allocation des tableaux - ALLOCATE(TPSTATION%LAT(NUMBSTAT)) - ALLOCATE(TPSTATION%LON(NUMBSTAT)) - ALLOCATE(TPSTATION%X(NUMBSTAT)) - ALLOCATE(TPSTATION%Y(NUMBSTAT)) - ALLOCATE(TPSTATION%Z(NUMBSTAT)) - ALLOCATE(TPSTATION%K(NUMBSTAT)) - !ALLOCATE(TPSTATION%STEP(NUMBSTAT)) - ALLOCATE(TPSTATION%NAME(NUMBSTAT)) -! ALLOCATE(TPSTATION%TYPE(NUMBSTAT)) - - TPSTATION%LON = XUNDEF - TPSTATION%LAT = XUNDEF - TPSTATION%Z = XUNDEF - TPSTATION%K = XUNDEF - TPSTATION%X = XUNDEF - TPSTATION%Y = XUNDEF - TPSTATION%NAME = " " -! TPSTATION%TYPE = " " - ! Nouvelle lecture - REWIND(ILU) - READ(ILU,FMT='(A400)') YSTRING ! Lecture du header - ! - ! Save the data - IF (OCARTESIAN) THEN - INBLINE = 1 - DO INBLINE=1, NUMBSTAT - READ(ILU,FMT='(A400)') YSTRING - READ(YSTRING,*) TPSTATION%NAME(INBLINE), & !TPSTATION%TYPE(INBLINE),& - TPSTATION%X(INBLINE), TPSTATION%Y(INBLINE), TPSTATION%Z(INBLINE)!,& - END DO - REWIND(ILU) - CLOSE(ILU) - RETURN - ELSE - INBLINE = 1 - DO INBLINE=1, NUMBSTAT - READ(ILU,FMT='(A400)') YSTRING - READ(YSTRING,*) TPSTATION%NAME(INBLINE), & !TPSTATION%TYPE(INBLINE),& - TPSTATION%LAT(INBLINE), TPSTATION%LON(INBLINE), TPSTATION%Z(INBLINE)!,& - END DO - REWIND(ILU) - CLOSE(ILU) - RETURN - END IF - END IF -! -END SUBROUTINE READ_CSV_STATION -!######################################################### -SUBROUTINE FRENCH_TO_ENGLISH(HSTRING) -CHARACTER(LEN=400), INTENT(INOUT) :: HSTRING ! csv record -INTEGER :: JL -LOGICAL :: GFRENCH -! -GFRENCH = .FALSE. -!* analyses if the record has been written in French convention -! French convention (separator is ; decimal symbol is ,) -! or English convention (separator is , decimal symbol is .) -DO JL=1,400 - IF (HSTRING(JL:JL)==';') GFRENCH=.TRUE. -END DO -! -! If French convention is used in the file, transforms it in English convention -IF (GFRENCH) THEN - DO JL=1,400 - IF (HSTRING(JL:JL)==',') HSTRING(JL:JL)='.' - IF (HSTRING(JL:JL)==';') HSTRING(JL:JL)=',' - END DO -END IF -! -END SUBROUTINE FRENCH_TO_ENGLISH - diff --git a/src/MNH/stationn.f90 b/src/MNH/stationn.f90 index 8774f316af1407a1f08b151fd469aa351461ae21..172521e8abb91b0ef28830380b52e3aee4aea628 100644 --- a/src/MNH/stationn.f90 +++ b/src/MNH/stationn.f90 @@ -9,14 +9,10 @@ MODULE MODI_STATION_n ! INTERFACE ! - SUBROUTINE STATION_n(PTSTEP, & - PXHAT, PYHAT, PZ, & - PU, PV, PW, PTH, PR, PSV, PTKE, & - PTS,PP ) -! -REAL, INTENT(IN) :: PTSTEP ! time step -REAL, DIMENSION(:), INTENT(IN) :: PXHAT ! x coordinate -REAL, DIMENSION(:), INTENT(IN) :: PYHAT ! y coordinate + SUBROUTINE STATION_n( PZ, & + PU, PV, PW, PTH, PR, PSV, PTKE, & + PTS, PP ) +! REAL, DIMENSION(:,:,:), INTENT(IN) :: PZ ! z array REAL, DIMENSION(:,:,:), INTENT(IN) :: PU ! horizontal wind X component REAL, DIMENSION(:,:,:), INTENT(IN) :: PV ! horizontal wind Y component @@ -36,12 +32,11 @@ END INTERFACE ! END MODULE MODI_STATION_n ! -! ######################################################## - SUBROUTINE STATION_n(PTSTEP, & - PXHAT, PYHAT, PZ, & - PU, PV, PW, PTH, PR, PSV, PTKE, & - PTS, PP ) -! ######################################################## +! ####################################################### + SUBROUTINE STATION_n( PZ, & + PU, PV, PW, PTH, PR, PSV, PTKE, & + PTS, PP ) +! ####################################################### ! ! !!**** *STATION_n* - (advects and) stores @@ -72,37 +67,31 @@ END MODULE MODI_STATION_n !! MODIFICATIONS !! ------------- !! Original 15/02/2002 -!! A. Lemonsu 19/11/2002 -!! P.Aumond 01/07/2011 : Add model levels -!! C.Lac 04/2013 : Correction on the vertical levels -!! C.Lac 04/2013 : Add I/J positioning +! A. Lemonsu 19/11/2002 +! P. Aumond 01/07/2011: add model levels +! C. Lac 04/2013: correction on the vertical levels +! C. Lac 04/2013: add I/JK positioning ! P. Wautelet 28/03/2018: replace TEMPORAL_DIST by DATETIME_DISTANCE ! P. Wautelet 05/2016-04/2018: new data structures and calls for I/O ! P. Wautelet 13/09/2019: budget: simplify and modernize date/time management ! R. Schoetter 11/2019: use LCARTESIAN instead of LSTATLAT for multiproc in cartesian -! P. Wautelet 09/05/2022: bugfix: use correct indices for U and V interpolation +! P. Wautelet 04/2022: restructure stations for better performance, reduce memory usage and correct some problems/bugs ! ! -------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ ! -USE MODD_CONF -USE MODD_CST +USE MODD_CONF, ONLY: LCARTESIAN +USE MODD_CST, ONLY: XPI USE MODD_DIAG_IN_RUN -USE MODD_GRID -USE MODD_PARAMETERS +USE MODD_GRID, ONLY: XBETA, XLON0, XRPK +USE MODD_PARAMETERS, ONLY: JPVEXT USE MODD_PARAM_n, ONLY: CRAD USE MODD_STATION_n USE MODD_ALLSTATION_n, ONLY: LDIAG_SURFRAD -USE MODD_SUB_STATION_n -USE MODD_TIME, ONLY: tdtexp -USE MODD_TIME_n, ONLY: tdtcur -! -USE MODE_ll -! -USE MODI_WATER_SUM ! +USE MODE_STATPROF_TOOLS, ONLY: STATPROF_INSTANT, STATPROF_INTERP_2D, STATPROF_INTERP_2D_U, STATPROF_INTERP_2D_V ! ! IMPLICIT NONE @@ -111,9 +100,6 @@ IMPLICIT NONE !* 0.1 declarations of arguments ! ! -REAL, INTENT(IN) :: PTSTEP ! time step -REAL, DIMENSION(:), INTENT(IN) :: PXHAT ! x coordinate -REAL, DIMENSION(:), INTENT(IN) :: PYHAT ! y coordinate REAL, DIMENSION(:,:,:), INTENT(IN) :: PZ ! z array REAL, DIMENSION(:,:,:), INTENT(IN) :: PU ! horizontal wind X component REAL, DIMENSION(:,:,:), INTENT(IN) :: PV ! horizontal wind Y component @@ -130,21 +116,6 @@ REAL, DIMENSION(:,:,:), INTENT(IN) :: PP ! pressure ! 0.2 declaration of local variables ! ! -INTEGER :: IIB ! current processor domain sizes -INTEGER :: IJB ! -INTEGER :: IIE ! -INTEGER :: IJE ! -INTEGER :: IIU ! -INTEGER :: IJU ! -! -REAL, DIMENSION(SIZE(PXHAT)) :: ZXHATM ! mass point coordinates -REAL, DIMENSION(SIZE(PYHAT)) :: ZYHATM ! mass point coordinates -! -REAL, DIMENSION(SIZE(PSV,1),SIZE(PSV,2),SIZE(PSV,3),SIZE(PSV,4)) :: ZWORK ! -! -LOGICAL :: GSTORE ! storage occurs at this time step -! -! INTEGER :: IN ! time index INTEGER :: JSV ! loop counter ! @@ -152,397 +123,75 @@ REAL :: ZU_STAT ! horizontal wind speed at station location (along x) REAL :: ZV_STAT ! horizontal wind speed at station location (along y) REAL :: ZGAM ! rotation between meso-nh base and spherical lat-lon base. ! -INTEGER :: IINFO_ll ! return code -INTEGER :: IRESP ! return code -INTEGER :: I ! loop for stations -INTEGER :: J ! loop for levels - -! -!---------------------------------------------------------------------------- -! -!* 2. PRELIMINARIES -! ------------- -! -!* 2.1 Indices -! ------- -! -CALL GET_INDICE_ll (IIB,IJB,IIE,IJE) -! -! -!* 2.2 Interpolations of model variables to mass points -! ------------------------------------------------ -! -IIU=SIZE(PXHAT) -IJU=SIZE(PYHAT) -! -ZXHATM(1:IIU-1)=0.5*PXHAT(1:IIU-1)+0.5*PXHAT(2:IIU ) -ZXHATM( IIU )=1.5*PXHAT( IIU )-0.5*PXHAT( IIU-1) -! -ZYHATM(1:IJU-1)=0.5*PYHAT(1:IJU-1)+0.5*PYHAT(2:IJU ) -ZYHATM( IJU )=1.5*PYHAT( IJU )-0.5*PYHAT( IJU-1) +INTEGER :: JS ! loop for stations +INTEGER :: JK ! loop for levels ! !---------------------------------------------------------------------------- ! !* 3.4 instant of storage ! ------------------ ! -IF ( TSTATION%T_CUR == XUNDEF ) TSTATION%T_CUR = TSTATION%STEP - PTSTEP -! -TSTATION%T_CUR = TSTATION%T_CUR + PTSTEP -! -IF ( TSTATION%T_CUR >= TSTATION%STEP - 1.E-10 ) THEN - GSTORE = .TRUE. - TSTATION%T_CUR = TSTATION%T_CUR - TSTATION%STEP - TSTATION%N_CUR = TSTATION%N_CUR + 1 - IN = TSTATION%N_CUR -ELSE - GSTORE = .FALSE. -END IF -! -IF (GSTORE) THEN -#if 0 - tstation%tpdates(in)%date%year = tdtexp%date%year - tstation%tpdates(in)%date%month = tdtexp%date%month - tstation%tpdates(in)%date%day = tdtexp%date%day - tstation%tpdates(in)%xtime = tdtexp%xtime + ( in - 1 ) * tstation%step -#else - tstation%tpdates(in) = tdtcur -#endif -END IF -! +CALL STATPROF_INSTANT( TSTATIONS_TIME, IN ) +IF ( IN < 1 ) RETURN !No profiler storage at this time step ! !---------------------------------------------------------------------------- ! -!* 4. STATION POSITION +!* 8. DATA RECORDING ! -------------- ! -!* 4.0 initialization of processor test -! -------------------------------- -IF (GSTATFIRSTCALL) THEN - GSTATFIRSTCALL=.FALSE. -! - IF (.NOT.(ASSOCIATED(ZTHIS_PROCS))) ALLOCATE(ZTHIS_PROCS(NUMBSTAT)) -! - IF (.NOT.(ASSOCIATED(II))) ALLOCATE(II(NUMBSTAT)) - IF (.NOT.(ASSOCIATED(IJ))) ALLOCATE(IJ(NUMBSTAT)) - IF (.NOT.(ASSOCIATED(IV))) ALLOCATE(IV(NUMBSTAT)) - IF (.NOT.(ASSOCIATED(IU))) ALLOCATE(IU(NUMBSTAT)) - IF (.NOT.(ASSOCIATED(ZXCOEF))) ALLOCATE(ZXCOEF(NUMBSTAT)) - IF (.NOT.(ASSOCIATED(ZUCOEF))) ALLOCATE(ZUCOEF(NUMBSTAT)) - IF (.NOT.(ASSOCIATED(ZYCOEF))) ALLOCATE(ZYCOEF(NUMBSTAT)) - IF (.NOT.(ASSOCIATED(ZVCOEF))) ALLOCATE(ZVCOEF(NUMBSTAT)) +STATION: DO JS = 1,NUMBSTAT_LOC + JK = TSTATIONS(JS)%NK - ZXCOEF(:) =XUNDEF - ZUCOEF(:) =XUNDEF - ZYCOEF(:) =XUNDEF - ZVCOEF(:) =XUNDEF + IF (LCARTESIAN) THEN + TSTATIONS(JS)%XZON(IN) = STATPROF_INTERP_2D_U( TSTATIONS(JS), PU(:,:,JK) ) + TSTATIONS(JS)%XMER(IN) = STATPROF_INTERP_2D_V( TSTATIONS(JS), PV(:,:,JK) ) + ELSE + ZU_STAT = STATPROF_INTERP_2D_U( TSTATIONS(JS), PU(:,:,JK) ) + ZV_STAT = STATPROF_INTERP_2D_V( TSTATIONS(JS), PV(:,:,JK) ) + ZGAM = (XRPK * (TSTATIONS(JS)%XLON - XLON0) - XBETA)*(XPI/180.) + TSTATIONS(JS)%XZON(IN) = ZU_STAT * COS(ZGAM) + ZV_STAT * SIN(ZGAM) + TSTATIONS(JS)%XMER(IN) = - ZU_STAT * SIN(ZGAM) + ZV_STAT * COS(ZGAM) + END IF + TSTATIONS(JS)%XW (IN) = STATPROF_INTERP_2D( TSTATIONS(JS), PW(:,:,JK) ) + TSTATIONS(JS)%XTH(IN) = STATPROF_INTERP_2D( TSTATIONS(JS), PTH(:,:,JK) ) + TSTATIONS(JS)%XP (IN) = STATPROF_INTERP_2D( TSTATIONS(JS), PP(:,:,JK) ) -! - DO I=1,NUMBSTAT -! - ZTHIS_PROCS(I)=0. -! -!* 4.1 X position -! ---------- -! - IU(I)=COUNT( PXHAT (:)<=TSTATION%X(I) ) - II(I)=COUNT( ZXHATM(:)<=TSTATION%X(I) ) -! - IF (II(I)<=IIB-1 .AND. LWEST_ll() .AND. .NOT. L1D) TSTATION%ERROR(I)=.TRUE. - IF (II(I)>=IIE .AND. LEAST_ll() .AND. .NOT. L1D) TSTATION%ERROR(I)=.TRUE. -! -! -!* 4.2 Y position -! ---------- -! - IV(I)=COUNT( PYHAT (:)<=TSTATION%Y(I) ) - IJ(I)=COUNT( ZYHATM(:)<=TSTATION%Y(I) ) -! - IF (IJ(I)<=IJB-1 .AND. LSOUTH_ll() .AND. .NOT. L1D) TSTATION%ERROR(I)=.TRUE. - IF (IJ(I)>=IJE .AND. LNORTH_ll() .AND. .NOT. L1D) TSTATION%ERROR(I)=.TRUE. -! -! -!* 4.3 Position of station according to processors -! ------------------------------------------- -! - IF (IU(I)>=IIB .AND. IU(I)<=IIE .AND. IV(I)>=IJB .AND. IV(I)<=IJE) ZTHIS_PROCS(I)=1. - IF (L1D) ZTHIS_PROCS(I)=1. -! -! -!* 4.4 Computations only on correct processor -! -------------------------------------- - ZXCOEF(I) = 0. - ZYCOEF(I) = 0. - ZUCOEF(I) = 0. - ZVCOEF(I) = 0. - IF (ZTHIS_PROCS(I) >0. .AND. .NOT. L1D) THEN -!---------------------------------------------------------------------------- -! -!* 6.1 Interpolation coefficient for X -! ------------------------------- -! - ZXCOEF(I) = (TSTATION%X(I) - ZXHATM(II(I))) / (ZXHATM(II(I)+1) - ZXHATM(II(I))) -! -! -! -!* 6.2 Interpolation coefficient for y -! ------------------------------- -! - ZYCOEF(I) = (TSTATION%Y(I) - ZYHATM(IJ(I))) / (ZYHATM(IJ(I)+1) - ZYHATM(IJ(I))) -! -!------------------------------------------------------------------- -! -!* 7. INITIALIZATIONS FOR INTERPOLATIONS OF U AND V -! --------------------------------------------- -! -!* 7.1 Interpolation coefficient for X (for U) -! ------------------------------- -! - ZUCOEF(I) = (TSTATION%X(I) - PXHAT(IU(I))) / (PXHAT(IU(I)+1) - PXHAT(IU(I))) -! -! -!* 7.2 Interpolation coefficient for y (for V) -! ------------------------------- -! - ZVCOEF(I) = (TSTATION%Y(I) - PYHAT(IV(I))) / (PYHAT(IV(I)+1) - PYHAT(IV(I))) -! -! - - END IF - ENDDO -END IF -!---------------------------------------------------------------------------- -! -!* 8. DATA RECORDING -! -------------- -! -IF (GSTORE) THEN - DO I=1,NUMBSTAT - ! - IF ((ZTHIS_PROCS(I)==1.).AND.(.NOT. TSTATION%ERROR(I))) THEN - IF (TSTATION%K(I)/= XUNDEF) THEN - J = TSTATION%K(I) - ELSE ! suppose TSTATION%Z(I) /= XUNDEF - J=1 - DO WHILE ((STATION_INTERP_2D(PZ(:,:,J))-STATION_INTERP_2D(PZ(:,:,2))) & - < TSTATION%Z(I)) - J = J + 1 - END DO - IF (((STATION_INTERP_2D(PZ(:,:,J))-STATION_INTERP_2D(PZ(:,:,2)))-TSTATION%Z(I))>& - (TSTATION%Z(I)-(STATION_INTERP_2D(PZ(:,:,J-1))-STATION_INTERP_2D(PZ(:,:,2))))) THEN - J=J-1 - ENDIF - END IF - ! - IF (LCARTESIAN) THEN - TSTATION%ZON (IN,I) = STATION_INTERP_2D_U(PU(:,:,J)) - TSTATION%MER (IN,I) = STATION_INTERP_2D_V(PV(:,:,J)) - ELSE - ZU_STAT = STATION_INTERP_2D_U(PU(:,:,J)) - ZV_STAT = STATION_INTERP_2D_V(PV(:,:,J)) - ZGAM = (XRPK * (TSTATION%LON(I) - XLON0) - XBETA)*(XPI/180.) - TSTATION%ZON (IN,I) = ZU_STAT * COS(ZGAM) + ZV_STAT * SIN(ZGAM) - TSTATION%MER (IN,I) = - ZU_STAT * SIN(ZGAM) + ZV_STAT * COS(ZGAM) - ENDIF - TSTATION%W (IN,I) = STATION_INTERP_2D(PW(:,:,J)) - TSTATION%TH (IN,I) = STATION_INTERP_2D(PTH(:,:,J)) - TSTATION%P (IN,I) = STATION_INTERP_2D(PP(:,:,J)) - ! - DO JSV=1,SIZE(PR,4) - TSTATION%R (IN,I,JSV) = STATION_INTERP_2D(PR(:,:,J,JSV)) - END DO - ! - DO JSV=1,SIZE(PSV,4) - TSTATION%SV (IN,I,JSV) = STATION_INTERP_2D(PSV(:,:,J,JSV)) - END DO - ! - IF (SIZE(PTKE)>0) TSTATION%TKE (IN,I) = STATION_INTERP_2D(PTKE(:,:,J)) - IF (SIZE(PTS) >0) TSTATION%TSRAD(IN,I) = STATION_INTERP_2D(PTS) - TSTATION%ZS(I) = STATION_INTERP_2D(PZ(:,:,1+JPVEXT)) - ! - IF (LDIAG_SURFRAD) THEN - TSTATION%ZON10M(IN,I) = STATION_INTERP_2D(XCURRENT_ZON10M) - TSTATION%MER10M(IN,I) = STATION_INTERP_2D(XCURRENT_MER10M) - TSTATION%T2M (IN,I) = STATION_INTERP_2D(XCURRENT_T2M ) - TSTATION%Q2M (IN,I) = STATION_INTERP_2D(XCURRENT_Q2M ) - TSTATION%HU2M (IN,I) = STATION_INTERP_2D(XCURRENT_HU2M ) - TSTATION%RN (IN,I) = STATION_INTERP_2D(XCURRENT_RN ) - TSTATION%H (IN,I) = STATION_INTERP_2D(XCURRENT_H ) - TSTATION%LE (IN,I) = STATION_INTERP_2D(XCURRENT_LE ) - TSTATION%LEI (IN,I) = STATION_INTERP_2D(XCURRENT_LEI ) - TSTATION%GFLUX (IN,I) = STATION_INTERP_2D(XCURRENT_GFLUX ) - IF (CRAD /= 'NONE') THEN - TSTATION%SWD (IN,I) = STATION_INTERP_2D(XCURRENT_SWD ) - TSTATION%SWU (IN,I) = STATION_INTERP_2D(XCURRENT_SWU ) - TSTATION%LWD (IN,I) = STATION_INTERP_2D(XCURRENT_LWD ) - TSTATION%LWU (IN,I) = STATION_INTERP_2D(XCURRENT_LWU ) - TSTATION%SWDIR (IN,I) = STATION_INTERP_2D(XCURRENT_SWDIR ) - TSTATION%SWDIFF(IN,I) = STATION_INTERP_2D(XCURRENT_SWDIFF) - TSTATION%DSTAOD(IN,I) = STATION_INTERP_2D(XCURRENT_DSTAOD) - ENDIF - TSTATION%SFCO2 (IN,I) = STATION_INTERP_2D(XCURRENT_SFCO2 ) - ENDIF - - ! - END IF -! -!---------------------------------------------------------------------------- -! -!* 11. EXCHANGE OF INFORMATION BETWEEN PROCESSORS -! ------------------------------------------ -! -!* 11.2 data stored -! ----------- -! - CALL DISTRIBUTE_STATION(TSTATION%X (I)) - CALL DISTRIBUTE_STATION(TSTATION%Y (I)) - CALL DISTRIBUTE_STATION(TSTATION%Z (I)) - CALL DISTRIBUTE_STATION(TSTATION%LON (I)) - CALL DISTRIBUTE_STATION(TSTATION%LAT (I)) - CALL DISTRIBUTE_STATION(TSTATION%ZON (IN,I)) - CALL DISTRIBUTE_STATION(TSTATION%MER (IN,I)) - CALL DISTRIBUTE_STATION(TSTATION%W (IN,I)) - CALL DISTRIBUTE_STATION(TSTATION%P (IN,I)) - CALL DISTRIBUTE_STATION(TSTATION%TH (IN,I)) DO JSV=1,SIZE(PR,4) - CALL DISTRIBUTE_STATION(TSTATION%R (IN,I,JSV)) + TSTATIONS(JS)%XR(IN,JSV) = STATPROF_INTERP_2D( TSTATIONS(JS), PR(:,:,JK,JSV) ) END DO + DO JSV=1,SIZE(PSV,4) - CALL DISTRIBUTE_STATION(TSTATION%SV (IN,I,JSV)) + TSTATIONS(JS)%XSV(IN,JSV) = STATPROF_INTERP_2D( TSTATIONS(JS), PSV(:,:,JK,JSV) ) END DO - IF (SIZE(PTKE)>0) CALL DISTRIBUTE_STATION(TSTATION%TKE (IN,I)) - IF (SIZE(PTS) >0) CALL DISTRIBUTE_STATION(TSTATION%TSRAD(IN,I)) - CALL DISTRIBUTE_STATION(TSTATION%ZS (I)) - IF (LDIAG_SURFRAD) THEN - CALL DISTRIBUTE_STATION(TSTATION%T2M (IN,I)) - CALL DISTRIBUTE_STATION(TSTATION%Q2M (IN,I)) - CALL DISTRIBUTE_STATION(TSTATION%HU2M (IN,I)) - CALL DISTRIBUTE_STATION(TSTATION%ZON10M (IN,I)) - CALL DISTRIBUTE_STATION(TSTATION%MER10M (IN,I)) - CALL DISTRIBUTE_STATION(TSTATION%RN (IN,I)) - CALL DISTRIBUTE_STATION(TSTATION%H (IN,I)) - CALL DISTRIBUTE_STATION(TSTATION%LE (IN,I)) - CALL DISTRIBUTE_STATION(TSTATION%LEI (IN,I)) - CALL DISTRIBUTE_STATION(TSTATION%GFLUX (IN,I)) - IF (CRAD /= 'NONE') THEN - CALL DISTRIBUTE_STATION(TSTATION%SWD (IN,I)) - CALL DISTRIBUTE_STATION(TSTATION%SWU (IN,I)) - CALL DISTRIBUTE_STATION(TSTATION%LWD (IN,I)) - CALL DISTRIBUTE_STATION(TSTATION%LWU (IN,I)) - CALL DISTRIBUTE_STATION(TSTATION%SWDIR (IN,I)) - CALL DISTRIBUTE_STATION(TSTATION%SWDIFF (IN,I)) - CALL DISTRIBUTE_STATION(TSTATION%DSTAOD (IN,I)) - END IF - CALL DISTRIBUTE_STATION(TSTATION%SFCO2 (IN,I)) - ENDIF - ! - ENDDO - ! -END IF -! -!---------------------------------------------------------------------------- -!---------------------------------------------------------------------------- -! -CONTAINS -! -!---------------------------------------------------------------------------- -!---------------------------------------------------------------------------- -! -FUNCTION STATION_INTERP_2D(PA) RESULT(PB) -! -REAL, DIMENSION(:,:), INTENT(IN) :: PA -REAL :: PB -! -INTEGER :: JI, JJ -! -IF (SIZE(PA,1)==2) THEN - JI=1 - JJ=1 -ELSEIF (L1D) THEN - JI=2 - JJ=2 -ELSE - JI=II(I) - JJ=IJ(I) -END IF -! -! -IF ((JI .GE. 1).AND. (JI .LE. SIZE(PA,1)) .AND. & - (JJ .GE. 1).AND. (JJ .LE. SIZE(PA,2))) & -PB = (1.-ZYCOEF(I)) * (1.-ZXCOEF(I)) * PA(JI,JJ) + & - (1.-ZYCOEF(I)) * (ZXCOEF(I)) * PA(JI+1,JJ) + & - ( ZYCOEF(I)) * (1.-ZXCOEF(I)) * PA(JI,JJ+1) + & - ( ZYCOEF(I)) * (ZXCOEF(I)) * PA(JI+1,JJ+1) -! -END FUNCTION STATION_INTERP_2D -!---------------------------------------------------------------------------- -!---------------------------------------------------------------------------- -! MODIFS -FUNCTION STATION_INTERP_2D_U(PA) RESULT(PB) -! -REAL, DIMENSION(:,:), INTENT(IN) :: PA -REAL :: PB -! -INTEGER :: JI, JJ -! -IF (SIZE(PA,1)==2) THEN - JI=1 - JJ=1 -ELSEIF (L1D) THEN - JI=2 - JJ=2 -ELSE - JI=IU(I) - JJ=IJ(I) -END IF -! -IF ((JI .GE. 1).AND. (JI .LE. SIZE(PA,1)) .AND. & - (JJ .GE. 1).AND. (JJ .LE. SIZE(PA,2))) & -PB = (1.- ZYCOEF(I)) * (1.-ZUCOEF(I)) * PA(JI ,JJ ) & - + (1.- ZYCOEF(I)) * ( ZUCOEF(I)) * PA(JI+1,JJ ) & - + ( ZYCOEF(I)) * (1.-ZUCOEF(I)) * PA(JI ,JJ+1) & - + ( ZYCOEF(I)) * ( ZUCOEF(I)) * PA(JI+1,JJ+1) -! -END FUNCTION STATION_INTERP_2D_U -!---------------------------------------------------------------------------- -!---------------------------------------------------------------------------- -! MODIFS -FUNCTION STATION_INTERP_2D_V(PA) RESULT(PB) -! -REAL, DIMENSION(:,:), INTENT(IN) :: PA -REAL :: PB -! -INTEGER :: JI, JJ -! -IF (SIZE(PA,1)==2) THEN - JI=1 - JJ=1 -ELSEIF (L1D) THEN - JI=2 - JJ=2 -ELSE - JI=II(I) - JJ=IV(I) -END IF -! -IF ((JI .GT. 0).AND. (JI .LT. SIZE(PA,1)) .AND. & - (JJ .GT. 0).AND. (JJ .LT. SIZE(PA,2))) & -PB = (1.- ZVCOEF(I)) * (1.-ZXCOEF(I)) * PA(JI ,JJ ) & - + (1.- ZVCOEF(I)) * ( ZXCOEF(I)) * PA(JI+1,JJ ) & - + ( ZVCOEF(I)) * (1.-ZXCOEF(I)) * PA(JI ,JJ+1) & - + ( ZVCOEF(I)) * ( ZXCOEF(I)) * PA(JI+1,JJ+1) -! -END FUNCTION STATION_INTERP_2D_V -!---------------------------------------------------------------------------- -!---------------------------------------------------------------------------- -SUBROUTINE DISTRIBUTE_STATION(PAS) -! -REAL, INTENT(INOUT) :: PAS -! -PAS = PAS * ZTHIS_PROCS(I) -CALL REDUCESUM_ll(PAS,IINFO_ll) + + IF (SIZE(PTKE)>0) TSTATIONS(JS)%XTKE(IN) = STATPROF_INTERP_2D( TSTATIONS(JS), PTKE(:,:,JK) ) + IF ( CRAD /= 'NONE' ) TSTATIONS(JS)%XTSRAD(IN) = STATPROF_INTERP_2D( TSTATIONS(JS), PTS ) + TSTATIONS(JS)%XZS = STATPROF_INTERP_2D( TSTATIONS(JS), PZ(:,:,1+JPVEXT)) + + IF ( LDIAG_SURFRAD ) THEN + TSTATIONS(JS)%XZON10M(IN) = STATPROF_INTERP_2D( TSTATIONS(JS), XCURRENT_ZON10M ) + TSTATIONS(JS)%XMER10M(IN) = STATPROF_INTERP_2D( TSTATIONS(JS), XCURRENT_MER10M ) + TSTATIONS(JS)%XT2M (IN) = STATPROF_INTERP_2D( TSTATIONS(JS), XCURRENT_T2M ) + TSTATIONS(JS)%XQ2M (IN) = STATPROF_INTERP_2D( TSTATIONS(JS), XCURRENT_Q2M ) + TSTATIONS(JS)%XHU2M (IN) = STATPROF_INTERP_2D( TSTATIONS(JS), XCURRENT_HU2M ) + TSTATIONS(JS)%XRN (IN) = STATPROF_INTERP_2D( TSTATIONS(JS), XCURRENT_RN ) + TSTATIONS(JS)%XH (IN) = STATPROF_INTERP_2D( TSTATIONS(JS), XCURRENT_H ) + TSTATIONS(JS)%XLE (IN) = STATPROF_INTERP_2D( TSTATIONS(JS), XCURRENT_LE ) + TSTATIONS(JS)%XLEI (IN) = STATPROF_INTERP_2D( TSTATIONS(JS), XCURRENT_LEI ) + TSTATIONS(JS)%XGFLUX (IN) = STATPROF_INTERP_2D( TSTATIONS(JS), XCURRENT_GFLUX ) + IF ( CRAD /= 'NONE' ) THEN + TSTATIONS(JS)%XSWD (IN) = STATPROF_INTERP_2D( TSTATIONS(JS), XCURRENT_SWD ) + TSTATIONS(JS)%XSWU (IN) = STATPROF_INTERP_2D( TSTATIONS(JS), XCURRENT_SWU ) + TSTATIONS(JS)%XLWD (IN) = STATPROF_INTERP_2D( TSTATIONS(JS), XCURRENT_LWD ) + TSTATIONS(JS)%XLWU (IN) = STATPROF_INTERP_2D( TSTATIONS(JS), XCURRENT_LWU ) + TSTATIONS(JS)%XSWDIR (IN) = STATPROF_INTERP_2D( TSTATIONS(JS), XCURRENT_SWDIR ) + TSTATIONS(JS)%XSWDIFF(IN) = STATPROF_INTERP_2D( TSTATIONS(JS), XCURRENT_SWDIFF ) + TSTATIONS(JS)%XDSTAOD(IN) = STATPROF_INTERP_2D( TSTATIONS(JS), XCURRENT_DSTAOD ) + END IF + TSTATIONS(JS)%XSFCO2(IN) = STATPROF_INTERP_2D( TSTATIONS(JS), XCURRENT_SFCO2 ) + END IF +END DO STATION ! -END SUBROUTINE DISTRIBUTE_STATION !---------------------------------------------------------------------------- ! END SUBROUTINE STATION_n diff --git a/src/MNH/statprof_reader.f90 b/src/MNH/statprof_reader.f90 new file mode 100644 index 0000000000000000000000000000000000000000..be9c3d2e269800071670b5c4795e56745290e133 --- /dev/null +++ b/src/MNH/statprof_reader.f90 @@ -0,0 +1,150 @@ +!MNH_LIC Copyright 2020-2022 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 MODE_STATPROF_READER +! ############################ + +IMPLICIT NONE + +PRIVATE + +PUBLIC :: STATPROF_CSV_READ + +INTEGER, PARAMETER :: NMAXLINELGT = 400 + +CONTAINS +!------------------------------------------------------------------- +! +!!**** *STATPROF_CSV_READ* - +!! +!! PURPOSE +!! ------- +!! Prescribe probes through a CSV file +!! +!! AUTHOR +!! ------ +!! E. Jezequel *CNRM & IFPEN* +!! +!! MODIFICATIONS +!! ------------- +!! 03/2020 Original +! P. Wautelet 04/2022: restructure stations/profilers for better performance, reduce memory usage and correct some problems/bugs +!--------------------------------------------------------------- +! +!############################################################### +SUBROUTINE STATPROF_CSV_READ( TPSTATPROF, HFILE, KNUMBSTATPROF ) +!############################################################### + +USE MODD_CONF, ONLY: LCARTESIAN +USE MODD_TYPE_STATPROF, ONLY: TPROFILERDATA, TSTATIONDATA, TSTATPROFDATA + +USE MODE_MSG +USE MODE_STATPROF_TOOLS, ONLY: PROFILER_ADD, STATION_ADD, STATPROF_INI_INTERP, STATPROF_POSITION + +CLASS(TSTATPROFDATA), INTENT(IN) :: TPSTATPROF ! Used only to identify datatype +CHARACTER(LEN=*), INTENT(IN) :: HFILE ! file to read +INTEGER, INTENT(OUT) :: KNUMBSTATPROF ! Total number of stations/profilers (inside physical domain of model) +! +CHARACTER(LEN=NMAXLINELGT) :: YSTRING +INTEGER :: ILU ! logical unit of the file +INTEGER :: INBLINE ! Nb of lines in csv file +LOGICAL :: GINSIDE ! True if station/profiler is inside physical domain of model +LOGICAL :: GPRESENT ! True if station/profiler is present on the current process +TYPE(TSTATIONDATA), TARGET :: TZSTATION +TYPE(TPROFILERDATA), TARGET :: TZPROFILER + +CLASS(TSTATPROFDATA), POINTER :: TZSTATPROF + +SELECT TYPE( TPSTATPROF ) + TYPE IS( TPROFILERDATA ) + TZSTATPROF => TZPROFILER + + TYPE IS( TSTATIONDATA ) + TZSTATPROF => TZSTATION + + CLASS DEFAULT + CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'STATPROF_CSV_READ', 'unknown type for TPSTATPROF' ) +END SELECT + +INBLINE = 0 !Number of stations/profilers found in the file +KNUMBSTATPROF = 0 !Number of stations/profilers found in the file AND inside the model domain + +! Open file +OPEN( NEWUNIT = ILU, FILE = HFILE, FORM = 'formatted' ) + +READ( ILU, END = 101, FMT = '(A)' ) YSTRING ! Reading of header (skip it) + +DO + ! Read station/profiler coordinates + READ( ILU, END = 101, FMT = '(A)' ) YSTRING + + ! Check if record is written in French convention + CALL FRENCH_TO_ENGLISH( YSTRING ) + + IF ( LCARTESIAN ) THEN + READ( YSTRING, * ) TZSTATPROF%CNAME, TZSTATPROF%XX, TZSTATPROF%XY, TZSTATPROF%XZ + ELSE + READ( YSTRING, * ) TZSTATPROF%CNAME, TZSTATPROF%XLAT, TZSTATPROF%XLON, TZSTATPROF%XZ + END IF + + IF ( .NOT. LCARTESIAN ) CALL STATPROF_INI_INTERP( TZSTATPROF ) + CALL STATPROF_POSITION( TZSTATPROF, GINSIDE, GPRESENT ) + + IF ( GINSIDE ) THEN + KNUMBSTATPROF = KNUMBSTATPROF + 1 + TZSTATPROF%NID = KNUMBSTATPROF + END IF + + IF ( GPRESENT ) THEN + SELECT TYPE( TZSTATPROF ) + TYPE IS( TPROFILERDATA ) + CALL PROFILER_ADD( TZSTATPROF ) + + TYPE IS( TSTATIONDATA ) + CALL STATION_ADD( TZSTATPROF ) + + CLASS DEFAULT + CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'STATPROF_CSV_READ', 'unknown type for TPSTATPROF', OLOCAL = .TRUE. ) + END SELECT + END IF + + INBLINE = INBLINE + 1 +END DO + +101 CONTINUE + +CLOSE( ILU ) + +IF ( INBLINE == 0 ) CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'STATPROF_CSV_READ', 'Data not found in file ' // TRIM( HFILE ) ) + +END SUBROUTINE STATPROF_CSV_READ + +!######################################################### +SUBROUTINE FRENCH_TO_ENGLISH(HSTRING) +CHARACTER(LEN=NMAXLINELGT), INTENT(INOUT) :: HSTRING ! csv record + +INTEGER :: JL +LOGICAL :: GFRENCH +! +GFRENCH = .FALSE. +!* analyses if the record has been written in French convention +! French convention (separator is ; decimal symbol is ,) +! or English convention (separator is , decimal symbol is .) +DO JL = 1, NMAXLINELGT + IF (HSTRING(JL:JL)==';') GFRENCH=.TRUE. +END DO +! +! If French convention is used in the file, transforms it in English convention +IF (GFRENCH) THEN + DO JL = 1, NMAXLINELGT + IF (HSTRING(JL:JL)==',') HSTRING(JL:JL)='.' + IF (HSTRING(JL:JL)==';') HSTRING(JL:JL)=',' + END DO +END IF +! +END SUBROUTINE FRENCH_TO_ENGLISH + +END MODULE MODE_STATPROF_READER diff --git a/src/MNH/statprof_tools.f90 b/src/MNH/statprof_tools.f90 new file mode 100644 index 0000000000000000000000000000000000000000..0d1de4a1616acc850cbc6d264e7ce3fbcb78e9f8 --- /dev/null +++ b/src/MNH/statprof_tools.f90 @@ -0,0 +1,767 @@ +!MNH_LIC Copyright 2002-2022 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. +!----------------------------------------------------------------- +! Authors: +! Misc: some of the code was taken from older subroutines/functions for stations +! P. Wautelet 08/04/2022 +!----------------------------------------------------------------- +! Modifications: +! P. Wautelet 30/09/2022: bugfix: use XUNDEF from SURFEX for surface variables computed by SURFEX +! P. Wautelet 25/11/2022: rewrite STATPROF_INSTANT algorithm (does not depends on model timestep anymore => independent of model) +!----------------------------------------------------------------- +! ################### +MODULE MODE_STATPROF_TOOLS +! ################### + +USE MODD_TYPE_STATPROF, ONLY: TPROFILERDATA, TSTATIONDATA, TSTATPROFDATA, TSTATPROFTIME + +IMPLICIT NONE + +PRIVATE + +PUBLIC :: PROFILER_ALLOCATE, STATION_ALLOCATE +PUBLIC :: STATPROF_INI_INTERP +PUBLIC :: STATPROF_POSITION +PUBLIC :: PROFILER_ADD, STATION_ADD +PUBLIC :: STATPROF_INTERP_2D, STATPROF_INTERP_2D_U, STATPROF_INTERP_2D_V +PUBLIC :: STATPROF_INTERP_3D, STATPROF_INTERP_3D_U, STATPROF_INTERP_3D_V +PUBLIC :: STATPROF_INSTANT + +CONTAINS + +! ################################################ +SUBROUTINE PROFILER_ALLOCATE( TPPROFILER, KSTORE ) +! ################################################ + +! USE MODD_ALLSTATION_n, ONLY: LDIAG_SURFRAD + USE MODD_CONF_n, ONLY: NRR + USE MODD_DIAG_IN_RUN, ONLY: LDIAG_IN_RUN + USE MODD_DIM_n, ONLY: NKMAX + USE MODD_NSV, ONLY: NSV + USE MODD_PARAMETERS, ONLY: JPVEXT, XUNDEF + USE MODD_PARAM_n, ONLY: CCLOUD, CRAD, CTURB + USE MODD_RADIATIONS_n, ONLY: NAER + USE MODD_SURF_PAR, ONLY: XUNDEF_SFX => XUNDEF + + IMPLICIT NONE + + TYPE(TPROFILERDATA), INTENT(INOUT) :: TPPROFILER + INTEGER, INTENT(IN) :: KSTORE ! number of moments to store + + INTEGER :: IKU + + IKU = NKMAX + 2 * JPVEXT + ALLOCATE( TPPROFILER%XZON (KSTORE, IKU) ) + ALLOCATE( TPPROFILER%XMER (KSTORE, IKU) ) + ALLOCATE( TPPROFILER%XFF (KSTORE, IKU) ) + ALLOCATE( TPPROFILER%XDD (KSTORE, IKU) ) + ALLOCATE( TPPROFILER%XW (KSTORE, IKU) ) + ALLOCATE( TPPROFILER%XP (KSTORE, IKU) ) + ALLOCATE( TPPROFILER%XZZ (KSTORE, IKU) ) + IF ( CTURB == 'TKEL' ) THEN + ALLOCATE( TPPROFILER%XTKE (KSTORE, IKU) ) + ELSE + ALLOCATE( TPPROFILER%XTKE (0, 0) ) + END IF + ALLOCATE( TPPROFILER%XTH (KSTORE, IKU) ) + ALLOCATE( TPPROFILER%XTHV (KSTORE, IKU) ) + IF ( CCLOUD == 'C2R2' .OR. CCLOUD == 'KHKO' ) THEN + ALLOCATE( TPPROFILER%XVISIGUL (KSTORE, IKU) ) + ELSE + ALLOCATE( TPPROFILER%XVISIGUL (0, 0) ) + END IF + IF ( CCLOUD /= 'NONE' .AND. CCLOUD /= 'REVE' ) THEN + ALLOCATE( TPPROFILER%XVISIKUN (KSTORE, IKU) ) + ELSE + ALLOCATE( TPPROFILER%XVISIKUN (0, 0) ) + END IF + ALLOCATE( TPPROFILER%XCRARE (KSTORE, IKU) ) + ALLOCATE( TPPROFILER%XCRARE_ATT(KSTORE, IKU) ) + IF ( CCLOUD == 'ICE3' .OR. CCLOUD == 'ICE4' ) THEN + ALLOCATE( TPPROFILER%XCIZ (KSTORE, IKU) ) + ELSE + ALLOCATE( TPPROFILER%XCIZ (0, 0) ) + END IF + ALLOCATE( TPPROFILER%XLWCZ (KSTORE, IKU) ) + ALLOCATE( TPPROFILER%XIWCZ (KSTORE, IKU) ) + ALLOCATE( TPPROFILER%XRHOD (KSTORE, IKU) ) + ALLOCATE( TPPROFILER%XR (KSTORE, IKU, NRR) ) + ALLOCATE( TPPROFILER%XSV (KSTORE, IKU, NSV) ) + ALLOCATE( TPPROFILER%XAER (KSTORE, IKU, NAER) ) + + ALLOCATE( TPPROFILER%XIWV(KSTORE) ) + ALLOCATE( TPPROFILER%XZTD(KSTORE) ) + ALLOCATE( TPPROFILER%XZWD(KSTORE) ) + ALLOCATE( TPPROFILER%XZHD(KSTORE) ) + +! IF ( LDIAG_IN_RUN ) THEN + ALLOCATE( TPPROFILER%XT2M (KSTORE) ) + ALLOCATE( TPPROFILER%XQ2M (KSTORE) ) + ALLOCATE( TPPROFILER%XHU2M (KSTORE) ) + ALLOCATE( TPPROFILER%XZON10M(KSTORE) ) + ALLOCATE( TPPROFILER%XMER10M(KSTORE) ) + ALLOCATE( TPPROFILER%XRN (KSTORE) ) + ALLOCATE( TPPROFILER%XH (KSTORE) ) + ALLOCATE( TPPROFILER%XLE (KSTORE) ) + ALLOCATE( TPPROFILER%XLEI (KSTORE) ) + ALLOCATE( TPPROFILER%XGFLUX (KSTORE) ) + IF ( CRAD /= 'NONE' ) THEN + ALLOCATE( TPPROFILER%XSWD (KSTORE) ) + ALLOCATE( TPPROFILER%XSWU (KSTORE) ) + ALLOCATE( TPPROFILER%XLWD (KSTORE) ) + ALLOCATE( TPPROFILER%XLWU (KSTORE) ) + END IF + ALLOCATE( TPPROFILER%XTKE_DISS(KSTORE, IKU) ) +! END IF + + TPPROFILER%XZON (:,:) = XUNDEF + TPPROFILER%XMER (:,:) = XUNDEF + TPPROFILER%XFF (:,:) = XUNDEF + TPPROFILER%XDD (:,:) = XUNDEF + TPPROFILER%XW (:,:) = XUNDEF + TPPROFILER%XP (:,:) = XUNDEF + TPPROFILER%XZZ (:,:) = XUNDEF + IF ( CTURB == 'TKEL' ) TPPROFILER%XTKE(:,:) = XUNDEF + TPPROFILER%XTH (:,:) = XUNDEF + TPPROFILER%XTHV (:,:) = XUNDEF + IF ( CCLOUD == 'C2R2' .OR. CCLOUD == 'KHKO' ) TPPROFILER%XVISIGUL(:,:) = XUNDEF + IF ( CCLOUD /= 'NONE' .AND. CCLOUD /= 'REVE' ) TPPROFILER%XVISIKUN(:,:) = XUNDEF + TPPROFILER%XCRARE (:,:) = XUNDEF + TPPROFILER%XCRARE_ATT(:,:) = XUNDEF + IF ( CCLOUD == 'ICE3' .OR. CCLOUD == 'ICE4' ) TPPROFILER%XCIZ (:,:) = XUNDEF + TPPROFILER%XLWCZ (:,:) = XUNDEF + TPPROFILER%XIWCZ (:,:) = XUNDEF + TPPROFILER%XRHOD (:,:) = XUNDEF + TPPROFILER%XR (:,:,:) = XUNDEF + TPPROFILER%XSV (:,:,:) = XUNDEF + TPPROFILER%XAER (:,:,:) = XUNDEF + + TPPROFILER%XIWV(:) = XUNDEF + TPPROFILER%XZTD(:) = XUNDEF + TPPROFILER%XZWD(:) = XUNDEF + TPPROFILER%XZHD(:) = XUNDEF + +! IF ( LDIAG_IN_RUN ) THEN + TPPROFILER%XT2M (:) = XUNDEF_SFX + TPPROFILER%XQ2M (:) = XUNDEF_SFX + TPPROFILER%XHU2M (:) = XUNDEF_SFX + TPPROFILER%XZON10M(:) = XUNDEF_SFX + TPPROFILER%XMER10M(:) = XUNDEF_SFX + TPPROFILER%XRN (:) = XUNDEF_SFX + TPPROFILER%XH (:) = XUNDEF_SFX + TPPROFILER%XLE (:) = XUNDEF_SFX + TPPROFILER%XLEI (:) = XUNDEF_SFX + TPPROFILER%XGFLUX (:) = XUNDEF_SFX + IF ( CRAD /= 'NONE' ) THEN + TPPROFILER%XSWD (:) = XUNDEF + TPPROFILER%XSWU (:) = XUNDEF + TPPROFILER%XLWD (:) = XUNDEF + TPPROFILER%XLWU (:) = XUNDEF + END IF + TPPROFILER%XTKE_DISS(:,:) = XUNDEF +! END IF + +END SUBROUTINE PROFILER_ALLOCATE + +! ############################################## +SUBROUTINE STATION_ALLOCATE( TPSTATION, KSTORE ) +! ############################################## + + USE MODD_ALLSTATION_n, ONLY: LDIAG_SURFRAD + USE MODD_CONF_n, ONLY: NRR + USE MODD_NSV, ONLY: NSV + USE MODD_PARAMETERS, ONLY: XUNDEF + USE MODD_PARAM_n, ONLY: CRAD, CTURB + USE MODD_SURF_PAR, ONLY: XUNDEF_SFX => XUNDEF + + IMPLICIT NONE + + TYPE(TSTATIONDATA), INTENT(INOUT) :: TPSTATION + INTEGER, INTENT(IN) :: KSTORE ! number of moments to store + + ALLOCATE( TPSTATION%XZON(KSTORE) ) + ALLOCATE( TPSTATION%XMER(KSTORE) ) + ALLOCATE( TPSTATION%XW (KSTORE) ) + ALLOCATE( TPSTATION%XP (KSTORE) ) + IF ( CTURB == 'TKEL' ) THEN + ALLOCATE( TPSTATION%XTKE(KSTORE) ) + ELSE + ALLOCATE( TPSTATION%XTKE(0) ) + END IF + ALLOCATE( TPSTATION%XTH(KSTORE) ) + ALLOCATE( TPSTATION%XR (KSTORE, NRR) ) + ALLOCATE( TPSTATION%XSV(KSTORE, NSV) ) + IF ( CRAD /= 'NONE' ) THEN + ALLOCATE( TPSTATION%XTSRAD(KSTORE) ) + ELSE + ALLOCATE( TPSTATION%XTSRAD(0) ) + END IF + IF ( LDIAG_SURFRAD ) THEN + ALLOCATE( TPSTATION%XT2M (KSTORE) ) + ALLOCATE( TPSTATION%XQ2M (KSTORE) ) + ALLOCATE( TPSTATION%XHU2M (KSTORE) ) + ALLOCATE( TPSTATION%XZON10M(KSTORE) ) + ALLOCATE( TPSTATION%XMER10M(KSTORE) ) + ALLOCATE( TPSTATION%XRN (KSTORE) ) + ALLOCATE( TPSTATION%XH (KSTORE) ) + ALLOCATE( TPSTATION%XLE (KSTORE) ) + ALLOCATE( TPSTATION%XLEI (KSTORE) ) + ALLOCATE( TPSTATION%XGFLUX (KSTORE) ) + IF ( CRAD /= 'NONE' ) THEN + ALLOCATE( TPSTATION%XSWD (KSTORE) ) + ALLOCATE( TPSTATION%XSWU (KSTORE) ) + ALLOCATE( TPSTATION%XLWD (KSTORE) ) + ALLOCATE( TPSTATION%XLWU (KSTORE) ) + ALLOCATE( TPSTATION%XSWDIR (KSTORE) ) + ALLOCATE( TPSTATION%XSWDIFF(KSTORE) ) + ALLOCATE( TPSTATION%XDSTAOD(KSTORE) ) + END IF + ALLOCATE( TPSTATION%XSFCO2(KSTORE) ) + END IF + + TPSTATION%XZON(:) = XUNDEF + TPSTATION%XMER(:) = XUNDEF + TPSTATION%XW(:) = XUNDEF + TPSTATION%XP(:) = XUNDEF + TPSTATION%XTKE(:) = XUNDEF + TPSTATION%XTH(:) = XUNDEF + TPSTATION%XR(:,:) = XUNDEF + TPSTATION%XSV(:,:) = XUNDEF + TPSTATION%XTSRAD(:) = XUNDEF + IF ( LDIAG_SURFRAD ) THEN + TPSTATION%XT2M(:) = XUNDEF_SFX + TPSTATION%XQ2M(:) = XUNDEF_SFX + TPSTATION%XHU2M(:) = XUNDEF_SFX + TPSTATION%XZON10M(:) = XUNDEF_SFX + TPSTATION%XMER10M(:) = XUNDEF_SFX + TPSTATION%XRN(:) = XUNDEF_SFX + TPSTATION%XH(:) = XUNDEF_SFX + TPSTATION%XLE(:) = XUNDEF_SFX + TPSTATION%XLEI(:) = XUNDEF_SFX + TPSTATION%XGFLUX(:) = XUNDEF_SFX + IF ( CRAD /= 'NONE' ) THEN + TPSTATION%XSWD(:) = XUNDEF + TPSTATION%XSWU(:) = XUNDEF + TPSTATION%XLWD(:) = XUNDEF + TPSTATION%XLWU(:) = XUNDEF + TPSTATION%XSWDIR(:) = XUNDEF + TPSTATION%XSWDIFF(:) = XUNDEF + TPSTATION%XDSTAOD(:) = XUNDEF + END IF + TPSTATION%XSFCO2(:) = XUNDEF_SFX + END IF + +END SUBROUTINE STATION_ALLOCATE + +! ########################################## +SUBROUTINE STATPROF_INI_INTERP( TPSTATPROF ) +! ########################################## + + USE MODD_GRID, ONLY: XLATORI, XLONORI + USE MODD_PARAMETERS, ONLY: XUNDEF + + USE MODE_GRIDPROJ, ONLY: SM_XYHAT + USE MODE_MSG + + IMPLICIT NONE + + CLASS(TSTATPROFDATA), INTENT(INOUT) :: TPSTATPROF + + IF ( TPSTATPROF%XLAT == XUNDEF .OR. TPSTATPROF%XLON == XUNDEF ) THEN + CMNHMSG(1) = 'Error in station or profiler position' + CMNHMSG(2) = 'either LATitude or LONgitude segment' + CMNHMSG(3) = 'or I and J segment' + CMNHMSG(4) = 'definition is not complete.' + CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'STATPROF_INI_INTERP' ) + END IF + + CALL SM_XYHAT( XLATORI, XLONORI, & + TPSTATPROF%XLAT, TPSTATPROF%XLON, & + TPSTATPROF%XX, TPSTATPROF%XY ) + +END SUBROUTINE STATPROF_INI_INTERP + +! ########################################################### +SUBROUTINE STATPROF_POSITION( TPSTATPROF, OINSIDE, OPRESENT ) +! ########################################################### +! Subroutine to determine the position of a station/profiler on the model grid +! and set the useful coefficients for data interpolation + + USE MODD_CONF, ONLY: L1D + USE MODD_GRID_n, ONLY: NPHYS_XMIN, NPHYS_XMAX, NPHYS_YMIN, NPHYS_YMAX, XHAT_BOUND, XHATM_BOUND, & + XXHAT, XYHAT, XXHATM, XYHATM, XZZ + USE MODD_PARAMETERS, ONLY: JPHEXT, JPVEXT + + USE MODE_MSG + USE MODE_NEST_LL, ONLY: GET_MODEL_NUMBER_ll + USE MODE_TOOLS_ll, ONLY: GET_INDICE_ll + + IMPLICIT NONE + + CLASS(TSTATPROFDATA), INTENT(INOUT) :: TPSTATPROF + LOGICAL, INTENT(OUT) :: OINSIDE ! True if station/profiler is inside physical domain of model + LOGICAL, INTENT(OUT) :: OPRESENT ! True if station/profiler is present on the current process + + INTEGER :: IIB ! domain sizes of current process + INTEGER :: IJB ! + INTEGER :: IIE ! + INTEGER :: IJE ! + INTEGER :: IMI + INTEGER :: JK + REAL :: ZLOW, ZHIGH + + OPRESENT = .FALSE. + OINSIDE = .FALSE. + + CALL GET_INDICE_ll( IIB, IJB, IIE, IJE ) + + IF ( TPSTATPROF%XX >= XHAT_BOUND(NPHYS_XMIN) .AND. TPSTATPROF%XX <= XHAT_BOUND(NPHYS_XMAX) & + .AND. TPSTATPROF%XY >= XHAT_BOUND(NPHYS_YMIN) .AND. TPSTATPROF%XY <= XHAT_BOUND(NPHYS_YMAX) ) THEN + OINSIDE = .TRUE. + ELSE + CALL GET_MODEL_NUMBER_ll(IMI) + WRITE( CMNHMSG(1), "( 'station or profiler ', A, ' is outside of physical domain of model', I3 )" ) TRIM(TPSTATPROF%CNAME), IMI + CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'STATPROF_POSITION' ) + END IF + + ! X position + TPSTATPROF%NI_U = COUNT( XXHAT (:) <= TPSTATPROF%XX ) + TPSTATPROF%NI_M = COUNT( XXHATM(:) <= TPSTATPROF%XX ) + + ! Y position + TPSTATPROF%NJ_V = COUNT( XYHAT (:) <= TPSTATPROF%XY ) + TPSTATPROF%NJ_M = COUNT( XYHATM(:) <= TPSTATPROF%XY ) + + ! Position of station/profiler according to process + IF ( TPSTATPROF%NI_U >= IIB .AND. TPSTATPROF%NI_U <= IIE & + .AND. TPSTATPROF%NJ_V >= IJB .AND. TPSTATPROF%NJ_V <= IJE ) OPRESENT = .TRUE. + IF ( L1D ) OPRESENT = .TRUE. + + ! Check if station/profiler is too near of physical domain border (outside of physical domain for mass points) + IF ( OINSIDE .AND. .NOT. L1D ) THEN + IF ( TPSTATPROF%XX < XHATM_BOUND(NPHYS_XMIN) .OR. TPSTATPROF%XX > XHATM_BOUND(NPHYS_XMAX) & + .OR. TPSTATPROF%XY < XHATM_BOUND(NPHYS_YMIN) .OR. TPSTATPROF%XY > XHATM_BOUND(NPHYS_YMAX) ) THEN + CALL GET_MODEL_NUMBER_ll(IMI) + WRITE( CMNHMSG(1), "( 'station or profiler ', A, ' is outside of mass-points physical domain of model', I3 )" ) & + TRIM(TPSTATPROF%CNAME), IMI + CMNHMSG(2) = 'but is inside of flux-points physical domain.' + CMNHMSG(3) = 'Meaning: station or profiler is too close to the boundaries of physical domain.' + CMNHMSG(4) = '=> station or profiler disabled (not computed)' + CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'STATPROF_POSITION' ) + OPRESENT = .FALSE. + OINSIDE = .FALSE. + END IF + END IF + + ! Computations only on correct process + IF ( OPRESENT .AND. .NOT. L1D ) THEN + ! Interpolation coefficient for X (mass-point) + TPSTATPROF%XXMCOEF = ( TPSTATPROF%XX - XXHATM(TPSTATPROF%NI_M) ) / ( XXHATM(TPSTATPROF%NI_M+1) - XXHATM(TPSTATPROF%NI_M) ) + ! Interpolation coefficient for Y (mass-point) + TPSTATPROF%XYMCOEF = ( TPSTATPROF%XY - XYHATM(TPSTATPROF%NJ_M) ) / ( XYHATM(TPSTATPROF%NJ_M+1) - XYHATM(TPSTATPROF%NJ_M) ) + ! Interpolation coefficient for X (U-point) + TPSTATPROF%XXUCOEF = ( TPSTATPROF%XX - XXHAT(TPSTATPROF%NI_U) ) / ( XXHAT(TPSTATPROF%NI_U+1) - XXHAT(TPSTATPROF%NI_U) ) + ! Interpolation coefficient for Y (V-point) + TPSTATPROF%XYVCOEF = ( TPSTATPROF%XY - XYHAT(TPSTATPROF%NJ_V) ) / ( XYHAT(TPSTATPROF%NJ_V+1) - XYHAT(TPSTATPROF%NJ_V) ) + END IF + + IF ( OPRESENT ) THEN + SELECT TYPE( TPSTATPROF ) + TYPE IS( TPROFILERDATA ) + ! Nothing to do + + TYPE IS( TSTATIONDATA ) + ! The closest K-level to the station altitude is chosen + JK = JPVEXT + 1 + DO WHILE ( ( STATPROF_INTERP_2D( TPSTATPROF, XZZ(:,:,JK) ) - STATPROF_INTERP_2D( TPSTATPROF, XZZ(:,:,JPVEXT+1) ) ) & + < TPSTATPROF%XZ) + JK = JK + 1 + END DO + ZLOW = STATPROF_INTERP_2D( TPSTATPROF, XZZ(:,:,JK-1) ) - STATPROF_INTERP_2D( TPSTATPROF, XZZ(:,:,JPVEXT+1) ) + ZHIGH = STATPROF_INTERP_2D( TPSTATPROF, XZZ(:,:,JK ) ) - STATPROF_INTERP_2D( TPSTATPROF, XZZ(:,:,JPVEXT+1) ) + !If the station/profiler is nearer from the lower level, select it + IF ( ( ZHIGH - TPSTATPROF%XZ ) > ( TPSTATPROF%XZ - ZLOW ) ) JK = JK - 1 + TPSTATPROF%NK = JK + + CLASS DEFAULT + CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'STATPROF_POSITION', 'unknown type for TPSTATPROF', OLOCAL = .TRUE. ) + END SELECT + END IF + +END SUBROUTINE STATPROF_POSITION + +! ################################### +SUBROUTINE PROFILER_ADD( TPPROFILER ) +! ################################### +! Subroutine to add a station to the local list of profilers + USE MODD_PROFILER_n, ONLY: NUMBPROFILER_LOC, TPROFILERS + + IMPLICIT NONE + + CLASS(TSTATPROFDATA), INTENT(IN) :: TPPROFILER + + INTEGER :: JS + TYPE(TPROFILERDATA), DIMENSION(:), POINTER :: TZPROFILERS + + NUMBPROFILER_LOC = NUMBPROFILER_LOC + 1 + + ALLOCATE( TZPROFILERS( NUMBPROFILER_LOC ) ) + DO JS = 1, NUMBPROFILER_LOC - 1 + TZPROFILERS(JS) = TPROFILERS(JS) + END DO + + !Copy fields available in TSTATPROFDATA + !other fields are not yet set + TZPROFILERS(NUMBPROFILER_LOC)%CNAME = TPPROFILER%CNAME + TZPROFILERS(NUMBPROFILER_LOC)%NID = TPPROFILER%NID + TZPROFILERS(NUMBPROFILER_LOC)%XX = TPPROFILER%XX + TZPROFILERS(NUMBPROFILER_LOC)%XY = TPPROFILER%XY + TZPROFILERS(NUMBPROFILER_LOC)%XZ = TPPROFILER%XZ + TZPROFILERS(NUMBPROFILER_LOC)%XLON = TPPROFILER%XLON + TZPROFILERS(NUMBPROFILER_LOC)%XLAT = TPPROFILER%XLAT + TZPROFILERS(NUMBPROFILER_LOC)%NI_M = TPPROFILER%NI_M + TZPROFILERS(NUMBPROFILER_LOC)%NJ_M = TPPROFILER%NJ_M + TZPROFILERS(NUMBPROFILER_LOC)%NI_U = TPPROFILER%NI_U + TZPROFILERS(NUMBPROFILER_LOC)%NJ_V = TPPROFILER%NJ_V + TZPROFILERS(NUMBPROFILER_LOC)%XXMCOEF = TPPROFILER%XXMCOEF + TZPROFILERS(NUMBPROFILER_LOC)%XYMCOEF = TPPROFILER%XYMCOEF + TZPROFILERS(NUMBPROFILER_LOC)%XXUCOEF = TPPROFILER%XXUCOEF + TZPROFILERS(NUMBPROFILER_LOC)%XYVCOEF = TPPROFILER%XYVCOEF + + IF ( ASSOCIATED( TPROFILERS ) ) DEALLOCATE( TPROFILERS ) !Can be done without memory leak because allocatable arrays were + !not yet allocated (will be done in PROFILER_ALLOCATE) + TPROFILERS => TZPROFILERS + +END SUBROUTINE PROFILER_ADD + +! ################################# +SUBROUTINE STATION_ADD( TPSTATION ) +! ################################# +! Subroutine to add a station to the local list of stations + USE MODD_STATION_n, ONLY: NUMBSTAT_LOC, TSTATIONS + + IMPLICIT NONE + + CLASS(TSTATPROFDATA), INTENT(IN) :: TPSTATION + + INTEGER :: JS + TYPE(TSTATIONDATA), DIMENSION(:), POINTER :: TZSTATIONS + + NUMBSTAT_LOC = NUMBSTAT_LOC + 1 + + ALLOCATE( TZSTATIONS( NUMBSTAT_LOC ) ) + DO JS = 1, NUMBSTAT_LOC - 1 + TZSTATIONS(JS) = TSTATIONS(JS) + END DO + + !Copy fields available in TSTATPROFDATA + !other fields are not yet set + TZSTATIONS(NUMBSTAT_LOC)%CNAME = TPSTATION%CNAME + TZSTATIONS(NUMBSTAT_LOC)%NID = TPSTATION%NID + TZSTATIONS(NUMBSTAT_LOC)%XX = TPSTATION%XX + TZSTATIONS(NUMBSTAT_LOC)%XY = TPSTATION%XY + TZSTATIONS(NUMBSTAT_LOC)%XZ = TPSTATION%XZ + TZSTATIONS(NUMBSTAT_LOC)%XLON = TPSTATION%XLON + TZSTATIONS(NUMBSTAT_LOC)%XLAT = TPSTATION%XLAT + TZSTATIONS(NUMBSTAT_LOC)%NI_M = TPSTATION%NI_M + TZSTATIONS(NUMBSTAT_LOC)%NJ_M = TPSTATION%NJ_M + TZSTATIONS(NUMBSTAT_LOC)%NI_U = TPSTATION%NI_U + TZSTATIONS(NUMBSTAT_LOC)%NJ_V = TPSTATION%NJ_V + TZSTATIONS(NUMBSTAT_LOC)%XXMCOEF = TPSTATION%XXMCOEF + TZSTATIONS(NUMBSTAT_LOC)%XYMCOEF = TPSTATION%XYMCOEF + TZSTATIONS(NUMBSTAT_LOC)%XXUCOEF = TPSTATION%XXUCOEF + TZSTATIONS(NUMBSTAT_LOC)%XYVCOEF = TPSTATION%XYVCOEF + + IF ( ASSOCIATED( TSTATIONS ) ) DEALLOCATE( TSTATIONS ) !Can be done without memory leak because allocatable arrays were + !not yet allocated (will be done in STATION_ALLOCATE) + TSTATIONS => TZSTATIONS + +END SUBROUTINE STATION_ADD + +! ######################################################## +FUNCTION STATPROF_INTERP_2D( TPSTATPROF, PA ) RESULT( PB ) +! ######################################################## + USE MODD_CONF, ONLY: L1D + USE MODD_PARAMETERS, ONLY: XUNDEF + + USE MODE_MSG + + IMPLICIT NONE + + CLASS(TSTATPROFDATA), INTENT(IN) :: TPSTATPROF + REAL, DIMENSION(:,:), INTENT(IN) :: PA + REAL :: PB + + INTEGER :: JI, JJ + + IF ( SIZE( PA, 1 ) == 2 ) THEN + JI = 1 + JJ = 1 + ELSE IF ( L1D ) THEN + JI = 2 + JJ = 2 + ELSE + JI = TPSTATPROF%NI_M + JJ = TPSTATPROF%NJ_M + END IF + + IF ( JI >= 1 .AND. JI < SIZE( PA, 1 ) & + .AND. JJ >= 1 .AND. JJ < SIZE( PA, 2 ) ) THEN + PB = (1.-TPSTATPROF%XXMCOEF) * (1.-TPSTATPROF%XYMCOEF) * PA(JI, JJ ) + & + ( TPSTATPROF%XXMCOEF) * (1.-TPSTATPROF%XYMCOEF) * PA(JI+1, JJ ) + & + (1.-TPSTATPROF%XXMCOEF) * ( TPSTATPROF%XYMCOEF) * PA(JI, JJ+1) + & + ( TPSTATPROF%XXMCOEF) * ( TPSTATPROF%XYMCOEF) * PA(JI+1, JJ+1) + ELSE + CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'STATPROF_INTERP_2D', 'value can not be interpolated', OLOCAL = .TRUE. ) + PB = XUNDEF + END IF + +END FUNCTION STATPROF_INTERP_2D + +! ########################################################## +FUNCTION STATPROF_INTERP_2D_U( TPSTATPROF, PA ) RESULT( PB ) +! ########################################################## + USE MODD_CONF, ONLY: L1D + USE MODD_PARAMETERS, ONLY: XUNDEF + + USE MODE_MSG + + IMPLICIT NONE + + CLASS(TSTATPROFDATA), INTENT(IN) :: TPSTATPROF + REAL, DIMENSION(:,:), INTENT(IN) :: PA + REAL :: PB + + INTEGER :: JI, JJ + + IF ( SIZE( PA, 1 ) == 2 ) THEN + JI = 1 + JJ = 1 + ELSE IF ( L1D ) THEN + JI = 2 + JJ = 2 + ELSE + JI = TPSTATPROF%NI_U + JJ = TPSTATPROF%NJ_M + END IF + + IF ( JI >= 1 .AND. JI < SIZE( PA, 1 ) & + .AND. JJ >= 1 .AND. JJ < SIZE( PA, 2 ) ) THEN + PB = (1.-TPSTATPROF%XXUCOEF) * (1.-TPSTATPROF%XYMCOEF) * PA(JI, JJ ) + & + ( TPSTATPROF%XXUCOEF) * (1.-TPSTATPROF%XYMCOEF) * PA(JI+1, JJ ) + & + (1.-TPSTATPROF%XXUCOEF) * ( TPSTATPROF%XYMCOEF) * PA(JI, JJ+1) + & + ( TPSTATPROF%XXUCOEF) * ( TPSTATPROF%XYMCOEF) * PA(JI+1, JJ+1) + ELSE + CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'STATPROF_INTERP_2D_U', 'value can not be interpolated', OLOCAL = .TRUE. ) + PB = XUNDEF + END IF + +END FUNCTION STATPROF_INTERP_2D_U + +! ########################################################## +FUNCTION STATPROF_INTERP_2D_V( TPSTATPROF, PA ) RESULT( PB ) +! ########################################################## + USE MODD_CONF, ONLY: L1D + USE MODD_PARAMETERS, ONLY: XUNDEF + + USE MODE_MSG + + IMPLICIT NONE + + CLASS(TSTATPROFDATA), INTENT(IN) :: TPSTATPROF + REAL, DIMENSION(:,:), INTENT(IN) :: PA + REAL :: PB + + INTEGER :: JI, JJ + + IF ( SIZE( PA, 1 ) == 2 ) THEN + JI = 1 + JJ = 1 + ELSE IF ( L1D ) THEN + JI = 2 + JJ = 2 + ELSE + JI = TPSTATPROF%NI_M + JJ = TPSTATPROF%NJ_V + END IF + + IF ( JI >= 1 .AND. JI < SIZE( PA, 1 ) & + .AND. JJ >= 1 .AND. JJ < SIZE( PA, 2 ) ) THEN + PB = (1.-TPSTATPROF%XXMCOEF) * (1.-TPSTATPROF%XYVCOEF) * PA(JI, JJ ) + & + ( TPSTATPROF%XXMCOEF) * (1.-TPSTATPROF%XYVCOEF) * PA(JI+1, JJ ) + & + (1.-TPSTATPROF%XXMCOEF) * ( TPSTATPROF%XYVCOEF) * PA(JI, JJ+1) + & + ( TPSTATPROF%XXMCOEF) * ( TPSTATPROF%XYVCOEF) * PA(JI+1, JJ+1) + ELSE + CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'STATPROF_INTERP_2D_V', 'value can not be interpolated', OLOCAL = .TRUE. ) + PB = XUNDEF + END IF + +END FUNCTION STATPROF_INTERP_2D_V + +! ######################################################## +FUNCTION STATPROF_INTERP_3D( TPSTATPROF, PA ) RESULT( PB ) +! ######################################################## + USE MODD_CONF, ONLY: L1D + USE MODD_PARAMETERS, ONLY: XUNDEF + + USE MODE_MSG + + IMPLICIT NONE + + CLASS(TSTATPROFDATA), INTENT(IN) :: TPSTATPROF + REAL, DIMENSION(:,:,:), INTENT(IN) :: PA + REAL, DIMENSION(SIZE(PA,3)) :: PB + + INTEGER :: JI, JJ, JK + + IF ( SIZE( PA, 1 ) == 2 ) THEN + JI = 1 + JJ = 1 + ELSE IF ( L1D ) THEN + JI = 2 + JJ = 2 + ELSE + JI = TPSTATPROF%NI_M + JJ = TPSTATPROF%NJ_M + END IF + + IF ( JI >= 1 .AND. JI < SIZE( PA, 1 ) & + .AND. JJ >= 1 .AND. JJ < SIZE( PA, 2 ) ) THEN + DO JK = 1, SIZE( PA, 3 ) + IF ( PA(JI, JJ, JK) /= XUNDEF .AND. PA(JI+1, JJ, JK) /= XUNDEF .AND. & + PA(JI, JJ+1, JK) /= XUNDEF .AND. PA(JI+1, JJ+1, JK) /= XUNDEF ) THEN + PB(JK) = (1.-TPSTATPROF%XXMCOEF) * (1.-TPSTATPROF%XYMCOEF) * PA(JI, JJ, JK) + & + ( TPSTATPROF%XXMCOEF) * (1.-TPSTATPROF%XYMCOEF) * PA(JI+1, JJ, JK) + & + (1.-TPSTATPROF%XXMCOEF) * ( TPSTATPROF%XYMCOEF) * PA(JI, JJ+1, JK) + & + ( TPSTATPROF%XXMCOEF) * ( TPSTATPROF%XYMCOEF) * PA(JI+1, JJ+1, JK) + ELSE + PB(JK) = XUNDEF + END IF + END DO + ELSE + CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'STATPROF_INTERP_3D', 'value can not be interpolated', OLOCAL = .TRUE. ) + PB(:) = XUNDEF + END IF + +END FUNCTION STATPROF_INTERP_3D + +! ########################################################## +FUNCTION STATPROF_INTERP_3D_U( TPSTATPROF, PA ) RESULT( PB ) +! ########################################################## + USE MODD_CONF, ONLY: L1D + USE MODD_PARAMETERS, ONLY: XUNDEF + + USE MODE_MSG + + IMPLICIT NONE + + CLASS(TSTATPROFDATA), INTENT(IN) :: TPSTATPROF + REAL, DIMENSION(:,:,:), INTENT(IN) :: PA + REAL, DIMENSION(SIZE(PA,3)) :: PB + + INTEGER :: JI, JJ + + IF ( SIZE( PA, 1 ) == 2 ) THEN + JI = 1 + JJ = 1 + ELSE IF ( L1D ) THEN + JI = 2 + JJ = 2 + ELSE + JI = TPSTATPROF%NI_U + JJ = TPSTATPROF%NJ_M + END IF + + IF ( JI >= 1 .AND. JI < SIZE( PA, 1 ) & + .AND. JJ >= 1 .AND. JJ < SIZE( PA, 2 ) ) THEN + PB(:) = (1.-TPSTATPROF%XXUCOEF) * (1.-TPSTATPROF%XYMCOEF) * PA(JI, JJ, :) + & + ( TPSTATPROF%XXUCOEF) * (1.-TPSTATPROF%XYMCOEF) * PA(JI+1, JJ, :) + & + (1.-TPSTATPROF%XXUCOEF) * ( TPSTATPROF%XYMCOEF) * PA(JI, JJ+1, :) + & + ( TPSTATPROF%XXUCOEF) * ( TPSTATPROF%XYMCOEF) * PA(JI+1, JJ+1, :) + ELSE + CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'STATPROF_INTERP_3D_U', 'value can not be interpolated', OLOCAL = .TRUE. ) + PB = XUNDEF + END IF + +END FUNCTION STATPROF_INTERP_3D_U + +! ########################################################## +FUNCTION STATPROF_INTERP_3D_V( TPSTATPROF, PA ) RESULT( PB ) +! ########################################################## + USE MODD_CONF, ONLY: L1D + USE MODD_PARAMETERS, ONLY: XUNDEF + + USE MODE_MSG + + IMPLICIT NONE + + CLASS(TSTATPROFDATA), INTENT(IN) :: TPSTATPROF + REAL, DIMENSION(:,:,:), INTENT(IN) :: PA + REAL, DIMENSION(SIZE(PA,3)) :: PB + + INTEGER :: JI, JJ + + IF ( SIZE( PA, 1 ) == 2 ) THEN + JI = 1 + JJ = 1 + ELSE IF ( L1D ) THEN + JI = 2 + JJ = 2 + ELSE + JI = TPSTATPROF%NI_M + JJ = TPSTATPROF%NJ_V + END IF + + IF ( JI >= 1 .AND. JI < SIZE( PA, 1 ) & + .AND. JJ >= 1 .AND. JJ < SIZE( PA, 2 ) ) THEN + PB(:) = (1.-TPSTATPROF%XXMCOEF) * (1.-TPSTATPROF%XYVCOEF) * PA(JI, JJ, :) + & + ( TPSTATPROF%XXMCOEF) * (1.-TPSTATPROF%XYVCOEF) * PA(JI+1, JJ, :) + & + (1.-TPSTATPROF%XXMCOEF) * ( TPSTATPROF%XYVCOEF) * PA(JI, JJ+1, :) + & + ( TPSTATPROF%XXMCOEF) * ( TPSTATPROF%XYVCOEF) * PA(JI+1, JJ+1, :) + ELSE + CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'STATPROF_INTERP_3D_V', 'value can not be interpolated', OLOCAL = .TRUE. ) + PB = XUNDEF + END IF + +END FUNCTION STATPROF_INTERP_3D_V + +! ################################################# +SUBROUTINE STATPROF_INSTANT( TPSTATPROF_TIME, KIN ) +! ################################################# + USE MODD_TIME_n, ONLY: TDTCUR + + USE MODE_DATETIME + USE MODE_MSG + + IMPLICIT NONE + + TYPE(TSTATPROFTIME), INTENT(INOUT) :: TPSTATPROF_TIME + INTEGER, INTENT(OUT) :: KIN ! Current step of storage + + IF ( TPSTATPROF_TIME%N_CUR == 0 ) THEN + ! First store + TPSTATPROF_TIME%N_CUR = 1 + TPSTATPROF_TIME%TPDATES(1) = TDTCUR + KIN = 1 + ELSE + IF ( TDTCUR - TPSTATPROF_TIME%TPDATES(TPSTATPROF_TIME%N_CUR) >= TPSTATPROF_TIME%XTSTEP - 1.E-6 ) THEN + TPSTATPROF_TIME%N_CUR = TPSTATPROF_TIME%N_CUR + 1 + KIN = TPSTATPROF_TIME%N_CUR + + IF ( KIN < 1 .OR. KIN > SIZE( TPSTATPROF_TIME%TPDATES ) ) THEN + CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'STATPROF_INSTANT', 'problem with step of storage' ) + KIN = -2 + ELSE + TPSTATPROF_TIME%TPDATES(KIN) = TDTCUR + END IF + ELSE + ! Return an invalid step number + KIN = -1 + END IF + END IF + +END SUBROUTINE STATPROF_INSTANT + +END MODULE MODE_STATPROF_TOOLS diff --git a/src/MNH/surf_rad_modif.f90 b/src/MNH/surf_rad_modif.f90 index a21ce0dc1b934549ae77da4bf3e3ebd704a21394..1cb4f085de74345d4701e2227a760187a1fe14e4 100644 --- a/src/MNH/surf_rad_modif.f90 +++ b/src/MNH/surf_rad_modif.f90 @@ -1,26 +1,23 @@ -!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1995-2022 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 version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. !----------------------------------------------------------------- -!--------------- special set of characters for RCS information -!----------------------------------------------------------------- -! $Source$ $Revision$ -! MASDEV4_7 param 2006/05/18 13:07:25 -!----------------------------------------------------------------- ! ########################## MODULE MODI_SURF_RAD_MODIF ! ########################## ! INTERFACE ! - SUBROUTINE SURF_RAD_MODIF ( PMAP, PXHAT, PYHAT, & - PCOSZEN, PSINZEN, PAZIMSOL,PZS,PZS_XY, & - PDIRFLASWD, PDIRSRFSWD ) + SUBROUTINE SURF_RAD_MODIF ( PMAP, PDXHAT, PDYHAT, PXHATM, PYHATM, & + PCOSZEN, PSINZEN, PAZIMSOL,PZS,PZS_XY, & + PDIRFLASWD, PDIRSRFSWD ) ! REAL, DIMENSION(:,:), INTENT(IN) :: PMAP ! map factor -REAL, DIMENSION(:), INTENT(IN) :: PXHAT ! X coordinate -REAL, DIMENSION(:), INTENT(IN) :: PYHAT ! Y coordinate +REAL, DIMENSION(:), INTENT(IN) :: PDXHAT ! horizontal stretching in x +REAL, DIMENSION(:), INTENT(IN) :: PDYHAT ! horizontal stretching in y +REAL, DIMENSION(:), INTENT(IN) :: PXHATM ! X coordinates at mass points +REAL, DIMENSION(:), INTENT(IN) :: PYHATM ! Y coordinates at mass points REAL, DIMENSION(:,:), INTENT(IN) :: PCOSZEN ! COS(zenithal solar angle) REAL, DIMENSION(:,:), INTENT(IN) :: PSINZEN ! SIN(zenithal solar angle) REAL, DIMENSION(:,:), INTENT(IN) :: PAZIMSOL ! azimuthal solar angle @@ -36,11 +33,11 @@ END INTERFACE ! END MODULE MODI_SURF_RAD_MODIF ! -! ################################################################### - SUBROUTINE SURF_RAD_MODIF ( PMAP, PXHAT, PYHAT, & - PCOSZEN, PSINZEN, PAZIMSOL,PZS,PZS_XY, & - PDIRFLASWD, PDIRSRFSWD ) -! ################################################################### +! #################################################################### + SUBROUTINE SURF_RAD_MODIF ( PMAP, PDXHAT, PDYHAT, PXHATM, PYHATM, & + PCOSZEN, PSINZEN, PAZIMSOL,PZS,PZS_XY, & + PDIRFLASWD, PDIRSRFSWD ) +! #################################################################### ! !!**** * SURF_RAD_MODIF * - computes the modifications to the downwards !! radiative fluxes at the surface, due to @@ -113,8 +110,10 @@ IMPLICIT NONE ! ! REAL, DIMENSION(:,:), INTENT(IN) :: PMAP ! map factor -REAL, DIMENSION(:), INTENT(IN) :: PXHAT ! X coordinate -REAL, DIMENSION(:), INTENT(IN) :: PYHAT ! Y coordinate +REAL, DIMENSION(:), INTENT(IN) :: PDXHAT ! horizontal stretching in x +REAL, DIMENSION(:), INTENT(IN) :: PDYHAT ! horizontal stretching in y +REAL, DIMENSION(:), INTENT(IN) :: PXHATM ! X coordinates at mass points +REAL, DIMENSION(:), INTENT(IN) :: PYHATM ! Y coordinates at mass points REAL, DIMENSION(:,:), INTENT(IN) :: PCOSZEN ! COS(zenithal solar angle) REAL, DIMENSION(:,:), INTENT(IN) :: PSINZEN ! SIN(zenithal solar angle) REAL, DIMENSION(:,:), INTENT(IN) :: PAZIMSOL ! azimuthal solar angle @@ -158,14 +157,14 @@ ISWB = SIZE(PDIRFLASWD,3) !------------------------------------------------------------------------------- ! DO JSWB = 1, ISWB - CALL SURF_SOLAR_SUM (PXHAT, PYHAT, ZMAP, PDIRFLASWD(:,:,JSWB), ZENERGY1(JSWB) ) + CALL SURF_SOLAR_SUM (PDXHAT, PDYHAT, ZMAP, PDIRFLASWD(:,:,JSWB), ZENERGY1(JSWB) ) END DO ! ! !* 2. Slope direction direct SW effects ! --------------------------------- ! -CALL SURF_SOLAR_SLOPES (ZMAP, PXHAT, PYHAT, & +CALL SURF_SOLAR_SLOPES (ZMAP, PDXHAT, PDYHAT, & PCOSZEN, PSINZEN, PAZIMSOL, & PZS, PZS_XY, PDIRFLASWD, ZDIRSWDT ) @@ -173,7 +172,7 @@ CALL SURF_SOLAR_SLOPES (ZMAP, PXHAT, PYHAT, & !* 3. RESOLVED shadows for direct solar radiation ! ------------------------------------------- ! -CALL SURF_SOLAR_SHADOWS (ZMAP, PXHAT, PYHAT, & +CALL SURF_SOLAR_SHADOWS (ZMAP, PXHATM, PYHATM, & PCOSZEN, PSINZEN, PAZIMSOL, & PZS, PZS_XY, ZDIRSWDT, ZDIRSWD) ! @@ -182,11 +181,11 @@ CALL SURF_SOLAR_SHADOWS (ZMAP, PXHAT, PYHAT, & ! ------------------- ! DO JSWB = 1, ISWB - CALL SURF_SOLAR_SUM(PXHAT, PYHAT, ZMAP, & + CALL SURF_SOLAR_SUM(PDXHAT, PDYHAT, ZMAP, & ZDIRSWD(:,:,JSWB), & ZENERGY2(JSWB) ) ! - CALL SURF_SOLAR_SUM(PXHAT, PYHAT, ZMAP, & + CALL SURF_SOLAR_SUM(PDXHAT, PDYHAT, ZMAP, & MAX(ZDIRSWD(:,:,JSWB)-PDIRFLASWD(:,:,JSWB),0.), & ZENERGYP(JSWB) ) ! diff --git a/src/MNH/surf_solar_shadows.f90 b/src/MNH/surf_solar_shadows.f90 index b751989594ce9b2c0975f956fe7d0402802d7114..7d13e34b03b4783cb8ce0d2daf659d75d20c06a7 100644 --- a/src/MNH/surf_solar_shadows.f90 +++ b/src/MNH/surf_solar_shadows.f90 @@ -1,27 +1,22 @@ -!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2002-2022 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 version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. !----------------------------------------------------------------- -!--------------- special set of characters for RCS information -!----------------------------------------------------------------- -! $Source$ $Revision$ -! MASDEV4_7 param 2006/05/18 13:07:25 -!----------------------------------------------------------------- ! ############################## MODULE MODI_SURF_SOLAR_SHADOWS ! ############################## ! INTERFACE ! - SUBROUTINE SURF_SOLAR_SHADOWS ( PMAP, PXHAT, PYHAT, & + SUBROUTINE SURF_SOLAR_SHADOWS ( PMAP, PXHATM, PYHATM, & PCOSZEN, PSINZEN, PAZIMSOL, & PZS, PZS_XY, PDIRSWDT, PDIRSRFSWD ) ! ! REAL, DIMENSION(:,:), INTENT(IN) :: PMAP ! map factor -REAL, DIMENSION(:), INTENT(IN) :: PXHAT ! X coordinate -REAL, DIMENSION(:), INTENT(IN) :: PYHAT ! Y coordinate +REAL, DIMENSION(:), INTENT(IN) :: PXHATM ! X coordinate at mass points +REAL, DIMENSION(:), INTENT(IN) :: PYHATM ! Y coordinate at mass points REAL, DIMENSION(:,:), INTENT(IN) :: PCOSZEN ! COS(zenithal solar angle) REAL, DIMENSION(:,:), INTENT(IN) :: PSINZEN ! SIN(zenithal solar angle) REAL, DIMENSION(:,:), INTENT(IN) :: PAZIMSOL! azimuthal solar angle @@ -39,7 +34,7 @@ END INTERFACE ! END MODULE MODI_SURF_SOLAR_SHADOWS ! ######################################################################### - SUBROUTINE SURF_SOLAR_SHADOWS ( PMAP, PXHAT, PYHAT, & + SUBROUTINE SURF_SOLAR_SHADOWS ( PMAP, PXHATM, PYHATM, & PCOSZEN, PSINZEN, PAZIMSOL, & PZS, PZS_XY, PDIRSWDT, PDIRSRFSWD ) ! ######################################################################### @@ -81,13 +76,14 @@ END MODULE MODI_SURF_SOLAR_SHADOWS !* 0. DECLARATIONS ! ------------ ! -USE MODE_ll ! -USE MODD_PARAMETERS, ONLY : XUNDEF, JPHEXT -USE MODD_CST, ONLY : XPI, XRADIUS USE MODD_CONF, ONLY : LCARTESIAN -USE MODD_SHADOWS_n, ONLY : XZS_ll, XZS_XY_ll, XXHAT_ll, & - XYHAT_ll, XZS_MAX_ll, XZS_MAX_ll +USE MODD_CST, ONLY : XPI, XRADIUS +USE MODD_GRID_n, ONLY : XXHAT_ll, XYHAT_ll +USE MODD_PARAMETERS, ONLY : XUNDEF, JPHEXT +USE MODD_SHADOWS_n, ONLY : XZS_ll, XZS_XY_ll, XZS_MAX_ll, XZS_MAX_ll +! +USE MODE_ll ! IMPLICIT NONE ! @@ -95,8 +91,8 @@ IMPLICIT NONE ! ! REAL, DIMENSION(:,:), INTENT(IN) :: PMAP ! map factor -REAL, DIMENSION(:), INTENT(IN) :: PXHAT ! X coordinate -REAL, DIMENSION(:), INTENT(IN) :: PYHAT ! Y coordinate +REAL, DIMENSION(:), INTENT(IN) :: PXHATM ! X coordinate at mass points +REAL, DIMENSION(:), INTENT(IN) :: PYHATM ! Y coordinate at mass points REAL, DIMENSION(:,:), INTENT(IN) :: PCOSZEN ! COS(zenithal solar angle) REAL, DIMENSION(:,:), INTENT(IN) :: PSINZEN ! SIN(zenithal solar angle) REAL, DIMENSION(:,:), INTENT(IN) :: PAZIMSOL! azimuthal solar angle @@ -231,20 +227,20 @@ DO JJ=IJB,IJE ! SELECT CASE (JT) CASE (1) - ZX=(5.*PXHAT(JI)+PXHAT(JI+1))/6. - ZY=0.5*(PYHAT(JJ)+PYHAT(JJ+1)) + ZX=PXHATM(JI)/6. + ZY=PYHATM(JJ) ZZ=(PZS(JI,JJ)+PZS_XY(JI,JJ)+PZS_XY(JI,JJ+1))/3. CASE (2) - ZX=0.5*(PXHAT(JI)+PXHAT(JI+1)) - ZY=(5.*PYHAT(JJ+1)+PYHAT(JJ))/6. + ZX=PXHATM(JI) + ZY=PYHATM(JJ)/6. ZZ=(PZS(JI,JJ)+PZS_XY(JI,JJ+1)+PZS_XY(JI+1,JJ+1))/3. CASE (3) - ZX=(5.*PXHAT(JI+1)+PXHAT(JI))/6. - ZY=0.5*(PYHAT(JJ)+PYHAT(JJ+1)) + ZX=PXHATM(JI)/6. + ZY=PYHATM(JJ) ZZ=(PZS(JI,JJ)+PZS_XY(JI+1,JJ)+PZS_XY(JI+1,JJ+1))/3. CASE (4) - ZX=0.5*(PXHAT(JI)+PXHAT(JI+1)) - ZY=(5.*PYHAT(JJ)+PYHAT(JJ+1))/6. + ZX=PXHATM(JI) + ZY=PYHATM(JJ)/6. ZZ=(PZS(JI,JJ)+PZS_XY(JI,JJ)+PZS_XY(JI+1,JJ))/3. END SELECT ! diff --git a/src/MNH/surf_solar_slopes.f90 b/src/MNH/surf_solar_slopes.f90 index e7ea4ef2284690164c6c4c0679c8621f245ec5dd..0ffcf81e32e18b4cceb8cc16350224eed428d22d 100644 --- a/src/MNH/surf_solar_slopes.f90 +++ b/src/MNH/surf_solar_slopes.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2002-2019 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2002-2022 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. @@ -9,14 +9,14 @@ ! INTERFACE ! - SUBROUTINE SURF_SOLAR_SLOPES ( PMAP, PXHAT, PYHAT, & + SUBROUTINE SURF_SOLAR_SLOPES ( PMAP, PDXHAT, PDYHAT, & PCOSZEN, PSINZEN, PAZIMSOL, & PZS, PZS_XY, PDIRSRFSWD, PDIRSWDT ) ! ! REAL, DIMENSION(:,:), INTENT(IN) :: PMAP ! map factor -REAL, DIMENSION(:), INTENT(IN) :: PXHAT ! X coordinate -REAL, DIMENSION(:), INTENT(IN) :: PYHAT ! Y coordinate +REAL, DIMENSION(:), INTENT(IN) :: PDXHAT ! horizontal stretching in x +REAL, DIMENSION(:), INTENT(IN) :: PDYHAT ! horizontal stretching in y REAL, DIMENSION(:,:), INTENT(IN) :: PCOSZEN ! COS(zenithal solar angle) REAL, DIMENSION(:,:), INTENT(IN) :: PSINZEN ! SIN(zenithal solar angle) REAL, DIMENSION(:,:), INTENT(IN) :: PAZIMSOL! azimuthal solar angle @@ -34,7 +34,7 @@ END INTERFACE ! END MODULE MODI_SURF_SOLAR_SLOPES ! ######################################################################### - SUBROUTINE SURF_SOLAR_SLOPES ( PMAP, PXHAT, PYHAT, & + SUBROUTINE SURF_SOLAR_SLOPES ( PMAP, PDXHAT, PDYHAT, & PCOSZEN, PSINZEN, PAZIMSOL, & PZS, PZS_XY, PDIRSRFSWD, PDIRSWDT ) ! ######################################################################### @@ -86,8 +86,8 @@ IMPLICIT NONE ! ! REAL, DIMENSION(:,:), INTENT(IN) :: PMAP ! map factor -REAL, DIMENSION(:), INTENT(IN) :: PXHAT ! X coordinate -REAL, DIMENSION(:), INTENT(IN) :: PYHAT ! Y coordinate +REAL, DIMENSION(:), INTENT(IN) :: PDXHAT ! horizontal stretching in x +REAL, DIMENSION(:), INTENT(IN) :: PDYHAT ! horizontal stretching in y REAL, DIMENSION(:,:), INTENT(IN) :: PCOSZEN ! COS(zenithal solar angle) REAL, DIMENSION(:,:), INTENT(IN) :: PSINZEN ! SIN(zenithal solar angle) REAL, DIMENSION(:,:), INTENT(IN) :: PAZIMSOL! azimuthal solar angle @@ -144,27 +144,27 @@ DO JT=1,4 CASE (1) ZDZSDX=( 2.* PZS (JI,JJ) & - (PZS_XY(JI,JJ)+PZS_XY(JI,JJ+1)) ) & - / (PXHAT(JI+1)-PXHAT(JI)) * PMAP(JI,JJ) + / PDXHAT(JI) * PMAP(JI,JJ) ZDZSDY=( PZS_XY(JI,JJ+1) - PZS_XY(JI,JJ) ) & - / (PYHAT(JJ+1)-PYHAT(JJ)) * PMAP(JI,JJ) + / PDYHAT(JJ) * PMAP(JI,JJ) CASE (2) ZDZSDX=( PZS_XY(JI+1,JJ+1) -PZS_XY(JI,JJ+1)) & - / (PXHAT(JI+1)-PXHAT(JI)) * PMAP(JI,JJ) + / PDXHAT(JI) * PMAP(JI,JJ) ZDZSDY=( (PZS_XY(JI+1,JJ+1)+PZS_XY(JI,JJ+1)) & - 2.* PZS (JI,JJ) ) & - / (PYHAT(JJ+1)-PYHAT(JJ)) * PMAP(JI,JJ) + / PDYHAT(JJ) * PMAP(JI,JJ) CASE (3) ZDZSDX=( (PZS_XY(JI+1,JJ)+PZS_XY(JI+1,JJ+1)) & - 2.* PZS(JI,JJ) ) & - / (PXHAT(JI+1)-PXHAT(JI)) * PMAP(JI,JJ) + / PDXHAT(JI) * PMAP(JI,JJ) ZDZSDY=( PZS_XY(JI+1,JJ+1) - PZS_XY(JI+1,JJ) ) & - / (PYHAT(JJ+1)-PYHAT(JJ)) * PMAP(JI,JJ) + / PDYHAT(JJ) * PMAP(JI,JJ) CASE (4) ZDZSDX=( PZS_XY(JI+1,JJ) - PZS_XY(JI,JJ) ) & - / (PXHAT(JI+1)-PXHAT(JI)) * PMAP(JI,JJ) + / PDXHAT(JI) * PMAP(JI,JJ) ZDZSDY=( 2.* PZS(JI,JJ) & - (PZS_XY(JI+1,JJ)+PZS_XY(JI,JJ)) ) & - / (PYHAT(JJ+1)-PYHAT(JJ)) * PMAP(JI,JJ) + / PDYHAT(JJ) * PMAP(JI,JJ) END SELECT ! !* slope angles diff --git a/src/MNH/surf_solar_sum.f90 b/src/MNH/surf_solar_sum.f90 index 3742792d5b0f261dfc6af9f88d7f71ee10c3de0a..11295f83a009955f5752b047d49f531b47609f10 100644 --- a/src/MNH/surf_solar_sum.f90 +++ b/src/MNH/surf_solar_sum.f90 @@ -1,24 +1,19 @@ -!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2002-2022 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 version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. !----------------------------------------------------------------- -!--------------- special set of characters for RCS information -!----------------------------------------------------------------- -! $Source$ $Revision$ -! MASDEV4_7 param 2006/05/18 13:07:25 -!----------------------------------------------------------------- ! ########################## MODULE MODI_SURF_SOLAR_SUM ! ########################## ! INTERFACE ! - SUBROUTINE SURF_SOLAR_SUM ( PXHAT, PYHAT, PMAP, PDIRSWD, PENERGY ) + SUBROUTINE SURF_SOLAR_SUM ( PDXHAT, PDYHAT, PMAP, PDIRSWD, PENERGY ) ! ! -REAL, DIMENSION(:), INTENT(IN) :: PXHAT ! X coordinate -REAL, DIMENSION(:), INTENT(IN) :: PYHAT ! Y coordinate +REAL, DIMENSION(:), INTENT(IN) :: PDXHAT ! horizontal stretching in x +REAL, DIMENSION(:), INTENT(IN) :: PDYHAT ! horizontal stretching in y REAL, DIMENSION(:,:), INTENT(IN) :: PMAP ! map factor REAL, DIMENSION(:,:), INTENT(IN) :: PDIRSWD ! direct SW flux on hor. surf. REAL, INTENT(OUT):: PENERGY ! energy received by the surface @@ -30,9 +25,9 @@ END INTERFACE ! END MODULE MODI_SURF_SOLAR_SUM ! -! ################################################################## - SUBROUTINE SURF_SOLAR_SUM ( PXHAT, PYHAT, PMAP, PDIRSWD, PENERGY ) -! ################################################################## +! #################################################################### + SUBROUTINE SURF_SOLAR_SUM ( PDXHAT, PDYHAT, PMAP, PDIRSWD, PENERGY ) +! #################################################################### ! !!**** * SURF_SOLAR_SUM * - computes the sum of energy received by !! the surface from direct solar radiation @@ -78,8 +73,8 @@ IMPLICIT NONE !* 0.1 DECLARATIONS OF DUMMY ARGUMENTS : ! ! -REAL, DIMENSION(:), INTENT(IN) :: PXHAT ! X coordinate -REAL, DIMENSION(:), INTENT(IN) :: PYHAT ! Y coordinate +REAL, DIMENSION(:), INTENT(IN) :: PDXHAT ! horizontal stretching in x +REAL, DIMENSION(:), INTENT(IN) :: PDYHAT ! horizontal stretching in y REAL, DIMENSION(:,:), INTENT(IN) :: PMAP ! map factor REAL, DIMENSION(:,:), INTENT(IN) :: PDIRSWD ! direct SW flux on hor. surf. REAL, INTENT(OUT):: PENERGY ! energy received by the surface @@ -109,9 +104,7 @@ ALLOCATE(ZENERGY_2D(IIB:IIE,IJB:IJE)) ! DO JJ=IJB,IJE DO JI=IIB,IIE - ZENERGY_2D(JI,JJ) = PDIRSWD(JI,JJ)*(PXHAT(JI+1)-PXHAT(JI)) & - *(PYHAT(JJ+1)-PYHAT(JJ)) & - /PMAP(JI,JJ)**2 + ZENERGY_2D(JI,JJ) = PDIRSWD(JI,JJ) * PDXHAT(JI) * PDYHAT(JJ) / PMAP(JI,JJ)**2 END DO END DO ! diff --git a/src/MNH/turb_cloud_index.f90 b/src/MNH/turb_cloud_index.f90 index c194db61154a5c3fe6fcf2308dae47d01720856c..18c0e8ffb0c22d9ea6f2512d1c382b023665d475 100644 --- a/src/MNH/turb_cloud_index.f90 +++ b/src/MNH/turb_cloud_index.f90 @@ -83,7 +83,7 @@ END MODULE MODI_TURB_CLOUD_INDEX ! !------------------------------------------------------------------------------- ! -use modd_field, only: tfielddata, TYPEREAL +use modd_field, only: tfieldmetadata, TYPEREAL USE MODD_IO, ONLY: TFILEDATA USE MODD_PARAMETERS, ONLY: JPVEXT ! @@ -133,7 +133,7 @@ INTEGER :: IIB,IJB,IKB ! Begin of physical dimensions INTEGER :: IIE,IJE,IKE ! End of physical dimensions INTEGER, DIMENSION(SIZE(PRM,1),SIZE(PRM,2),SIZE(PRM,3)) :: IMASK_CLOUD ! 0 except cloudy points or adjacent points (1) -TYPE(TFIELDDATA) :: TZFIELD +TYPE(TFIELDMETADATA) :: TZFIELD ! !------------------------------------------------------------------------------- ! @@ -244,100 +244,108 @@ ENDDO !* 2.5 Writing ! IF ( OTURB_DIAG .AND. tpfile%lopened ) THEN - TZFIELD%CMNHNAME = 'RVCI' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'RVCI' - TZFIELD%CUNITS = 'kg kg-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_RVCI' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'RVCI', & + CSTDNAME = '', & + CLONGNAME = 'RVCI', & + CUNITS = 'kg kg-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_RVCI',& + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZRVCI) ! - TZFIELD%CMNHNAME = 'GX_RVCI' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'GX_RVCI' - TZFIELD%CUNITS = 'kg kg-1 m-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_GX_RVCI' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'GX_RVCI', & + CSTDNAME = '', & + CLONGNAME = 'GX_RVCI', & + CUNITS = 'kg kg-1 m-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_GX_RVCI', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZG_RVCI(:,:,:,1)) ! - TZFIELD%CMNHNAME = 'GY_RVCI' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'GY_RVCI' - TZFIELD%CUNITS = 'kg kg-1 m-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_GY_RVCI' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'GY_RVCI', & + CSTDNAME = '', & + CLONGNAME = 'GY_RVCI', & + CUNITS = 'kg kg-1 m-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_GY_RVCI', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZG_RVCI(:,:,:,2)) ! - TZFIELD%CMNHNAME = 'GNORM_RVCI' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'GNORM_RVCI' - TZFIELD%CUNITS = 'kg kg-1 m-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_NORM G' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'GNORM_RVCI', & + CSTDNAME = '', & + CLONGNAME = 'GNORM_RVCI', & + CUNITS = 'kg kg-1 m-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_NORM G', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZGNORM_RVCI) ! - TZFIELD%CMNHNAME = 'QX_RVCI' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'QX_RVCI' - TZFIELD%CUNITS = 'kg kg-1 m-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_QX_RVCI' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'QX_RVCI', & + CSTDNAME = '', & + CLONGNAME = 'QX_RVCI', & + CUNITS = 'kg kg-1 m-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_QX_RVCI', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZQ_RVCI(:,:,:,1)) ! - TZFIELD%CMNHNAME = 'QY_RVCI' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'QY_RVCI' - TZFIELD%CUNITS = 'kg kg-1 m-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_QY_RVCI' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'QY_RVCI', & + CSTDNAME = '', & + CLONGNAME = 'QY_RVCI', & + CUNITS = 'kg kg-1 m-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_QY_RVCI', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZQ_RVCI(:,:,:,2)) ! - TZFIELD%CMNHNAME = 'QNORM_RVCI' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'QNORM_RVCI' - TZFIELD%CUNITS = 'kg kg-1 m-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_QNORM_RVCI' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'QNORM_RVCI', & + CSTDNAME = '', & + CLONGNAME = 'QNORM_RVCI', & + CUNITS = 'kg kg-1 m-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_QNORM_RVCI', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZQNORM_RVCI) ! - TZFIELD%CMNHNAME = 'CEI' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'CEI' - TZFIELD%CUNITS = 'kg kg-1 m-1 s-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_CEI' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'CEI', & + CSTDNAME = '', & + CLONGNAME = 'CEI', & + CUNITS = 'kg kg-1 m-1 s-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_CEI', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,PCEI) END IF ! diff --git a/src/MNH/update_nsv.f90 b/src/MNH/update_nsv.f90 index f75aa19f9aa547e0fd43b47a47e9e75e662b9e68..92a0dc327a43bbae9ce9360a2d77872b778eadcd 100644 --- a/src/MNH/update_nsv.f90 +++ b/src/MNH/update_nsv.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2001-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2001-2022 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. @@ -26,11 +26,14 @@ END MODULE MODI_UPDATE_NSV !! Modify (Vie) 2016 : add LIMA !! V. Vionnet 7/2017 : add blowing snow var ! P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg -! P. Wautelet 10/03/2021: add CSVNAMES and CSVNAMES_A to store the name of all the scalar variables +! P. Wautelet 26/11/2021: add TSVLIST and TSVLIST_A to store the metadata of all the scalar variables +! P. Wautelet 14/01/2022: add CSV_CHEM_LIST(_A) to store the list of all chemical variables !------------------------------------------------------------------------------- ! -USE MODD_CONF, ONLY : NVERB +USE MODD_CONF, ONLY: NVERB +USE MODD_FIELD, ONLY: tfieldmetadata USE MODD_NSV +USE MODD_PARAMETERS, ONLY: JPSVNAMELGTMAX, NMNHNAMELGTMAX use mode_msg @@ -39,10 +42,12 @@ IMPLICIT NONE INTEGER, INTENT(IN) :: KMI ! Model index CHARACTER(LEN=JPSVNAMELGTMAX), DIMENSION(:,:), ALLOCATABLE :: YSVNAMES_TMP +CHARACTER(LEN=NMNHNAMELGTMAX), DIMENSION(:,:), ALLOCATABLE :: YSVCHEM_LIST_TMP INTEGER :: JI, JJ +TYPE(tfieldmetadata), DIMENSION(:,:), ALLOCATABLE :: YSVLIST_TMP ! ! STOP if INI_NSV has not be called yet -IF (.NOT. LINI_NSV) THEN +IF ( .NOT. LINI_NSV(KMI) ) THEN call Print_msg( NVERB_FATAL, 'GEN', 'UPDATE_NSV', 'can not continue because INI_NSV was not called' ) END IF ! @@ -50,20 +55,35 @@ END IF ! that have been initialized in ini_nsv.f90 for model KMI ! -! Allocate/reallocate CSVNAMES_A -IF ( .NOT. ALLOCATED( CSVNAMES_A ) ) ALLOCATE( CSVNAMES_A( NSV_A(KMI), KMI) ) -!If CSVNAMES_A is too small, enlarge it and transfer data -IF ( SIZE( CSVNAMES_A, 1 ) < NSV_A(KMI) .OR. SIZE( CSVNAMES_A, 2 ) < KMI ) THEN - ALLOCATE( YSVNAMES_TMP(NSV_A(KMI), KMI) ) - DO JJ = 1, SIZE( CSVNAMES_A, 2 ) - DO JI = 1, SIZE( CSVNAMES_A, 1 ) - YSVNAMES_TMP(JI, JJ) = CSVNAMES_A(JI, JJ) +! Allocate/reallocate CSV_CHEM_LIST_A +IF ( .NOT. ALLOCATED( CSV_CHEM_LIST_A ) ) ALLOCATE( CSV_CHEM_LIST_A( NSV_CHEM_LIST_A(KMI), KMI) ) +!If CSV_CHEM_LIST_A is too small, enlarge it and transfer data +IF ( SIZE( CSV_CHEM_LIST_A, 1 ) < NSV_CHEM_LIST_A(KMI) .OR. SIZE( CSV_CHEM_LIST_A, 2 ) < KMI ) THEN + ALLOCATE( YSVCHEM_LIST_TMP(NSV_CHEM_LIST_A(KMI), KMI) ) + DO JJ = 1, SIZE( CSV_CHEM_LIST_A, 2 ) + DO JI = 1, SIZE( CSV_CHEM_LIST_A, 1 ) + YSVCHEM_LIST_TMP(JI, JJ) = CSV_CHEM_LIST_A(JI, JJ) END DO END DO - CALL MOVE_ALLOC( FROM = YSVNAMES_TMP, TO = CSVNAMES_A ) + CALL MOVE_ALLOC( FROM = YSVCHEM_LIST_TMP, TO = CSV_CHEM_LIST_A ) END IF -CSVNAMES => CSVNAMES_A(:,KMI) +CSV_CHEM_LIST => CSV_CHEM_LIST_A(:,KMI) + +! Allocate/reallocate TSVLIST_A +IF ( .NOT. ALLOCATED( TSVLIST_A ) ) ALLOCATE( TSVLIST_A( NSV_A(KMI), KMI) ) +!If TSVLIST_A is too small, enlarge it and transfer data +IF ( SIZE( TSVLIST_A, 1 ) < NSV_A(KMI) .OR. SIZE( TSVLIST_A, 2 ) < KMI ) THEN + ALLOCATE( YSVLIST_TMP(NSV_A(KMI), KMI) ) + DO JJ = 1, SIZE( TSVLIST_A, 2 ) + DO JI = 1, SIZE( TSVLIST_A, 1 ) + YSVLIST_TMP(JI, JJ) = TSVLIST_A(JI, JJ) + END DO + END DO + CALL MOVE_ALLOC( FROM = YSVLIST_TMP, TO = TSVLIST_A ) +END IF + +TSVLIST => TSVLIST_A(:,KMI) NSV = NSV_A(KMI) NSV_USER = NSV_USER_A(KMI) diff --git a/src/MNH/uv_to_zonal_and_merid.f90 b/src/MNH/uv_to_zonal_and_merid.f90 index 6ce72b8c276368ca96f11d8626d9e8477081a170..95d768766915625a2ce9908eecc8aa0048ff246e 100644 --- a/src/MNH/uv_to_zonal_and_merid.f90 +++ b/src/MNH/uv_to_zonal_and_merid.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2000-2020 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2000-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. @@ -9,31 +9,31 @@ INTERFACE UV_TO_ZONAL_AND_MERID SUBROUTINE UV_TO_ZONAL_AND_MERID3D(PU,PV,KGRID,PZC,PMC,TPFILE,TZFIELDS) ! -use modd_field, only: tfielddata +use modd_field, only: tfieldmetadata use modd_io, only: tfiledata ! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PU ! Input U component -REAL, DIMENSION(:,:,:), INTENT(IN) :: PV ! Input V component -INTEGER, INTENT(IN) :: KGRID ! Grid positions of components -REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(OUT) :: PZC ! Output U component -REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(OUT) :: PMC ! Output V component -TYPE(TFILEDATA), OPTIONAL, INTENT(IN) :: TPFILE ! Output file -TYPE(TFIELDDATA),DIMENSION(2), OPTIONAL, INTENT(IN) :: TZFIELDS ! Fields characteristics +REAL, DIMENSION(:,:,:), INTENT(IN) :: PU ! Input U component +REAL, DIMENSION(:,:,:), INTENT(IN) :: PV ! Input V component +INTEGER, INTENT(IN) :: KGRID ! Grid positions of components +REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(OUT) :: PZC ! Output U component +REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(OUT) :: PMC ! Output V component +TYPE(TFILEDATA), OPTIONAL, INTENT(IN) :: TPFILE ! Output file +TYPE(TFIELDMETADATA), DIMENSION(2), OPTIONAL, INTENT(IN) :: TZFIELDS ! Fields characteristics ! END SUBROUTINE UV_TO_ZONAL_AND_MERID3D ! SUBROUTINE UV_TO_ZONAL_AND_MERID2D(PU,PV,KGRID,PZC,PMC,TPFILE,TZFIELDS) ! -use modd_field, only: tfielddata +use modd_field, only: tfieldmetadata use modd_io, only: tfiledata ! -REAL, DIMENSION(:,:), INTENT(IN) :: PU ! Input U component -REAL, DIMENSION(:,:), INTENT(IN) :: PV ! Input V component -INTEGER, INTENT(IN) :: KGRID ! Grid positions of components -REAL, DIMENSION(:,:), OPTIONAL, INTENT(OUT) :: PZC ! Output U component -REAL, DIMENSION(:,:), OPTIONAL, INTENT(OUT) :: PMC ! Output V component -TYPE(TFILEDATA), OPTIONAL, INTENT(IN) :: TPFILE ! Output file -TYPE(TFIELDDATA),DIMENSION(2), OPTIONAL, INTENT(IN) :: TZFIELDS ! Fields characteristics +REAL, DIMENSION(:,:), INTENT(IN) :: PU ! Input U component +REAL, DIMENSION(:,:), INTENT(IN) :: PV ! Input V component +INTEGER, INTENT(IN) :: KGRID ! Grid positions of components +REAL, DIMENSION(:,:), OPTIONAL, INTENT(OUT) :: PZC ! Output U component +REAL, DIMENSION(:,:), OPTIONAL, INTENT(OUT) :: PMC ! Output V component +TYPE(TFILEDATA), OPTIONAL, INTENT(IN) :: TPFILE ! Output file +TYPE(TFIELDMETADATA), DIMENSION(2), OPTIONAL, INTENT(IN) :: TZFIELDS ! Fields characteristics ! END SUBROUTINE UV_TO_ZONAL_AND_MERID2D ! @@ -47,16 +47,16 @@ INTERFACE ! SUBROUTINE UV_TO_ZONAL_AND_MERID3D(PU,PV,KGRID,PZC,PMC,TPFILE,TZFIELDS) ! -use modd_field, only: tfielddata +use modd_field, only: tfieldmetadata use modd_io, only: tfiledata ! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PU ! Input U component -REAL, DIMENSION(:,:,:), INTENT(IN) :: PV ! Input V component -INTEGER, INTENT(IN) :: KGRID ! Grid positions of components -REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(OUT) :: PZC ! Output U component -REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(OUT) :: PMC ! Output V component -TYPE(TFILEDATA), OPTIONAL, INTENT(IN) :: TPFILE ! Output file -TYPE(TFIELDDATA),DIMENSION(2), OPTIONAL, INTENT(IN) :: TZFIELDS ! Fields characteristics +REAL, DIMENSION(:,:,:), INTENT(IN) :: PU ! Input U component +REAL, DIMENSION(:,:,:), INTENT(IN) :: PV ! Input V component +INTEGER, INTENT(IN) :: KGRID ! Grid positions of components +REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(OUT) :: PZC ! Output U component +REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(OUT) :: PMC ! Output V component +TYPE(TFILEDATA), OPTIONAL, INTENT(IN) :: TPFILE ! Output file +TYPE(TFIELDMETADATA), DIMENSION(2), OPTIONAL, INTENT(IN) :: TZFIELDS ! Fields characteristics ! END SUBROUTINE UV_TO_ZONAL_AND_MERID3D END INTERFACE @@ -103,7 +103,7 @@ END MODULE MODI_UV_TO_ZONAL_AND_MERID3D USE MODD_CONF USE MODD_CST USE MODD_DIM_n -use modd_field, only: tfielddata +use modd_field, only: tfieldmetadata USE MODD_GRID USE MODD_GRID_n USE MODD_IO, ONLY: TFILEDATA @@ -119,13 +119,13 @@ IMPLICIT NONE ! !* 0.1 declarations of arguments ! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PU ! Input U component -REAL, DIMENSION(:,:,:), INTENT(IN) :: PV ! Input V component -INTEGER, INTENT(IN) :: KGRID ! Grid positions of components -REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(OUT) :: PZC ! Output U component -REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(OUT) :: PMC ! Output V component -TYPE(TFILEDATA), OPTIONAL, INTENT(IN) :: TPFILE ! Output file -TYPE(TFIELDDATA),DIMENSION(2), OPTIONAL, INTENT(IN) :: TZFIELDS ! Fields characteristics +REAL, DIMENSION(:,:,:), INTENT(IN) :: PU ! Input U component +REAL, DIMENSION(:,:,:), INTENT(IN) :: PV ! Input V component +INTEGER, INTENT(IN) :: KGRID ! Grid positions of components +REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(OUT) :: PZC ! Output U component +REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(OUT) :: PMC ! Output V component +TYPE(TFILEDATA), OPTIONAL, INTENT(IN) :: TPFILE ! Output file +TYPE(TFIELDMETADATA), DIMENSION(2), OPTIONAL, INTENT(IN) :: TZFIELDS ! Fields characteristics ! !* 0.2 declarations of local variables ! @@ -276,7 +276,7 @@ END SUBROUTINE UV_TO_ZONAL_AND_MERID3D !* 0. DECLARATIONS ! ------------ ! -use modd_field, only: tfielddata +use modd_field, only: tfieldmetadata USE MODD_IO, ONLY: TFILEDATA, NVERB_WARNING USE MODD_LUNIT_n, ONLY: TLUOUT ! @@ -289,13 +289,13 @@ IMPLICIT NONE ! !* 0.1 declarations of arguments ! -REAL, DIMENSION(:,:), INTENT(IN) :: PU ! Input U component -REAL, DIMENSION(:,:), INTENT(IN) :: PV ! Input V component -INTEGER, INTENT(IN) :: KGRID ! Grid positions of components -REAL, DIMENSION(:,:), OPTIONAL, INTENT(OUT) :: PZC ! Output U component -REAL, DIMENSION(:,:), OPTIONAL, INTENT(OUT) :: PMC ! Output V component -TYPE(TFILEDATA), OPTIONAL, INTENT(IN) :: TPFILE ! Output file -TYPE(TFIELDDATA),DIMENSION(2), OPTIONAL, INTENT(IN) :: TZFIELDS ! Fields characteristics +REAL, DIMENSION(:,:), INTENT(IN) :: PU ! Input U component +REAL, DIMENSION(:,:), INTENT(IN) :: PV ! Input V component +INTEGER, INTENT(IN) :: KGRID ! Grid positions of components +REAL, DIMENSION(:,:), OPTIONAL, INTENT(OUT) :: PZC ! Output U component +REAL, DIMENSION(:,:), OPTIONAL, INTENT(OUT) :: PMC ! Output V component +TYPE(TFILEDATA), OPTIONAL, INTENT(IN) :: TPFILE ! Output file +TYPE(TFIELDMETADATA), DIMENSION(2), OPTIONAL, INTENT(IN) :: TZFIELDS ! Fields characteristics ! !* 0.2 declarations of local variables ! diff --git a/src/MNH/ver_interp_to_mixed_grid.f90 b/src/MNH/ver_interp_to_mixed_grid.f90 index 94b161a5d4989fd24bcc8dc2305436acfc304d03..1c1580cc9588bf11b59feda0d5f22d5fc4b2d63f 100644 --- a/src/MNH/ver_interp_to_mixed_grid.f90 +++ b/src/MNH/ver_interp_to_mixed_grid.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1994-2020 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1994-2022 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. @@ -274,7 +274,7 @@ ILU=SIZE(PZMASS_LS,3) !* 1.1 Grid definition ! --------------- ! -IF (MINVAL(PZMASS_LS (:,:,ILU))<0.5*(XZHAT(IKE)+XZHAT(IKE+1))) THEN +IF (MINVAL(PZMASS_LS (:,:,ILU))<XZHATM(IKE)) THEN WRITE(ILUOUT0,*) WRITE(ILUOUT0,*) '+-----------------------------------------------------+' WRITE(ILUOUT0,*) '| MESONH highest mass level above highest input level |' diff --git a/src/MNH/ver_thermo.f90 b/src/MNH/ver_thermo.f90 index d926e6c26166d796723e9c9050aad7b41e79ae0a..186f230a42bb33b3b038d73bb0d58f9b8347c152 100644 --- a/src/MNH/ver_thermo.f90 +++ b/src/MNH/ver_thermo.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1994-2020 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1994-2022 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. @@ -159,7 +159,7 @@ USE MODD_CONF USE MODD_CONF_n USE MODD_CST USE MODD_DYN_n -use modd_field, only: tfielddata, TYPEREAL +use modd_field, only: tfieldmetadata, TYPEREAL USE MODD_FIELD_n, ONLY: XTHT,XRT,XPABST,XDRYMASST USE MODD_GRID_n USE MODD_IO, ONLY: TFILEDATA,TFILE_DUMMY @@ -227,7 +227,7 @@ INTEGER :: IISIZEXF,IJSIZEXF,IISIZEXFU,IJSIZEXFU ! dimensions of the INTEGER :: IISIZEX4,IJSIZEX4,IISIZEX2,IJSIZEX2 ! West-east LB arrays INTEGER :: IISIZEYF,IJSIZEYF,IISIZEYFV,IJSIZEYFV ! dimensions of the INTEGER :: IISIZEY4,IJSIZEY4,IISIZEY2,IJSIZEY2 ! North-south LB arrays -TYPE(TFIELDDATA) :: TZFIELD +TYPE(TFIELDMETADATA) :: TZFIELD !------------------------------------------------------------------------------- ! @@ -295,16 +295,17 @@ DO JRR=1,SIZE(XRT,4) END DO ! IF (NVERB>=10) THEN - TZFIELD%CMNHNAME = 'THV' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'THV' - TZFIELD%CUNITS = 'K' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_THV' - TZFIELD%NGRID = 4 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'THV', & + CSTDNAME = '', & + CLONGNAME = 'THV', & + CUNITS = 'K', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_THV', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZTHV) END IF !------------------------------------------------------------------------------- @@ -331,9 +332,9 @@ ALLOCATE(XRVREF(IIU,IJU,IKU)) ALLOCATE(XEXNREF(IIU,IJU,IKU)) ALLOCATE(XRHODJ(IIU,IJU,IKU)) XRVREF(:,:,:) = 0. -CALL SET_REF(0,TFILE_DUMMY,XZZ,XZHAT,PJ,PDXX,PDYY,CLBCX,CLBCY, & - XREFMASS,XMASS_O_PHI0,XLINMASS,XRHODREF,XTHVREF,XRVREF, & - XEXNREF,XRHODJ) +CALL SET_REF( 0, TFILE_DUMMY, XZZ, XZHATM, PJ, PDXX, PDYY, CLBCX, CLBCY, & + XREFMASS, XMASS_O_PHI0, XLINMASS, XRHODREF, XTHVREF, XRVREF, & + XEXNREF, XRHODJ ) CALL MPPDB_CHECK3D(XRHODREF,"VERTHERMO::XRHODREF",PRECISION) CALL MPPDB_CHECK3D(XTHVREF,"VERTHERMO::XTHVREF",PRECISION) diff --git a/src/MNH/version.f90 b/src/MNH/version.f90 index 5c98f1946a20fa439b85ac1ef532e771ecb90a4a..c8283e7235c7a52cb15dcbb16e2b2d2516cce9ed 100644 --- a/src/MNH/version.f90 +++ b/src/MNH/version.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2002-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2002-2022 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. @@ -43,10 +43,10 @@ USE MODD_CONF, ONLY : NMNHVERSION,NMASDEV,NBUGFIX,CBIBUSER IMPLICIT NONE ! NMNHVERSION(1)=5 -NMNHVERSION(2)=5 -NMNHVERSION(3)=1 -NMASDEV=55 -NBUGFIX=1 +NMNHVERSION(2)=6 +NMNHVERSION(3)=0 +NMASDEV=56 +NBUGFIX=0 CBIBUSER='' ! END SUBROUTINE VERSION diff --git a/src/MNH/viscosity.f90 b/src/MNH/viscosity.f90 index 4a9607c8cd1a382362c1308ed60fd33cf28120b5..c909bd9b0b511d83e006129f28491f332b2ddac5 100644 --- a/src/MNH/viscosity.f90 +++ b/src/MNH/viscosity.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1994-2023 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. @@ -51,11 +51,11 @@ INTERFACE ! REAL, DIMENSION(:,:), INTENT(IN) :: PDRAG ! Array -1/1 defining where the no-slipcondition is applied ! metric coefficients - REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX - REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY - REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ - REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZX - REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZY + REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX + REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY + REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ + REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDZX + REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDZY ! ! output source terms REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRUS, PRVS, PRWS @@ -150,12 +150,12 @@ SUBROUTINE VISCOSITY(HLBCX, HLBCY, KRR, KSV, PNU, PPRANDTL, & ! ! REAL, DIMENSION(:,:), INTENT(IN) :: PDRAG ! Array -1/1 defining where the no-slip condition is applied - - REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX - REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY - REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ - REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZX - REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZY +! metric coefficients + REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX + REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY + REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ + REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDZX + REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDZY ! ! output source terms REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRUS, PRVS, PRWS diff --git a/src/MNH/water_sum.f90 b/src/MNH/water_sum.f90 index 845b99c4882ede66201e5e37158e7a72b3870883..46a899cdac5e9cb34d972f1a2ae757fabf9d90eb 100644 --- a/src/MNH/water_sum.f90 +++ b/src/MNH/water_sum.f90 @@ -1,18 +1,13 @@ -!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1998-2022 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 version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. !----------------------------------------------------------------- -!--------------- special set of characters for RCS information -!----------------------------------------------------------------- -! $Source$ $Revision$ -! MASDEV4_7 prep_real 2006/05/18 13:07:25 -!----------------------------------------------------------------- ! ##################### MODULE MODI_WATER_SUM ! ##################### INTERFACE - FUNCTION WATER_SUM(PR) RESULT (PSUM_R) + PURE FUNCTION WATER_SUM(PR) RESULT (PSUM_R) ! REAL,DIMENSION(:,:,:,:), INTENT(IN) :: PR ! water species REAL,DIMENSION(SIZE(PR,1),SIZE(PR,2),SIZE(PR,3)) :: PSUM_R ! sum of water species @@ -20,9 +15,9 @@ REAL,DIMENSION(SIZE(PR,1),SIZE(PR,2),SIZE(PR,3)) :: PSUM_R ! sum of water specie END FUNCTION WATER_SUM END INTERFACE END MODULE MODI_WATER_SUM -! ###################################### - FUNCTION WATER_SUM(PR) RESULT (PSUM_R) -! ###################################### +! ########################################### + PURE FUNCTION WATER_SUM(PR) RESULT (PSUM_R) +! ########################################### ! !!**** *WATER_SUM* - summation on the water species (fourth array index) !! diff --git a/src/MNH/write_aircraft_balloon.f90 b/src/MNH/write_aircraft_balloon.f90 index f9295b656f516849d6400fde6a9417ca07b1a513..2284be8ea3e8264dbb21d273f7e11a7604ffad51 100644 --- a/src/MNH/write_aircraft_balloon.f90 +++ b/src/MNH/write_aircraft_balloon.f90 @@ -1,29 +1,34 @@ -!MNH_LIC Copyright 2000-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2000-2023 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 MODI_WRITE_AIRCRAFT_BALLOON +MODULE MODE_WRITE_AIRCRAFT_BALLOON ! ########################### -! -INTERFACE -! - SUBROUTINE WRITE_AIRCRAFT_BALLOON(TPDIAFILE) -! -USE MODD_IO, ONLY: TFILEDATA -! -TYPE(TFILEDATA), INTENT(IN) :: TPDIAFILE ! file to write -! -END SUBROUTINE WRITE_AIRCRAFT_BALLOON -! -END INTERFACE -! -END MODULE MODI_WRITE_AIRCRAFT_BALLOON -! -! ########################################## - SUBROUTINE WRITE_AIRCRAFT_BALLOON(TPDIAFILE) -! ########################################## + +use modd_parameters, only: NCOMMENTLGTMAX, NMNHNAMELGTMAX, NUNITLGTMAX + +use mode_msg + +implicit none + +private + +PUBLIC :: AIRCRAFT_BALLOON_FREE_NONLOCAL +public :: WRITE_AIRCRAFT_BALLOON + +CHARACTER(LEN=NCOMMENTLGTMAX), DIMENSION(:), ALLOCATABLE :: CCOMMENT ! comment string( +CHARACTER(LEN=NMNHNAMELGTMAX), DIMENSION(:), ALLOCATABLE :: CTITLE ! title +CHARACTER(LEN=NUNITLGTMAX), DIMENSION(:), ALLOCATABLE :: CUNIT ! physical unit + +REAL, DIMENSION(:,:,:,:,:,:), ALLOCATABLE :: XWORK6 ! contains temporal serie + +contains + +! ########################################## +SUBROUTINE WRITE_AIRCRAFT_BALLOON(TPDIAFILE) +! ########################################## ! ! !!**** *WRITE_AIRCRAFT_BALLOON* - write the balloon and aircraft trajectories and records @@ -65,48 +70,22 @@ END MODULE MODI_WRITE_AIRCRAFT_BALLOON ! P. Wautelet: 05/2016-04/2018: new data structures and calls for I/O ! P. Wautelet 29/01/2019: bug: moved an instruction later (to prevent access to a not allocated array) ! P. Wautelet 13/09/2019: budget: simplify and modernize date/time management -! P. Wautelet 02/10/2020: bugfix: YGROUP/YGROUPZ were too small ! P. Wautelet 09/10/2020: bugfix: correction on IPROCZ when not LIMA (condition was wrong) ! P. Wautelet 09/10/2020: Write_diachro: use new datatype tpfields ! P. Wautelet 03/03/2021: budgets: add tbudiachrometadata type (useful to pass more information to Write_diachro) ! P. Wautelet 11/03/2021: budgets: remove ptrajx/y/z optional dummy arguments of Write_diachro ! P. Wautelet 11/03/2021: bugfix: correct name for NSV_LIMA_IMM_NUCL +! P. Wautelet 04/02/2022: use TSVLIST to manage metadata of scalar variables +! P. Wautelet 06/2022: reorganize flyers ! -------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ ! -USE MODD_CST -USE MODD_IO, ONLY: TFILEDATA -USE MODD_LUNIT -USE MODD_PARAMETERS -! USE MODD_AIRCRAFT_BALLOON -USE MODD_CH_M9_n, ONLY: CNAMES -USE MODD_CH_AEROSOL, ONLY: CAERONAMES, LORILAM, NSP, NCARB, NSOA, & - JPMODE, JP_AER_BC, JP_AER_OC, JP_AER_DST, & - JP_AER_H2O, JP_AER_SO4, JP_AER_NO3, & - JP_AER_NH3, JP_AER_SOA1, JP_AER_SOA2, & - JP_AER_SOA3, JP_AER_SOA4, JP_AER_SOA5, & - JP_AER_SOA6, JP_AER_SOA7, JP_AER_SOA8, & - JP_AER_SOA9, JP_AER_SOA10 -USE MODD_RAIN_C2R2_DESCR, ONLY: C2R2NAMES -USE MODD_ICE_C1R3_DESCR, ONLY: C1R3NAMES -USE MODD_ELEC_DESCR, ONLY: CELECNAMES -USE MODD_LG, ONLY: CLGNAMES -USE MODD_DUST, ONLY: CDUSTNAMES, LDUST, NMODE_DST -USE MODD_SALT, ONLY: CSALTNAMES -USE MODD_NSV -USE MODD_DIAG_IN_RUN -USE MODD_PARAM_LIMA_WARM, ONLY: CLIMA_WARM_NAMES, CAERO_MASS -USE MODD_PARAM_LIMA_COLD, ONLY: CLIMA_COLD_NAMES -USE MODD_PARAM_LIMA , ONLY: NINDICE_CCN_IMM,NMOD_CCN,NMOD_IFN,NMOD_IMM -! -USE MODE_MODELN_HANDLER -USE MODE_DUST_PSD -USE MODE_AERO_PSD -use mode_msg -use mode_write_diachro, only: Write_diachro +USE MODD_IO, ONLY: ISP, TFILEDATA +! +USE MODE_AIRCRAFT_BALLOON, ONLY: FLYER_RECV_AND_ALLOCATE, FLYER_SEND ! IMPLICIT NONE ! @@ -119,736 +98,447 @@ TYPE(TFILEDATA), INTENT(IN) :: TPDIAFILE ! file to write ! ! 0.2 declaration of local variables ! -INTEGER :: IMI ! current model index -! -!---------------------------------------------------------------------------- -! -IMI=GET_CURRENT_MODEL_INDEX() -! -CALL FLYER_DIACHRO(TBALLOON1) -CALL FLYER_DIACHRO(TBALLOON2) -CALL FLYER_DIACHRO(TBALLOON3) -CALL FLYER_DIACHRO(TBALLOON4) -CALL FLYER_DIACHRO(TBALLOON5) -CALL FLYER_DIACHRO(TBALLOON6) -CALL FLYER_DIACHRO(TBALLOON7) -CALL FLYER_DIACHRO(TBALLOON8) -CALL FLYER_DIACHRO(TBALLOON9) -! -CALL FLYER_DIACHRO(TAIRCRAFT1) -CALL FLYER_DIACHRO(TAIRCRAFT2) -CALL FLYER_DIACHRO(TAIRCRAFT3) -CALL FLYER_DIACHRO(TAIRCRAFT4) -CALL FLYER_DIACHRO(TAIRCRAFT5) -CALL FLYER_DIACHRO(TAIRCRAFT6) -CALL FLYER_DIACHRO(TAIRCRAFT7) -CALL FLYER_DIACHRO(TAIRCRAFT8) -CALL FLYER_DIACHRO(TAIRCRAFT9) -CALL FLYER_DIACHRO(TAIRCRAFT10) -CALL FLYER_DIACHRO(TAIRCRAFT11) -CALL FLYER_DIACHRO(TAIRCRAFT12) -CALL FLYER_DIACHRO(TAIRCRAFT13) -CALL FLYER_DIACHRO(TAIRCRAFT14) -CALL FLYER_DIACHRO(TAIRCRAFT15) -CALL FLYER_DIACHRO(TAIRCRAFT16) -CALL FLYER_DIACHRO(TAIRCRAFT17) -CALL FLYER_DIACHRO(TAIRCRAFT18) -CALL FLYER_DIACHRO(TAIRCRAFT19) -CALL FLYER_DIACHRO(TAIRCRAFT20) -CALL FLYER_DIACHRO(TAIRCRAFT21) -CALL FLYER_DIACHRO(TAIRCRAFT22) -CALL FLYER_DIACHRO(TAIRCRAFT23) -CALL FLYER_DIACHRO(TAIRCRAFT24) -CALL FLYER_DIACHRO(TAIRCRAFT25) -CALL FLYER_DIACHRO(TAIRCRAFT26) -CALL FLYER_DIACHRO(TAIRCRAFT27) -CALL FLYER_DIACHRO(TAIRCRAFT28) -CALL FLYER_DIACHRO(TAIRCRAFT29) -CALL FLYER_DIACHRO(TAIRCRAFT30) -! -!---------------------------------------------------------------------------- -!---------------------------------------------------------------------------- -! -CONTAINS +INTEGER :: JI ! !---------------------------------------------------------------------------- -!---------------------------------------------------------------------------- -! -SUBROUTINE FLYER_DIACHRO(TPFLYER) -use modd_budget, only: NLVL_CATEGORY, NLVL_SUBCATEGORY, NLVL_GROUP, NLVL_SHAPE, NLVL_TIMEAVG, NLVL_NORM, NLVL_MASK, & - tbudiachrometadata -use modd_field, only: NMNHDIM_LEVEL, NMNHDIM_FLYER_PROC, NMNHDIM_FLYER_TIME, NMNHDIM_UNUSED, & - tfield_metadata_base, TYPEREAL +DO JI = 1, NBALLOONS + ! The balloon data is only available on the process where it is physically located => transfer it if necessary + + ! Send data from owner to writer if necessary + IF ( ISP == NRANKCUR_BALLOON(JI) .AND. NRANKCUR_BALLOON(JI) /= TPDIAFILE%NMASTER_RANK ) THEN + CALL FLYER_SEND( TBALLOONS(JI)%TBALLOON, TPDIAFILE%NMASTER_RANK ) + END IF + + IF ( ISP == TPDIAFILE%NMASTER_RANK ) THEN + ! Receive data from owner if not available on the writer process + IF ( NRANKCUR_BALLOON(JI) /= TPDIAFILE%NMASTER_RANK ) THEN + IF ( ASSOCIATED( TBALLOONS(JI)%TBALLOON ) ) & + call Print_msg( NVERB_FATAL, 'GEN', 'WRITE_AIRCRAFT_BALLOON', 'balloon already associated' ) + ALLOCATE( TBALLOONS(JI)%TBALLOON ) + CALL FLYER_RECV_AND_ALLOCATE( TBALLOONS(JI)%TBALLOON, NRANKCUR_BALLOON(JI) ) + END IF + + ! Write data + CALL FLYER_DIACHRO( TPDIAFILE, TBALLOONS(JI)%TBALLOON ) + + ! Remark: release of memory is done later by a call to AIRCRAFT_BALLOON_FREE_NONLOCAL + ! This call must be done after the file is closed because flyer data is needed on the + ! file master process at this last stage (coordinates writing) + END IF +END DO -use modi_aircraft_balloon, only: Aircraft_balloon_longtype_get +DO JI = 1, NAIRCRAFTS + ! The aircraft data is only available on the process where it is physically located => transfer it if necessary -TYPE(FLYER), INTENT(IN) :: TPFLYER + ! Send data from owner to writer if necessary + IF ( ISP == NRANKCUR_AIRCRAFT(JI) .AND. NRANKCUR_AIRCRAFT(JI) /= TPDIAFILE%NMASTER_RANK ) THEN + CALL FLYER_SEND( TAIRCRAFTS(JI)%TAIRCRAFT, TPDIAFILE%NMASTER_RANK ) + END IF + + IF ( ISP == TPDIAFILE%NMASTER_RANK ) THEN + ! Receive data from owner if not available on the writer process (need to be done only for the first model) + IF ( NRANKCUR_AIRCRAFT(JI) /= TPDIAFILE%NMASTER_RANK ) THEN + IF ( ASSOCIATED( TAIRCRAFTS(JI)%TAIRCRAFT ) ) & + call Print_msg( NVERB_FATAL, 'GEN', 'WRITE_AIRCRAFT_BALLOON', 'aircraft already associated' ) + ALLOCATE( TAIRCRAFTS(JI)%TAIRCRAFT ) + CALL FLYER_RECV_AND_ALLOCATE( TAIRCRAFTS(JI)%TAIRCRAFT, NRANKCUR_AIRCRAFT(JI) ) + END IF + + ! Write data + CALL FLYER_DIACHRO( TPDIAFILE, TAIRCRAFTS(JI)%TAIRCRAFT ) + + ! Remark: release of memory is done later by a call to AIRCRAFT_BALLOON_FREE_NONLOCAL + ! This call must be done after the file is closed because flyer data is needed on the + ! file master process at this last stage (coordinates writing) + END IF +END DO + +END SUBROUTINE WRITE_AIRCRAFT_BALLOON + + +! #################################################### +SUBROUTINE AIRCRAFT_BALLOON_FREE_NONLOCAL( TPDIAFILE ) +! #################################################### + +USE MODD_AIRCRAFT_BALLOON, ONLY: NAIRCRAFTS, NBALLOONS, NRANKCUR_AIRCRAFT, NRANKCUR_BALLOON, TAIRCRAFTS, TBALLOONS +USE MODD_IO, ONLY: ISP, TFILEDATA + +USE MODE_INI_AIRCRAFT_BALLOON, ONLY: DEALLOCATE_FLYER + +IMPLICIT NONE + +TYPE(TFILEDATA), INTENT(IN) :: TPDIAFILE + +INTEGER :: JI + +CALL PRINT_MSG( NVERB_DEBUG, 'GEN', 'AIRCRAFT_BALLOON_FREE_NONLOCAL', 'called for ' // TRIM(TPDIAFILE%CNAME) ) + +IF ( ISP == TPDIAFILE%NMASTER_RANK ) THEN + DO JI = 1, NBALLOONS + ! Free ballon data if it was not stored on this process + IF ( NRANKCUR_BALLOON(JI) /= TPDIAFILE%NMASTER_RANK ) THEN + CALL DEALLOCATE_FLYER( TBALLOONS(JI)%TBALLOON ) + DEALLOCATE( TBALLOONS(JI)%TBALLOON ) + END IF + END DO + + DO JI = 1, NAIRCRAFTS + ! Free aircraft data if it was not stored on this process + IF ( NRANKCUR_AIRCRAFT(JI) /= TPDIAFILE%NMASTER_RANK ) THEN + CALL DEALLOCATE_FLYER( TAIRCRAFTS(JI)%TAIRCRAFT ) + DEALLOCATE( TAIRCRAFTS(JI)%TAIRCRAFT ) + END IF + END DO +END IF + +END SUBROUTINE AIRCRAFT_BALLOON_FREE_NONLOCAL + + +! ############################################ +SUBROUTINE FLYER_DIACHRO( TPDIAFILE, TPFLYER ) +! ############################################ + +USE MODD_AIRCRAFT_BALLOON +use modd_budget, only: NLVL_CATEGORY, NLVL_SUBCATEGORY, NLVL_GROUP, NLVL_SHAPE, NLVL_TIMEAVG, NLVL_NORM, NLVL_MASK, & + tbudiachrometadata +USE MODD_CST, ONLY: XRV +USE MODD_DIAG_IN_RUN, ONLY: LDIAG_IN_RUN +use modd_field, only: NMNHDIM_LEVEL, NMNHDIM_FLYER_PROC, NMNHDIM_FLYER_TIME, NMNHDIM_UNUSED, & + tfieldmetadata_base, TYPEREAL +USE MODD_IO, ONLY: TFILEDATA +USE MODD_NSV, ONLY: tsvlist, nsv, nsv_aer, nsv_aerbeg, nsv_aerend, nsv_dst, nsv_dstbeg, nsv_dstend, & + nsv_lima_beg, nsv_lima_end +USE MODD_PARAMETERS, ONLY: XUNDEF +USE MODD_PARAM_n, ONLY: CCLOUD + +USE MODE_AERO_PSD +use mode_aircraft_balloon, only: Aircraft_balloon_longtype_get +USE MODE_DUST_PSD +USE MODE_MODELN_HANDLER, ONLY: GET_CURRENT_MODEL_INDEX +use mode_write_diachro, only: Write_diachro + + +TYPE(TFILEDATA), INTENT(IN) :: TPDIAFILE ! file to write +CLASS(TFLYERDATA), INTENT(IN) :: TPFLYER ! !* 0.2 declaration of local variables for diachro ! -REAL, DIMENSION(:,:,:,:,:,:), ALLOCATABLE :: ZWORK6 ! contains temporal serie -REAL, DIMENSION(:,:,:,:,:,:), ALLOCATABLE :: ZW6 ! contains temporal serie to write -REAL, DIMENSION(:,:,:,:,:,:), ALLOCATABLE :: ZWORKZ6! contains temporal serie -REAL, DIMENSION(:,:,:,:,:,:), ALLOCATABLE :: ZWZ6 ! contains temporal serie REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZSV, ZN0, ZSIG, ZRG REAL, DIMENSION(:,:,:,:,:), ALLOCATABLE :: ZPTOTA REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRHO ! -INTEGER, DIMENSION(:), ALLOCATABLE :: IGRID ! grid indicator -CHARACTER(LEN=:), ALLOCATABLE :: YGROUP ! group title -CHARACTER(LEN=100), DIMENSION(:), ALLOCATABLE :: YCOMMENT ! comment string -CHARACTER(LEN=100), DIMENSION(:), ALLOCATABLE :: YTITLE ! title -CHARACTER(LEN=100), DIMENSION(:), ALLOCATABLE :: YUNIT ! physical unit +CHARACTER(LEN=NMNHNAMELGTMAX) :: YTITLE +CHARACTER(LEN=NCOMMENTLGTMAX) :: YCOMMENT +CHARACTER(LEN=NUNITLGTMAX) :: YUNIT ! +INTEGER :: IMI ! current model index INTEGER :: IPROC ! number of variables records INTEGER :: JPROC ! loop counter -INTEGER, DIMENSION(:), ALLOCATABLE :: IGRIDZ ! grid indicator -CHARACTER(LEN=:), ALLOCATABLE :: YGROUPZ ! group title -CHARACTER(LEN=100), DIMENSION(:), ALLOCATABLE :: YCOMMENTZ! comment string -CHARACTER(LEN=100), DIMENSION(:), ALLOCATABLE :: YTITLEZ ! title -CHARACTER(LEN=100), DIMENSION(:), ALLOCATABLE :: YUNITZ ! physical unit +INTEGER :: ISTORE INTEGER :: IPROCZ ! number of variables records -INTEGER :: JPROCZ ! loop counter +INTEGER :: IRR ! number of hydrometeors INTEGER :: JRR ! loop counter INTEGER :: JSV ! loop counter INTEGER :: JPT ! loop counter -INTEGER :: IKU, IK -CHARACTER(LEN=2) :: INDICE -INTEGER :: JLOOP +INTEGER :: IKU +REAL, DIMENSION(:), ALLOCATABLE :: ZLWC ! Temporary array to store/compute Liquid Water Content at flyer position type(tbudiachrometadata) :: tzbudiachro -type(tfield_metadata_base), dimension(:), allocatable :: tzfields +type(tfieldmetadata_base), dimension(:), allocatable :: tzfields ! !---------------------------------------------------------------------------- ! +IMI = GET_CURRENT_MODEL_INDEX() + +IRR = SIZE( tpflyer%xr, 2 ) + IF (TPFLYER%NMODEL==0) RETURN -IF (ALL(TPFLYER%X==XUNDEF)) RETURN -IF (COUNT(TPFLYER%X/=XUNDEF)<=1) RETURN +IF (ALL(TPFLYER%XX==XUNDEF)) RETURN +IF (COUNT(TPFLYER%XX/=XUNDEF)<=1) RETURN IF ( IMI /= TPFLYER%NMODEL ) RETURN ! -IKU = SIZE(TPFLYER%RTZ,2) !number of vertical levels +IKU = SIZE(TPFLYER%XRTZ,2) !number of vertical levels ! -IPROC = 20 + SIZE(TPFLYER%R,2) + SIZE(TPFLYER%SV,2) & - + 2 + SIZE(TPFLYER%SVW_FLUX,2) -IPROCZ = SIZE(TPFLYER%RTZ,2)+ SIZE(TPFLYER%RZ,2)+ SIZE(TPFLYER%RZ,3)+ SIZE(TPFLYER%CRARE,2)+ & - SIZE(TPFLYER%CRARE_ATT,2)+ SIZE(TPFLYER%WZ,2) + SIZE(TPFLYER%FFZ,2)+ & - SIZE(TPFLYER%IWCZ,2)+ SIZE(TPFLYER%LWCZ,2) + SIZE(TPFLYER%CIZ,2) + & - SIZE(TPFLYER%ZZ,2) +IPROC = 21 + IRR + SIZE(TPFLYER%XSV,2) & + + 2 + SIZE(TPFLYER%XSVW_FLUX,2) +IPROCZ = SIZE(TPFLYER%XRTZ,2)+ SIZE(TPFLYER%XRZ,2)+ SIZE(TPFLYER%XRZ,3)+ SIZE(TPFLYER%XCRARE,2)+ & + SIZE(TPFLYER%XCRARE_ATT,2)+ SIZE(TPFLYER%XWZ,2) + SIZE(TPFLYER%XFFZ,2)+ & + SIZE(TPFLYER%XIWCZ,2)+ SIZE(TPFLYER%XLWCZ,2) + SIZE(TPFLYER%XCIZ,2) + & + SIZE(TPFLYER%XZZ,2) -IF (NSV_LIMA_BEG<=NSV_LIMA_END) IPROCZ= IPROCZ+ SIZE(TPFLYER%CCZ,2) + SIZE(TPFLYER%CRZ,2) -IF (SIZE(TPFLYER%TKE )>0) IPROC = IPROC + 1 +IF (NSV_LIMA_BEG<=NSV_LIMA_END) IPROCZ= IPROCZ+ SIZE(TPFLYER%XCCZ,2) + SIZE(TPFLYER%XCRZ,2) +IF (SIZE(TPFLYER%XTKE )>0) IPROC = IPROC + 1 IF (LDIAG_IN_RUN) IPROC = IPROC + 1 IF (LORILAM) IPROC = IPROC + JPMODE*3 IF (LDUST) IPROC = IPROC + NMODE_DST*3 -IF (SIZE(TPFLYER%TSRAD)>0) IPROC = IPROC + 1 -! -ALLOCATE (ZWORK6(1,1,1,size(tpflyer%tpdates),1,IPROC)) -ALLOCATE (YCOMMENT(IPROC)) -ALLOCATE (YTITLE (IPROC)) -ALLOCATE (YUNIT (IPROC)) -ALLOCATE (IGRID (IPROC)) -ALLOCATE (ZWORKZ6(1,1,IKU,size(tpflyer%tpdates),1,IPROCZ)) -ALLOCATE (YCOMMENTZ(IPROCZ)) -ALLOCATE (YTITLEZ (IPROCZ)) -ALLOCATE (YUNITZ (IPROCZ)) -ALLOCATE (IGRIDZ (IPROCZ)) -! -IGRID = 1 -YGROUP = TPFLYER%TITLE -IGRIDZ = 1 -YGROUPZ = TPFLYER%TITLE +IF (SIZE(TPFLYER%XTSRAD)>0) IPROC = IPROC + 1 ! -!---------------------------------------------------------------------------- -JPROC = 0 +ISTORE = SIZE( TPFLYER%TFLYER_TIME%TPDATES ) ! -JPROC = JPROC + 1 -YTITLE (JPROC) = 'ZS' -YUNIT (JPROC) = 'm' -YCOMMENT (JPROC) = 'orography' -ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%ZS(:) -! -IF (TPFLYER%ALTDEF) THEN - JPROC = JPROC + 1 - YTITLE (JPROC) = 'P' - YUNIT (JPROC) = 'Pascal' - YCOMMENT (JPROC) = 'pressure' - ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%P(:) -ELSE - JPROC = JPROC + 1 - YTITLE (JPROC) = 'Z' - YUNIT (JPROC) = 'm' - YCOMMENT (JPROC) = 'altitude' - ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%Z(:) -ENDIF +!---------------------------------------------------------------------------- +!Treat point values +ALLOCATE (XWORK6(1,1,1,ISTORE,1,IPROC)) +ALLOCATE (CCOMMENT(IPROC)) +ALLOCATE (CTITLE (IPROC)) +ALLOCATE (CUNIT (IPROC)) + +jproc = 0 + +call Add_point( 'ZS', 'orography', 'm', tpflyer%xzs(:) ) ! -JPROC = JPROC + 1 -YTITLE (JPROC) = 'LON' -YUNIT (JPROC) = 'degree' -YCOMMENT (JPROC) = 'longitude' -ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%XLON(:) -! -JPROC = JPROC + 1 -YTITLE (JPROC) = 'LAT' -YUNIT (JPROC) = 'degree' -YCOMMENT (JPROC) = 'latitude' -ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%YLAT(:) -! -JPROC = JPROC + 1 -YTITLE (JPROC) = 'ZON_WIND' -YUNIT (JPROC) = 'm s-1' -YCOMMENT (JPROC) = 'zonal wind' -ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%ZON(:) -! -JPROC = JPROC + 1 -YTITLE (JPROC) = 'MER_WIND' -YUNIT (JPROC) = 'm s-1' -YCOMMENT (JPROC) = 'meridian wind' -ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%MER(:) -! -JPROC = JPROC + 1 -YTITLE (JPROC) = 'W' -YUNIT (JPROC) = 'm s-1' -YCOMMENT (JPROC) = 'air vertical speed' -ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%W(:) -! -JPROC = JPROC + 1 -YTITLE (JPROC) = 'Th' -YUNIT (JPROC) = 'K' -YCOMMENT (JPROC) = 'potential temperature' -ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%TH(:) -! -DO JRR=1,SIZE(TPFLYER%R,2) - JPROC = JPROC+1 - YUNIT (JPROC) = 'kg kg-1' - ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%R(:,JRR) - IF (JRR==1) THEN - YTITLE (JPROC) = 'Rv' - YCOMMENT (JPROC) = 'water vapor mixing ratio' - ELSE IF (JRR==2) THEN - YTITLE (JPROC) = 'Rc' - YCOMMENT (JPROC) = 'liquid cloud water mixing ratio' - ELSE IF (JRR==3) THEN - YTITLE (JPROC) = 'Rr' - YCOMMENT (JPROC) = 'Rain water mixing ratio' - ELSE IF (JRR==4) THEN - YTITLE (JPROC) = 'Ri' - YCOMMENT (JPROC) = 'Ice cloud water mixing ratio' - ELSE IF (JRR==5) THEN - YTITLE (JPROC) = 'Rs' - YCOMMENT (JPROC) = 'Snow mixing ratio' - ELSE IF (JRR==6) THEN - YTITLE (JPROC) = 'Rg' - YCOMMENT (JPROC) = 'Graupel mixing ratio' - ELSE IF (JRR==7) THEN - YTITLE (JPROC) = 'Rh' - YCOMMENT (JPROC) = 'Hail mixing ratio' - END IF -END DO +SELECT TYPE ( TPFLYER ) + CLASS IS ( TAIRCRAFTDATA ) + IF (TPFLYER%LALTDEF) THEN + call Add_point( 'P', 'pressure', 'Pascal', tpflyer%xp(:) ) + ELSE + call Add_point( 'Z', 'altitude', 'm', tpflyer%xz(:) ) + ENDIF + + CLASS IS ( TBALLOONDATA ) + call Add_point( 'Z', 'altitude', 'm', tpflyer%xz(:) ) + +END SELECT +! +call Add_point( 'MODEL', 'model on which data was computed', '1', REAL( tpflyer%nmodelhist(:) ) ) +call Add_point( 'LON', 'longitude', 'degree', tpflyer%xlon(:) ) +call Add_point( 'LAT', 'latitude', 'degree', tpflyer%xlat(:) ) +call Add_point( 'ZON_WIND', 'zonal wind', 'm s-1', tpflyer%xzon(:) ) +call Add_point( 'MER_WIND', 'meridian wind', 'm s-1', tpflyer%xmer(:) ) +call Add_point( 'W', 'air vertical speed', 'm s-1', tpflyer%xw(:) ) +call Add_point( 'Th', 'potential temperature', 'K', tpflyer%xth(:) ) +! +if ( irr >= 1 ) call Add_point( 'Rv', 'water vapor mixing ratio', 'kg kg-1', tpflyer%xr(:,1) ) +if ( irr >= 2 ) call Add_point( 'Rc', 'liquid cloud water mixing ratio', 'kg kg-1', tpflyer%xr(:,2) ) +if ( irr >= 3 ) call Add_point( 'Rr', 'Rain water mixing ratio', 'kg kg-1', tpflyer%xr(:,3) ) +if ( irr >= 4 ) call Add_point( 'Ri', 'Ice cloud water mixing ratio', 'kg kg-1', tpflyer%xr(:,4) ) +if ( irr >= 5 ) call Add_point( 'Rs', 'Snow mixing ratio', 'kg kg-1', tpflyer%xr(:,5) ) +if ( irr >= 6 ) call Add_point( 'Rg', 'Graupel mixing ratio', 'kg kg-1', tpflyer%xr(:,6) ) +if ( irr >= 7 ) call Add_point( 'Rh', 'Hail mixing ratio', 'kg kg-1', tpflyer%xr(:,7) ) ! !add cloud liquid water content in g/m3 to compare to measurements from FSSP -!IF (.NOT.(ANY(TPFLYER%P(:) == 0.))) THEN -ALLOCATE (ZRHO(1,1,size(tpflyer%tpdates))) -IF (SIZE(TPFLYER%R,2) >1) THEN !cloud water is present +!IF (.NOT.(ANY(TPFLYER%XP(:) == 0.))) THEN +IF ( IRR > 1 ) THEN !cloud water is present + ALLOCATE( ZRHO(1, 1, ISTORE) ) + ALLOCATE( ZLWC(ISTORE) ) ZRHO(1,1,:) = 0. - DO JRR=1,SIZE(TPFLYER%R,2) - ZRHO(1,1,:) = ZRHO(1,1,:) + TPFLYER%R(:,JRR) + DO JRR = 1, IRR + ZRHO(1,1,:) = ZRHO(1,1,:) + TPFLYER%XR(:,JRR) ENDDO - ZRHO(1,1,:) = TPFLYER%TH(:) * ( 1. + XRV/XRD*TPFLYER%R(:,1) ) & + ZRHO(1,1,:) = TPFLYER%XTH(:) * ( 1. + XRV/XRD*TPFLYER%XR(:,1) ) & / ( 1. + ZRHO(1,1,:) ) - DO JPT=1,size(tpflyer%tpdates) - IF (TPFLYER%P(JPT) == 0.) THEN - ZRHO(1,1,JPT) = 0. + DO JPT=1,ISTORE + IF ( TPFLYER%NMODELHIST(JPT) > 0 ) THEN !Compute LWC only if flyer is flying + IF (TPFLYER%XP(JPT) == 0.) THEN + ZRHO(1,1,JPT) = 0. + ELSE + ZRHO(1,1,JPT) = TPFLYER%XP(JPT) / & + (XRD *ZRHO(1,1,JPT) *((TPFLYER%XP(JPT)/XP00)**(XRD/XCPD)) ) + ENDIF + ZLWC(JPT) = TPFLYER%XR(JPT,2) * ZRHO(1,1,JPT) * 1.E3 ELSE - ZRHO(1,1,JPT) = TPFLYER%P(JPT) / & - (XRD *ZRHO(1,1,JPT) *((TPFLYER%P(JPT)/XP00)**(XRD/XCPD)) ) - ENDIF - ENDDO - JPROC = JPROC + 1 - YTITLE (JPROC) = 'LWC' - YUNIT (JPROC) = 'g m-3' - YCOMMENT (JPROC) = 'cloud liquid water content' - ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%R(:,2)*ZRHO(1,1,:)*1.E3 - DEALLOCATE (ZRHO) -ENDIF -!ENDIF -! -IF (SIZE(TPFLYER%TKE)>0) THEN - JPROC = JPROC+1 - YTITLE (JPROC) = 'Tke' - YUNIT (JPROC) = 'm2 s-2' - YCOMMENT (JPROC) = 'Turbulent kinetic energy' - ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%TKE(:) + ZLWC(JPT) = XUNDEF + END IF + END DO + call Add_point( 'LWC', 'cloud liquid water content', 'g m-3', ZLWC(:) ) + DEALLOCATE( ZLWC, ZRHO ) END IF ! -JPROC = JPROC + 1 -YTITLE (JPROC) = 'H_FLUX' -YUNIT (JPROC) = 'W m-2' -YCOMMENT (JPROC) = 'sensible flux' -ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%THW_FLUX(:) -! -JPROC = JPROC + 1 -YTITLE (JPROC) = 'LE_FLUX' -YUNIT (JPROC) = 'W m-2' -YCOMMENT (JPROC) = 'latent flux' -ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%RCW_FLUX(:) -! -DO JSV=1,SIZE(TPFLYER%SVW_FLUX,2) - JPROC = JPROC + 1 - WRITE ( YTITLE(JPROC), FMT = '( A7, I3.3 )' ) 'SV_FLUX', JSV - YUNIT (JPROC) = 'SVUNIT m s-1' - YCOMMENT (JPROC) = 'scalar flux' - ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%SVW_FLUX(:,JSV) +IF (SIZE(TPFLYER%XTKE)>0) call Add_point( 'Tke', 'Turbulent kinetic energy', 'm2 s-2', tpflyer%xtke(:) ) +! +call Add_point( 'H_FLUX', 'sensible flux', 'W m-2', tpflyer%xthw_flux(:) ) +call Add_point( 'LE_FLUX', 'latent flux', 'W m-2', tpflyer%xrcw_flux(:) ) +! +DO JSV=1,SIZE(TPFLYER%XSVW_FLUX,2) + WRITE ( YTITLE, FMT = '( A, I3.3 )' ) 'SV_FLUX', JSV + call Add_point( Trim( ytitle ), 'scalar flux', 'SVUNIT m s-1', tpflyer%xsvw_flux(:,jsv) ) END DO IF (LDIAG_IN_RUN) THEN - JPROC = JPROC+1 - YTITLE (JPROC) = 'Tke_Diss' - YUNIT (JPROC) = 'm2 s-2' - YCOMMENT (JPROC) = 'TKE dissipation rate' - ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%TKE_DISS(:) + call Add_point( 'Tke_Diss', 'TKE dissipation rate', 'm2 s-2', tpflyer%xtke_diss(:) ) ENDIF ! -IF (SIZE(TPFLYER%SV,2)>=1) THEN - ! User scalar variables - DO JSV = 1,NSV_USER - JPROC = JPROC+1 - WRITE (YTITLE(JPROC),FMT='(A2,I3.3)') 'Sv',JSV - YUNIT (JPROC) = 'kg kg-1' - YCOMMENT (JPROC) = ' ' - ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%SV(:,JSV) - END DO - ! microphysical C2R2 scheme scalar variables - DO JSV = NSV_C2R2BEG,NSV_C2R2END - JPROC = JPROC+1 - YTITLE(JPROC)= TRIM(C2R2NAMES(JSV-NSV_C2R2BEG+1)) - YUNIT (JPROC) = 'm-3' - YCOMMENT (JPROC) = ' ' - ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%SV(:,JSV) - END DO - ! microphysical C3R5 scheme additional scalar variables - DO JSV = NSV_C1R3BEG,NSV_C1R3END - JPROC = JPROC+1 - YTITLE(JPROC)= TRIM(C1R3NAMES(JSV-NSV_C1R3BEG+1)) - YUNIT (JPROC) = 'm-3' - YCOMMENT (JPROC) = ' ' - ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%SV(:,JSV) - END DO -! LIMA variables - DO JSV=NSV_LIMA_BEG,NSV_LIMA_END - JPROC = JPROC+1 - YUNIT (JPROC) = 'kg-1' - YCOMMENT (JPROC) = ' ' - IF (JSV==NSV_LIMA_NC) YTITLE(JPROC)=TRIM(CLIMA_WARM_NAMES(1))//'T' - IF (JSV==NSV_LIMA_NR) YTITLE(JPROC)=TRIM(CLIMA_WARM_NAMES(2))//'T' - IF (JSV .GE. NSV_LIMA_CCN_FREE .AND. JSV .LT. NSV_LIMA_CCN_ACTI) THEN - WRITE(INDICE,'(I2.2)')(JSV - NSV_LIMA_CCN_FREE + 1) - YTITLE(JPROC)=TRIM(CLIMA_WARM_NAMES(3))//INDICE//'T' - ENDIF - IF (JSV .GE. NSV_LIMA_CCN_ACTI .AND. JSV .LT. NSV_LIMA_CCN_ACTI + NMOD_CCN) THEN - WRITE(INDICE,'(I2.2)')(JSV - NSV_LIMA_CCN_ACTI + 1) - YTITLE(JPROC)=TRIM(CLIMA_WARM_NAMES(4))//INDICE//'T' - ENDIF - IF (JSV .EQ. NSV_LIMA_SCAVMASS) THEN - YTITLE(JPROC)=TRIM(CAERO_MASS(1))//'T' - YUNIT (JPROC) = 'kg kg-1' - ENDIF - IF (JSV==NSV_LIMA_NI) YTITLE(JPROC)=TRIM(CLIMA_COLD_NAMES(1))//'T' - IF (JSV==NSV_LIMA_NS) YTITLE(JPROC)=TRIM(CLIMA_COLD_NAMES(2))//'T' - IF (JSV==NSV_LIMA_NG) YTITLE(JPROC)=TRIM(CLIMA_COLD_NAMES(3))//'T' - IF (JSV==NSV_LIMA_NH) YTITLE(JPROC)=TRIM(CLIMA_COLD_NAMES(4))//'T' - IF (JSV .GE. NSV_LIMA_IFN_FREE .AND. JSV .LT. NSV_LIMA_IFN_NUCL) THEN - WRITE(INDICE,'(I2.2)')(JSV - NSV_LIMA_IFN_FREE + 1) - YTITLE(JPROC)=TRIM(CLIMA_COLD_NAMES(5))//INDICE//'T' - ENDIF - IF (JSV .GE. NSV_LIMA_IFN_NUCL .AND. JSV .LT. NSV_LIMA_IFN_NUCL + NMOD_IFN) THEN - WRITE(INDICE,'(I2.2)')(JSV - NSV_LIMA_IFN_NUCL + 1) - YTITLE(JPROC)=TRIM(CLIMA_COLD_NAMES(6))//INDICE//'T' - ENDIF - IF (JSV .GE. NSV_LIMA_IMM_NUCL .AND. JSV .LT. NSV_LIMA_IMM_NUCL + NMOD_IMM) THEN - WRITE(INDICE,'(I2.2)')(NINDICE_CCN_IMM(JSV - NSV_LIMA_IMM_NUCL + 1)) - YTITLE(JPROC)=TRIM(CLIMA_COLD_NAMES(7))//INDICE//'T' - ENDIF - IF (JSV .EQ. NSV_LIMA_HOM_HAZE) YTITLE(JPROC)=TRIM(CLIMA_COLD_NAMES(8))//'T' - IF (JSV .EQ. NSV_LIMA_SPRO) YTITLE(JPROC)=TRIM(CLIMA_WARM_NAMES(5))//'T' - ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%SV(:,JSV) - END DO - ! electrical scalar variables - DO JSV = NSV_ELECBEG,NSV_ELECEND - JPROC = JPROC+1 - YTITLE(JPROC)= TRIM(CELECNAMES(JSV-NSV_ELECBEG+1)) - YUNIT (JPROC) = 'C' - YCOMMENT (JPROC) = ' ' - ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%SV(:,JSV) - END DO - ! chemical scalar variables - DO JSV = NSV_CHEMBEG,NSV_CHEMEND - JPROC = JPROC+1 - YTITLE(JPROC)= TRIM(CNAMES(JSV-NSV_CHEMBEG+1)) - YUNIT (JPROC) = 'ppb' - YCOMMENT (JPROC) = ' ' - ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%SV(:,JSV) * 1.E9 - END DO - ! LiNOX passive tracer - DO JSV = NSV_LNOXBEG,NSV_LNOXEND - JPROC = JPROC+1 - WRITE (YTITLE(JPROC),FMT='(A5)') 'LiNOx' - YUNIT (JPROC) = 'ppb' - YCOMMENT (JPROC) = ' ' - ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%SV(:,JSV) * 1.E9 - END DO - ! aerosol scalar variables - DO JSV = NSV_AERBEG,NSV_AEREND - JPROC = JPROC+1 - YTITLE(JPROC)= TRIM(CAERONAMES(JSV-NSV_AERBEG+1)) - YUNIT (JPROC) = 'ppb' - YCOMMENT (JPROC) = ' ' - ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%SV(:,JSV) * 1.E9 +IF (SIZE(TPFLYER%XSV,2)>=1) THEN + ! Scalar variables + DO JSV = 1, NSV + IF ( TRIM( TSVLIST(JSV)%CUNITS ) == 'ppv' ) THEN + call Add_point( Trim( tsvlist(jsv)%cmnhname ), '', 'ppb', tpflyer%xsv(:,jsv) * 1.e9 ) !*1e9 for conversion ppv->ppb + ELSE + call Add_point( Trim( tsvlist(jsv)%cmnhname ), '', Trim( tsvlist(jsv)%cunits ), tpflyer%xsv(:,jsv) ) + END IF END DO - IF ((LORILAM).AND. .NOT.(ANY(TPFLYER%P(:) == 0.))) THEN - - ALLOCATE (ZSV(1,1,size(tpflyer%tpdates),NSV_AER)) - ALLOCATE (ZRHO(1,1,size(tpflyer%tpdates))) - ALLOCATE (ZN0(1,1,size(tpflyer%tpdates),JPMODE)) - ALLOCATE (ZRG(1,1,size(tpflyer%tpdates),JPMODE)) - ALLOCATE (ZSIG(1,1,size(tpflyer%tpdates),JPMODE)) - ALLOCATE (ZPTOTA(1,1,size(tpflyer%tpdates),NSP+NCARB+NSOA,JPMODE)) - ZSV(1,1,:,1:NSV_AER) = TPFLYER%SV(:,NSV_AERBEG:NSV_AEREND) - IF (SIZE(TPFLYER%R,2) >0) THEN + + IF ((LORILAM).AND. .NOT.(ANY(TPFLYER%XP(:) == 0.))) THEN + + ALLOCATE (ZSV(1,1,ISTORE,NSV_AER)) + ALLOCATE (ZRHO(1,1,ISTORE)) + ALLOCATE (ZN0(1,1,ISTORE,JPMODE)) + ALLOCATE (ZRG(1,1,ISTORE,JPMODE)) + ALLOCATE (ZSIG(1,1,ISTORE,JPMODE)) + ALLOCATE (ZPTOTA(1,1,ISTORE,NSP+NCARB+NSOA,JPMODE)) + ZSV(1,1,:,1:NSV_AER) = TPFLYER%XSV(:,NSV_AERBEG:NSV_AEREND) + IF (IRR >0) THEN ZRHO(1,1,:) = 0. - DO JRR=1,SIZE(TPFLYER%R,2) - ZRHO(1,1,:) = ZRHO(1,1,:) + TPFLYER%R(:,JRR) + DO JRR=1,IRR + ZRHO(1,1,:) = ZRHO(1,1,:) + TPFLYER%XR(:,JRR) ENDDO - ZRHO(1,1,:) = TPFLYER%TH(:) * ( 1. + XRV/XRD*TPFLYER%R(:,1) ) & - / ( 1. + ZRHO(1,1,:) ) + ZRHO(1,1,:) = TPFLYER%XTH(:) * ( 1. + XRV/XRD*TPFLYER%XR(:,1) ) & + / ( 1. + ZRHO(1,1,:) ) ELSE - ZRHO(1,1,:) = TPFLYER%TH(:) + ZRHO(1,1,:) = TPFLYER%XTH(:) ENDIF - ZRHO(1,1,:) = TPFLYER%P(:) / & - (XRD *ZRHO(1,1,:) *((TPFLYER%P(:)/XP00)**(XRD/XCPD)) ) + ZRHO(1,1,:) = TPFLYER%XP(:) / & + (XRD *ZRHO(1,1,:) *((TPFLYER%XP(:)/XP00)**(XRD/XCPD)) ) ZSIG = 0. ZRG = 0. ZN0 = 0. ZPTOTA = 0. - DO JPT=1,size(tpflyer%tpdates) ! prevent division by zero if ZSV = 0. + DO JPT=1,ISTORE ! prevent division by zero if ZSV = 0. IF (ALL(ZSV(1,1,JPT,:)/=0.)) THEN CALL PPP2AERO(ZSV,ZRHO, PSIG3D=ZSIG, PRG3D=ZRG, PN3D=ZN0, PCTOTA=ZPTOTA) ENDIF ENDDO DO JSV=1,JPMODE ! mean radius - JPROC = JPROC+1 - WRITE(YTITLE(JPROC),'(A6,I1)')'AERRGA',JSV - YUNIT (JPROC) = 'um' - WRITE(YCOMMENT(JPROC),'(A18,I1)')'RG (nb) AERO MODE ',JSV - ZWORK6 (1,1,1,:,1,JPROC) = ZRG(1,1,:,JSV) + WRITE(YTITLE,'(A,I1)')'AERRGA',JSV + WRITE(YCOMMENT,'(A,I1)')'RG (nb) AERO MODE ',JSV + call Add_point( Trim( ytitle ), 'um', Trim( ycomment ), ZRG(1,1,:,JSV) ) ! standard deviation - JPROC = JPROC+1 - WRITE(YTITLE(JPROC),'(A7,I1)')'AERSIGA',JSV - YUNIT (JPROC) = ' ' - WRITE(YCOMMENT(JPROC),'(A16,I1)')'SIGMA AERO MODE ',JSV - ZWORK6 (1,1,1,:,1,JPROC) = ZSIG(1,1,:,JSV) + WRITE(YTITLE,'(A,I1)')'AERSIGA',JSV + WRITE(YCOMMENT,'(A,I1)')'SIGMA AERO MODE ',JSV + call Add_point( Trim( ytitle ), '1', Trim( ycomment ), ZSIG(1,1,:,JSV) ) ! particles number - JPROC = JPROC+1 - WRITE(YTITLE(JPROC),'(A6,I1)')'AERN0A',JSV - YUNIT (JPROC) = 'm-3' - WRITE(YCOMMENT(JPROC),'(A13,I1)')'N0 AERO MODE ',JSV - ZWORK6 (1,1,1,:,1,JPROC) = ZN0(1,1,:,JSV) + WRITE(YTITLE,'(A,I1)')'AERN0A',JSV + WRITE(YCOMMENT,'(A,I1)')'N0 AERO MODE ',JSV + call Add_point( Trim( ytitle ), 'm-3', Trim( ycomment ), ZN0(1,1,:,JSV) ) ! mass concentration in microg/m3 ! sulfate - JPROC = JPROC + 1 - WRITE(YTITLE(JPROC),'(A4,I1)')'MSO4',JSV - YUNIT (JPROC) = 'ug m-3' - WRITE(YCOMMENT(JPROC),'(A22,I1)')'MASS SO4 AEROSOL MODE ',JSV - ZWORK6(1,1,1,:,1,JPROC) = ZPTOTA(1,1,:,JP_AER_SO4,JSV) + WRITE(YTITLE,'(A,I1)')'MSO4',JSV + WRITE(YCOMMENT,'(A,I1)')'MASS SO4 AEROSOL MODE ',JSV + call Add_point( Trim( ytitle ), 'ug m-3', Trim( ycomment ), ZPTOTA(1,1,:,JP_AER_SO4,JSV) ) ! nitrate - JPROC = JPROC + 1 - WRITE(YTITLE(JPROC),'(A4,I1)')'MNO3',JSV - YUNIT (JPROC) = 'ug m-3' - WRITE(YCOMMENT(JPROC),'(A22,I1)')'MASS NO3 AEROSOL MODE ',JSV - ZWORK6(1,1,1,:,1,JPROC) = ZPTOTA(1,1,:,JP_AER_NO3,JSV) + WRITE(YTITLE,'(A,I1)')'MNO3',JSV + WRITE(YCOMMENT,'(A,I1)')'MASS NO3 AEROSOL MODE ',JSV + call Add_point( Trim( ytitle ), 'ug m-3', Trim( ycomment ), ZPTOTA(1,1,:,JP_AER_NO3,JSV) ) ! amoniac - JPROC = JPROC + 1 - WRITE(YTITLE(JPROC),'(A4,I1)')'MNH3',JSV - YUNIT (JPROC) = 'ug m-3' - WRITE(YCOMMENT(JPROC),'(A22,I1)')'MASS NH3 AEROSOL MODE ',JSV - ZWORK6(1,1,1,:,1,JPROC) = ZPTOTA(1,1,:,JP_AER_NH3,JSV) + WRITE(YTITLE,'(A,I1)')'MNH3',JSV + WRITE(YCOMMENT,'(A,I1)')'MASS NH3 AEROSOL MODE ',JSV + call Add_point( Trim( ytitle ), 'ug m-3', Trim( ycomment ), ZPTOTA(1,1,:,JP_AER_NH3,JSV) ) ! water - JPROC = JPROC + 1 - WRITE(YTITLE(JPROC),'(A4,I1)')'MH2O',JSV - YUNIT (JPROC) = 'ug m-3' - WRITE(YCOMMENT(JPROC),'(A22,I1)')'MASS H2O AEROSOL MODE ',JSV - ZWORK6(1,1,1,:,1,JPROC) = ZPTOTA(1,1,:,JP_AER_H2O,JSV) + WRITE(YTITLE,'(A,I1)')'MH2O',JSV + WRITE(YCOMMENT,'(A,I1)')'MASS H2O AEROSOL MODE ',JSV + call Add_point( Trim( ytitle ), 'ug m-3', Trim( ycomment ), ZPTOTA(1,1,:,JP_AER_H2O,JSV) ) IF (NSOA .EQ. 10) THEN ! SOA1 - JPROC = JPROC + 1 - WRITE(YTITLE(JPROC),'(A4,I1)')'MSOA1',JSV - YUNIT (JPROC) = 'ug m-3' - WRITE(YCOMMENT(JPROC),'(A22,I1)')'MASS SOA1 AEROSOL MODE ',JSV - ZWORK6(1,1,1,:,1,JPROC) = ZPTOTA(1,1,:,JP_AER_SOA1,JSV) + WRITE(YTITLE,'(A,I1)')'MSOA1',JSV + WRITE(YCOMMENT,'(A,I1)')'MASS SOA1 AEROSOL MODE ',JSV + call Add_point( Trim( ytitle ), 'ug m-3', Trim( ycomment ), ZPTOTA(1,1,:,JP_AER_SOA1,JSV) ) ! SOA2 - JPROC = JPROC + 1 - WRITE(YTITLE(JPROC),'(A4,I1)')'MSOA2',JSV - YUNIT (JPROC) = 'ug m-3' - WRITE(YCOMMENT(JPROC),'(A22,I1)')'MASS SOA2 AEROSOL MODE ',JSV - ZWORK6(1,1,1,:,1,JPROC) = ZPTOTA(1,1,:,JP_AER_SOA2,JSV) + WRITE(YTITLE,'(A,I1)')'MSOA2',JSV + WRITE(YCOMMENT,'(A,I1)')'MASS SOA2 AEROSOL MODE ',JSV + call Add_point( Trim( ytitle ), 'ug m-3', Trim( ycomment ), ZPTOTA(1,1,:,JP_AER_SOA2,JSV) ) ! SOA3 - JPROC = JPROC + 1 - WRITE(YTITLE(JPROC),'(A4,I1)')'MSOA3',JSV - YUNIT (JPROC) = 'ug m-3' - WRITE(YCOMMENT(JPROC),'(A22,I1)')'MASS SOA3 AEROSOL MODE ',JSV - ZWORK6(1,1,1,:,1,JPROC) = ZPTOTA(1,1,:,JP_AER_SOA3,JSV) + WRITE(YTITLE,'(A,I1)')'MSOA3',JSV + WRITE(YCOMMENT,'(A,I1)')'MASS SOA3 AEROSOL MODE ',JSV + call Add_point( Trim( ytitle ), 'ug m-3', Trim( ycomment ), ZPTOTA(1,1,:,JP_AER_SOA3,JSV) ) ! SOA4 - JPROC = JPROC + 1 - WRITE(YTITLE(JPROC),'(A4,I1)')'MSOA4',JSV - YUNIT (JPROC) = 'ug m-3' - WRITE(YCOMMENT(JPROC),'(A22,I1)')'MASS SOA4 AEROSOL MODE ',JSV - ZWORK6(1,1,1,:,1,JPROC) = ZPTOTA(1,1,:,JP_AER_SOA4,JSV) + WRITE(YTITLE,'(A,I1)')'MSOA4',JSV + WRITE(YCOMMENT,'(A,I1)')'MASS SOA4 AEROSOL MODE ',JSV + call Add_point( Trim( ytitle ), 'ug m-3', Trim( ycomment ), ZPTOTA(1,1,:,JP_AER_SOA4,JSV) ) ! SOA5 - JPROC = JPROC + 1 - WRITE(YTITLE(JPROC),'(A4,I1)')'MSOA5',JSV - YUNIT (JPROC) = 'ug m-3' - WRITE(YCOMMENT(JPROC),'(A22,I1)')'MASS SOA5 AEROSOL MODE ',JSV - ZWORK6(1,1,1,:,1,JPROC) = ZPTOTA(1,1,:,JP_AER_SOA5,JSV) + WRITE(YTITLE,'(A,I1)')'MSOA5',JSV + WRITE(YCOMMENT,'(A,I1)')'MASS SOA5 AEROSOL MODE ',JSV + call Add_point( Trim( ytitle ), 'ug m-3', Trim( ycomment ), ZPTOTA(1,1,:,JP_AER_SOA5,JSV) ) ! SOA6 - JPROC = JPROC + 1 - WRITE(YTITLE(JPROC),'(A4,I1)')'MSOA6',JSV - YUNIT (JPROC) = 'ug m-3' - WRITE(YCOMMENT(JPROC),'(A22,I1)')'MASS SOA6 AEROSOL MODE ',JSV - ZWORK6(1,1,1,:,1,JPROC) = ZPTOTA(1,1,:,JP_AER_SOA6,JSV) + WRITE(YTITLE,'(A,I1)')'MSOA6',JSV + WRITE(YCOMMENT,'(A,I1)')'MASS SOA6 AEROSOL MODE ',JSV + call Add_point( Trim( ytitle ), 'ug m-3', Trim( ycomment ), ZPTOTA(1,1,:,JP_AER_SOA6,JSV) ) ! SOA7 - JPROC = JPROC + 1 - WRITE(YTITLE(JPROC),'(A4,I1)')'MSOA7',JSV - YUNIT (JPROC) = 'ug m-3' - WRITE(YCOMMENT(JPROC),'(A22,I1)')'MASS SOA7 AEROSOL MODE ',JSV - ZWORK6(1,1,1,:,1,JPROC) = ZPTOTA(1,1,:,JP_AER_SOA7,JSV) + WRITE(YTITLE,'(A,I1)')'MSOA7',JSV + WRITE(YCOMMENT,'(A,I1)')'MASS SOA7 AEROSOL MODE ',JSV + call Add_point( Trim( ytitle ), 'ug m-3', Trim( ycomment ), ZPTOTA(1,1,:,JP_AER_SOA7,JSV) ) ! SOA8 - JPROC = JPROC + 1 - WRITE(YTITLE(JPROC),'(A4,I1)')'MSOA8',JSV - YUNIT (JPROC) = 'ug m-3' - WRITE(YCOMMENT(JPROC),'(A22,I1)')'MASS SOA8 AEROSOL MODE ',JSV - ZWORK6(1,1,1,:,1,JPROC) = ZPTOTA(1,1,:,JP_AER_SOA8,JSV) + WRITE(YTITLE,'(A,I1)')'MSOA8',JSV + WRITE(YCOMMENT,'(A,I1)')'MASS SOA8 AEROSOL MODE ',JSV + call Add_point( Trim( ytitle ), 'ug m-3', Trim( ycomment ), ZPTOTA(1,1,:,JP_AER_SOA8,JSV) ) ! SOA9 - JPROC = JPROC + 1 - WRITE(YTITLE(JPROC),'(A4,I1)')'MSOA9',JSV - YUNIT (JPROC) = 'ug m-3' - WRITE(YCOMMENT(JPROC),'(A22,I1)')'MASS SOA9 AEROSOL MODE ',JSV - ZWORK6(1,1,1,:,1,JPROC) = ZPTOTA(1,1,:,JP_AER_SOA9,JSV) + WRITE(YTITLE,'(A,I1)')'MSOA9',JSV + WRITE(YCOMMENT,'(A,I1)')'MASS SOA9 AEROSOL MODE ',JSV + call Add_point( Trim( ytitle ), 'ug m-3', Trim( ycomment ), ZPTOTA(1,1,:,JP_AER_SOA9,JSV) ) ! SOA10 - JPROC = JPROC + 1 - WRITE(YTITLE(JPROC),'(A4,I1)')'MSOA10',JSV - YUNIT (JPROC) = 'ug m-3' - WRITE(YCOMMENT(JPROC),'(A22,I1)')'MASS SOA10 AEROSOL MODE ',JSV - ZWORK6(1,1,1,:,1,JPROC) = ZPTOTA(1,1,:,JP_AER_SOA10,JSV) + WRITE(YTITLE,'(A,I1)')'MSOA10',JSV + WRITE(YCOMMENT,'(A,I1)')'MASS SOA10 AEROSOL MODE ',JSV + call Add_point( Trim( ytitle ), 'ug m-3', Trim( ycomment ), ZPTOTA(1,1,:,JP_AER_SOA10,JSV) ) ENDIF ! OC - JPROC = JPROC + 1 - WRITE(YTITLE(JPROC),'(A4,I1)')'MOC',JSV - YUNIT (JPROC) = 'ug m-3' - WRITE(YCOMMENT(JPROC),'(A22,I1)')'MASS OC AEROSOL MODE ',JSV - ZWORK6(1,1,1,:,1,JPROC) = ZPTOTA(1,1,:,JP_AER_OC,JSV) + WRITE(YTITLE,'(A,I1)')'MOC',JSV + WRITE(YCOMMENT,'(A,I1)')'MASS OC AEROSOL MODE ',JSV + call Add_point( Trim( ytitle ), 'ug m-3', Trim( ycomment ), ZPTOTA(1,1,:,JP_AER_OC,JSV) ) ! BC - JPROC = JPROC + 1 - WRITE(YTITLE(JPROC),'(A4,I1)')'MBC',JSV - YUNIT (JPROC) = 'ug m-3' - WRITE(YCOMMENT(JPROC),'(A22,I1)')'MASS BC AEROSOL MODE ',JSV - ZWORK6(1,1,1,:,1,JPROC) = ZPTOTA(1,1,:,JP_AER_BC,JSV) + WRITE(YTITLE,'(A,I1)')'MBC',JSV + WRITE(YCOMMENT,'(A,I1)')'MASS BC AEROSOL MODE ',JSV + call Add_point( Trim( ytitle ), 'ug m-3', Trim( ycomment ), ZPTOTA(1,1,:,JP_AER_BC,JSV) ) ! dust - JPROC = JPROC + 1 - WRITE(YTITLE(JPROC),'(A4,I1)')'MDUST',JSV - YUNIT (JPROC) = 'ug m-3' - WRITE(YCOMMENT(JPROC),'(A22,I1)')'MASS DUST AEROSOL MODE ',JSV - ZWORK6(1,1,1,:,1,JPROC) = ZPTOTA(1,1,:,JP_AER_DST,JSV) + WRITE(YTITLE,'(A,I1)')'MDUST',JSV + WRITE(YCOMMENT,'(A,I1)')'MASS DUST AEROSOL MODE ',JSV + call Add_point( Trim( ytitle ), 'ug m-3', Trim( ycomment ), ZPTOTA(1,1,:,JP_AER_DST,JSV) ) ENDDO - DEALLOCATE (ZSV,ZRHO) - DEALLOCATE (ZN0,ZRG,ZSIG,ZPTOTA) + DEALLOCATE (ZSV,ZRHO) + DEALLOCATE (ZN0,ZRG,ZSIG,ZPTOTA) END IF -! dust scalar variables - DO JSV = NSV_DSTBEG,NSV_DSTEND - JPROC = JPROC+1 - YTITLE(JPROC)= TRIM(CDUSTNAMES(JSV-NSV_DSTBEG+1)) - YUNIT (JPROC) = 'ppb' - YCOMMENT (JPROC) = ' ' - ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%SV(:,JSV) * 1.E9 - END DO - IF ((LDUST).AND. .NOT.(ANY(TPFLYER%P(:) == 0.))) THEN - ALLOCATE (ZSV(1,1,size(tpflyer%tpdates),NSV_DST)) - ALLOCATE (ZRHO(1,1,size(tpflyer%tpdates))) - ALLOCATE (ZN0(1,1,size(tpflyer%tpdates),NMODE_DST)) - ALLOCATE (ZRG(1,1,size(tpflyer%tpdates),NMODE_DST)) - ALLOCATE (ZSIG(1,1,size(tpflyer%tpdates),NMODE_DST)) - ZSV(1,1,:,1:NSV_DST) = TPFLYER%SV(:,NSV_DSTBEG:NSV_DSTEND) - IF (SIZE(TPFLYER%R,2) >0) THEN + + IF ((LDUST).AND. .NOT.(ANY(TPFLYER%XP(:) == 0.))) THEN + ALLOCATE (ZSV(1,1,ISTORE,NSV_DST)) + ALLOCATE (ZRHO(1,1,ISTORE)) + ALLOCATE (ZN0(1,1,ISTORE,NMODE_DST)) + ALLOCATE (ZRG(1,1,ISTORE,NMODE_DST)) + ALLOCATE (ZSIG(1,1,ISTORE,NMODE_DST)) + ZSV(1,1,:,1:NSV_DST) = TPFLYER%XSV(:,NSV_DSTBEG:NSV_DSTEND) + IF (IRR >0) THEN ZRHO(1,1,:) = 0. - DO JRR=1,SIZE(TPFLYER%R,2) - ZRHO(1,1,:) = ZRHO(1,1,:) + TPFLYER%R(:,JRR) + DO JRR=1,IRR + ZRHO(1,1,:) = ZRHO(1,1,:) + TPFLYER%XR(:,JRR) ENDDO - ZRHO(1,1,:) = TPFLYER%TH(:) * ( 1. + XRV/XRD*TPFLYER%R(:,1) ) & - / ( 1. + ZRHO(1,1,:) ) + ZRHO(1,1,:) = TPFLYER%XTH(:) * ( 1. + XRV/XRD*TPFLYER%XR(:,1) ) & + / ( 1. + ZRHO(1,1,:) ) ELSE - ZRHO(1,1,:) = TPFLYER%TH(:) + ZRHO(1,1,:) = TPFLYER%XTH(:) ENDIF - ZRHO(1,1,:) = TPFLYER%P(:) / & - (XRD *ZRHO(1,1,:) *((TPFLYER%P(:)/XP00)**(XRD/XCPD)) ) + ZRHO(1,1,:) = TPFLYER%XP(:) / & + (XRD *ZRHO(1,1,:) *((TPFLYER%XP(:)/XP00)**(XRD/XCPD)) ) CALL PPP2DUST(ZSV,ZRHO, PSIG3D=ZSIG, PRG3D=ZRG, PN3D=ZN0) DO JSV=1,NMODE_DST ! mean radius - JPROC = JPROC+1 - WRITE(YTITLE(JPROC),'(A6,I1)')'DSTRGA',JSV - YUNIT (JPROC) = 'um' - WRITE(YCOMMENT(JPROC),'(A18,I1)')'RG (nb) DUST MODE ',JSV - ZWORK6 (1,1,1,:,1,JPROC) = ZRG(1,1,:,JSV) + WRITE(YTITLE,'(A,I1)')'DSTRGA',JSV + WRITE(YCOMMENT,'(A,I1)')'RG (nb) DUST MODE ',JSV + call Add_point( Trim( ytitle ), 'um', Trim( ycomment ), ZRG(1,1,:,JSV) ) ! standard deviation - JPROC = JPROC+1 - WRITE(YTITLE(JPROC),'(A7,I1)')'DSTSIGA',JSV - YUNIT (JPROC) = ' ' - WRITE(YCOMMENT(JPROC),'(A16,I1)')'SIGMA DUST MODE ',JSV - ZWORK6 (1,1,1,:,1,JPROC) = ZSIG(1,1,:,JSV) + WRITE(YTITLE,'(A,I1)')'DSTSIGA',JSV + WRITE(YCOMMENT,'(A,I1)')'SIGMA DUST MODE ',JSV + call Add_point( Trim( ytitle ), '1', Trim( ycomment ), ZSIG(1,1,:,JSV) ) ! particles number - JPROC = JPROC+1 - WRITE(YTITLE(JPROC),'(A6,I1)')'DSTN0A',JSV - YUNIT (JPROC) = 'm-3' - WRITE(YCOMMENT(JPROC),'(A13,I1)')'N0 DUST MODE ',JSV - ZWORK6 (1,1,1,:,1,JPROC) = ZN0(1,1,:,JSV) + WRITE(YTITLE,'(A,I1)')'DSTN0A',JSV + WRITE(YCOMMENT,'(A,I1)')'N0 DUST MODE ',JSV + call Add_point( Trim( ytitle ), 'm-3', Trim( ycomment ), ZN0(1,1,:,JSV) ) ENDDO - DEALLOCATE (ZSV,ZRHO) - DEALLOCATE (ZN0,ZRG,ZSIG) + DEALLOCATE (ZSV,ZRHO) + DEALLOCATE (ZN0,ZRG,ZSIG) END IF - ! sea salt scalar variables - DO JSV = NSV_SLTBEG,NSV_SLTEND - JPROC = JPROC+1 - YTITLE(JPROC)= TRIM(CSALTNAMES(JSV-NSV_SLTBEG+1)) - YUNIT (JPROC) = 'ppb' - YCOMMENT (JPROC) = ' ' - ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%SV(:,JSV) * 1.E9 - END DO ENDIF ! -IF (SIZE(TPFLYER%TSRAD)>0) THEN +IF (SIZE(TPFLYER%XTSRAD)>0) THEN JPROC = JPROC+1 - YTITLE (JPROC) = 'Tsrad' - YUNIT (JPROC) = 'K' - YCOMMENT (JPROC) = 'Radiative Surface Temperature' - ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%TSRAD(:) + CTITLE (JPROC) = 'Tsrad' + CUNIT (JPROC) = 'K' + CCOMMENT (JPROC) = 'Radiative Surface Temperature' + XWORK6 (1,1,1,:,1,JPROC) = TPFLYER%XTSRAD(:) END IF ! -DO IK=1, IKU -! - JPROCZ=0 -! - JPROCZ = JPROCZ + 1 - YTITLEZ (JPROCZ) = 'Rt' - YUNITZ (JPROCZ) = 'kg kg-1' - YCOMMENTZ(JPROCZ) = '1D Total hydrometeor mixing ratio' - ZWORKZ6 (1,1,IK,:,1,JPROCZ) = TPFLYER%RTZ(:,IK) -! - DO JRR=1,SIZE(TPFLYER%RZ,3) - JPROCZ = JPROCZ+1 - YUNITZ (JPROCZ) = 'kg kg-1' - ZWORKZ6 (1,1,IK,:,1,JPROCZ) = TPFLYER%RZ(:,IK,JRR) - IF (JRR==1) THEN - YTITLEZ (JPROCZ) = 'Rv' - YCOMMENTZ (JPROCZ) = '1D water vapor mixing ratio' - ELSE IF (JRR==2) THEN - YTITLEZ (JPROCZ) = 'Rc' - YCOMMENTZ (JPROCZ) = '1D liquid cloud water mixing ratio' - ELSE IF (JRR==3) THEN - YTITLEZ (JPROCZ) = 'Rr' - YCOMMENTZ (JPROCZ) = '1D Rain water mixing ratio' - ELSE IF (JRR==4) THEN - YTITLEZ (JPROCZ) = 'Ri' - YCOMMENTZ (JPROCZ) = '1D Ice cloud water mixing ratio' - ELSE IF (JRR==5) THEN - YTITLEZ (JPROCZ) = 'Rs' - YCOMMENTZ (JPROCZ) = '1D Snow mixing ratio' - ELSE IF (JRR==6) THEN - YTITLEZ (JPROCZ) = 'Rg' - YCOMMENTZ (JPROCZ) = '1D Graupel mixing ratio' - ELSE IF (JRR==7) THEN - YTITLEZ (JPROCZ) = 'Rh' - YCOMMENTZ (JPROCZ) = '1D Hail mixing ratio' - END IF - END DO -! - JPROCZ = JPROCZ + 1 - YTITLEZ (JPROCZ) = 'FF' - YUNITZ (JPROCZ) = 'm s-1' - YCOMMENTZ(JPROCZ) = 'Horizontal wind' - ZWORKZ6 (1,1,IK,:,1,JPROCZ) = TPFLYER%FFZ(:,IK) -! - JPROCZ = JPROCZ + 1 - YTITLEZ (JPROCZ) = 'IWC' - YUNITZ (JPROCZ) = 'kg m-3' - YCOMMENTZ(JPROCZ) = 'Ice water content' - ZWORKZ6 (1,1,IK,:,1,JPROCZ) = TPFLYER%IWCZ(:,IK) -! - JPROCZ = JPROCZ + 1 - YTITLEZ (JPROCZ) = 'LWC' - YUNITZ (JPROCZ) = 'kg m-3' - YCOMMENTZ(JPROCZ) = 'Liquid water content' - ZWORKZ6 (1,1,IK,:,1,JPROCZ) = TPFLYER%LWCZ(:,IK) -! - IF (NSV_LIMA_BEG/=NSV_LIMA_END) THEN - JPROCZ = JPROCZ + 1 - YTITLEZ (JPROCZ) = 'CIT' - YUNITZ (JPROCZ) = 'm-3' - YCOMMENTZ(JPROCZ) = 'Ice concentration' - ZWORKZ6 (1,1,IK,:,1,JPROCZ) = TPFLYER%CIZ(:,IK) - ELSE - JPROCZ = JPROCZ + 1 - YTITLEZ (JPROCZ) = 'CCLOUDT' - YUNITZ (JPROCZ) = 'kg-1' - YCOMMENTZ(JPROCZ) = 'liquid cloud concentration' - ZWORKZ6 (1,1,IK,:,1,JPROCZ) = TPFLYER%CCZ(:,IK) -! - JPROCZ = JPROCZ + 1 - YTITLEZ (JPROCZ) = 'CRAINT' - YUNITZ (JPROCZ) = 'kg-1' - YCOMMENTZ(JPROCZ) = 'Rain concentration' - ZWORKZ6 (1,1,IK,:,1,JPROCZ) = TPFLYER%CRZ(:,IK) -! - JPROCZ = JPROCZ + 1 - YTITLEZ (JPROCZ) = 'CICET' - YUNITZ (JPROCZ) = 'kg-1' - YCOMMENTZ(JPROCZ) = 'Ice concentration' - ZWORKZ6 (1,1,IK,:,1,JPROCZ) = TPFLYER%CIZ(:,IK) - ENDIF -! - JPROCZ = JPROCZ + 1 - YTITLEZ (JPROCZ) = 'RARE' - YUNITZ (JPROCZ) = 'dBZ' - YCOMMENTZ(JPROCZ) = '1D cloud radar reflectivity' - ZWORKZ6 (1,1,IK,:,1,JPROCZ) = TPFLYER%CRARE(:,IK) - JPROCZ = JPROCZ + 1 - YTITLEZ (JPROCZ) = 'RAREatt' - YUNITZ (JPROCZ) = 'dBZ' - YCOMMENTZ(JPROCZ) = '1D cloud radar attenuated reflectivity' - ZWORKZ6 (1,1,IK,:,1,JPROCZ) = TPFLYER%CRARE_ATT(:,IK) - JPROCZ = JPROCZ + 1 - YTITLEZ (JPROCZ) = 'W' - YUNITZ (JPROCZ) = 'm s-1' - YCOMMENTZ(JPROCZ) = '1D vertical velocity' - ZWORKZ6 (1,1,IK,:,1,JPROCZ) = TPFLYER%WZ(:,IK) - JPROCZ = JPROCZ + 1 - YTITLEZ (JPROCZ) = 'Z' - YUNITZ (JPROCZ) = 'm' - YCOMMENTZ(JPROCZ) = '1D altitude above sea' - ZWORKZ6 (1,1,IK,:,1,JPROCZ) = TPFLYER%ZZ(:,IK) -END DO -!---------------------------------------------------------------------------- -! -ALLOCATE (ZW6(1,1,1,size(tpflyer%tpdates),1,JPROC)) -ZW6 = ZWORK6(:,:,:,:,:,:JPROC) -DEALLOCATE(ZWORK6) -ALLOCATE (ZWZ6(1,1,IKU,size(tpflyer%tpdates),1,JPROCZ)) -ZWZ6 = ZWORKZ6(:,:,:,:,:,:JPROCZ) -DEALLOCATE(ZWORKZ6) -! allocate( tzfields( jproc ) ) -tzfields(:)%cmnhname = ytitle(1 : jproc) +tzfields(:)%cmnhname = ctitle(1 : jproc) tzfields(:)%cstdname = '' -tzfields(:)%clongname = ytitle(1 : jproc) -tzfields(:)%cunits = yunit(1 : jproc) -tzfields(:)%ccomment = ycomment(1 : jproc) +tzfields(:)%clongname = ctitle(1 : jproc) +tzfields(:)%cunits = cunit(1 : jproc) +tzfields(:)%ccomment = ccomment(1 : jproc) tzfields(:)%ngrid = 0 tzfields(:)%ntype = TYPEREAL tzfields(:)%ndims = 2 @@ -868,12 +558,12 @@ call Aircraft_balloon_longtype_get( tpflyer, tzbudiachro%clevels(NLVL_SUBCATEGOR tzbudiachro%ccomments(NLVL_SUBCATEGORY) = 'Level for the flyers of type: ' // Trim( tzbudiachro%clevels(NLVL_SUBCATEGORY) ) tzbudiachro%lleveluse(NLVL_GROUP) = .true. -tzbudiachro%clevels (NLVL_GROUP) = Trim( ygroup ) -tzbudiachro%ccomments(NLVL_GROUP) = 'Values for flyer ' // Trim( tpflyer%title ) +tzbudiachro%clevels (NLVL_GROUP) = Trim( tpflyer%ctitle ) +tzbudiachro%ccomments(NLVL_GROUP) = 'Values for flyer ' // Trim( tpflyer%ctitle ) tzbudiachro%lleveluse(NLVL_SHAPE) = .true. tzbudiachro%clevels (NLVL_SHAPE) = 'Point' -tzbudiachro%ccomments(NLVL_SHAPE) = 'Values at position of flyer ' // Trim( tpflyer%title ) +tzbudiachro%ccomments(NLVL_SHAPE) = 'Values at position of flyer ' // Trim( tpflyer%ctitle ) tzbudiachro%lleveluse(NLVL_TIMEAVG) = .false. tzbudiachro%clevels (NLVL_TIMEAVG) = 'Not_time_averaged' @@ -904,18 +594,61 @@ tzbudiachro%lnorm = .false. ! tzbudiachro%nkl = NOT SET (default values) ! tzbudiachro%nkh = NOT SET (default values) -call Write_diachro( tpdiafile, tzbudiachro, tzfields, tpflyer%tpdates, zw6, & - tpflyer = tpflyer ) +call Write_diachro( tpdiafile, tzbudiachro, tzfields, tpflyer%tflyer_time%tpdates, xwork6(:,:,:,:,:,:jproc), & + tpflyer = tpflyer ) -deallocate( tzfields ) +Deallocate( tzfields ) +Deallocate( xwork6 ) +Deallocate( ccomment ) +Deallocate( ctitle ) +Deallocate( cunit ) + +!---------------------------------------------------------------------------- +!Treat vertical profiles + +ALLOCATE (XWORK6(1,1,IKU,ISTORE,1,IPROCZ)) +ALLOCATE (CCOMMENT(IPROCZ)) +ALLOCATE (CTITLE (IPROCZ)) +ALLOCATE (CUNIT (IPROCZ)) + +JPROC = 0 + +call Add_profile( 'Rt', '1D Total hydrometeor mixing ratio', 'kg kg-1', tpflyer%xrtz(:,:) ) -allocate( tzfields( jprocz ) ) +if ( irr >= 1 ) call Add_profile( 'Rv', '1D water vapor mixing ratio', 'kg kg-1', tpflyer%xrz(:,:,1) ) +if ( irr >= 2 ) call Add_profile( 'Rc', '1D liquid cloud water mixing ratio', 'kg kg-1', tpflyer%xrz(:,:,2) ) +if ( irr >= 3 ) call Add_profile( 'Rr', '1D Rain water mixing ratio', 'kg kg-1', tpflyer%xrz(:,:,3) ) +if ( irr >= 4 ) call Add_profile( 'Ri', '1D Ice cloud water mixing ratio', 'kg kg-1', tpflyer%xrz(:,:,4) ) +if ( irr >= 5 ) call Add_profile( 'Rs', '1D Snow mixing ratio', 'kg kg-1', tpflyer%xrz(:,:,5) ) +if ( irr >= 6 ) call Add_profile( 'Rg', '1D Graupel mixing ratio', 'kg kg-1', tpflyer%xrz(:,:,6) ) +if ( irr >= 7 ) call Add_profile( 'Rh', '1D Hail mixing ratio', 'kg kg-1', tpflyer%xrz(:,:,7) ) -tzfields(:)%cmnhname = ytitlez(1 : jprocz) +call Add_profile( 'FF', 'Horizontal wind', 'm s-1', tpflyer%xffz(:,:) ) + +call Add_profile( 'IWC', 'Ice water content', 'kg m-3', tpflyer%xiwcz(:,:) ) +call Add_profile( 'LWC', 'Liquid water content', 'kg m-3', tpflyer%xlwcz(:,:) ) + +IF ( CCLOUD == 'LIMA' ) THEN + call Add_profile( 'CCLOUDT', 'liquid cloud concentration', 'kg-1', tpflyer%xccz(:,:) ) + call Add_profile( 'CRAINT', 'Rain concentration', 'kg-1', tpflyer%xcrz(:,:) ) + call Add_profile( 'CICET', 'Ice concentration', 'kg-1', tpflyer%xciz(:,:) ) +ELSE IF ( CCLOUD == 'ICE3' .OR. CCLOUD == 'ICE4' ) THEN + call Add_profile( 'CIT', 'Ice concentration', 'm-3', tpflyer%xciz(:,:) ) +END IF + +call Add_profile( 'RARE', '1D cloud radar reflectivity', 'dBZ', tpflyer%xcrare(:,:) ) +call Add_profile( 'RAREatt', '1D cloud radar attenuated reflectivity', 'dBZ', tpflyer%xcrare_att(:,:) ) + +call Add_profile( 'W', '1D vertical velocity', 'm s-1', tpflyer%xwz(:,:) ) +call Add_profile( 'Z', '1D altitude above sea', 'm', tpflyer%xzz(:,:) ) + +allocate( tzfields( jproc ) ) + +tzfields(:)%cmnhname = ctitle(1 : jproc) tzfields(:)%cstdname = '' -tzfields(:)%clongname = ytitlez(1 : jprocz) -tzfields(:)%cunits = yunitz(1 : jprocz) -tzfields(:)%ccomment = ycommentz(1 : jprocz) +tzfields(:)%clongname = ctitle(1 : jproc) +tzfields(:)%cunits = cunit(1 : jproc) +tzfields(:)%ccomment = ccomment(1 : jproc) tzfields(:)%ngrid = 0 tzfields(:)%ntype = TYPEREAL tzfields(:)%ndims = 3 @@ -935,12 +668,12 @@ call Aircraft_balloon_longtype_get( tpflyer, tzbudiachro%clevels(NLVL_SUBCATEGOR tzbudiachro%ccomments(NLVL_SUBCATEGORY) = 'Level for the flyers of type: ' // Trim( tzbudiachro%clevels(NLVL_SUBCATEGORY) ) tzbudiachro%lleveluse(NLVL_GROUP) = .true. -tzbudiachro%clevels (NLVL_GROUP) = Trim( ygroupz ) -tzbudiachro%ccomments(NLVL_GROUP) = 'Values for flyer ' // Trim( tpflyer%title ) +tzbudiachro%clevels (NLVL_GROUP) = Trim( tpflyer%ctitle ) +tzbudiachro%ccomments(NLVL_GROUP) = 'Values for flyer ' // Trim( tpflyer%ctitle ) tzbudiachro%lleveluse(NLVL_SHAPE) = .true. tzbudiachro%clevels (NLVL_SHAPE) = 'Vertical_profile' -tzbudiachro%ccomments(NLVL_SHAPE) = 'Vertical profiles at position of flyer ' // Trim( tpflyer%title ) +tzbudiachro%ccomments(NLVL_SHAPE) = 'Vertical profiles at position of flyer ' // Trim( tpflyer%ctitle ) tzbudiachro%lleveluse(NLVL_TIMEAVG) = .false. tzbudiachro%clevels (NLVL_TIMEAVG) = 'Not_time_averaged' @@ -976,24 +709,68 @@ tzbudiachro%njh = 1 tzbudiachro%nkl = 1 tzbudiachro%nkh = iku -call Write_diachro( tpdiafile, tzbudiachro, tzfields, tpflyer%tpdates, zwz6, & - tpflyer = tpflyer ) +call Write_diachro( tpdiafile, tzbudiachro, tzfields, tpflyer%tflyer_time%tpdates, xwork6(:,:,:,:,:,:jproc), & + tpflyer = tpflyer ) deallocate( tzfields ) -DEALLOCATE (ZW6) -DEALLOCATE (YCOMMENT) -DEALLOCATE (YTITLE ) -DEALLOCATE (YUNIT ) -DEALLOCATE (IGRID ) -DEALLOCATE (ZWZ6) -DEALLOCATE (YCOMMENTZ) -DEALLOCATE (YTITLEZ ) -DEALLOCATE (YUNITZ ) -DEALLOCATE (IGRIDZ ) +DEALLOCATE (XWORK6) +DEALLOCATE (CCOMMENT) +DEALLOCATE (CTITLE ) +DEALLOCATE (CUNIT ) + +contains + + +subroutine Add_profile( htitle, hcomment, hunits, pfield ) + +character(len=*), intent(in) :: htitle +character(len=*), intent(in) :: hcomment +character(len=*), intent(in) :: hunits +real, dimension(:,:), intent(in) :: pfield + +integer :: jk + +jproc = jproc + 1 + +if ( jproc > iprocz ) call Print_msg( NVERB_FATAL, 'IO', 'Add_profile', 'more processes than expected' ) + +ctitle(jproc) = Trim( htitle ) +ccomment(jproc) = Trim( hcomment ) +cunit(jproc) = Trim( hunits ) + +do jk = 1, iku + xwork6(1, 1, jk, :, 1, jproc) = pfield(:, jk) +end do + +end subroutine Add_profile + + +subroutine Add_point( htitle, hcomment, hunits, pfield ) + +character(len=*), intent(in) :: htitle +character(len=*), intent(in) :: hcomment +character(len=*), intent(in) :: hunits +real, dimension(:), intent(in) :: pfield + +integer :: jk + +jproc = jproc + 1 + +if ( jproc > iproc ) call Print_msg( NVERB_FATAL, 'IO', 'Add_point', 'more processes than expected' ) + +ctitle(jproc) = Trim( htitle) +ccomment(jproc) = Trim( hcomment ) +cunit(jproc) = Trim( hunits ) + +xwork6(1, 1, 1, :, 1, jproc) = pfield(:) + +end subroutine Add_point + !---------------------------------------------------------------------------- END SUBROUTINE FLYER_DIACHRO !---------------------------------------------------------------------------- !---------------------------------------------------------------------------- ! -END SUBROUTINE WRITE_AIRCRAFT_BALLOON + +END MODULE MODE_WRITE_AIRCRAFT_BALLOON diff --git a/src/MNH/write_balloonn.f90 b/src/MNH/write_balloonn.f90 index f0c790ddd868d44f382b961b742bc4f6528b545e..e20c046d59996c34ef2f64fff9a88a71deaa2a05 100644 --- a/src/MNH/write_balloonn.f90 +++ b/src/MNH/write_balloonn.f90 @@ -1,28 +1,20 @@ -!MNH_LIC Copyright 2001-2020 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2001-2023 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 MODI_WRITE_BALLOON_n -! ########################### -! -INTERFACE -! -SUBROUTINE WRITE_BALLOON_n(TPFILE) -USE MODD_IO, ONLY: TFILEDATA +!########################## +MODULE MODE_WRITE_BALLOON_n +!########################## ! IMPLICIT NONE -! -TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! File characteristics -! -END SUBROUTINE WRITE_BALLOON_n -! -END INTERFACE -! -END MODULE MODI_WRITE_BALLOON_n -! -! + +PRIVATE + +PUBLIC :: WRITE_BALLOON_n + +CONTAINS + ! ################################### SUBROUTINE WRITE_BALLOON_n(TPFILE) ! ################################### @@ -52,23 +44,25 @@ END MODULE MODI_WRITE_BALLOON_n !! !! AUTHOR !! ------ -!! G.Jaubert *Meteo France* +!! G.Jaubert *Meteo France* !! !! MODIFICATIONS !! ------------- !! Original 06/06/01 -!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O +! P. Wautelet 05/2016-04/2018: new data structures and calls for I/O +! P. Wautelet 06/2022: reorganize flyers +! P. Wautelet 25/08/2022: write balloon positions in netCDF4 files inside HDF5 groups !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ ! -USE MODD_AIRCRAFT_BALLOON -USE MODD_GRID, ONLY: XLONORI, XLATORI -USE MODD_IO, ONLY: TFILEDATA -USE MODD_LUNIT_n +USE MODD_AIRCRAFT_BALLOON, only: NBALLOONS, NRANKCUR_BALLOON, TBALLOONS +USE MODD_IO, ONLY: GSMONOPROC, ISP, TFILEDATA ! -USE MODE_GRIDPROJ +USE MODE_AIRCRAFT_BALLOON, ONLY: FLYER_RECV_AND_ALLOCATE, FLYER_SEND +USE MODE_INI_AIRCRAFT_BALLOON, ONLY: DEALLOCATE_FLYER +USE MODE_MODELN_HANDLER, ONLY: GET_CURRENT_MODEL_INDEX ! IMPLICIT NONE ! @@ -79,104 +73,272 @@ TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! File characteristics !* 0.2 Declarations of local variables ! ! -IF (TBALLOON1%FLY) CALL WRITE_LFI_BALLOON(TBALLOON1) -IF (TBALLOON2%FLY) CALL WRITE_LFI_BALLOON(TBALLOON2) -IF (TBALLOON3%FLY) CALL WRITE_LFI_BALLOON(TBALLOON3) -IF (TBALLOON4%FLY) CALL WRITE_LFI_BALLOON(TBALLOON4) -IF (TBALLOON5%FLY) CALL WRITE_LFI_BALLOON(TBALLOON5) -IF (TBALLOON6%FLY) CALL WRITE_LFI_BALLOON(TBALLOON6) -IF (TBALLOON7%FLY) CALL WRITE_LFI_BALLOON(TBALLOON7) -IF (TBALLOON8%FLY) CALL WRITE_LFI_BALLOON(TBALLOON8) -IF (TBALLOON9%FLY) CALL WRITE_LFI_BALLOON(TBALLOON9) -! -! -CONTAINS -! +INTEGER :: IMI +INTEGER :: JI +LOGICAL :: OMONOPROC_SAVE ! Copy of true value of GSMONOPROC + +IMI = GET_CURRENT_MODEL_INDEX() + +! Save GSMONOPROC value +OMONOPROC_SAVE = GSMONOPROC +! Force GSMONOPROC to true to allow IO_Field_write on only 1 process! (not very clean hack) +GSMONOPROC = .TRUE. + +DO JI = 1, NBALLOONS + ! The balloon data is only available on the process where it is physically located => transfer it if necessary + + ! Send data from owner to writer if necessary + IF ( ISP == NRANKCUR_BALLOON(JI) .AND. NRANKCUR_BALLOON(JI) /= TPFILE%NMASTER_RANK ) THEN + CALL FLYER_SEND( TBALLOONS(JI)%TBALLOON, TPFILE%NMASTER_RANK ) + END IF + + IF ( ISP == TPFILE%NMASTER_RANK ) THEN + ! Receive data from owner if not available on the writer process + IF ( NRANKCUR_BALLOON(JI) /= TPFILE%NMASTER_RANK ) THEN + ALLOCATE( TBALLOONS(JI)%TBALLOON ) + CALL FLYER_RECV_AND_ALLOCATE( TBALLOONS(JI)%TBALLOON, NRANKCUR_BALLOON(JI) ) + END IF + + ! Write data (only if flyer is on the current model) + ! It will also be written in the ancestry model files + IF ( TBALLOONS(JI)%TBALLOON%NMODEL == IMI ) CALL WRITE_BALLOON_POSITION( TPFILE, TBALLOONS(JI)%TBALLOON ) + + ! Free ballon data if it was not stored on this process + IF ( NRANKCUR_BALLOON(JI) /= TPFILE%NMASTER_RANK ) THEN + CALL DEALLOCATE_FLYER( TBALLOONS(JI)%TBALLOON ) + DEALLOCATE( TBALLOONS(JI)%TBALLOON ) + END IF + END IF +END DO + +! Restore correct value of GSMONOPROC +GSMONOPROC = OMONOPROC_SAVE + +END SUBROUTINE WRITE_BALLOON_n !------------------------------------------------------------------------------- + !------------------------------------------------------------------------------- -SUBROUTINE WRITE_LFI_BALLOON(TPFLYER) +RECURSIVE SUBROUTINE WRITE_BALLOON_POSITION( TPFILE, TPFLYER ) ! -use modd_field, only: tfielddata, TYPEREAL +#ifdef MNH_IOCDF4 +use NETCDF, only: NF90_DEF_GRP, NF90_GLOBAL, NF90_INQ_NCID, NF90_NOERR, NF90_PUT_ATT +#endif + +USE MODD_AIRCRAFT_BALLOON +use modd_field, only: tfieldmetadata, TYPEREAL +USE MODD_GRID, ONLY: XLONORI, XLATORI +use modd_io, only: isp, tfiledata +#ifdef MNH_IOCDF4 +use modd_precision, only: CDFINT +#endif +USE MODD_TIME_n, ONLY: TDTCUR + +USE MODE_DATETIME +USE MODE_GRIDPROJ, ONLY: SM_LATLON USE MODE_IO_FIELD_WRITE, only: IO_Field_write -! -TYPE(FLYER), INTENT(IN) :: TPFLYER -! -! -!* 0.2 Declarations of local variables -! -REAL :: ZLAT ! latitude of the balloon -REAL :: ZLON ! longitude of the balloon -TYPE(TFIELDDATA) :: TZFIELD -! -! -CALL SM_LATLON(XLATORI,XLONORI, & - TPFLYER%X_CUR,TPFLYER%Y_CUR,ZLAT,ZLON) -! -! -TZFIELD%CMNHNAME = TRIM(TPFLYER%TITLE)//'LAT' -TZFIELD%CSTDNAME = '' -TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) -TZFIELD%CUNITS = 'degree' -TZFIELD%CDIR = '--' -TZFIELD%CCOMMENT = '' -TZFIELD%NGRID = 0 -TZFIELD%NTYPE = TYPEREAL -TZFIELD%NDIMS = 0 -TZFIELD%LTIMEDEP = .TRUE. -CALL IO_Field_write(TPFILE,TZFIELD,ZLAT) -! -TZFIELD%CMNHNAME = TRIM(TPFLYER%TITLE)//'LON' -TZFIELD%CSTDNAME = '' -TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) -TZFIELD%CUNITS = 'degree' -TZFIELD%CDIR = '--' -TZFIELD%CCOMMENT = '' -TZFIELD%NGRID = 0 -TZFIELD%NTYPE = TYPEREAL -TZFIELD%NDIMS = 0 -TZFIELD%LTIMEDEP = .TRUE. -CALL IO_Field_write(TPFILE,TZFIELD,ZLON) -! -TZFIELD%CMNHNAME = TRIM(TPFLYER%TITLE)//'ALT' -TZFIELD%CSTDNAME = '' -TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) -TZFIELD%CUNITS = 'm' -TZFIELD%CDIR = '--' -TZFIELD%CCOMMENT = '' -TZFIELD%NGRID = 0 -TZFIELD%NTYPE = TYPEREAL -TZFIELD%NDIMS = 0 -TZFIELD%LTIMEDEP = .TRUE. -CALL IO_Field_write(TPFILE,TZFIELD,TPFLYER%Z_CUR) -! -TZFIELD%CMNHNAME = TRIM(TPFLYER%TITLE)//'WASCENT' -TZFIELD%CSTDNAME = '' -TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) -TZFIELD%CUNITS = 'm s-1' -TZFIELD%CDIR = '--' -TZFIELD%CCOMMENT = '' -TZFIELD%NGRID = 0 -TZFIELD%NTYPE = TYPEREAL -TZFIELD%NDIMS = 0 -TZFIELD%LTIMEDEP = .TRUE. -CALL IO_Field_write(TPFILE,TZFIELD,TPFLYER%WASCENT) -! -TZFIELD%CMNHNAME = TRIM(TPFLYER%TITLE)//'RHO' -TZFIELD%CSTDNAME = '' -TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) -TZFIELD%CUNITS = 'kg m-3' -TZFIELD%CDIR = '--' -TZFIELD%CCOMMENT = '' -TZFIELD%NGRID = 0 -TZFIELD%NTYPE = TYPEREAL -TZFIELD%NDIMS = 0 -TZFIELD%LTIMEDEP = .TRUE. -CALL IO_Field_write(TPFILE,TZFIELD,TPFLYER%RHO) -! -! -! -END SUBROUTINE WRITE_LFI_BALLOON +#ifdef MNH_IOCDF4 +use mode_io_tools_nc4, only: IO_Err_handle_nc4 +#endif +use mode_msg + +TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! File characteristics +TYPE(TBALLOONDATA), INTENT(IN) :: TPFLYER + +#ifdef MNH_IOCDF4 +integer(kind=CDFINT) :: igroupid +integer(kind=CDFINT) :: istatus +#endif +REAL :: ZLAT ! latitude of the balloon +REAL :: ZLON ! longitude of the balloon +type(tfiledata) :: tzfile +TYPE(TFIELDMETADATA) :: TZFIELD + +! Do not write balloon position if not yet in fly or crashed +IF ( .NOT.TPFLYER%LFLY .OR. TPFLYER%LCRASH ) RETURN + +! Check if current model time is the same as the time corresponding to the balloon position +IF ( ABS( TDTCUR - TPFLYER%TPOS_CUR ) > 1.e-6 ) & + call Print_msg( NVERB_WARNING, 'IO', 'WRITE_BALLOON_POSITION', 'position time does not corresponds to current time for balloon ' & + // Trim( tpflyer%ctitle ) ) + +! Recursive call up to grand parent file +! This way balloon position is also available on all ancestry model files (useful for restart with different number of models) +! This is done by a recursive call instead of a more standard loop on all the models to ensure that the balloon position +! corresponds to the correct instant. +IF ( ASSOCIATED( TPFILE%TDADFILE ) ) THEN + IF ( TRIM( TPFILE%TDADFILE%CNAME ) /= TRIM( TPFILE%CNAME ) ) CALL WRITE_BALLOON_POSITION( TPFILE%TDADFILE, TPFLYER ) +END IF + +CALL SM_LATLON( XLATORI, XLONORI, TPFLYER%XX_CUR, TPFLYER%XY_CUR, ZLAT, ZLON ) + +#ifdef MNH_IOLFI +IF ( TPFILE%CFORMAT == 'LFI' .OR. TPFILE%CFORMAT == 'LFICDF4' ) THEN + ! Write current balloon position for LFI files (netCDF uses an other structure) + TZFILE = TPFILE + TZFILE%CFORMAT = 'LFI' + + TZFIELD = TFIELDMETADATA( & + CMNHNAME = TRIM(TPFLYER%CTITLE)//'LAT', & + CSTDNAME = '', & + CLONGNAME = TRIM(TPFLYER%CTITLE)//'LAT', & + CUNITS = 'degree', & + CDIR = '--', & + CCOMMENT = '', & + NGRID = 0, & + NTYPE = TYPEREAL, & + NDIMS = 0, & + LTIMEDEP = .TRUE. ) + CALL IO_Field_write(TZFILE,TZFIELD,ZLAT) + + TZFIELD = TFIELDMETADATA( & + CMNHNAME = TRIM(TPFLYER%CTITLE)//'LON', & + CSTDNAME = '', & + CLONGNAME = TRIM(TPFLYER%CTITLE)//'LON', & + CUNITS = 'degree', & + CDIR = '--', & + CCOMMENT = '', & + NGRID = 0, & + NTYPE = TYPEREAL, & + NDIMS = 0, & + LTIMEDEP = .TRUE. ) + CALL IO_Field_write(TZFILE,TZFIELD,ZLON) + + TZFIELD = TFIELDMETADATA( & + CMNHNAME = TRIM(TPFLYER%CTITLE)//'ALT', & + CSTDNAME = '', & + CLONGNAME = TRIM(TPFLYER%CTITLE)//'ALT', & + CUNITS = 'm', & + CDIR = '--', & + CCOMMENT = '', & + NGRID = 0, & + NTYPE = TYPEREAL, & + NDIMS = 0, & + LTIMEDEP = .TRUE. ) + CALL IO_Field_write(TZFILE,TZFIELD,TPFLYER%XZ_CUR) + + TZFIELD = TFIELDMETADATA( & + CMNHNAME = TRIM(TPFLYER%CTITLE)//'WASCENT', & + CSTDNAME = '', & + CLONGNAME = TRIM(TPFLYER%CTITLE)//'WASCENT', & + CUNITS = 'm s-1', & + CDIR = '--', & + CCOMMENT = '', & + NGRID = 0, & + NTYPE = TYPEREAL, & + NDIMS = 0, & + LTIMEDEP = .TRUE. ) + CALL IO_Field_write(TZFILE,TZFIELD,TPFLYER%XWASCENT) + + TZFIELD = TFIELDMETADATA( & + CMNHNAME = TRIM(TPFLYER%CTITLE)//'RHO', & + CSTDNAME = '', & + CLONGNAME = TRIM(TPFLYER%CTITLE)//'RHO', & + CUNITS = 'kg m-3', & + CDIR = '--', & + CCOMMENT = '', & + NGRID = 0, & + NTYPE = TYPEREAL, & + NDIMS = 0, & + LTIMEDEP = .TRUE. ) + CALL IO_Field_write(TZFILE,TZFIELD,TPFLYER%XRHO) +END IF +#endif + +#ifdef MNH_IOCDF4 +IF ( TPFILE%CFORMAT == 'NETCDF4' .OR. TPFILE%CFORMAT == 'LFICDF4' ) THEN + ! Write current balloon position for netCDF files + ! Each balloon position is written inside an HDF5 group + TZFILE = TPFILE + TZFILE%CFORMAT = 'NETCDF4' + + if ( isp == tzfile%nmaster_rank ) then + istatus = NF90_INQ_NCID( tzfile%nncid, Trim( tpflyer%ctitle ), igroupid ) + if ( istatus == NF90_NOERR ) then + ! The group already exists (should not) + call Print_msg( NVERB_WARNING, 'IO', 'WRITE_BALLOON_POSITION', 'group '// Trim( tpflyer%ctitle ) // ' already exists' ) + else + ! Create the group + istatus = NF90_DEF_GRP( tzfile%nncid, Trim( tpflyer%ctitle ), igroupid ) + if ( istatus /= NF90_NOERR ) & + call IO_Err_handle_nc4( istatus, 'WRITE_BALLOON_POSITION', 'NF90_DEF_GRP', 'for ' // Trim( tpflyer%ctitle ) ) + + ! Add a comment attribute + istatus = NF90_PUT_ATT( igroupid, NF90_GLOBAL, 'comment', 'Current position of balloon '// Trim( tpflyer%ctitle ) ) + if (istatus /= NF90_NOERR ) & + call IO_Err_handle_nc4( istatus, 'WRITE_BALLOON_POSITION', 'NF90_PUT_ATT', 'comment for '// Trim( tpflyer%ctitle ) ) + end if + end if + + tzfile%nncid = igroupid + + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'LAT', & + CSTDNAME = '', & + CLONGNAME = 'LAT', & + CUNITS = 'degree', & + CDIR = '--', & + CCOMMENT = 'latitude', & + NGRID = 0, & + NTYPE = TYPEREAL, & + NDIMS = 0, & + LTIMEDEP = .TRUE. ) + CALL IO_Field_write(TZFILE,TZFIELD,ZLAT) + + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'LON', & + CSTDNAME = '', & + CLONGNAME = 'LON', & + CUNITS = 'degree', & + CDIR = '--', & + CCOMMENT = 'longitude', & + NGRID = 0, & + NTYPE = TYPEREAL, & + NDIMS = 0, & + LTIMEDEP = .TRUE. ) + CALL IO_Field_write(TZFILE,TZFIELD,ZLON) + + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'ALT', & + CSTDNAME = '', & + CLONGNAME = 'ALT', & + CUNITS = 'm', & + CDIR = '--', & + CCOMMENT = 'altitude', & + NGRID = 0, & + NTYPE = TYPEREAL, & + NDIMS = 0, & + LTIMEDEP = .TRUE. ) + CALL IO_Field_write(TZFILE,TZFIELD,TPFLYER%XZ_CUR) + + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'WASCENT', & + CSTDNAME = '', & + CLONGNAME = 'WASCENT', & + CUNITS = 'm s-1', & + CDIR = '--', & + CCOMMENT = 'ascent vertical speed', & + NGRID = 0, & + NTYPE = TYPEREAL, & + NDIMS = 0, & + LTIMEDEP = .TRUE. ) + CALL IO_Field_write(TZFILE,TZFIELD,TPFLYER%XWASCENT) + + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'RHO', & + CSTDNAME = '', & + CLONGNAME = 'RHO', & + CUNITS = 'kg m-3', & + CDIR = '--', & + CCOMMENT = 'air density', & + NGRID = 0, & + NTYPE = TYPEREAL, & + NDIMS = 0, & + LTIMEDEP = .TRUE. ) + CALL IO_Field_write(TZFILE,TZFIELD,TPFLYER%XRHO) +END IF +#endif + +END SUBROUTINE WRITE_BALLOON_POSITION !------------------------------------------------------------------------------- -! -! -END SUBROUTINE WRITE_BALLOON_n + +END MODULE MODE_WRITE_BALLOON_n diff --git a/src/MNH/write_budget.f90 b/src/MNH/write_budget.f90 index 767541ad935a58606ffd9de97aaddc47c1fe836c..50dcb283b6e28bb2da6446f6ba5267c6aa138948 100644 --- a/src/MNH/write_budget.f90 +++ b/src/MNH/write_budget.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1995-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1995-2022 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. @@ -105,10 +105,10 @@ subroutine Write_budget( tpdiafile, tpdtcur, ptstep, ksv ) tbudgets, tburhodj use modd_field, only: NMNHDIM_ONE, NMNHDIM_NI, NMNHDIM_NJ, & NMNHDIM_BUDGET_TIME, NMNHDIM_BUDGET_MASK_NBUMASK, NMNHDIM_UNUSED, & - tfielddata, TYPEINT, TYPEREAL + tfieldmetadata, TYPEINT, TYPEREAL use modd_io, only: tfiledata use modd_lunit_n, only: tluout - use modd_parameters, only: NMNHNAMELGTMAX + use modd_parameters, only: NCOMMENTLGTMAX, NMNHNAMELGTMAX use modd_type_date, only: date_time use mode_datetime, only: datetime_distance @@ -126,6 +126,8 @@ subroutine Write_budget( tpdiafile, tpdtcur, ptstep, ksv ) real, intent(in) :: ptstep ! time step integer, intent(in) :: ksv ! number of scalar variables + character(len=NCOMMENTLGTMAX) :: ycomment + character(len=NMNHNAMELGTMAX) :: ymnhname character(len=NMNHNAMELGTMAX) :: yrecfm ! name of the article to be written integer :: jt, jmask integer :: jsv ! loop index over the ksv svx @@ -133,8 +135,8 @@ subroutine Write_budget( tpdiafile, tpdtcur, ptstep, ksv ) real, dimension(:), allocatable :: zworktemp real, dimension(:,:,:,:,:,:), allocatable :: zrhodjn, zworkmask type(date_time), dimension(:), allocatable :: tzdates - type(tfielddata) :: tzfield - type(tfiledata) :: tzfile + type(tfieldmetadata) :: tzfield + type(tfiledata) :: tzfile ! !------------------------------------------------------------------------------- ! @@ -145,28 +147,30 @@ subroutine Write_budget( tpdiafile, tpdtcur, ptstep, ksv ) !* Write TSTEP and BULEN ! --------------------- ! - TZFIELD%CMNHNAME = 'TSTEP' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'TSTEP' - TZFIELD%CUNITS = 's' - TZFIELD%CDIR = '--' - TZFIELD%CCOMMENT = 'Time step' - TZFIELD%NGRID = 0 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 0 - TZFIELD%LTIMEDEP = .FALSE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'TSTEP', & + CSTDNAME = '', & + CLONGNAME = 'TSTEP', & + CUNITS = 's', & + CDIR = '--', & + CCOMMENT = 'Time step', & + NGRID = 0, & + NTYPE = TYPEREAL, & + NDIMS = 0, & + LTIMEDEP = .FALSE. ) CALL IO_Field_write(TPDIAFILE,TZFIELD,PTSTEP) ! - TZFIELD%CMNHNAME = 'BULEN' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'BULEN' - TZFIELD%CUNITS = 's' - TZFIELD%CDIR = '--' - TZFIELD%CCOMMENT = 'Time step' - TZFIELD%NGRID = 0 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 0 - TZFIELD%LTIMEDEP = .FALSE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'BULEN', & + CSTDNAME = '', & + CLONGNAME = 'BULEN', & + CUNITS = 's', & + CDIR = '--', & + CCOMMENT = 'Length of the budget temporal average', & + NGRID = 0, & + NTYPE = TYPEREAL, & + NDIMS = 0, & + LTIMEDEP = .FALSE. ) CALL IO_Field_write(TPDIAFILE,TZFIELD,XBULEN) ! ! Initialize NBUTSHIFT @@ -245,22 +249,20 @@ subroutine Write_budget( tpdiafile, tpdtcur, ptstep, ksv ) tzfile = tpdiafile tzfile%cformat = 'LFI' - Write( tzfield%cmnhname, fmt = "( 'MASK_', i4.4, '.MASK' )" ) nbutshift - tzfield%cstdname = '' - tzfield%clongname = Trim( tzfield%cmnhname ) - tzfield%cunits = '' - tzfield%cdir = 'XY' - Write( tzfield%ccomment, fmt = "( 'X_Y_MASK', i4.4 )" ) nbutshift - tzfield%ngrid = 1 - tzfield%ntype = TYPEREAL - tzfield%ndims = 6 - tzfield%ltimedep = .FALSE. - tzfield%ndimlist(1) = NMNHDIM_NI - tzfield%ndimlist(2) = NMNHDIM_NJ - tzfield%ndimlist(3) = NMNHDIM_ONE - tzfield%ndimlist(4) = NMNHDIM_BUDGET_TIME - tzfield%ndimlist(5) = NMNHDIM_BUDGET_MASK_NBUMASK - tzfield%ndimlist(6) = NMNHDIM_ONE + Write( ymnhname, fmt = "( 'MASK_', i4.4, '.MASK' )" ) nbutshift + Write( ycomment, fmt = "( 'X_Y_MASK', i4.4 )" ) nbutshift + tzfield = tfieldmetadata( & + cmnhname = Trim( ymnhname ), & + cstdname = '', & + clongname = Trim( ymnhname ), & + cunits = '', & + cdir = 'XY', & + ccomment = Trim ( ycomment ), & + ngrid = 1, & + ntype = TYPEREAL, & + ndims = 6, & + ndimlist = [ NMNHDIM_NI, NMNHDIM_NJ, NMNHDIM_ONE, NMNHDIM_BUDGET_TIME, NMNHDIM_BUDGET_MASK_NBUMASK, NMNHDIM_ONE ], & + ltimedep = .FALSE. ) call IO_Field_write( tzfile, tzfield, zworkmask(:, :, :, :, :, :) ) Write( yrecfm, fmt = "( 'MASK_', i4.4 )" ) nbutshift @@ -274,21 +276,18 @@ subroutine Write_budget( tpdiafile, tpdtcur, ptstep, ksv ) tzfile = tpdiafile tzfile%cformat = 'NETCDF4' - tzfield%cmnhname = CMASK_VARNAME - tzfield%cstdname = '' - tzfield%clongname = Trim( tzfield%cmnhname ) - tzfield%cunits = '1' - tzfield%cdir = 'XY' - tzfield%ccomment = 'Masks for budget areas' - tzfield%ngrid = 1 - tzfield%ntype = TYPEINT - tzfield%ndims = 4 - tzfield%ltimedep = .false. !The time dependance is in the NMNHDIM_BUDGET_TIME dimension - tzfield%ndimlist(1) = NMNHDIM_NI - tzfield%ndimlist(2) = NMNHDIM_NJ - tzfield%ndimlist(3) = NMNHDIM_BUDGET_MASK_NBUMASK - tzfield%ndimlist(4) = NMNHDIM_BUDGET_TIME - tzfield%ndimlist(5:) = NMNHDIM_UNUSED + tzfield = tfieldmetadata( & + cmnhname = CMASK_VARNAME, & + cstdname = '', & + clongname = CMASK_VARNAME, & + cunits = '1', & + cdir = 'XY', & + ccomment = 'Masks for budget areas', & + ngrid = 1, & + ntype = TYPEINT, & + ndims = 4, & + ndimlist = [ NMNHDIM_NI, NMNHDIM_NJ, NMNHDIM_BUDGET_MASK_NBUMASK, NMNHDIM_BUDGET_TIME ], & + ltimedep = .false. ) !The time dependance is in the NMNHDIM_BUDGET_TIME dimension !Create the metadata of the field (has to be done only once) if ( nbutshift == 1 ) call IO_Field_create( tzfile, tzfield ) @@ -621,7 +620,6 @@ subroutine Store_one_budget( tpdiafile, tpdates, tpbudget, prhodjn, knocompress, TYPEREAL use modd_io, only: tfiledata use modd_lunit_n, only: tluout - use modd_nsv, only: csvnames use modd_parameters, only: NBUNAMELGTMAX use modd_type_date, only: date_time diff --git a/src/MNH/write_desfmn.f90 b/src/MNH/write_desfmn.f90 index 9aa7454234875a84a7b8d5f5ea767feb10169698..7c1496b3c58c36e960332ecd520ae11b49d2fb0c 100644 --- a/src/MNH/write_desfmn.f90 +++ b/src/MNH/write_desfmn.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1994-2023 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. @@ -146,20 +146,32 @@ END MODULE MODI_WRITE_DESFM_n !! Modification V. Vionnet 07/2017 add blowing snow variables !! Modification F.Auguste 02/2021 add IBM !! E.Jezequel 02/2021 add stations read from CSV file -!! Modification A. Costes 12/2021 add Blaze fire model +! A. Costes 12/2021: add Blaze fire model +! P. Wautelet 27/04/2022: add namelist for profilers +! P. Wautelet 13/07/2022: add namelist for flyers and balloons +! P. Wautelet 19/01/2023: bugfix for ForeFire !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ USE MODD_CONF -USE MODD_DYN_n, ONLY: LHORELAX_SVLIMA, LHORELAX_SVFIRE -USE MODD_IO, ONLY: TFILEDATA -USE MODD_LUNIT_n, ONLY: TLUOUT +USE MODD_DYN_n, ONLY: LHORELAX_SVLIMA, LHORELAX_SVFIRE +USE MODD_FIRE, ONLY: LBLAZE +#ifdef MNH_FOREFIRE +USE MODD_FOREFIRE, ONLY: LFOREFIRE +#endif +USE MODD_IBM_LSF, ONLY: LIBM_LSF +USE MODD_IO, ONLY: TFILEDATA +USE MODD_LUNIT_n, ONLY: TLUOUT USE MODD_PARAMETERS +USE MODD_PROFILER_n, ONLY: LPROFILER +USE MODD_STATION_n, ONLY: LSTATION ! USE MODE_MSG ! +! USE MODN_AIRCRAFTS USE MODN_BACKUP +! USE MODN_BALLOONS USE MODN_CONF USE MODN_DYN USE MODN_NESTING @@ -200,16 +212,15 @@ USE MODN_2D_FRC USE MODN_LATZ_EDFLX #ifdef MNH_FOREFIRE USE MODN_FOREFIRE -USE MODD_FOREFIRE_n, ONLY : FFCOUPLING #endif USE MODN_BLOWSNOW_n USE MODN_BLOWSNOW USE MODN_IBM_PARAM_n USE MODN_RECYCL_PARAM_n -USE MODD_IBM_LSF, ONLY: LIBM_LSF +USE MODN_PROFILER_n USE MODN_STATION_n -USE MODD_FIRE USE MODN_FIRE +USE MODN_FLYERS ! IMPLICIT NONE ! @@ -394,6 +405,9 @@ CALL INIT_NAM_BLOWSNOWn IF(LBLOWSNOW) WRITE(UNIT=ILUSEG,NML=NAM_BLOWSNOWn) IF(LBLOWSNOW) WRITE(UNIT=ILUSEG,NML=NAM_BLOWSNOW) ! +CALL INIT_NAM_PROFILERn +IF(LPROFILER) WRITE(UNIT=ILUSEG,NML=NAM_PROFILERn) +! CALL INIT_NAM_STATIONn IF(LSTATION) WRITE(UNIT=ILUSEG,NML=NAM_STATIONn) ! @@ -401,7 +415,7 @@ IF(LDUST) WRITE(UNIT=ILUSEG,NML=NAM_DUST) IF(LSALT) WRITE(UNIT=ILUSEG,NML=NAM_SALT) IF(LPASPOL) WRITE(UNIT=ILUSEG,NML=NAM_PASPOL) #ifdef MNH_FOREFIRE -IF(FFCOUPLING) WRITE(UNIT=ILUSEG,NML=NAM_FOREFIRE) +IF(LFOREFIRE) WRITE(UNIT=ILUSEG,NML=NAM_FOREFIRE) #endif IF(LBLAZE) WRITE(UNIT=ILUSEG,NML=NAM_PASPOL) IF(LCONDSAMP) WRITE(UNIT=ILUSEG,NML=NAM_CONDSAMP) @@ -450,6 +464,9 @@ IF(CELEC /= 'NONE') WRITE(UNIT=ILUSEG,NML=NAM_ELEC) IF(LSERIES) WRITE(UNIT=ILUSEG,NML=NAM_SERIES) IF(NMODEL_CLOUD/=NUNDEF) WRITE(UNIT=ILUSEG,NML=NAM_TURB_CLOUD) IF(CTURB /= 'NONE') WRITE(UNIT=ILUSEG,NML=NAM_TURB) +WRITE(UNIT=ILUSEG,NML=NAM_FLYERS) +!Not possible (for the moment): arrays have been deallocated after ini_aircraft: WRITE(UNIT=ILUSEG,NML=NAM_AIRCRAFTS) +!Not possible (for the moment): arrays have been deallocated after ini_balloon: WRITE(UNIT=ILUSEG,NML=NAM_BALLOONS) ! ! ! @@ -623,10 +640,10 @@ IF (NVERB >= 5) THEN ! #endif ! -IF (LBLAZE) THEN - WRITE(UNIT=ILUOUT,FMT="('******************** BLAZE ********************')") - WRITE(UNIT=ILUOUT,NML=NAM_FIRE) -END IF + IF ( LBLAZE ) THEN + WRITE(UNIT=ILUOUT,FMT="('******************** BLAZE ********************')") + WRITE(UNIT=ILUOUT,NML=NAM_FIRE) + END IF ! WRITE(UNIT=ILUOUT,FMT="('********** CONDSAMP****************************')") WRITE(UNIT=ILUOUT,NML=NAM_CONDSAMP) diff --git a/src/MNH/write_diachro.f90 b/src/MNH/write_diachro.f90 index 8175eb1d84072a822001f956ec6483e7b8551023..3a45d50f964deaf38dedd0ac2fc9c6909110f20b 100644 --- a/src/MNH/write_diachro.f90 +++ b/src/MNH/write_diachro.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1996-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1996-2023 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. @@ -90,32 +90,34 @@ subroutine Write_diachro( tpdiafile, tpbudiachro, tpfields, & ! P. Wautelet 11/03/2021: remove ptrajx/y/z optional dummy arguments of Write_diachro ! + get the trajectory data for LFI files differently ! P. Wautelet 01/09/2021: allow NMNHDIM_LEVEL and NMNHDIM_LEVEL_W simultaneously +! P. Wautelet 06/2022: reorganize flyers !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ ! -use modd_aircraft_balloon, only: flyer +use modd_aircraft_balloon, only: tflyerdata use modd_budget, only: tbudiachrometadata use modd_conf, only: lpack -use modd_field, only: tfield_metadata_base -use modd_io, only: tfiledata +use modd_field, only: tfieldmetadata_base +use modd_io, only: gsmonoproc, tfiledata use modd_type_date, only: date_time ! IMPLICIT NONE ! !* 0.1 Dummy arguments ! --------------- -TYPE(TFILEDATA), INTENT(IN) :: TPDIAFILE ! file to write -type(tbudiachrometadata), intent(in) :: tpbudiachro -class(tfield_metadata_base), dimension(:), intent(in) :: tpfields -type(date_time), dimension(:), intent(in) :: tpdates !Used only for LFI files -REAL, DIMENSION(:,:,:,:,:,:), INTENT(IN) :: PVAR -logical, intent(in), optional :: osplit -type(flyer), intent(in), optional :: tpflyer +TYPE(TFILEDATA), INTENT(IN) :: TPDIAFILE ! file to write +type(tbudiachrometadata), intent(in) :: tpbudiachro +class(tfieldmetadata_base), dimension(:), intent(in) :: tpfields +type(date_time), dimension(:), intent(in) :: tpdates !Used only for LFI files +REAL, DIMENSION(:,:,:,:,:,:), INTENT(IN) :: PVAR +logical, intent(in), optional :: osplit +class(tflyerdata), intent(in), optional :: tpflyer ! !* 0.1 Local variables ! --------------- +logical :: omonoproc_save ! Copy of true value of gsmonoproc logical :: gpack !------------------------------------------------------------------------------ @@ -124,6 +126,15 @@ call Print_msg( NVERB_DEBUG, 'BUD', 'Write_diachro', 'called' ) gpack = lpack lpack = .false. +if ( present( tpflyer ) ) then + ! Save gsmonoproc value + omonoproc_save = gsmonoproc + + ! Force gsmonoproc to true to allow IO_Field_write on only 1 process! (not very clean hack) + ! This is necessary for flyers because their data is local to 1 one process (and has been copied on the master rank of the file) + gsmonoproc = .true. +end if + #ifdef MNH_IOLFI if ( tpdiafile%cformat == 'LFI' .or. tpdiafile%cformat == 'LFICDF4' ) & call Write_diachro_lfi( tpdiafile, tpbudiachro, tpfields, tpdates, pvar, tpflyer ) @@ -136,18 +147,24 @@ if ( tpdiafile%cformat == 'NETCDF4' .or. tpdiafile%cformat == 'LFICDF4' ) & lpack = gpack +if ( present( tpflyer ) ) then + ! Restore correct value of gsmonoproc + gsmonoproc = omonoproc_save +end if + +! end subroutine Write_diachro_1 end subroutine Write_diachro #ifdef MNH_IOLFI !----------------------------------------------------------------------------- subroutine Write_diachro_lfi( tpdiafile, tpbudiachro, tpfields, tpdates, pvar, tpflyer ) -use modd_aircraft_balloon, only: flyer +use modd_aircraft_balloon, only: tflyerdata use modd_budget, only: NLVL_CATEGORY, NLVL_GROUP, NLVL_SHAPE, nbumask, nbutshift, nbusubwrite, tbudiachrometadata use modd_field, only: NMNHDIM_ONE, NMNHDIM_UNKNOWN, NMNHDIM_BUDGET_LES_MASK, & NMNHDIM_FLYER_TIME, NMNHDIM_NOTLISTED, NMNHDIM_UNUSED, & TYPECHAR, TYPEINT, TYPEREAL, & - tfield_metadata_base, tfielddata + tfieldmetadata_base, tfieldmetadata use modd_io, only: tfiledata use modd_les, only: nles_current_iinf, nles_current_isup, nles_current_jinf, nles_current_jsup, & nles_k, xles_current_z @@ -162,12 +179,12 @@ use mode_menu_diachro, only: Menu_diachro use mode_tools_ll, only: Get_globaldims_ll -type(tfiledata), intent(in) :: tpdiafile ! File to write -type(tbudiachrometadata), intent(in) :: tpbudiachro -class(tfield_metadata_base), dimension(:), intent(in) :: tpfields -type(date_time), dimension(:), intent(in) :: tpdates -real, dimension(:,:,:,:,:,:), intent(in) :: pvar -type(flyer), intent(in), optional :: tpflyer +type(tfiledata), intent(in) :: tpdiafile ! File to write +type(tbudiachrometadata), intent(in) :: tpbudiachro +class(tfieldmetadata_base), dimension(:), intent(in) :: tpfields +type(date_time), dimension(:), intent(in) :: tpdates +real, dimension(:,:,:,:,:,:), intent(in) :: pvar +class(tflyerdata), intent(in), optional :: tpflyer integer, parameter :: LFITITLELGT = 100 integer, parameter :: LFIUNITLGT = 100 @@ -197,7 +214,7 @@ logical :: gdistributed real, dimension(:,:), allocatable :: ztimes real, dimension(:,:), allocatable :: zdatime real, dimension(:,:,:), allocatable :: ztrajz -TYPE(TFIELDDATA) :: TZFIELD +TYPE(TFIELDMETADATA) :: TZFIELD type(tfiledata) :: tzfile call Print_msg( NVERB_DEBUG, 'BUD', 'Write_diachro_lfi', 'called' ) @@ -364,7 +381,7 @@ ITTRAJX=0; ITTRAJY=0; ITTRAJZ=0 INTRAJX=0; INTRAJY=0; INTRAJZ=0 IF ( PRESENT( tpflyer ) ) THEN IKTRAJX = 1 - ITTRAJX = SIZE( tpflyer%x ) + ITTRAJX = SIZE( tpflyer%xx ) INTRAJX = 1 ELSE IF ( ycategory == 'LES_budgets' .and. tpbudiachro%clevels(NLVL_SHAPE) == 'Cartesian' ) THEN IKTRAJX = 1 @@ -373,7 +390,7 @@ ELSE IF ( ycategory == 'LES_budgets' .and. tpbudiachro%clevels(NLVL_SHAPE) == ' ENDIF IF ( PRESENT( tpflyer ) ) THEN IKTRAJY = 1 - ITTRAJY = SIZE( tpflyer%y ) + ITTRAJY = SIZE( tpflyer%xy ) INTRAJY = 1 ELSE IF ( ycategory == 'LES_budgets' .and. tpbudiachro%clevels(NLVL_SHAPE) == 'Cartesian' ) THEN IKTRAJY = 1 @@ -382,7 +399,7 @@ ELSE IF ( ycategory == 'LES_budgets' .and. tpbudiachro%clevels(NLVL_SHAPE) == ' ENDIF IF ( PRESENT( tpflyer ) ) THEN IKTRAJZ = 1 - ITTRAJZ = SIZE( tpflyer%z ) + ITTRAJZ = SIZE( tpflyer%xz ) INTRAJZ = 1 ELSE IF ( ycategory == 'LES_budgets' .and. tpbudiachro%clevels(NLVL_SHAPE) == 'Cartesian' ) THEN IKTRAJZ = IK @@ -409,30 +426,32 @@ ILENCOMMENT = LFICOMMENTLGT ! ! 1er enregistrement TYPE ! -TZFIELD%CMNHNAME = TRIM(ygroup)//'.TYPE' -TZFIELD%CSTDNAME = '' -TZFIELD%CLONGNAME = TRIM(ygroup)//'.TYPE' -TZFIELD%CUNITS = '' -TZFIELD%CDIR = '--' -TZFIELD%CCOMMENT = TRIM(YCOMMENT) -TZFIELD%NGRID = tpfields(1)%ngrid -TZFIELD%NTYPE = TYPECHAR -TZFIELD%NDIMS = 0 -TZFIELD%LTIMEDEP = .FALSE. +TZFIELD = TFIELDMETADATA( & + CMNHNAME = TRIM(ygroup)//'.TYPE', & + CSTDNAME = '', & + CLONGNAME = TRIM(ygroup)//'.TYPE', & + CUNITS = '', & + CDIR = '--', & + CCOMMENT = TRIM(YCOMMENT), & + NGRID = tpfields(1)%ngrid, & + NTYPE = TYPECHAR, & + NDIMS = 0, & + LTIMEDEP = .FALSE. ) CALL IO_Field_write(tzfile,TZFIELD,YTYPE) ! ! 2eme enregistrement DIMENSIONS des MATRICES et LONGUEUR des TABLEAUX de CARACTERES et FLAGS de COMPRESSION sur les DIFFERENTS AXES ! -TZFIELD%CMNHNAME = TRIM(ygroup)//'.DIM' -TZFIELD%CSTDNAME = '' -TZFIELD%CLONGNAME = TRIM(ygroup)//'.DIM' -TZFIELD%CUNITS = '' -TZFIELD%CDIR = '--' -TZFIELD%CCOMMENT = TRIM(YCOMMENT) -TZFIELD%NGRID = tpfields(1)%ngrid -TZFIELD%NTYPE = TYPEINT -TZFIELD%NDIMS = 1 -TZFIELD%LTIMEDEP = .FALSE. +TZFIELD = TFIELDMETADATA( & + CMNHNAME = TRIM(ygroup)//'.DIM', & + CSTDNAME = '', & + CLONGNAME = TRIM(ygroup)//'.DIM', & + CUNITS = '', & + CDIR = '--', & + CCOMMENT = TRIM(YCOMMENT), & + NGRID = tpfields(1)%ngrid, & + NTYPE = TYPEINT, & + NDIMS = 1, & + LTIMEDEP = .FALSE. ) SELECT CASE(YTYPE) CASE('CART','MASK','SPXY') if ( iil < 0 .or. iih < 0 .or. ijl < 0 .or. ijh < 0 .or. ikl < 0 .or. ikh < 0 ) then @@ -489,16 +508,17 @@ END SELECT ! ! 3eme enregistrement TITRE ! -TZFIELD%CMNHNAME = TRIM(ygroup)//'.TITRE' -TZFIELD%CSTDNAME = '' -TZFIELD%CLONGNAME = TRIM(ygroup)//'.TITRE' -TZFIELD%CUNITS = '' -TZFIELD%CDIR = '--' -TZFIELD%CCOMMENT = TRIM(YCOMMENT) -TZFIELD%NGRID = tpfields(1)%ngrid -TZFIELD%NTYPE = TYPECHAR -TZFIELD%NDIMS = 1 -TZFIELD%LTIMEDEP = .FALSE. +TZFIELD = TFIELDMETADATA( & + CMNHNAME = TRIM(ygroup)//'.TITRE', & + CSTDNAME = '', & + CLONGNAME = TRIM(ygroup)//'.TITRE', & + CUNITS = '', & + CDIR = '--', & + CCOMMENT = TRIM(YCOMMENT), & + NGRID = tpfields(1)%ngrid, & + NTYPE = TYPECHAR, & + NDIMS = 1, & + LTIMEDEP = .FALSE. ) allocate( ytitles( ip ) ) ytitles(:) = tpfields(1 : ip)%cmnhname CALL IO_Field_write(tzfile,TZFIELD,ytitles(:)) @@ -506,16 +526,17 @@ deallocate( ytitles ) ! ! 4eme enregistrement UNITE ! -TZFIELD%CMNHNAME = TRIM(ygroup)//'.UNITE' -TZFIELD%CSTDNAME = '' -TZFIELD%CLONGNAME = TRIM(ygroup)//'.UNITE' -TZFIELD%CUNITS = '' -TZFIELD%CDIR = '--' -TZFIELD%CCOMMENT = TRIM(YCOMMENT) -TZFIELD%NGRID = tpfields(1)%ngrid -TZFIELD%NTYPE = TYPECHAR -TZFIELD%NDIMS = 1 -TZFIELD%LTIMEDEP = .FALSE. +TZFIELD = TFIELDMETADATA( & + CMNHNAME = TRIM(ygroup)//'.UNITE', & + CSTDNAME = '', & + CLONGNAME = TRIM(ygroup)//'.UNITE', & + CUNITS = '', & + CDIR = '--', & + CCOMMENT = TRIM(YCOMMENT), & + NGRID = tpfields(1)%ngrid, & + NTYPE = TYPECHAR, & + NDIMS = 1, & + LTIMEDEP = .FALSE. ) allocate( yunits( ip ) ) yunits(:) = tpfields(1 : ip)%cunits CALL IO_Field_write(tzfile,TZFIELD,yunits(:)) @@ -523,16 +544,17 @@ deallocate( yunits ) ! ! 5eme enregistrement COMMENT ! -TZFIELD%CMNHNAME = TRIM(ygroup)//'.COMMENT' -TZFIELD%CSTDNAME = '' -TZFIELD%CLONGNAME = TRIM(ygroup)//'.COMMENT' -TZFIELD%CUNITS = '' -TZFIELD%CDIR = '--' -TZFIELD%CCOMMENT = TRIM(YCOMMENT) -TZFIELD%NGRID = tpfields(1)%ngrid -TZFIELD%NTYPE = TYPECHAR -TZFIELD%NDIMS = 1 -TZFIELD%LTIMEDEP = .FALSE. +TZFIELD = TFIELDMETADATA( & + CMNHNAME = TRIM(ygroup)//'.COMMENT', & + CSTDNAME = '', & + CLONGNAME = TRIM(ygroup)//'.COMMENT', & + CUNITS = '', & + CDIR = '--', & + CCOMMENT = TRIM(YCOMMENT), & + NGRID = tpfields(1)%ngrid, & + NTYPE = TYPECHAR, & + NDIMS = 1, & + LTIMEDEP = .FALSE. ) allocate( ycomments( ip ) ) ycomments(:) = tpfields(1 : ip)%ccomment CALL IO_Field_write(tzfile,TZFIELD,ycomments(:)) @@ -565,30 +587,32 @@ DO J = 1,IP WRITE(YJ,'(I3)')J ENDIF IF ( gdistributed ) THEN - TZFIELD%CMNHNAME = TRIM(ygroup)//'.PROC'//YJ - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = tpfields(j)%cunits - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = TRIM(tpfields(j)%cmnhname)//' - '//TRIM(tpfields(j)%ccomment)//' ('// Trim( tpfields(j)%cunits ) //')' - TZFIELD%NGRID = tpfields(j)%ngrid - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 5 - TZFIELD%LTIMEDEP = .FALSE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = TRIM(ygroup)//'.PROC'//YJ, & + CSTDNAME = '', & + CLONGNAME = TRIM(ygroup)//'.PROC'//YJ, & + CUNITS = tpfields(j)%cunits, & + CDIR = 'XY', & + CCOMMENT = TRIM(tpfields(j)%cmnhname)//' - '//TRIM(tpfields(j)%ccomment)//' ('// Trim( tpfields(j)%cunits ) //')', & + NGRID = tpfields(j)%ngrid, & + NTYPE = TYPEREAL, & + NDIMS = 5, & + LTIMEDEP = .FALSE. ) CALL IO_Field_write_BOX(tzfile,TZFIELD,'BUDGET',PVAR(:,:,:,:,:,J), & iil+JPHEXT,iih+JPHEXT,ijl+JPHEXT,ijh+JPHEXT) ELSE - TZFIELD%CMNHNAME = TRIM(ygroup)//'.PROC'//YJ - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = tpfields(j)%cunits - TZFIELD%CDIR = '--' - TZFIELD%CCOMMENT = TRIM(tpfields(j)%cmnhname)//' - '//TRIM(tpfields(j)%ccomment)//' ('// Trim( tpfields(j)%cunits ) //')' - TZFIELD%NGRID = tpfields(j)%ngrid - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 5 - TZFIELD%LTIMEDEP = .FALSE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = TRIM(ygroup)//'.PROC'//YJ, & + CSTDNAME = '', & + CLONGNAME = TRIM(ygroup)//'.PROC'//YJ, & + CUNITS = tpfields(j)%cunits, & + CDIR = '--', & + CCOMMENT = TRIM(tpfields(j)%cmnhname)//' - '//TRIM(tpfields(j)%ccomment)//' ('// Trim( tpfields(j)%cunits ) //')', & + NGRID = tpfields(j)%ngrid, & + NTYPE = TYPEREAL, & + NDIMS = 5, & + LTIMEDEP = .FALSE. ) CALL IO_Field_write(tzfile,TZFIELD,PVAR(:,:,:,:,:,J)) ENDIF @@ -597,16 +621,17 @@ ENDDO ! ! 7eme enregistrement TRAJT ! -TZFIELD%CMNHNAME = TRIM(ygroup)//'.TRAJT' -TZFIELD%CSTDNAME = '' -TZFIELD%CLONGNAME = TRIM(ygroup)//'.TRAJT' -TZFIELD%CUNITS = '' -TZFIELD%CDIR = '--' -TZFIELD%CCOMMENT = TRIM(YCOMMENT) -TZFIELD%NGRID = tpfields(1)%ngrid -TZFIELD%NTYPE = TYPEREAL -TZFIELD%NDIMS = 2 -TZFIELD%LTIMEDEP = .FALSE. +TZFIELD = TFIELDMETADATA( & + CMNHNAME = TRIM(ygroup)//'.TRAJT', & + CSTDNAME = '', & + CLONGNAME = TRIM(ygroup)//'.TRAJT', & + CUNITS = '', & + CDIR = '--', & + CCOMMENT = TRIM(YCOMMENT), & + NGRID = tpfields(1)%ngrid, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .FALSE. ) !NMNHDIM_FLYER_TIME excluded because created only in netCDF/HDF groups (local to each flyer) if ( tpfields(1)%ndimlist(4) /= NMNHDIM_UNKNOWN .and. tpfields(1)%ndimlist(4) /= NMNHDIM_UNUSED & @@ -636,28 +661,30 @@ deallocate( ztimes ) ! 8eme enregistrement TRAJX ! IF(PRESENT(tpflyer))THEN - TZFIELD%CMNHNAME = TRIM(ygroup)//'.TRAJX' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM(ygroup)//'.TRAJX' - TZFIELD%CUNITS = '' - TZFIELD%CDIR = '--' - TZFIELD%CCOMMENT = TRIM(YCOMMENT) - TZFIELD%NGRID = tpfields(1)%ngrid - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .FALSE. - CALL IO_Field_write(tzfile,TZFIELD, Reshape( tpflyer%x, [1, Size( tpflyer%x), 1] ) ) + TZFIELD = TFIELDMETADATA( & + CMNHNAME = TRIM(ygroup)//'.TRAJX', & + CSTDNAME = '', & + CLONGNAME = TRIM(ygroup)//'.TRAJX', & + CUNITS = '', & + CDIR = '--', & + CCOMMENT = TRIM(YCOMMENT), & + NGRID = tpfields(1)%ngrid, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .FALSE. ) + CALL IO_Field_write(tzfile,TZFIELD, Reshape( tpflyer%xx, [1, Size( tpflyer%xx), 1] ) ) ELSE IF ( ycategory == 'LES_budgets' .and. tpbudiachro%clevels(NLVL_SHAPE) == 'Cartesian' ) THEN - TZFIELD%CMNHNAME = TRIM(ygroup)//'.TRAJX' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM(ygroup)//'.TRAJX' - TZFIELD%CUNITS = '' - TZFIELD%CDIR = '--' - TZFIELD%CCOMMENT = TRIM(YCOMMENT) - TZFIELD%NGRID = tpfields(1)%ngrid - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .FALSE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = TRIM(ygroup)//'.TRAJX', & + CSTDNAME = '', & + CLONGNAME = TRIM(ygroup)//'.TRAJX', & + CUNITS = '', & + CDIR = '--', & + CCOMMENT = TRIM(YCOMMENT), & + NGRID = tpfields(1)%ngrid, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .FALSE. ) !TRAJX is given in extended domain coordinates (=> +jphext) for backward compatibility CALL IO_Field_write(tzfile,TZFIELD, Real( Reshape( & Spread( source = ( nles_current_iinf + nles_current_isup) / 2 + jphext, dim = 1, ncopies = IN ), & @@ -667,28 +694,30 @@ ENDIF ! 9eme enregistrement TRAJY ! IF(PRESENT(tpflyer))THEN - TZFIELD%CMNHNAME = TRIM(ygroup)//'.TRAJY' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM(ygroup)//'.TRAJY' - TZFIELD%CUNITS = '' - TZFIELD%CDIR = '--' - TZFIELD%CCOMMENT = TRIM(YCOMMENT) - TZFIELD%NGRID = tpfields(1)%ngrid - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .FALSE. - CALL IO_Field_write(tzfile,TZFIELD, Reshape( tpflyer%y, [1, Size( tpflyer%y), 1] ) ) + TZFIELD = TFIELDMETADATA( & + CMNHNAME = TRIM(ygroup)//'.TRAJY', & + CSTDNAME = '', & + CLONGNAME = TRIM(ygroup)//'.TRAJY', & + CUNITS = '', & + CDIR = '--', & + CCOMMENT = TRIM(YCOMMENT), & + NGRID = tpfields(1)%ngrid, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .FALSE. ) + CALL IO_Field_write(tzfile,TZFIELD, Reshape( tpflyer%xy, [1, Size( tpflyer%xy), 1] ) ) ELSE IF ( ycategory == 'LES_budgets' .and. tpbudiachro%clevels(NLVL_SHAPE) == 'Cartesian' ) THEN - TZFIELD%CMNHNAME = TRIM(ygroup)//'.TRAJY' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM(ygroup)//'.TRAJY' - TZFIELD%CUNITS = '' - TZFIELD%CDIR = '--' - TZFIELD%CCOMMENT = TRIM(YCOMMENT) - TZFIELD%NGRID = tpfields(1)%ngrid - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .FALSE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = TRIM(ygroup)//'.TRAJY', & + CSTDNAME = '', & + CLONGNAME = TRIM(ygroup)//'.TRAJY', & + CUNITS = '', & + CDIR = '--', & + CCOMMENT = TRIM(YCOMMENT), & + NGRID = tpfields(1)%ngrid, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .FALSE. ) !TRAJY is given in extended domain coordinates (=> +jphext) for backward compatibility CALL IO_Field_write(tzfile,TZFIELD, Real( Reshape( & Spread( source = ( nles_current_jinf + nles_current_jsup) / 2 + jphext, dim = 1, ncopies = IN ), & @@ -698,28 +727,30 @@ ENDIF ! 10eme enregistrement TRAJZ ! IF(PRESENT(tpflyer))THEN - TZFIELD%CMNHNAME = TRIM(ygroup)//'.TRAJZ' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM(ygroup)//'.TRAJZ' - TZFIELD%CUNITS = '' - TZFIELD%CDIR = '--' - TZFIELD%CCOMMENT = TRIM(YCOMMENT) - TZFIELD%NGRID = tpfields(1)%ngrid - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .FALSE. - CALL IO_Field_write(tzfile,TZFIELD, Reshape( tpflyer%z, [1, Size( tpflyer%z), 1] ) ) + TZFIELD = TFIELDMETADATA( & + CMNHNAME = TRIM(ygroup)//'.TRAJZ', & + CSTDNAME = '', & + CLONGNAME = TRIM(ygroup)//'.TRAJZ', & + CUNITS = '', & + CDIR = '--', & + CCOMMENT = TRIM(YCOMMENT), & + NGRID = tpfields(1)%ngrid, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .FALSE. ) + CALL IO_Field_write(tzfile,TZFIELD, Reshape( tpflyer%xz, [1, Size( tpflyer%xz), 1] ) ) ELSE IF ( ycategory == 'LES_budgets' .and. tpbudiachro%clevels(NLVL_SHAPE) == 'Cartesian' ) THEN - TZFIELD%CMNHNAME = TRIM(ygroup)//'.TRAJZ' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM(ygroup)//'.TRAJZ' - TZFIELD%CUNITS = '' - TZFIELD%CDIR = '--' - TZFIELD%CCOMMENT = TRIM(YCOMMENT) - TZFIELD%NGRID = tpfields(1)%ngrid - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .FALSE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = TRIM(ygroup)//'.TRAJZ', & + CSTDNAME = '', & + CLONGNAME = TRIM(ygroup)//'.TRAJZ', & + CUNITS = '', & + CDIR = '--', & + CCOMMENT = TRIM(YCOMMENT), & + NGRID = tpfields(1)%ngrid, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .FALSE. ) Allocate( ztrajz(IK, 1, IN) ) do jj = 1, IK @@ -731,16 +762,17 @@ ENDIF ! ! 11eme enregistrement PDATIME ! -TZFIELD%CMNHNAME = TRIM(ygroup)//'.DATIM' -TZFIELD%CSTDNAME = '' -TZFIELD%CLONGNAME = TRIM(ygroup)//'.DATIM' -TZFIELD%CUNITS = '' -TZFIELD%CDIR = '--' -TZFIELD%CCOMMENT = TRIM(YCOMMENT) -TZFIELD%NGRID = tpfields(1)%ngrid -TZFIELD%NTYPE = TYPEREAL -TZFIELD%NDIMS = 2 -TZFIELD%LTIMEDEP = .FALSE. +TZFIELD = TFIELDMETADATA( & + CMNHNAME = TRIM(ygroup)//'.DATIM', & + CSTDNAME = '', & + CLONGNAME = TRIM(ygroup)//'.DATIM', & + CUNITS = '', & + CDIR = '--', & + CCOMMENT = TRIM(YCOMMENT), & + NGRID = tpfields(1)%ngrid, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .FALSE. ) !Reconstitute old diachro format allocate( zdatime( 16, size(tpdates) ) ) @@ -777,7 +809,7 @@ subroutine Write_diachro_nc4( tpdiafile, tpbudiachro, tpfields, pvar, osplit, tp use NETCDF, only: NF90_DEF_DIM, NF90_INQ_DIMID, NF90_INQUIRE_DIMENSION, NF90_NOERR -use modd_aircraft_balloon, only: flyer +use modd_aircraft_balloon, only: tflyerdata use modd_budget, only: CNCGROUPNAMES, & NMAXLEVELS, NLVL_ROOT, NLVL_CATEGORY, NLVL_SUBCATEGORY, NLVL_GROUP, & NLVL_SHAPE, NLVL_TIMEAVG, NLVL_NORM, NLVL_MASK, & @@ -793,12 +825,12 @@ use modd_type_date, only: date_time use mode_io_field_write, only: IO_Field_create, IO_Field_write, IO_Field_write_box use mode_io_tools_nc4, only: IO_Err_handle_nc4 -type(tfiledata), intent(in) :: tpdiafile ! File to write -type(tbudiachrometadata), intent(in) :: tpbudiachro -class(tfield_metadata_base), dimension(:), intent(in) :: tpfields -real, dimension(:,:,:,:,:,:), intent(in) :: pvar -logical, intent(in), optional :: osplit -type(flyer), intent(in), optional :: tpflyer +type(tfiledata), intent(in) :: tpdiafile ! File to write +type(tbudiachrometadata), intent(in) :: tpbudiachro +class(tfieldmetadata_base), dimension(:), intent(in) :: tpfields +real, dimension(:,:,:,:,:,:), intent(in) :: pvar +logical, intent(in), optional :: osplit +class(tflyerdata), intent(in), optional :: tpflyer character(len=:), allocatable :: ycategory character(len=:), allocatable :: ylevelname @@ -820,7 +852,7 @@ integer(kind=CDFINT), dimension(0:NMAXLEVELS) :: ilevelids ! ids of the differen logical :: gdistributed logical :: gsplit logical, dimension(0:NMAXLEVELS) :: gleveldefined ! Are the different groups/levels already defined in the netCDF file -type(tfielddata) :: tzfield +type(tfieldmetadata) :: tzfield type(tfiledata) :: tzfile call Print_msg( NVERB_DEBUG, 'BUD', 'Write_diachro_nc4', 'called' ) @@ -1477,33 +1509,33 @@ select case ( idims ) end select !Write X and Y position of the flyer -if ( Present( tpflyer ) ) then +if ( Present( tpflyer ) .and. yshape == 'Point' ) then if ( lcartesian ) then ystdnameprefix = 'plane' else ystdnameprefix = 'projection' endif - tzfield%cmnhname = 'X' - tzfield%cstdname = Trim( ystdnameprefix ) // '_x_coordinate' - tzfield%clongname = 'x-position of the flyer' - tzfield%cunits = 'm' - tzfield%cdir = '--' - tzfield%ccomment = '' - tzfield%ngrid = 0 - tzfield%ntype = TYPEREAL - tzfield%ltimedep = .false. - tzfield%ndims = 1 - tzfield%ndimlist(1) = NMNHDIM_FLYER_TIME - tzfield%ndimlist(2:) = NMNHDIM_UNUSED - - call IO_Field_write( tzfile, tzfield, tpflyer%x ) + tzfield = tfieldmetadata( & + cmnhname = 'X', & + cstdname = Trim( ystdnameprefix ) // '_x_coordinate', & + clongname = 'x-position of the flyer', & + cunits = 'm', & + cdir = '--', & + ccomment = '', & + ngrid = 0, & + ntype = TYPEREAL, & + ndims = 1, & + ndimlist = [ NMNHDIM_FLYER_TIME ], & + ltimedep = .false. ) + + call IO_Field_write( tzfile, tzfield, tpflyer%xx ) tzfield%cmnhname = 'Y' tzfield%cstdname = Trim( ystdnameprefix ) // '_y_coordinate' tzfield%clongname = 'y-position of the flyer' - call IO_Field_write( tzfile, tzfield, tpflyer%y ) + call IO_Field_write( tzfile, tzfield, tpflyer%xy ) end if end subroutine Write_diachro_nc4 @@ -1512,22 +1544,22 @@ end subroutine Write_diachro_nc4 subroutine Diachro_one_field_write_nc4( tpfile, tpbudiachro, tpfield, pvar, kdims, osplit, odistributed, & kil, kih, kjl, kjh, kkl, kkh ) use modd_budget, only: NLVL_CATEGORY, NLVL_GROUP, NLVL_SHAPE, nbutshift, nbusubwrite, tbudiachrometadata -use modd_field, only: tfielddata, tfield_metadata_base +use modd_field, only: tfieldmetadata, tfieldmetadata_base use modd_io, only: isp, tfiledata use modd_parameters, only: jphext use mode_io_field_write, only: IO_Field_create, IO_Field_write, IO_Field_write_box -type(tfiledata), intent(in) :: tpfile !File to write -type(tbudiachrometadata), intent(in) :: tpbudiachro -class(tfield_metadata_base), intent(in) :: tpfield -real, dimension(:,:,:,:,:,:), intent(in) :: pvar -integer, dimension(:), intent(in) :: kdims !List of indices of dimensions to use -logical, intent(in) :: osplit -logical, intent(in) :: odistributed !.T. if data is distributed among all processes -integer, intent(in), optional :: kil, kih -integer, intent(in), optional :: kjl, kjh -integer, intent(in), optional :: kkl, kkh +type(tfiledata), intent(in) :: tpfile !File to write +type(tbudiachrometadata), intent(in) :: tpbudiachro +class(tfieldmetadata_base), intent(in) :: tpfield +real, dimension(:,:,:,:,:,:), intent(in) :: pvar +integer, dimension(:), intent(in) :: kdims !List of indices of dimensions to use +logical, intent(in) :: osplit +logical, intent(in) :: odistributed !.T. if data is distributed among all processes +integer, intent(in), optional :: kil, kih +integer, intent(in), optional :: kjl, kjh +integer, intent(in), optional :: kkl, kkh integer :: idims integer :: ibutimepos @@ -1541,28 +1573,28 @@ real, dimension(:,:), allocatable :: zdata2d real, dimension(:,:,:), allocatable :: zdata3d real, dimension(:,:,:,:), allocatable :: zdata4d real, dimension(:,:,:,:,:), allocatable :: zdata5d -type(tfielddata) :: tzfield +type(tfieldmetadata) :: tzfield idims = Size( kdims ) if ( odistributed ) then if ( idims /= 2 .and. idims /= 3 ) & call Print_msg( NVERB_FATAL, 'IO', 'Diachro_one_field_write_nc4', & - 'odistributed=.true. not allowed for dims/=3, field: ' //Trim( tzfield%cmnhname ) ) + 'odistributed=.true. not allowed for dims/=3, field: ' //Trim( tpfield%cmnhname ) ) - if ( tpbudiachro%clevels(NLVL_SHAPE) /= 'Cartesian' ) & + if ( tpbudiachro%clevels(NLVL_SHAPE) /= 'Cartesian' ) & call Print_msg( NVERB_FATAL, 'IO', 'Diachro_one_field_write_nc4', & - 'odistributed=.true. not allowed for shape/=cartesian, field: ' //Trim( tzfield%cmnhname ) ) + 'odistributed=.true. not allowed for shape/=cartesian, field: ' //Trim( tpfield%cmnhname ) ) end if if ( osplit ) then if ( idims > 3 ) & call Print_msg( NVERB_FATAL, 'IO', 'Diachro_one_field_write_nc4', & - 'osplit=.true. not allowed for dims>3, field: ' //Trim( tzfield%cmnhname ) ) + 'osplit=.true. not allowed for dims>3, field: ' //Trim( tpfield%cmnhname ) ) - if ( tpbudiachro%clevels(NLVL_CATEGORY) /= 'Budgets' ) & + if ( tpbudiachro%clevels(NLVL_CATEGORY) /= 'Budgets' ) & call Print_msg( NVERB_FATAL, 'IO', 'Diachro_one_field_write_nc4', & - 'osplit=.true. not allowed for category/=budget, field: ' //Trim( tzfield%cmnhname ) ) + 'osplit=.true. not allowed for category/=budget, field: ' //Trim( tpfield%cmnhname ) ) end if Allocate( isizes(idims) ) @@ -1759,14 +1791,14 @@ end subroutine Diachro_one_field_write_nc4 subroutine Prepare_diachro_write( tpfieldin, tpfieldout, kdims, osplit, odistributed, kbutimepos ) -use modd_field, only: NMNHDIM_BUDGET_TIME, NMNHDIM_UNUSED, NMNHMAXDIMS, tfielddata, tfield_metadata_base - -class(tfield_metadata_base), intent(in) :: tpfieldin -type(tfielddata), intent(out) :: tpfieldout -integer, dimension(:), intent(in) :: kdims ! List of indices of dimensions to use -logical, intent(in) :: osplit -logical, intent(in) :: odistributed ! .true. if data is distributed among all the processes -integer, intent(out) :: kbutimepos +use modd_field, only: NMNHDIM_BUDGET_TIME, NMNHDIM_UNUSED, NMNHMAXDIMS, tfieldmetadata, tfieldmetadata_base + +class(tfieldmetadata_base), intent(in) :: tpfieldin +type(tfieldmetadata), intent(out) :: tpfieldout +integer, dimension(:), intent(in) :: kdims ! List of indices of dimensions to use +logical, intent(in) :: osplit +logical, intent(in) :: odistributed ! .true. if data is distributed among all the processes +integer, intent(out) :: kbutimepos integer :: idims integer :: jdim diff --git a/src/MNH/write_dummy_gr_fieldn.f90 b/src/MNH/write_dummy_gr_fieldn.f90 index 74f56e63cbd956f50ef7992ef52b3b2fbaebfce9..c3e6096e080d00f316bfea2feaa87ea904664598 100644 --- a/src/MNH/write_dummy_gr_fieldn.f90 +++ b/src/MNH/write_dummy_gr_fieldn.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1996-2020 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1996-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. @@ -63,7 +63,7 @@ END MODULE MODI_WRITE_DUMMY_GR_FIELD_n ! USE MODD_DUMMY_GR_FIELD_n, ONLY: NDUMMY_GR_NBR, CDUMMY_GR_NAME, & CDUMMY_GR_AREA, XDUMMY_GR_FIELDS -use modd_field, only: tfielddata, TYPEINT, TYPEREAL +use modd_field, only: tfieldmetadata, TYPEINT, TYPEREAL USE MODD_IO, ONLY: TFILEDATA USE MODD_PARAMETERS, ONLY: NMNHNAMELGTMAX ! @@ -87,7 +87,7 @@ CHARACTER(LEN=3) :: YSTRING03 ! REAL, DIMENSION(:,:), ALLOCATABLE :: ZWORK2D ! -TYPE(TFIELDDATA) :: TZFIELD +TYPE(TFIELDMETADATA) :: TZFIELD ! !------------------------------------------------------------------------------- ! @@ -104,16 +104,17 @@ ALLOCATE(ZWORK2D(SIZE(XDUMMY_GR_FIELDS,1),SIZE(XDUMMY_GR_FIELDS,2))) !* 3. Dummy fields : ! ------------ ! -TZFIELD%CMNHNAME = 'DUMMY_GR_NBR' -TZFIELD%CSTDNAME = '' -TZFIELD%CLONGNAME = 'DUMMY_GR_NBR' -TZFIELD%CUNITS = '' -TZFIELD%CDIR = '--' -TZFIELD%CCOMMENT = 'number of dummy pgd fields chosen by user' -TZFIELD%NGRID = 0 -TZFIELD%NTYPE = TYPEINT -TZFIELD%NDIMS = 0 -TZFIELD%LTIMEDEP = .FALSE. +TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'DUMMY_GR_NBR', & + CSTDNAME = '', & + CLONGNAME = 'DUMMY_GR_NBR', & + CUNITS = '', & + CDIR = '--', & + CCOMMENT = 'number of dummy pgd fields chosen by user', & + NGRID = 0, & + NTYPE = TYPEINT, & + NDIMS = 0, & + LTIMEDEP = .FALSE. ) CALL IO_Field_write(TPFILE,TZFIELD,NDUMMY_GR_NBR) ! DO JDUMMY=1,NDUMMY_GR_NBR @@ -121,16 +122,17 @@ DO JDUMMY=1,NDUMMY_GR_NBR YSTRING20=CDUMMY_GR_NAME(JDUMMY) YSTRING03=CDUMMY_GR_AREA(JDUMMY) ! - TZFIELD%CMNHNAME = TRIM(YRECFM) - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM(YRECFM) - TZFIELD%CUNITS = '' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_'//YRECFM//YSTRING20//YSTRING03 - TZFIELD%NGRID = 4 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 2 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = TRIM(YRECFM), & + CSTDNAME = '', & + CLONGNAME = TRIM(YRECFM), & + CUNITS = '', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_'//YRECFM//YSTRING20//YSTRING03, & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) ! ZWORK2D(:,:) = XDUMMY_GR_FIELDS(:,:,JDUMMY) ! diff --git a/src/MNH/write_lbn.f90 b/src/MNH/write_lbn.f90 index 3e00b993e7f48e0116a9a0977ca1bbf0c2e92eb3..c7cd8db0a1369886f3794a3d25eb3cbbe3664a68 100644 --- a/src/MNH/write_lbn.f90 +++ b/src/MNH/write_lbn.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1998-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1998-2022 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. @@ -78,52 +78,38 @@ END MODULE MODI_WRITE_LB_n ! P. Wautelet 05/2016-04/2018: new data structures and calls for I/O ! S. Bielli 02/2019: Sea salt: significant sea wave height influences salt emission; 5 salt modes ! P. Wautelet 10/03/2021: use scalar variable names for dust and salt +! P. Wautelet 04/02/2022: use TSVLIST to manage metadata of scalar variables !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ ! -USE MODD_DIM_n -USE MODD_DYN_n -USE MODD_CONF_n +USE MODD_CH_AEROSOL, ONLY: JP_CH_CO, LAERINIT, LDEPOS_AER, LORILAM, NSP +USE MODD_CONF, ONLY: CPROGRAM +USE MODD_CONF_n, ONLY: LUSERV, LUSERC, LUSERR, LUSERI, LUSERS, LUSERG, LUSERH, NRR +USE MODD_DUST, ONLY: LDEPOS_DST, LDSTCAMS, LDSTINIT, LDUST +USE MODD_DYN_n, ONLY: LHORELAX_RV, LHORELAX_RC, LHORELAX_RR, LHORELAX_RI, LHORELAX_RS, & + LHORELAX_RG, LHORELAX_RH, LHORELAX_SV, LHORELAX_TKE, LHORELAX_UVWTH, & + NRIMX, NRIMY, & + NSIZELBX_ll, NSIZELBXR_ll, NSIZELBXSV_ll, NSIZELBXTKE_ll, NSIZELBXU_ll, & + NSIZELBY_ll, NSIZELBYR_ll, NSIZELBYSV_ll, NSIZELBYTKE_ll, NSIZELBYV_ll +use modd_field, only: tfieldmetadata, NMNHDIM_UNKNOWN, TYPELOG, TYPEREAL +USE MODD_GRID_n, ONLY: XZZ +USE MODD_IO, ONLY: TFILEDATA USE MODD_LSFIELD_n -USE MODD_LUNIT_n -USE MODD_PARAM_n -USE MODD_TURB_n USE MODD_NSV -USE MODD_PARAM_LIMA -USE MODD_PARAM_n -! +USE MODD_PARAMETERS, ONLY: JPHEXT, JPVEXT, NLONGNAMELGTMAX, NMNHNAMELGTMAX +USE MODD_PARAM_n, ONLY: CTURB +USE MODD_REF, ONLY: XRHODREFZ +USE MODD_SALT, ONLY: LDEPOS_SLT, LSALT, LSLTCAMS, LSLTINIT + USE MODE_IO_FIELD_WRITE, only: IO_Field_write, IO_Field_write_lb -USE MODE_ll -USE MODE_MSG -USE MODE_MODELN_HANDLER -USE MODE_TOOLS, ONLY: UPCASE -! -USE MODD_RAIN_C2R2_DESCR, ONLY: C2R2NAMES -USE MODD_ICE_C1R3_DESCR, ONLY: C1R3NAMES -USE MODD_CH_M9_n, ONLY: CNAMES, CICNAMES -USE MODD_LG, ONLY: CLGNAMES -USE MODD_ELEC_DESCR, ONLY: CELECNAMES -USE MODD_PARAM_LIMA_WARM, ONLY: CLIMA_WARM_NAMES -USE MODD_PARAM_LIMA_COLD, ONLY: CLIMA_COLD_NAMES -USE MODD_CH_AEROSOL -USE MODD_CH_AERO_n +USE MODE_MODELN_HANDLER, ONLY: GET_CURRENT_MODEL_INDEX + USE MODI_CH_AER_REALLFI_n -USE MODD_CONF -USE MODD_REF, ONLY : XRHODREFZ -USE MODD_CONF, ONLY : CPROGRAM -USE MODD_GRID_n, ONLY : XZZ -USE MODD_PARAMETERS, ONLY : JPHEXT, JPVEXT -USE MODD_DUST -USE MODD_SALT USE MODI_DUSTLFI_n USE MODI_SALTLFI_n -USE MODD_PARAMETERS, ONLY: JPHEXT -USE MODD_IO, ONLY: TFILEDATA -use modd_field, only: tfielddata, TYPELOG, TYPEREAL -! -! + IMPLICIT NONE ! !* 0.1 Declarations of arguments @@ -132,46 +118,36 @@ TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! File characteristics ! !* 0.2 Declarations of local variables ! -INTEGER :: ILUOUT ! logical unit -! INTEGER :: IRR ! Index for moist variables INTEGER :: JRR,JSV ! loop index for moist and scalar variables ! LOGICAL :: GHORELAX_R, GHORELAX_SV ! global hor. relax. informations -INTEGER :: IRIMX,IRIMY ! size of the RIM zone CHARACTER (LEN=1), DIMENSION (7) :: YC ! array with the prefix of the moist variables LOGICAL, DIMENSION (7) :: GUSER ! array with the use indicator of the moist variables REAL, DIMENSION(SIZE(XLBXSVM, 1), SIZE(XLBXSVM,2), SIZE(XLBXSVM,3)) :: ZRHODREFX REAL, DIMENSION(SIZE(XLBYSVM, 1), SIZE(XLBYSVM,2), SIZE(XLBYSVM,3)) :: ZRHODREFY INTEGER :: JK INTEGER :: IMI ! Current model index -CHARACTER(LEN=2) :: INDICE ! to index CCN and IFN fields of LIMA scheme -INTEGER :: I INTEGER :: ILBX,ILBY INTEGER :: IIB, IIE, IJB, IJE, IKB, IKE -INTEGER :: IIU, IJU, IKU REAL, DIMENSION(SIZE(XLBXSVM,1), SIZE(XLBXSVM,2), SIZE(XLBXSVM,3)) :: ZLBXZZ REAL, DIMENSION(SIZE(XLBYSVM,1), SIZE(XLBYSVM,2), SIZE(XLBYSVM,3)) :: ZLBYZZ -CHARACTER(LEN=100) :: YMSG -TYPE(TFIELDDATA) :: TZFIELD +CHARACTER(LEN=NMNHNAMELGTMAX) :: YMNHNAME_BASE +CHARACTER(LEN=NLONGNAMELGTMAX) :: YLONGNAME_BASE +TYPE(TFIELDMETADATA) :: TZFIELD !------------------------------------------------------------------------------- ! !* 1. SOME INITIALIZATIONS ! -------------------- ! -ILUOUT = TLUOUT%NLU -! IMI = GET_CURRENT_MODEL_INDEX() IIB=JPHEXT+1 IIE=SIZE(XZZ,1)-JPHEXT -IIU=SIZE(XZZ,1) IJB=JPHEXT+1 IJE=SIZE(XZZ,2)-JPHEXT -IJU=SIZE(XZZ,2) IKB=JPVEXT+1 IKE=SIZE(XZZ,3)-JPVEXT -IKU=SIZE(XZZ,3) ! ! 2. WRITE THE DIMENSION OF LB FIELDS ! -------------------------------- @@ -213,17 +189,18 @@ IF (NRR >=1) THEN LHORELAX_RI .OR. LHORELAX_RS .OR. LHORELAX_RG .OR. & LHORELAX_RH ! - TZFIELD%CMNHNAME = 'HORELAX_R' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'HORELAX_R' - TZFIELD%CUNITS = '' - TZFIELD%CDIR = '--' - TZFIELD%CCOMMENT = 'Switch to activate the HOrizontal RELAXation' - TZFIELD%CLBTYPE = 'NONE' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPELOG - TZFIELD%NDIMS = 0 - TZFIELD%LTIMEDEP = .FALSE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'HORELAX_R', & + CSTDNAME = '', & + CLONGNAME = 'HORELAX_R', & + CUNITS = '', & + CDIR = '--', & + CCOMMENT = 'Switch to activate the HOrizontal RELAXation', & + CLBTYPE = 'NONE', & + NGRID = 1, & + NTYPE = TYPELOG, & + NDIMS = 0, & + LTIMEDEP = .FALSE. ) ! CALL IO_Field_write(TPFILE,TZFIELD,GHORELAX_R) ! @@ -231,13 +208,14 @@ IF (NRR >=1) THEN YC(:)=(/"V","C","R","I","S","G","H"/) IRR=0 ! - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'kg kg-1' - TZFIELD%CDIR = '' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CUNITS = 'kg kg-1', & + CDIR = '', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) + ! Loop on moist variables DO JRR=1,7 IF (GUSER(JRR)) THEN @@ -268,600 +246,110 @@ END IF IF (NSV >=1) THEN GHORELAX_SV=ANY ( LHORELAX_SV ) ! - TZFIELD%CMNHNAME = 'HORELAX_SV' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'HORELAX_SV' - TZFIELD%CUNITS = '' - TZFIELD%CDIR = '--' - TZFIELD%CCOMMENT = '' - TZFIELD%CLBTYPE = 'NONE' - TZFIELD%NGRID = 0 - TZFIELD%NTYPE = TYPELOG - TZFIELD%NDIMS = 0 - TZFIELD%LTIMEDEP = .FALSE. - CALL IO_Field_write(TPFILE,TZFIELD,GHORELAX_SV) -! - IRIMX =(NSIZELBXSV_ll-2*JPHEXT)/2 - IRIMY =(NSIZELBYSV_ll-2*JPHEXT)/2 - IF (NSV_USER>0) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'kg kg-1' - TZFIELD%CDIR = '' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = 1,NSV_USER - IF(NSIZELBXSV_ll /= 0) THEN - WRITE(TZFIELD%CMNHNAME,'(A6,I3.3)')'LBXSVM',JSV - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBX' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3,A8)')'2_Y_Z_','LBXSVM',JSV - CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBXSV_ll,XLBXSVM(:,:,:,JSV)) - END IF - ! - IF(NSIZELBYSV_ll /= 0) THEN - WRITE(TZFIELD%CMNHNAME,'(A6,I3.3)')'LBYSVM',JSV - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBY' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3,A8)')'X_2_Z_','LBYSVM',JSV - CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBYSV_ll,XLBYSVM(:,:,:,JSV)) - END IF - END DO - END IF - ! - IF (NSV_C2R2END>=NSV_C2R2BEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'm-3' - TZFIELD%CDIR = '' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_C2R2BEG,NSV_C2R2END - IF(NSIZELBXSV_ll /= 0) THEN - TZFIELD%CMNHNAME = 'LBX_'//TRIM(C2R2NAMES(JSV-NSV_C2R2BEG+1)) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBX' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV - CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBXSV_ll,XLBXSVM(:,:,:,JSV)) - END IF - ! - IF(NSIZELBYSV_ll /= 0) THEN - TZFIELD%CMNHNAME = 'LBY_'//TRIM(C2R2NAMES(JSV-NSV_C2R2BEG+1)) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBY' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV - CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBYSV_ll,XLBYSVM(:,:,:,JSV)) - END IF - END DO - END IF - ! - IF (NSV_C1R3END>=NSV_C1R3BEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'm-3' - TZFIELD%CDIR = '' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_C1R3BEG,NSV_C1R3END - IF(NSIZELBXSV_ll /= 0) THEN - TZFIELD%CMNHNAME = 'LBX_'//TRIM(C1R3NAMES(JSV-NSV_C1R3BEG+1)) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBX' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV - CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBXSV_ll,XLBXSVM(:,:,:,JSV)) - END IF - ! - IF(NSIZELBYSV_ll /= 0) THEN - TZFIELD%CMNHNAME = 'LBY_'//TRIM(C1R3NAMES(JSV-NSV_C1R3BEG+1)) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBY' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV - CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBYSV_ll,XLBYSVM(:,:,:,JSV)) - END IF + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'HORELAX_SV', & + CSTDNAME = '', & + CLONGNAME = 'HORELAX_SV', & + CUNITS = '', & + CDIR = '--', & + CCOMMENT = '', & + CLBTYPE = 'NONE', & + NGRID = 0, & + NTYPE = TYPELOG, & + NDIMS = 0, & + LTIMEDEP = .FALSE. ) + CALL IO_Field_write( TPFILE, TZFIELD, GHORELAX_SV ) + + IF ( LORILAM .OR. LDUST .OR. LSALT ) THEN + DO JK = 1, SIZE( XLBXSVM, 3 ) + ZRHODREFX(:,:,JK) = XRHODREFZ(JK) END DO + DO JK = 1, SIZE( XLBYSVM, 3 ) + ZRHODREFY(:,:,JK) = XRHODREFZ(JK) + ENDDO END IF -! -! LIMA: CCN and IFN scalar variables -! - IF (CCLOUD=='LIMA' ) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'kg-1' - TZFIELD%CDIR = '' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_LIMA_CCN_FREE,NSV_LIMA_CCN_FREE+NMOD_CCN-1 - WRITE(INDICE,'(I2.2)')(JSV - NSV_LIMA_CCN_FREE + 1) - IF(NSIZELBXSV_ll /= 0) THEN - TZFIELD%CMNHNAME = 'LBX_'//TRIM(UPCASE(CLIMA_WARM_NAMES(3)))//INDICE - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBX' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV - CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBXSV_ll,XLBXSVM(:,:,:,JSV)) - END IF - ! - IF(NSIZELBYSV_ll /= 0) THEN - TZFIELD%CMNHNAME = 'LBY_'//TRIM(UPCASE(CLIMA_WARM_NAMES(3)))//INDICE - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBY' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV - CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBYSV_ll,XLBYSVM(:,:,:,JSV)) - END IF - END DO - ! - DO JSV = NSV_LIMA_IFN_FREE,NSV_LIMA_IFN_FREE+NMOD_IFN-1 - WRITE(INDICE,'(I2.2)')(JSV - NSV_LIMA_IFN_FREE + 1) - IF(NSIZELBXSV_ll /= 0) THEN - TZFIELD%CMNHNAME = 'LBX_'//TRIM(UPCASE(CLIMA_COLD_NAMES(5)))//INDICE - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBX' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV - CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBXSV_ll,XLBXSVM(:,:,:,JSV)) - END IF - ! - IF(NSIZELBYSV_ll /= 0) THEN - TZFIELD%CMNHNAME = 'LBY_'//TRIM(UPCASE(CLIMA_COLD_NAMES(5)))//INDICE - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBY' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV - CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBYSV_ll,XLBYSVM(:,:,:,JSV)) - END IF - END DO + + IF ( LORILAM ) THEN + IF ( NSIZELBXSV_ll /= 0 ) XLBXSVM(:,:,:,NSV_AERBEG:NSV_AEREND) = MAX( XLBXSVM(:,:,:,NSV_AERBEG:NSV_AEREND), 0. ) + IF ( NSIZELBYSV_ll /= 0 ) XLBYSVM(:,:,:,NSV_AERBEG:NSV_AEREND) = MAX( XLBYSVM(:,:,:,NSV_AERBEG:NSV_AEREND), 0. ) + IF ( LDEPOS_AER(IMI) .AND. ( NSIZELBXSV_ll /= 0 ) ) & + XLBXSVM(:,:,:,NSV_AERDEPBEG:NSV_AERDEPEND) = MAX( XLBXSVM(:,:,:,NSV_AERDEPBEG:NSV_AERDEPEND), 0. ) + IF ( LDEPOS_AER(IMI) .AND. ( NSIZELBYSV_ll /= 0 ) ) & + XLBYSVM(:,:,:,NSV_AERDEPBEG:NSV_AERDEPEND) = MAX( XLBYSVM(:,:,:,NSV_AERDEPBEG:NSV_AERDEPEND), 0. ) + IF ( LAERINIT ) THEN ! GRIBEX CASE (aerosols initialization) + IF ( ( NSIZELBXSV_ll /= 0 ) .AND. ( TRIM( CPROGRAM ) == 'REAL' .OR. TRIM( CPROGRAM ) == 'IDEAL' ) .AND. ( NSP > 1 ) ) & + CALL CH_AER_REALLFI_n( XLBXSVM(:,:,:,NSV_AERBEG:NSV_AEREND), XLBXSVM(:,:,:,NSV_CHEMBEG-1+JP_CH_CO), ZRHODREFX ) + IF ( ( NSIZELBYSV_ll /= 0 ) .AND. ( TRIM( CPROGRAM ) == 'REAL' .OR. TRIM( CPROGRAM ) == 'IDEAL' ) .AND. ( NSP > 1 ) ) & + CALL CH_AER_REALLFI_n( XLBYSVM(:,:,:,NSV_AERBEG:NSV_AEREND), XLBYSVM(:,:,:,NSV_CHEMBEG-1+JP_CH_CO), ZRHODREFY ) + END IF END IF -! -! ELEC -! - IF (NSV_ELECEND>=NSV_ELECBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'kg kg-1' - TZFIELD%CDIR = '' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_ELECBEG,NSV_ELECEND - IF(NSIZELBXSV_ll /= 0) THEN - TZFIELD%CMNHNAME = 'LBX_'//TRIM(CELECNAMES(JSV-NSV_ELECBEG+1)) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBX' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV - CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBXSV_ll,XLBXSVM(:,:,:,JSV)) - END IF - ! - IF(NSIZELBYSV_ll /= 0) THEN - TZFIELD%CMNHNAME = 'LBY_'//TRIM(CELECNAMES(JSV-NSV_ELECBEG+1)) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBY' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV - CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBYSV_ll,XLBYSVM(:,:,:,JSV)) - END IF - END DO + + IF ( LDUST ) THEN + IF ( NSIZELBXSV_ll /= 0 ) XLBXSVM(:,:,:,NSV_DSTBEG:NSV_DSTEND) = MAX( XLBXSVM(:,:,:,NSV_DSTBEG:NSV_DSTEND), 0. ) + IF ( NSIZELBYSV_ll /= 0 ) XLBYSVM(:,:,:,NSV_DSTBEG:NSV_DSTEND) = MAX( XLBYSVM(:,:,:,NSV_DSTBEG:NSV_DSTEND), 0. ) + IF ( LDEPOS_DST(IMI) .AND. ( NSIZELBXSV_ll /= 0 ) ) & + XLBXSVM(:,:,:,NSV_DSTDEPBEG:NSV_DSTDEPEND) = MAX( XLBXSVM(:,:,:,NSV_DSTDEPBEG:NSV_DSTDEPEND), 0. ) + IF ( LDEPOS_DST(IMI) .AND. ( NSIZELBYSV_ll /= 0 ) ) & + XLBYSVM(:,:,:,NSV_DSTDEPBEG:NSV_DSTDEPEND) = MAX( XLBYSVM(:,:,:,NSV_DSTDEPBEG:NSV_DSTDEPEND), 0. ) + IF ( LDSTINIT .AND. .NOT.LDSTCAMS ) THEN ! GRIBEX case (dust initialization) + IF ( ( NSIZELBXSV_ll /= 0 ) .AND. ( TRIM( CPROGRAM ) == 'REAL' .OR. TRIM( CPROGRAM ) == 'IDEAL' ) .AND. ( NSV_DST > 1 ) ) & + CALL DUSTLFI_n( XLBXSVM(:,:,:,NSV_DSTBEG:NSV_DSTEND), ZRHODREFX ) + IF ( ( NSIZELBYSV_ll /= 0 ) .AND. ( TRIM( CPROGRAM ) == 'REAL' .OR. TRIM( CPROGRAM ) == 'IDEAL' ) .AND. ( NSV_DST > 1 ) ) & + CALL DUSTLFI_n( XLBYSVM(:,:,:,NSV_DSTBEG:NSV_DSTEND), ZRHODREFY ) + END IF END IF - ! - ! - IF (LORILAM) THEN - DO JK=1,SIZE(XLBXSVM,3) - ZRHODREFX(:,:,JK) = XRHODREFZ(JK) - ZRHODREFY(:,:,JK) = XRHODREFZ(JK) - ENDDO - ! - IF (NSIZELBXSV_ll /= 0) & - XLBXSVM(:,:,:,NSV_AERBEG:NSV_AEREND) = MAX(XLBXSVM(:,:,:,NSV_AERBEG:NSV_AEREND), 0.) - IF (NSIZELBYSV_ll /= 0) & - XLBYSVM(:,:,:,NSV_AERBEG:NSV_AEREND) = MAX(XLBYSVM(:,:,:,NSV_AERBEG:NSV_AEREND), 0.) - IF (LDEPOS_AER(IMI).AND.(NSIZELBXSV_ll /= 0)) & - XLBXSVM(:,:,:,NSV_AERDEPBEG:NSV_AERDEPEND) = MAX(XLBXSVM(:,:,:,NSV_AERDEPBEG:NSV_AERDEPEND), 0.) - IF (LDEPOS_AER(IMI).AND.(NSIZELBYSV_ll /= 0)) & - XLBYSVM(:,:,:,NSV_AERDEPBEG:NSV_AERDEPEND) = MAX(XLBYSVM(:,:,:,NSV_AERDEPBEG:NSV_AERDEPEND), 0.) - IF (LAERINIT) THEN ! GRIBEX CASE (aerosols initialization) - IF ((NSIZELBXSV_ll /= 0).AND.(CPROGRAM == 'REAL ').AND.(NSP > 1)) & - CALL CH_AER_REALLFI_n(XLBXSVM(:,:,:,NSV_AERBEG:NSV_AEREND),XLBXSVM(:,:,:,NSV_CHEMBEG-1+JP_CH_CO),ZRHODREFX) - IF ((NSIZELBYSV_ll /= 0).AND.(CPROGRAM == 'REAL ').AND.(NSP > 1)) & - CALL CH_AER_REALLFI_n(XLBYSVM(:,:,:,NSV_AERBEG:NSV_AEREND),XLBYSVM(:,:,:,NSV_CHEMBEG-1+JP_CH_CO),ZRHODREFY) - IF ((NSIZELBXSV_ll /= 0).AND.(CPROGRAM == 'IDEAL ').AND.(NSP > 1)) & - CALL CH_AER_REALLFI_n(XLBXSVM(:,:,:,NSV_AERBEG:NSV_AEREND),XLBXSVM(:,:,:,NSV_CHEMBEG-1+JP_CH_CO),ZRHODREFX) - IF ((NSIZELBYSV_ll /= 0).AND.(CPROGRAM == 'IDEAL ').AND.(NSP > 1)) & - CALL CH_AER_REALLFI_n(XLBYSVM(:,:,:,NSV_AERBEG:NSV_AEREND),XLBYSVM(:,:,:,NSV_CHEMBEG-1+JP_CH_CO),ZRHODREFY) + + IF ( LSALT ) THEN + IF ( SIZE( ZLBXZZ ) > 0 ) THEN + ILBX = SIZE( ZLBXZZ, 1 ) / 2 - 1 + ZLBXZZ(1:ILBX+1,:,:) = XZZ(IIB-1:IIB-1+ILBX,:,:) + ZLBXZZ(ILBX+2:2*ILBX+2,:,:) = XZZ(IIE+1-ILBX:IIE+1,:,:) + ENDIF + IF ( SIZE( ZLBYZZ ) > 0 ) THEN + ILBY = SIZE( ZLBYZZ, 2 ) / 2 - 1 + ZLBYZZ(:,1:ILBY+1,:) = XZZ(:,IJB-1:IJB-1+ILBY,:) + ZLBYZZ(:,ILBY+2:2*ILBY+2,:) = XZZ(:,IJE+1-ILBY:IJE+1,:) + ENDIF + IF ( NSIZELBXSV_ll /= 0 ) XLBXSVM(:,:,:,NSV_SLTBEG:NSV_SLTEND) = MAX( XLBXSVM(:,:,:,NSV_SLTBEG:NSV_SLTEND), 0. ) + IF ( NSIZELBYSV_ll /= 0 ) XLBYSVM(:,:,:,NSV_SLTBEG:NSV_SLTEND) = MAX( XLBYSVM(:,:,:,NSV_SLTBEG:NSV_SLTEND), 0. ) + IF ( LDEPOS_SLT(IMI) .AND. ( NSIZELBXSV_ll /= 0 ) ) & + XLBXSVM(:,:,:,NSV_SLTDEPBEG:NSV_SLTDEPEND) = MAX( XLBXSVM(:,:,:,NSV_SLTDEPBEG:NSV_SLTDEPEND), 0. ) + IF ( LDEPOS_SLT(IMI) .AND. ( NSIZELBYSV_ll /= 0 ) ) & + XLBYSVM(:,:,:,NSV_SLTDEPBEG:NSV_SLTDEPEND) = MAX( XLBYSVM(:,:,:,NSV_SLTDEPBEG:NSV_SLTDEPEND), 0. ) + IF ( LSLTINIT .AND. .NOT.LSLTCAMS ) THEN ! GRIBEX case (dust initialization) + IF ( ( NSIZELBXSV_ll /= 0 ) .AND. ( TRIM( CPROGRAM ) == 'REAL' .OR. TRIM( CPROGRAM ) == 'IDEAL' ) .AND. ( NSV_SLT > 1 ) ) & + CALL SALTLFI_n( XLBXSVM(:,:,:,NSV_SLTBEG:NSV_SLTEND), ZRHODREFX, ZLBXZZ ) + IF ( ( NSIZELBYSV_ll /= 0 ) .AND. ( TRIM( CPROGRAM ) == 'REAL' .OR. TRIM( CPROGRAM ) == 'IDEAL' ) .AND. ( NSV_SLT > 1 ) ) & + CALL SALTLFI_n( XLBYSVM(:,:,:,NSV_SLTBEG:NSV_SLTEND), ZRHODREFY, ZLBYZZ ) END IF - ! - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppp' - TZFIELD%CDIR = '' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_AERBEG,NSV_AEREND - IF(NSIZELBXSV_ll /= 0) THEN - TZFIELD%CMNHNAME = 'LBX_'//TRIM(UPCASE(CAERONAMES(JSV-NSV_AERBEG+1))) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBX' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV - CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBXSV_ll,XLBXSVM(:,:,:,JSV)) - END IF - ! - IF(NSIZELBYSV_ll /= 0) THEN - TZFIELD%CMNHNAME = 'LBY_'//TRIM(UPCASE(CAERONAMES(JSV-NSV_AERBEG+1))) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBY' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV - CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBYSV_ll,XLBYSVM(:,:,:,JSV)) - END IF - END DO - ! - IF (LDEPOS_AER(IMI)) THEN - DO JSV = NSV_AERDEPBEG,NSV_AERDEPEND - IF(NSIZELBXSV_ll /= 0) THEN - TZFIELD%CMNHNAME = 'LBX_'//TRIM(CDEAERNAMES(JSV-NSV_AERDEPBEG+1)) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBX' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV - CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBXSV_ll,XLBXSVM(:,:,:,JSV)) - END IF - ! - IF(NSIZELBYSV_ll /= 0) THEN - TZFIELD%CMNHNAME = 'LBY_'//TRIM(CDEAERNAMES(JSV-NSV_AERDEPBEG+1)) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBY' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV - CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBYSV_ll,XLBYSVM(:,:,:,JSV)) - END IF - END DO - END IF END IF - ! - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'kg kg-1' - TZFIELD%CDIR = '' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_CHEMBEG,NSV_CHEMEND + + DO JSV = 1, NSV + TZFIELD = TSVLIST(JSV) + TZFIELD%CDIR = '' + TZFIELD%NDIMLIST(:) = NMNHDIM_UNKNOWN + YMNHNAME_BASE = TRIM( TZFIELD%CMNHNAME ) + YLONGNAME_BASE = TRIM( TZFIELD%CLONGNAME ) + IF(NSIZELBXSV_ll /= 0) THEN - TZFIELD%CMNHNAME = 'LBX_'//TRIM(UPCASE(CNAMES(JSV-NSV_CHEMBEG+1))) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBX' + TZFIELD%CMNHNAME = 'LBX_' // TRIM( YMNHNAME_BASE ) + TZFIELD%CLONGNAME = 'LBX_' // TRIM( YLONGNAME_BASE ) WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV - CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBXSV_ll,XLBXSVM(:,:,:,JSV)) - END IF - ! - IF(NSIZELBYSV_ll /= 0) THEN - TZFIELD%CMNHNAME = 'LBY_'//TRIM(UPCASE(CNAMES(JSV-NSV_CHEMBEG+1))) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBY' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV - CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBYSV_ll,XLBYSVM(:,:,:,JSV)) - END IF - END DO - ! - DO JSV = NSV_CHICBEG,NSV_CHICEND - IF(NSIZELBXSV_ll /= 0) THEN - TZFIELD%CMNHNAME = 'LBX_'//TRIM(UPCASE(CICNAMES(JSV-NSV_CHICBEG+1))) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) TZFIELD%CLBTYPE = 'LBX' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV - CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBXSV_ll,XLBXSVM(:,:,:,JSV)) + CALL IO_Field_write_lb( TPFILE, TZFIELD, NSIZELBXSV_ll, XLBXSVM(:,:,:,JSV) ) END IF - ! + IF(NSIZELBYSV_ll /= 0) THEN - TZFIELD%CMNHNAME = 'LBY_'//TRIM(UPCASE(CICNAMES(JSV-NSV_CHICBEG+1))) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBY' + TZFIELD%CMNHNAME = 'LBY_' // TRIM( YMNHNAME_BASE ) + TZFIELD%CLONGNAME = 'LBY_' // TRIM( YLONGNAME_BASE ) WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV - CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBYSV_ll,XLBYSVM(:,:,:,JSV)) - END IF - END DO - ! - DO JSV = NSV_LNOXBEG,NSV_LNOXEND - IF(NSIZELBXSV_ll /= 0) THEN - TZFIELD%CMNHNAME = 'LBX_LINOX' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBX' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV - CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBXSV_ll,XLBXSVM(:,:,:,JSV)) - END IF - ! - IF(NSIZELBYSV_ll /= 0) THEN - TZFIELD%CMNHNAME = 'LBY_LINOX' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) TZFIELD%CLBTYPE = 'LBY' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV - CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBYSV_ll,XLBYSVM(:,:,:,JSV)) + CALL IO_Field_write_lb( TPFILE, TZFIELD, NSIZELBYSV_ll, XLBYSVM(:,:,:,JSV) ) END IF END DO - ! - IF (LDUST) THEN - DO JK=1,size(XLBXSVM,3) - ZRHODREFX(:,:,JK) = XRHODREFZ(JK) - ENDDO - DO JK=1,size(XLBYSVM,3) - ZRHODREFY(:,:,JK) = XRHODREFZ(JK) - ENDDO - IF (NSIZELBXSV_ll /= 0) & - XLBXSVM(:,:,:,NSV_DSTBEG:NSV_DSTEND) = MAX(XLBXSVM(:,:,:,NSV_DSTBEG:NSV_DSTEND), 0.) - IF (NSIZELBYSV_ll /= 0) & - XLBYSVM(:,:,:,NSV_DSTBEG:NSV_DSTEND) = MAX(XLBYSVM(:,:,:,NSV_DSTBEG:NSV_DSTEND), 0.) - IF (LDEPOS_DST(IMI).AND.(NSIZELBXSV_ll /= 0)) & - XLBXSVM(:,:,:,NSV_DSTDEPBEG:NSV_DSTDEPEND) = MAX(XLBXSVM(:,:,:,NSV_DSTDEPBEG:NSV_DSTDEPEND), 0.) - IF (LDEPOS_DST(IMI).AND.(NSIZELBYSV_ll /= 0)) & - XLBYSVM(:,:,:,NSV_DSTDEPBEG:NSV_DSTDEPEND) = MAX(XLBYSVM(:,:,:,NSV_DSTDEPBEG:NSV_DSTDEPEND), 0.) - IF ((LDSTINIT).AND.(.NOT.LDSTCAMS)) THEN ! GRIBEX case (dust initialization) - IF ((NSIZELBXSV_ll /= 0).AND.(CPROGRAM == 'REAL ').AND.(NSV_DST > 1)) THEN - CALL DUSTLFI_n(XLBXSVM(:,:,:,NSV_DSTBEG:NSV_DSTEND), ZRHODREFX) - END IF - IF ((NSIZELBYSV_ll /= 0).AND.(CPROGRAM == 'REAL ').AND.(NSV_DST > 1)) THEN - CALL DUSTLFI_n(XLBYSVM(:,:,:,NSV_DSTBEG:NSV_DSTEND), ZRHODREFY) - END IF - IF ((NSIZELBXSV_ll /= 0).AND.(CPROGRAM == 'IDEAL ').AND.(NSV_DST > 1)) & - CALL DUSTLFI_n(XLBXSVM(:,:,:,NSV_DSTBEG:NSV_DSTEND), ZRHODREFX) - IF ((NSIZELBYSV_ll /= 0).AND.(CPROGRAM == 'IDEAL ').AND.(NSV_DST > 1)) & - CALL DUSTLFI_n(XLBYSVM(:,:,:,NSV_DSTBEG:NSV_DSTEND), ZRHODREFY) - END IF - ! - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppp' - TZFIELD%CDIR = '' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_DSTBEG,NSV_DSTEND - IF(NSIZELBXSV_ll /= 0) THEN - TZFIELD%CMNHNAME = 'LBX_'//TRIM(CDUSTNAMES(JSV-NSV_DSTBEG+1)) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBX' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV - CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBXSV_ll,XLBXSVM(:,:,:,JSV)) - END IF - ! - IF(NSIZELBYSV_ll /= 0) THEN - TZFIELD%CMNHNAME = 'LBY_'//TRIM(CDUSTNAMES(JSV-NSV_DSTBEG+1)) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBY' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV - CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBYSV_ll,XLBYSVM(:,:,:,JSV)) - END IF - END DO - IF (LDEPOS_DST(IMI)) THEN - DO JSV = NSV_DSTDEPBEG,NSV_DSTDEPEND - IF(NSIZELBXSV_ll /= 0) THEN - TZFIELD%CMNHNAME = 'LBX_'//TRIM(CDEDSTNAMES(JSV-NSV_DSTDEPBEG+1)) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBX' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV - CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBXSV_ll,XLBXSVM(:,:,:,JSV)) - END IF - ! - IF(NSIZELBYSV_ll /= 0) THEN - TZFIELD%CMNHNAME = 'LBY_'//TRIM(CDEDSTNAMES(JSV-NSV_DSTDEPBEG+1)) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBY' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV - CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBYSV_ll,XLBYSVM(:,:,:,JSV)) - END IF - END DO - END IF - ENDIF - ! - IF (LSALT) THEN - DO JK=1,size(XLBXSVM,3) - ZRHODREFX(:,:,JK) = XRHODREFZ(JK) - ENDDO - DO JK=1,size(XLBYSVM,3) - ZRHODREFY(:,:,JK) = XRHODREFZ(JK) - ENDDO - IIU = SIZE(XZZ,1) - IJU = SIZE(XZZ,2) - IKU = SIZE(XZZ,3) - IF (SIZE(ZLBXZZ) .NE. 0 ) THEN - ILBX=SIZE(ZLBXZZ,1)/2-1 - ZLBXZZ(1:ILBX+1,:,:) = XZZ(IIB-1:IIB-1+ILBX,:,:) - ZLBXZZ(ILBX+2:2*ILBX+2,:,:) = XZZ(IIE+1-ILBX:IIE+1,:,:) - ENDIF - IF (SIZE(ZLBYZZ) .NE. 0 ) THEN - ILBY=SIZE(ZLBYZZ,2)/2-1 - ZLBYZZ(:,1:ILBY+1,:) = XZZ(:,IJB-1:IJB-1+ILBY,:) - ZLBYZZ(:,ILBY+2:2*ILBY+2,:) = XZZ(:,IJE+1-ILBY:IJE+1,:) - ENDIF - IF (NSIZELBXSV_ll /= 0) & - XLBXSVM(:,:,:,NSV_SLTBEG:NSV_SLTEND) = MAX(XLBXSVM(:,:,:,NSV_SLTBEG:NSV_SLTEND), 0.) - IF (NSIZELBYSV_ll /= 0) & - XLBYSVM(:,:,:,NSV_SLTBEG:NSV_SLTEND) = MAX(XLBYSVM(:,:,:,NSV_SLTBEG:NSV_SLTEND), 0.) - IF (LDEPOS_SLT(IMI).AND.(NSIZELBXSV_ll /= 0)) & - XLBXSVM(:,:,:,NSV_SLTDEPBEG:NSV_SLTDEPEND) = MAX(XLBXSVM(:,:,:,NSV_SLTDEPBEG:NSV_SLTDEPEND), 0.) - IF (LDEPOS_SLT(IMI).AND.(NSIZELBYSV_ll /= 0)) & - XLBYSVM(:,:,:,NSV_SLTDEPBEG:NSV_SLTDEPEND) = MAX(XLBYSVM(:,:,:,NSV_SLTDEPBEG:NSV_SLTDEPEND), 0.) - IF ((LSLTINIT).AND.(.NOT.LSLTCAMS)) THEN ! GRIBEX case (dust initialization) - IF ((NSIZELBXSV_ll /= 0).AND.(CPROGRAM == 'REAL ').AND.(NSV_SLT > 1)) THEN - CALL SALTLFI_n(XLBXSVM(:,:,:,NSV_SLTBEG:NSV_SLTEND), ZRHODREFX, ZLBXZZ) - END IF - IF ((NSIZELBYSV_ll /= 0).AND.(CPROGRAM == 'REAL ').AND.(NSV_SLT > 1)) THEN - CALL SALTLFI_n(XLBYSVM(:,:,:,NSV_SLTBEG:NSV_SLTEND), ZRHODREFY, ZLBYZZ) - END IF - IF ((NSIZELBXSV_ll /= 0).AND.(CPROGRAM == 'IDEAL ').AND.(NSV_SLT > 1)) THEN - CALL SALTLFI_n(XLBXSVM(:,:,:,NSV_SLTBEG:NSV_SLTEND), ZRHODREFX, ZLBXZZ) - END IF - IF ((NSIZELBYSV_ll /= 0).AND.(CPROGRAM == 'IDEAL ').AND.(NSV_SLT > 1)) THEN - CALL SALTLFI_n(XLBYSVM(:,:,:,NSV_SLTBEG:NSV_SLTEND), ZRHODREFY, ZLBYZZ) - END IF - END IF - ! - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppp' - TZFIELD%CDIR = '' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_SLTBEG,NSV_SLTEND - IF(NSIZELBXSV_ll /= 0) THEN - TZFIELD%CMNHNAME = 'LBX_'//TRIM(CSALTNAMES(JSV-NSV_SLTBEG+1)) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBX' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV - CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBXSV_ll,XLBXSVM(:,:,:,JSV)) - END IF - ! - IF(NSIZELBYSV_ll /= 0) THEN - TZFIELD%CMNHNAME = 'LBY_'//TRIM(CSALTNAMES(JSV-NSV_SLTBEG+1)) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBY' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV - CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBYSV_ll,XLBYSVM(:,:,:,JSV)) - END IF - END DO - IF (LDEPOS_SLT(IMI)) THEN - DO JSV = NSV_SLTDEPBEG,NSV_SLTDEPEND - IF(NSIZELBXSV_ll /= 0) THEN - TZFIELD%CMNHNAME = 'LBX_'//TRIM(CDESLTNAMES(JSV-NSV_SLTDEPBEG+1)) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBX' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV - CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBXSV_ll,XLBXSVM(:,:,:,JSV)) - END IF - ! - IF(NSIZELBYSV_ll /= 0) THEN - TZFIELD%CMNHNAME = 'LBY_'//TRIM(CDESLTNAMES(JSV-NSV_SLTDEPBEG+1)) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBY' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV - CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBYSV_ll,XLBYSVM(:,:,:,JSV)) - END IF - END DO - END IF - ENDIF - ! - ! lagrangian variables - IF (NSV_LGEND>=NSV_LGBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'm' - TZFIELD%CDIR = '' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_LGBEG,NSV_LGEND - IF(NSIZELBXSV_ll /= 0) THEN - TZFIELD%CMNHNAME = 'LBX_'//TRIM(CLGNAMES(JSV-NSV_LGBEG+1)) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBX' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV - CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBXSV_ll,XLBXSVM(:,:,:,JSV)) - END IF -! - IF(NSIZELBYSV_ll /= 0) THEN - TZFIELD%CMNHNAME = 'LBY_'//TRIM(CLGNAMES(JSV-NSV_LGBEG+1)) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBY' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV - CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBYSV_ll,XLBYSVM(:,:,:,JSV)) - END IF - END DO - END IF - ! passive pollutants - IF (NSV_PPEND>=NSV_PPBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'kg kg-1' - TZFIELD%CDIR = '' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_PPBEG,NSV_PPEND - IF(NSIZELBXSV_ll /= 0) THEN - TZFIELD%CMNHNAME = 'LBX_PP' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBX' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV - CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBXSV_ll,XLBXSVM(:,:,:,JSV)) - END IF - ! - IF(NSIZELBYSV_ll /= 0) THEN - TZFIELD%CMNHNAME = 'LBY_PP' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBY' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV - CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBYSV_ll,XLBYSVM(:,:,:,JSV)) - END IF - END DO - END IF - ! conditional sampling - IF (NSV_CSEND>=NSV_CSBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'kg kg-1' - TZFIELD%CDIR = '' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_CSBEG,NSV_CSEND - IF(NSIZELBXSV_ll /= 0) THEN - TZFIELD%CMNHNAME = 'LBX_CS' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBX' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV - CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBXSV_ll,XLBXSVM(:,:,:,JSV)) - END IF - ! - IF(NSIZELBYSV_ll /= 0) THEN - TZFIELD%CMNHNAME = 'LBY_CS' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBY' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV - CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBYSV_ll,XLBYSVM(:,:,:,JSV)) - END IF - END DO - END IF -#ifdef MNH_FOREFIRE - ! ForeFire scalar variables - IF (NSV_FFEND>=NSV_FFBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'kg kg-1' - TZFIELD%CDIR = '' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_FFBEG,NSV_FFEND - IF(NSIZELBXSV_ll /= 0) THEN - TZFIELD%CMNHNAME = 'LBX_FF' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBX' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV - CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBXSV_ll,XLBXSVM(:,:,:,JSV)) - END IF - ! - IF(NSIZELBYSV_ll /= 0) THEN - TZFIELD%CMNHNAME = 'LBY_FF' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CLBTYPE = 'LBY' - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV - CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBYSV_ll,XLBYSVM(:,:,:,JSV)) - END IF - END DO - END IF -#endif END IF ! !------------------------------------------------------------------------------- ! ! -END SUBROUTINE WRITE_LB_n +END SUBROUTINE WRITE_LB_n diff --git a/src/MNH/write_les_budgetn.f90 b/src/MNH/write_les_budgetn.f90 index 7827ba184b18d710839d63155d807c186b67eb01..cb76368d557662da8392476b6585bb55c43b34b8 100644 --- a/src/MNH/write_les_budgetn.f90 +++ b/src/MNH/write_les_budgetn.f90 @@ -44,7 +44,7 @@ subroutine Write_les_budget_n( tpdiafile ) !! Original 07/02/00 !! 06/11/02 (V. Masson) new LES budgets ! P. Wautelet: 05/2016-04/2018: new data structures and calls for I/O -! P. Wautelet 15/10/2020: restructure Les_diachro calls to use tfield_metadata_base type +! P. Wautelet 15/10/2020: restructure Les_diachro calls to use tfieldmetadata_base type ! JL Redelsperger 03/21 modif buoyancy flix for OCEAN LES case ! -------------------------------------------------------------------------- ! @@ -56,7 +56,7 @@ use modd_cst, only: xg, xalphaoc use modd_dyn_n, only: locean use modd_field, only: NMNHDIM_BUDGET_LES_LEVEL, NMNHDIM_BUDGET_LES_TIME, & NMNHDIM_BUDGET_TERM, NMNHDIM_UNUSED, & - tfield_metadata_base, TYPEREAL + tfieldmetadata_base, TYPEREAL use modd_io, only: tfiledata use modd_les, only: cles_norm_type, nles_k, xles_temp_mean_start, xles_temp_mean_end, xles_temp_sampling use modd_les_n, only: nles_times, & @@ -105,9 +105,9 @@ character(len=:), allocatable :: ygroupcomment ! REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZLES_BUDGET ! -logical :: gdoavg ! Compute and store time average -logical :: gdonorm ! Compute and store normalized field -type(tfield_metadata_base) :: tzfield +logical :: gdoavg ! Compute and store time average +logical :: gdonorm ! Compute and store normalized field +type(tfieldmetadata_base) :: tzfield !------------------------------------------------------------------------------- ! !* Initializations diff --git a/src/MNH/write_les_rt_budgetn.f90 b/src/MNH/write_les_rt_budgetn.f90 index 114d39cda70bc47d713bcfbddc3f550c9a27d491..66df13adebabdf556d771123572774257abae163 100644 --- a/src/MNH/write_les_rt_budgetn.f90 +++ b/src/MNH/write_les_rt_budgetn.f90 @@ -43,7 +43,7 @@ subroutine Write_les_rt_budget_n( tpdiafile ) !! ------------- !! Original 06/11/02 ! P. Wautelet: 05/2016-04/2018: new data structures and calls for I/O -! P. Wautelet 15/10/2020: restructure Les_diachro calls to use tfield_metadata_base type +! P. Wautelet 15/10/2020: restructure Les_diachro calls to use tfieldmetadata_base type ! -------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -52,7 +52,7 @@ subroutine Write_les_rt_budget_n( tpdiafile ) use modd_cst, only: xg use modd_field, only: NMNHDIM_BUDGET_LES_LEVEL, NMNHDIM_BUDGET_LES_TIME, & NMNHDIM_BUDGET_TERM, NMNHDIM_UNUSED, & - tfield_metadata_base, TYPEREAL + tfieldmetadata_base, TYPEREAL use modd_io, only: tfiledata use modd_les, only: cles_norm_type, nles_k, xles_temp_mean_start, xles_temp_mean_end, xles_temp_sampling use modd_les_n, only: nles_times, & @@ -98,9 +98,9 @@ character(len=:), allocatable :: ygroupcomment ! REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZLES_BUDGET ! -logical :: gdoavg ! Compute and store time average -logical :: gdonorm ! Compute and store normalized field -type(tfield_metadata_base) :: tzfield +logical :: gdoavg ! Compute and store time average +logical :: gdonorm ! Compute and store normalized field +type(tfieldmetadata_base) :: tzfield !------------------------------------------------------------------------------- ! !* Initializations diff --git a/src/MNH/write_les_sv_budgetn.f90 b/src/MNH/write_les_sv_budgetn.f90 index 6a3997964fff08e950d3de7c18fa1603f5e392ad..8a412845f16ad91b5122ef961529ff316a551f09 100644 --- a/src/MNH/write_les_sv_budgetn.f90 +++ b/src/MNH/write_les_sv_budgetn.f90 @@ -43,7 +43,7 @@ subroutine Write_les_sv_budget_n( tpdiafile ) !! ------------- !! Original 06/11/02 ! P. Wautelet: 05/2016-04/2018: new data structures and calls for I/O -! P. Wautelet 14/10/2020: restructure Les_diachro calls to use tfield_metadata_base type +! P. Wautelet 14/10/2020: restructure Les_diachro calls to use tfieldmetadata_base type ! -------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -53,7 +53,7 @@ use modd_conf_n, only: luserv use modd_cst, only: xg use modd_field, only: NMNHDIM_BUDGET_LES_LEVEL, NMNHDIM_BUDGET_LES_TIME, NMNHDIM_BUDGET_LES_SV, & NMNHDIM_BUDGET_TERM, NMNHDIM_UNUSED, & - tfield_metadata_base, TYPEREAL + tfieldmetadata_base, TYPEREAL use modd_io, only: tfiledata use modd_les, only: cles_norm_type, nles_k, xles_temp_mean_start, xles_temp_mean_end, xles_temp_sampling use modd_les_n, only: nles_times, & @@ -99,9 +99,9 @@ character(len=:), allocatable :: ygroupcomment ! REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZLES_BUDGET ! -logical :: gdoavg ! Compute and store time average -logical :: gdonorm ! Compute and store normalized field -type(tfield_metadata_base) :: tzfield +logical :: gdoavg ! Compute and store time average +logical :: gdonorm ! Compute and store normalized field +type(tfieldmetadata_base) :: tzfield !------------------------------------------------------------------------------- ! !* Initializations diff --git a/src/MNH/write_lesn.f90 b/src/MNH/write_lesn.f90 index 9b6b326bc92ca2ebae7d62a7019a319903edebc4..2e18f72adf934925770b2fd3bd323df5a37274c7 100644 --- a/src/MNH/write_lesn.f90 +++ b/src/MNH/write_lesn.f90 @@ -7,7 +7,7 @@ module mode_write_les_n !###################### -use modd_field, only: tfield_metadata_base +use modd_field, only: tfieldmetadata_base implicit none @@ -22,9 +22,9 @@ character(len=:), allocatable :: cgroupcomment logical :: ldoavg ! Compute and store time average logical :: ldonorm ! Compute and store normalized field -type(tfield_metadata_base) :: tfield -type(tfield_metadata_base) :: tfieldx -type(tfield_metadata_base) :: tfieldy +type(tfieldmetadata_base) :: tfield +type(tfieldmetadata_base) :: tfieldx +type(tfieldmetadata_base) :: tfieldy interface Les_diachro_write module procedure Les_diachro_write_1D, Les_diachro_write_2D, Les_diachro_write_3D, Les_diachro_write_4D @@ -71,7 +71,7 @@ subroutine Write_les_n( tpdiafile ) ! P. Wautelet 12/10/2020: remove HLES_AVG dummy argument and group all 4 calls ! P. Wautelet 13/10/2020: bugfix: correct some names for LES_DIACHRO_2PT diagnostics (Ri) ! P. Wautelet 26/10/2020: bugfix: correct some comments and conditions + add missing RES_RTPZ -! P. Wautelet 26/10/2020: restructure subroutines to use tfield_metadata_base type +! P. Wautelet 26/10/2020: restructure subroutines to use tfieldmetadata_base type ! -------------------------------------------------------------------------- ! !* 0. DECLARATIONS diff --git a/src/MNH/write_lfifm1_for_diag.f90 b/src/MNH/write_lfifm1_for_diag.f90 index 7630a9363ae435202b69b151a44a141087196581..3b14e62c4a20b8dd47be2ee4b0b68ec0a63cd3cb 100644 --- a/src/MNH/write_lfifm1_for_diag.f90 +++ b/src/MNH/write_lfifm1_for_diag.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1994-2022 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. @@ -145,115 +145,99 @@ END MODULE MODI_WRITE_LFIFM1_FOR_DIAG ! P. Wautelet 08/02/2019: minor bug: compute ZWORK36 only when needed ! S Bielli 02/2019: sea salt: significant sea wave height influences salt emission; 5 salt modes ! P. Wautelet 18/03/2020: remove ICE2 option -! B. Vie 06/2020 Add prognostic supersaturation for LIMA +! B. Vie 06/2020: Add prognostic supersaturation for LIMA ! P. Wautelet 11/03/2021: bugfix: correct name for NSV_LIMA_IMM_NUCL ! J.L Redelsperger 03/2021 Adding OCEAN LES Case and Autocoupled O-A LES +! P. Wautelet 04/02/2022: use TSVLIST to manage metadata of scalar variables !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ ! -USE MODD_DIM_n -USE MODD_CONF -USE MODD_CONF_n -use modd_field, only: tfielddata, tfieldlist, TYPEINT, TYPEREAL -USE MODD_GRID -USE MODD_GRID_n -USE MODD_IO, ONLY : TFILEDATA -USE MODD_METRICS_n -USE MODD_TIME -USE MODD_TIME_n -USE MODD_DYN_n -USE MODD_FIELD_n -USE MODD_GR_FIELD_n -USE MODD_LSFIELD_n -USE MODD_PARAM_n -USE MODD_CURVCOR_n -USE MODD_REF -USE MODD_REF_n -USE MODD_LUNIT, ONLY : TLUOUT0 -USE MODD_LUNIT_n -USE MODD_TURB_n -USE MODD_RADIATIONS_n -USE MODD_FRC -USE MODD_PRECIP_n -USE MODD_CST -USE MODD_CLOUDPAR -USE MODD_DEEP_CONVECTION_n -USE MODD_PARAM_KAFR_n -USE MODD_NESTING -USE MODD_PARAMETERS +USE MODD_BLOWSNOW, ONLY: LBLOWSNOW, NBLOWSNOW3D +USE MODD_BLOWSNOW_n, ONLY: XSNWSUBL3D +USE MODD_CH_AERO_n, ONLY: XN3D, XRG3D, XSIG3D +USE MODD_CH_AEROSOL +USE MODD_CH_M9_n, ONLY: NEQAQ +USE MODD_CH_MNHC_n, ONLY: LCH_CONV_LINOX, LUSECHEM, XRTMIN_AQ +USE MODD_CONDSAMP, ONLY: LCONDSAMP +USE MODD_CONF, ONLY: CBIBUSER, CEQNSYS, CPROGRAM, L1D, L2D, LCARTESIAN, LFORCING, LPACK, LTHINSHELL, NBUGFIX, NMASDEV +USE MODD_CONF_n, ONLY: IDX_RVT, IDX_RCT, IDX_RRT, IDX_RIT, IDX_RST, IDX_RGT, IDX_RHT, & + LUSERV, LUSERC, LUSERR, LUSERI, LUSERS, LUSERG, LUSERH, & + LUSECI, NRR, NRRI, NRRL +USE MODD_CST, ONLY: XALPI, XAVOGADRO, XBETAI, XCI, XCL, XCPD, XCPV, XG, XGAMI, XLSTT, XLVTT, & + XMD, XMV, XP00, XPI, XRADIUS, XRHOLW, XRD, XRV, XTT +USE MODD_CSTS_DUST, ONLY: XDENSITY_DUST, XM3TOUM3, XMOLARWEIGHT_DUST +USE MODD_CURVCOR_n, ONLY: XCORIOZ +USE MODD_DEEP_CONVECTION_n, ONLY: XCG_RATE, XCG_TOTAL_NUMBER, XIC_RATE, XIC_TOTAL_NUMBER, XPACCONV, XPRCONV, XPRSCONV USE MODD_DIAG_FLAG +USE MODD_DIM_n, ONLY: NIMAX_ll, NJMAX_ll, NKMAX +USE MODD_DUST, ONLY: LDEPOS_DST, LDUST, NMODE_DST +USE MODD_DYN_n, ONLY: LOCEAN +use modd_field, only: tfieldmetadata, tfieldlist, TYPEINT, TYPEREAL +USE MODD_FIELD_n, ONLY: XCIT, XCLDFR, XICEFR, XPABSM, XPABST, XRT, XSIGS, XSRCT, XSVT, XTHT, XTKET, XUT, XVT, XWT, XZWS +USE MODD_FRC, ONLY: NFRC, XGXTHFRC, XGYTHFRC, XPGROUNDFRC, XRVFRC, XTENDRVFRC, XTENDTHFRC, XTHFRC, XUFRC, XVFRC, XWFRC +USE MODD_GRID, ONLY: XBETA, XLAT0, XLATORI, XLON0, XLONORI, XRPK +USE MODD_GRID_n, only: LSLEVE, NEXTE_XMIN, NEXTE_YMIN, XHATM_BOUND, & + XLAT, XLEN1, XLEN2, XLON, XZS, XXHAT, XXHATM, XYHAT, XYHATM, XZHAT, XZSMT, XZTOP, XZZ +USE MODD_IO, ONLY: TFILEDATA +USE MODD_LSFIELD_n, ONLY: XLSRVM, XLSTHM, XLSUM, XLSVM, XLSWM +USE MODD_LUNIT, ONLY: TLUOUT0 +USE MODD_METRICS_n, ONLY: XDXX, XDYY, XDZX, XDZY, XDZZ +USE MODD_MPIF +USE MODD_NESTING, ONLY: NDXRATIO_ALL, NDYRATIO_ALL, NXOR_ALL, NYOR_ALL USE MODD_NSV -USE MODD_CH_M9_n, ONLY : CNAMES, NEQAQ -USE MODD_RAIN_C2R2_DESCR, ONLY : C2R2NAMES -USE MODD_ICE_C1R3_DESCR, ONLY : C1R3NAMES -USE MODD_ELEC_DESCR, ONLY : CELECNAMES -USE MODD_RAIN_C2R2_KHKO_PARAM -USE MODD_ICE_C1R3_PARAM -USE MODD_PARAM_ICE, ONLY : LSEDIC -USE MODD_PARAM_LIMA, ONLY : NMOD_CCN, NMOD_IFN, NMOD_IMM, NINDICE_CCN_IMM,& - LSCAV, LHHONI, LAERO_MASS, & - LLIMA_DIAG, & - NSPECIE, XMDIAM_IFN, XSIGMA_IFN, ZFRAC=>XFRAC,& - XR_MEAN_CCN, XLOGSIG_CCN, NMOM_S, NMOM_G, NMOM_H -USE MODD_PARAM_LIMA_WARM, ONLY : CLIMA_WARM_CONC, CAERO_MASS -USE MODD_PARAM_LIMA_COLD, ONLY : CLIMA_COLD_CONC -USE MODD_LG, ONLY : CLGNAMES -USE MODD_PASPOL, ONLY : LPASPOL -USE MODD_CONDSAMP, ONLY : LCONDSAMP -! -USE MODD_DIAG_FLAG -USE MODD_RADAR, ONLY: XLAT_RAD,XELEV,& - XSTEP_RAD,NBRAD,NBELEV,NBAZIM,NBSTEPMAX,& - NCURV_INTERPOL,LATT,LCART_RAD,NPTS_H,NPTS_V,XGRID,& - LREFR,LDNDZ,NMAX,CNAME_RAD,NDIFF,& - XLON_RAD,XALT_RAD,XLAM_RAD,XDT_RAD,LWBSCS,LWREFL -use modd_precision, only: MNHREAL_MPI -! -USE MODI_RADAR_SIMULATOR -! -USE MODD_DUST -USE MODD_CSTS_DUST -USE MODD_SALT -USE MODD_BLOWSNOW -USE MODD_CH_AEROSOL -USE MODD_CH_AERO_n -USE MODD_CH_MNHC_n -USE MODE_DUST_PSD -USE MODE_SALT_PSD -USE MODE_BLOWSNOW_PSD -USE MODE_AERO_PSD +USE MODD_PARAMETERS, ONLY: JPHEXT, JPVEXT, XUNDEF +USE MODD_PARAM_LIMA_COLD, ONLY: CLIMA_COLD_CONC +USE MODD_PARAM_LIMA, ONLY: NMOD_CCN, NMOD_IFN, NMOD_IMM, NINDICE_CCN_IMM, & + LSCAV, LLIMA_DIAG, NMOM_S, NMOM_G, NMOM_H +USE MODD_PARAM_LIMA_WARM, ONLY: CLIMA_WARM_CONC, CAERO_MASS +USE MODD_PARAM_n, ONLY: CCLOUD, CDCONV, CELEC, CSURF, CTURB +USE MODD_PASPOL, ONLY: LPASPOL +USE MODD_PRECIP_n, ONLY: XACDEP, XACPRC, XACPRG, XACPRH, XACPRR, XACPRS, XEVAP3D, & + XINDEP, XINPRC, XINPRG, XINPRH, XINPRR, XINPRR3D, XINPRS +use modd_precision, only: MNHREAL_MPI +USE MODD_RADAR, ONLY: CNAME_RAD, LATT, LCART_RAD, LDNDZ, LREFR, LWBSCS, LWREFL, & + NBAZIM, NBELEV, NBRAD, NBSTEPMAX, NCURV_INTERPOL, NDIFF, NMAX, NPTS_H, NPTS_V, & + XALT_RAD, XDT_RAD, XELEV, XGRID, XLAM_RAD, XLAT_RAD, XLON_RAD, XSTEP_RAD +USE MODD_REF, ONLY: LBOUSS, LCOUPLES, XEXNTOP, XEXNTOPO, XRHODREFZ, XRHODREFZO, XTHVREFZ, XTHVREFZO +USE MODD_REF_n, ONLY: XEXNREF, XRHODREF, XTHVREF +USE MODD_SALT, ONLY: LDEPOS_SLT, LSALT, NMODE_SLT +USE MODD_TIME, ONLY: TDTEXP, TDTSEG +USE MODD_TIME_n, ONLY: TDTCUR, TDTMOD +USE MODD_TURB_n, only: CTOM, XBL_DEPTH +USE MODD_VAR_ll, ONLY: NMNH_COMM_WORLD + +USE MODE_AERO_PSD, ONLY: PPP2AERO +USE MODE_BLOWSNOW_PSD, ONLY: PPP2SNOW +USE MODE_DUST_PSD, ONLY: PPP2DUST +use mode_field, only: Find_field_id_from_mnhname +USE MODE_GRIDPROJ, ONLY: SM_LATLON +USE MODE_IO_FIELD_WRITE, only: IO_Field_write +USE MODE_IO_FILE, only: IO_File_close, IO_File_open +USE MODE_IO_MANAGE_STRUCT, only: IO_File_add2list +USE MODE_MODELN_HANDLER, only: GET_CURRENT_MODEL_INDEX +use mode_msg +USE MODE_SALT_PSD, ONLY: PPP2SALT +USE MODE_THERMO, ONLY: QSAT, SM_FOES +USE MODE_TOOLS, ONLY: UPCASE +USE MODE_TOOLS_ll, ONLY: GET_DIM_EXT_ll, GET_INDICE_ll + +USE MODI_CALCSOUND +USE MODI_CLUSTERING +USE MODI_COMPUTE_MEAN_PRECIP +USE MODI_CONTRAV +USE MODI_GPS_ZENITH USE MODI_GRADIENT_M -USE MODI_GRADIENT_W USE MODI_GRADIENT_U USE MODI_GRADIENT_V -USE MODI_SHUMAN -USE MODI_RADAR_RAIN_ICE +USE MODI_GRADIENT_W USE MODI_INI_RADAR -USE MODI_COMPUTE_MEAN_PRECIP -USE MODI_UV_TO_ZONAL_AND_MERID -USE MODI_CALCSOUND -USE MODI_FREE_ATM_PROFILE -USE MODI_GPS_ZENITH -USE MODI_CONTRAV -! -use mode_field, only: Find_field_id_from_mnhname -USE MODE_GRIDPROJ -USE MODE_GATHER_ll -USE MODE_IO_FIELD_WRITE, only: IO_Field_write -USE MODE_IO_FILE, only: IO_File_close, IO_File_open -USE MODE_IO_MANAGE_STRUCT, only: IO_File_add2list -USE MODE_ll -use mode_msg -USE MODE_THERMO -USE MODE_TOOLS, ONLY: UPCASE -USE MODE_MODELN_HANDLER USE MODI_LIDAR -USE MODI_CLUSTERING -! -USE MODD_MPIF -USE MODD_VAR_ll +USE MODI_RADAR_RAIN_ICE +USE MODI_RADAR_SIMULATOR +USE MODI_SHUMAN +USE MODI_UV_TO_ZONAL_AND_MERID ! IMPLICIT NONE ! @@ -279,11 +263,6 @@ REAL :: ZRV_OV_RD ! XRV / XRD REAL :: ZGAMREF ! Standard atmosphere lapse rate (K/m) REAL :: ZX0D ! work real scalar REAL :: ZLATOR, ZLONOR ! geographical coordinates of 1st mass point -REAL :: ZXHATM, ZYHATM ! conformal coordinates of 1st mass point -REAL, DIMENSION(:), ALLOCATABLE :: ZXHAT_ll ! Position x in the conformal - ! plane (array on the complete domain) -REAL, DIMENSION(:), ALLOCATABLE :: ZYHAT_ll ! Position y in the conformal - ! plane (array on the complete domain) ! REAL,DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3)) :: ZPOVO REAL,DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3)) :: ZTEMP @@ -303,8 +282,8 @@ INTEGER, DIMENSION(:,:), ALLOCATABLE :: IWORK1 integer :: ICURR,INBOUT,IERR ! REAL,DIMENSION(SIZE(XSVT,1),SIZE(XSVT,2),SIZE(XSVT,3),NSP+NCARB+NSOA,JPMODE):: ZPTOTA -REAL,DIMENSION(SIZE(XSVT,1),SIZE(XSVT,2),SIZE(XSVT,3),NMODE_DST*2):: ZSDSTDEP -REAL,DIMENSION(SIZE(XSVT,1),SIZE(XSVT,2),SIZE(XSVT,3),NMODE_SLT*2):: ZSSLTDEP +REAL,DIMENSION(:,:,:,:), POINTER :: ZSDSTDEP +REAL,DIMENSION(:,:,:,:), POINTER :: ZSSLTDEP REAL,DIMENSION(:,:,:,:), ALLOCATABLE :: ZSIG_DST, ZRG_DST, ZN0_DST REAL,DIMENSION(:,:,:,:), ALLOCATABLE :: ZSIG_SLT, ZRG_SLT, ZN0_SLT REAL,DIMENSION(:,:,:), ALLOCATABLE :: ZBET_SNW, ZRG_SNW @@ -332,8 +311,9 @@ CHARACTER(LEN=5) :: YVIEW ! Upward or Downward integration INTEGER :: IACCMODE ! !------------------------------------------------------------------------------- -INTEGER :: IAUX ! work variable -REAL,DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3)) :: ZWORK35,ZWORK36, ZW1, ZW2, ZW3 +INTEGER :: IAUX ! work variable +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZW1, ZW2, ZW3 +REAL,DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3)) :: ZWORK35,ZWORK36 REAL,DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2)) :: ZWORK25,ZWORK26 REAL :: ZEAU ! Mean precipitable water INTEGER, DIMENSION(SIZE(XZZ,1),SIZE(XZZ,2)) ::IKTOP ! level in which is the altitude 3000m @@ -343,8 +323,8 @@ INTEGER :: ILUOUT0 ! Logical unit number for output-listing CHARACTER(LEN=2) :: INDICE CHARACTER(LEN=100) :: YMSG INTEGER :: IID -TYPE(TFIELDDATA) :: TZFIELD -TYPE(TFIELDDATA),DIMENSION(2) :: TZFIELD2 +TYPE(TFIELDMETADATA) :: TZFIELD +TYPE(TFIELDMETADATA), DIMENSION(2) :: TZFIELD2 ! ! LIMA LIDAR REAL,DIMENSION(:,:,:,:), ALLOCATABLE :: ZTMP1, ZTMP2, ZTMP3, ZTMP4 @@ -414,13 +394,7 @@ IF (.NOT.LCARTESIAN) THEN ! !* diagnostic of 1st mass point ! - ALLOCATE(ZXHAT_ll(NIMAX_ll+ 2 * JPHEXT),ZYHAT_ll(NJMAX_ll+2 * JPHEXT)) - CALL GATHERALL_FIELD_ll('XX',XXHAT,ZXHAT_ll,IRESP) !// - CALL GATHERALL_FIELD_ll('YY',XYHAT,ZYHAT_ll,IRESP) !// - ZXHATM = 0.5 * (ZXHAT_ll(1)+ZXHAT_ll(2)) - ZYHATM = 0.5 * (ZYHAT_ll(1)+ZYHAT_ll(2)) - CALL SM_LATLON(XLATORI,XLONORI,ZXHATM,ZYHATM,ZLATOR,ZLONOR) - DEALLOCATE(ZXHAT_ll,ZYHAT_ll) + CALL SM_LATLON( XLATORI, XLONORI, XHATM_BOUND(NEXTE_XMIN), XHATM_BOUND(NEXTE_YMIN), ZLATOR, ZLONOR ) ! CALL IO_Field_write(TPFILE,'LONOR',ZLONOR) CALL IO_Field_write(TPFILE,'LATOR',ZLATOR) @@ -511,16 +485,17 @@ ZPOVO(:,:,:)= ZPOVO(:,:,:)*1E6/XRHODREF(:,:,:) ZPOVO(:,:,1) =-1.E+11 ZPOVO(:,:,IKU)=-1.E+11 IF (INDEX(CISO,'EV') /= 0) THEN - TZFIELD%CMNHNAME = 'POVOT' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'POVOT' - TZFIELD%CUNITS = 'PVU' ! 1 PVU = 1e-6 m^2 s^-1 K kg^-1 - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_POtential VOrticity' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'POVOT', & + CSTDNAME = '', & + CLONGNAME = 'POVOT', & + CUNITS = 'PVU', & ! 1 PVU = 1e-6 m^2 s^-1 K kg^-1 + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_POtential VOrticity', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZPOVO) END IF ! @@ -530,27 +505,29 @@ IF (LVAR_RS) THEN CALL IO_Field_write(TPFILE,'VT',XVT) ! IF (LWIND_ZM) THEN - TZFIELD2(1)%CMNHNAME = 'UM_ZM' - TZFIELD2(1)%CSTDNAME = '' - TZFIELD2(1)%CLONGNAME = 'UM_ZM' - TZFIELD2(1)%CUNITS = 'm s-1' - TZFIELD2(1)%CDIR = 'XY' - TZFIELD2(1)%CCOMMENT = 'Zonal component of horizontal wind' - TZFIELD2(1)%NGRID = 2 - TZFIELD2(1)%NTYPE = TYPEREAL - TZFIELD2(1)%NDIMS = 3 - TZFIELD2(1)%LTIMEDEP = .TRUE. + TZFIELD2(1) = TFIELDMETADATA( & + CMNHNAME = 'UM_ZM', & + CSTDNAME = '', & + CLONGNAME = 'UM_ZM', & + CUNITS = 'm s-1', & + CDIR = 'XY', & + CCOMMENT = 'Zonal component of horizontal wind', & + NGRID = 2, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ! - TZFIELD2(2)%CMNHNAME = 'VM_ZM' - TZFIELD2(2)%CSTDNAME = '' - TZFIELD2(2)%CLONGNAME = 'VM_ZM' - TZFIELD2(2)%CUNITS = 'm s-1' - TZFIELD2(2)%CDIR = 'XY' - TZFIELD2(2)%CCOMMENT = 'Meridian component of horizontal wind' - TZFIELD2(2)%NGRID = 3 - TZFIELD2(2)%NTYPE = TYPEREAL - TZFIELD2(2)%NDIMS = 3 - TZFIELD2(2)%LTIMEDEP = .TRUE. + TZFIELD2(2) = TFIELDMETADATA( & + CMNHNAME = 'VM_ZM', & + CSTDNAME = '', & + CLONGNAME = 'VM_ZM', & + CUNITS = 'm s-1', & + CDIR = 'XY', & + CCOMMENT = 'Meridian component of horizontal wind', & + NGRID = 3, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ! CALL UV_TO_ZONAL_AND_MERID(XUT,XVT,23,TPFILE=TPFILE,TZFIELDS=TZFIELD2) END IF @@ -600,7 +577,7 @@ IF (LVAR_PR .AND. LUSERR .AND. SIZE(XINPRR)>0 ) THEN ! explicit species ! CALL FIND_FIELD_ID_FROM_MNHNAME('INPRR',IID,IRESP) - TZFIELD = TFIELDLIST(IID) + TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) TZFIELD%CUNITS = 'mm hour-1' CALL IO_Field_write(TPFILE,TZFIELD,XINPRR*3.6E6) ! @@ -608,7 +585,7 @@ IF (LVAR_PR .AND. LUSERR .AND. SIZE(XINPRR)>0 ) THEN CALL IO_Field_write(TPFILE,'EVAP3D', XEVAP3D) ! CALL FIND_FIELD_ID_FROM_MNHNAME('ACPRR',IID,IRESP) - TZFIELD = TFIELDLIST(IID) + TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) TZFIELD%CUNITS = 'mm' CALL IO_Field_write(TPFILE,TZFIELD,XACPRR*1.0E3) ! @@ -616,56 +593,56 @@ IF (LVAR_PR .AND. LUSERR .AND. SIZE(XINPRR)>0 ) THEN CCLOUD == 'KHKO' .OR. CCLOUD == 'LIMA') THEN IF (SIZE(XINPRC) /= 0 ) THEN CALL FIND_FIELD_ID_FROM_MNHNAME('INPRC',IID,IRESP) - TZFIELD = TFIELDLIST(IID) + TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) TZFIELD%CUNITS = 'mm hour-1' CALL IO_Field_write(TPFILE,TZFIELD,XINPRC*3.6E6) ! CALL FIND_FIELD_ID_FROM_MNHNAME('ACPRC',IID,IRESP) - TZFIELD = TFIELDLIST(IID) + TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) TZFIELD%CUNITS = 'mm' CALL IO_Field_write(TPFILE,TZFIELD,XACPRC*1.0E3) END IF IF (SIZE(XINDEP) /= 0 ) THEN CALL FIND_FIELD_ID_FROM_MNHNAME('INDEP',IID,IRESP) - TZFIELD = TFIELDLIST(IID) + TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) TZFIELD%CUNITS = 'mm hour-1' CALL IO_Field_write(TPFILE,TZFIELD,XINDEP*3.6E6) ! CALL FIND_FIELD_ID_FROM_MNHNAME('ACDEP',IID,IRESP) - TZFIELD = TFIELDLIST(IID) + TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) TZFIELD%CUNITS = 'mm' CALL IO_Field_write(TPFILE,TZFIELD,XACDEP*1.0E3) END IF END IF IF (CCLOUD(1:3) == 'ICE' .OR. CCLOUD == 'C3R5' .OR. CCLOUD == 'LIMA') THEN CALL FIND_FIELD_ID_FROM_MNHNAME('INPRS',IID,IRESP) - TZFIELD = TFIELDLIST(IID) + TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) TZFIELD%CUNITS = 'mm hour-1' CALL IO_Field_write(TPFILE,TZFIELD,XINPRS*3.6E6) ! CALL FIND_FIELD_ID_FROM_MNHNAME('ACPRS',IID,IRESP) - TZFIELD = TFIELDLIST(IID) + TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) TZFIELD%CUNITS = 'mm' CALL IO_Field_write(TPFILE,TZFIELD,XACPRS*1.0E3) ! CALL FIND_FIELD_ID_FROM_MNHNAME('INPRG',IID,IRESP) - TZFIELD = TFIELDLIST(IID) + TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) TZFIELD%CUNITS = 'mm hour-1' CALL IO_Field_write(TPFILE,TZFIELD,XINPRG*3.6E6) ! CALL FIND_FIELD_ID_FROM_MNHNAME('ACPRG',IID,IRESP) - TZFIELD = TFIELDLIST(IID) + TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) TZFIELD%CUNITS = 'mm' CALL IO_Field_write(TPFILE,TZFIELD,XACPRG*1.0E3) ! IF (SIZE(XINPRH) /= 0 ) THEN CALL FIND_FIELD_ID_FROM_MNHNAME('INPRH',IID,IRESP) - TZFIELD = TFIELDLIST(IID) + TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) TZFIELD%CUNITS = 'mm hour-1' CALL IO_Field_write(TPFILE,TZFIELD,XINPRH*3.6E6) ! CALL FIND_FIELD_ID_FROM_MNHNAME('ACPRH',IID,IRESP) - TZFIELD = TFIELDLIST(IID) + TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) TZFIELD%CUNITS = 'mm' CALL IO_Field_write(TPFILE,TZFIELD,XACPRH*1.0E3) ENDIF @@ -676,7 +653,7 @@ IF (LVAR_PR .AND. LUSERR .AND. SIZE(XINPRR)>0 ) THEN IF (SIZE(XINPRH) /= 0 ) & ZWORK21(:,:) = ZWORK21(:,:) + XINPRH(:,:) CALL FIND_FIELD_ID_FROM_MNHNAME('INPRT',IID,IRESP) - TZFIELD = TFIELDLIST(IID) + TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) TZFIELD%CUNITS = 'mm hour-1' CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21*3.6E6) ! @@ -687,7 +664,7 @@ IF (LVAR_PR .AND. LUSERR .AND. SIZE(XINPRR)>0 ) THEN ZWORK21(:,:) = ZWORK21(:,:) + XACPRH(:,:) ! CALL FIND_FIELD_ID_FROM_MNHNAME('ACPRT',IID,IRESP) - TZFIELD = TFIELDLIST(IID) + TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) TZFIELD%CUNITS = 'mm' CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21*1.0E3) ! @@ -697,17 +674,17 @@ IF (LVAR_PR .AND. LUSERR .AND. SIZE(XINPRR)>0 ) THEN ! IF (CDCONV /= 'NONE') THEN CALL FIND_FIELD_ID_FROM_MNHNAME('PRCONV',IID,IRESP) - TZFIELD = TFIELDLIST(IID) + TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) TZFIELD%CUNITS = 'mm hour-1' CALL IO_Field_write(TPFILE,TZFIELD,XPRCONV*3.6E6) ! CALL FIND_FIELD_ID_FROM_MNHNAME('PACCONV',IID,IRESP) - TZFIELD = TFIELDLIST(IID) + TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) TZFIELD%CUNITS = 'mm' CALL IO_Field_write(TPFILE,TZFIELD,XPACCONV*1.0E3) ! CALL FIND_FIELD_ID_FROM_MNHNAME('PRSCONV',IID,IRESP) - TZFIELD = TFIELDLIST(IID) + TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) TZFIELD%CUNITS = 'mm hour-1' CALL IO_Field_write(TPFILE,TZFIELD,XPRSCONV*3.6E6) END IF @@ -737,16 +714,17 @@ IF (LVAR_PR ) THEN ZWORK23(:,:) = 0. END DO !* Precipitable water in kg/m**2 - TZFIELD%CMNHNAME = 'PRECIP_WAT' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'PRECIP_WAT' - TZFIELD%CUNITS = 'kg m-2' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = '' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 2 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'PRECIP_WAT', & + CSTDNAME = '', & + CLONGNAME = 'PRECIP_WAT', & + CUNITS = 'kg m-2', & + CDIR = 'XY', & + CCOMMENT = '', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK22) ENDIF ! @@ -815,153 +793,165 @@ IF (LHU_FLX) THEN ENDDO ENDIF ! Ecriture - ! composantes U et V du flux surfacique d'humidite - TZFIELD%CMNHNAME = 'UM90' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'UM90' - TZFIELD%CUNITS = 'kg s-1 m-2' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = '' - TZFIELD%NGRID = 2 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + ! composantes U et V du flux surfacique d'humidite + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'UM90', & + CSTDNAME = '', & + CLONGNAME = 'UM90', & + CUNITS = 'kg s-1 m-2', & + CDIR = 'XY', & + CCOMMENT = '', & + NGRID = 2, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) ! - TZFIELD%CMNHNAME = 'VM90' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'VM90' - TZFIELD%CUNITS = 'kg s-1 m-2' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = '' - TZFIELD%NGRID = 3 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'VM90', & + CSTDNAME = '', & + CLONGNAME = 'VM90', & + CUNITS = 'kg s-1 m-2', & + CDIR = 'XY', & + CCOMMENT = '', & + NGRID = 3, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK32) ! composantes U et V du flux d'humidite integre sur 3000 metres - TZFIELD%CMNHNAME = 'UM91' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'UM91' - TZFIELD%CUNITS = 'kg s-1 m-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = '' - TZFIELD%NGRID = 2 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 2 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'UM91', & + CSTDNAME = '', & + CLONGNAME = 'UM91', & + CUNITS = 'kg s-1 m-1', & + CDIR = 'XY', & + CCOMMENT = '', & + NGRID = 2, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21) ! - TZFIELD%CMNHNAME = 'VM91' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'VM91' - TZFIELD%CUNITS = 'kg s-1 m-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = '' - TZFIELD%NGRID = 3 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 2 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'VM91', & + CSTDNAME = '', & + CLONGNAME = 'VM91', & + CUNITS = 'kg s-1 m-1', & + CDIR = 'XY', & + CCOMMENT = '', & + NGRID = 3, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK22) ! ! Convergence d'humidite - TZFIELD%CMNHNAME = 'HMCONV' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'HMCONV' - TZFIELD%CUNITS = 'kg s-1 m-3' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Horizontal CONVergence of moisture flux' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'HMCONV', & + CSTDNAME = '', & + CLONGNAME = 'HMCONV', & + CUNITS = 'kg s-1 m-3', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Horizontal CONVergence of moisture flux', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,-ZWORK35) ! ! Convergence d'humidite integre sur 3000 metres - TZFIELD%CMNHNAME = 'HMCONV3000' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'HMCONV3000' - TZFIELD%CUNITS = 'kg s-1 m-3' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Horizontal CONVergence of moisture flux' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 2 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'HMCONV3000', & + CSTDNAME = '', & + CLONGNAME = 'HMCONV3000', & + CUNITS = 'kg s-1 m-3', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Horizontal CONVergence of moisture flux', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,-ZWORK25) ! IF (CCLOUD(1:3) == 'ICE' .OR. CCLOUD == 'LIMA') THEN ! composantes U et V du flux surfacique d'hydrometeores - TZFIELD%CMNHNAME = 'UM92' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'UM92' - TZFIELD%CUNITS = 'kg s-1 m-2' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = '' - TZFIELD%NGRID = 2 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'UM92', & + CSTDNAME = '', & + CLONGNAME = 'UM92', & + CUNITS = 'kg s-1 m-2', & + CDIR = 'XY', & + CCOMMENT = '', & + NGRID = 2, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK33) ! - TZFIELD%CMNHNAME = 'VM92' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'VM92' - TZFIELD%CUNITS = 'kg s-1 m-2' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = '' - TZFIELD%NGRID = 3 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'VM92', & + CSTDNAME = '', & + CLONGNAME = 'VM92', & + CUNITS = 'kg s-1 m-2', & + CDIR = 'XY', & + CCOMMENT = '', & + NGRID = 3, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK34) ! composantes U et V du flux d'hydrometeores integre sur 3000 metres - TZFIELD%CMNHNAME = 'UM93' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'UM93' - TZFIELD%CUNITS = 'kg s-1 m-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = '' - TZFIELD%NGRID = 2 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 2 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'UM93', & + CSTDNAME = '', & + CLONGNAME = 'UM93', & + CUNITS = 'kg s-1 m-1', & + CDIR = 'XY', & + CCOMMENT = '', & + NGRID = 2, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK23) ! - TZFIELD%CMNHNAME = 'VM93' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'VM93' - TZFIELD%CUNITS = 'kg s-1 m-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = '' - TZFIELD%NGRID = 3 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 2 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'VM93', & + CSTDNAME = '', & + CLONGNAME = 'VM93', & + CUNITS = 'kg s-1 m-1', & + CDIR = 'XY', & + CCOMMENT = '', & + NGRID = 3, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK24) ! Convergence d'hydrometeores - TZFIELD%CMNHNAME = 'HMCONV_TT' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'HMCONV_TT' - TZFIELD%CUNITS = 'kg s-1 m-3' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Horizontal CONVergence of hydrometeor flux' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'HMCONV_TT', & + CSTDNAME = '', & + CLONGNAME = 'HMCONV_TT', & + CUNITS = 'kg s-1 m-3', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Horizontal CONVergence of hydrometeor flux', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,-ZWORK36) ! Convergence d'hydrometeores integre sur 3000 metres - TZFIELD%CMNHNAME = 'HMCONV3000_TT' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'HMCONV3000_TT' - TZFIELD%CUNITS = 'kg s-1 m-3' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Horizontal CONVergence of hydrometeor flux' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 2 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'HMCONV3000_TT', & + CSTDNAME = '', & + CLONGNAME = 'HMCONV3000_TT', & + CUNITS = 'kg s-1 m-3', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Horizontal CONVergence of hydrometeor flux', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,-ZWORK26) ENDIF ENDIF @@ -971,12 +961,14 @@ ENDIF IF (LVAR_MRW .OR. LLIMA_DIAG) THEN IF (NRR >=1) THEN ! Moist variables are written individually in file - TZFIELD%CSTDNAME = '' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'generic for moist variables', & !Temporary name to ease identification + CSTDNAME = '', & + CDIR = 'XY', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) IF (LUSERV) THEN TZFIELD%CMNHNAME = 'MRV' TZFIELD%CLONGNAME = 'MRV' @@ -993,7 +985,7 @@ IF (LVAR_MRW .OR. LLIMA_DIAG) THEN ! TZFIELD%CMNHNAME = 'VRC' TZFIELD%CLONGNAME = 'VRC' - TZFIELD%CUNITS = '1' !vol/vol + TZFIELD%CUNITS = 'ppv' !vol/vol TZFIELD%CCOMMENT = 'X_Y_Z_VRC (vol/vol)' CALL IO_Field_write(TPFILE,TZFIELD,XRT(:,:,:,IDX_RCT)*XRHODREF(:,:,:)/1.E3) END IF @@ -1006,7 +998,7 @@ IF (LVAR_MRW .OR. LLIMA_DIAG) THEN ! TZFIELD%CMNHNAME = 'VRR' TZFIELD%CLONGNAME = 'VRR' - TZFIELD%CUNITS = '1' !vol/vol + TZFIELD%CUNITS = 'ppv' !vol/vol TZFIELD%CCOMMENT = 'X_Y_Z_VRR (vol/vol)' CALL IO_Field_write(TPFILE,TZFIELD,XRT(:,:,:,IDX_RRT)*XRHODREF(:,:,:)/1.E3) END IF @@ -1050,143 +1042,118 @@ END IF ! User scalar variables ! individually in the file IF (LVAR_MRSV) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'g kg-1' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! DO JSV = 1,NSV_USER - WRITE(TZFIELD%CMNHNAME,'(A4,I3.3)')'MRSV',JSV + TZFIELD = TSVLIST(JSV) + WRITE( TZFIELD%CMNHNAME, '( A4, I3.3 )' ) 'MRSV', JSV TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A4,I3.3)')'X_Y_Z_','MRSV',JSV - CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)*1.E3) + TZFIELD%CUNITS = 'g kg-1' + WRITE( TZFIELD%CCOMMENT, '( A, I3.3 )' ) 'Mixing Ratio for user Scalar Variable', JSV + CALL IO_Field_write( TPFILE, TZFIELD, XSVT(:,:,:,JSV) * 1.E3 ) END DO END IF ! microphysical C2R2 scheme scalar variables IF(LVAR_MRW) THEN - IF (NSV_C2R2END>=NSV_C2R2BEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_C2R2BEG,NSV_C2R2END - TZFIELD%CMNHNAME = TRIM(C2R2NAMES(JSV-NSV_C2R2BEG+1))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - IF (JSV < NSV_C2R2END) THEN - TZFIELD%CUNITS = 'cm-3' - ZWORK31(:,:,:)=XSVT(:,:,:,JSV)*1.E-6 - ELSE - TZFIELD%CUNITS = 'l-1' - ZWORK31(:,:,:)=XSVT(:,:,:,JSV)*1.E-3 - END IF - WRITE(TZFIELD%CCOMMENT,'(A6,A4,I3.3)')'X_Y_Z_','MRSV',JSV - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) - END DO - END IF + DO JSV = NSV_C2R2BEG,NSV_C2R2END + TZFIELD = TSVLIST(JSV) + IF (JSV < NSV_C2R2END) THEN + TZFIELD%CUNITS = 'cm-3' + ZWORK31(:,:,:)=XSVT(:,:,:,JSV)*1.E-6 + ELSE + TZFIELD%CUNITS = 'l-1' + ZWORK31(:,:,:)=XSVT(:,:,:,JSV)*1.E-3 + END IF + WRITE(TZFIELD%CCOMMENT,'(A6,A4,I3.3)')'X_Y_Z_','MRSV',JSV + CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) + END DO ! microphysical C3R5 scheme additional scalar variables - IF (NSV_C1R3END>=NSV_C1R3BEG) THEN - TZFIELD%CSTDNAME = '' + DO JSV = NSV_C1R3BEG,NSV_C1R3END + TZFIELD = TSVLIST(JSV) TZFIELD%CUNITS = 'l-1' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_C1R3BEG,NSV_C1R3END - TZFIELD%CMNHNAME = TRIM(C1R3NAMES(JSV-NSV_C1R3BEG+1))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV - CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)*1.E-3) - END DO - END IF + CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)*1.E-3) + END DO END IF ! ! microphysical LIMA scheme scalar variables ! IF (LLIMA_DIAG) THEN IF (NSV_LIMA_END>=NSV_LIMA_BEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'generic LIMA diag', & !Temporary name to ease identification + CDIR = 'XY', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) END IF ! DO JSV = NSV_LIMA_BEG,NSV_LIMA_END +!PW: bases sur CLIMA_*_CONC et pas CLIMA_*_NAMES !!! ! TZFIELD%CUNITS = 'cm-3' WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV ! ! Nc IF (JSV .EQ. NSV_LIMA_NC) THEN - TZFIELD%CMNHNAME = TRIM(CLIMA_WARM_CONC(1))//'T' + TZFIELD%CMNHNAME = TRIM(CLIMA_WARM_CONC(1)) END IF ! Nr IF (JSV .EQ. NSV_LIMA_NR) THEN - TZFIELD%CMNHNAME = TRIM(CLIMA_WARM_CONC(2))//'T' + TZFIELD%CMNHNAME = TRIM(CLIMA_WARM_CONC(2)) END IF ! N CCN free IF (JSV .GE. NSV_LIMA_CCN_FREE .AND. JSV .LT. NSV_LIMA_CCN_ACTI) THEN WRITE(INDICE,'(I2.2)')(JSV - NSV_LIMA_CCN_FREE + 1) - TZFIELD%CMNHNAME = TRIM(CLIMA_WARM_CONC(3))//INDICE//'T' + TZFIELD%CMNHNAME = TRIM(CLIMA_WARM_CONC(3))//INDICE END IF ! N CCN acti IF (JSV .GE. NSV_LIMA_CCN_ACTI .AND. JSV .LT. NSV_LIMA_CCN_ACTI + NMOD_CCN) THEN WRITE(INDICE,'(I2.2)')(JSV - NSV_LIMA_CCN_ACTI + 1) - TZFIELD%CMNHNAME = TRIM(CLIMA_WARM_CONC(4))//INDICE//'T' + TZFIELD%CMNHNAME = TRIM(CLIMA_WARM_CONC(4))//INDICE END IF ! Scavenging IF (JSV .EQ. NSV_LIMA_SCAVMASS) THEN - TZFIELD%CMNHNAME = TRIM(CAERO_MASS(1))//'T' + TZFIELD%CMNHNAME = TRIM(CAERO_MASS(1)) TZFIELD%CUNITS = 'kg cm-3' END IF ! Ni IF (JSV .EQ. NSV_LIMA_NI) THEN - TZFIELD%CMNHNAME = TRIM(CLIMA_COLD_CONC(1))//'T' + TZFIELD%CMNHNAME = TRIM(CLIMA_COLD_CONC(1)) END IF ! Ns IF (JSV .EQ. NSV_LIMA_NS) THEN - TZFIELD%CMNHNAME = TRIM(CLIMA_COLD_CONC(2))//'T' + TZFIELD%CMNHNAME = TRIM(CLIMA_COLD_CONC(2)) END IF ! Ng IF (JSV .EQ. NSV_LIMA_NG) THEN - TZFIELD%CMNHNAME = TRIM(CLIMA_COLD_CONC(3))//'T' + TZFIELD%CMNHNAME = TRIM(CLIMA_COLD_CONC(3)) END IF ! Nh IF (JSV .EQ. NSV_LIMA_NH) THEN - TZFIELD%CMNHNAME = TRIM(CLIMA_COLD_CONC(4))//'T' + TZFIELD%CMNHNAME = TRIM(CLIMA_COLD_CONC(4)) END IF ! N IFN free IF (JSV .GE. NSV_LIMA_IFN_FREE .AND. JSV .LT. NSV_LIMA_IFN_NUCL) THEN WRITE(INDICE,'(I2.2)')(JSV - NSV_LIMA_IFN_FREE + 1) - TZFIELD%CMNHNAME = TRIM(CLIMA_COLD_CONC(5))//INDICE//'T' + TZFIELD%CMNHNAME = TRIM(CLIMA_COLD_CONC(5))//INDICE END IF ! N IFN nucl IF (JSV .GE. NSV_LIMA_IFN_NUCL .AND. JSV .LT. NSV_LIMA_IFN_NUCL + NMOD_IFN) THEN WRITE(INDICE,'(I2.2)')(JSV - NSV_LIMA_IFN_NUCL + 1) - TZFIELD%CMNHNAME = TRIM(CLIMA_COLD_CONC(6))//INDICE//'T' + TZFIELD%CMNHNAME = TRIM(CLIMA_COLD_CONC(6))//INDICE END IF ! N IMM nucl IF (JSV .GE. NSV_LIMA_IMM_NUCL .AND. JSV .LT. NSV_LIMA_IMM_NUCL + NMOD_IMM) THEN WRITE(INDICE,'(I2.2)')(NINDICE_CCN_IMM(JSV - NSV_LIMA_IMM_NUCL + 1)) - TZFIELD%CMNHNAME = TRIM(CLIMA_COLD_CONC(7))//INDICE//'T' + TZFIELD%CMNHNAME = TRIM(CLIMA_COLD_CONC(7))//INDICE END IF ! Hom. freez. of CCN IF (JSV .EQ. NSV_LIMA_HOM_HAZE) THEN - TZFIELD%CMNHNAME = TRIM(CLIMA_COLD_CONC(8))//'T' + TZFIELD%CMNHNAME = TRIM(CLIMA_COLD_CONC(8)) END IF ! -! Supersaturation +! Supersaturation IF (JSV .EQ. NSV_LIMA_SPRO) THEN - TZFIELD%CMNHNAME = TRIM(CLIMA_WARM_CONC(5))//'T' + TZFIELD%CMNHNAME = TRIM(CLIMA_WARM_CONC(5)) END IF ! TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) @@ -1195,66 +1162,143 @@ IF (LLIMA_DIAG) THEN END DO ! IF (LUSERC) THEN - TZFIELD%CMNHNAME = 'LWC' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'LWC' - TZFIELD%CUNITS = 'g m-3' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_LWC' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'LWC', & + CSTDNAME = '', & + CLONGNAME = 'LWC', & + CUNITS = 'g m-3', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_LWC', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ZWORK31(:,:,:)=XRT(:,:,:,2)*1.E3*XRHODREF(:,:,:) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) END IF ! IF (LUSERI) THEN - TZFIELD%CMNHNAME = 'IWC' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'IWC' - TZFIELD%CUNITS = 'g m-3' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_MRI' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'IWC', & + CSTDNAME = '', & + CLONGNAME = 'IWC', & + CUNITS = 'g m-3', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_MRI', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ZWORK31(:,:,:)=XRT(:,:,:,4)*1.E3*XRHODREF(:,:,:) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) END IF ! END IF +!PW: TODO: a documenter +IF (LELECDIAG .AND. CELEC .NE. "NONE") THEN + DO JSV = NSV_ELECBEG,NSV_ELECEND + TZFIELD = TSVLIST(JSV) + IF ( JSV > NSV_ELECBEG .AND. JSV < NSV_ELECEND ) THEN + TZFIELD%CUNITS = 'C m-3' + WRITE( TZFIELD%CCOMMENT, '( A6, A3, I3.3 )' ) 'X_Y_Z_', 'SVT', JSV + ELSE + TZFIELD%CUNITS = 'm-3' + WRITE( TZFIELD%CCOMMENT, '( A6, A3, I3.3, A8 )' ) 'X_Y_Z_', 'SVT', JSV, ' (nb ions/m3)' + END IF + ZWORK31(:,:,:)=XSVT(:,:,:,JSV) * XRHODREF(:,:,:) ! C/kg --> C/m3 + CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) + END DO +END IF +! +! Lagrangian variables +IF (LTRAJ) THEN + DO JSV = NSV_LGBEG, NSV_LGEND + TZFIELD = TSVLIST(JSV) + WRITE(TZFIELD%CCOMMENT,'(A6,A20,I3.3,A4)')'X_Y_Z_','Lagrangian variable ',JSV + CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)) + END DO + + ! X coordinate + DO JK=1,IKU + DO JJ=1,IJU + ZWORK31(:,JJ,JK) = 1E-3*XXHATM(:) + END DO + END DO + + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'X', & + CSTDNAME = '', & + CLONGNAME = 'X', & + CUNITS = 'km', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_X coordinate', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) + + CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) + + ! Y coordinate + DO JK=1,IKU + DO JI=1,IIU + ZWORK31(JI,:,JK) = 1E-3 * XYHATM(:) + END DO + END DO + + TZFIELD%CMNHNAME = 'Y' + TZFIELD%CLONGNAME = 'Y' + TZFIELD%CCOMMENT = 'X_Y_Z_Y coordinate' + + CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) +END IF +! +! Passive polluant scalar variables +IF (LPASPOL) THEN + ALLOCATE(ZRHOT( SIZE(XTHT,1), SIZE(XTHT,2),SIZE(XTHT,3))) + ALLOCATE(ZTMP( SIZE(XTHT,1), SIZE(XTHT,2),SIZE(XTHT,3))) +! +!* Density +! + ZRHOT(:,:,:)=XPABST(:,:,:)/(XRD*XTHT(:,:,:)*((XPABST(:,:,:)/XP00)**(XRD/XCPD))) +! +!* Conversion g/m3. ! -! chemical scalar variables in gas phase ppbv + ZRHOT(:,:,:)=ZRHOT(:,:,:)*1000.0 + ! + DO JSV = NSV_PPBEG, NSV_PPEND + TZFIELD = TSVLIST(JSV) + TZFIELD%CUNITS = 'g m-3' + + ZTMP(:,:,:)=ABS( XSVT(:,:,:,JSV)*ZRHOT(:,:,:) ) + CALL IO_Field_write(TPFILE,TZFIELD,ZTMP) + END DO + + DEALLOCATE(ZTMP) + DEALLOCATE(ZRHOT) +END IF +! Conditional sampling variables +IF (LCONDSAMP) THEN +!PW: TODO: a documenter!!! + DO JSV = NSV_CSBEG, NSV_CSEND + TZFIELD = TSVLIST(JSV) + CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)) + END DO +END IF +! chemical scalar variables in gas phase ppb IF (LCHEMDIAG) THEN DO JSV = NSV_CHGSBEG,NSV_CHGSEND - TZFIELD%CMNHNAME = TRIM(UPCASE(CNAMES(JSV-NSV_CHGSBEG+1)))//'T' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'ppbv' - TZFIELD%CDIR = 'XY' + TZFIELD = TSVLIST(JSV) + TZFIELD%CUNITS = 'ppb' WRITE(TZFIELD%CCOMMENT,'(A6,A4,I3.3)')'X_Y_Z_','CHIM',JSV - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)*1.E9) END DO END IF IF (LCHAQDIAG) THEN !aqueous concentration in M - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'M' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! ZWORK31(:,:,:)=0. DO JSV = NSV_CHACBEG, NSV_CHACBEG-1+NEQAQ/2 !cloud water - TZFIELD%CMNHNAME = TRIM(CNAMES(JSV-NSV_CHACBEG+NSV_CHGS+1))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) + TZFIELD = TSVLIST(JSV) + TZFIELD%CUNITS = 'mol l-1' !Original value: 'M' (molar) but not known by udunits => replaced by equivalent mol l-1 WRITE(TZFIELD%CCOMMENT,'(A6,A4,I3.3)')'X_Y_Z_','CHAQ',JSV WHERE(((XRT(:,:,:,2)*XRHODREF(:,:,:))/1.e3) .GE. XRTMIN_AQ) ZWORK31(:,:,:)=(XSVT(:,:,:,JSV)*1000.)/(XMD*1.E+3*XRT(:,:,:,2)) @@ -1264,17 +1308,22 @@ IF (LCHAQDIAG) THEN !aqueous concentration in M ! ZWORK31(:,:,:)=0. DO JSV = NSV_CHACBEG+NEQAQ/2, NSV_CHACEND !rain water - TZFIELD%CMNHNAME = TRIM(CNAMES(JSV-NSV_CHACBEG+NSV_CHGS+1))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) + TZFIELD = TSVLIST(JSV) + TZFIELD%CUNITS = 'mol l-1' !Original value: 'M' (molar) but not known by udunits => replaced by equivalent mol l-1 WRITE(TZFIELD%CCOMMENT,'(A6,A4,I3.3)')'X_Y_Z_','CHAQ',JSV WHERE(((XRT(:,:,:,3)*XRHODREF(:,:,:))/1.e3) .GE. XRTMIN_AQ) ZWORK31(:,:,:)=(XSVT(:,:,:,JSV)*1000.)/(XMD*1.E+3*XRT(:,:,:,3)) ENDWHERE CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) END DO + + + +!PW: TODO: LCHICDIAG n'existe pas => les variables correspondantes ne sont pas ecrites... + ! ZWORK31(:,:,:)=0. ! DO JSV = NSV_CHICBEG,NSV_CHICEND ! ice phase -! TZFIELD%CMNHNAME = TRIM(CICNAMES(JSV-NSV_CHICBEG+1))//'T' +! TZFIELD%CMNHNAME = TRIM(CICNAMES(JSV-NSV_CHICBEG+1)) ! TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) ! WRITE(TZFIELD%CCOMMENT,'(A6,A4,I3.3,A4)')'X_Y_Z_','CHIC',JSV,' (M)' ! WHERE(((XRT(:,:,:,3)*XRHODREF(:,:,:))/1.e3) .GE. XRTMIN_AQ) @@ -1283,317 +1332,222 @@ IF (LCHAQDIAG) THEN !aqueous concentration in M ! CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) ! END DO END IF - -! Passive polluant scalar variables -IF (LPASPOL) THEN - ALLOCATE(ZRHOT( SIZE(XTHT,1), SIZE(XTHT,2),SIZE(XTHT,3))) - ALLOCATE(ZTMP( SIZE(XTHT,1), SIZE(XTHT,2),SIZE(XTHT,3))) -! -!* Density -! - ZRHOT(:,:,:)=XPABST(:,:,:)/(XRD*XTHT(:,:,:)*((XPABST(:,:,:)/XP00)**(XRD/XCPD))) -! -!* Conversion g/m3. -! - ZRHOT(:,:,:)=ZRHOT(:,:,:)*1000.0 - ! - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'g m-3' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = 1,NSV_PP - ZTMP(:,:,:)=ABS( XSVT(:,:,:,JSV+NSV_PPBEG-1)*ZRHOT(:,:,:) ) - WRITE(TZFIELD%CMNHNAME,'(A3,I3.3)')'PPT',JSV - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CCOMMENT = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME) - CALL IO_Field_write(TPFILE,TZFIELD,ZTMP) - END DO - DEALLOCATE(ZTMP) - DEALLOCATE(ZRHOT) -END IF -! Conditional sampling variables -IF (LCONDSAMP) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = '1' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_CSBEG,NSV_CSEND - WRITE(TZFIELD%CMNHNAME,'(A3,I3.3)')'CST',JSV - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CCOMMENT = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME) - CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)) - END DO -END IF -! -! Blowing snow variables -! -IF(LBLOWSNOW) THEN - TZFIELD%CMNHNAME = 'SNWSUBL3D' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'kg m-3 s-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_INstantaneous 3D Drifting snow sublimation flux' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,XSNWSUBL3D(:,:,:)) - ! - ZWORK21(:,:) = 0. - DO JK = IKB,IKE - ZWORK21(:,:) = ZWORK21(:,:)+XSNWSUBL3D(:,:,JK) * & - (XZZ(:,:,JK+1)-XZZ(:,:,JK))/XRHOLW*3600*24 +! Aerosol +IF ((LCHEMDIAG).AND.(LORILAM).AND.(LUSECHEM)) THEN + DO JSV = NSV_AERBEG, NSV_AEREND + TZFIELD = TSVLIST(JSV) + TZFIELD%CUNITS = 'ppb' + WRITE(TZFIELD%CCOMMENT,'(A6,A4,I3.3)')'X_Y_Z_','AERO',JSV + CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)*1.E9) END DO - ZWORK21(:,:) = ZWORK21(:,:)*1000. ! vapor water in mm unit - ! - TZFIELD%CMNHNAME = 'COL_SNWSUBL' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'mm day-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Column Sublimation Rate (mmSWE/day)' - TZFIELD%NGRID = 4 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 2 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21(:,:)) - ! - IF(.NOT.ALLOCATED(ZBET_SNW)) & - ALLOCATE(ZBET_SNW(SIZE(XSVT,1), SIZE(XSVT,2), SIZE(XSVT,3))) - IF(.NOT.ALLOCATED(ZRG_SNW)) & - ALLOCATE(ZRG_SNW(SIZE(XSVT,1), SIZE(XSVT,2), SIZE(XSVT,3))) - IF(.NOT.ALLOCATED(ZMA_SNW)) & - ALLOCATE(ZMA_SNW(SIZE(XSVT,1), SIZE(XSVT,2), SIZE(XSVT,3),NBLOWSNOW3D)) - ! - CALL PPP2SNOW(XSVT(:,:,:,NSV_SNWBEG:NSV_SNWEND),XRHODREF,& - PBET3D=ZBET_SNW, PRG3D=ZRG_SNW, PM3D=ZMA_SNW) - ! - TZFIELD%CMNHNAME = 'SNWRGA' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'm' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'RG (mean) SNOW' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,ZRG_SNW(:,:,:)) - ! - TZFIELD%CMNHNAME = 'SNWBETA' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'm' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'BETA SNOW' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,ZBET_SNW(:,:,:)) - ! - TZFIELD%CMNHNAME = 'SNWNOA' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'm-3' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'NUM CONC SNOW (#/m3)' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,ZMA_SNW(:,:,:,1)) - ! - TZFIELD%CMNHNAME = 'SNWMASS' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'kg m-3' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'MASS CONC SNOW' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,ZMA_SNW(:,:,:,2)) ! - ZWORK21(:,:) = 0. - DO JK = IKB,IKE - ZWORK21(:,:) = ZWORK21(:,:)+ZMA_SNW(:,:,JK,2) * & - (XZZ(:,:,JK+1)-XZZ(:,:,JK))/XRHOLW - END DO - ZWORK21(:,:) = ZWORK21(:,:)*1000. ! vapor water in mm unit - TZFIELD%CMNHNAME = 'THDS' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'mm' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_THickness of Drifting Snow (mm SWE)' - TZFIELD%NGRID = 4 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 2 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21(:,:)) -END IF -! Lagrangian variables -IF (LTRAJ) THEN - TZFIELD%CSTDNAME = '' - !PW TODO: check units - TZFIELD%CUNITS = '' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + IF (.NOT.(ASSOCIATED(XN3D))) & + ALLOCATE(XN3D(SIZE(XSVT,1),SIZE(XSVT,2),SIZE(XSVT,3),JPMODE)) + IF (.NOT.(ASSOCIATED(XRG3D))) & + ALLOCATE(XRG3D(SIZE(XSVT,1),SIZE(XSVT,2),SIZE(XSVT,3),JPMODE)) + IF (.NOT.(ASSOCIATED(XSIG3D))) & + ALLOCATE(XSIG3D(SIZE(XSVT,1),SIZE(XSVT,2),SIZE(XSVT,3),JPMODE)) ! - DO JSV = NSV_LGBEG,NSV_LGEND - TZFIELD%CMNHNAME = TRIM(CLGNAMES(JSV-NSV_LGBEG+1))//'T' + CALL PPP2AERO(XSVT(:,:,:,NSV_AERBEG:NSV_AEREND), XRHODREF, & + PSIG3D=XSIG3D, PRG3D=XRG3D, PN3D=XN3D, PCTOTA=ZPTOTA) + + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'generic for aerosol modes', & + CSTDNAME = '', & + CDIR = 'XY', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) + + DO JJ=1,JPMODE + WRITE(TZFIELD%CMNHNAME,'(A3,I1)')'RGA',JJ TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A20,I3.3,A4)')'X_Y_Z_','Lagrangian variable ',JSV,' (M)' - CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)) - END DO - ! X coordinate - DO JK=1,IKU - DO JJ=1,IJU - DO JI=1,IIU-1 - ZWORK31(JI,JJ,JK)=0.5*(XXHAT(JI)+XXHAT(JI+1)) - END DO - ZWORK31(IIU,JJ,JK)=2.*ZWORK31(IIU-1,JJ,JK) - ZWORK31(IIU-2,JJ,JK) - END DO - END DO - TZFIELD%CMNHNAME = 'X' - TZFIELD%CLONGNAME = 'X' - TZFIELD%CCOMMENT = 'X_Y_Z_X coordinate' - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) - ! Y coordinate - DO JK=1,IKU - DO JI=1,IIU - DO JJ=1,IJU-1 - ZWORK31(JI,JJ,JK)=0.5*(XYHAT(JJ)+XYHAT(JJ+1)) - END DO - ZWORK31(JI,IJU,JK)=2.*ZWORK31(JI,IJU-1,JK) - ZWORK31(JI,IJU-2,JK) - END DO - END DO - TZFIELD%CMNHNAME = 'Y' - TZFIELD%CLONGNAME = 'Y' - TZFIELD%CCOMMENT = 'X_Y_Z_Y coordinate' - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) -END IF -! linox scalar variables -IF (.NOT.(LUSECHEM .OR. LCHEMDIAG) .AND. LCH_CONV_LINOX) THEN - DO JSV = NSV_LNOXBEG,NSV_LNOXEND - TZFIELD%CMNHNAME = 'LINOXT' - TZFIELD%CSTDNAME = '' + TZFIELD%CUNITS = 'um' + WRITE(TZFIELD%CCOMMENT,'(A21,I1)')'RG (nb) AEROSOL MODE ',JJ + CALL IO_Field_write(TPFILE,TZFIELD,XRG3D(:,:,:,JJ)) + ! + WRITE(TZFIELD%CMNHNAME,'(A4,I1)')'RGAM',JJ TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'ppbv' - TZFIELD%CDIR = 'XY' - WRITE(TZFIELD%CCOMMENT,'(A6,A4,I3.3)')'X_Y_Z_','LNOX',JSV - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)*1.E9) - END DO -END IF -IF (LELECDIAG .AND. CELEC .NE. "NONE") THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_ELECBEG,NSV_ELECEND - TZFIELD%CMNHNAME = TRIM(CELECNAMES(JSV-NSV_ELECBEG+1))//'T' + TZFIELD%CUNITS = 'um' + WRITE(TZFIELD%CCOMMENT,'(A20,I1)')'RG (m) AEROSOL MODE ',JJ + ZWORK31(:,:,:)=XRG3D(:,:,:,JJ) / (EXP(-3.*(LOG(XSIG3D(:,:,:,JJ)))**2)) + CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) + ! + WRITE(TZFIELD%CMNHNAME,'(A3,I1)')'N0A',JJ TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - IF (JSV .GT. NSV_ELECBEG .AND. JSV .LT. NSV_ELECEND) THEN - TZFIELD%CUNITS = 'C m-3' - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV - ELSE - TZFIELD%CUNITS = 'm-3' - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3,A8)')'X_Y_Z_','SVT',JSV,' (nb ions/m3)' + TZFIELD%CUNITS = 'cm-3' + WRITE(TZFIELD%CCOMMENT,'(A16,I1)')'N0 AEROSOL MODE ',JJ + CALL IO_Field_write(TPFILE,TZFIELD,XN3D(:,:,:,JJ)*1.E-6) + ! + WRITE(TZFIELD%CMNHNAME,'(A4,I1)')'SIGA',JJ + TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) + TZFIELD%CUNITS = '1' + WRITE(TZFIELD%CCOMMENT,'(A19,I1)')'SIGMA AEROSOL MODE ',JJ + CALL IO_Field_write(TPFILE,TZFIELD,XSIG3D(:,:,:,JJ)) + ! + WRITE(TZFIELD%CMNHNAME,'(A4,I1)')'MSO4',JJ + TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) + TZFIELD%CUNITS = 'ug m-3' + WRITE(TZFIELD%CCOMMENT,'(A22,I1)')'MASS SO4 AEROSOL MODE ',JJ + CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_SO4,JJ)) + ! + WRITE(TZFIELD%CMNHNAME,'(A4,I1)')'MNO3',JJ + TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) + TZFIELD%CUNITS = 'ug m-3' + WRITE(TZFIELD%CCOMMENT,'(A22,I1)')'MASS NO3 AEROSOL MODE ',JJ + CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_NO3,JJ)) + ! + WRITE(TZFIELD%CMNHNAME,'(A4,I1)')'MNH3',JJ + TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) + TZFIELD%CUNITS = 'ug m-3' + WRITE(TZFIELD%CCOMMENT,'(A22,I1)')'MASS NH3 AEROSOL MODE ',JJ + CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_NH3,JJ)) + ! + WRITE(TZFIELD%CMNHNAME,'(A4,I1)')'MH2O',JJ + TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) + TZFIELD%CUNITS = 'ug m-3' + WRITE(TZFIELD%CCOMMENT,'(A22,I1)')'MASS H2O AEROSOL MODE ',JJ + CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_H2O,JJ)) + ! + IF (NSOA .EQ. 10) THEN + WRITE(TZFIELD%CMNHNAME,'(A5,I1)')'MSOA1',JJ + TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) + TZFIELD%CUNITS = 'ug m-3' + WRITE(TZFIELD%CCOMMENT,'(A23,I1)')'MASS SOA1 AEROSOL MODE ',JJ + CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_SOA1,JJ)) + ! + WRITE(TZFIELD%CMNHNAME,'(A5,I1)')'MSOA2',JJ + TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) + TZFIELD%CUNITS = 'ug m-3' + WRITE(TZFIELD%CCOMMENT,'(A23,I1)')'MASS SOA2 AEROSOL MODE ',JJ + CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_SOA2,JJ)) + ! + WRITE(TZFIELD%CMNHNAME,'(A5,I1)')'MSOA3',JJ + TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) + TZFIELD%CUNITS = 'ug m-3' + WRITE(TZFIELD%CCOMMENT,'(A23,I1)')'MASS SOA3 AEROSOL MODE ',JJ + CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_SOA3,JJ)) + ! + WRITE(TZFIELD%CMNHNAME,'(A5,I1)')'MSOA4',JJ + TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) + TZFIELD%CUNITS = 'ug m-3' + WRITE(TZFIELD%CCOMMENT,'(A23,I1)')'MASS SOA4 AEROSOL MODE ',JJ + CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_SOA4,JJ)) + ! + WRITE(TZFIELD%CMNHNAME,'(A5,I1)')'MSOA5',JJ + TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) + TZFIELD%CUNITS = 'ug m-3' + WRITE(TZFIELD%CCOMMENT,'(A23,I1)')'MASS SOA5 AEROSOL MODE ',JJ + CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_SOA5,JJ)) + ! + WRITE(TZFIELD%CMNHNAME,'(A5,I1)')'MSOA6',JJ + TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) + TZFIELD%CUNITS = 'ug m-3' + WRITE(TZFIELD%CCOMMENT,'(A23,I1)')'MASS SOA6 AEROSOL MODE ',JJ + CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_SOA6,JJ)) + ! + WRITE(TZFIELD%CMNHNAME,'(A5,I1)')'MSOA7',JJ + TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) + TZFIELD%CUNITS = 'ug m-3' + WRITE(TZFIELD%CCOMMENT,'(A23,I1)')'MASS SOA7 AEROSOL MODE ',JJ + CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_SOA7,JJ)) + ! + WRITE(TZFIELD%CMNHNAME,'(A5,I1)')'MSOA8',JJ + TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) + TZFIELD%CUNITS = 'ug m-3' + WRITE(TZFIELD%CCOMMENT,'(A23,I1)')'MASS SOA8 AEROSOL MODE ',JJ + CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_SOA8,JJ)) + ! + WRITE(TZFIELD%CMNHNAME,'(A5,I1)')'MSOA9',JJ + TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) + TZFIELD%CUNITS = 'ug m-3' + WRITE(TZFIELD%CCOMMENT,'(A23,I1)')'MASS SOA9 AEROSOL MODE ',JJ + CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_SOA9,JJ)) + ! + WRITE(TZFIELD%CMNHNAME,'(A6,I1)')'MSOA10',JJ + TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) + TZFIELD%CUNITS = 'ug m-3' + WRITE(TZFIELD%CCOMMENT,'(A24,I1)')'MASS SOA10 AEROSOL MODE ',JJ + CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_SOA10,JJ)) END IF - ZWORK31(:,:,:)=XSVT(:,:,:,JSV) * XRHODREF(:,:,:) ! C/kg --> C/m3 - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) - END DO + ! + WRITE(TZFIELD%CMNHNAME,'(A3,I1)')'MOC',JJ + TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) + TZFIELD%CUNITS = 'ug m-3' + WRITE(TZFIELD%CCOMMENT,'(A21,I1)')'MASS OC AEROSOL MODE ',JJ + CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_OC,JJ)) + ! + WRITE(TZFIELD%CMNHNAME,'(A3,I1)')'MBC',JJ + TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) + TZFIELD%CUNITS = 'ug m-3' + WRITE(TZFIELD%CCOMMENT,'(A21,I1)')'MASS BC AEROSOL MODE ',JJ + CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_BC,JJ)) + ENDDO END IF -! Sea Salt variables -IF (LSALT) THEN - IF(.NOT.ALLOCATED(ZSIG_SLT)) & - ALLOCATE(ZSIG_SLT(SIZE(XSVT,1), SIZE(XSVT,2), SIZE(XSVT,3), NMODE_SLT)) - IF(.NOT.ALLOCATED(ZRG_SLT)) & - ALLOCATE(ZRG_SLT(SIZE(XSVT,1), SIZE(XSVT,2), SIZE(XSVT,3), NMODE_SLT)) - IF(.NOT.ALLOCATED(ZN0_SLT)) & - ALLOCATE(ZN0_SLT(SIZE(XSVT,1), SIZE(XSVT,2), SIZE(XSVT,3), NMODE_SLT)) - ! - TZFIELD%CSTDNAME = '' - TZFIELD%CDIR = 'XY' - TZFIELD%CUNITS = 'ppbv' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. +! Dust variables +IF (LDUST) THEN + IF(.NOT.ALLOCATED(ZSIG_DST)) & + ALLOCATE(ZSIG_DST(SIZE(XSVT,1), SIZE(XSVT,2), SIZE(XSVT,3), NMODE_DST)) + IF(.NOT.ALLOCATED(ZRG_DST)) & + ALLOCATE(ZRG_DST(SIZE(XSVT,1), SIZE(XSVT,2), SIZE(XSVT,3), NMODE_DST)) + IF(.NOT.ALLOCATED(ZN0_DST)) & + ALLOCATE(ZN0_DST(SIZE(XSVT,1), SIZE(XSVT,2), SIZE(XSVT,3), NMODE_DST)) ! - DO JSV = NSV_SLTBEG,NSV_SLTEND - TZFIELD%CMNHNAME = TRIM(UPCASE(CSALTNAMES(JSV-NSV_SLTBEG+1)))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A4,I3.3)')'X_Y_Z_','SALT',JSV + DO JSV = NSV_DSTBEG, NSV_DSTEND + TZFIELD = TSVLIST(JSV) + TZFIELD%CUNITS = 'ppb' + WRITE(TZFIELD%CCOMMENT,'(A6,A4,I3.3)')'X_Y_Z_','DUST',JSV CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)*1.E9) END DO ! - CALL PPP2SALT(XSVT(:,:,:,NSV_SLTBEG:NSV_SLTEND),XRHODREF,& - PSIG3D=ZSIG_SLT, PRG3D=ZRG_SLT, PN3D=ZN0_SLT) - ! - TZFIELD%CSTDNAME = '' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JJ=1,NMODE_SLT - WRITE(TZFIELD%CMNHNAME,'(A6,I1)')'SLTRGA',JJ + CALL PPP2DUST(XSVT(:,:,:,NSV_DSTBEG:NSV_DSTEND),XRHODREF,& + PSIG3D=ZSIG_DST, PRG3D=ZRG_DST, PN3D=ZN0_DST) + + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'generic for dust modes', & + CSTDNAME = '', & + CDIR = 'XY', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) + + DO JJ=1,NMODE_DST + WRITE(TZFIELD%CMNHNAME,'(A6,I1)')'DSTRGA',JJ TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) TZFIELD%CUNITS = 'um' - WRITE(TZFIELD%CCOMMENT,'(A18,I1)')'RG (nb) SALT MODE ',JJ - CALL IO_Field_write(TPFILE,TZFIELD,ZRG_SLT(:,:,:,JJ)) + WRITE(TZFIELD%CCOMMENT,'(A18,I1)')'RG (nb) DUST MODE ',JJ + CALL IO_Field_write(TPFILE,TZFIELD,ZRG_DST(:,:,:,JJ)) ! - WRITE(TZFIELD%CMNHNAME,'(A7,I1)')'SLTRGAM',JJ + WRITE(TZFIELD%CMNHNAME,'(A7,I1)')'DSTRGAM',JJ TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) TZFIELD%CUNITS = 'um' - WRITE(TZFIELD%CCOMMENT,'(A17,I1)')'RG (m) SALT MODE ',JJ - ZWORK31(:,:,:)=ZRG_SLT(:,:,:,JJ) / (EXP(-3.*(LOG(ZSIG_SLT(:,:,:,JJ)))**2)) + WRITE(TZFIELD%CCOMMENT,'(A17,I1)')'RG (m) DUST MODE ',JJ + ZWORK31(:,:,:)=ZRG_DST(:,:,:,JJ) / (EXP(-3.*(LOG(ZSIG_DST(:,:,:,JJ)))**2)) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) ! - WRITE(TZFIELD%CMNHNAME,'(A6,I1)')'SLTN0A',JJ + WRITE(TZFIELD%CMNHNAME,'(A6,I1)')'DSTN0A',JJ TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) TZFIELD%CUNITS = 'm-3' - WRITE(TZFIELD%CCOMMENT,'(A13,I1)')'N0 SALT MODE ',JJ - CALL IO_Field_write(TPFILE,TZFIELD,ZN0_SLT(:,:,:,JJ)) + WRITE(TZFIELD%CCOMMENT,'(A13,I1)')'N0 DUST MODE ',JJ + CALL IO_Field_write(TPFILE,TZFIELD,ZN0_DST(:,:,:,JJ)) ! - WRITE(TZFIELD%CMNHNAME,'(A7,I1)')'SLTSIGA',JJ + WRITE(TZFIELD%CMNHNAME,'(A7,I1)')'DSTSIGA',JJ TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) TZFIELD%CUNITS = '1' - WRITE(TZFIELD%CCOMMENT,'(A16,I1)')'SIGMA SALT MODE ',JJ - CALL IO_Field_write(TPFILE,TZFIELD,ZSIG_SLT(:,:,:,JJ)) - !SALT MASS CONCENTRATION - WRITE(TZFIELD%CMNHNAME,'(A4,I1)')'SLTMSS',JJ + WRITE(TZFIELD%CCOMMENT,'(A16,I1)')'SIGMA DUST MODE ',JJ + CALL IO_Field_write(TPFILE,TZFIELD,ZSIG_DST(:,:,:,JJ)) + !DUST MASS CONCENTRATION + WRITE(TZFIELD%CMNHNAME,'(A4,I1)')'DSTMSS',JJ TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) TZFIELD%CUNITS = 'ug m-3' WRITE(TZFIELD%CCOMMENT,'(A14,I1)')'MASSCONC MODE ',JJ - ZWORK31(:,:,:)= ZN0_SLT(:,:,:,JJ)*4./3.*3.14*2500.*1e9 & !kg-->ug - * (ZRG_SLT(:,:,:,JJ)**3)*1.d-18 & !um-->m - * exp(4.5*log(ZSIG_SLT(:,:,:,JJ))*log(ZSIG_SLT(:,:,:,JJ))) + ZWORK31(:,:,:)= ZN0_DST(:,:,:,JJ)*4./3.*3.14*2500.*1e9 & !kg-->ug + * (ZRG_DST(:,:,:,JJ)**3)*1.d-18 & !um-->m + * exp(4.5*log(ZSIG_DST(:,:,:,JJ))*log(ZSIG_DST(:,:,:,JJ))) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) - !SALT BURDEN (g/m2) + !DUST BURDEN (g/m2) ZWORK21(:,:)=0.0 DO JK=IKB,IKE ZWORK31(:,:,JK) = ZWORK31(:,:,JK) *(XZZ(:,:,JK+1)-XZZ(:,:,JK)) & @@ -1606,7 +1560,7 @@ IF (LSALT) THEN ENDDO ENDDO ENDDO - WRITE(TZFIELD%CMNHNAME,'(A7,I1)')'SLTBRDN',JJ + WRITE(TZFIELD%CMNHNAME,'(A7,I1)')'DSTBRDN',JJ TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) TZFIELD%CUNITS = 'g m-2' WRITE(TZFIELD%CCOMMENT,'(A6,I1)')'BURDEN',JJ @@ -1616,33 +1570,33 @@ IF (LSALT) THEN TZFIELD%NDIMS = 3 ENDDO END IF -IF (LSALT.AND.LDEPOS_SLT(IMI)) THEN - ! - ZSSLTDEP=XSVT(:,:,:,NSV_SLTDEPBEG:NSV_SLTDEPEND) +IF (LDUST.AND.LDEPOS_DST(IMI)) THEN + DO JSV = NSV_DSTBEG, NSV_DSTEND + TZFIELD = TSVLIST(JSV) + TZFIELD%CUNITS = 'ppb' + WRITE(TZFIELD%CCOMMENT,'(A,I3.3)') 'X_Y_Z_DUSTDEP', JSV + CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)*1.E9) + END DO ! - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppbv' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + ZSDSTDEP => XSVT(:,:,:,NSV_DSTDEPBEG:NSV_DSTDEPEND) ! - DO JSV = 1,NSV_SLTDEP - TZFIELD%CMNHNAME = TRIM(UPCASE(CDESLTNAMES(JSV)))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A4,I3.3)')'X_Y_Z_','SALTDEP',JSV - CALL IO_Field_write(TPFILE,TZFIELD,ZSSLTDEP(:,:,:,JSV)*1.E9) - END DO + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'generic for dustdep modes', & + CSTDNAME = '', & + CDIR = 'XY', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ! - DO JJ=1,NMODE_SLT + DO JJ=1,NMODE_DST ! FOR CLOUDS - WRITE(TZFIELD%CMNHNAME,'(A9,I1)')'SLTDEPN0A',JJ + WRITE(TZFIELD%CMNHNAME,'(A9,I1)')'DSTDEPN0A',JJ TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) WRITE(TZFIELD%CCOMMENT,'(A16,I1)')'N0 DUSTDEP MODE ',JJ TZFIELD%CUNITS = 'm-3' ! CLOUD: CALCULATE MOMENT 3 FROM TOTAL AEROSOL MASS - ZWORK31(:,:,:) = ZSSLTDEP(:,:,:,JJ) &!==>molec_{aer}/molec_{air} + ZWORK31(:,:,:) = ZSDSTDEP(:,:,:,JJ) &!==>molec_{aer}/molec_{air} *(XMOLARWEIGHT_DUST/XMD) &!==>kg_{aer}/kg_{air} *XRHODREF(:,:,:) &!==>kg_{aer}/m3_{air} /XDENSITY_DUST &!==>m3_{aer}/m3_{air} @@ -1650,45 +1604,45 @@ IF (LSALT.AND.LDEPOS_SLT(IMI)) THEN /(XPI*4./3.) !==>um3_{aer}/m3_{air} !==>volume 3rd moment !CLOUD: CALCULATE MOMENT 0 FROM DISPERSION AND MEAN RADIUS - ZWORK31(:,:,:) = ZWORK31(:,:,:)/ & - ((ZRG_SLT(:,:,:,JJ)**3)* & - EXP(4.5 * LOG(ZSIG_SLT(:,:,:,JJ))**2)) + ZWORK31(:,:,:)= ZWORK31(:,:,:)/ & + ((ZRG_DST(:,:,:,JJ)**3)* & + EXP(4.5 * LOG(ZSIG_DST(:,:,:,JJ))**2)) !CLOUD: RETURN TO CONCENTRATION #/m3 ZWORK31(:,:,:)= ZWORK31(:,:,:) * XMD/ & - (XAVOGADRO*XRHODREF(:,:,:)) + (XAVOGADRO*XRHODREF(:,:,:)) !CLOUD: Get number concentration (#/molec_{air}==>#/m3) - ZWORK31(:,:,:)= & - ZWORK31(:,:,:) & !#/molec_{air} - * XAVOGADRO & !==>#/mole - / XMD & !==>#/kg_{air} - * XRHODREF(:,:,:) !==>#/m3 + ZWORK31(:,:,:)= & + ZWORK31(:,:,:) & !#/molec_{air} + * XAVOGADRO & !==>#/mole + / XMD & !==>#/kg_{air} + * XRHODREF(:,:,:) !==>#/m3 CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) ! CLOUD: DUST MASS CONCENTRATION - WRITE(TZFIELD%CMNHNAME,'(A9,I1)')'SLTDEPMSS',JJ + WRITE(TZFIELD%CMNHNAME,'(A9,I1)')'DSTDEPMSS',JJ TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) WRITE(TZFIELD%CCOMMENT,'(A17,I1)')'DEPMASSCONC MODE ',JJ TZFIELD%CUNITS = 'ug m-3' ZWORK31(:,:,:)= ZWORK31(:,:,:)*4./3.*3.14*2500.*1e9 & !kg-->ug - * (ZRG_SLT(:,:,:,JJ)**3)*1.d-18 & !um-->m - * exp(4.5*log(ZSIG_SLT(:,:,:,JJ))*log(ZSIG_SLT(:,:,:,JJ))) + * (ZRG_DST(:,:,:,JJ)**3)*1.d-18 & !um-->m + * exp(4.5*log(ZSIG_DST(:,:,:,JJ))*log(ZSIG_DST(:,:,:,JJ))) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) ! FOR RAIN DROPS - WRITE(TZFIELD%CMNHNAME,'(A9,I1)')'SLTDEPN0A',JJ+NMODE_SLT + WRITE(TZFIELD%CMNHNAME,'(A9,I1)')'DSTDEPN0A',JJ+NMODE_DST TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A16,I1)')'N0 DUSTDEP MODE ',JJ+NMODE_SLT + WRITE(TZFIELD%CCOMMENT,'(A16,I1)')'N0 DUSTDEP MODE ',JJ+NMODE_DST TZFIELD%CUNITS = 'm-3' ! RAIN: CALCULATE MOMENT 3 FROM TOTAL AEROSOL MASS - ZWORK31(:,:,:) = ZSSLTDEP(:,:,:,JJ+NMODE_SLT) &!==>molec_{aer}/molec_{air} - *(XMOLARWEIGHT_DUST/XMD) &!==>kg_{aer}/kg_{air} - *XRHODREF(:,:,:) &!==>kg_{aer}/m3_{air} - /XDENSITY_DUST &!==>m3_{aer}/m3_{air} - *XM3TOUM3 &!==>um3_{aer}/m3_{air} - /(XPI*4./3.) !==>um3_{aer}/m3_{air} - !==>volume 3rd moment + ZWORK31(:,:,:)=ZSDSTDEP(:,:,:,JJ+NMODE_DST) &!==>molec_{aer}/molec_{air} + *(XMOLARWEIGHT_DUST/XMD) &!==>kg_{aer}/kg_{air} + *XRHODREF(:,:,:) &!==>kg_{aer}/m3_{air} + *(1.d0/XDENSITY_DUST) &!==>m3_{aer}/m3_{air} + *XM3TOUM3 &!==>um3_{aer}/m3_{air} + /(XPI*4./3.) !==>um3_{aer}/m3_{air} + !==>volume 3rd moment !RAIN: CALCULATE MOMENT 0 FROM DISPERSION AND MEAN RADIUS - ZWORK31(:,:,:)= ZWORK31(:,:,:)/ & - ((ZRG_SLT(:,:,:,JJ)**3)* & - EXP(4.5 * LOG(ZSIG_SLT(:,:,:,JJ))**2)) + ZWORK31(:,:,:)= ZWORK31(:,:,:)/ & + ((ZRG_DST(:,:,:,JJ)**3)* & + EXP(4.5 * LOG(ZSIG_DST(:,:,:,JJ))**2)) !RAIN: RETURN TO CONCENTRATION #/m3 ZWORK31(:,:,:)= ZWORK31(:,:,:) * XMD/ & (XAVOGADRO*XRHODREF(:,:,:)) @@ -1700,78 +1654,82 @@ IF (LSALT.AND.LDEPOS_SLT(IMI)) THEN * XRHODREF(:,:,:) !==>#/m3 CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) ! RAIN: DUST MASS CONCENTRATION - WRITE(TZFIELD%CMNHNAME,'(A9,I1)')'SLTDEPMSS',JJ+NMODE_SLT + WRITE(TZFIELD%CMNHNAME,'(A9,I1)')'DSTDEPMSS',JJ+NMODE_DST TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A17,I1)')'DEPMASSCONC MODE ',JJ+NMODE_SLT + WRITE(TZFIELD%CCOMMENT,'(A17,I1)')'DEPMASSCONC MODE ',JJ+NMODE_DST TZFIELD%CUNITS = 'ug m-3' ZWORK31(:,:,:)= ZWORK31(:,:,:)*4./3.*3.14*2500.*1e9 & !kg-->ug - * (ZRG_SLT(:,:,:,JJ)**3)*1.d-18 & !um-->m - * exp(4.5*log(ZSIG_SLT(:,:,:,JJ))*log(ZSIG_SLT(:,:,:,JJ))) + * (ZRG_DST(:,:,:,JJ)**3)*1.d-18 & !um-->m + * exp(4.5*log(ZSIG_DST(:,:,:,JJ))*log(ZSIG_DST(:,:,:,JJ))) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) END DO + + ZSDSTDEP => NULL() ! END IF -! Dust variables -IF (LDUST) THEN - IF(.NOT.ALLOCATED(ZSIG_DST)) & - ALLOCATE(ZSIG_DST(SIZE(XSVT,1), SIZE(XSVT,2), SIZE(XSVT,3), NMODE_DST)) - IF(.NOT.ALLOCATED(ZRG_DST)) & - ALLOCATE(ZRG_DST(SIZE(XSVT,1), SIZE(XSVT,2), SIZE(XSVT,3), NMODE_DST)) - IF(.NOT.ALLOCATED(ZN0_DST)) & - ALLOCATE(ZN0_DST(SIZE(XSVT,1), SIZE(XSVT,2), SIZE(XSVT,3), NMODE_DST)) - ! - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppbv' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. +! Sea Salt variables +IF (LSALT) THEN + IF(.NOT.ALLOCATED(ZSIG_SLT)) & + ALLOCATE(ZSIG_SLT(SIZE(XSVT,1), SIZE(XSVT,2), SIZE(XSVT,3), NMODE_SLT)) + IF(.NOT.ALLOCATED(ZRG_SLT)) & + ALLOCATE(ZRG_SLT(SIZE(XSVT,1), SIZE(XSVT,2), SIZE(XSVT,3), NMODE_SLT)) + IF(.NOT.ALLOCATED(ZN0_SLT)) & + ALLOCATE(ZN0_SLT(SIZE(XSVT,1), SIZE(XSVT,2), SIZE(XSVT,3), NMODE_SLT)) ! - DO JSV = NSV_DSTBEG,NSV_DSTEND - TZFIELD%CMNHNAME = TRIM(UPCASE(CDUSTNAMES(JSV-NSV_DSTBEG+1)))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A4,I3.3)')'X_Y_Z_','DUST',JSV + DO JSV = NSV_SLTBEG, NSV_SLTEND + TZFIELD = TSVLIST(JSV) + TZFIELD%CUNITS = 'ppb' + WRITE(TZFIELD%CCOMMENT,'(A,I3.3)') 'X_Y_Z_SALT', JSV CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)*1.E9) END DO ! - CALL PPP2DUST(XSVT(:,:,:,NSV_DSTBEG:NSV_DSTEND),XRHODREF,& - PSIG3D=ZSIG_DST, PRG3D=ZRG_DST, PN3D=ZN0_DST) - DO JJ=1,NMODE_DST - WRITE(TZFIELD%CMNHNAME,'(A6,I1)')'DSTRGA',JJ + CALL PPP2SALT(XSVT(:,:,:,NSV_SLTBEG:NSV_SLTEND),XRHODREF,& + PSIG3D=ZSIG_SLT, PRG3D=ZRG_SLT, PN3D=ZN0_SLT) + ! + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'generic for salt modes', & + CSTDNAME = '', & + CDIR = 'XY', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) + ! + DO JJ=1,NMODE_SLT + WRITE(TZFIELD%CMNHNAME,'(A6,I1)')'SLTRGA',JJ TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) TZFIELD%CUNITS = 'um' - WRITE(TZFIELD%CCOMMENT,'(A18,I1)')'RG (nb) DUST MODE ',JJ - CALL IO_Field_write(TPFILE,TZFIELD,ZRG_DST(:,:,:,JJ)) + WRITE(TZFIELD%CCOMMENT,'(A18,I1)')'RG (nb) SALT MODE ',JJ + CALL IO_Field_write(TPFILE,TZFIELD,ZRG_SLT(:,:,:,JJ)) ! - WRITE(TZFIELD%CMNHNAME,'(A7,I1)')'DSTRGAM',JJ + WRITE(TZFIELD%CMNHNAME,'(A7,I1)')'SLTRGAM',JJ TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) TZFIELD%CUNITS = 'um' - WRITE(TZFIELD%CCOMMENT,'(A17,I1)')'RG (m) DUST MODE ',JJ - ZWORK31(:,:,:)=ZRG_DST(:,:,:,JJ) / (EXP(-3.*(LOG(ZSIG_DST(:,:,:,JJ)))**2)) + WRITE(TZFIELD%CCOMMENT,'(A17,I1)')'RG (m) SALT MODE ',JJ + ZWORK31(:,:,:)=ZRG_SLT(:,:,:,JJ) / (EXP(-3.*(LOG(ZSIG_SLT(:,:,:,JJ)))**2)) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) ! - WRITE(TZFIELD%CMNHNAME,'(A6,I1)')'DSTN0A',JJ + WRITE(TZFIELD%CMNHNAME,'(A6,I1)')'SLTN0A',JJ TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) TZFIELD%CUNITS = 'm-3' - WRITE(TZFIELD%CCOMMENT,'(A13,I1)')'N0 DUST MODE ',JJ - CALL IO_Field_write(TPFILE,TZFIELD,ZN0_DST(:,:,:,JJ)) + WRITE(TZFIELD%CCOMMENT,'(A13,I1)')'N0 SALT MODE ',JJ + CALL IO_Field_write(TPFILE,TZFIELD,ZN0_SLT(:,:,:,JJ)) ! - WRITE(TZFIELD%CMNHNAME,'(A7,I1)')'DSTSIGA',JJ + WRITE(TZFIELD%CMNHNAME,'(A7,I1)')'SLTSIGA',JJ TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) TZFIELD%CUNITS = '1' - WRITE(TZFIELD%CCOMMENT,'(A16,I1)')'SIGMA DUST MODE ',JJ - CALL IO_Field_write(TPFILE,TZFIELD,ZSIG_DST(:,:,:,JJ)) - !DUST MASS CONCENTRATION - WRITE(TZFIELD%CMNHNAME,'(A4,I1)')'DSTMSS',JJ + WRITE(TZFIELD%CCOMMENT,'(A16,I1)')'SIGMA SALT MODE ',JJ + CALL IO_Field_write(TPFILE,TZFIELD,ZSIG_SLT(:,:,:,JJ)) + !SALT MASS CONCENTRATION + WRITE(TZFIELD%CMNHNAME,'(A4,I1)')'SLTMSS',JJ TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) TZFIELD%CUNITS = 'ug m-3' WRITE(TZFIELD%CCOMMENT,'(A14,I1)')'MASSCONC MODE ',JJ - ZWORK31(:,:,:)= ZN0_DST(:,:,:,JJ)*4./3.*3.14*2500.*1e9 & !kg-->ug - * (ZRG_DST(:,:,:,JJ)**3)*1.d-18 & !um-->m - * exp(4.5*log(ZSIG_DST(:,:,:,JJ))*log(ZSIG_DST(:,:,:,JJ))) + ZWORK31(:,:,:)= ZN0_SLT(:,:,:,JJ)*4./3.*3.14*2500.*1e9 & !kg-->ug + * (ZRG_SLT(:,:,:,JJ)**3)*1.d-18 & !um-->m + * exp(4.5*log(ZSIG_SLT(:,:,:,JJ))*log(ZSIG_SLT(:,:,:,JJ))) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) - !DUST BURDEN (g/m2) + !SALT BURDEN (g/m2) ZWORK21(:,:)=0.0 DO JK=IKB,IKE ZWORK31(:,:,JK) = ZWORK31(:,:,JK) *(XZZ(:,:,JK+1)-XZZ(:,:,JK)) & @@ -1784,7 +1742,7 @@ IF (LDUST) THEN ENDDO ENDDO ENDDO - WRITE(TZFIELD%CMNHNAME,'(A7,I1)')'DSTBRDN',JJ + WRITE(TZFIELD%CMNHNAME,'(A7,I1)')'SLTBRDN',JJ TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) TZFIELD%CUNITS = 'g m-2' WRITE(TZFIELD%CCOMMENT,'(A6,I1)')'BURDEN',JJ @@ -1794,33 +1752,34 @@ IF (LDUST) THEN TZFIELD%NDIMS = 3 ENDDO END IF -IF (LDUST.AND.LDEPOS_DST(IMI)) THEN +IF (LSALT.AND.LDEPOS_SLT(IMI)) THEN ! - ZSDSTDEP=XSVT(:,:,:,NSV_DSTDEPBEG:NSV_DSTDEPEND) + DO JSV = NSV_SLTDEPBEG, NSV_SLTDEPEND + TZFIELD = TSVLIST(JSV) + TZFIELD%CUNITS = 'ppb' + WRITE(TZFIELD%CCOMMENT,'(A,I3.3)') 'X_Y_Z_SALTDEP', JSV + CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)*1.E9) + END DO ! - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppbv' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + ZSSLTDEP => XSVT(:,:,:,NSV_SLTDEPBEG:NSV_SLTDEPEND) ! - DO JSV = 1,NSV_DSTDEP - TZFIELD%CMNHNAME = TRIM(UPCASE(CDEDSTNAMES(JSV)))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A4,I3.3)')'X_Y_Z_','DUSTDEP',JSV - CALL IO_Field_write(TPFILE,TZFIELD,ZSDSTDEP(:,:,:,JSV)*1.E9) - END DO + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'generic for saltdep modes', & + CSTDNAME = '', & + CDIR = 'XY', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ! - DO JJ=1,NMODE_DST + DO JJ=1,NMODE_SLT ! FOR CLOUDS - WRITE(TZFIELD%CMNHNAME,'(A9,I1)')'DSTDEPN0A',JJ + WRITE(TZFIELD%CMNHNAME,'(A9,I1)')'SLTDEPN0A',JJ TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) WRITE(TZFIELD%CCOMMENT,'(A16,I1)')'N0 DUSTDEP MODE ',JJ TZFIELD%CUNITS = 'm-3' ! CLOUD: CALCULATE MOMENT 3 FROM TOTAL AEROSOL MASS - ZWORK31(:,:,:) = ZSDSTDEP(:,:,:,JJ) &!==>molec_{aer}/molec_{air} + ZWORK31(:,:,:) = ZSSLTDEP(:,:,:,JJ) &!==>molec_{aer}/molec_{air} *(XMOLARWEIGHT_DUST/XMD) &!==>kg_{aer}/kg_{air} *XRHODREF(:,:,:) &!==>kg_{aer}/m3_{air} /XDENSITY_DUST &!==>m3_{aer}/m3_{air} @@ -1828,45 +1787,45 @@ IF (LDUST.AND.LDEPOS_DST(IMI)) THEN /(XPI*4./3.) !==>um3_{aer}/m3_{air} !==>volume 3rd moment !CLOUD: CALCULATE MOMENT 0 FROM DISPERSION AND MEAN RADIUS - ZWORK31(:,:,:)= ZWORK31(:,:,:)/ & - ((ZRG_DST(:,:,:,JJ)**3)* & - EXP(4.5 * LOG(ZSIG_DST(:,:,:,JJ))**2)) + ZWORK31(:,:,:) = ZWORK31(:,:,:)/ & + ((ZRG_SLT(:,:,:,JJ)**3)* & + EXP(4.5 * LOG(ZSIG_SLT(:,:,:,JJ))**2)) !CLOUD: RETURN TO CONCENTRATION #/m3 ZWORK31(:,:,:)= ZWORK31(:,:,:) * XMD/ & - (XAVOGADRO*XRHODREF(:,:,:)) + (XAVOGADRO*XRHODREF(:,:,:)) !CLOUD: Get number concentration (#/molec_{air}==>#/m3) - ZWORK31(:,:,:)= & - ZWORK31(:,:,:) & !#/molec_{air} - * XAVOGADRO & !==>#/mole - / XMD & !==>#/kg_{air} - * XRHODREF(:,:,:) !==>#/m3 + ZWORK31(:,:,:)= & + ZWORK31(:,:,:) & !#/molec_{air} + * XAVOGADRO & !==>#/mole + / XMD & !==>#/kg_{air} + * XRHODREF(:,:,:) !==>#/m3 CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) ! CLOUD: DUST MASS CONCENTRATION - WRITE(TZFIELD%CMNHNAME,'(A9,I1)')'DSTDEPMSS',JJ + WRITE(TZFIELD%CMNHNAME,'(A9,I1)')'SLTDEPMSS',JJ TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) WRITE(TZFIELD%CCOMMENT,'(A17,I1)')'DEPMASSCONC MODE ',JJ TZFIELD%CUNITS = 'ug m-3' ZWORK31(:,:,:)= ZWORK31(:,:,:)*4./3.*3.14*2500.*1e9 & !kg-->ug - * (ZRG_DST(:,:,:,JJ)**3)*1.d-18 & !um-->m - * exp(4.5*log(ZSIG_DST(:,:,:,JJ))*log(ZSIG_DST(:,:,:,JJ))) + * (ZRG_SLT(:,:,:,JJ)**3)*1.d-18 & !um-->m + * exp(4.5*log(ZSIG_SLT(:,:,:,JJ))*log(ZSIG_SLT(:,:,:,JJ))) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) ! FOR RAIN DROPS - WRITE(TZFIELD%CMNHNAME,'(A9,I1)')'DSTDEPN0A',JJ+NMODE_DST + WRITE(TZFIELD%CMNHNAME,'(A9,I1)')'SLTDEPN0A',JJ+NMODE_SLT TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A16,I1)')'N0 DUSTDEP MODE ',JJ+NMODE_DST + WRITE(TZFIELD%CCOMMENT,'(A16,I1)')'N0 DUSTDEP MODE ',JJ+NMODE_SLT TZFIELD%CUNITS = 'm-3' ! RAIN: CALCULATE MOMENT 3 FROM TOTAL AEROSOL MASS - ZWORK31(:,:,:)=ZSDSTDEP(:,:,:,JJ+NMODE_DST) &!==>molec_{aer}/molec_{air} - *(XMOLARWEIGHT_DUST/XMD) &!==>kg_{aer}/kg_{air} - *XRHODREF(:,:,:) &!==>kg_{aer}/m3_{air} - *(1.d0/XDENSITY_DUST) &!==>m3_{aer}/m3_{air} - *XM3TOUM3 &!==>um3_{aer}/m3_{air} - /(XPI*4./3.) !==>um3_{aer}/m3_{air} - !==>volume 3rd moment + ZWORK31(:,:,:) = ZSSLTDEP(:,:,:,JJ+NMODE_SLT) &!==>molec_{aer}/molec_{air} + *(XMOLARWEIGHT_DUST/XMD) &!==>kg_{aer}/kg_{air} + *XRHODREF(:,:,:) &!==>kg_{aer}/m3_{air} + /XDENSITY_DUST &!==>m3_{aer}/m3_{air} + *XM3TOUM3 &!==>um3_{aer}/m3_{air} + /(XPI*4./3.) !==>um3_{aer}/m3_{air} + !==>volume 3rd moment !RAIN: CALCULATE MOMENT 0 FROM DISPERSION AND MEAN RADIUS - ZWORK31(:,:,:)= ZWORK31(:,:,:)/ & - ((ZRG_DST(:,:,:,JJ)**3)* & - EXP(4.5 * LOG(ZSIG_DST(:,:,:,JJ))**2)) + ZWORK31(:,:,:)= ZWORK31(:,:,:)/ & + ((ZRG_SLT(:,:,:,JJ)**3)* & + EXP(4.5 * LOG(ZSIG_SLT(:,:,:,JJ))**2)) !RAIN: RETURN TO CONCENTRATION #/m3 ZWORK31(:,:,:)= ZWORK31(:,:,:) * XMD/ & (XAVOGADRO*XRHODREF(:,:,:)) @@ -1878,167 +1837,146 @@ IF (LDUST.AND.LDEPOS_DST(IMI)) THEN * XRHODREF(:,:,:) !==>#/m3 CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) ! RAIN: DUST MASS CONCENTRATION - WRITE(TZFIELD%CMNHNAME,'(A9,I1)')'DSTDEPMSS',JJ+NMODE_DST + WRITE(TZFIELD%CMNHNAME,'(A9,I1)')'SLTDEPMSS',JJ+NMODE_SLT TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A17,I1)')'DEPMASSCONC MODE ',JJ+NMODE_DST + WRITE(TZFIELD%CCOMMENT,'(A17,I1)')'DEPMASSCONC MODE ',JJ+NMODE_SLT TZFIELD%CUNITS = 'ug m-3' ZWORK31(:,:,:)= ZWORK31(:,:,:)*4./3.*3.14*2500.*1e9 & !kg-->ug - * (ZRG_DST(:,:,:,JJ)**3)*1.d-18 & !um-->m - * exp(4.5*log(ZSIG_DST(:,:,:,JJ))*log(ZSIG_DST(:,:,:,JJ))) + * (ZRG_SLT(:,:,:,JJ)**3)*1.d-18 & !um-->m + * exp(4.5*log(ZSIG_SLT(:,:,:,JJ))*log(ZSIG_SLT(:,:,:,JJ))) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) END DO + + ZSSLTDEP => NULL() ! END IF -! Aerosol -IF ((LCHEMDIAG).AND.(LORILAM).AND.(LUSECHEM)) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppbv' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. +! +! Blowing snow variables +! +IF(LBLOWSNOW) THEN +!PW:TODO?:variables scalaires XSVT pas ecrites ici. Voulu? + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'SNWSUBL3D', & + CSTDNAME = '', & + CLONGNAME = 'SNWSUBL3D', & + CUNITS = 'kg m-3 s-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_INstantaneous 3D Drifting snow sublimation flux', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) + CALL IO_Field_write(TPFILE,TZFIELD,XSNWSUBL3D(:,:,:)) ! - DO JSV = NSV_AERBEG,NSV_AEREND - TZFIELD%CMNHNAME = TRIM(UPCASE(CAERONAMES(JSV-NSV_AERBEG+1)))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A4,I3.3)')'X_Y_Z_','AERO',JSV - CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)*1.E9) + ZWORK21(:,:) = 0. + DO JK = IKB,IKE + ZWORK21(:,:) = ZWORK21(:,:)+XSNWSUBL3D(:,:,JK) * & + (XZZ(:,:,JK+1)-XZZ(:,:,JK))/XRHOLW*3600*24 END DO + ZWORK21(:,:) = ZWORK21(:,:)*1000. ! vapor water in mm unit ! - IF (.NOT.(ASSOCIATED(XN3D))) & - ALLOCATE(XN3D(SIZE(XSVT,1),SIZE(XSVT,2),SIZE(XSVT,3),JPMODE)) - IF (.NOT.(ASSOCIATED(XRG3D))) & - ALLOCATE(XRG3D(SIZE(XSVT,1),SIZE(XSVT,2),SIZE(XSVT,3),JPMODE)) - IF (.NOT.(ASSOCIATED(XSIG3D))) & - ALLOCATE(XSIG3D(SIZE(XSVT,1),SIZE(XSVT,2),SIZE(XSVT,3),JPMODE)) + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'COL_SNWSUBL', & + CSTDNAME = '', & + CLONGNAME = 'COL_SNWSUBL', & + CUNITS = 'mm day-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Column Sublimation Rate (mmSWE/day)', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) + CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21(:,:)) ! - CALL PPP2AERO(XSVT(:,:,:,NSV_AERBEG:NSV_AEREND), XRHODREF, & - PSIG3D=XSIG3D, PRG3D=XRG3D, PN3D=XN3D, PCTOTA=ZPTOTA) - DO JJ=1,JPMODE - WRITE(TZFIELD%CMNHNAME,'(A3,I1)')'RGA',JJ - TZFIELD%CLONGNAME = 'RGA' - TZFIELD%CUNITS = 'um' - WRITE(TZFIELD%CCOMMENT,'(A21,I1)')'RG (nb) AEROSOL MODE ',JJ - CALL IO_Field_write(TPFILE,TZFIELD,XRG3D(:,:,:,JJ)) - ! - WRITE(TZFIELD%CMNHNAME,'(A4,I1)')'RGAM',JJ - TZFIELD%CLONGNAME = 'RGAM' - TZFIELD%CUNITS = 'um' - WRITE(TZFIELD%CCOMMENT,'(A20,I1)')'RG (m) AEROSOL MODE ',JJ - ZWORK31(:,:,:)=XRG3D(:,:,:,JJ) / (EXP(-3.*(LOG(XSIG3D(:,:,:,JJ)))**2)) - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) - ! - WRITE(TZFIELD%CMNHNAME,'(A3,I1)')'N0A',JJ - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'cm-3' - WRITE(TZFIELD%CCOMMENT,'(A16,I1)')'N0 AEROSOL MODE ',JJ - CALL IO_Field_write(TPFILE,TZFIELD,XN3D(:,:,:,JJ)*1.E-6) - ! - WRITE(TZFIELD%CMNHNAME,'(A4,I1)')'SIGA',JJ - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = '1' - WRITE(TZFIELD%CCOMMENT,'(A19,I1)')'SIGMA AEROSOL MODE ',JJ - CALL IO_Field_write(TPFILE,TZFIELD,XSIG3D(:,:,:,JJ)) - ! - WRITE(TZFIELD%CMNHNAME,'(A4,I1)')'MSO4',JJ - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'ug m-3' - WRITE(TZFIELD%CCOMMENT,'(A22,I1)')'MASS SO4 AEROSOL MODE ',JJ - CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_SO4,JJ)) - ! - WRITE(TZFIELD%CMNHNAME,'(A4,I1)')'MNO3',JJ - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'ug m-3' - WRITE(TZFIELD%CCOMMENT,'(A22,I1)')'MASS NO3 AEROSOL MODE ',JJ - CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_NO3,JJ)) - ! - WRITE(TZFIELD%CMNHNAME,'(A4,I1)')'MNH3',JJ - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'ug m-3' - WRITE(TZFIELD%CCOMMENT,'(A22,I1)')'MASS NH3 AEROSOL MODE ',JJ - CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_NH3,JJ)) - ! - WRITE(TZFIELD%CMNHNAME,'(A4,I1)')'MH2O',JJ - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'ug m-3' - WRITE(TZFIELD%CCOMMENT,'(A22,I1)')'MASS H2O AEROSOL MODE ',JJ - CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_H2O,JJ)) - ! - IF (NSOA .EQ. 10) THEN - WRITE(TZFIELD%CMNHNAME,'(A5,I1)')'MSOA1',JJ - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'ug m-3' - WRITE(TZFIELD%CCOMMENT,'(A23,I1)')'MASS SOA1 AEROSOL MODE ',JJ - CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_SOA1,JJ)) - ! - WRITE(TZFIELD%CMNHNAME,'(A5,I1)')'MSOA2',JJ - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'ug m-3' - WRITE(TZFIELD%CCOMMENT,'(A23,I1)')'MASS SOA2 AEROSOL MODE ',JJ - CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_SOA2,JJ)) - ! - WRITE(TZFIELD%CMNHNAME,'(A5,I1)')'MSOA3',JJ - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'ug m-3' - WRITE(TZFIELD%CCOMMENT,'(A23,I1)')'MASS SOA3 AEROSOL MODE ',JJ - CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_SOA3,JJ)) - ! - WRITE(TZFIELD%CMNHNAME,'(A5,I1)')'MSOA4',JJ - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'ug m-3' - WRITE(TZFIELD%CCOMMENT,'(A23,I1)')'MASS SOA4 AEROSOL MODE ',JJ - CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_SOA4,JJ)) - ! - WRITE(TZFIELD%CMNHNAME,'(A5,I1)')'MSOA5',JJ - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'ug m-3' - WRITE(TZFIELD%CCOMMENT,'(A23,I1)')'MASS SOA5 AEROSOL MODE ',JJ - CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_SOA5,JJ)) - ! - WRITE(TZFIELD%CMNHNAME,'(A5,I1)')'MSOA6',JJ - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'ug m-3' - WRITE(TZFIELD%CCOMMENT,'(A23,I1)')'MASS SOA6 AEROSOL MODE ',JJ - CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_SOA6,JJ)) - ! - WRITE(TZFIELD%CMNHNAME,'(A5,I1)')'MSOA7',JJ - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'ug m-3' - WRITE(TZFIELD%CCOMMENT,'(A23,I1)')'MASS SOA7 AEROSOL MODE ',JJ - CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_SOA7,JJ)) - ! - WRITE(TZFIELD%CMNHNAME,'(A5,I1)')'MSOA8',JJ - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'ug m-3' - WRITE(TZFIELD%CCOMMENT,'(A23,I1)')'MASS SOA8 AEROSOL MODE ',JJ - CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_SOA8,JJ)) - ! - WRITE(TZFIELD%CMNHNAME,'(A5,I1)')'MSOA9',JJ - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'ug m-3' - WRITE(TZFIELD%CCOMMENT,'(A23,I1)')'MASS SOA9 AEROSOL MODE ',JJ - CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_SOA9,JJ)) - ! - WRITE(TZFIELD%CMNHNAME,'(A6,I1)')'MSOA10',JJ - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'ug m-3' - WRITE(TZFIELD%CCOMMENT,'(A24,I1)')'MASS SOA10 AEROSOL MODE ',JJ - CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_SOA10,JJ)) - END IF - ! - WRITE(TZFIELD%CMNHNAME,'(A3,I1)')'MOC',JJ - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'ug m-3' - WRITE(TZFIELD%CCOMMENT,'(A21,I1)')'MASS OC AEROSOL MODE ',JJ - CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_OC,JJ)) - ! - WRITE(TZFIELD%CMNHNAME,'(A3,I1)')'MBC',JJ - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'ug m-3' - WRITE(TZFIELD%CCOMMENT,'(A21,I1)')'MASS BC AEROSOL MODE ',JJ - CALL IO_Field_write(TPFILE,TZFIELD,ZPTOTA(:,:,:,JP_AER_BC,JJ)) - ENDDO + IF(.NOT.ALLOCATED(ZBET_SNW)) & + ALLOCATE(ZBET_SNW(SIZE(XSVT,1), SIZE(XSVT,2), SIZE(XSVT,3))) + IF(.NOT.ALLOCATED(ZRG_SNW)) & + ALLOCATE(ZRG_SNW(SIZE(XSVT,1), SIZE(XSVT,2), SIZE(XSVT,3))) + IF(.NOT.ALLOCATED(ZMA_SNW)) & + ALLOCATE(ZMA_SNW(SIZE(XSVT,1), SIZE(XSVT,2), SIZE(XSVT,3),NBLOWSNOW3D)) + ! + CALL PPP2SNOW(XSVT(:,:,:,NSV_SNWBEG:NSV_SNWEND),XRHODREF,& + PBET3D=ZBET_SNW, PRG3D=ZRG_SNW, PM3D=ZMA_SNW) + ! + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'SNWRGA', & + CSTDNAME = '', & + CLONGNAME = 'SNWRGA', & + CUNITS = 'm', & + CDIR = 'XY', & + CCOMMENT = 'RG (mean) SNOW', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) + CALL IO_Field_write(TPFILE,TZFIELD,ZRG_SNW(:,:,:)) + ! + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'SNWBETA', & + CSTDNAME = '', & + CLONGNAME = 'SNWBETA', & + CUNITS = 'm', & + CDIR = 'XY', & + CCOMMENT = 'BETA SNOW', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) + CALL IO_Field_write(TPFILE,TZFIELD,ZBET_SNW(:,:,:)) + ! + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'SNWNOA', & + CSTDNAME = '', & + CLONGNAME = 'SNWNOA', & + CUNITS = 'm-3', & + CDIR = 'XY', & + CCOMMENT = 'NUM CONC SNOW (#/m3)', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) + CALL IO_Field_write(TPFILE,TZFIELD,ZMA_SNW(:,:,:,1)) + ! + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'SNWMASS', & + CSTDNAME = '', & + CLONGNAME = 'SNWMASS', & + CUNITS = 'kg m-3', & + CDIR = 'XY', & + CCOMMENT = 'MASS CONC SNOW', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) + CALL IO_Field_write(TPFILE,TZFIELD,ZMA_SNW(:,:,:,2)) + ! + ZWORK21(:,:) = 0. + DO JK = IKB,IKE + ZWORK21(:,:) = ZWORK21(:,:)+ZMA_SNW(:,:,JK,2) * & + (XZZ(:,:,JK+1)-XZZ(:,:,JK))/XRHOLW + END DO + ZWORK21(:,:) = ZWORK21(:,:)*1000. ! vapor water in mm unit + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'THDS', & + CSTDNAME = '', & + CLONGNAME = 'THDS', & + CUNITS = 'mm', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_THickness of Drifting Snow (mm SWE)', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) + CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21(:,:)) +END IF +! linox scalar variables +IF (.NOT.(LUSECHEM .OR. LCHEMDIAG) .AND. LCH_CONV_LINOX) THEN + DO JSV = NSV_LNOXBEG, NSV_LNOXEND + TZFIELD = TSVLIST(JSV) + TZFIELD%CUNITS = 'ppb' + WRITE(TZFIELD%CCOMMENT,'(A,I3.3)') 'X_Y_Z_LNOX', JSV + CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)*1.E9) + END DO END IF ! !* Large Scale variables @@ -2048,27 +1986,29 @@ IF (LVAR_LS) THEN CALL IO_Field_write(TPFILE,'LSVM', XLSVM) ! IF (LWIND_ZM) THEN - TZFIELD2(1)%CMNHNAME = 'LSUM_ZM' - TZFIELD2(1)%CSTDNAME = '' - TZFIELD2(1)%CLONGNAME = 'LSUM_ZM' - TZFIELD2(1)%CUNITS = 'm s-1' - TZFIELD2(1)%CDIR = 'XY' - TZFIELD2(1)%CCOMMENT = 'Large Scale Zonal component of horizontal wind' - TZFIELD2(1)%NGRID = 2 - TZFIELD2(1)%NTYPE = TYPEREAL - TZFIELD2(1)%NDIMS = 3 - TZFIELD2(1)%LTIMEDEP = .TRUE. + TZFIELD2(1) = TFIELDMETADATA( & + CMNHNAME = 'LSUM_ZM', & + CSTDNAME = '', & + CLONGNAME = 'LSUM_ZM', & + CUNITS = 'm s-1', & + CDIR = 'XY', & + CCOMMENT = 'Large Scale Zonal component of horizontal wind', & + NGRID = 2, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ! - TZFIELD2(2)%CMNHNAME = 'LSVM_ZM' - TZFIELD2(2)%CSTDNAME = '' - TZFIELD2(2)%CLONGNAME = 'LSVM_ZM' - TZFIELD2(2)%CUNITS = 'm s-1' - TZFIELD2(2)%CDIR = 'XY' - TZFIELD2(2)%CCOMMENT = 'Large Scale Meridian component of horizontal wind' - TZFIELD2(2)%NGRID = 3 - TZFIELD2(2)%NTYPE = TYPEREAL - TZFIELD2(2)%NDIMS = 3 - TZFIELD2(2)%LTIMEDEP = .TRUE. + TZFIELD2(2) = TFIELDMETADATA( & + CMNHNAME = 'LSVM_ZM', & + CSTDNAME = '', & + CLONGNAME = 'LSVM_ZM', & + CUNITS = 'm s-1', & + CDIR = 'XY', & + CCOMMENT = 'Large Scale Meridian component of horizontal wind', & + NGRID = 3, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ! CALL UV_TO_ZONAL_AND_MERID(XLSUM,XLSVM,23,TPFILE=TPFILE,TZFIELDS=TZFIELD2) ENDIF @@ -2078,7 +2018,7 @@ IF (LVAR_LS) THEN ! IF (LUSERV) THEN CALL FIND_FIELD_ID_FROM_MNHNAME('LSRVM',IID,IRESP) - TZFIELD = TFIELDLIST(IID) + TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) TZFIELD%CUNITS = 'g kg-1' CALL IO_Field_write(TPFILE,TZFIELD,XLSRVM(:,:,:)*1.E3) END IF @@ -2091,124 +2031,134 @@ IF (LVAR_FRC .AND. LFORCING) THEN DO JT=1,NFRC WRITE (YFRC,'(I3.3)') JT ! - TZFIELD%CMNHNAME = 'UFRC'//YFRC - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'm s-1' - TZFIELD%CDIR = '--' - TZFIELD%CCOMMENT = 'Zonal component of horizontal forcing wind' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 1 - TZFIELD%LTIMEDEP = .FALSE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'UFRC'//YFRC, & + CSTDNAME = '', & + CLONGNAME = 'UFRC'//YFRC, & + CUNITS = 'm s-1', & + CDIR = '--', & + CCOMMENT = 'Zonal component of horizontal forcing wind', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 1, & + LTIMEDEP = .FALSE. ) CALL IO_Field_write(TPFILE,TZFIELD,XUFRC(:,JT)) ! - TZFIELD%CMNHNAME = 'VFRC'//YFRC - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'm s-1' - TZFIELD%CDIR = '--' - TZFIELD%CCOMMENT = 'Meridian component of horizontal forcing wind' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 1 - TZFIELD%LTIMEDEP = .FALSE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'VFRC'//YFRC, & + CSTDNAME = '', & + CLONGNAME = 'VFRC'//YFRC, & + CUNITS = 'm s-1', & + CDIR = '--', & + CCOMMENT = 'Meridian component of horizontal forcing wind', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 1, & + LTIMEDEP = .FALSE. ) CALL IO_Field_write(TPFILE,TZFIELD,XVFRC(:,JT)) ! - TZFIELD%CMNHNAME = 'WFRC'//YFRC - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'm s-1' - TZFIELD%CDIR = '--' - TZFIELD%CCOMMENT = 'Vertical forcing wind' - TZFIELD%NGRID = 4 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 1 - TZFIELD%LTIMEDEP = .FALSE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'WFRC'//YFRC, & + CSTDNAME = '', & + CLONGNAME = 'WFRC'//YFRC, & + CUNITS = 'm s-1', & + CDIR = '--', & + CCOMMENT = 'Vertical forcing wind', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 1, & + LTIMEDEP = .FALSE. ) CALL IO_Field_write(TPFILE,TZFIELD,XWFRC(:,JT)) ! - TZFIELD%CMNHNAME = 'THFRC'//YFRC - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'K' - TZFIELD%CDIR = '--' - TZFIELD%CCOMMENT = 'Forcing potential temperature' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 1 - TZFIELD%LTIMEDEP = .FALSE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'THFRC'//YFRC, & + CSTDNAME = '', & + CLONGNAME = 'THFRC'//YFRC, & + CUNITS = 'K', & + CDIR = '--', & + CCOMMENT = 'Forcing potential temperature', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 1, & + LTIMEDEP = .FALSE. ) CALL IO_Field_write(TPFILE,TZFIELD,XTHFRC(:,JT)) ! - TZFIELD%CMNHNAME = 'RVFRC'//YFRC - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'kg kg-1' - TZFIELD%CDIR = '--' - TZFIELD%CCOMMENT = 'Forcing vapor mixing ratio' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 1 - TZFIELD%LTIMEDEP = .FALSE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'RVFRC'//YFRC, & + CSTDNAME = '', & + CLONGNAME = 'RVFRC'//YFRC, & + CUNITS = 'kg kg-1', & + CDIR = '--', & + CCOMMENT = 'Forcing vapor mixing ratio', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 1, & + LTIMEDEP = .FALSE. ) CALL IO_Field_write(TPFILE,TZFIELD,XRVFRC(:,JT)) ! - TZFIELD%CMNHNAME = 'TENDTHFRC'//YFRC - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'K s-1' - TZFIELD%CDIR = '--' - TZFIELD%CCOMMENT = 'Large-scale potential temperature tendency for forcing' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 1 - TZFIELD%LTIMEDEP = .FALSE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'TENDTHFRC'//YFRC, & + CSTDNAME = '', & + CLONGNAME = 'TENDTHFRC'//YFRC, & + CUNITS = 'K s-1', & + CDIR = '--', & + CCOMMENT = 'Large-scale potential temperature tendency for forcing', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 1, & + LTIMEDEP = .FALSE. ) CALL IO_Field_write(TPFILE,TZFIELD,XTENDTHFRC(:,JT)) ! - TZFIELD%CMNHNAME = 'TENDRVFRC'//YFRC - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'kg kg-1 s-1' - TZFIELD%CDIR = '--' - TZFIELD%CCOMMENT = 'Large-scale vapor mixing ratio tendency for forcing' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 1 - TZFIELD%LTIMEDEP = .FALSE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'TENDRVFRC'//YFRC, & + CSTDNAME = '', & + CLONGNAME = 'TENDRVFRC'//YFRC, & + CUNITS = 'kg kg-1 s-1', & + CDIR = '--', & + CCOMMENT = 'Large-scale vapor mixing ratio tendency for forcing', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 1, & + LTIMEDEP = .FALSE. ) CALL IO_Field_write(TPFILE,TZFIELD,XTENDRVFRC(:,JT)) ! - TZFIELD%CMNHNAME = 'GXTHFRC'//YFRC - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'K m-1' - TZFIELD%CDIR = '--' - TZFIELD%CCOMMENT = 'Large-scale potential temperature gradient for forcing' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 1 - TZFIELD%LTIMEDEP = .FALSE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'GXTHFRC'//YFRC, & + CSTDNAME = '', & + CLONGNAME = 'GXTHFRC'//YFRC, & + CUNITS = 'K m-1', & + CDIR = '--', & + CCOMMENT = 'Large-scale potential temperature gradient for forcing', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 1, & + LTIMEDEP = .FALSE. ) CALL IO_Field_write(TPFILE,TZFIELD,XGXTHFRC(:,JT)) ! - TZFIELD%CMNHNAME = 'GYTHFRC'//YFRC - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'K m-1' - TZFIELD%CDIR = '--' - TZFIELD%CCOMMENT = 'Large-scale potential temperature gradient for forcing' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 1 - TZFIELD%LTIMEDEP = .FALSE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'GYTHFRC'//YFRC, & + CSTDNAME = '', & + CLONGNAME = 'GYTHFRC'//YFRC, & + CUNITS = 'K m-1', & + CDIR = '--', & + CCOMMENT = 'Large-scale potential temperature gradient for forcing', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 1, & + LTIMEDEP = .FALSE. ) CALL IO_Field_write(TPFILE,TZFIELD,XGYTHFRC(:,JT)) ! - TZFIELD%CMNHNAME = 'PGROUNDFRC'//YFRC - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'Pa' - TZFIELD%CDIR = '--' - TZFIELD%CCOMMENT = 'Forcing ground pressure' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 0 - TZFIELD%LTIMEDEP = .FALSE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'PGROUNDFRC'//YFRC, & + CSTDNAME = '', & + CLONGNAME = 'PGROUNDFRC'//YFRC, & + CUNITS = 'Pa', & + CDIR = '--', & + CCOMMENT = 'Forcing ground pressure', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 0, & + LTIMEDEP = .FALSE. ) CALL IO_Field_write(TPFILE,TZFIELD,XPGROUNDFRC(JT)) ! END DO @@ -2221,23 +2171,24 @@ END IF IF (LTPZH .OR. LCOREF) THEN ! !* Temperature in celsius - TZFIELD%CMNHNAME = 'TEMP' - TZFIELD%CSTDNAME = 'air_temperature' - TZFIELD%CLONGNAME = 'TEMP' - TZFIELD%CUNITS = 'celsius' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_TEMPerature' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'TEMP', & + CSTDNAME = 'air_temperature', & + CLONGNAME = 'TEMP', & + CUNITS = 'celsius', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_TEMPerature', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ZWORK31(:,:,:)=ZTEMP(:,:,:) - XTT CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) ! !* Pressure in hPa CALL FIND_FIELD_ID_FROM_MNHNAME('PABST',IID,IRESP) - TZFIELD = TFIELDLIST(IID) - TZFIELD%CMNHNAME = 'PRES' + TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) + TZFIELD%CMNHNAME = 'PRES' TZFIELD%CUNITS = 'hPa' CALL IO_Field_write(TPFILE,TZFIELD,XPABST(:,:,:)*1E-2) ! @@ -2260,28 +2211,30 @@ IF (LTPZH .OR. LCOREF) THEN END WHERE END IF ! - TZFIELD%CMNHNAME = 'REHU' - TZFIELD%CSTDNAME = 'relative_humidity' - TZFIELD%CLONGNAME = 'REHU' - TZFIELD%CUNITS = 'percent' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_RElative HUmidity' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'REHU', & + CSTDNAME = 'relative_humidity', & + CLONGNAME = 'REHU', & + CUNITS = 'percent', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_RElative HUmidity', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK32) ! - TZFIELD%CMNHNAME = 'VPRES' - TZFIELD%CSTDNAME = 'water_vapor_partial_pressure_in_air' - TZFIELD%CLONGNAME = 'VPRES' - TZFIELD%CUNITS = 'hPa' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_Vapor PRESsure' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'VPRES', & + CSTDNAME = 'water_vapor_partial_pressure_in_air', & + CLONGNAME = 'VPRES', & + CUNITS = 'hPa', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_Vapor PRESsure', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ZWORK33(:,:,:)=ZWORK33(:,:,:)*ZWORK32(:,:,:)*1E-4 CALL IO_Field_write(TPFILE,TZFIELD,ZWORK33) ! @@ -2289,29 +2242,31 @@ IF (LTPZH .OR. LCOREF) THEN ZWORK33(:,:,:)=(77.6*( XPABST(:,:,:)*1E-2 & +ZWORK33(:,:,:)*4810/ZTEMP(:,:,:)) & -6*ZWORK33(:,:,:) )/ZTEMP(:,:,:) - TZFIELD%CMNHNAME = 'COREF' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'COREF' - TZFIELD%CUNITS = '1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_REFraction COindex (N-units)' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'COREF', & + CSTDNAME = '', & + CLONGNAME = 'COREF', & + CUNITS = '1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_REFraction COindex (N-units)', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK33) ! ZWORK33(:,:,:)=ZWORK33(:,:,:)+MZF(XZZ(:,:,:))*1E6/XRADIUS - TZFIELD%CMNHNAME = 'MCOREF' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'MCOREF' - TZFIELD%CUNITS = '1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_Modified REFraction COindex (M-units)' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'MCOREF', & + CSTDNAME = '', & + CLONGNAME = 'MCOREF', & + CUNITS = '1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_Modified REFraction COindex (M-units)', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK33) END IF ELSE @@ -2343,16 +2298,17 @@ IF ( LMOIST_V .OR. LMSLP .OR. CBLTOP/='NONE' ) THEN ! IF (LMOIST_V .AND. NRR > 0) THEN ! Virtual potential temperature - TZFIELD%CMNHNAME = 'THETAV' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'THETAV' - TZFIELD%CUNITS = 'K' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_Virtual potential temperature' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'THETAV', & + CSTDNAME = '', & + CLONGNAME = 'THETAV', & + CUNITS = 'K', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_Virtual potential temperature', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZTHETAV) END IF ! @@ -2376,16 +2332,17 @@ IF (LVISI) THEN ZVISIKUN(:,:,:) =0.027/(XRT(:,:,:,2)*XRHODREF(:,:,:))**0.88*1000. END WHERE ! Visibity Kunkel - TZFIELD%CMNHNAME = 'VISIKUN' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'VISIKUN' - TZFIELD%CUNITS = 'm' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_Visibility Kunkel' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'VISIKUN', & + CSTDNAME = '', & + CLONGNAME = 'VISIKUN', & + CUNITS = 'm', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_Visibility Kunkel', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZVISIKUN) ! IF ((CCLOUD == 'C2R2') .OR. (CCLOUD =='KHKO')) THEN @@ -2396,28 +2353,30 @@ IF (LVISI) THEN ZVISIZHA(:,:,:) =0.187/(XRT(:,:,:,2)*XRHODREF(:,:,:)*XSVT(:,:,:,NSV_C2R2BEG+1))**0.34*1000. END WHERE ! Visibity Gultepe - TZFIELD%CMNHNAME = 'VISIGUL' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'VISIGUL' - TZFIELD%CUNITS = 'm' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_Visibility Gultepe' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'VISIGUL', & + CSTDNAME = '', & + CLONGNAME = 'VISIGUL', & + CUNITS = 'm', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_Visibility Gultepe', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZVISIGUL) ! Visibity Zhang - TZFIELD%CMNHNAME = 'VISIZHA' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'VISIZHA' - TZFIELD%CUNITS = 'm' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_Visibility Zhang' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'VISIZHA', & + CSTDNAME = '', & + CLONGNAME = 'VISIZHA', & + CUNITS = 'm', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_Visibility Zhang', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZVISIZHA) ! DEALLOCATE(ZVISIGUL,ZVISIZHA) @@ -2443,16 +2402,17 @@ IF (( LMOIST_E .OR. LBV_FR ) .AND. (NRR>0)) THEN *ZWORK31(:,:,:) *(1. +0.81 *ZWORK31(:,:,:)) ) ! IF (LMOIST_E) THEN - TZFIELD%CMNHNAME = 'THETAE' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'THETAE' - TZFIELD%CUNITS = 'K' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_Equivalent potential temperature' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'THETAE', & + CSTDNAME = '', & + CLONGNAME = 'THETAE', & + CUNITS = 'K', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_Equivalent potential temperature', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZTHETAE) END IF END IF @@ -2469,16 +2429,17 @@ IF (LMOIST_ES .AND. (NRR>0)) THEN -4.805 ) ) + 55. ZTHETAES(:,:,:)= XTHT(:,:,:) * EXP( (3376. / ZTHETAE(:,:,:) - 2.54) & *ZWORK31(:,:,:) *(1. +0.81 *ZWORK31(:,:,:)) ) - TZFIELD%CMNHNAME = 'THETAES' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'THETAES' - TZFIELD%CUNITS = 'K' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_Equivalent Saturated potential temperature' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'THETAES', & + CSTDNAME = '', & + CLONGNAME = 'THETAES', & + CUNITS = 'K', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_Equivalent Saturated potential temperature', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZTHETAES) ENDIF ! @@ -2520,16 +2481,17 @@ IF ( LMOIST_L .OR. LMOIST_S1 .OR. LMOIST_S2 ) THEN ! IF (LMOIST_L .AND. NRR > 0) THEN ! Liquid-Water potential temperature - TZFIELD%CMNHNAME = 'THETAL' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'THETAL' - TZFIELD%CUNITS = 'K' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_Liquid water potential temperature' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'THETAL', & + CSTDNAME = '', & + CLONGNAME = 'THETAL', & + CUNITS = 'K', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_Liquid water potential temperature', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZTHETAL) END IF ! @@ -2575,30 +2537,32 @@ IF ( LMOIST_S1 .OR. LMOIST_S2 ) THEN END IF IF (LMOIST_S1) THEN ! The Moist-air Entropy potential temperature (1st order) - TZFIELD%CMNHNAME = 'THETAS1' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'THETAS1' - TZFIELD%CUNITS = 'K' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_Moist air Entropy (1st order) potential temperature' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'THETAS1', & + CSTDNAME = '', & + CLONGNAME = 'THETAS1', & + CUNITS = 'K', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_Moist air Entropy (1st order) potential temperature', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZTHETAS1) END IF IF (LMOIST_S2) THEN ! The Moist-air Entropy potential temperature (2nd order) - TZFIELD%CMNHNAME = 'THETAS2' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'THETAS2' - TZFIELD%CUNITS = 'K' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_Moist air Entropy (2nd order) potential temperature' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'THETAS2', & + CSTDNAME = '', & + CLONGNAME = 'THETAS2', & + CUNITS = 'K', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_Moist air Entropy (2nd order) potential temperature', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZTHETAS2) END IF ! @@ -2612,84 +2576,90 @@ END IF IF (LVORT) THEN ! Vorticity x ZWORK31(:,:,:)=MYF(MZF(MXM(ZVOX(:,:,:)))) - TZFIELD%CMNHNAME = 'UM1' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'UM1' - TZFIELD%CUNITS = 's-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_x component of vorticity' - TZFIELD%NGRID = 2 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'UM1', & + CSTDNAME = '', & + CLONGNAME = 'UM1', & + CUNITS = 's-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_x component of vorticity', & + NGRID = 2, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) ! ! Vorticity y ZWORK32(:,:,:)=MZF(MXF(MYM(ZVOY(:,:,:)))) - TZFIELD%CMNHNAME = 'VM1' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'VM1' - TZFIELD%CUNITS = 's-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_y component of vorticity' - TZFIELD%NGRID = 3 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'VM1', & + CSTDNAME = '', & + CLONGNAME = 'VM1', & + CUNITS = 's-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_y component of vorticity', & + NGRID = 3, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK32) ! IF (LWIND_ZM) THEN - TZFIELD2(1)%CMNHNAME = 'UM1_ZM' - TZFIELD2(1)%CSTDNAME = '' - TZFIELD2(1)%CLONGNAME = 'UM1_ZM' - TZFIELD2(1)%CUNITS = 'm s-1' - TZFIELD2(1)%CDIR = 'XY' - TZFIELD2(1)%CCOMMENT = 'Zonal component of horizontal vorticity' - TZFIELD2(1)%NGRID = 2 - TZFIELD2(1)%NTYPE = TYPEREAL - TZFIELD2(1)%NDIMS = 3 - TZFIELD2(1)%LTIMEDEP = .TRUE. + TZFIELD2(1) = TFIELDMETADATA( & + CMNHNAME = 'UM1_ZM', & + CSTDNAME = '', & + CLONGNAME = 'UM1_ZM', & + CUNITS = 'm s-1', & + CDIR = 'XY', & + CCOMMENT = 'Zonal component of horizontal vorticity', & + NGRID = 2, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ! - TZFIELD2(2)%CMNHNAME = 'VM1_ZM' - TZFIELD2(2)%CSTDNAME = '' - TZFIELD2(2)%CLONGNAME = 'VM1_ZM' - TZFIELD2(2)%CUNITS = 'm s-1' - TZFIELD2(2)%CDIR = 'XY' - TZFIELD2(2)%CCOMMENT = 'Meridian component of horizontal vorticity' - TZFIELD2(2)%NGRID = 3 - TZFIELD2(2)%NTYPE = TYPEREAL - TZFIELD2(2)%NDIMS = 3 - TZFIELD2(2)%LTIMEDEP = .TRUE. + TZFIELD2(2) = TFIELDMETADATA( & + CMNHNAME = 'VM1_ZM', & + CSTDNAME = '', & + CLONGNAME = 'VM1_ZM', & + CUNITS = 'm s-1', & + CDIR = 'XY', & + CCOMMENT = 'Meridian component of horizontal vorticity', & + NGRID = 3, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ! CALL UV_TO_ZONAL_AND_MERID(ZWORK31,ZWORK32,23,TPFILE=TPFILE,TZFIELDS=TZFIELD2) ENDIF ! ! Vorticity z ZWORK31(:,:,:)=MXF(MYF(MZM(ZVOZ(:,:,:)))) - TZFIELD%CMNHNAME = 'WM1' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'WM1' - TZFIELD%CUNITS = 's-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_relative vorticity' - TZFIELD%NGRID = 4 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'WM1', & + CSTDNAME = '', & + CLONGNAME = 'WM1', & + CUNITS = 's-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_relative vorticity', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) ! ! Absolute Vorticity ZWORK31(:,:,:)=MYF(MXF(ZVOZ(:,:,:))) + ZCORIOZ(:,:,:) - TZFIELD%CMNHNAME = 'ABVOR' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'ABVOR' - TZFIELD%CUNITS = 's-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_z ABsolute VORticity' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'ABVOR', & + CSTDNAME = '', & + CLONGNAME = 'ABVOR', & + CUNITS = 's-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_z ABsolute VORticity', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) ! END IF @@ -2713,16 +2683,17 @@ IF ( LMEAN_POVO ) THEN END WHERE END DO WHERE (IWORK1(:,:)>0) ZWORK21(:,:)=ZWORK21(:,:)/REAL( IWORK1(:,:) ) - TZFIELD%CMNHNAME = 'MEAN_POVO' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'MEAN_POVO' - TZFIELD%CUNITS = 'PVU' ! 1 PVU = 1e-6 m^2 s^-1 K kg^-1 - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_MEAN of POtential VOrticity' - TZFIELD%NGRID = 4 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 2 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'MEAN_POVO', & + CSTDNAME = '', & + CLONGNAME = 'MEAN_POVO', & + CUNITS = 'PVU', & ! 1 PVU = 1e-6 m^2 s^-1 K kg^-1 + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_MEAN of POtential VOrticity', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21) END IF ! @@ -2735,16 +2706,17 @@ IF (LMOIST_V .AND. (NRR>0) ) THEN + ZWORK32(:,:,:)*MZF(MXF(ZVOY(:,:,:))) & + ZWORK33(:,:,:)*(MYF(MXF(ZVOZ(:,:,:))) + ZCORIOZ(:,:,:)) ZWORK34(:,:,:)=ZWORK34(:,:,:)*1E6/XRHODREF(:,:,:) - TZFIELD%CMNHNAME = 'POVOV' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'POVOV' - TZFIELD%CUNITS = 'PVU' ! 1 PVU = 1e-6 m^2 s^-1 K kg^-1 - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_Virtual POtential VOrticity' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'POVOV', & + CSTDNAME = '', & + CLONGNAME = 'POVOV', & + CUNITS = 'PVU', & ! 1 PVU = 1e-6 m^2 s^-1 K kg^-1 + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_Virtual POtential VOrticity', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK34) ! IF (LMEAN_POVO) THEN @@ -2757,16 +2729,17 @@ IF (LMOIST_V .AND. (NRR>0) ) THEN END WHERE END DO WHERE(IWORK1(:,:)>0) ZWORK21(:,:)=ZWORK21(:,:)/REAL( IWORK1(:,:) ) - TZFIELD%CMNHNAME = 'MEAN_POVOV' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'MEAN_POVOV' - TZFIELD%CUNITS = 'PVU' ! 1 PVU = 1e-6 m^2 s^-1 K kg^-1 - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_MEAN of Virtual POtential VOrticity' - TZFIELD%NGRID = 4 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 2 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'MEAN_POVOV', & + CSTDNAME = '', & + CLONGNAME = 'MEAN_POVOV', & + CUNITS = 'PVU', & ! 1 PVU = 1e-6 m^2 s^-1 K kg^-1 + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_MEAN of Virtual POtential VOrticity', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21) END IF END IF @@ -2781,16 +2754,17 @@ IF (LMOIST_E .AND. (NRR>0) ) THEN + ZWORK32(:,:,:)*MZF(MXF(ZVOY(:,:,:))) & + ZWORK33(:,:,:)*(MYF(MXF(ZVOZ(:,:,:))) + ZCORIOZ(:,:,:)) ZWORK34(:,:,:)=ZWORK34(:,:,:)*1E6/XRHODREF(:,:,:) - TZFIELD%CMNHNAME = 'POVOE' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'POVOE' - TZFIELD%CUNITS = 'PVU' ! 1 PVU = 1e-6 m^2 s^-1 K kg^-1 - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_Equivalent POtential VOrticity' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'POVOE', & + CSTDNAME = '', & + CLONGNAME = 'POVOE', & + CUNITS = 'PVU', & ! 1 PVU = 1e-6 m^2 s^-1 K kg^-1 + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_Equivalent POtential VOrticity', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK34) ! IF (LMEAN_POVO) THEN @@ -2803,16 +2777,17 @@ IF (LMOIST_E .AND. (NRR>0) ) THEN END WHERE END DO WHERE(IWORK1(:,:)>0) ZWORK21(:,:)=ZWORK21(:,:)/REAL( IWORK1(:,:) ) - TZFIELD%CMNHNAME = 'MEAN_POVOE' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'MEAN_POVOE' - TZFIELD%CUNITS = 'PVU' ! 1 PVU = 1e-6 m^2 s^-1 K kg^-1 - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_MEAN of Equivalent POtential VOrticity' - TZFIELD%NGRID = 4 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 2 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'MEAN_POVOE', & + CSTDNAME = '', & + CLONGNAME = 'MEAN_POVOE', & + CUNITS = 'PVU', & ! 1 PVU = 1e-6 m^2 s^-1 K kg^-1 + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_MEAN of Equivalent POtential VOrticity', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21) DEALLOCATE(IWORK1) END IF @@ -2828,16 +2803,17 @@ IF (LMOIST_ES .AND. (NRR>0) ) THEN + ZWORK32(:,:,:)*MZF(MXF(ZVOY(:,:,:))) & + ZWORK33(:,:,:)*(MYF(MXF(ZVOZ(:,:,:))) + ZCORIOZ(:,:,:)) ZWORK34(:,:,:)=ZWORK34(:,:,:)*1E6/XRHODREF(:,:,:) - TZFIELD%CMNHNAME = 'POVOES' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'POVOES' - TZFIELD%CUNITS = 'PVU' ! 1 PVU = 1e-6 m^2 s^-1 K kg^-1 - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_Equivalent Saturated POtential VOrticity' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'POVOES', & + CSTDNAME = '', & + CLONGNAME = 'POVOES', & + CUNITS = 'PVU', & ! 1 PVU = 1e-6 m^2 s^-1 K kg^-1 + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_Equivalent Saturated POtential VOrticity', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK34) ENDIF ! @@ -2849,29 +2825,31 @@ ENDIF IF (LDIV) THEN ! ZWORK31=GX_U_M(XUT,XDXX,XDZZ,XDZX) + GY_V_M(XVT,XDYY,XDZZ,XDZY) - TZFIELD%CMNHNAME = 'HDIV' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'HDIV' - TZFIELD%CUNITS = 's-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_Horizontal DIVergence' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'HDIV', & + CSTDNAME = '', & + CLONGNAME = 'HDIV', & + CUNITS = 's-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_Horizontal DIVergence', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) ! IF (LUSERV) THEN - TZFIELD%CMNHNAME = 'HMDIV' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'HMDIV' - TZFIELD%CUNITS = 'kg m-3 s-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_Horizontal Moisture DIVergence HMDIV' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'HMDIV', & + CSTDNAME = '', & + CLONGNAME = 'HMDIV', & + CUNITS = 'kg m-3 s-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_Horizontal Moisture DIVergence HMDIV', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ZWORK31=MXM(XRHODREF*XRT(:,:,:,1))*XUT ZWORK32=MYM(XRHODREF*XRT(:,:,:,1))*XVT ZWORK33=GX_U_M(ZWORK31,XDXX,XDZZ,XDZX) + GY_V_M(ZWORK32,XDYY,XDZZ,XDZY) @@ -2897,40 +2875,43 @@ IF (LCLSTR) THEN CALL CLUSTERING(GBOTUP,GCLOUD,XWT,ICLUSTERID,ICLUSTERLV,ZCLDSIZE) PRINT *,'GOT OUT OF CLUSTERING' ! - TZFIELD%CMNHNAME = 'CLUSTERID' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'CLUSTERID' - TZFIELD%CUNITS = '' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_CLUSTER (ID NUMBER)' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEINT - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'CLUSTERID', & + CSTDNAME = '', & + CLONGNAME = 'CLUSTERID', & + CUNITS = '', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_CLUSTER (ID NUMBER)', & + NGRID = 1, & + NTYPE = TYPEINT, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ICLUSTERID) ! - TZFIELD%CMNHNAME = 'CLUSTERLV' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'CLUSTERLV' - TZFIELD%CUNITS = '' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_CLUSTER (BASE OR TOP LEVEL)' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEINT - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'CLUSTERLV', & + CSTDNAME = '', & + CLONGNAME = 'CLUSTERLV', & + CUNITS = '', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_CLUSTER (BASE OR TOP LEVEL)', & + NGRID = 1, & + NTYPE = TYPEINT, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ICLUSTERLV) ! - TZFIELD%CMNHNAME = 'CLDSIZE' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'CLDSIZE' - TZFIELD%CUNITS = '' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_CLDSIZE (HOR. SECTION)' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'CLDSIZE', & + CSTDNAME = '', & + CLONGNAME = 'CLDSIZE', & + CUNITS = '', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_CLDSIZE (HOR. SECTION)', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZCLDSIZE) END IF ! @@ -2974,59 +2955,63 @@ IF (LGEO .OR. LAGEO) THEN DEALLOCATE(ZPHI) ! IF (LGEO) THEN - TZFIELD%CMNHNAME = 'UM88' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'UM88' - TZFIELD%CUNITS = 'm s-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_U component of GEOstrophic wind' - TZFIELD%NGRID = 2 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'UM88', & + CSTDNAME = '', & + CLONGNAME = 'UM88', & + CUNITS = 'm s-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_U component of GEOstrophic wind', & + NGRID = 2, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) ! - TZFIELD%CMNHNAME = 'VM88' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'VM88' - TZFIELD%CUNITS = 'm s-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_V component of GEOstrophic wind' - TZFIELD%NGRID = 3 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'VM88', & + CSTDNAME = '', & + CLONGNAME = 'VM88', & + CUNITS = 'm s-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_V component of GEOstrophic wind', & + NGRID = 3, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK32) ! IF (LWIND_ZM) THEN - TZFIELD2(1)%CMNHNAME = 'UM88_ZM' - TZFIELD2(1)%CSTDNAME = '' - TZFIELD2(1)%CLONGNAME = 'UM88_ZM' - TZFIELD2(1)%CUNITS = 'm s-1' - TZFIELD2(1)%CDIR = 'XY' - TZFIELD2(1)%CCOMMENT = 'Zonal component of GEOstrophic wind' - TZFIELD2(1)%NGRID = 2 - TZFIELD2(1)%NTYPE = TYPEREAL - TZFIELD2(1)%NDIMS = 3 - TZFIELD2(1)%LTIMEDEP = .TRUE. + TZFIELD2(1) = TFIELDMETADATA( & + CMNHNAME = 'UM88_ZM', & + CSTDNAME = '', & + CLONGNAME = 'UM88_ZM', & + CUNITS = 'm s-1', & + CDIR = 'XY', & + CCOMMENT = 'Zonal component of GEOstrophic wind', & + NGRID = 2, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ! - TZFIELD2(2)%CMNHNAME = 'VM88_ZM' - TZFIELD2(2)%CSTDNAME = '' - TZFIELD2(2)%CLONGNAME = 'VM88_ZM' - TZFIELD2(2)%CUNITS = 'm s-1' - TZFIELD2(2)%CDIR = 'XY' - TZFIELD2(2)%CCOMMENT = 'Meridian component of GEOstrophic wind' - TZFIELD2(2)%NGRID = 3 - TZFIELD2(2)%NTYPE = TYPEREAL - TZFIELD2(2)%NDIMS = 3 - TZFIELD2(2)%LTIMEDEP = .TRUE. + TZFIELD2(2) = TFIELDMETADATA( & + CMNHNAME = 'VM88_ZM', & + CSTDNAME = '', & + CLONGNAME = 'VM88_ZM', & + CUNITS = 'm s-1', & + CDIR = 'XY', & + CCOMMENT = 'Meridian component of GEOstrophic wind', & + NGRID = 3, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ! CALL UV_TO_ZONAL_AND_MERID(ZWORK31,ZWORK32,23,TPFILE=TPFILE,TZFIELDS=TZFIELD2) ENDIF ! ! wm necessary to plot vertical cross sections of wind vectors CALL FIND_FIELD_ID_FROM_MNHNAME('WT',IID,IRESP) - TZFIELD = TFIELDLIST(IID) + TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) TZFIELD%CMNHNAME = 'WM88' TZFIELD%CLONGNAME = 'WM88' CALL IO_Field_write(TPFILE,TZFIELD,XWT) @@ -3036,59 +3021,63 @@ IF (LGEO .OR. LAGEO) THEN ZWORK31(:,:,:)=XUT(:,:,:)-ZWORK31(:,:,:) ZWORK32(:,:,:)=XVT(:,:,:)-ZWORK32(:,:,:) ! - TZFIELD%CMNHNAME = 'UM89' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'UM89' - TZFIELD%CUNITS = 'm s-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_U component of AGEOstrophic wind' - TZFIELD%NGRID = 2 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'UM89', & + CSTDNAME = '', & + CLONGNAME = 'UM89', & + CUNITS = 'm s-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_U component of AGEOstrophic wind', & + NGRID = 2, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) ! - TZFIELD%CMNHNAME = 'VM89' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'VM89' - TZFIELD%CUNITS = 'm s-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_V component of AGEOstrophic wind' - TZFIELD%NGRID = 3 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'VM89', & + CSTDNAME = '', & + CLONGNAME = 'VM89', & + CUNITS = 'm s-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_V component of AGEOstrophic wind', & + NGRID = 3, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK32) ! IF (LWIND_ZM) THEN - TZFIELD2(1)%CMNHNAME = 'UM89_ZM' - TZFIELD2(1)%CSTDNAME = '' - TZFIELD2(1)%CLONGNAME = 'UM89_ZM' - TZFIELD2(1)%CUNITS = 'm s-1' - TZFIELD2(1)%CDIR = 'XY' - TZFIELD2(1)%CCOMMENT = 'Zonal component of AGEOstrophic wind' - TZFIELD2(1)%NGRID = 2 - TZFIELD2(1)%NTYPE = TYPEREAL - TZFIELD2(1)%NDIMS = 3 - TZFIELD2(1)%LTIMEDEP = .TRUE. + TZFIELD2(1) = TFIELDMETADATA( & + CMNHNAME = 'UM89_ZM', & + CSTDNAME = '', & + CLONGNAME = 'UM89_ZM', & + CUNITS = 'm s-1', & + CDIR = 'XY', & + CCOMMENT = 'Zonal component of AGEOstrophic wind', & + NGRID = 2, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ! - TZFIELD2(2)%CMNHNAME = 'VM89_ZM' - TZFIELD2(2)%CSTDNAME = '' - TZFIELD2(2)%CLONGNAME = 'VM89_ZM' - TZFIELD2(2)%CUNITS = 'm s-1' - TZFIELD2(2)%CDIR = 'XY' - TZFIELD2(2)%CCOMMENT = 'Meridian component of AGEOstrophic wind' - TZFIELD2(2)%NGRID = 3 - TZFIELD2(2)%NTYPE = TYPEREAL - TZFIELD2(2)%NDIMS = 3 - TZFIELD2(2)%LTIMEDEP = .TRUE. + TZFIELD2(2) = TFIELDMETADATA( & + CMNHNAME = 'VM89_ZM', & + CSTDNAME = '', & + CLONGNAME = 'VM89_ZM', & + CUNITS = 'm s-1', & + CDIR = 'XY', & + CCOMMENT = 'Meridian component of AGEOstrophic wind', & + NGRID = 3, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ! CALL UV_TO_ZONAL_AND_MERID(ZWORK31,ZWORK32,23,TPFILE=TPFILE,TZFIELDS=TZFIELD2) ENDIF ! ! wm necessary to plot vertical cross sections of wind vectors CALL FIND_FIELD_ID_FROM_MNHNAME('WT',IID,IRESP) - TZFIELD = TFIELDLIST(IID) + TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) TZFIELD%CMNHNAME = 'WM89' TZFIELD%CLONGNAME = 'WM89' CALL IO_Field_write(TPFILE,TZFIELD,XWT) @@ -3105,16 +3094,17 @@ IF(LWIND_CONTRAV) THEN!$ CALL CONTRAV ((/"TEST","TEST"/),(/"TEST","TEST"/),XUT,XVT,XWT,XDXX,XDYY,XDZZ,XDZX,XDZY, & ZWORK31,ZWORK32,ZWORK33,2) ! - TZFIELD%CMNHNAME = 'WNORM' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'WNORM' - TZFIELD%CUNITS = 'm s-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_W surface normal wind' - TZFIELD%NGRID = 4 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'WNORM', & + CSTDNAME = '', & + CLONGNAME = 'WNORM', & + CUNITS = 'm s-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_W surface normal wind', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK33) END IF !------------------------------------------------------------------------------- @@ -3138,16 +3128,17 @@ IF (LMSLP) THEN ! sea level pressure (hPa) ZWORK22(:,:) = 1.E-2*ZWORK21(:,:)*EXP(XG*XZS(:,:)/(XRD*ZWORK22(:,:))) ! - TZFIELD%CMNHNAME = 'MSLP' - TZFIELD%CSTDNAME = 'air_pressure_at_sea_level' - TZFIELD%CLONGNAME = 'MSLP' - TZFIELD%CUNITS = 'hPa' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Mean Sea Level Pressure' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 2 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'MSLP', & + CSTDNAME = 'air_pressure_at_sea_level', & + CLONGNAME = 'MSLP', & + CUNITS = 'hPa', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Mean Sea Level Pressure', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK22) END IF !------------------------------------------------------------------------------- @@ -3163,16 +3154,17 @@ IF (LTHW) THEN (XZZ(:,:,JK+1)-XZZ(:,:,JK))/XRHOLW END DO ZWORK21(:,:) = ZWORK21(:,:)*1000. ! vapor water in mm unit - TZFIELD%CMNHNAME = 'THVW' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'THVW' - TZFIELD%CUNITS = 'mm' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_THickness of Vapor Water' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 2 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'THVW', & + CSTDNAME = '', & + CLONGNAME = 'THVW', & + CUNITS = 'mm', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_THickness of Vapor Water', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21) END IF ! @@ -3183,16 +3175,17 @@ IF (LTHW) THEN (XZZ(:,:,JK+1)-XZZ(:,:,JK))/XRHOLW END DO ZWORK21(:,:) = ZWORK21(:,:)*1000. ! cloud water in mm unit - TZFIELD%CMNHNAME = 'THCW' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'THCW' - TZFIELD%CUNITS = 'mm' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_THickness of Cloud Water' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 2 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'THCW', & + CSTDNAME = '', & + CLONGNAME = 'THCW', & + CUNITS = 'mm', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_THickness of Cloud Water', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21) END IF ! @@ -3203,16 +3196,17 @@ IF (LTHW) THEN (XZZ(:,:,JK+1)-XZZ(:,:,JK))/XRHOLW END DO ZWORK21(:,:) = ZWORK21(:,:)*1000. ! rain water in mm unit - TZFIELD%CMNHNAME = 'THRW' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'THRW' - TZFIELD%CUNITS = 'mm' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_THickness of Rain Water' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 2 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'THRW', & + CSTDNAME = '', & + CLONGNAME = 'THRW', & + CUNITS = 'mm', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_THickness of Rain Water', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21) END IF ! @@ -3223,16 +3217,17 @@ IF (LTHW) THEN (XZZ(:,:,JK+1)-XZZ(:,:,JK))/XRHOLW END DO ZWORK21(:,:) = ZWORK21(:,:)*1000. ! ice thickness in mm unit - TZFIELD%CMNHNAME = 'THIC' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'THIC' - TZFIELD%CUNITS = 'mm' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_THickness of ICe' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 2 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'THIC', & + CSTDNAME = '', & + CLONGNAME = 'THIC', & + CUNITS = 'mm', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_THickness of ICe', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21) END IF ! @@ -3243,16 +3238,17 @@ IF (LTHW) THEN (XZZ(:,:,JK+1)-XZZ(:,:,JK))/XRHOLW END DO ZWORK21(:,:) = ZWORK21(:,:)*1000. ! snow thickness in mm unit - TZFIELD%CMNHNAME = 'THSN' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'THSN' - TZFIELD%CUNITS = 'mm' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_THickness of SNow' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 2 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'THSN', & + CSTDNAME = '', & + CLONGNAME = 'THSN', & + CUNITS = 'mm', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_THickness of SNow', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21) END IF ! @@ -3263,16 +3259,17 @@ IF (LTHW) THEN (XZZ(:,:,JK+1)-XZZ(:,:,JK))/XRHOLW END DO ZWORK21(:,:) = ZWORK21(:,:)*1000. ! graupel thickness in mm unit - TZFIELD%CMNHNAME = 'THGR' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'THGR' - TZFIELD%CUNITS = 'mm' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_THickness of GRaupel' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 2 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'THGR', & + CSTDNAME = '', & + CLONGNAME = 'THGR', & + CUNITS = 'mm', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_THickness of GRaupel', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21) END IF ! @@ -3283,16 +3280,17 @@ IF (LTHW) THEN (XZZ(:,:,JK+1)-XZZ(:,:,JK))/XRHOLW END DO ZWORK21(:,:) = ZWORK21(:,:)*1000. ! hail thickness in mm unit - TZFIELD%CMNHNAME = 'THHA' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'THHA' - TZFIELD%CUNITS = 'mm' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_THickness of HAil' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 2 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'THHA', & + CSTDNAME = '', & + CLONGNAME = 'THHA', & + CUNITS = 'mm', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_THickness of HAil', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21) END IF END IF @@ -3324,16 +3322,17 @@ IF (LTOTAL_PR .AND. SIZE (XACPRR)>0 ) THEN END IF IF (LUSERR .OR. CCLOUD(1:3) == 'ICE' .OR. CCLOUD == 'C3R5' .OR. & CCLOUD == 'LIMA' .OR. CDCONV /= 'NONE') THEN - TZFIELD%CMNHNAME = 'ACTOPR' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'ACTOPR' - TZFIELD%CUNITS = 'mm' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_ACccumulated TOtal Precipitation Rate' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 2 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'ACTOPR', & + CSTDNAME = '', & + CLONGNAME = 'ACTOPR', & + CUNITS = 'mm', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_ACccumulated TOtal Precipitation Rate', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21) ELSE PRINT * ,'YOU WANT TO COMPUTE THE ACCUMULATED RAIN' @@ -3343,15 +3342,17 @@ IF (LTOTAL_PR .AND. SIZE (XACPRR)>0 ) THEN ! calculation of the mean accumulated precipitations in the mesh-grid of a !large-scale model IF (LMEAN_PR .AND. LUSERR) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'mm' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Large Scale ACccumulated TOtal Precipitation Rate' - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 2 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'generic LS_ACTOPR', & !Temporary name to ease identification + CUNITS = 'mm', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Large Scale ACccumulated TOtal Precipitation Rate', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) ! - DO JK=1,SIZE(XMEAN_PR),2 + DO JK=1,SIZE(XMEAN_PR),2 IF (XMEAN_PR(JK) .NE. XUNDEF .AND. XMEAN_PR(JK+1) .NE. XUNDEF) THEN PRINT * ,'MEAN accumulated RAIN: GRID ', XMEAN_PR(JK), XMEAN_PR(JK+1) CALL COMPUTE_MEAN_PRECIP(ZWORK21,XMEAN_PR(JK:JK+1),ZWORK22,TZFIELD%NGRID) @@ -3389,16 +3390,17 @@ IF (LTOTAL_PR .AND. SIZE (XACPRR)>0 ) THEN END IF IF (LUSERR .OR. CCLOUD(1:3) == 'ICE' .OR. CCLOUD == 'C3R5' .OR. & CCLOUD == 'LIMA' .OR. CDCONV /= 'NONE') THEN - TZFIELD%CMNHNAME = 'INTOPR' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'INTOPR' - TZFIELD%CUNITS = 'mm hour-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_INstantaneous TOtal Precipitation Rate' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 2 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'INTOPR', & + CSTDNAME = '', & + CLONGNAME = 'INTOPR', & + CUNITS = 'mm hour-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_INstantaneous TOtal Precipitation Rate', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21) ELSE PRINT * ,'YOU WANT TO COMPUTE THE RAIN RATE' @@ -3410,15 +3412,17 @@ IF (LTOTAL_PR .AND. SIZE (XACPRR)>0 ) THEN IF (LMEAN_PR .AND. LUSERR) THEN CALL COMPUTE_MEAN_PRECIP(ZWORK21,XMEAN_PR,ZWORK22,TZFIELD%NGRID) ! - TZFIELD%CMNHNAME = 'LS_INTOPR' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'LS_INTOPR' - TZFIELD%CUNITS = 'mm hour-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Large Scale INstantaneous TOtal Precipitation Rate' - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 2 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'LS_INTOPR', & + CSTDNAME = '', & + CLONGNAME = 'LS_INTOPR', & + CUNITS = 'mm hour-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Large Scale INstantaneous TOtal Precipitation Rate', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK22) END IF ! @@ -3438,65 +3442,70 @@ IF (NCAPE >=0 .AND. LUSERV) THEN ZWORK32(:,:,IKB:IKE),ZWORK33(:,:,IKB:IKE), & ZWORK34(:,:,IKB:IKE),ZWORK21,ZWORK22 ) ! - TZFIELD%CMNHNAME = 'CAPEMAX' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'CAPEMAX' - TZFIELD%CUNITS = 'J kg-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_MAX of Convective Available Potential Energy' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 2 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'CAPEMAX', & + CSTDNAME = '', & + CLONGNAME = 'CAPEMAX', & + CUNITS = 'J kg-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_MAX of Convective Available Potential Energy', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21) ! - TZFIELD%CMNHNAME = 'CINMAX' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'CINMAX' - TZFIELD%CUNITS = 'J kg-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_MAX of Convective INhibition energy' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 2 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'CINMAX', & + CSTDNAME = '', & + CLONGNAME = 'CINMAX', & + CUNITS = 'J kg-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_MAX of Convective INhibition energy', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK22) ! IF (NCAPE >=1) THEN - TZFIELD%CMNHNAME = 'CAPE3D' - TZFIELD%CSTDNAME = 'atmosphere_convective_available_potential_energy' - TZFIELD%CLONGNAME = 'CAPE3D' - TZFIELD%CUNITS = 'J kg-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_Convective Available Potential Energy' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'CAPE3D', & + CSTDNAME = 'atmosphere_convective_available_potential_energy', & + CLONGNAME = 'CAPE3D', & + CUNITS = 'J kg-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_Convective Available Potential Energy', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK32) ! - TZFIELD%CMNHNAME = 'CIN3D' - TZFIELD%CSTDNAME = 'atmosphere_convective_inhibition' - TZFIELD%CLONGNAME = 'CIN3D' - TZFIELD%CUNITS = 'J kg-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_Convective INhibition energy' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'CIN3D', & + CSTDNAME = 'atmosphere_convective_inhibition', & + CLONGNAME = 'CIN3D', & + CUNITS = 'J kg-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_Convective INhibition energy', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK33) ! - TZFIELD%CMNHNAME = 'DCAPE3D' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'DCAPE3D' - TZFIELD%CUNITS = 'J kg-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = '' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'DCAPE3D', & + CSTDNAME = '', & + CLONGNAME = 'DCAPE3D', & + CUNITS = 'J kg-1', & + CDIR = 'XY', & + CCOMMENT = '', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK34) END IF ! @@ -3505,16 +3514,17 @@ IF (NCAPE >=0 .AND. LUSERV) THEN ZWORK31(:,:,IKU) = 0. ZWORK31=0.5*ZWORK31**2 ! - TZFIELD%CMNHNAME = 'VKE' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'VKE' - TZFIELD%CUNITS = 'J kg-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_Vertical Kinetic Energy' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'VKE', & + CSTDNAME = '', & + CLONGNAME = 'VKE', & + CUNITS = 'J kg-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_Vertical Kinetic Energy', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) END IF ENDIF @@ -3537,16 +3547,17 @@ IF (LBV_FR) THEN ENDDO ENDDO ! - TZFIELD%CMNHNAME = 'BV' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'BV' - TZFIELD%CUNITS = 's-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_Brunt-Vaissala frequency' - TZFIELD%NGRID = 4 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'BV', & + CSTDNAME = '', & + CLONGNAME = 'BV', & + CUNITS = 's-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_Brunt-Vaissala frequency', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) ! IF (NRR > 0) THEN @@ -3563,16 +3574,17 @@ IF (LBV_FR) THEN ENDDO ENDDO ! - TZFIELD%CMNHNAME = 'BVE' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'BVE' - TZFIELD%CUNITS = 's-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_Equivalent Brunt-Vaissala frequency' - TZFIELD%NGRID = 4 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'BVE', & + CSTDNAME = '', & + CLONGNAME = 'BVE', & + CUNITS = 's-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_Equivalent Brunt-Vaissala frequency', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) END IF END IF @@ -3591,41 +3603,44 @@ IF ( NGPS>=0 ) THEN YFGRI=ADJUSTL(ADJUSTR(TPFILE%CNAME)//'GPS') CALL GPS_ZENITH (YFGRI,XRT(:,:,:,1),ZTEMP,XPABST,ZWORK21,ZWORK22,ZWORK23,ZWORK24) ! - TZFIELD%CMNHNAME = 'ZTD' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'ZTD' - TZFIELD%CUNITS = 'm' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_Zenithal Total Delay' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 2 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'ZTD', & + CSTDNAME = '', & + CLONGNAME = 'ZTD', & + CUNITS = 'm', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_Zenithal Total Delay', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK22) ! IF (NGPS>=1) THEN - TZFIELD%CMNHNAME = 'ZHD' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'ZHD' - TZFIELD%CUNITS = 'm' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_Zenithal Hydrostatic Delay' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 2 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'ZHD', & + CSTDNAME = '', & + CLONGNAME = 'ZHD', & + CUNITS = 'm', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_Zenithal Hydrostatic Delay', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK23) ! - TZFIELD%CMNHNAME = 'ZWD' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'ZWD' - TZFIELD%CUNITS = 'm' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_Zenithal Wet Delay' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 2 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'ZWD', & + CSTDNAME = '', & + CLONGNAME = 'ZWD', & + CUNITS = 'm', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_Zenithal Wet Delay', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK24) ! END IF @@ -3649,68 +3664,76 @@ IF(LRADAR .AND. LUSERR) THEN XCIT(:,:,:)=XSVT(:,:,:,NSV_LIMA_NI) CALL INI_RADAR('PLAT') END IF -! - IF (NMOM_S.GE.2) ZW1(:,:,:)=XSVT(:,:,:,NSV_LIMA_NS) - IF (NMOM_G.GE.2) ZW2(:,:,:)=XSVT(:,:,:,NSV_LIMA_NG) - IF (NMOM_H.GE.2) ZW3(:,:,:)=XSVT(:,:,:,NSV_LIMA_NH) +! IF (NVERSION_RAD == 1) THEN ! original version of radar diagnostics WRITE(ILUOUT0,*) 'radar diagnostics from RADAR_RAIN_ICE routine' IF (CCLOUD=='LIMA') THEN - CALL RADAR_RAIN_ICE (XRT, XCIT, XRHODREF, ZTEMP, ZWORK31, ZWORK32, & - ZWORK33, ZWORK34,XSVT(:,:,:,NSV_LIMA_NR), & - ZW1(:,:,:),ZW2(:,:,:),ZW3(:,:,:) ) + ALLOCATE( ZW1(SIZE(XSVT,1),SIZE(XSVT,2),SIZE(XSVT,3)) ) + ALLOCATE( ZW2(SIZE(XSVT,1),SIZE(XSVT,2),SIZE(XSVT,3)) ) + ALLOCATE( ZW3(SIZE(XSVT,1),SIZE(XSVT,2),SIZE(XSVT,3)) ) + IF ( NMOM_S >= 2 ) ZW1(:,:,:)=XSVT(:,:,:,NSV_LIMA_NS) + IF ( NMOM_G >= 2 ) ZW2(:,:,:)=XSVT(:,:,:,NSV_LIMA_NG) + IF ( NMOM_H >= 2 ) ZW3(:,:,:)=XSVT(:,:,:,NSV_LIMA_NH) + CALL RADAR_RAIN_ICE( XRT, XCIT, XRHODREF, ZTEMP, ZWORK31, ZWORK32, & + ZWORK33, ZWORK34,XSVT(:,:,:,NSV_LIMA_NR), & + ZW1(:,:,:), ZW2(:,:,:), ZW3(:,:,:) ) + DEALLOCATE( ZW1, ZW2, ZW3 ) ELSE CALL RADAR_RAIN_ICE (XRT, XCIT, XRHODREF, ZTEMP, ZWORK31, ZWORK32, & ZWORK33, ZWORK34 ) ENDIF ! - TZFIELD%CMNHNAME = 'RARE' - TZFIELD%CSTDNAME = 'equivalent_reflectivity_factor' - TZFIELD%CLONGNAME = 'RARE' - TZFIELD%CUNITS = 'dBZ' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_RAdar REflectivity' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'RARE', & + CSTDNAME = 'equivalent_reflectivity_factor', & + CLONGNAME = 'RARE', & + CUNITS = 'dBZ', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_RAdar REflectivity', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) ! - TZFIELD%CMNHNAME = 'VDOP' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'VDOP' - TZFIELD%CUNITS = 'm s-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_radar DOPpler fall speed' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'VDOP', & + CSTDNAME = '', & + CLONGNAME = 'VDOP', & + CUNITS = 'm s-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_radar DOPpler fall speed', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK32) ! - TZFIELD%CMNHNAME = 'ZDR' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'ZDR' - TZFIELD%CUNITS = 'dBZ' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_Differential polar Reflectivity' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'ZDR', & + CSTDNAME = '', & + CLONGNAME = 'ZDR', & + CUNITS = 'dBZ', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_Differential polar Reflectivity', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK33) ! - TZFIELD%CMNHNAME = 'KDP' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'KDP' - TZFIELD%CUNITS = 'degree km-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_Differential Phase Reflectivity' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'KDP', & + CSTDNAME = '', & + CLONGNAME = 'KDP', & + CUNITS = 'degree km-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_Differential Phase Reflectivity', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK34) ! ELSE @@ -4009,28 +4032,30 @@ IF (LLIDAR) THEN IF( ALLOCATED(ZTMP3) ) DEALLOCATE(ZTMP3) IF( ALLOCATED(ZTMP4) ) DEALLOCATE(ZTMP4) ! - TZFIELD%CMNHNAME = 'LIDAR' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'LIDAR' - TZFIELD%CUNITS = 'm-1 sr-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_Normalized_Lidar_Profile' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'LIDAR', & + CSTDNAME = '', & + CLONGNAME = 'LIDAR', & + CUNITS = 'm-1 sr-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_Normalized_Lidar_Profile', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) ! - TZFIELD%CMNHNAME = 'LIPAR' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'LIPAR' - TZFIELD%CUNITS = 'm-1 sr-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_Particle_Lidar_Profile' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'LIPAR', & + CSTDNAME = '', & + CLONGNAME = 'LIPAR', & + CUNITS = 'm-1 sr-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_Particle_Lidar_Profile', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK32) ! END IF @@ -4065,16 +4090,17 @@ IF (CBLTOP == 'THETA') THEN ZSHMIX(:,:)=ZSHMIX(:,:)-XZS(:,:) ZSHMIX(:,:)=MAX(ZSHMIX(:,:),50.0) ! - TZFIELD%CMNHNAME = 'HBLTOP' - TZFIELD%CSTDNAME = 'atmosphere_boundary_layer_thickness' - TZFIELD%CLONGNAME = 'HBLTOP' - TZFIELD%CUNITS = 'm' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'Height of Boundary Layer TOP' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 2 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'HBLTOP', & + CSTDNAME = 'atmosphere_boundary_layer_thickness', & + CLONGNAME = 'HBLTOP', & + CUNITS = 'm', & + CDIR = 'XY', & + CCOMMENT = 'Height of Boundary Layer TOP', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZSHMIX) ! DEALLOCATE(ZSHMIX) @@ -4109,26 +4135,21 @@ ELSEIF (CBLTOP == 'RICHA') THEN END DO ZSHMIX(:,:)=ZSHMIX(:,:)-XZS(:,:) ! - TZFIELD%CMNHNAME = 'HBLTOP' - TZFIELD%CSTDNAME = 'atmosphere_boundary_layer_thickness' - TZFIELD%CLONGNAME = 'HBLTOP' - TZFIELD%CUNITS = 'm' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'Height of Boundary Layer TOP' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 2 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'HBLTOP', & + CSTDNAME = 'atmosphere_boundary_layer_thickness', & + CLONGNAME = 'HBLTOP', & + CUNITS = 'm', & + CDIR = 'XY', & + CCOMMENT = 'Height of Boundary Layer TOP', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZSHMIX) ! DEALLOCATE(ZRIB,ZSHMIX) ENDIF - ! used before 5-3-1 version - ! - !ZGAMREF=3.5E-3 ! K/m - !ZWORK31(:,:,1:IKU-1)=0.5*(XZZ(:,:,1:IKU-1)+XZZ(:,:,2:IKU)) - !ZWORK31(:,:,IKU)=2.*ZWORK31(:,:,IKU-1)-ZWORK31(:,:,IKU-2) - !CALL FREE_ATM_PROFILE(ZTHETAV,ZWORK31,XZS,XZSMT,ZGAMREF,ZWORK32,ZWORK33) ! IF (ALLOCATED(ZTHETAV)) DEALLOCATE(ZTHETAV) ! diff --git a/src/MNH/write_lfifm1_for_diag_supp.f90 b/src/MNH/write_lfifm1_for_diag_supp.f90 index 93ea1f7f17519fe5a0b47e0e23d70796f0f1489c..c0dcea59bbb086159a4290dcf47fe29f1e5e593c 100644 --- a/src/MNH/write_lfifm1_for_diag_supp.f90 +++ b/src/MNH/write_lfifm1_for_diag_supp.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2000-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2000-2022 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. @@ -90,65 +90,53 @@ END MODULE MODI_WRITE_LFIFM1_FOR_DIAG_SUPP !! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O !! J.-P. Chaboureau 07/2018 bug fix on XEMIS when calling CALL_RTTOVxx !! J.-P. Chaboureau 09/04/2021 add the call to RTTOV13 +! P. Wautelet 04/02/2022: use TSVLIST to manage metadata of scalar variables !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ ! -USE MODE_ll -USE MODD_CST -use modd_field, only: tfielddata, tfieldlist, TYPEINT, TYPEREAL -USE MODD_IO, ONLY: TFILEDATA -USE MODD_PARAMETERS -USE MODD_CONF_n -USE MODD_CONF -USE MODD_DEEP_CONVECTION_n -USE MODD_DIM_n -USE MODD_FIELD_n -USE MODD_GRID_n -USE MODD_LUNIT_n -USE MODD_PARAM_n -USE MODD_PARAM_KAFR_n -USE MODD_PARAM_RAD_n -USE MODD_RADIATIONS_n -USE MODD_TIME_n -USE MODD_TURB_n -USE MODD_REF_n, ONLY: XRHODREF -USE MODD_DIAG_FLAG -USE MODD_NSV, ONLY : NSV,NSV_USER,NSV_C2R2BEG,NSV_C2R2END, & - NSV_C1R3BEG, NSV_C1R3END,NSV_ELECBEG,NSV_ELECEND, & - NSV_CHEMBEG, NSV_CHEMEND,NSV_LGBEG, NSV_LGEND -USE MODD_CH_M9_n, ONLY: CNAMES -USE MODD_RAIN_C2R2_DESCR, ONLY: C2R2NAMES -USE MODD_ICE_C1R3_DESCR, ONLY: C1R3NAMES -USE MODD_ELEC_DESCR, ONLY: CELECNAMES -USE MODD_LG, ONLY: CLGNAMES -USE MODD_DUST, ONLY: LDUST -USE MODD_SALT, ONLY: LSALT -USE MODD_CH_AEROSOL, ONLY: LORILAM -USE MODD_CH_MNHC_n -USE MODD_CH_BUDGET_n -USE MODD_CH_PRODLOSSTOT_n +USE MODD_CH_AEROSOL, ONLY: LORILAM +USE MODD_CH_BUDGET_n, ONLY: CNAMES_BUDGET, NEQ_BUDGET, XTCHEM USE MODD_CH_FLX_n, ONLY: XCHFLX -USE MODD_RAD_TRANSF -USE MODD_DIAG_IN_RUN, ONLY: XCURRENT_ZON10M,XCURRENT_MER10M, & - XCURRENT_SFCO2,XCURRENT_SWD, XCURRENT_LWD, & - XCURRENT_SWU, XCURRENT_LWU -! -USE MODD_DYN_n -USE MODD_CURVCOR_n -USE MODD_METRICS_n -USE MODD_DIAG_BLANK -USE MODI_PINTER -USE MODI_ZINTER -USE MODI_GRADIENT_M -USE MODI_GRADIENT_W -USE MODI_GRADIENT_U -USE MODI_GRADIENT_V -USE MODI_GRADIENT_UV -! -USE MODI_SHUMAN -USE MODE_NEIGHBORAVG +USE MODD_CH_PRODLOSSTOT_n, ONLY: CNAMES_PRODLOSST, NEQ_PLT, XLOSS, XPROD +USE MODD_CST, ONLY: XCPD, XP00, XRD, XTT +USE MODD_CURVCOR_n, ONLY: XCORIOZ +USE MODD_DIAG_IN_RUN, ONLY: XCURRENT_ZON10M, XCURRENT_MER10M, & + XCURRENT_SFCO2, XCURRENT_SWD, XCURRENT_LWD, & + XCURRENT_SWU, XCURRENT_LWU +USE MODD_DUST, ONLY: LDUST +use modd_field, only: NMNHDIM_UNUSED, tfieldmetadata, tfieldlist, TYPEINT, TYPEREAL +USE MODD_IO, ONLY: TFILEDATA +USE MODD_CONF, ONLY: LCARTESIAN +USE MODD_CONF_n, ONLY: LUSERC, LUSERI, NRR +USE MODD_DEEP_CONVECTION_n, ONLY: NCLBASCONV, NCLTOPCONV, XCAPE, XDMFCONV, XDRCCONV, XDRICONV, XDRVCONV, & + XDTHCONV, XDSVCONV, XMFCONV, XPRLFLXCONV, XPRSFLXCONV, XUMFCONV +USE MODD_DIAG_FLAG, ONLY: CRAD_SAT, LCHEMDIAG, LCLD_COV, LCOARSE, LISOAL, LISOPR, LISOTH, LRAD_SUBG_COND, & + NCONV_KF, NDXCOARSE, NRAD_3D, NRTTOVINFO, XISOAL, XISOPR, XISOTH +USE MODD_FIELD_n, ONLY: XCLDFR, XICEFR, XPABST, XSIGS, XTHT, XTKET, XRT, XUT, XVT, XWT +USE MODD_GRID_n, ONLY: XZHAT, XZZ +USE MODD_METRICS_n, ONLY: XDXX, XDYY, XDZX, XDZY, XDZZ +USE MODD_NSV, ONLY: NSV, NSV_CHEMBEG, NSV_CHEMEND, TSVLIST +USE MODD_PARAMETERS, ONLY: JPVEXT, NUNDEF, XUNDEF +USE MODD_PARAM_KAFR_n, ONLY: LCHTRANS +USE MODD_PARAM_n, ONLY: CRAD, CSURF +USE MODD_PARAM_RAD_n, only: NRAD_COLNBR +USE MODD_RADIATIONS_N, ONLY: NCLEARCOL_TM1, NDLON, NFLEV, NSTATM, & + XAER, XAZIM, XCCO2, XDIR_ALB, XDIRFLASWD, XDIRSRFSWD, XDTHRAD, XEMIS, & + XFLALWD, XSCA_ALB, XSCAFLASWD, XSTATM, XTSRAD, XZENITH +USE MODD_RAD_TRANSF, ONLY: JPGEOST +USE MODD_REF_n, ONLY: XRHODREF +USE MODD_SALT, ONLY: LSALT +USE MODD_TIME_n, ONLY: TDTCUR +USE MODD_TURB_n, ONLY: LSIGMAS, LSUBG_COND, VSIGQSAT + +use mode_field, only: Find_field_id_from_mnhname +USE MODE_IO_FIELD_WRITE, only: IO_Field_write +USE MODE_MSG +USE MODE_NEIGHBORAVG, ONLY: BLOCKAVG, MOVINGAVG +USE MODE_TOOLS_LL, ONLY: GET_INDICE_ll + #ifdef MNH_RTTOV_8 USE MODI_CALL_RTTOV8 #endif @@ -158,14 +146,18 @@ USE MODI_CALL_RTTOV11 #ifdef MNH_RTTOV_13 USE MODI_CALL_RTTOV13 #endif +USE MODI_GET_SURF_UNDEF +USE MODI_GRADIENT_M +USE MODI_GRADIENT_U +USE MODI_GRADIENT_UV +USE MODI_GRADIENT_V +USE MODI_GRADIENT_W +USE MODI_PINTER +USE MODI_SHUMAN USE MODI_RADTR_SATEL USE MODI_UV_TO_ZONAL_AND_MERID -! -use mode_field, only: Find_field_id_from_mnhname -USE MODE_IO_FIELD_WRITE, only: IO_Field_write -! -USE MODI_GET_SURF_UNDEF -! +USE MODI_ZINTER + IMPLICIT NONE ! !* 0.1 Declarations of arguments @@ -208,8 +200,8 @@ REAL, DIMENSION(:), ALLOCATABLE :: ZTH REAL,DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3)) :: ZPOVO REAL,DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3)) :: ZVOX,ZVOY,ZVOZ REAL,DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3)) :: ZCORIOZ -TYPE(TFIELDDATA) :: TZFIELD -TYPE(TFIELDDATA),DIMENSION(2) :: TZFIELD2 +TYPE(TFIELDMETADATA) :: TZFIELD +TYPE(TFIELDMETADATA), DIMENSION(2) :: TZFIELD2 ! ! variables needed for altitude interpolation INTEGER :: IAL @@ -246,7 +238,6 @@ ZTEMP(:,:,:)=XTHT(:,:,:)*(XPABST(:,:,:)/ XP00) **(XRD/XCPD) !* Diagnostic variables related to deep convection ! IF (NCONV_KF >= 0) THEN -! CALL IO_Field_write(TPFILE,'CAPE',XCAPE) ! ! top height (km) of convective clouds @@ -256,16 +247,17 @@ IF (NCONV_KF >= 0) THEN IF (NCLTOPCONV(JI,JJ)/=0) ZWORK21(JI,JJ)= XZZ(JI,JJ,NCLTOPCONV(JI,JJ))/1.E3 END DO END DO - TZFIELD%CMNHNAME = 'CLTOPCONV' - TZFIELD%CSTDNAME = 'convective_cloud_top_altitude' - TZFIELD%CLONGNAME = 'CLTOPCONV' - TZFIELD%CUNITS = 'km' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Top of Convective Cloud' - TZFIELD%NGRID = 4 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 2 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'CLTOPCONV', & + CSTDNAME = 'convective_cloud_top_altitude', & + CLONGNAME = 'CLTOPCONV', & + CUNITS = 'km', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Top of Convective Cloud', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21) ! ! base height (km) of convective clouds @@ -275,132 +267,47 @@ IF (NCONV_KF >= 0) THEN IF (NCLBASCONV(JI,JJ)/=0) ZWORK21(JI,JJ)= XZZ(JI,JJ,NCLBASCONV(JI,JJ))/1.E3 END DO END DO - TZFIELD%CMNHNAME = 'CLBASCONV' - TZFIELD%CSTDNAME = 'convective_cloud_base_altitude' - TZFIELD%CLONGNAME = 'CLBASCONV' - TZFIELD%CUNITS = 'km' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Base of Convective Cloud' - TZFIELD%NGRID = 4 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 2 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'CLBASCONV', & + CSTDNAME = 'convective_cloud_base_altitude', & + CLONGNAME = 'CLBASCONV', & + CUNITS = 'km', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Base of Convective Cloud', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21) -! END IF + IF (NCONV_KF >= 1) THEN -! CALL IO_Field_write(TPFILE,'DTHCONV',XDTHCONV) CALL IO_Field_write(TPFILE,'DRVCONV',XDRVCONV) CALL IO_Field_write(TPFILE,'DRCCONV',XDRCCONV) CALL IO_Field_write(TPFILE,'DRICONV',XDRICONV) -! +! IF ( LCHTRANS .AND. NSV > 0 ) THEN - ! User scalar variables - IF (NSV_USER>0) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 's-1' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = 1, NSV_USER - WRITE(TZFIELD%CMNHNAME,'(A7,I3.3)')'DSVCONV',JSV - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A2,I3.3,A20)')'X_Y_Z_','SV',JSV,' CONVective tendency' - CALL IO_Field_write(TPFILE,TZFIELD,XDSVCONV(:,:,:,JSV)) - END DO - END IF - ! microphysical C2R2 scheme scalar variables - IF (NSV_C2R2END>=NSV_C2R2BEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 's-1' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_C2R2BEG, NSV_C2R2END - TZFIELD%CMNHNAME = 'DSVCONV_'//TRIM(C2R2NAMES(JSV-NSV_C2R2BEG+1)) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CCOMMENT = 'X_Y_Z_'//TRIM(C2R2NAMES(JSV-NSV_C2R2BEG+1))//' CONVective tendency' - CALL IO_Field_write(TPFILE,TZFIELD,XDSVCONV(:,:,:,JSV)) - END DO - END IF - ! microphysical C3R5 scheme additional scalar variables - IF (NSV_C1R3END>=NSV_C1R3BEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 's-1' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_C1R3BEG,NSV_C1R3END - TZFIELD%CMNHNAME = 'DSVCONV_'//TRIM(C1R3NAMES(JSV-NSV_C1R3BEG+1)) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CCOMMENT = 'X_Y_Z_'//TRIM(C1R3NAMES(JSV-NSV_C1R3BEG+1))//' CONVective tendency' - CALL IO_Field_write(TPFILE,TZFIELD,XDSVCONV(:,:,:,JSV)) - END DO - END IF - ! electrical scalar variables - IF (NSV_ELECEND>=NSV_ELECBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 's-1' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_ELECBEG,NSV_ELECEND - TZFIELD%CMNHNAME = 'DSVCONV_'//TRIM(CELECNAMES(JSV-NSV_ELECBEG+1)) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CCOMMENT = 'X_Y_Z_'//TRIM(CELECNAMES(JSV-NSV_ELECBEG+1))//' CONVective tendency' - CALL IO_Field_write(TPFILE,TZFIELD,XDSVCONV(:,:,:,JSV)) - END DO - END IF - ! chemical scalar variables - IF (NSV_CHEMEND>=NSV_CHEMBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 's-1' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_CHEMBEG, NSV_CHEMEND - TZFIELD%CMNHNAME = 'DSVCONV_'//TRIM(CNAMES(JSV-NSV_CHEMBEG+1)) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CCOMMENT = 'X_Y_Z_'//TRIM(CNAMES(JSV-NSV_CHEMBEG+1))//' CONVective tendency' - CALL IO_Field_write(TPFILE,TZFIELD,XDSVCONV(:,:,:,JSV)) - END DO - END IF - ! lagrangian variables - IF (NSV_LGEND>=NSV_LGBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 's-1' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_LGBEG,NSV_LGEND - TZFIELD%CMNHNAME = 'DSVCONV_'//TRIM(CLGNAMES(JSV-NSV_LGBEG+1)) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CCOMMENT = 'X_Y_Z_'//TRIM(CLGNAMES(JSV-NSV_LGBEG+1))//' CONVective tendency' - CALL IO_Field_write(TPFILE,TZFIELD,XDSVCONV(:,:,:,JSV)) - END DO - END IF + ! scalar variables are recorded + ! individually in the file + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'generic for DSVCONV', & !Temporary name to ease identification + CUNITS = 's-1', & + CDIR = 'XY', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) + + DO JSV = 1, NSV + TZFIELD%CMNHNAME = 'DSVCONV_' // TRIM( TSVLIST(JSV)%CMNHNAME ) + TZFIELD%CLONGNAME = 'DSVCONV_' // TRIM( TSVLIST(JSV)%CLONGNAME ) + TZFIELD%CCOMMENT = 'Convective tendency for ' // TRIM( TSVLIST(JSV)%CMNHNAME ) + CALL IO_Field_write( TPFILE, TZFIELD, XDSVCONV(:,:,:,JSV) ) + END DO END IF -! END IF + IF (NCONV_KF >= 2) THEN CALL IO_Field_write(TPFILE,'PRLFLXCONV',XPRLFLXCONV) CALL IO_Field_write(TPFILE,'PRSFLXCONV',XPRSFLXCONV) @@ -456,16 +363,17 @@ IF (LCLD_COV .AND. LUSERC) THEN ! 0 if there is no cloud ZWORK21(:,:)=ZWORK21(:,:)/1.E3 ! height (km) of explicit clouds ! - TZFIELD%CMNHNAME = 'HECL' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'HECL' - TZFIELD%CUNITS = 'km' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Height of Explicit CLoud top' - TZFIELD%NGRID = 4 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 2 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'HECL', & + CSTDNAME = '', & + CLONGNAME = 'HECL', & + CUNITS = 'km', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Height of Explicit CLoud top', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21) ! ! Higher top of the different species of clouds @@ -493,29 +401,31 @@ IF (LCLD_COV .AND. LUSERC) THEN ! 0 if there is no cloud ZWORK21(:,:)=ZWORK21(:,:)/1.E3 ! max. cloud height (km) ! - TZFIELD%CMNHNAME = 'HCL' - TZFIELD%CSTDNAME = 'cloud_top_altitude' - TZFIELD%CLONGNAME = 'HCL' - TZFIELD%CUNITS = 'km' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Height of CLoud top' - TZFIELD%NGRID = 4 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 2 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'HCL', & + CSTDNAME = 'cloud_top_altitude', & + CLONGNAME = 'HCL', & + CUNITS = 'km', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Height of CLoud top', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21) ENDIF ! - TZFIELD%CMNHNAME = 'TCL' - TZFIELD%CSTDNAME = 'air_temperature_at_cloud_top' - TZFIELD%CLONGNAME = 'TCL' - TZFIELD%CUNITS = 'celsius' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Height of CLoud top' - TZFIELD%NGRID = 4 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 2 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'TCL', & + CSTDNAME = 'air_temperature_at_cloud_top', & + CLONGNAME = 'TCL', & + CUNITS = 'celsius', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Height of CLoud top', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK22) ! CALL IO_Field_write(TPFILE,'CLDFR',XCLDFR) @@ -528,16 +438,17 @@ IF (LCLD_COV .AND. LUSERC) THEN ZWORK31(:,:,:)=3.9E3/(144.7*(XRHODREF(:,:,:)*1.E3*XRT(:,:,:,2)/(1.+XRT(:,:,:,2)))**0.88) END WHERE ! - TZFIELD%CMNHNAME = 'VISI_HOR' - TZFIELD%CSTDNAME = 'visibility_in_air' - TZFIELD%CLONGNAME = 'VISI_HOR' - TZFIELD%CUNITS = 'm' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_VISI_HOR' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'VISI_HOR', & + CSTDNAME = 'visibility_in_air', & + CLONGNAME = 'VISI_HOR', & + CUNITS = 'm', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_VISI_HOR', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) ! DEALLOCATE(IWORK1,IWORK2,ICL_HE_ST,GMASK2,ZWORK22) @@ -563,8 +474,10 @@ IF (NRAD_3D >= 0) THEN ! CALL PRINT_MSG(NVERB_INFO,'IO','WRITE_LFIFM1_FOR_DIAG_SUPP','EMIS: writing only first band') CALL FIND_FIELD_ID_FROM_MNHNAME('EMIS',IID,IRESP) - TZFIELD = TFIELDLIST(IID) + TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) TZFIELD%NDIMS = 2 + TZFIELD%NDIMLIST(3) = TZFIELD%NDIMLIST(4) + TZFIELD%NDIMLIST(4) = NMNHDIM_UNUSED CALL IO_Field_write(TPFILE,TZFIELD,XEMIS(:,:,1)) ! CALL IO_Field_write(TPFILE,'TSRAD', XTSRAD) @@ -581,16 +494,17 @@ IF (NRAD_3D >= 1) THEN IKRAD = JK - JPVEXT ZWORK31(:,:,JK)= XAER(:,:,IKRAD,3) END DO - TZFIELD%CMNHNAME = 'DSTAOD3D' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'DSTAOD3D' - TZFIELD%CUNITS = 'm' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_DuST Aerosol Optical Depth' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'DSTAOD3D', & + CSTDNAME = '', & + CLONGNAME = 'DSTAOD3D', & + CUNITS = 'm', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_DuST Aerosol Optical Depth', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) !Dust optical depth ZWORK21(:,:)=0.0 @@ -602,32 +516,34 @@ IF (NRAD_3D >= 1) THEN ENDDO ENDDO ENDDO - TZFIELD%CMNHNAME = 'DSTAOD2D' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'DSTAOD2D' - TZFIELD%CUNITS = 'm' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_DuST Aerosol Optical Depth' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 2 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'DSTAOD2D', & + CSTDNAME = '', & + CLONGNAME = 'DSTAOD2D', & + CUNITS = 'm', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_DuST Aerosol Optical Depth', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21) !Dust extinction (optical depth per km) DO JK=IKB,IKE IKRAD = JK - JPVEXT ZWORK31(:,:,JK)= XAER(:,:,IKRAD,3)/(XZZ(:,:,JK+1)-XZZ(:,:,JK))*1.D3 ENDDO - TZFIELD%CMNHNAME = 'DSTEXT' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'DSTEXT' - TZFIELD%CUNITS = 'km-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_DuST EXTinction' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'DSTEXT', & + CSTDNAME = '', & + CLONGNAME = 'DSTEXT', & + CUNITS = 'km-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_DuST EXTinction', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) END IF IF (LSALT) THEN @@ -637,16 +553,17 @@ IF (NRAD_3D >= 1) THEN IKRAD = JK - JPVEXT ZWORK31(:,:,JK)= XAER(:,:,IKRAD,2) END DO - TZFIELD%CMNHNAME = 'SLTAOD3D' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'SLTAOD3D' - TZFIELD%CUNITS = 'm' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_Salt Aerosol Optical Depth' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'SLTAOD3D', & + CSTDNAME = '', & + CLONGNAME = 'SLTAOD3D', & + CUNITS = 'm', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_Salt Aerosol Optical Depth', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) !Salt optical depth ZWORK21(:,:)=0.0 @@ -658,32 +575,34 @@ IF (NRAD_3D >= 1) THEN ENDDO ENDDO ENDDO - TZFIELD%CMNHNAME = 'SLTAOD2D' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'SLTAOD2D' - TZFIELD%CUNITS = 'm' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Salt Aerosol Optical Depth' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 2 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'SLTAOD2D', & + CSTDNAME = '', & + CLONGNAME = 'SLTAOD2D', & + CUNITS = 'm', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Salt Aerosol Optical Depth', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21) !Salt extinction (optical depth per km) DO JK=IKB,IKE IKRAD = JK - JPVEXT ZWORK31(:,:,JK)= XAER(:,:,IKRAD,2)/(XZZ(:,:,JK+1)-XZZ(:,:,JK))*1.D3 ENDDO - TZFIELD%CMNHNAME = 'SLTEXT' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'SLTEXT' - TZFIELD%CUNITS = 'km-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_Salt EXTinction' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'SLTEXT', & + CSTDNAME = '', & + CLONGNAME = 'SLTEXT', & + CUNITS = 'km-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_Salt EXTinction', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) END IF IF (LORILAM) THEN @@ -693,16 +612,17 @@ IF (NRAD_3D >= 1) THEN IKRAD = JK - JPVEXT ZWORK31(:,:,JK)= XAER(:,:,IKRAD,4) END DO - TZFIELD%CMNHNAME = 'AERAOD3D' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'AERAOD3D' - TZFIELD%CUNITS = 'm' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_Anthropogenic Aerosol Optical Depth' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'AERAOD3D', & + CSTDNAME = '', & + CLONGNAME = 'AERAOD3D', & + CUNITS = 'm', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_Anthropogenic Aerosol Optical Depth', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) !Orilam anthropogenic optical depth ZWORK21(:,:)=0.0 @@ -714,54 +634,54 @@ IF (NRAD_3D >= 1) THEN ENDDO ENDDO ENDDO - TZFIELD%CMNHNAME = 'AERAOD2D' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'AERAOD2D' - TZFIELD%CUNITS = 'm' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Anthropogenic Aerosol Optical Depth' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 2 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'AERAOD2D', & + CSTDNAME = '', & + CLONGNAME = 'AERAOD2D', & + CUNITS = 'm', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Anthropogenic Aerosol Optical Depth', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21) !Orilam anthropogenic extinction (optical depth per km) DO JK=IKB,IKE IKRAD = JK - JPVEXT ZWORK31(:,:,JK)= XAER(:,:,IKRAD,4)/(XZZ(:,:,JK+1)-XZZ(:,:,JK))*1.D3 ENDDO - TZFIELD%CMNHNAME = 'AEREXT' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'AEREXT' - TZFIELD%CUNITS = 'km-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_Anthropogenic EXTinction' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'AEREXT', & + CSTDNAME = '', & + CLONGNAME = 'AEREXT', & + CUNITS = 'km-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_Anthropogenic EXTinction', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) END IF END IF ! !------------------------------------------------------------------------------- ! Net surface gaseous fluxes -!print*,'LCHEMDIAG, NSV_CHEMBEG, NSV_CHEMEND=',& -!LCHEMDIAG, NSV_CHEMBEG, NSV_CHEMEND - IF (LCHEMDIAG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppb m s-1' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 2 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'generic for net chemical flux', & !Temporary name to ease identification + CUNITS = 'ppb m s-1', & + CDIR = 'XY', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) ! DO JSV = NSV_CHEMBEG, NSV_CHEMEND - TZFIELD%CMNHNAME = 'FLX_'//TRIM(CNAMES(JSV-NSV_CHEMBEG+1)) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A,A)')'X_Y_Z_',TRIM(CNAMES(JSV-NSV_CHEMBEG+1)),' Net chemical flux' + TZFIELD%CMNHNAME = 'FLX_' // TRIM( TSVLIST(JSV)%CMNHNAME ) + TZFIELD%CLONGNAME = 'FLX_' // TRIM( TSVLIST(JSV)%CLONGNAME ) + WRITE(TZFIELD%CCOMMENT,'(A6,A,A)')'X_Y_Z_',TRIM( TSVLIST(JSV)%CMNHNAME ),' Net chemical flux' CALL IO_Field_write(TPFILE,TZFIELD,XCHFLX(:,:,JSV-NSV_CHEMBEG+1) * 1E9) END DO END IF @@ -813,28 +733,30 @@ IF (LEN_TRIM(CRAD_SAT) /= 0 .AND. NRR /=0) THEN LSUBG_COND, LRAD_SUBG_COND, ZIRBT, ZWVBT, & INDGEO(JI), VSIGQSAT ) ! - TZFIELD%CMNHNAME = TRIM(YNAM_SAT(JI))//'_IRBT' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'K' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = TRIM(YNAM_SAT(JI))//' Infra-Red Brightness Temperature' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 2 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = TRIM(YNAM_SAT(JI))//'_IRBT', & + CSTDNAME = '', & + CLONGNAME = TRIM(YNAM_SAT(JI))//'_IRBT', & + CUNITS = 'K', & + CDIR = 'XY', & + CCOMMENT = TRIM(YNAM_SAT(JI))//' Infra-Red Brightness Temperature', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZIRBT) ! - TZFIELD%CMNHNAME = TRIM(YNAM_SAT(JI))//'_WVBT' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'K' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = TRIM(YNAM_SAT(JI))//' Water-Vapor Brightness Temperature' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 2 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = TRIM(YNAM_SAT(JI))//'_WVBT', & + CSTDNAME = '', & + CLONGNAME = TRIM(YNAM_SAT(JI))//'_WVBT', & + CUNITS = 'K', & + CDIR = 'XY', & + CCOMMENT = TRIM(YNAM_SAT(JI))//' Water-Vapor Brightness Temperature', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWVBT) END DO DEALLOCATE(ZIRBT,ZWVBT) @@ -900,138 +822,148 @@ IF (CSURF=='EXTE') THEN ! in this case (argument KGRID=0), input winds are ZONal and MERidian ! and, output ones are in MesoNH grid IF (.NOT. LCARTESIAN) THEN - TZFIELD2(1)%CMNHNAME = 'UM10' - TZFIELD2(1)%CSTDNAME = '' - TZFIELD2(1)%CLONGNAME = 'UM10' - TZFIELD2(1)%CUNITS = 'm s-1' - TZFIELD2(1)%CDIR = 'XY' - TZFIELD2(1)%CCOMMENT = 'Zonal wind at 10m' - TZFIELD2(1)%NGRID = 1 - TZFIELD2(1)%NTYPE = TYPEREAL - TZFIELD2(1)%NDIMS = 2 - TZFIELD2(1)%LTIMEDEP = .TRUE. + TZFIELD2(1) = TFIELDMETADATA( & + CMNHNAME = 'UM10', & + CSTDNAME = '', & + CLONGNAME = 'UM10', & + CUNITS = 'm s-1', & + CDIR = 'XY', & + CCOMMENT = 'Zonal wind at 10m', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) ! - TZFIELD2(2)%CMNHNAME = 'VM10' - TZFIELD2(2)%CSTDNAME = '' - TZFIELD2(2)%CLONGNAME = 'VM10' - TZFIELD2(2)%CUNITS = 'm s-1' - TZFIELD2(2)%CDIR = 'XY' - TZFIELD2(2)%CCOMMENT = 'Meridian wind at 10m' - TZFIELD2(2)%NGRID = 1 - TZFIELD2(2)%NTYPE = TYPEREAL - TZFIELD2(2)%NDIMS = 2 - TZFIELD2(2)%LTIMEDEP = .TRUE. + TZFIELD2(2) = TFIELDMETADATA( & + CMNHNAME = 'VM10', & + CSTDNAME = '', & + CLONGNAME = 'VM10', & + CUNITS = 'm s-1', & + CDIR = 'XY', & + CCOMMENT = 'Meridian wind at 10m', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) ! CALL UV_TO_ZONAL_AND_MERID(XCURRENT_ZON10M,XCURRENT_MER10M,KGRID=0,TPFILE=TPFILE,TZFIELDS=TZFIELD2) ELSE - TZFIELD%CMNHNAME = 'UM10' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'UM10' - TZFIELD%CUNITS = 'm s-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'Zonal wind at 10m' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 2 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'UM10', & + CSTDNAME = '', & + CLONGNAME = 'UM10', & + CUNITS = 'm s-1', & + CDIR = 'XY', & + CCOMMENT = 'Zonal wind at 10m', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,XCURRENT_ZON10M) ! - TZFIELD%CMNHNAME = 'VM10' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'VM10' - TZFIELD%CUNITS = 'm s-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'Meridian wind at 10m' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 2 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'VM10', & + CSTDNAME = '', & + CLONGNAME = 'VM10', & + CUNITS = 'm s-1', & + CDIR = 'XY', & + CCOMMENT = 'Meridian wind at 10m', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,XCURRENT_MER10M) ENDIF ! IF (SIZE(XTKET)>0) THEN ZWORK21(:,:) = SQRT(XCURRENT_ZON10M(:,:)**2+XCURRENT_MER10M(:,:)**2) ZWORK21(:,:) = ZWORK21(:,:) + 4. * SQRT(XTKET(:,:,IKB)) - TZFIELD%CMNHNAME = 'FF10MAX' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'FF10MAX' - TZFIELD%CUNITS = 'm s-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_FF10MAX' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 2 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'FF10MAX', & + CSTDNAME = '', & + CLONGNAME = 'FF10MAX', & + CUNITS = 'm s-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_FF10MAX', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21) END IF ! IF(ANY(XCURRENT_SFCO2/=XUNDEF))THEN - TZFIELD%CMNHNAME = 'SFCO2' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'SFCO2' - TZFIELD%CUNITS = 'mg m-2 s-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'CO2 Surface flux' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 2 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'SFCO2', & + CSTDNAME = '', & + CLONGNAME = 'SFCO2', & + CUNITS = 'mg m-2 s-1', & + CDIR = 'XY', & + CCOMMENT = 'CO2 Surface flux', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,XCURRENT_SFCO2) END IF ! IF(ANY(XCURRENT_SWD/=XUNDEF))THEN - TZFIELD%CMNHNAME = 'SWD' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'SWD' - TZFIELD%CUNITS = 'W m-2' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'incoming ShortWave at the surface' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 2 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'SWD', & + CSTDNAME = '', & + CLONGNAME = 'SWD', & + CUNITS = 'W m-2', & + CDIR = 'XY', & + CCOMMENT = 'incoming ShortWave at the surface', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,XCURRENT_SWD) END IF ! IF(ANY(XCURRENT_SWU/=XUNDEF))THEN - TZFIELD%CMNHNAME = 'SWU' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'SWU' - TZFIELD%CUNITS = 'W m-2' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'outcoming ShortWave at the surface' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 2 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'SWU', & + CSTDNAME = '', & + CLONGNAME = 'SWU', & + CUNITS = 'W m-2', & + CDIR = 'XY', & + CCOMMENT = 'outcoming ShortWave at the surface', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,XCURRENT_SWU) END IF ! IF(ANY(XCURRENT_LWD/=XUNDEF))THEN - TZFIELD%CMNHNAME = 'LWD' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'LWD' - TZFIELD%CUNITS = 'W m-2' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'incoming LongWave at the surface' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 2 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'LWD', & + CSTDNAME = '', & + CLONGNAME = 'LWD', & + CUNITS = 'W m-2', & + CDIR = 'XY', & + CCOMMENT = 'incoming LongWave at the surface', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,XCURRENT_LWD) END IF ! IF(ANY(XCURRENT_LWU/=XUNDEF))THEN - TZFIELD%CMNHNAME = 'LWU' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'LWU' - TZFIELD%CUNITS = 'W m-2' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'outcoming LongWave at the surface' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 2 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'LWU', & + CSTDNAME = '', & + CLONGNAME = 'LWU', & + CUNITS = 'W m-2', & + CDIR = 'XY', & + CCOMMENT = 'outcoming LongWave at the surface', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,XCURRENT_LWU) END IF END IF @@ -1071,12 +1003,14 @@ ALLOCATE(ZWORK34(IIU,IJU,IKU)) END DO PRINT *,'PRESSURE LEVELS WHERE TO INTERPOLATE=',ZPRES(1,1,:) ! - TZFIELD%CSTDNAME = '' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 2 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA(& + CMNHNAME = 'variables at pressure levels', & !Temporary name to ease identification + CSTDNAME = '', & + CDIR = 'XY', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) ! ! !* Standard Variables @@ -1176,12 +1110,14 @@ ALLOCATE(ZWORK34(IIU,IJU,IKU)) PRINT *,'POTENTIAL TEMPERATURE LEVELS WHERE TO INTERPOLATE=',ZTH(:) ! - TZFIELD%CSTDNAME = '' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 2 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA(& + CMNHNAME = 'variables at pot. temp. levels', & !Temporary name to ease identification + CSTDNAME = '', & + CDIR = 'XY', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) ! ! !* Standard Variables @@ -1278,16 +1214,17 @@ IF (LISOAL .AND.XISOAL(1)/=0.) THEN ! ********************* ! Altitude ! ********************* - TZFIELD%CMNHNAME = 'ALT_ALT' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'ALT_ALT' - TZFIELD%CUNITS = 'm' - TZFIELD%CDIR = '--' - TZFIELD%CCOMMENT = 'Z_alt ALT' - TZFIELD%NGRID = 0 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 1 - TZFIELD%LTIMEDEP = .FALSE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'ALT_ALT', & + CSTDNAME = '', & + CLONGNAME = 'ALT_ALT', & + CUNITS = 'm', & + CDIR = '--', & + CCOMMENT = 'Z_alt ALT', & + NGRID = 0, & + NTYPE = TYPEREAL, & + NDIMS = 1, & + LTIMEDEP = .FALSE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZAL) ! !* Standard Variables @@ -1301,16 +1238,17 @@ IF (LISOAL .AND.XISOAL(1)/=0.) THEN ZWORK31(:,:,:) = ZWORK31(:,:,:)*1.E3 CALL ZINTER(ZWORK31, XZZ, ZWAL, ZAL, IIU, IJU, IKU, IKB, IAL, XUNDEF) WHERE(ZWAL.EQ.XUNDEF) ZWAL=ZFILLVAL - TZFIELD%CMNHNAME = 'ALT_CLOUD' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'ALT_CLOUD' - TZFIELD%CUNITS = 'g kg-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_cloud ALT' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'ALT_CLOUD', & + CSTDNAME = '', & + CLONGNAME = 'ALT_CLOUD', & + CUNITS = 'g kg-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_cloud ALT', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWAL) ! ********************* ! Precipitation @@ -1323,48 +1261,51 @@ IF (LISOAL .AND.XISOAL(1)/=0.) THEN ZWORK31(:,:,:) = ZWORK31(:,:,:)*1.E3 CALL ZINTER(ZWORK31, XZZ, ZWAL, ZAL, IIU, IJU, IKU, IKB, IAL, XUNDEF) WHERE(ZWAL.EQ.XUNDEF) ZWAL=ZFILLVAL - TZFIELD%CMNHNAME = 'ALT_PRECIP' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'ALT_PRECIP' - TZFIELD%CUNITS = 'g kg-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_precipitation ALT' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'ALT_PRECIP', & + CSTDNAME = '', & + CLONGNAME = 'ALT_PRECIP', & + CUNITS = 'g kg-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_precipitation ALT', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWAL) ! ********************* ! Potential temperature ! ********************* CALL ZINTER(XTHT, XZZ, ZWAL, ZAL, IIU, IJU, IKU, IKB, IAL, XUNDEF) WHERE(ZWAL.EQ.XUNDEF) ZWAL=ZFILLVAL - TZFIELD%CMNHNAME = 'ALT_THETA' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'ALT_THETA' - TZFIELD%CUNITS = 'K' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_potential temperature ALT' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'ALT_THETA', & + CSTDNAME = '', & + CLONGNAME = 'ALT_THETA', & + CUNITS = 'K', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_potential temperature ALT', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWAL) ! ********************* ! Pressure ! ********************* CALL ZINTER(XPABST, XZZ, ZWAL, ZAL, IIU, IJU, IKU, IKB, IAL, XUNDEF) WHERE(ZWAL.EQ.XUNDEF) ZWAL=ZFILLVAL - TZFIELD%CMNHNAME = 'ALT_PRESSURE' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'ALT_PRESSURE' - TZFIELD%CUNITS = 'Pa' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_pressure ALT' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'ALT_PRESSURE', & + CSTDNAME = '', & + CLONGNAME = 'ALT_PRESSURE', & + CUNITS = 'Pa', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_pressure ALT', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWAL) ! ********************* ! Potential Vorticity @@ -1388,16 +1329,17 @@ IF (LISOAL .AND.XISOAL(1)/=0.) THEN ZPOVO(:,:,IKU)=-1.E+11 CALL ZINTER(ZPOVO, XZZ, ZWAL, ZAL, IIU, IJU, IKU, IKB, IAL, XUNDEF) WHERE(ZWAL.EQ.XUNDEF) ZWAL=ZFILLVAL - TZFIELD%CMNHNAME = 'ALT_PV' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'ALT_PV' - TZFIELD%CUNITS = 'PVU' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Potential Vorticity ALT' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'ALT_PV', & + CSTDNAME = '', & + CLONGNAME = 'ALT_PV', & + CUNITS = 'PVU', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Potential Vorticity ALT', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWAL) ! ********************* ! Wind @@ -1405,31 +1347,33 @@ IF (LISOAL .AND.XISOAL(1)/=0.) THEN ZWORK31(:,:,:) = MXF(XUT(:,:,:)) CALL ZINTER(ZWORK31, XZZ, ZWAL, ZAL, IIU, IJU, IKU, IKB, IAL, XUNDEF) WHERE(ZWAL.EQ.XUNDEF) ZWAL=ZFILLVAL - TZFIELD%CMNHNAME = 'ALT_U' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'ALT_U' - TZFIELD%CUNITS = 'm s-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_U component of wind ALT' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'ALT_U', & + CSTDNAME = '', & + CLONGNAME = 'ALT_U', & + CUNITS = 'm s-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_U component of wind ALT', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWAL) ! ZWORK31(:,:,:) = MYF(XVT(:,:,:)) CALL ZINTER(ZWORK31, XZZ, ZWAL, ZAL, IIU, IJU, IKU, IKB, IAL, XUNDEF) WHERE(ZWAL.EQ.XUNDEF) ZWAL=ZFILLVAL - TZFIELD%CMNHNAME = 'ALT_V' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'ALT_V' - TZFIELD%CUNITS = 'm s-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_V component of wind ALT' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'ALT_V', & + CSTDNAME = '', & + CLONGNAME = 'ALT_V', & + CUNITS = 'm s-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_V component of wind ALT', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWAL) ! ********************* ! Dust extinction (optical depth per km) @@ -1441,16 +1385,17 @@ IF (LISOAL .AND.XISOAL(1)/=0.) THEN ENDDO CALL ZINTER(ZWORK31, XZZ, ZWAL, ZAL, IIU, IJU, IKU, IKB, IAL, XUNDEF) WHERE(ZWAL.EQ.XUNDEF) ZWAL=ZFILLVAL - TZFIELD%CMNHNAME = 'ALT_DSTEXT' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'ALT_DSTEXT' - TZFIELD%CUNITS = 'km-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_DuST EXTinction ALT' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'ALT_DSTEXT', & + CSTDNAME = '', & + CLONGNAME = 'ALT_DSTEXT', & + CUNITS = 'km-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_DuST EXTinction ALT', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWAL) END IF ! @@ -1483,16 +1428,17 @@ IF (LCOARSE) THEN CALL BLOCKAVG(XTKET,IDX,IDX,ZWORK31) ZWORK31=0.5*( ZUU_AVG+ZVV_AVG+ZWW_AVG ) + ZWORK31 WRITE (YDX,FMT='(I3.3)') IDX - TZFIELD%CMNHNAME = 'TKEBAVG'//YDX - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'TKEBAVG'//YDX - TZFIELD%CUNITS = 'm2 s-2' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'TKE_BLOCKAVG'//YDX - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'TKEBAVG'//YDX, & + CSTDNAME = '', & + CLONGNAME = 'TKEBAVG'//YDX, & + CUNITS = 'm2 s-2', & + CDIR = 'XY', & + CCOMMENT = 'TKE_BLOCKAVG'//YDX, & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) !--------------------------------- ! MOVING AVERAGE OF TKE OVER IDX+1 POINTS @@ -1513,16 +1459,17 @@ IF (LCOARSE) THEN CALL MOVINGAVG(XTKET,IDX,IDX,ZWORK31) ZWORK31=0.5*( ZUU_AVG+ZVV_AVG+ZWW_AVG ) + ZWORK31 WRITE (YDX,FMT='(I3.3)') 2*IDX+1 - TZFIELD%CMNHNAME = 'TKEMAVG'//YDX - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'TKEMAVG'//YDX - TZFIELD%CUNITS = 'm2 s-2' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'TKE_MOVINGAVG'//YDX - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'TKEMAVG'//YDX, & + CSTDNAME = '', & + CLONGNAME = 'TKEMAVG'//YDX, & + CUNITS = 'm2 s-2', & + CDIR = 'XY', & + CCOMMENT = 'TKE_MOVINGAVG'//YDX, & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) END IF ! @@ -1532,14 +1479,15 @@ END IF ! ------------------------------- ! IF (NEQ_BUDGET>0) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - ! - TZFIELD%CUNITS = 'ppp s-1' - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 4 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'generic for CNAMES_BUDGET', & !Temporary name to ease identification + CSTDNAME = '', & + CUNITS = 'ppv s-1', & + CDIR = 'XY', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 4, & + LTIMEDEP = .TRUE. ) ! DO JSV = 1, NEQ_BUDGET TZFIELD%CMNHNAME = TRIM(CNAMES_BUDGET(JSV))//'_BUDGET' @@ -1548,9 +1496,15 @@ IF (NEQ_BUDGET>0) THEN CALL IO_Field_write(TPFILE,TZFIELD,XTCHEM(JSV)%XB_REAC(:,:,:,:)) END DO ! - TZFIELD%CUNITS = '' - TZFIELD%NTYPE = TYPEINT - TZFIELD%NDIMS = 1 + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'generic for reaction list', & !Temporary name to ease identification + CSTDNAME = '', & + CUNITS = '', & + CDIR = 'XY', & + NGRID = 1, & + NTYPE = TYPEINT, & + NDIMS = 1, & + LTIMEDEP = .TRUE. ) ! DO JSV=1, NEQ_BUDGET TZFIELD%CMNHNAME = TRIM(CNAMES_BUDGET(JSV))//'_CHREACLIST' @@ -1563,13 +1517,15 @@ END IF ! ! chemical prod/loss terms IF (NEQ_PLT>0) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppp s-1' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'generic for CNAMES_PRODLOSST', & !Temporary name to ease identification + CSTDNAME = '', & + CUNITS = 'ppv s-1', & + CDIR = 'XY', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ! DO JSV = 1, NEQ_PLT TZFIELD%CMNHNAME = TRIM(CNAMES_PRODLOSST(JSV))//'_PROD' diff --git a/src/MNH/write_lfifmn_fordiachron.f90 b/src/MNH/write_lfifmn_fordiachron.f90 index d6c6ba317f2e39677d1aa0befe5efbebf1116e54..a46115d97b8cc1dae8b453bcfb91fc43b38b880f 100644 --- a/src/MNH/write_lfifmn_fordiachron.f90 +++ b/src/MNH/write_lfifmn_fordiachron.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1994-2019 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1994-2022 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. @@ -109,7 +109,6 @@ USE MODD_TYPE_DATE USE MODD_NESTING USE MODD_IO, ONLY: TFILEDATA ! -USE MODE_GATHER_ll USE MODE_GRIDPROJ USE MODE_IO_FIELD_WRITE, only: IO_Field_write USE MODE_ll @@ -127,11 +126,6 @@ INTEGER :: IRESP ! return-code! LOGICAL :: GPACK ! REAL :: ZLATOR, ZLONOR ! geographical coordinates of 1st mass point -REAL :: ZXHATM, ZYHATM ! conformal coordinates of 1st mass point -REAL, DIMENSION(:), ALLOCATABLE :: ZXHAT_ll ! Position x in the conformal - ! plane (array on the complete domain) -REAL, DIMENSION(:), ALLOCATABLE :: ZYHAT_ll ! Position y in the conformal - ! plane (array on the complete domain) ! !------------------------------------------------------------------------------- ! @@ -163,13 +157,7 @@ IF (.NOT.LCARTESIAN) THEN ! !* diagnostic of 1st mass point ! - ALLOCATE(ZXHAT_ll(NIMAX_ll+ 2 * JPHEXT),ZYHAT_ll(NJMAX_ll+2 * JPHEXT)) - CALL GATHERALL_FIELD_ll('XX',XXHAT,ZXHAT_ll,IRESP) !// - CALL GATHERALL_FIELD_ll('YY',XYHAT,ZYHAT_ll,IRESP) !// - ZXHATM = 0.5 * (ZXHAT_ll(1)+ZXHAT_ll(2)) - ZYHATM = 0.5 * (ZYHAT_ll(1)+ZYHAT_ll(2)) - CALL SM_LATLON(XLATORI,XLONORI,ZXHATM,ZYHATM,ZLATOR,ZLONOR) - DEALLOCATE(ZXHAT_ll,ZYHAT_ll) + CALL SM_LATLON( XLATORI, XLONORI, XHATM_BOUND(NEXTE_XMIN), XHATM_BOUND(NEXTE_YMIN), ZLATOR, ZLONOR ) ! CALL IO_Field_write(TPFILE,'LONOR',ZLONOR) CALL IO_Field_write(TPFILE,'LATOR',ZLATOR) diff --git a/src/MNH/write_lfin.f90 b/src/MNH/write_lfin.f90 index dd96607f1733505d37f5e5a40a110a1f5729cec1..a2847e0dc87f690592925e98ee6686562766266d 100644 --- a/src/MNH/write_lfin.f90 +++ b/src/MNH/write_lfin.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1994-2023 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. @@ -153,14 +153,12 @@ END MODULE MODI_WRITE_LFIFM_n !! M.Tomasini 06/12 2D west african monsoon: nesting for ADV forcing writing !! Pialat/Tulet 15/02/2012 add ForeFire variables !! J. Escobar Mars 2014 , missing YDIR="XY" in 1.6 for tendencies fields -!! J.escobar & M.Leriche 23/06/2014 Pb with JSA increment versus ini_nsv order initialization !! P. Tulet Nov 2014 accumulated moles of aqueous species that fall at the surface !! M.Faivre 2014 !! C.Lac Dec.2014 writing past wind fields for centred advection !! J.-P. Pinty Jan 2015 add LNOx and flash map diagnostics !! J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 !! P. Tulet & M. Leriche Nov 2015 add mean pH value in the rain at the surface -!! J.escobar 04/08/2015 suit Pb with writ_lfin JSA increment , modif in ini_nsv to have good order initialization !! Modification 01/2016 (JP Pinty) Add LIMA !! M.Mazoyer 04/16 : Add supersaturation fields ! P. Wautelet 05/2016-04/2018: new data structures and calls for I/O @@ -173,132 +171,114 @@ END MODULE MODI_WRITE_LFIFM_n ! S. Bielli 02/2019: Sea salt: significant sea wave height influences salt emission; 5 salt modes ! P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg ! P. Tulet 02/2020: correction for dust and sea salts -!! B. Vie 06/2020 Add prognostic supersaturation for LIMA -! PA. Joulin 12/2020: add wind turbine outputs -! F. Auguste 02/2021: add IBM -! T. Nagel 02/2021: add turbulence recycling +! B. Vie 06/2020: add prognostic supersaturation for LIMA +! PA. Joulin 12/2020: add wind turbine outputs +! F. Auguste 02/2021: add IBM +! T. Nagel 02/2021: add turbulence recycling ! P. Wautelet 10/03/2021: use scalar variable names for dust and salt ! P. Wautelet 11/03/2021: bugfix: correct name for NSV_LIMA_IMM_NUCL ! J.L. Redelsperger 03/2021: add OCEAN and auto-coupled O-A LES cases ! A. Costes 12/2021: add Blaze fire model -! E. Jezequel 11/2022 : add covariances from MEAN fields +! P. Wautelet 04/02/2022: use TSVLIST to manage metadata of scalar variables +! E. Jezequel 11/2022: add covariances from MEAN fields !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ ! -USE MODD_DIM_n +USE MODD_2D_FRC +USE MODD_ADVFRC_n +USE MODD_ADV_n, ONLY: CUVW_ADV_SCHEME, XRTKEMS, CTEMP_SCHEME, LSPLIT_CFL +USE MODD_AIRCRAFT_BALLOON, ONLY: LFLYER +USE MODD_BLOWSNOW +USE MODD_BLOWSNOW_n +USE MODD_CH_AEROSOL +USE MODD_CH_M9_n +USE MODD_CH_MNHC_n, ONLY: LUSECHEM,LCH_CONV_LINOX, & + LUSECHAQ,LUSECHIC,LCH_PH, XCH_PHINIT +USE MODD_CH_PH_n +USE MODD_CLOUDPAR +USE MODD_CONDSAMP USE MODD_CONF USE MODD_CONF_n -use modd_field, only: tfielddata, tfieldlist, TYPEDATE, TYPEINT, TYPELOG, TYPEREAL -USE MODD_GRID -USE MODD_GRID_n -USE MODD_TIME -USE MODD_TIME_n -USE MODD_FIELD_n -USE MODD_MEAN_FIELD -USE MODD_MEAN_FIELD_n +USE MODD_CST +USE MODD_DEEP_CONVECTION_n +USE MODD_DEF_EDDY_FLUX_n +USE MODD_DEF_EDDYUV_FLUX_n +USE MODD_DIM_n USE MODD_DUMMY_GR_FIELD_n -USE MODD_LSFIELD_n +USE MODD_DUST USE MODD_DYN_n -USE MODD_PARAM_n -USE MODD_REF -USE MODD_LUNIT_n -USE MODD_TURB_n -USE MODD_RADIATIONS_n, ONLY : XDTHRAD, NCLEARCOL_TM1, XFLALWD, & - XZENITH, XDIR_ALB, XSCA_ALB, XEMIS, XTSRAD, & - XDIRSRFSWD, XSCAFLASWD, XDIRFLASWD, XAZIM -USE MODD_REF_n, ONLY : XRHODREF -USE MODD_FRC -USE MODD_PRECIP_n +USE MODD_ELEC_DESCR, ONLY: LLNOX_EXPLICIT +USE MODD_ELEC_FLASH USE MODD_ELEC_n -USE MODD_CST -USE MODD_CLOUDPAR -USE MODD_DEEP_CONVECTION_n -USE MODD_PARAM_KAFR_n -USE MODD_NESTING -USE MODD_PARAMETERS +USE MODD_EOL_ADNR +USE MODD_EOL_ALM +USE MODD_EOL_MAIN +USE MODD_EOL_SHARED_IO +USE MODD_FIELD_n +use modd_field, only: NMNHDIM_UNUSED, tfieldmetadata, tfieldlist, TYPECHAR, TYPEDATE, TYPEINT, TYPELOG, TYPEREAL +USE MODD_FIRE +#ifdef MNH_FOREFIRE +USE MODD_FOREFIRE +#endif +USE MODD_FRC USE MODD_GR_FIELD_n -USE MODD_CH_MNHC_n, ONLY: LUSECHEM,LCH_CONV_LINOX, & - LUSECHAQ,LUSECHIC,LCH_PH, XCH_PHINIT -USE MODD_CH_PH_n -USE MODD_CH_M9_n -USE MODD_RAIN_C2R2_DESCR, ONLY: C2R2NAMES -USE MODD_ICE_C1R3_DESCR, ONLY: C1R3NAMES -USE MODD_ELEC_DESCR, ONLY: CELECNAMES, LLNOX_EXPLICIT -USE MODD_LG, ONLY: CLGNAMES -USE MODD_NSV -USE MODD_AIRCRAFT_BALLOON +USE MODD_GRID +USE MODD_GRID_n USE MODD_HURR_CONF, ONLY: LFILTERING,CFILTERING,NDIAG_FILT USE MODD_HURR_FIELD_n -USE MODD_PREP_REAL, ONLY: CDUMMY_2D, XDUMMY_2D -USE MODD_DUST -USE MODD_SALT +USE MODD_IBM_LSF, ONLY: LIBM_LSF +USE MODD_IBM_PARAM_n, ONLY: LIBM, XIBM_LS +USE MODD_IO, ONLY: TFILEDATA +USE MODD_LATZ_EDFLX +USE MODD_LIMA_PRECIP_SCAVENGING_n +USE MODD_LSFIELD_n +USE MODD_LUNIT_n +USE MODD_MEAN_FIELD_n +USE MODD_NESTING +USE MODD_NSV USE MODD_OCEANH +USE MODD_PARAM_C2R2, ONLY: LSUPSAT +USE MODD_PARAMETERS +USE MODD_PARAM_KAFR_n, ONLY: LCHTRANS +USE MODD_PARAM_LIMA, ONLY: LSCAV, LAERO_MASS +USE MODD_PARAM_n USE MODD_PASPOL -#ifdef MNH_FOREFIRE -USE MODD_FOREFIRE -#endif -USE MODD_CONDSAMP -USE MODD_CH_AEROSOL -USE MODD_CH_AERO_n -USE MODE_AERO_PSD -USE MODD_BLOWSNOW -USE MODD_BLOWSNOW_n USE MODD_PAST_FIELD_n -USE MODD_ADV_n, ONLY: CUVW_ADV_SCHEME,XRTKEMS,CTEMP_SCHEME,LSPLIT_CFL -USE MODD_ELEC_FLASH -! -USE MODD_PARAM_LIMA , ONLY: NMOD_CCN, LSCAV, LAERO_MASS, & - NMOD_IFN, NMOD_IMM, NINDICE_CCN_IMM, LHHONI -USE MODD_PARAM_LIMA_WARM, ONLY: CLIMA_WARM_NAMES, CAERO_MASS -USE MODD_PARAM_LIMA_COLD, ONLY: CLIMA_COLD_NAMES -USE MODD_LIMA_PRECIP_SCAVENGING_n -! -USE MODE_IO_FILE, only: IO_File_close -USE MODE_IO_FIELD_WRITE, only: IO_Field_write -USE MODE_ll -USE MODD_IO, ONLY: TFILEDATA +USE MODD_PRECIP_n +USE MODD_PREP_REAL, ONLY: CDUMMY_2D, XDUMMY_2D +USE MODD_RADIATIONS_n, ONLY : XDTHRAD, NCLEARCOL_TM1, XFLALWD, & + XZENITH, XDIR_ALB, XSCA_ALB, XEMIS, XTSRAD, & + XDIRSRFSWD, XSCAFLASWD, XDIRFLASWD, XAZIM +USE MODD_RECYCL_PARAM_n +USE MODD_REF +USE MODD_REF_n, ONLY : XRHODREF +USE MODD_RELFRC_n +USE MODD_SALT +USE MODD_TIME +USE MODD_TIME_n +USE MODD_TURB_n + +USE MODE_EXTRAPOL use mode_field, only: Find_field_id_from_mnhname -USE MODE_GATHER_ll USE MODE_GRIDPROJ -USE MODE_MSG +USE MODE_IO_FIELD_WRITE, only: IO_Field_write +USE MODE_IO_FILE, only: IO_File_close +USE MODE_ll USE MODE_MODELN_HANDLER +USE MODE_MPPDB +USE MODE_MSG USE MODE_TOOLS, ONLY: UPCASE -! -USE MODI_WRITE_LB_n -USE MODI_WRITE_BALLOON_n -USE MODI_DUSTLFI_n -USE MODI_SALTLFI_n +USE MODE_WRITE_BALLOON_n, ONLY: WRITE_BALLOON_n + USE MODI_CH_AER_REALLFI_n -USE MODI_SALT_FILTER USE MODI_DUST_FILTER -! -!20131128 -USE MODE_MPPDB -USE MODE_EXTRAPOL -! Modif Eddy fluxes -USE MODD_DEF_EDDY_FLUX_n ! Ajout PP -USE MODD_DEF_EDDYUV_FLUX_n ! Ajout PP -USE MODD_LATZ_EDFLX ! Ajout PP -! -USE MODD_2D_FRC ! Ajout PP -USE MODD_ADVFRC_n ! Modif PP ADV FRC -USE MODD_RELFRC_n -! -USE MODD_PARAM_C2R2 -! -USE MODD_EOL_MAIN -USE MODD_EOL_SHARED_IO -USE MODD_EOL_ADNR -USE MODD_EOL_ALM -! -USE MODD_RECYCL_PARAM_n -USE MODD_IBM_PARAM_n, ONLY: LIBM, XIBM_LS -USE MODD_IBM_LSF, ONLY: LIBM_LSF -! -USE MODD_FIRE -! +USE MODI_DUSTLFI_n +USE MODI_SALT_FILTER +USE MODI_SALTLFI_n +USE MODI_WRITE_LB_n + IMPLICIT NONE ! !* 0.1 Declarations of arguments @@ -313,9 +293,7 @@ INTEGER :: IRESP ! IRESP : return-code if a problem appears !in LFI subroutines at the open of the file ! INTEGER :: JSV ! loop index for scalar variables -INTEGER :: JSA ! beginning of chemical-aerosol variables - -! +! CHARACTER(LEN=3) :: YFRC ! to mark the time of the forcing INTEGER :: JT ! loop index ! @@ -323,25 +301,15 @@ REAL,DIMENSION(:,:), ALLOCATABLE :: ZWORK2D ! Working array REAL,DIMENSION(:,:,:), ALLOCATABLE :: ZWORK3D ! Working array ! REAL :: ZLATOR, ZLONOR ! geographical coordinates of 1st mass point -REAL :: ZXHATM, ZYHATM ! conformal coordinates of 1st mass point -REAL, DIMENSION(:), ALLOCATABLE :: ZXHAT_ll ! Position x in the conformal - ! plane (array on the complete domain) -REAL, DIMENSION(:), ALLOCATABLE :: ZYHAT_ll ! Position y in the conformal - ! plane (array on the complete domain) INTEGER :: IMI ! Current model index ! -INTEGER :: ICH_NBR ! to write number and names of scalar -INTEGER,DIMENSION(:),ALLOCATABLE :: ICH_NAMES !(chem+aero+dust) variables -CHARACTER(LEN=NMNHNAMELGTMAX),DIMENSION(:),ALLOCATABLE :: YDSTNAMES,YCHNAMES, YSLTNAMES -INTEGER :: ILREC,ILENG !in NSV.DIM and NSV.TITRE INTEGER :: INFO_ll -INTEGER :: IKRAD INTEGER :: JI,JJ,JK ! loop index INTEGER :: IIU,IJU,IKU,IIB,IJB,IKB,IIE,IJE,IKE ! Arrays bounds ! -CHARACTER(LEN=2) :: INDICE -INTEGER :: IID -TYPE(TFIELDDATA) :: TZFIELD +INTEGER :: IDX +INTEGER :: IID +TYPE(TFIELDMETADATA) :: TZFIELD !------------------------------------------------------------------------------- ! !* 0. Initialization @@ -349,6 +317,8 @@ TYPE(TFIELDDATA) :: TZFIELD IMI = GET_CURRENT_MODEL_INDEX() ! ILUOUT=TLUOUT%NLU + +IDX = 1 ! ALLOCATE(ZWORK2D(SIZE(XTHT,1),SIZE(XTHT,2))) ALLOCATE(ZWORK3D(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3))) @@ -393,13 +363,7 @@ IF (.NOT.LCARTESIAN) THEN ! !* diagnostic of 1st mass point ! - ALLOCATE(ZXHAT_ll(NIMAX_ll+ 2 * JPHEXT),ZYHAT_ll(NJMAX_ll+2 * JPHEXT)) - CALL GATHERALL_FIELD_ll('XX',XXHAT,ZXHAT_ll,IRESP) !// - CALL GATHERALL_FIELD_ll('YY',XYHAT,ZYHAT_ll,IRESP) !// - ZXHATM = 0.5 * (ZXHAT_ll(1)+ZXHAT_ll(2)) - ZYHATM = 0.5 * (ZYHAT_ll(1)+ZYHAT_ll(2)) - CALL SM_LATLON(XLATORI,XLONORI,ZXHATM,ZYHATM,ZLATOR,ZLONOR) - DEALLOCATE(ZXHAT_ll,ZYHAT_ll) + CALL SM_LATLON( XLATORI, XLONORI, XHATM_BOUND(NEXTE_XMIN), XHATM_BOUND(NEXTE_YMIN), ZLATOR, ZLONOR ) ! CALL IO_Field_write(TPFILE,'LONOR',ZLONOR) CALL IO_Field_write(TPFILE,'LATOR',ZLATOR) @@ -452,15 +416,17 @@ CALL IO_Field_write(TPFILE,'SURF', CSURF) CALL IO_Field_write(TPFILE,'CPL_AROME',LCPL_AROME) CALL IO_Field_write(TPFILE,'COUPLING', LCOUPLING) ! -TZFIELD%CMNHNAME = 'RECYCLING' -TZFIELD%CLONGNAME = 'RECYCLING' -TZFIELD%CSTDNAME = '' -TZFIELD%CUNITS = '' -TZFIELD%CDIR = '--' -TZFIELD%NGRID = 1 -TZFIELD%NTYPE = TYPELOG -TZFIELD%NDIMS = 0 -TZFIELD%LTIMEDEP = .FALSE. +TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'RECYCLING', & + CLONGNAME = 'RECYCLING', & + CSTDNAME = '', & + CUNITS = '', & + CDIR = '--', & + CCOMMENT = '', & + NGRID = 1, & + NTYPE = TYPELOG, & + NDIMS = 0, & + LTIMEDEP = .FALSE. ) CALL IO_Field_write(TPFILE,TZFIELD,LRECYCL) ! !* 1.4 Prognostic variables : @@ -484,6 +450,7 @@ CALL IO_Field_write(TPFILE,'VT',XVT) CALL IO_Field_write(TPFILE,'WT',XWT) ! CALL IO_Field_write(TPFILE,'THT',XTHT) +! IF (LBLAZE) THEN CALL IO_Field_write( TPFILE, 'LSPHI', XLSPHI ) CALL IO_Field_write( TPFILE, 'BMAP', XBMAP ) @@ -517,16 +484,17 @@ END IF ! IF (LIBM .OR. LIBM_LSF) THEN ! - TZFIELD%CMNHNAME = 'LSFP' - TZFIELD%CLONGNAME = 'LSFP' - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'm' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - TZFIELD%CCOMMENT = 'Level Set Function at mass node' + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'LSFP', & + CLONGNAME = 'LSFP', & + CSTDNAME = '', & + CUNITS = 'm', & + CDIR = 'XY', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE., & + CCOMMENT = 'Level Set Function at mass node' ) ! CALL IO_Field_write(TPFILE,TZFIELD,XIBM_LS(:,:,:,1)) ! @@ -534,189 +502,204 @@ ENDIF ! IF (LRECYCL) THEN ! - TZFIELD%CMNHNAME = 'RCOUNT' - TZFIELD%CLONGNAME = 'RCOUNT' - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = '' - TZFIELD%CDIR = '--' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEINT - TZFIELD%NDIMS = 0 - TZFIELD%LTIMEDEP = .TRUE. - TZFIELD%CCOMMENT = 'Incremental counter for averaging purpose' + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'RCOUNT', & + CLONGNAME = 'RCOUNT', & + CSTDNAME = '', & + CUNITS = '', & + CDIR = '--', & + NGRID = 1, & + NTYPE = TYPEINT, & + NDIMS = 0, & + LTIMEDEP = .TRUE., & + CCOMMENT = 'Incremental counter for averaging purpose' ) CALL IO_Field_write(TPFILE,TZFIELD,NR_COUNT) ! IF (LRECYCLW) THEN - TZFIELD%CMNHNAME = 'URECYCLW' - TZFIELD%CLONGNAME = 'URECYCLW' - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'm s-1' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 2 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - TZFIELD%CCOMMENT = 'UMEAN-WEST side plan for recycling purpose' + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'URECYCLW', & + CLONGNAME = 'URECYCLW', & + CSTDNAME = '', & + CUNITS = 'm s-1', & + CDIR = 'XY', & + NGRID = 2, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE., & + CCOMMENT = 'UMEAN-WEST side plan for recycling purpose' ) ! CALL IO_Field_write(TPFILE,TZFIELD,XUMEANW(:,:,:)) ! - TZFIELD%CMNHNAME = 'VRECYCLW' - TZFIELD%CLONGNAME = 'VRECYCLW' - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'm s-1' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 3 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - TZFIELD%CCOMMENT = 'VMEAN-WEST side plan for recycling purpose' + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'VRECYCLW', & + CLONGNAME = 'VRECYCLW', & + CSTDNAME = '', & + CUNITS = 'm s-1', & + CDIR = 'XY', & + NGRID = 3, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE., & + CCOMMENT = 'VMEAN-WEST side plan for recycling purpose' ) ! CALL IO_Field_write(TPFILE,TZFIELD,XVMEANW(:,:,:)) ! - TZFIELD%CMNHNAME = 'WRECYCLW' - TZFIELD%CLONGNAME = 'WRECYCLW' - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'm s-1' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 4 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - TZFIELD%CCOMMENT = 'WMEAN-WEST side plan for recycling purpose' + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'WRECYCLW', & + CLONGNAME = 'WRECYCLW', & + CSTDNAME = '', & + CUNITS = 'm s-1', & + CDIR = 'XY', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE., & + CCOMMENT = 'WMEAN-WEST side plan for recycling purpose' ) ! CALL IO_Field_write(TPFILE,TZFIELD,XWMEANW(:,:,:)) ! ENDIF IF (LRECYCLN) THEN - TZFIELD%CMNHNAME = 'URECYCLN' - TZFIELD%CLONGNAME = 'URECYCLN' - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'm s-1' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 2 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - TZFIELD%CCOMMENT = 'UMEAN-NORTH side plan for recycling purpose' + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'URECYCLN', & + CLONGNAME = 'URECYCLN', & + CSTDNAME = '', & + CUNITS = 'm s-1', & + CDIR = 'XY', & + NGRID = 2, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE., & + CCOMMENT = 'UMEAN-NORTH side plan for recycling purpose' ) ! CALL IO_Field_write(TPFILE,TZFIELD,XUMEANN(:,:,:)) ! - TZFIELD%CMNHNAME = 'VRECYCLN' - TZFIELD%CLONGNAME = 'VRECYCLN' - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'm s-1' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 3 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - TZFIELD%CCOMMENT = 'VMEAN-NORTH side plan for recycling purpose' + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'VRECYCLN', & + CLONGNAME = 'VRECYCLN', & + CSTDNAME = '', & + CUNITS = 'm s-1', & + CDIR = 'XY', & + NGRID = 3, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE., & + CCOMMENT = 'VMEAN-NORTH side plan for recycling purpose' ) ! CALL IO_Field_write(TPFILE,TZFIELD,XVMEANN(:,:,:)) ! - TZFIELD%CMNHNAME = 'WRECYCLN' - TZFIELD%CLONGNAME = 'WRECYCLN' - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'm s-1' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 4 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - TZFIELD%CCOMMENT = 'WMEAN-NORTH side plan for recycling purpose' + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'WRECYCLN', & + CLONGNAME = 'WRECYCLN', & + CSTDNAME = '', & + CUNITS = 'm s-1', & + CDIR = 'XY', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE., & + CCOMMENT = 'WMEAN-NORTH side plan for recycling purpose' ) ! CALL IO_Field_write(TPFILE,TZFIELD,XWMEANN(:,:,:)) ! ENDIF IF (LRECYCLE) THEN - TZFIELD%CMNHNAME = 'URECYCLE' - TZFIELD%CLONGNAME = 'URECYCLE' - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'm s-1' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 2 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - TZFIELD%CCOMMENT = 'UMEAN-EAST side plan for recycling purpose' + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'URECYCLE', & + CLONGNAME = 'URECYCLE', & + CSTDNAME = '', & + CUNITS = 'm s-1', & + CDIR = 'XY', & + NGRID = 2, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE., & + CCOMMENT = 'UMEAN-EAST side plan for recycling purpose' ) ! CALL IO_Field_write(TPFILE,TZFIELD,XUMEANE(:,:,:)) ! - TZFIELD%CMNHNAME = 'VRECYCLE' - TZFIELD%CLONGNAME = 'VRECYCLE' - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'm s-1' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 3 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - TZFIELD%CCOMMENT = 'VMEAN-EAST side plan for recycling purpose' + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'VRECYCLE', & + CLONGNAME = 'VRECYCLE', & + CSTDNAME = '', & + CUNITS = 'm s-1', & + CDIR = 'XY', & + NGRID = 3, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE., & + CCOMMENT = 'VMEAN-EAST side plan for recycling purpose' ) ! CALL IO_Field_write(TPFILE,TZFIELD,XVMEANE(:,:,:)) ! - TZFIELD%CMNHNAME = 'WRECYCLE' - TZFIELD%CLONGNAME = 'WRECYCLE' - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'm s-1' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 4 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - TZFIELD%CCOMMENT = 'WMEAN-EAST side plan for recycling purpose' + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'WRECYCLE', & + CLONGNAME = 'WRECYCLE', & + CSTDNAME = '', & + CUNITS = 'm s-1', & + CDIR = 'XY', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE., & + CCOMMENT = 'WMEAN-EAST side plan for recycling purpose' ) ! CALL IO_Field_write(TPFILE,TZFIELD,XWMEANE(:,:,:)) ! ENDIF IF (LRECYCLS) THEN - TZFIELD%CMNHNAME = 'URECYCLS' - TZFIELD%CLONGNAME = 'URECYCLS' - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'm s-1' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 2 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - TZFIELD%CCOMMENT = 'UMEAN-SOUTH side plan for recycling purpose' + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'URECYCLS', & + CLONGNAME = 'URECYCLS', & + CSTDNAME = '', & + CUNITS = 'm s-1', & + CDIR = 'XY', & + NGRID = 2, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE., & + CCOMMENT = 'UMEAN-SOUTH side plan for recycling purpose' ) ! CALL IO_Field_write(TPFILE,TZFIELD,XUMEANS(:,:,:)) ! - TZFIELD%CMNHNAME = 'VRECYCLS' - TZFIELD%CLONGNAME = 'VRECYCLS' - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'm s-1' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 3 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - TZFIELD%CCOMMENT = 'VMEAN-SOUTH side plan for recycling purpose' + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'VRECYCLS', & + CLONGNAME = 'VRECYCLS', & + CSTDNAME = '', & + CUNITS = 'm s-1', & + CDIR = 'XY', & + NGRID = 3, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE., & + CCOMMENT = 'VMEAN-SOUTH side plan for recycling purpose' ) ! CALL IO_Field_write(TPFILE,TZFIELD,XVMEANS(:,:,:)) ! - TZFIELD%CMNHNAME = 'WRECYCLS' - TZFIELD%CLONGNAME = 'WRECYCLS' - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'm s-1' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 4 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - TZFIELD%CCOMMENT = 'WMEAN-SOUTH side plan for recycling purpose' + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'WRECYCLS', & + CLONGNAME = 'WRECYCLS', & + CSTDNAME = '', & + CUNITS = 'm s-1', & + CDIR = 'XY', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE., & + CCOMMENT = 'WMEAN-SOUTH side plan for recycling purpose' ) ! ENDIF ENDIF ! IF (MEAN_COUNT /= 0) THEN ! - TZFIELD%CSTDNAME = '' - TZFIELD%CDIR = 'XY' - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'generic for mean_count variables', & !Temporary name to ease identification + CSTDNAME = '', & + CDIR = 'XY', & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ! TZFIELD%NGRID = 2 ! @@ -938,149 +921,42 @@ IF (NRR >=1) THEN IF (LUSERH) CALL IO_Field_write(TPFILE,'RHT',XRT(:,:,:,IDX_RHT)) END IF ! -IF (NSV >=1) THEN - JSA=0 - ! User scalar variables - IF (NSV_USER>0) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'kg kg-1' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = 1,NSV_USER - WRITE(TZFIELD%CMNHNAME,'(A3,I3.3)')'SVT',JSV - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CCOMMENT = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME) - CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)) - JSA=JSA+1 - END DO - END IF - ! microphysical C2R2 scheme scalar variables - IF (NSV_C2R2END>=NSV_C2R2BEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'm-3' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_C2R2BEG,NSV_C2R2END - TZFIELD%CMNHNAME = TRIM(C2R2NAMES(JSV-NSV_C2R2BEG+1))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV - CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)) - JSA=JSA+1 - END DO +IF (NSV >= 1 ) THEN + ! aerosol scalar variables + IF ( LORILAM ) THEN + IF ((CPROGRAM == 'REAL ').AND.(NSV_AER > 1).AND.(IMI==1).AND.(LAERINIT)) & + CALL CH_AER_REALLFI_n(XSVT(:,:,:,NSV_AERBEG:NSV_AEREND),XSVT(:,:,:,NSV_CHEMBEG-1+JP_CH_CO), XRHODREF) + IF ((CPROGRAM == 'IDEAL ').AND.(NSV_AER > 1).AND.(IMI==1)) & + CALL CH_AER_REALLFI_n(XSVT(:,:,:,NSV_AERBEG:NSV_AEREND),XSVT(:,:,:,NSV_CHEMBEG-1+JP_CH_CO), XRHODREF) END IF - ! microphysical C3R5 scheme additional scalar variables - IF (NSV_C1R3END>=NSV_C1R3BEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'm-3' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_C1R3BEG,NSV_C1R3END - TZFIELD%CMNHNAME = TRIM(C1R3NAMES(JSV-NSV_C1R3BEG+1))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV - CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)) - JSA=JSA+1 - END DO + + ! dust scalar variables + IF ( LDUST ) THEN + IF ((CPROGRAM == 'REAL ').AND.(NSV_DST > 1).AND.(IMI==1).AND.(LDSTINIT).AND.(.NOT.LDSTCAMS)) & + CALL DUSTLFI_n(XSVT(:,:,:,NSV_DSTBEG:NSV_DSTEND), XRHODREF) + IF ((CPROGRAM == 'IDEAL ').AND.(NSV_DST > 1).AND.(IMI==1)) & + CALL DUSTLFI_n(XSVT(:,:,:,NSV_DSTBEG:NSV_DSTEND), XRHODREF) + !At this point, we have the tracer array in order of importance, i.e. + !if mode 2 is most important it will occupy place 1-3 of XSVT + CALL DUST_FILTER(XSVT(:,:,:,NSV_DSTBEG:NSV_DSTEND), XRHODREF) END IF -! -! microphysical LIMA variables -! - IF (NSV_LIMA_END>=NSV_LIMA_BEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + + ! sea salt scalar variables + IF ( LSALT ) THEN + IF ((CPROGRAM == 'REAL ').AND.(NSV_SLT > 1).AND.(IMI==1).AND.(LSLTINIT).AND.(.NOT.LSLTCAMS)) & + CALL SALTLFI_n(XSVT(:,:,:,NSV_SLTBEG:NSV_SLTEND), XRHODREF, XZZ) + IF ((CPROGRAM == 'IDEAL ').AND.(NSV_SLT > 1).AND.(IMI==1)) & + CALL SALTLFI_n(XSVT(:,:,:,NSV_SLTBEG:NSV_SLTEND), XRHODREF, XZZ) + !At this point, we have the tracer array in order of importance, i.e. + !if mode 2 is most important it will occupy place 1-3 of XSVT + CALL SALT_FILTER(XSVT(:,:,:,NSV_SLTBEG:NSV_SLTEND), XRHODREF) END IF - ! - DO JSV = NSV_LIMA_BEG,NSV_LIMA_END - ! - TZFIELD%CUNITS = 'kg-1' - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV - ! -! Nc - IF (JSV .EQ. NSV_LIMA_NC) THEN - TZFIELD%CMNHNAME = TRIM(CLIMA_WARM_NAMES(1))//'T' - END IF -! Nr - IF (JSV .EQ. NSV_LIMA_NR) THEN - TZFIELD%CMNHNAME = TRIM(CLIMA_WARM_NAMES(2))//'T' - END IF -! N CCN free - IF (JSV .GE. NSV_LIMA_CCN_FREE .AND. JSV .LT. NSV_LIMA_CCN_ACTI) THEN - WRITE(INDICE,'(I2.2)')(JSV - NSV_LIMA_CCN_FREE + 1) - TZFIELD%CMNHNAME = TRIM(CLIMA_WARM_NAMES(3))//INDICE//'T' - END IF -! N CCN acti - IF (JSV .GE. NSV_LIMA_CCN_ACTI .AND. JSV .LT. NSV_LIMA_CCN_ACTI + NMOD_CCN) THEN - WRITE(INDICE,'(I2.2)')(JSV - NSV_LIMA_CCN_ACTI + 1) - TZFIELD%CMNHNAME = TRIM(CLIMA_WARM_NAMES(4))//INDICE//'T' - END IF -! Scavenging - IF (JSV .EQ. NSV_LIMA_SCAVMASS) THEN - TZFIELD%CMNHNAME = TRIM(CAERO_MASS(1))//'T' - TZFIELD%CUNITS = 'kg kg-1' - END IF -! Ni - IF (JSV .EQ. NSV_LIMA_NI) THEN - TZFIELD%CMNHNAME = TRIM(CLIMA_COLD_NAMES(1))//'T' - END IF -! Ns - IF (JSV .EQ. NSV_LIMA_NS) THEN - TZFIELD%CMNHNAME = TRIM(CLIMA_COLD_NAMES(2))//'T' - END IF -! Ng - IF (JSV .EQ. NSV_LIMA_NG) THEN - TZFIELD%CMNHNAME = TRIM(CLIMA_COLD_NAMES(3))//'T' - END IF -! Nh - IF (JSV .EQ. NSV_LIMA_NH) THEN - TZFIELD%CMNHNAME = TRIM(CLIMA_COLD_NAMES(4))//'T' - END IF -! N IFN free - IF (JSV .GE. NSV_LIMA_IFN_FREE .AND. JSV .LT. NSV_LIMA_IFN_NUCL) THEN - WRITE(INDICE,'(I2.2)')(JSV - NSV_LIMA_IFN_FREE + 1) - TZFIELD%CMNHNAME = TRIM(CLIMA_COLD_NAMES(5))//INDICE//'T' - END IF -! N IFN nucl - IF (JSV .GE. NSV_LIMA_IFN_NUCL .AND. JSV .LT. NSV_LIMA_IFN_NUCL + NMOD_IFN) THEN - WRITE(INDICE,'(I2.2)')(JSV - NSV_LIMA_IFN_NUCL + 1) - TZFIELD%CMNHNAME = TRIM(CLIMA_COLD_NAMES(6))//INDICE//'T' - END IF -! N IMM nucl - IF (JSV .GE. NSV_LIMA_IMM_NUCL .AND. JSV .LT. NSV_LIMA_IMM_NUCL + NMOD_IMM) THEN - WRITE(INDICE,'(I2.2)')(NINDICE_CCN_IMM(JSV - NSV_LIMA_IMM_NUCL + 1)) - TZFIELD%CMNHNAME = TRIM(CLIMA_COLD_NAMES(7))//INDICE//'T' - END IF -! Hom. freez. of CCN - IF (JSV .EQ. NSV_LIMA_HOM_HAZE) THEN - TZFIELD%CMNHNAME = TRIM(CLIMA_COLD_NAMES(8))//'T' - END IF - ! -! Supersaturation - IF (JSV .EQ. NSV_LIMA_SPRO) THEN - TZFIELD%CMNHNAME = TRIM(CLIMA_WARM_NAMES(5))//'T' - END IF - ! - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)) -! - JSA=JSA+1 + + !Store all scalar variables + DO JSV = 1, NSV + CALL IO_Field_write( TPFILE, TSVLIST(JSV), XSVT(:,:,:,JSV) ) END DO -! + IF (LSCAV .AND. LAERO_MASS) THEN IF (ASSOCIATED(XINPAP)) THEN IF (SIZE(XINPAP) /= 0 ) THEN @@ -1088,84 +964,61 @@ IF (NSV >=1) THEN ! ZWORK2D(:,:) = XRHOLW*XINPRR(:,:)*XSVT(:,:,2,NSV_LIMA_SCAVMASS)/ & max( 1.e-20,XRT(:,:,2,3) ) !~2=at ground level - TZFIELD%CMNHNAME = 'INPBP' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'INPBP' - TZFIELD%CUNITS = 'kg m-2 s-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_INstantaneous Precipitating Aerosol Rate' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 2 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'INPBP', & + CSTDNAME = '', & + CLONGNAME = 'INPBP', & + CUNITS = 'kg m-2 s-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_INstantaneous Precipitating Aerosol Rate', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK2D) ! CALL IO_Field_write(TPFILE,'ACPAP',XACPAP) END IF END IF END IF -! -! + ! electrical scalar variables - IF (NSV_ELECEND>=NSV_ELECBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_ELECBEG,NSV_ELECEND - TZFIELD%CMNHNAME = TRIM(CELECNAMES(JSV-NSV_ELECBEG+1))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - IF (JSV .GT. NSV_ELECBEG .AND. JSV .LT. NSV_ELECEND) THEN - TZFIELD%CUNITS = 'C m-3' - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV - ELSE - TZFIELD%CUNITS = 'm-3' - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3,A8)')'X_Y_Z_','SVT',JSV,' (nb ions/m3)' - END IF - ZWORK3D(:,:,:) = XSVT(:,:,:,JSV) * XRHODREF(:,:,:) ! C/kg --> C/m3 - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK3D) - JSA=JSA+1 - END DO - END IF - ! IF (CELEC /= 'NONE') THEN CALL IO_Field_write(TPFILE,'EFIELDU',XEFIELDU) CALL IO_Field_write(TPFILE,'EFIELDV',XEFIELDV) CALL IO_Field_write(TPFILE,'EFIELDW',XEFIELDW) ! - TZFIELD%CMNHNAME = 'EMODULE' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'V m-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME) - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'EMODULE', & + CSTDNAME = '', & + CLONGNAME = 'EMODULE', & + CUNITS = 'V m-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_EMODULE', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ZWORK3D(:,:,:) = (XEFIELDU**2 + XEFIELDV**2 + XEFIELDW**2)**0.5 CALL IO_Field_write(TPFILE,TZFIELD,ZWORK3D) ! CALL FIND_FIELD_ID_FROM_MNHNAME('NI_IAGGS',IID,IRESP) - TZFIELD = TFIELDLIST(IID) + TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) TZFIELD%CUNITS = 'pC m-3 s-1' CALL IO_Field_write(TPFILE,TZFIELD,XNI_IAGGS*1.E12) ! CALL FIND_FIELD_ID_FROM_MNHNAME('NI_IDRYG',IID,IRESP) - TZFIELD = TFIELDLIST(IID) + TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) TZFIELD%CUNITS = 'pC m-3 s-1' CALL IO_Field_write(TPFILE,TZFIELD,XNI_IDRYG*1.E12) ! CALL FIND_FIELD_ID_FROM_MNHNAME('NI_SDRYG',IID,IRESP) - TZFIELD = TFIELDLIST(IID) + TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) TZFIELD%CUNITS = 'pC m-3 s-1' CALL IO_Field_write(TPFILE,TZFIELD,XNI_SDRYG*1.E12) ! CALL FIND_FIELD_ID_FROM_MNHNAME('INDUC_CG',IID,IRESP) - TZFIELD = TFIELDLIST(IID) + TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) TZFIELD%CUNITS = 'pC m-3 s-1' CALL IO_Field_write(TPFILE,TZFIELD,XIND_RATE*1.E12) ! @@ -1175,57 +1028,6 @@ IF (NSV >=1) THEN CALL IO_Field_write(TPFILE,'AREA_IC', NMAP_2DAREA_IC) CALL IO_Field_write(TPFILE,'FLASH_3DCG',NMAP_3DCG) CALL IO_Field_write(TPFILE,'FLASH_3DIC',NMAP_3DIC) - ! - IF (LLNOX_EXPLICIT) THEN - TZFIELD%CMNHNAME = 'LINOX' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'mol mol-1' - TZFIELD%CDIR = 'XY' - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,NSV_LNOXEND)) - JSA=JSA+1 - END IF - END IF - ! lagrangian variables - IF (NSV_LGEND>=NSV_LGBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'm' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_LGBEG,NSV_LGEND - TZFIELD%CMNHNAME = TRIM(CLGNAMES(JSV-NSV_LGBEG+1))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV - CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)) - JSA=JSA+1 - END DO - END IF - ! Passive scalar variables - IF (LPASPOL) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'kg kg-1' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_PPBEG,NSV_PPEND - WRITE(TZFIELD%CMNHNAME,'(A3,I3.3)')'SVT',JSV - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CCOMMENT = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME) - CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)) - JSA=JSA+1 - END DO END IF ! IF ( ((CCLOUD == 'KHKO') .OR.(CCLOUD == 'C2R2')) .AND. (.NOT. LSUPSAT)) THEN @@ -1237,149 +1039,18 @@ IF (NSV >=1) THEN CALL IO_Field_write(TPFILE,'NPRO', XNPRO(:,:,:)) END IF ! -#ifdef MNH_FOREFIRE - ! ForeFire scalar variables - IF ( LFOREFIRE ) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'kg kg-1' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_FFBEG,NSV_FFEND - WRITE(TZFIELD%CMNHNAME,'(A3,I3.3)')'SVT',JSV - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CCOMMENT = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME) - CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)) - JSA=JSA+1 - END DO - END IF -#endif -! Blaze scalar variables -IF ( LBLAZE ) THEN - TZFIELD%CSTDNAME = 'fire smoke' - TZFIELD%CUNITS = 'kg kg-1' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_FIREBEG,NSV_FIREEND - WRITE(TZFIELD%CMNHNAME,'(A3,I3.3)')'SVT',JSV - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CCOMMENT = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME) - CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)) - JSA=JSA+1 - END DO -END IF -! Blowing snow variables - IF (LBLOWSNOW) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'kg kg-1' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - DO JSV = NSV_SNWBEG,NSV_SNWEND - TZFIELD%CMNHNAME=TRIM(CSNOWNAMES(JSV-NSV_SNWBEG+1))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV - CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)) - JSA=JSA+1 - END DO - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'kg kg-1' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 2 - TZFIELD%LTIMEDEP = .TRUE. - DO JSV = 1,(NSV_SNW) - WRITE(TZFIELD%CMNHNAME,'(A10,I3.3)')'SNOWCANO_M',JSV - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A8,I3.3)')'X_Y_Z_','SNOWCANO',JSV - CALL IO_Field_write(TPFILE,TZFIELD,XSNWCANO(:,:,JSV)) - JSA=JSA+1 - END DO - ENDIF - ! Conditional sampling variables - IF (LCONDSAMP) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'kg kg-1' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_CSBEG,NSV_CSEND - WRITE(TZFIELD%CMNHNAME,'(A3,I3.3)')'SVT',JSV - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CCOMMENT = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME) - CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)) - JSA=JSA+1 - END DO - ! - END IF - ! number of chemical variables (chem+aero+dust) - ICH_NBR = 0 - IF (LUSECHEM) ICH_NBR = ICH_NBR +NSV_CHEMEND-NSV_CHEMBEG+1 - IF (LUSECHIC) ICH_NBR = ICH_NBR +NSV_CHICEND-NSV_CHICBEG+1 - IF (.NOT.LUSECHEM.AND.LCH_CONV_LINOX) ICH_NBR = ICH_NBR + & - NSV_LNOXEND-NSV_LNOXBEG+1 - IF (LORILAM) ICH_NBR = ICH_NBR +NSV_AEREND -NSV_AERBEG+1 - IF (LDUST) ICH_NBR = ICH_NBR +NSV_DSTEND -NSV_DSTBEG+1 - IF (LDEPOS_DST(IMI)) ICH_NBR = ICH_NBR +NSV_DSTDEPEND -NSV_DSTDEPBEG+1 - IF (LDEPOS_SLT(IMI)) ICH_NBR = ICH_NBR +NSV_SLTDEPEND -NSV_SLTDEPBEG+1 - IF (LDEPOS_AER(IMI)) ICH_NBR = ICH_NBR +NSV_AERDEPEND -NSV_AERDEPBEG+1 - IF (LSALT) ICH_NBR = ICH_NBR +NSV_SLTEND -NSV_SLTBEG+1 - IF (ICH_NBR /=0) ALLOCATE(YCHNAMES(ICH_NBR)) - ! chemical scalar variables IF (LUSECHEM) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = '' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_CHEMBEG,NSV_CHEMEND - TZFIELD%CMNHNAME = TRIM(UPCASE(CNAMES(JSV-NSV_CHEMBEG+1)))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'ppp' - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV - CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)) - ! - YCHNAMES(JSV-JSA)=TZFIELD%CMNHNAME(1:LEN_TRIM(TZFIELD%CMNHNAME)-1) ! without T - END DO - ! - IF (LUSECHIC) THEN - DO JSV = NSV_CHICBEG,NSV_CHICEND - TZFIELD%CMNHNAME = TRIM(UPCASE(CICNAMES(JSV-NSV_CHICBEG+1)))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'ppp' - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV - CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)) - ! - YCHNAMES(JSV-JSA)=TZFIELD%CMNHNAME(1:LEN_TRIM(TZFIELD%CMNHNAME)-1) ! without M - END DO - ENDIF - IF (LUSECHAQ.AND.NRR>=3) THEN ! accumulated moles of aqueous species that fall at the surface (mol i/m2) - TZFIELD%NDIMS = 2 - DO JSV = NSV_CHACBEG+NSV_CHAC/2,NSV_CHACEND - TZFIELD%CMNHNAME = 'ACPR_'//TRIM(UPCASE(CNAMES(JSV-NSV_CHEMBEG+1))) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'mol i m-2' + IF (LUSECHAQ.AND.NRR>=3) THEN ! accumulated moles of aqueous species that fall at the surface (mol/m2) + DO JSV = NSV_CHACBEG + NSV_CHAC / 2, NSV_CHACEND + TZFIELD = TSVLIST(JSV) + TZFIELD%CMNHNAME = 'ACPR_' // TRIM( TZFIELD%CMNHNAME ) + TZFIELD%CLONGNAME = 'ACPR_' // TRIM( TZFIELD%CLONGNAME ) + TZFIELD%CUNITS = 'mol m-2' TZFIELD%CCOMMENT = 'X_Y_Accumulated moles of aqueous species at the surface' + TZFIELD%NDIMS = 2 ZWORK2D(:,:) = XACPRAQ(:,:,JSV-NSV_CHACBEG-NSV_CHAC/2+1) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK2D) END DO - TZFIELD%NDIMS = 3 END IF IF (LUSECHAQ.AND.LCH_PH) THEN ! pH values in cloud CALL IO_Field_write(TPFILE,'PHC',XPHC) @@ -1388,7 +1059,7 @@ END IF ! compute mean pH in accumulated surface water !ZWORK2D(:,:) = 10**(-XCH_PHINIT) WHERE (XACPRR > 0.) - ZWORK2D(:,:) = XACPHR(:,:) *1E3 / XACPRR(:,:) ! moles of H+ / l of water + ZWORK2D(:,:) = XACPHR(:,:) *1E3 / XACPRR(:,:) ! moles of H+ / l of water ELSE WHERE ZWORK2D(:,:) = XUNDEF END WHERE @@ -1404,238 +1075,41 @@ END IF TZFIELD%NGRID = 1 TZFIELD%NTYPE = TYPEREAL TZFIELD%NDIMS = 2 + TZFIELD%LTIMEDEP = .TRUE. CALL IO_Field_write(TPFILE,TZFIELD,ZWORK2D) ENDIF ENDIF - ELSE IF (LCH_CONV_LINOX) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppp' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_LNOXBEG,NSV_LNOXEND - TZFIELD%CMNHNAME = 'LINOXT' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)') 'X_Y_Z_','SVT',JSV - CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)) - YCHNAMES(JSV-JSA)=TZFIELD%CMNHNAME(1:LEN_TRIM(TZFIELD%CMNHNAME)-1) - END DO - ENDIF - ! aerosol scalar variables - IF (LORILAM) THEN - IF ((CPROGRAM == 'REAL ').AND.(NSV_AER > 1).AND.(IMI==1).AND.(LAERINIT)) & - CALL CH_AER_REALLFI_n(XSVT(:,:,:,NSV_AERBEG:NSV_AEREND),XSVT(:,:,:,NSV_CHEMBEG-1+JP_CH_CO), XRHODREF) - IF ((CPROGRAM == 'IDEAL ').AND.(NSV_AER > 1).AND.(IMI==1)) & - CALL CH_AER_REALLFI_n(XSVT(:,:,:,NSV_AERBEG:NSV_AEREND),XSVT(:,:,:,NSV_CHEMBEG-1+JP_CH_CO), XRHODREF) - IF (NSV_AEREND>=NSV_AERBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppp' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_AERBEG,NSV_AEREND - TZFIELD%CMNHNAME = TRIM(UPCASE(CAERONAMES(JSV-NSV_AERBEG+1)))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV - CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)) - IF (JSV==NSV_AERBEG) WRITE(ILUOUT,*)'MNHC: write_lfin:NSV_AERBEG ',JSV - IF (JSV==NSV_AEREND) WRITE(ILUOUT,*)'MNHC: write_lfin:NSV_AEREND ',JSV - YCHNAMES(JSV-JSA)= TZFIELD%CMNHNAME(1:LEN_TRIM(TZFIELD%CMNHNAME)-1) - END DO - IF (.NOT.(ASSOCIATED(XN3D))) & - ALLOCATE(XN3D(SIZE(XSVT,1),SIZE(XSVT,2),SIZE(XSVT,3),JPMODE)) - IF (.NOT.(ASSOCIATED(XRG3D))) & - ALLOCATE(XRG3D(SIZE(XSVT,1),SIZE(XSVT,2),SIZE(XSVT,3),JPMODE)) - IF (.NOT.(ASSOCIATED(XSIG3D))) & - ALLOCATE(XSIG3D(SIZE(XSVT,1),SIZE(XSVT,2),SIZE(XSVT,3),JPMODE)) - CALL PPP2AERO(XSVT(:,:,:,NSV_AERBEG:NSV_AEREND), XRHODREF, & - PSIG3D=XSIG3D, PRG3D=XRG3D, PN3D=XN3D) - - END IF - IF (LDEPOS_AER(IMI)) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppp' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_AERDEPBEG,NSV_AERDEPEND - TZFIELD%CMNHNAME = TRIM(CDEAERNAMES(JSV-NSV_AERDEPBEG+1))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV - CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)) - IF (JSV==NSV_AERDEPBEG) WRITE(ILUOUT,*)'MNHC: write_lfin:NSV_AERDEPBEG ',JSV - IF (JSV==NSV_AERDEPEND) WRITE(ILUOUT,*)'MNHC: write_lfin:NSV_AERDEPEND ',JSV - YCHNAMES(JSV-JSA) = TZFIELD%CMNHNAME(1:LEN_TRIM(TZFIELD%CMNHNAME)-1) - END DO ! Loop on aq dust scalar variables - ENDIF - END IF - ! dust scalar variables - IF (LDUST) THEN -! IF ((CPROGRAM == 'REAL ').AND.(NSV_DST > 1).AND.(IMI==1).AND.(LDSTINIT)) & - IF ((CPROGRAM == 'REAL ').AND.(NSV_DST > 1).AND.(IMI==1).AND.(LDSTINIT).AND.(.NOT.LDSTCAMS)) & -!UPG*PT - CALL DUSTLFI_n(XSVT(:,:,:,NSV_DSTBEG:NSV_DSTEND), XRHODREF) - IF ((CPROGRAM == 'IDEAL ').AND.(NSV_DST > 1).AND.(IMI==1)) & - CALL DUSTLFI_n(XSVT(:,:,:,NSV_DSTBEG:NSV_DSTEND), XRHODREF) - !At this point, we have the tracer array in order of importance, i.e. - !if mode 2 is most important it will occupy place 1-3 of XSVT - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppp' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - CALL DUST_FILTER(XSVT(:,:,:,NSV_DSTBEG:NSV_DSTEND), XRHODREF) - DO JSV = NSV_DSTBEG,NSV_DSTEND - TZFIELD%CMNHNAME = TRIM(CDUSTNAMES(JSV-NSV_DSTBEG+1))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV - CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)) - IF (JSV==NSV_DSTBEG) WRITE(ILUOUT,*)'MNHC: write_lfin:NSV_DSTBEG ',JSV - IF (JSV==NSV_DSTEND) WRITE(ILUOUT,*)'MNHC: write_lfin:NSV_DSTEND ',JSV - YCHNAMES(JSV-JSA) = TZFIELD%CMNHNAME(1:LEN_TRIM(TZFIELD%CMNHNAME)-1) - END DO ! Loop on dust scalar variables - - IF (LDEPOS_DST(IMI)) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppp' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_DSTDEPBEG,NSV_DSTDEPEND - TZFIELD%CMNHNAME = TRIM(CDEDSTNAMES(JSV-NSV_DSTDEPBEG+1))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV - CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)) - IF (JSV==NSV_DSTDEPBEG) WRITE(ILUOUT,*)'MNHC: write_lfin:NSV_DSTDEPBEG ',JSV - IF (JSV==NSV_DSTDEPEND) WRITE(ILUOUT,*)'MNHC: write_lfin:NSV_DSTDEPEND ',JSV - YCHNAMES(JSV-JSA) = TZFIELD%CMNHNAME(1:LEN_TRIM(TZFIELD%CMNHNAME)-1) - END DO ! Loop on aq dust scalar variables - ENDIF ENDIF - ! sea salt scalar variables - IF (LSALT) THEN -!UPG*PT -! IF ((CPROGRAM == 'REAL ').AND.(NSV_SLT > 1).AND.(IMI==1).AND.(LSLTINIT)) & - IF ((CPROGRAM == 'REAL ').AND.(NSV_SLT > 1).AND.(IMI==1).AND.(LSLTINIT).AND.(.NOT.LSLTCAMS)) & -!UPG*PT - CALL SALTLFI_n(XSVT(:,:,:,NSV_SLTBEG:NSV_SLTEND), XRHODREF, XZZ) - IF ((CPROGRAM == 'IDEAL ').AND.(NSV_SLT > 1).AND.(IMI==1)) & - CALL SALTLFI_n(XSVT(:,:,:,NSV_SLTBEG:NSV_SLTEND), XRHODREF, XZZ) - !At this point, we have the tracer array in order of importance, i.e. - !if mode 2 is most important it will occupy place 1-3 of XSVT - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppp' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - CALL SALT_FILTER(XSVT(:,:,:,NSV_SLTBEG:NSV_SLTEND), XRHODREF) - DO JSV = NSV_SLTBEG,NSV_SLTEND - TZFIELD%CMNHNAME = TRIM(CSALTNAMES(JSV-NSV_SLTBEG+1))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV - CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)) - IF (JSV==NSV_SLTBEG) WRITE(ILUOUT,*)'MNHC: write_lfin:NSV_SLTBEG ',JSV - IF (JSV==NSV_SLTEND) WRITE(ILUOUT,*)'MNHC: write_lfin:NSV_SLTEND ',JSV - YCHNAMES(JSV-JSA) = TZFIELD%CMNHNAME(1:LEN_TRIM(TZFIELD%CMNHNAME)-1) - END DO ! Loop on sea salt scalar variables - - IF (LDEPOS_SLT(IMI)) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppp' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_SLTDEPBEG,NSV_SLTDEPEND - TZFIELD%CMNHNAME = TRIM(CDESLTNAMES(JSV-NSV_SLTDEPBEG+1))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV - CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)) - IF (JSV==NSV_SLTDEPBEG) WRITE(ILUOUT,*)'MNHC: write_lfin:NSV_SLTDEPBEG ',JSV - IF (JSV==NSV_SLTDEPEND) WRITE(ILUOUT,*)'MNHC: write_lfin:NSV_SLTDEPEND ',JSV - YCHNAMES(JSV-JSA) = TZFIELD%CMNHNAME(1:LEN_TRIM(TZFIELD%CMNHNAME)-1) - END DO ! Loop on aq dust scalar variables - ENDIF - ENDIF - ! - DO JSV=1,ICH_NBR - WRITE(ILUOUT,*)JSV,TRIM(YCHNAMES(JSV)) - END DO - TZFIELD%CMNHNAME = 'NSV.DIM' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'NSV.DIM' - TZFIELD%CUNITS = '' - TZFIELD%CDIR = '--' - TZFIELD%CCOMMENT = 'Number of chemical variables' - TZFIELD%NGRID = 0 - TZFIELD%NTYPE = TYPEINT - TZFIELD%NDIMS = 0 - TZFIELD%LTIMEDEP = .FALSE. - CALL IO_Field_write(TPFILE,TZFIELD,ICH_NBR) ! - IF (ICH_NBR/=0) THEN - TZFIELD%CMNHNAME = 'NSV.TITRE' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'NSV.TITRE' - TZFIELD%CUNITS = '' - TZFIELD%CDIR = '--' - TZFIELD%CCOMMENT = '' - TZFIELD%NGRID = 0 - TZFIELD%NTYPE = TYPEINT - TZFIELD%NDIMS = 1 - TZFIELD%LTIMEDEP = .FALSE. - ILREC=LEN(YCHNAMES(1)) - ILENG=ILREC*ICH_NBR - ALLOCATE(ICH_NAMES(ILENG)) - DO JSV = 1,ICH_NBR - DO JT = 1,ILREC - ICH_NAMES(ILREC*(JSV-1)+JT) = ICHAR(YCHNAMES(JSV)(JT:JT)) - ENDDO - ENDDO - CALL IO_Field_write(TPFILE,TZFIELD,ICH_NAMES) - DEALLOCATE(YCHNAMES,ICH_NAMES) - END IF + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'NSVCHEM', & + CSTDNAME = '', & + CLONGNAME = 'NSVCHEM', & + CUNITS = '', & + CDIR = '--', & + CCOMMENT = 'Number of chemical variables', & + NGRID = 0, & + NTYPE = TYPEINT, & + NDIMS = 0, & + LTIMEDEP = .FALSE. ) + CALL IO_Field_write(TPFILE,TZFIELD,NSV_CHEM_LIST) ! - ! lagrangian variables - IF (NSV_LGEND>=NSV_LGBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'm' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = NSV_LGBEG,NSV_LGEND - TZFIELD%CMNHNAME = TRIM(CLGNAMES(JSV-NSV_LGBEG+1))//'T' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV - CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)) - END DO + IF ( NSV_CHEM_LIST > 0 ) THEN + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'SV_CHEM_LIST', & + CSTDNAME = '', & + CLONGNAME = 'SV_CHEM_LIST', & + CUNITS = '', & + CDIR = '--', & + CCOMMENT = 'List of chemical variables', & + NGRID = 0, & + NTYPE = TYPECHAR, & + NDIMS = 1, & + LTIMEDEP = .FALSE. ) + CALL IO_Field_write(TPFILE,TZFIELD,CSV_CHEM_LIST) END IF END IF ! -! CALL IO_Field_write(TPFILE,'LSUM', XLSUM) CALL IO_Field_write(TPFILE,'LSVM', XLSVM) CALL IO_Field_write(TPFILE,'LSWM', XLSWM) @@ -1709,29 +1183,31 @@ END IF ! IF (NSV >=1) THEN ! DO JSV = NSV_C2R2BEG,NSV_C2R2END ! IF (JSV == NSV_C2R2BEG ) THEN -! TZFIELD%CMNHNAME = 'RSVS_CLD1' -! TZFIELD%CSTDNAME = '' -! TZFIELD%CLONGNAME = 'RSVS_CLD1' -! TZFIELD%CUNITS = '1' -! TZFIELD%CDIR = 'XY' -! TZFIELD%CCOMMENT = 'X_Y_Z_RHS_CLD' -! TZFIELD%NGRID = 1 -! TZFIELD%NTYPE = TYPEREAL -! TZFIELD%NDIMS = 3 -! TZFIELD%LTIMEDEP = .TRUE. +! TZFIELD = TFIELDMETADATA( & +! CMNHNAME = 'RSVS_CLD1', & +! CSTDNAME = '', & +! CLONGNAME = 'RSVS_CLD1', & +! CUNITS = '1', & +! CDIR = 'XY', & +! CCOMMENT = 'X_Y_Z_RHS_CLD', & +! NGRID = 1, & +! NTYPE = TYPEREAL, & +! NDIMS = 3, & +! LTIMEDEP = .TRUE. ) ! CALL IO_Field_write(TPFILE,TZFIELD,XRRS_CLD(:,:,:,IRR)) ! END IF ! IF (JSV == NSV_C2R2END ) THEN -! TZFIELD%CMNHNAME = 'RSVS_CLD2' -! TZFIELD%CSTDNAME = '' -! TZFIELD%CLONGNAME = 'RSVS_CLD2' -! TZFIELD%CUNITS = '1' -! TZFIELD%CDIR = 'XY' -! TZFIELD%CCOMMENT = 'X_Y_Z_RHS_CLD' -! TZFIELD%NGRID = 1 -! TZFIELD%NTYPE = TYPEREAL -! TZFIELD%NDIMS = 3 -! TZFIELD%LTIMEDEP = .TRUE. +! TZFIELD = TFIELDMETADATA( & +! CMNHNAME = 'RSVS_CLD2', & +! CSTDNAME = '', & +! CLONGNAME = 'RSVS_CLD2', & +! CUNITS = '1', & +! CDIR = 'XY', & +! CCOMMENT = 'X_Y_Z_RHS_CLD', & +! NGRID = 1, & +! NTYPE = TYPEREAL, & +! NDIMS = 3, & +! LTIMEDEP = .TRUE. ) ! CALL IO_Field_write(TPFILE,TZFIELD,XRRS_CLD(:,:,:,IRR)) ! END IF ! END DO @@ -1758,8 +1234,10 @@ IF (CRAD /= 'NONE') THEN ! CALL PRINT_MSG(NVERB_INFO,'IO','WRITE_LFIFM_n','EMIS: writing only first band') CALL FIND_FIELD_ID_FROM_MNHNAME('EMIS',IID,IRESP) - TZFIELD = TFIELDLIST(IID) + TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) TZFIELD%NDIMS = 2 + TZFIELD%NDIMLIST(3) = TZFIELD%NDIMLIST(4) + TZFIELD%NDIMLIST(4) = NMNHDIM_UNUSED CALL IO_Field_write(TPFILE,TZFIELD,XEMIS(:,:,1)) ! CALL IO_Field_write(TPFILE,'TSRAD', XTSRAD) @@ -1787,17 +1265,17 @@ IF (CDCONV /= 'NONE' .OR. CSCONV == 'KAFR') THEN CALL IO_Field_write(TPFILE,'DRICONV', XDRICONV) ! CALL FIND_FIELD_ID_FROM_MNHNAME('PRCONV',IID,IRESP) - TZFIELD = TFIELDLIST(IID) + TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) TZFIELD%CUNITS = 'mm hour-1' CALL IO_Field_write(TPFILE,TZFIELD,XPRCONV*3.6E6) ! CALL FIND_FIELD_ID_FROM_MNHNAME('PACCONV',IID,IRESP) - TZFIELD = TFIELDLIST(IID) + TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) TZFIELD%CUNITS = 'mm' CALL IO_Field_write(TPFILE,TZFIELD,XPACCONV*1.0E3) ! CALL FIND_FIELD_ID_FROM_MNHNAME('PRSCONV',IID,IRESP) - TZFIELD = TFIELDLIST(IID) + TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) TZFIELD%CUNITS = 'mm hour-1' CALL IO_Field_write(TPFILE,TZFIELD,XPRSCONV*3.6E6) ! @@ -1811,95 +1289,20 @@ IF (CDCONV /= 'NONE' .OR. CSCONV == 'KAFR') THEN IF ( LCHTRANS .AND. NSV > 0 ) THEN ! scalar variables are recorded ! individually in the file - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 's-1' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - DO JSV = 1, NSV_USER - WRITE(TZFIELD%CMNHNAME,'(A7,I3.3)')'DSVCONV',JSV - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A7,I3.3)')'X_Y_Z_','DSVCONV',JSV - CALL IO_Field_write(TPFILE,TZFIELD,XDSVCONV(:,:,:,JSV)) - END DO - DO JSV = NSV_C2R2BEG, NSV_C2R2END - TZFIELD%CMNHNAME = 'DSVCONV_'//TRIM(C2R2NAMES(JSV-NSV_C2R2BEG+1)) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A7,I3.3)')'X_Y_Z_','DSVCONV',JSV - CALL IO_Field_write(TPFILE,TZFIELD,XDSVCONV(:,:,:,JSV)) - END DO - DO JSV = NSV_C1R3BEG, NSV_C1R3END - TZFIELD%CMNHNAME = 'DSVCONV_'//TRIM(C1R3NAMES(JSV-NSV_C1R3BEG+1)) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A7,I3.3)')'X_Y_Z_','DSVCONV',JSV - CALL IO_Field_write(TPFILE,TZFIELD,XDSVCONV(:,:,:,JSV)) - END DO - DO JSV = NSV_ELECBEG, NSV_ELECEND - TZFIELD%CMNHNAME = 'DSVCONV_'//TRIM(CELECNAMES(JSV-NSV_ELECBEG+1)) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A7,I3.3)')'X_Y_Z_','DSVCONV',JSV - CALL IO_Field_write(TPFILE,TZFIELD,XDSVCONV(:,:,:,JSV)) - END DO - DO JSV = NSV_PPBEG, NSV_PPEND - WRITE(TZFIELD%CMNHNAME,'(A7,I3.3)')'DSVCONV',JSV - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A7,I3.3)')'X_Y_Z_','DSVCONV',JSV - CALL IO_Field_write(TPFILE,TZFIELD,XDSVCONV(:,:,:,JSV)) - END DO -#ifdef MNH_FOREFIRE - IF (LFOREFIRE) THEN - DO JSV = NSV_FFBEG, NSV_FFEND - WRITE(TZFIELD%CMNHNAME,'(A7,I3.3)')'DSVCONV',JSV - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A7,I3.3)')'X_Y_Z_','DSVCONV',JSV - CALL IO_Field_write(TPFILE,TZFIELD,XDSVCONV(:,:,:,JSV)) - END DO - END IF -#endif - IF (LUSECHEM) THEN - DO JSV = NSV_CHEMBEG, NSV_CHEMEND - TZFIELD%CMNHNAME = 'DSVCONV_'//TRIM(UPCASE(CNAMES(JSV-NSV_CHEMBEG+1))) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A7,I3.3)')'X_Y_Z_','DSVCONV',JSV - CALL IO_Field_write(TPFILE,TZFIELD,XDSVCONV(:,:,:,JSV)) - END DO - IF (LORILAM) THEN - DO JSV = NSV_AERBEG, NSV_AEREND - TZFIELD%CMNHNAME = 'DSVCONV_'//TRIM(UPCASE(CAERONAMES(JSV-NSV_AERBEG+1))) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A7,I3.3)')'X_Y_Z_','DSVCONV',JSV - CALL IO_Field_write(TPFILE,TZFIELD,XDSVCONV(:,:,:,JSV)) - END DO - END IF -! linox scalar variables - ELSE IF (LCH_CONV_LINOX) THEN - DO JSV = NSV_LNOXBEG,NSV_LNOXEND - TZFIELD%CMNHNAME = 'DSVCONV_LINOX' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A7,I3.3)')'X_Y_Z_','DSVCONV',JSV - CALL IO_Field_write(TPFILE,TZFIELD,XDSVCONV(:,:,:,JSV)) - END DO - END IF - DO JSV = NSV_LGBEG, NSV_LGEND - TZFIELD%CMNHNAME = 'DSVCONV_'//TRIM(CLGNAMES(JSV-NSV_LGBEG+1)) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A7,I3.3)')'X_Y_Z_','DSVCONV',JSV - CALL IO_Field_write(TPFILE,TZFIELD,XDSVCONV(:,:,:,JSV)) - END DO - DO JSV = NSV_DSTBEG, NSV_DSTEND - TZFIELD%CMNHNAME = 'DSVCONV_'//TRIM(CDUSTNAMES(JSV-NSV_DSTBEG+1)) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A7,I3.3)')'X_Y_Z_','DSVCONV',JSV - CALL IO_Field_write(TPFILE,TZFIELD,XDSVCONV(:,:,:,JSV)) - END DO - DO JSV = NSV_SLTBEG, NSV_SLTEND - TZFIELD%CMNHNAME = 'DSVCONV_'//TRIM(CSALTNAMES(JSV-NSV_SLTBEG+1)) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A7,I3.3)')'X_Y_Z_','DSVCONV',JSV - CALL IO_Field_write(TPFILE,TZFIELD,XDSVCONV(:,:,:,JSV)) + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'generic for DSVCONV', & !Temporary name to ease identification + CUNITS = 's-1', & + CDIR = 'XY', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) + + DO JSV = 1, NSV + TZFIELD%CMNHNAME = 'DSVCONV_' // TRIM( TSVLIST(JSV)%CMNHNAME ) + TZFIELD%CLONGNAME = 'DSVCONV_' // TRIM( TSVLIST(JSV)%CLONGNAME ) + TZFIELD%CCOMMENT = 'Convective tendency for ' // TRIM( TSVLIST(JSV)%CMNHNAME ) + CALL IO_Field_write( TPFILE, TZFIELD, XDSVCONV(:,:,:,JSV) ) END DO END IF ! @@ -1912,12 +1315,12 @@ IF (CPROGRAM /= 'IDEAL') THEN IF (ASSOCIATED(XINPRC)) THEN IF (SIZE(XINPRC) /= 0 ) THEN CALL FIND_FIELD_ID_FROM_MNHNAME('INPRC',IID,IRESP) - TZFIELD = TFIELDLIST(IID) + TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) TZFIELD%CUNITS = 'mm hour-1' CALL IO_Field_write(TPFILE,TZFIELD,XINPRC*3.6E6) ! CALL FIND_FIELD_ID_FROM_MNHNAME('ACPRC',IID,IRESP) - TZFIELD = TFIELDLIST(IID) + TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) TZFIELD%CUNITS = 'mm' CALL IO_Field_write(TPFILE,TZFIELD,XACPRC*1.0E3) ! @@ -1927,12 +1330,12 @@ IF (CPROGRAM /= 'IDEAL') THEN IF (ASSOCIATED(XINDEP)) THEN IF (SIZE(XINDEP) /= 0 ) THEN CALL FIND_FIELD_ID_FROM_MNHNAME('INDEP',IID,IRESP) - TZFIELD = TFIELDLIST(IID) + TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) TZFIELD%CUNITS = 'mm hour-1' CALL IO_Field_write(TPFILE,TZFIELD,XINDEP*3.6E6) ! CALL FIND_FIELD_ID_FROM_MNHNAME('ACDEP',IID,IRESP) - TZFIELD = TFIELDLIST(IID) + TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) TZFIELD%CUNITS = 'mm' CALL IO_Field_write(TPFILE,TZFIELD,XACDEP*1.0E3) ! @@ -1942,7 +1345,7 @@ IF (CPROGRAM /= 'IDEAL') THEN IF (ASSOCIATED(XINPRR)) THEN IF (SIZE(XINPRR) /= 0 ) THEN CALL FIND_FIELD_ID_FROM_MNHNAME('INPRR',IID,IRESP) - TZFIELD = TFIELDLIST(IID) + TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) TZFIELD%CUNITS = 'mm hour-1' CALL IO_Field_write(TPFILE,TZFIELD,XINPRR*3.6E6) ! @@ -1950,7 +1353,7 @@ IF (CPROGRAM /= 'IDEAL') THEN CALL IO_Field_write(TPFILE,'EVAP3D', XEVAP3D) ! CALL FIND_FIELD_ID_FROM_MNHNAME('ACPRR',IID,IRESP) - TZFIELD = TFIELDLIST(IID) + TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) TZFIELD%CUNITS = 'mm' CALL IO_Field_write(TPFILE,TZFIELD,XACPRR*1.0E3) ! @@ -1960,12 +1363,12 @@ IF (CPROGRAM /= 'IDEAL') THEN IF (ASSOCIATED(XINPRS)) THEN IF (SIZE(XINPRS) /= 0 ) THEN CALL FIND_FIELD_ID_FROM_MNHNAME('INPRS',IID,IRESP) - TZFIELD = TFIELDLIST(IID) + TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) TZFIELD%CUNITS = 'mm hour-1' CALL IO_Field_write(TPFILE,TZFIELD,XINPRS*3.6E6) ! CALL FIND_FIELD_ID_FROM_MNHNAME('ACPRS',IID,IRESP) - TZFIELD = TFIELDLIST(IID) + TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) TZFIELD%CUNITS = 'mm' CALL IO_Field_write(TPFILE,TZFIELD,XACPRS*1.0E3) END IF @@ -1974,12 +1377,12 @@ IF (CPROGRAM /= 'IDEAL') THEN IF (ASSOCIATED(XINPRG)) THEN IF (SIZE(XINPRG) /= 0 ) THEN CALL FIND_FIELD_ID_FROM_MNHNAME('INPRG',IID,IRESP) - TZFIELD = TFIELDLIST(IID) + TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) TZFIELD%CUNITS = 'mm hour-1' CALL IO_Field_write(TPFILE,TZFIELD,XINPRG*3.6E6) ! CALL FIND_FIELD_ID_FROM_MNHNAME('ACPRG',IID,IRESP) - TZFIELD = TFIELDLIST(IID) + TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) TZFIELD%CUNITS = 'mm' CALL IO_Field_write(TPFILE,TZFIELD,XACPRG*1.0E3) END IF @@ -1988,12 +1391,12 @@ IF (CPROGRAM /= 'IDEAL') THEN IF (ASSOCIATED(XINPRH)) THEN IF (SIZE(XINPRH) /= 0 ) THEN CALL FIND_FIELD_ID_FROM_MNHNAME('INPRH',IID,IRESP) - TZFIELD = TFIELDLIST(IID) + TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) TZFIELD%CUNITS = 'mm hour-1' CALL IO_Field_write(TPFILE,TZFIELD,XINPRH*3.6E6) ! CALL FIND_FIELD_ID_FROM_MNHNAME('ACPRH',IID,IRESP) - TZFIELD = TFIELDLIST(IID) + TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) TZFIELD%CUNITS = 'mm' CALL IO_Field_write(TPFILE,TZFIELD,XACPRH*1.0E3) ENDIF @@ -2006,7 +1409,7 @@ IF (CPROGRAM /= 'IDEAL') THEN IF (SIZE(XINPRH) /= 0 ) ZWORK2D = ZWORK2D + XINPRH IF (SIZE(XINPRC) /= 0 ) ZWORK2D = ZWORK2D + XINPRC CALL FIND_FIELD_ID_FROM_MNHNAME('INPRT',IID,IRESP) - TZFIELD = TFIELDLIST(IID) + TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) TZFIELD%CUNITS = 'mm hour-1' CALL IO_Field_write(TPFILE,TZFIELD,ZWORK2D*3.6E6) ! @@ -2015,7 +1418,7 @@ IF (CPROGRAM /= 'IDEAL') THEN IF (SIZE(XINPRH) /= 0 ) ZWORK2D = ZWORK2D + XACPRH IF (SIZE(XINPRC) /= 0 ) ZWORK2D = ZWORK2D + XACPRC CALL FIND_FIELD_ID_FROM_MNHNAME('ACPRT',IID,IRESP) - TZFIELD = TFIELDLIST(IID) + TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) TZFIELD%CUNITS = 'mm' CALL IO_Field_write(TPFILE,TZFIELD,ZWORK2D*1.0E3) END IF @@ -2026,16 +1429,17 @@ END IF IF(LBLOWSNOW) THEN IF (ASSOCIATED(XSNWSUBL3D)) THEN IF (SIZE(XSNWSUBL3D) /= 0 ) THEN - TZFIELD%CMNHNAME = 'SNWSUBL3D' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'kg m-3 s-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_INstantaneous 3D Drifting snow sublimation flux' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'SNWSUBL3D', & + CSTDNAME = '', & + CLONGNAME = 'SNWSUBL3D', & + CUNITS = 'kg m-3 s-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_INstantaneous 3D Drifting snow sublimation flux', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,XSNWSUBL3D(:,:,:)) ZWORK2D(:,:) = 0. DO JK = IKB,IKE @@ -2044,16 +1448,17 @@ IF(LBLOWSNOW) THEN END DO ZWORK2D(:,:) = ZWORK2D(:,:)*1000. ! vapor water in mm unit ! - TZFIELD%CMNHNAME = 'COL_SNWSUBL' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'mm day-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Column Sublimation Rate (mmSWE/day)' - TZFIELD%NGRID = 4 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 2 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'COL_SNWSUBL', & + CSTDNAME = '', & + CLONGNAME = 'COL_SNWSUBL', & + CUNITS = 'mm day-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Column Sublimation Rate (mmSWE/day)', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK2D(:,:)) END IF END IF @@ -2065,52 +1470,56 @@ IF ((.NOT.LCOUPLES).AND.LOCEAN) THEN CALL IO_Field_write(TPFILE,'NFRCLT',NFRCLT) CALL IO_Field_write(TPFILE,'NINFRT',NINFRT) ! - TZFIELD%CMNHNAME = 'SSUFL_T' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'SSUFL' - TZFIELD%CUNITS = 'kg m-1 s-1' - TZFIELD%CDIR = '--' - TZFIELD%CCOMMENT = 'sfc stress along U to force ocean LES' - TZFIELD%NGRID = 0 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 1 - TZFIELD%LTIMEDEP = .FALSE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'SSUFL_T', & + CSTDNAME = '', & + CLONGNAME = 'SSUFL', & + CUNITS = 'kg m-1 s-1', & + CDIR = '--', & + CCOMMENT = 'sfc stress along U to force ocean LES', & + NGRID = 0, & + NTYPE = TYPEREAL, & + NDIMS = 1, & + LTIMEDEP = .FALSE. ) CALL IO_Field_write(TPFILE,TZFIELD,XSSUFL_T(:)) ! - TZFIELD%CMNHNAME = 'SSVFL_T' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'SSVFL' - TZFIELD%CUNITS = 'kg m-1 s-1' - TZFIELD%CDIR = '--' - TZFIELD%CCOMMENT = 'sfc stress along V to force ocean LES' - TZFIELD%NGRID = 0 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 1 - TZFIELD%LTIMEDEP = .FALSE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'SSVFL_T', & + CSTDNAME = '', & + CLONGNAME = 'SSVFL', & + CUNITS = 'kg m-1 s-1', & + CDIR = '--', & + CCOMMENT = 'sfc stress along V to force ocean LES', & + NGRID = 0, & + NTYPE = TYPEREAL, & + NDIMS = 1, & + LTIMEDEP = .FALSE. ) CALL IO_Field_write(TPFILE,TZFIELD,XSSVFL_T(:)) ! - TZFIELD%CMNHNAME = 'SSTFL_T' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'SSTFL' - TZFIELD%CUNITS = 'kg m3 K m s-1' - TZFIELD%CDIR = '--' - TZFIELD%CCOMMENT = 'sfc total heat flux to force ocean LES' - TZFIELD%NGRID = 0 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 1 - TZFIELD%LTIMEDEP = .FALSE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'SSTFL_T', & + CSTDNAME = '', & + CLONGNAME = 'SSTFL', & + CUNITS = 'kg m3 K m s-1', & + CDIR = '--', & + CCOMMENT = 'sfc total heat flux to force ocean LES', & + NGRID = 0, & + NTYPE = TYPEREAL, & + NDIMS = 1, & + LTIMEDEP = .FALSE. ) CALL IO_Field_write(TPFILE,TZFIELD,XSSTFL_T(:)) ! - TZFIELD%CMNHNAME = 'SSOLA_T' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'SSOLA' - TZFIELD%CUNITS = 'kg m3 K m s-1' - TZFIELD%CDIR = '--' - TZFIELD%CCOMMENT = 'sfc solar flux to force ocean LES' - TZFIELD%NGRID = 0 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 1 - TZFIELD%LTIMEDEP = .FALSE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'SSOLA_T', & + CSTDNAME = '', & + CLONGNAME = 'SSOLA', & + CUNITS = 'kg m3 K m s-1', & + CDIR = '--', & + CCOMMENT = 'sfc solar flux to force ocean LES', & + NGRID = 0, & + NTYPE = TYPEREAL, & + NDIMS = 1, & + LTIMEDEP = .FALSE. ) CALL IO_Field_write(TPFILE,TZFIELD,XSSOLA_T(:)) ! END IF ! ocean sfc forcing end @@ -2125,160 +1534,173 @@ IF (LFORCING) THEN ! WRITE (YFRC,'(I3.3)') JT ! - TZFIELD%CMNHNAME = 'DTFRC'//YFRC - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'seconds since YYYY-MM-DD HH:MM:SS.S' - TZFIELD%CDIR = '--' - TZFIELD%CCOMMENT = 'Date of forcing profile '//YFRC - TZFIELD%NGRID = 0 - TZFIELD%NTYPE = TYPEDATE - TZFIELD%NDIMS = 0 - TZFIELD%LTIMEDEP = .FALSE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'DTFRC'//YFRC, & + CSTDNAME = '', & + CLONGNAME = 'DTFRC'//YFRC, & + CUNITS = 'seconds since YYYY-MM-DD HH:MM:SS.S', & + CDIR = '--', & + CCOMMENT = 'Date of forcing profile '//YFRC, & + NGRID = 0, & + NTYPE = TYPEDATE, & + NDIMS = 0, & + LTIMEDEP = .FALSE. ) CALL IO_Field_write(TPFILE,TZFIELD,TDTFRC(JT)) ! - TZFIELD%CMNHNAME = 'UFRC'//YFRC - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'm s-1' - TZFIELD%CDIR = '--' - TZFIELD%CCOMMENT = 'Zonal component of horizontal forcing wind' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 1 - TZFIELD%LTIMEDEP = .FALSE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'UFRC'//YFRC, & + CSTDNAME = '', & + CLONGNAME = 'UFRC'//YFRC, & + CUNITS = 'm s-1', & + CDIR = '--', & + CCOMMENT = 'Zonal component of horizontal forcing wind', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 1, & + LTIMEDEP = .FALSE. ) CALL IO_Field_write(TPFILE,TZFIELD,XUFRC(:,JT)) ! - TZFIELD%CMNHNAME = 'VFRC'//YFRC - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'm s-1' - TZFIELD%CDIR = '--' - TZFIELD%CCOMMENT = 'Meridian component of horizontal forcing wind' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 1 - TZFIELD%LTIMEDEP = .FALSE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'VFRC'//YFRC, & + CSTDNAME = '', & + CLONGNAME = 'VFRC'//YFRC, & + CUNITS = 'm s-1', & + CDIR = '--', & + CCOMMENT = 'Meridian component of horizontal forcing wind', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 1, & + LTIMEDEP = .FALSE. ) CALL IO_Field_write(TPFILE,TZFIELD,XVFRC(:,JT)) ! - TZFIELD%CMNHNAME = 'WFRC'//YFRC - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'm s-1' - TZFIELD%CDIR = '--' - TZFIELD%CCOMMENT = 'Vertical forcing wind' - TZFIELD%NGRID = 4 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 1 - TZFIELD%LTIMEDEP = .FALSE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'WFRC'//YFRC, & + CSTDNAME = '', & + CLONGNAME = 'WFRC'//YFRC, & + CUNITS = 'm s-1', & + CDIR = '--', & + CCOMMENT = 'Vertical forcing wind', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 1, & + LTIMEDEP = .FALSE. ) CALL IO_Field_write(TPFILE,TZFIELD,XWFRC(:,JT)) ! - TZFIELD%CMNHNAME = 'THFRC'//YFRC - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'K' - TZFIELD%CDIR = '--' - TZFIELD%CCOMMENT = 'Forcing potential temperature' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 1 - TZFIELD%LTIMEDEP = .FALSE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'THFRC'//YFRC, & + CSTDNAME = '', & + CLONGNAME = 'THFRC'//YFRC, & + CUNITS = 'K', & + CDIR = '--', & + CCOMMENT = 'Forcing potential temperature', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 1, & + LTIMEDEP = .FALSE. ) CALL IO_Field_write(TPFILE,TZFIELD,XTHFRC(:,JT)) ! - TZFIELD%CMNHNAME = 'RVFRC'//YFRC - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'kg kg-1' - TZFIELD%CDIR = '--' - TZFIELD%CCOMMENT = 'Forcing vapor mixing ratio' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 1 - TZFIELD%LTIMEDEP = .FALSE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'RVFRC'//YFRC, & + CSTDNAME = '', & + CLONGNAME = 'RVFRC'//YFRC, & + CUNITS = 'kg kg-1', & + CDIR = '--', & + CCOMMENT = 'Forcing vapor mixing ratio', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 1, & + LTIMEDEP = .FALSE. ) CALL IO_Field_write(TPFILE,TZFIELD,XRVFRC(:,JT)) ! - TZFIELD%CMNHNAME = 'TENDTHFRC'//YFRC - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'K s-1' - TZFIELD%CDIR = '--' - TZFIELD%CCOMMENT = 'Large-scale potential temperature tendency for forcing' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 1 - TZFIELD%LTIMEDEP = .FALSE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'TENDTHFRC'//YFRC, & + CSTDNAME = '', & + CLONGNAME = 'TENDTHFRC'//YFRC, & + CUNITS = 'K s-1', & + CDIR = '--', & + CCOMMENT = 'Large-scale potential temperature tendency for forcing', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 1, & + LTIMEDEP = .FALSE. ) CALL IO_Field_write(TPFILE,TZFIELD,XTENDTHFRC(:,JT)) ! - TZFIELD%CMNHNAME = 'TENDRVFRC'//YFRC - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'kg kg-1 s-1' - TZFIELD%CDIR = '--' - TZFIELD%CCOMMENT = 'Large-scale vapor mixing ratio tendency for forcing' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 1 - TZFIELD%LTIMEDEP = .FALSE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'TENDRVFRC'//YFRC, & + CSTDNAME = '', & + CLONGNAME = 'TENDRVFRC'//YFRC, & + CUNITS = 'kg kg-1 s-1', & + CDIR = '--', & + CCOMMENT = 'Large-scale vapor mixing ratio tendency for forcing', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 1, & + LTIMEDEP = .FALSE. ) CALL IO_Field_write(TPFILE,TZFIELD,XTENDRVFRC(:,JT)) ! - TZFIELD%CMNHNAME = 'GXTHFRC'//YFRC - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'K m-1' - TZFIELD%CDIR = '--' - TZFIELD%CCOMMENT = 'Large-scale potential temperature gradient for forcing' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 1 - TZFIELD%LTIMEDEP = .FALSE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'GXTHFRC'//YFRC, & + CSTDNAME = '', & + CLONGNAME = 'GXTHFRC'//YFRC, & + CUNITS = 'K m-1', & + CDIR = '--', & + CCOMMENT = 'Large-scale potential temperature gradient for forcing', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 1, & + LTIMEDEP = .FALSE. ) CALL IO_Field_write(TPFILE,TZFIELD,XGXTHFRC(:,JT)) ! - TZFIELD%CMNHNAME = 'GYTHFRC'//YFRC - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'K m-1' - TZFIELD%CDIR = '--' - TZFIELD%CCOMMENT = 'Large-scale potential temperature gradient for forcing' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 1 - TZFIELD%LTIMEDEP = .FALSE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'GYTHFRC'//YFRC, & + CSTDNAME = '', & + CLONGNAME = 'GYTHFRC'//YFRC, & + CUNITS = 'K m-1', & + CDIR = '--', & + CCOMMENT = 'Large-scale potential temperature gradient for forcing', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 1, & + LTIMEDEP = .FALSE. ) CALL IO_Field_write(TPFILE,TZFIELD,XGYTHFRC(:,JT)) ! - TZFIELD%CMNHNAME = 'PGROUNDFRC'//YFRC - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'Pa' - TZFIELD%CDIR = '--' - TZFIELD%CCOMMENT = 'Forcing ground pressure' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 0 - TZFIELD%LTIMEDEP = .FALSE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'PGROUNDFRC'//YFRC, & + CSTDNAME = '', & + CLONGNAME = 'PGROUNDFRC'//YFRC, & + CUNITS = 'Pa', & + CDIR = '--', & + CCOMMENT = 'Forcing ground pressure', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 0, & + LTIMEDEP = .FALSE. ) CALL IO_Field_write(TPFILE,TZFIELD,XPGROUNDFRC(JT)) ! - TZFIELD%CMNHNAME = 'TENDUFRC'//YFRC - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'm s-1' - TZFIELD%CDIR = '--' - TZFIELD%CCOMMENT = 'Large-scale U tendency for forcing' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 1 - TZFIELD%LTIMEDEP = .FALSE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'TENDUFRC'//YFRC, & + CSTDNAME = '', & + CLONGNAME = 'TENDUFRC'//YFRC, & + CUNITS = 'm s-1', & + CDIR = '--', & + CCOMMENT = 'Large-scale U tendency for forcing', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 1, & + LTIMEDEP = .FALSE. ) CALL IO_Field_write(TPFILE,TZFIELD,XTENDUFRC(:,JT)) ! - TZFIELD%CMNHNAME = 'TENDVFRC'//YFRC - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'm s-1' - TZFIELD%CDIR = '--' - TZFIELD%CCOMMENT = 'Large-scale V tendency for forcing' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 1 - TZFIELD%LTIMEDEP = .FALSE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'TENDVFRC'//YFRC, & + CSTDNAME = '', & + CLONGNAME = 'TENDVFRC'//YFRC, & + CUNITS = 'm s-1', & + CDIR = '--', & + CCOMMENT = 'Large-scale V tendency for forcing', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 1, & + LTIMEDEP = .FALSE. ) CALL IO_Field_write(TPFILE,TZFIELD,XTENDVFRC(:,JT)) ! END DO @@ -2289,56 +1711,60 @@ END IF ! ------------------------------------------------------------------------- IF ( L2D_ADV_FRC ) THEN ! - TZFIELD%CMNHNAME = 'NADVFRC1' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'NADVFRC1' - TZFIELD%CUNITS = '1' - TZFIELD%CDIR = '--' - TZFIELD%CCOMMENT = 'Number of forcing profiles' - TZFIELD%NGRID = 0 - TZFIELD%NTYPE = TYPEINT - TZFIELD%NDIMS = 0 - TZFIELD%LTIMEDEP = .FALSE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'NADVFRC1', & + CSTDNAME = '', & + CLONGNAME = 'NADVFRC1', & + CUNITS = '1', & + CDIR = '--', & + CCOMMENT = 'Number of forcing profiles', & + NGRID = 0, & + NTYPE = TYPEINT, & + NDIMS = 0, & + LTIMEDEP = .FALSE. ) CALL IO_Field_write(TPFILE,TZFIELD,NADVFRC) ! DO JT=1,NADVFRC ! WRITE (YFRC,'(I3.3)') JT ! - TZFIELD%CMNHNAME = 'DTADV'//YFRC - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'seconds since YYYY-MM-DD HH:MM:SS.S' - TZFIELD%CDIR = '--' - TZFIELD%CCOMMENT = 'Date and time of the advecting forcing '//YFRC - TZFIELD%NGRID = 0 - TZFIELD%NTYPE = TYPEDATE - TZFIELD%NDIMS = 0 - TZFIELD%LTIMEDEP = .FALSE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'DTADV'//YFRC, & + CSTDNAME = '', & + CLONGNAME = 'DTADV'//YFRC, & + CUNITS = 'seconds since YYYY-MM-DD HH:MM:SS.S', & + CDIR = '--', & + CCOMMENT = 'Date and time of the advecting forcing '//YFRC, & + NGRID = 0, & + NTYPE = TYPEDATE, & + NDIMS = 0, & + LTIMEDEP = .FALSE. ) CALL IO_Field_write(TPFILE,TZFIELD,TDTADVFRC(JT)) -! - TZFIELD%CMNHNAME = 'TH_ADV'//YFRC - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'K s-1' - TZFIELD%CDIR = '--' - TZFIELD%CCOMMENT = '' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .FALSE. +! + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'TH_ADV'//YFRC, & + CSTDNAME = '', & + CLONGNAME = 'TH_ADV'//YFRC, & + CUNITS = 'K s-1', & + CDIR = '--', & + CCOMMENT = '', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .FALSE. ) CALL IO_Field_write(TPFILE,TZFIELD,XDTHFRC(:,:,:,JT)) ! - TZFIELD%CMNHNAME = 'Q_ADV'//YFRC - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'kg kg-1 s-1' - TZFIELD%CDIR = '--' - TZFIELD%CCOMMENT = '' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .FALSE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'Q_ADV'//YFRC, & + CSTDNAME = '', & + CLONGNAME = 'Q_ADV'//YFRC, & + CUNITS = 'kg kg-1 s-1', & + CDIR = '--', & + CCOMMENT = '', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .FALSE. ) CALL IO_Field_write(TPFILE,TZFIELD,XDRVFRC(:,:,:,JT)) ! ENDDO @@ -2346,56 +1772,60 @@ ENDIF ! IF ( L2D_REL_FRC ) THEN ! - TZFIELD%CMNHNAME = 'NRELFRC1' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'NRELFRC1' - TZFIELD%CUNITS = '1' - TZFIELD%CDIR = '--' - TZFIELD%CCOMMENT = 'Number of forcing profiles' - TZFIELD%NGRID = 0 - TZFIELD%NTYPE = TYPEINT - TZFIELD%NDIMS = 0 - TZFIELD%LTIMEDEP = .FALSE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'NRELFRC1', & + CSTDNAME = '', & + CLONGNAME = 'NRELFRC1', & + CUNITS = '1', & + CDIR = '--', & + CCOMMENT = 'Number of forcing profiles', & + NGRID = 0, & + NTYPE = TYPEINT, & + NDIMS = 0, & + LTIMEDEP = .FALSE. ) CALL IO_Field_write(TPFILE,TZFIELD,NRELFRC) ! DO JT=1,NRELFRC ! WRITE (YFRC,'(I3.3)') JT ! - TZFIELD%CMNHNAME = 'DTREL'//YFRC - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'seconds since YYYY-MM-DD HH:MM:SS.S' - TZFIELD%CDIR = '--' - TZFIELD%CCOMMENT = 'Date and time of the relaxation forcing '//YFRC - TZFIELD%NGRID = 0 - TZFIELD%NTYPE = TYPEDATE - TZFIELD%NDIMS = 0 - TZFIELD%LTIMEDEP = .FALSE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'DTREL'//YFRC, & + CSTDNAME = '', & + CLONGNAME = 'DTREL'//YFRC, & + CUNITS = 'seconds since YYYY-MM-DD HH:MM:SS.S', & + CDIR = '--', & + CCOMMENT = 'Date and time of the relaxation forcing '//YFRC, & + NGRID = 0, & + NTYPE = TYPEDATE, & + NDIMS = 0, & + LTIMEDEP = .FALSE. ) CALL IO_Field_write(TPFILE,TZFIELD,TDTRELFRC(JT)) ! - TZFIELD%CMNHNAME = 'TH_REL'//YFRC - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'K' - TZFIELD%CDIR = '--' - TZFIELD%CCOMMENT = '' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .FALSE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'TH_REL'//YFRC, & + CSTDNAME = '', & + CLONGNAME = 'TH_REL'//YFRC, & + CUNITS = 'K', & + CDIR = '--', & + CCOMMENT = '', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .FALSE. ) CALL IO_Field_write(TPFILE,TZFIELD,XTHREL(:,:,:,JT)) ! - TZFIELD%CMNHNAME = 'Q_REL'//YFRC - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'kg kg-1' - TZFIELD%CDIR = '--' - TZFIELD%CCOMMENT = '' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .FALSE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'Q_REL'//YFRC, & + CSTDNAME = '', & + CLONGNAME = 'Q_REL'//YFRC, & + CUNITS = 'kg kg-1', & + CDIR = '--', & + CCOMMENT = '', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .FALSE. ) CALL IO_Field_write(TPFILE,TZFIELD,XRVREL(:,:,:,JT)) ! ENDDO @@ -2413,6 +1843,7 @@ IF ( LUV_FLX) CALL IO_Field_write(TPFILE,'VU_FLX',XVU_FLUX_M) !* 1.14 Balloon variables ! ! +! Write balloon coordinates in backup file to allow restart with current balloon position IF (LFLYER) CALL WRITE_BALLOON_n(TPFILE) ! ! @@ -2464,19 +1895,21 @@ IF ( CPROGRAM=='REAL ' ) THEN !* 1.16 Dummy variables in PREP_REAL_CASE ! IF (ALLOCATED(CDUMMY_2D)) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = '' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 2 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'generic for CDUMMY_2D variables', & !Temporary name to ease identification + CSTDNAME = '', & + CUNITS = '', & + CDIR = 'XY', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) ! - DO JSA=1,SIZE(XDUMMY_2D,3) - TZFIELD%CMNHNAME = ADJUSTL(CDUMMY_2D(JSA)) + DO JI = 1, SIZE( XDUMMY_2D, 3 ) + TZFIELD%CMNHNAME = ADJUSTL(CDUMMY_2D(JI)) TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) TZFIELD%CCOMMENT = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME) - CALL IO_Field_write(TPFILE,TZFIELD,XDUMMY_2D(:,:,JSA)) + CALL IO_Field_write(TPFILE,TZFIELD,XDUMMY_2D(:,:,JI)) END DO END IF ! @@ -2487,11 +1920,15 @@ END IF ! i) Main ! IF (LMAIN_EOL .AND. IMI == NMODEL_EOL) THEN - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%CDIR = 'XY' - TZFIELD%CUNITS = 'N' + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'generic for wind turbine variables', & !Temporary name to ease identification + CSTDNAME = '', & + CUNITS = 'N', & + CDIR = 'XY', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ! TZFIELD%CMNHNAME = 'FX_RG' TZFIELD%CLONGNAME = 'FX_RG' @@ -2530,11 +1967,15 @@ SELECT CASE(CMETH_EOL) ! CASE('ADNR') ! Actuator Disc Non-Rotating ! - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 1 - TZFIELD%CDIR = '--' - TZFIELD%CUNITS = '1' + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'generic for ADNR variables', & !Temporary name to ease identification + CSTDNAME = '', & + CUNITS = '1', & + CDIR = '--', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 1, & + LTIMEDEP = .TRUE. ) ! TZFIELD%CMNHNAME = 'A_INDU' TZFIELD%CLONGNAME = 'INDUCTION_FACTOR' @@ -2566,9 +2007,13 @@ SELECT CASE(CMETH_EOL) ! CASE('ALM') ! Actuator Line Method ! - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%CDIR = '--' + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'generic for ALM variables', & !Temporary name to ease identification + CSTDNAME = '', & + CDIR = '--', & + NGRID = 1, & + NTYPE = TYPEREAL, & + LTIMEDEP = .TRUE. ) ! TZFIELD%NDIMS = 1 ! @@ -2632,9 +2077,13 @@ SELECT CASE(CMETH_EOL) ! IF (MEAN_COUNT /= 0) THEN ! - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%CDIR = '--' + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'generic for ALM mean variables', & !Temporary name to ease identification + CSTDNAME = '', & + CDIR = '--', & + NGRID = 1, & + NTYPE = TYPEREAL, & + LTIMEDEP = .TRUE. ) ! TZFIELD%NDIMS = 1 ! diff --git a/src/MNH/write_profilern.f90 b/src/MNH/write_profilern.f90 index 6b26649a2c78a0d5ab28a1c057a44dae2df15ffa..62264efabac858636ac5d392a24bd886aa440f36 100644 --- a/src/MNH/write_profilern.f90 +++ b/src/MNH/write_profilern.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2002-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2002-2022 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. @@ -10,7 +10,6 @@ ! G. Delautier 2016: LIMA ! C. Lac 10/2016: add visibility diagnostics for fog ! P. Wautelet 05/2016-04/2018: new data structures and calls for I/O -! J. Escobar 16/08/2018: From Pierre & Maud , correction use CNAMES(JSV-NSV_CHEMBEG+1) ! P. Wautelet 13/09/2019: budget: simplify and modernize date/time management ! P. Wautelet 09/10/2020: Write_diachro: use new datatype tpfields ! P. Wautelet 03/03/2021: budgets: add tbudiachrometadata type (useful to pass more information to Write_diachro) @@ -19,38 +18,54 @@ ! M. Taufour 07/2021: modify RARE for hydrometeors containing ice and add bright band calculation for RARE ! P. Wautelet 01/09/2021: fix: correct vertical dimension for ALT and W ! P. Wautelet 19/11/2021: bugfix in units for LIMA variables +! P. Wautelet 04/02/2022: use TSVLIST to manage metadata of scalar variables +! P. Wautelet 04/2022: restructure profilers for better performance, reduce memory usage and correct some problems/bugs !----------------------------------------------------------------- ! ########################### MODULE MODE_WRITE_PROFILER_n ! ########################### -! + +use modd_parameters, only: NCOMMENTLGTMAX, NMNHNAMELGTMAX, NUNITLGTMAX + implicit none private public :: WRITE_PROFILER_n -CHARACTER(LEN=100), DIMENSION(:), ALLOCATABLE :: CCOMMENT ! comment string -CHARACTER(LEN=100), DIMENSION(:), ALLOCATABLE :: CTITLE ! title -CHARACTER(LEN=100), DIMENSION(:), ALLOCATABLE :: CUNIT ! physical unit +CHARACTER(LEN=NCOMMENTLGTMAX), DIMENSION(:), ALLOCATABLE :: CCOMMENT ! comment string +CHARACTER(LEN=NMNHNAMELGTMAX), DIMENSION(:), ALLOCATABLE :: CTITLE ! title +CHARACTER(LEN=NUNITLGTMAX), DIMENSION(:), ALLOCATABLE :: CUNIT ! physical unit REAL, DIMENSION(:,:,:,:,:,:), ALLOCATABLE :: XWORK6 ! contains temporal serie contains ! -!##################################### -SUBROUTINE WRITE_PROFILER_n(TPDIAFILE) -!##################################### +!####################################### +SUBROUTINE WRITE_PROFILER_n( TPDIAFILE ) +!####################################### ! ! -!**** *WRITE_PROFILER* - write the balloon and aircraft trajectories and records -! in the diachronic file +!**** *WRITE_PROFILER* - write the profilers records in the diachronic file ! !* 0. DECLARATIONS ! ------------ ! -USE MODD_IO, ONLY: TFILEDATA -use MODD_PROFILER_n, only: NUMBPROFILER +USE MODD_CONF_n, ONLY: NRR +USE MODD_DIM_n, ONLY: NKMAX +USE MODD_IO, ONLY: ISNPROC, ISP, TFILEDATA +USE MODD_DIAG_IN_RUN, ONLY: LDIAG_IN_RUN +USE MODD_MPIF +USE MODD_NSV, ONLY: NSV +USE MODD_PARAMETERS, ONLY: JPVEXT +USE MODD_PARAM_n, ONLY: CCLOUD, CRAD, CTURB +USE MODD_PRECISION, ONLY: MNHINT_MPI, MNHREAL_MPI +USE MODD_PROFILER_n, only: NUMBPROFILER_LOC, TPROFILERS, tprofilers_time +USE MODD_RADIATIONS_n, ONLY: NAER +USE MODD_TYPE_STATPROF, ONLY: TPROFILERDATA +! +USE MODE_MSG +USE MODE_STATPROF_TOOLS, ONLY: PROFILER_ALLOCATE ! IMPLICIT NONE ! @@ -63,231 +78,408 @@ TYPE(TFILEDATA), INTENT(IN) :: TPDIAFILE ! diachronic file to write ! ! 0.2 declaration of local variables ! -INTEGER :: JI +INTEGER, PARAMETER :: ITAG = 100 +INTEGER :: IERR +INTEGER :: IKU +INTEGER :: JP, JS +INTEGER :: IDX +INTEGER :: INUMPROF ! Total number of profilers (for the current model) +INTEGER :: IPACKSIZE ! Size of the ZPACK buffer +INTEGER :: IPOS ! Position in the ZPACK buffer +INTEGER :: ISTORE +INTEGER, DIMENSION(:), ALLOCATABLE :: INPROFPRC ! Array to store the number of profilers per process (for the current model) +INTEGER, DIMENSION(:), ALLOCATABLE :: IPROFIDS ! Intermediate array for MPI communication +INTEGER, DIMENSION(:), ALLOCATABLE :: IPROFPRCRANK ! Array to store the ranks of the processes where the profilers are +INTEGER, DIMENSION(:), ALLOCATABLE :: IDS ! Array to store the profiler number to send +INTEGER, DIMENSION(:), ALLOCATABLE :: IDISP ! Array to store the displacements for MPI communications +REAL, DIMENSION(:), ALLOCATABLE :: ZPACK ! Buffer to store raw data of a profiler (used for MPI communication) +TYPE(TPROFILERDATA) :: TZPROFILER ! !---------------------------------------------------------------------------- ! -DO JI = 1, NUMBPROFILER - CALL PROFILER_DIACHRO_n( TPDIAFILE, JI ) -ENDDO -! -!---------------------------------------------------------------------------- +IKU = NKMAX + 2 * JPVEXT + +ALLOCATE( INPROFPRC(ISNPROC) ) +ALLOCATE( IDS(NUMBPROFILER_LOC) ) + +!Gather number of profiler present on each process +CALL MPI_ALLGATHER( NUMBPROFILER_LOC, 1, MNHINT_MPI, INPROFPRC, 1, MNHINT_MPI, TPDIAFILE%NMPICOMM, IERR ) + +!Store the identification number of local profilers (these numbers are globals) +DO JS = 1, NUMBPROFILER_LOC + IDS(JS) = TPROFILERS(JS)%NID +END DO + +ALLOCATE( IDISP(ISNPROC) ) +IDISP(1) = 0 +DO JP = 2, ISNPROC + IDISP(JP) = IDISP(JP-1) + INPROFPRC(JP-1) +END DO + +INUMPROF = SUM( INPROFPRC(:) ) +ALLOCATE( IPROFIDS(INUMPROF) ) +ALLOCATE( IPROFPRCRANK(INUMPROF) ) + +!Gather the list of all the profilers of all processes +CALL MPI_ALLGATHERV( IDS(:), NUMBPROFILER_LOC, MNHINT_MPI, IPROFIDS(:), INPROFPRC(:), & + IDISP(:), MNHINT_MPI, TPDIAFILE%NMPICOMM, IERR ) + +!Store the rank of each process corresponding to a given profiler +IDX = 1 +IPROFPRCRANK(:) = -1 +DO JP = 1, ISNPROC + DO JS = 1, INPROFPRC(JP) + IPROFPRCRANK(IPROFIDS(IDX)) = JP + IDX = IDX + 1 + END DO +END DO + +CALL PROFILER_ALLOCATE( TZPROFILER, SIZE( tprofilers_time%tpdates ) ) + +!Determine the size of the ZPACK buffer used to transfer profiler data in 1 MPI communication +IF ( ISNPROC > 1 ) THEN + ISTORE = SIZE( TPROFILERS_TIME%TPDATES ) + IPACKSIZE = 6 + IPACKSIZE = IPACKSIZE + ISTORE * IKU * ( 14 + NRR + NSV + NAER ) + IF ( CCLOUD == 'C2R2' .OR. CCLOUD == 'KHKO' ) IPACKSIZE = IPACKSIZE + ISTORE * IKU !VISIGUL + IF ( CCLOUD /= 'NONE' .AND. CCLOUD /= 'REVE' ) IPACKSIZE = IPACKSIZE + ISTORE * IKU !VISIKUN + IF ( CTURB == 'TKEL') IPACKSIZE = IPACKSIZE + ISTORE * IKU !Tke term + IF ( CCLOUD == 'ICE3' .OR. CCLOUD == 'ICE4' ) IPACKSIZE = IPACKSIZE + ISTORE * IKU !CIZ term + IPACKSIZE = IPACKSIZE + 4 * ISTORE + IF ( LDIAG_IN_RUN ) THEN + IPACKSIZE = IPACKSIZE + ISTORE * 10 + IF ( CRAD /= 'NONE' ) IPACKSIZE = IPACKSIZE + ISTORE * 4 + IPACKSIZE = IPACKSIZE + ISTORE * IKU !XTKE_DISS term + END IF + + ALLOCATE( ZPACK(IPACKSIZE) ) +END IF + +IDX = 1 + +PROFILER: DO JS = 1, INUMPROF + IF ( IPROFPRCRANK(JS) == TPDIAFILE%NMASTER_RANK ) THEN + !No communication necessary, the profiler data is already on the writer process + IF ( ISP == TPDIAFILE%NMASTER_RANK ) THEN + TZPROFILER = TPROFILERS(IDX) + IDX = IDX + 1 + END IF + ELSE + !The profiler data is not on the writer process + IF ( ISP == IPROFPRCRANK(JS) ) THEN + ! This process has the data and needs to send it to the writer process + IPOS = 1 + ZPACK(IPOS) = TPROFILERS(IDX)%NID; IPOS = IPOS + 1 + ZPACK(IPOS) = TPROFILERS(IDX)%XX; IPOS = IPOS + 1 + ZPACK(IPOS) = TPROFILERS(IDX)%XY; IPOS = IPOS + 1 + ZPACK(IPOS) = TPROFILERS(IDX)%XZ; IPOS = IPOS + 1 + ZPACK(IPOS) = TPROFILERS(IDX)%XLON; IPOS = IPOS + 1 + ZPACK(IPOS) = TPROFILERS(IDX)%XLAT; IPOS = IPOS + 1 + + ZPACK(IPOS:IPOS+ISTORE*IKU-1) = RESHAPE( TPROFILERS(IDX)%XZON(:,:), [ISTORE*IKU] ) ; IPOS = IPOS + ISTORE * IKU + ZPACK(IPOS:IPOS+ISTORE*IKU-1) = RESHAPE( TPROFILERS(IDX)%XMER(:,:), [ISTORE*IKU] ) ; IPOS = IPOS + ISTORE * IKU + ZPACK(IPOS:IPOS+ISTORE*IKU-1) = RESHAPE( TPROFILERS(IDX)%XFF(:,:), [ISTORE*IKU] ) ; IPOS = IPOS + ISTORE * IKU + ZPACK(IPOS:IPOS+ISTORE*IKU-1) = RESHAPE( TPROFILERS(IDX)%XDD(:,:), [ISTORE*IKU] ) ; IPOS = IPOS + ISTORE * IKU + ZPACK(IPOS:IPOS+ISTORE*IKU-1) = RESHAPE( TPROFILERS(IDX)%XW(:,:), [ISTORE*IKU] ) ; IPOS = IPOS + ISTORE * IKU + ZPACK(IPOS:IPOS+ISTORE*IKU-1) = RESHAPE( TPROFILERS(IDX)%XP(:,:), [ISTORE*IKU] ) ; IPOS = IPOS + ISTORE * IKU + ZPACK(IPOS:IPOS+ISTORE*IKU-1) = RESHAPE( TPROFILERS(IDX)%XZZ(:,:), [ISTORE*IKU] ) ; IPOS = IPOS + ISTORE * IKU + IF ( CTURB == 'TKEL') THEN + ZPACK(IPOS:IPOS+ISTORE*IKU-1) = RESHAPE( TPROFILERS(IDX)%XTKE(:,:), [ISTORE*IKU] ) ; IPOS = IPOS + ISTORE * IKU + END IF + ZPACK(IPOS:IPOS+ISTORE*IKU-1) = RESHAPE( TPROFILERS(IDX)%XTH(:,:), [ISTORE*IKU] ) ; IPOS = IPOS + ISTORE * IKU + ZPACK(IPOS:IPOS+ISTORE*IKU-1) = RESHAPE( TPROFILERS(IDX)%XTHV(:,:), [ISTORE*IKU] ) ; IPOS = IPOS + ISTORE * IKU + IF ( CCLOUD == 'C2R2' .OR. CCLOUD == 'KHKO' ) THEN + ZPACK(IPOS:IPOS+ISTORE*IKU-1) = RESHAPE( TPROFILERS(IDX)%XVISIGUL(:,:), [ISTORE*IKU] ) ; IPOS = IPOS + ISTORE * IKU + END IF + IF ( CCLOUD /= 'NONE' .AND. CCLOUD /= 'REVE' ) THEN + ZPACK(IPOS:IPOS+ISTORE*IKU-1) = RESHAPE( TPROFILERS(IDX)%XVISIKUN(:,:), [ISTORE*IKU] ) ; IPOS = IPOS + ISTORE * IKU + END IF + ZPACK(IPOS:IPOS+ISTORE*IKU-1) = RESHAPE( TPROFILERS(IDX)%XCRARE(:,:), [ISTORE*IKU] ) ; IPOS = IPOS + ISTORE * IKU + ZPACK(IPOS:IPOS+ISTORE*IKU-1) = RESHAPE( TPROFILERS(IDX)%XCRARE_ATT(:,:), [ISTORE*IKU] ) ; IPOS = IPOS + ISTORE * IKU + IF ( CCLOUD == 'ICE3' .OR. CCLOUD == 'ICE4' ) THEN + ZPACK(IPOS:IPOS+ISTORE*IKU-1) = RESHAPE( TPROFILERS(IDX)%XCIZ(:,:), [ISTORE*IKU] ) ; IPOS = IPOS + ISTORE * IKU + END IF + ZPACK(IPOS:IPOS+ISTORE*IKU-1) = RESHAPE( TPROFILERS(IDX)%XLWCZ(:,:), [ISTORE*IKU] ) ; IPOS = IPOS + ISTORE * IKU + ZPACK(IPOS:IPOS+ISTORE*IKU-1) = RESHAPE( TPROFILERS(IDX)%XIWCZ(:,:), [ISTORE*IKU] ) ; IPOS = IPOS + ISTORE * IKU + ZPACK(IPOS:IPOS+ISTORE*IKU-1) = RESHAPE( TPROFILERS(IDX)%XRHOD(:,:), [ISTORE*IKU] ) ; IPOS = IPOS + ISTORE * IKU + + ZPACK(IPOS:IPOS+ISTORE*IKU*NRR-1) = RESHAPE( TPROFILERS(IDX)%XR(:,:,:), [ISTORE*IKU*NRR] ) + IPOS = IPOS + ISTORE * IKU * NRR + ZPACK(IPOS:IPOS+ISTORE*IKU*NSV-1) = RESHAPE( TPROFILERS(IDX)%XSV(:,:,:), [ISTORE*IKU*NSV] ) + IPOS = IPOS + ISTORE * IKU * NSV + ZPACK(IPOS:IPOS+ISTORE*IKU*NAER-1) = RESHAPE( TPROFILERS(IDX)%XAER(:,:,:), [ISTORE*IKU*NAER] ) + IPOS = IPOS + ISTORE * IKU * NAER + + ZPACK(IPOS:IPOS+ISTORE-1) = TPROFILERS(IDX)%XIWV(:); IPOS = IPOS + ISTORE + ZPACK(IPOS:IPOS+ISTORE-1) = TPROFILERS(IDX)%XZTD(:); IPOS = IPOS + ISTORE + ZPACK(IPOS:IPOS+ISTORE-1) = TPROFILERS(IDX)%XZWD(:); IPOS = IPOS + ISTORE + ZPACK(IPOS:IPOS+ISTORE-1) = TPROFILERS(IDX)%XZHD(:); IPOS = IPOS + ISTORE + + IF ( LDIAG_IN_RUN ) THEN + ZPACK(IPOS:IPOS+ISTORE-1) = TPROFILERS(IDX)%XT2M; IPOS = IPOS + ISTORE + ZPACK(IPOS:IPOS+ISTORE-1) = TPROFILERS(IDX)%XQ2M; IPOS = IPOS + ISTORE + ZPACK(IPOS:IPOS+ISTORE-1) = TPROFILERS(IDX)%XHU2M; IPOS = IPOS + ISTORE + ZPACK(IPOS:IPOS+ISTORE-1) = TPROFILERS(IDX)%XZON10M; IPOS = IPOS + ISTORE + ZPACK(IPOS:IPOS+ISTORE-1) = TPROFILERS(IDX)%XMER10M; IPOS = IPOS + ISTORE + ZPACK(IPOS:IPOS+ISTORE-1) = TPROFILERS(IDX)%XRN; IPOS = IPOS + ISTORE + ZPACK(IPOS:IPOS+ISTORE-1) = TPROFILERS(IDX)%XH; IPOS = IPOS + ISTORE + ZPACK(IPOS:IPOS+ISTORE-1) = TPROFILERS(IDX)%XLE; IPOS = IPOS + ISTORE + ZPACK(IPOS:IPOS+ISTORE-1) = TPROFILERS(IDX)%XGFLUX; IPOS = IPOS + ISTORE + ZPACK(IPOS:IPOS+ISTORE-1) = TPROFILERS(IDX)%XLEI; IPOS = IPOS + ISTORE + IF ( CRAD /= 'NONE' ) THEN + ZPACK(IPOS:IPOS+ISTORE-1) = TPROFILERS(IDX)%XSWD; IPOS = IPOS + ISTORE + ZPACK(IPOS:IPOS+ISTORE-1) = TPROFILERS(IDX)%XSWU; IPOS = IPOS + ISTORE + ZPACK(IPOS:IPOS+ISTORE-1) = TPROFILERS(IDX)%XLWD; IPOS = IPOS + ISTORE + ZPACK(IPOS:IPOS+ISTORE-1) = TPROFILERS(IDX)%XLWU; IPOS = IPOS + ISTORE + END IF + ZPACK(IPOS:IPOS+ISTORE*IKU-1) = RESHAPE( TPROFILERS(IDX)%XTKE_DISS(:,:), [ISTORE*IKU] ) ; IPOS = IPOS + ISTORE * IKU + END IF + + IF ( IPOS-1 /= IPACKSIZE ) & + call Print_msg( NVERB_WARNING, 'IO', 'WRITE_PROFILER_n', 'IPOS-1 /= IPACKSIZE (sender side)', OLOCAL = .TRUE. ) + + CALL MPI_SEND( TPROFILERS(IDX)%CNAME, LEN(TPROFILERS(IDX)%CNAME), MPI_CHARACTER, TPDIAFILE%NMASTER_RANK - 1, & + ITAG, TPDIAFILE%NMPICOMM, IERR ) + CALL MPI_SEND( ZPACK, IPACKSIZE, MNHREAL_MPI, TPDIAFILE%NMASTER_RANK - 1, ITAG, TPDIAFILE%NMPICOMM, IERR ) + + IDX = IDX + 1 + + ELSE IF ( ISP == TPDIAFILE%NMASTER_RANK ) THEN + ! This process is the writer and will receive the profiler data from its owner + CALL MPI_RECV( TZPROFILER%CNAME, LEN(TZPROFILER%CNAME), MPI_CHARACTER, & + IPROFPRCRANK(JS) - 1, ITAG, TPDIAFILE%NMPICOMM, MPI_STATUS_IGNORE, IERR ) + CALL MPI_RECV( ZPACK, IPACKSIZE, MNHREAL_MPI, IPROFPRCRANK(JS) - 1, ITAG, TPDIAFILE%NMPICOMM, MPI_STATUS_IGNORE, IERR ) + + IPOS = 1 + TZPROFILER%NID = NINT( ZPACK(IPOS) ); IPOS = IPOS + 1 + TZPROFILER%XX = ZPACK(IPOS); IPOS = IPOS + 1 + TZPROFILER%XY = ZPACK(IPOS); IPOS = IPOS + 1 + TZPROFILER%XZ = ZPACK(IPOS); IPOS = IPOS + 1 + TZPROFILER%XLON = ZPACK(IPOS); IPOS = IPOS + 1 + TZPROFILER%XLAT = ZPACK(IPOS); IPOS = IPOS + 1 + + TZPROFILER%XZON(:,:) = RESHAPE( ZPACK(IPOS:IPOS+ISTORE*IKU-1), [ ISTORE, IKU ] ) ; IPOS = IPOS + ISTORE * IKU + TZPROFILER%XMER(:,:) = RESHAPE( ZPACK(IPOS:IPOS+ISTORE*IKU-1), [ ISTORE, IKU ] ) ; IPOS = IPOS + ISTORE * IKU + TZPROFILER%XFF(:,:) = RESHAPE( ZPACK(IPOS:IPOS+ISTORE*IKU-1), [ ISTORE, IKU ] ) ; IPOS = IPOS + ISTORE * IKU + TZPROFILER%XDD(:,:) = RESHAPE( ZPACK(IPOS:IPOS+ISTORE*IKU-1), [ ISTORE, IKU ] ) ; IPOS = IPOS + ISTORE * IKU + TZPROFILER%XW(:,:) = RESHAPE( ZPACK(IPOS:IPOS+ISTORE*IKU-1), [ ISTORE, IKU ] ) ; IPOS = IPOS + ISTORE * IKU + TZPROFILER%XP(:,:) = RESHAPE( ZPACK(IPOS:IPOS+ISTORE*IKU-1), [ ISTORE, IKU ] ) ; IPOS = IPOS + ISTORE * IKU + TZPROFILER%XZZ(:,:) = RESHAPE( ZPACK(IPOS:IPOS+ISTORE*IKU-1), [ ISTORE, IKU ] ) ; IPOS = IPOS + ISTORE * IKU + IF ( CTURB == 'TKEL') THEN + TZPROFILER%XTKE(:,:) = RESHAPE( ZPACK(IPOS:IPOS+ISTORE*IKU-1), [ ISTORE, IKU ] ) ; IPOS = IPOS + ISTORE * IKU + END IF + TZPROFILER%XTH(:,:) = RESHAPE( ZPACK(IPOS:IPOS+ISTORE*IKU-1), [ ISTORE, IKU ] ) ; IPOS = IPOS + ISTORE * IKU + TZPROFILER%XTHV(:,:) = RESHAPE( ZPACK(IPOS:IPOS+ISTORE*IKU-1), [ ISTORE, IKU ] ) ; IPOS = IPOS + ISTORE * IKU + IF ( CCLOUD == 'C2R2' .OR. CCLOUD == 'KHKO' ) THEN + TZPROFILER%XVISIGUL(:,:) = RESHAPE( ZPACK(IPOS:IPOS+ISTORE*IKU-1), [ ISTORE, IKU ] ) ; IPOS = IPOS + ISTORE * IKU + END IF + IF ( CCLOUD /= 'NONE' .AND. CCLOUD /= 'REVE' ) THEN + TZPROFILER%XVISIKUN(:,:) = RESHAPE( ZPACK(IPOS:IPOS+ISTORE*IKU-1), [ ISTORE, IKU ] ) ; IPOS = IPOS + ISTORE * IKU + END IF + TZPROFILER%XCRARE(:,:) = RESHAPE( ZPACK(IPOS:IPOS+ISTORE*IKU-1), [ ISTORE, IKU ] ) ; IPOS = IPOS + ISTORE * IKU + TZPROFILER%XCRARE_ATT(:,:) = RESHAPE( ZPACK(IPOS:IPOS+ISTORE*IKU-1), [ ISTORE, IKU ] ) ; IPOS = IPOS + ISTORE * IKU + IF ( CCLOUD == 'ICE3' .OR. CCLOUD == 'ICE4' ) THEN + TZPROFILER%XCIZ(:,:) = RESHAPE( ZPACK(IPOS:IPOS+ISTORE*IKU-1), [ ISTORE, IKU ] ) ; IPOS = IPOS + ISTORE * IKU + END IF + TZPROFILER%XLWCZ(:,:) = RESHAPE( ZPACK(IPOS:IPOS+ISTORE*IKU-1), [ ISTORE, IKU ] ) ; IPOS = IPOS + ISTORE * IKU + TZPROFILER%XIWCZ(:,:) = RESHAPE( ZPACK(IPOS:IPOS+ISTORE*IKU-1), [ ISTORE, IKU ] ) ; IPOS = IPOS + ISTORE * IKU + TZPROFILER%XRHOD(:,:) = RESHAPE( ZPACK(IPOS:IPOS+ISTORE*IKU-1), [ ISTORE, IKU ] ) ; IPOS = IPOS + ISTORE * IKU + + TZPROFILER%XR(:,:,:) = RESHAPE( ZPACK(IPOS:IPOS+ISTORE*IKU*NRR-1), [ ISTORE, IKU, NRR ] ) + IPOS = IPOS + ISTORE * IKU * NRR + TZPROFILER%XSV(:,:,:) = RESHAPE( ZPACK(IPOS:IPOS+ISTORE*IKU*NSV-1), [ ISTORE, IKU, NSV ] ) + IPOS = IPOS + ISTORE * IKU * NSV + TZPROFILER%XAER(:,:,:) = RESHAPE( ZPACK(IPOS:IPOS+ISTORE*IKU*NAER-1), [ ISTORE, IKU, NAER ] ) + IPOS = IPOS + ISTORE * IKU * NAER + + TZPROFILER%XIWV(:) = ZPACK(IPOS:IPOS+ISTORE-1) ; IPOS = IPOS + ISTORE + TZPROFILER%XZTD(:) = ZPACK(IPOS:IPOS+ISTORE-1) ; IPOS = IPOS + ISTORE + TZPROFILER%XZWD(:) = ZPACK(IPOS:IPOS+ISTORE-1) ; IPOS = IPOS + ISTORE + TZPROFILER%XZHD(:) = ZPACK(IPOS:IPOS+ISTORE-1) ; IPOS = IPOS + ISTORE + + IF ( LDIAG_IN_RUN ) THEN + TZPROFILER%XT2M = ZPACK(IPOS:IPOS+ISTORE-1) ; IPOS = IPOS + ISTORE + TZPROFILER%XQ2M = ZPACK(IPOS:IPOS+ISTORE-1) ; IPOS = IPOS + ISTORE + TZPROFILER%XHU2M = ZPACK(IPOS:IPOS+ISTORE-1) ; IPOS = IPOS + ISTORE + TZPROFILER%XZON10M = ZPACK(IPOS:IPOS+ISTORE-1) ; IPOS = IPOS + ISTORE + TZPROFILER%XMER10M = ZPACK(IPOS:IPOS+ISTORE-1) ; IPOS = IPOS + ISTORE + TZPROFILER%XRN = ZPACK(IPOS:IPOS+ISTORE-1) ; IPOS = IPOS + ISTORE + TZPROFILER%XH = ZPACK(IPOS:IPOS+ISTORE-1) ; IPOS = IPOS + ISTORE + TZPROFILER%XLE = ZPACK(IPOS:IPOS+ISTORE-1) ; IPOS = IPOS + ISTORE + TZPROFILER%XGFLUX = ZPACK(IPOS:IPOS+ISTORE-1) ; IPOS = IPOS + ISTORE + TZPROFILER%XLEI = ZPACK(IPOS:IPOS+ISTORE-1) ; IPOS = IPOS + ISTORE + IF ( CRAD /= 'NONE' ) THEN + TZPROFILER%XSWD = ZPACK(IPOS:IPOS+ISTORE-1) ; IPOS = IPOS + ISTORE + TZPROFILER%XSWU = ZPACK(IPOS:IPOS+ISTORE-1) ; IPOS = IPOS + ISTORE + TZPROFILER%XLWD = ZPACK(IPOS:IPOS+ISTORE-1) ; IPOS = IPOS + ISTORE + TZPROFILER%XLWU = ZPACK(IPOS:IPOS+ISTORE-1) ; IPOS = IPOS + ISTORE + END IF + TZPROFILER%XTKE_DISS(:,:) = RESHAPE( ZPACK(IPOS:IPOS+ISTORE*IKU-1), [ ISTORE, IKU ] ) ; IPOS = IPOS + ISTORE * IKU + END IF + + IF ( IPOS-1 /= IPACKSIZE ) & + call Print_msg( NVERB_WARNING, 'IO', 'WRITE_PROFILER_n', 'IPOS-1 /= IPACKSIZE (receiver side)', OLOCAL = .TRUE. ) + END IF + END IF + + CALL PROFILER_DIACHRO_n( TPDIAFILE, TZPROFILER ) + +END DO PROFILER + + END SUBROUTINE WRITE_PROFILER_n -!---------------------------------------------------------------------------- -!---------------------------------------------------------------------------- -SUBROUTINE PROFILER_DIACHRO_n( TPDIAFILE, KI ) +! #################################################### +SUBROUTINE PROFILER_DIACHRO_n( TPDIAFILE, TPPROFILER ) +! #################################################### use modd_budget, only: NLVL_CATEGORY, NLVL_SUBCATEGORY, NLVL_GROUP, NLVL_SHAPE, NLVL_TIMEAVG, NLVL_NORM, NLVL_MASK, & tbudiachrometadata -USE MODD_DIAG_IN_RUN, only: LDIAG_IN_RUN -USE MODD_DUST, ONLY: CDUSTNAMES, LDUST, NMODE_DST -USE MODD_CH_AEROSOL, ONLY: CAERONAMES, LORILAM, JPMODE -USE MODD_CH_M9_n, ONLY: CNAMES +USE MODD_CH_AEROSOL, ONLY: LORILAM, JPMODE +USE MODD_CONF_n, ONLY: NRR USE MODD_CST, ONLY: XRV -USE MODD_ELEC_DESCR, ONLY: CELECNAMES +USE MODD_DIAG_IN_RUN, only: LDIAG_IN_RUN +USE MODD_DUST, ONLY: LDUST, NMODE_DST +USE MODD_DIM_n, ONLY: NKMAX use modd_field, only: NMNHDIM_LEVEL, NMNHDIM_LEVEL_W, NMNHDIM_PROFILER_TIME, NMNHDIM_PROFILER_PROC, NMNHDIM_UNUSED, & - tfield_metadata_base, TYPEREAL -USE MODD_ICE_C1R3_DESCR, ONLY: C1R3NAMES + tfieldmetadata_base, TYPEREAL USE MODD_IO, ONLY: TFILEDATA -USE MODD_LG, ONLY: CLGNAMES -USE MODD_NSV -USE MODD_PARAMETERS, ONLY: XUNDEF -USE MODD_PARAM_LIMA, ONLY: NINDICE_CCN_IMM,NMOD_CCN,NMOD_IFN,NMOD_IMM -USE MODD_PARAM_LIMA_COLD, ONLY: CLIMA_COLD_NAMES -USE MODD_PARAM_LIMA_WARM, ONLY: CLIMA_WARM_NAMES, CAERO_MASS -USE MODD_PARAM_n, ONLY: CRAD +USE MODD_NSV, ONLY: tsvlist, nsv, nsv_aer, nsv_aerbeg, nsv_aerend, nsv_dst, nsv_dstbeg, nsv_dstend +USE MODD_PARAMETERS, ONLY: JPVEXT, XUNDEF +USE MODD_PARAM_n, ONLY: CCLOUD, CRAD, CTURB USE MODD_PROFILER_n USE MODD_RADIATIONS_n, ONLY: NAER -USE MODD_RAIN_C2R2_DESCR, ONLY: C2R2NAMES -USE MODD_SALT, ONLY: CSALTNAMES, LSALT -USE MODD_TYPE_PROFILER +USE MODD_SALT, ONLY: LSALT +USE MODD_TYPE_STATPROF ! USE MODE_AERO_PSD USE MODE_DUST_PSD use mode_write_diachro, only: Write_diachro ! -TYPE(TFILEDATA), INTENT(IN) :: TPDIAFILE ! diachronic file to write -INTEGER, INTENT(IN) :: KI +TYPE(TFILEDATA), INTENT(IN) :: TPDIAFILE ! diachronic file to write +TYPE(TPROFILERDATA), INTENT(IN) :: TPPROFILER ! !* 0.2 declaration of local variables for diachro ! -character(len=2) :: yidx -character(len=100) :: ycomment -character(len=100) :: yname -character(len=40) :: yunits -CHARACTER(LEN=:), allocatable :: YGROUP ! group title -INTEGER :: IKU -INTEGER :: IPROC ! number of variables records -INTEGER :: JPROC -integer :: jproc_alt, jproc_w -INTEGER :: JRR ! loop counter -INTEGER :: JSV ! loop counter -integer :: ji -integer :: irr !Number of moist variables -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRHO -REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZSV, ZN0, ZSIG, ZRG -type(tbudiachrometadata) :: tzbudiachro -type(tfield_metadata_base), dimension(:), allocatable :: tzfields +character(len=NMNHNAMELGTMAX) :: yname +character(len=NUNITLGTMAX) :: yunits +INTEGER :: IKU +INTEGER :: IPROC ! number of variables records +INTEGER :: JPROC +integer :: jproc_alt, jproc_w +INTEGER :: JRR ! loop counter +INTEGER :: JSV ! loop counter +integer :: ji +INTEGER :: ISTORE +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRHO +REAL, DIMENSION(:,:), ALLOCATABLE :: ZWORK +REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZSV, ZN0, ZSIG, ZRG +type(tbudiachrometadata) :: tzbudiachro +type(tfieldmetadata_base), dimension(:), allocatable :: tzfields ! !---------------------------------------------------------------------------- -! -IF (TPROFILER%X(KI)==XUNDEF) RETURN -IF (TPROFILER%Y(KI)==XUNDEF) RETURN -! -IKU = SIZE(TPROFILER%W,2) !Number of vertical levels + +IKU = NKMAX + 2 * JPVEXT !Number of vertical levels ! !IPROC is too large (not a big problem) due to the separation between vertical profiles and point values -IPROC = 25 + SIZE(TPROFILER%R,4) + SIZE(TPROFILER%SV,4) +IPROC = 25 + NRR + NSV IF (LDIAG_IN_RUN) IPROC = IPROC + 15 IF (LORILAM) IPROC = IPROC + JPMODE*3 IF (LDUST) IPROC = IPROC + NMODE_DST*3 IF (LDUST .OR. LORILAM .OR. LSALT) IPROC=IPROC+NAER -IF (SIZE(TPROFILER%TKE )>0) IPROC = IPROC + 1 -! -ALLOCATE (XWORK6(1,1,IKU,size(tprofiler%tpdates),1,IPROC)) -ALLOCATE (CCOMMENT(IPROC)) -ALLOCATE (CTITLE (IPROC)) -ALLOCATE (CUNIT (IPROC)) -! -YGROUP = TPROFILER%NAME(KI) +IF ( CTURB == 'TKEL' ) IPROC = IPROC + 1 + +ISTORE = SIZE( TPROFILERS_TIME%TPDATES ) + +ALLOCATE ( XWORK6(1, 1, IKU, ISTORE, 1, IPROC) ) +ALLOCATE ( CCOMMENT(IPROC) ) +ALLOCATE ( CTITLE (IPROC) ) +ALLOCATE ( CUNIT (IPROC) ) ! !---------------------------------------------------------------------------- !Treat vertical profiles jproc = 0 -call Add_profile( 'Th', 'Potential temperature', 'K', tprofiler%th ) -call Add_profile( 'Thv', 'Virtual Potential temperature', 'K', tprofiler%thv ) -call Add_profile( 'VISI', 'Visibility', 'km', tprofiler%visi ) -call Add_profile( 'VISIKUN', 'Visibility Kunkel', 'km', tprofiler%visikun ) -call Add_profile( 'RARE', 'Radar reflectivity', 'dBZ', tprofiler%crare ) -call Add_profile( 'RAREatt', 'Radar attenuated reflectivity', 'dBZ', tprofiler%crare_att ) -call Add_profile( 'P', 'Pressure', 'Pa', tprofiler%p ) -call Add_profile( 'ALT', 'Altitude', 'm', tprofiler%zz ) +call Add_profile( 'Th', 'Potential temperature', 'K', tpprofiler%xth ) +call Add_profile( 'Thv', 'Virtual Potential temperature', 'K', tpprofiler%xthv ) +if ( ccloud == 'C2R2' .or. ccloud == 'KHKO' ) & + call Add_profile( 'VISIGUL', 'Visibility Gultepe', 'km', tpprofiler%xvisigul ) +if ( ccloud /= 'NONE' .and. ccloud /= 'REVE' ) & + call Add_profile( 'VISIKUN', 'Visibility Kunkel', 'km', tpprofiler%xvisikun ) +call Add_profile( 'RARE', 'Radar reflectivity', 'dBZ', tpprofiler%xcrare ) +call Add_profile( 'RAREatt', 'Radar attenuated reflectivity', 'dBZ', tpprofiler%xcrare_att ) +call Add_profile( 'P', 'Pressure', 'Pa', tpprofiler%xp ) +call Add_profile( 'ALT', 'Altitude', 'm', tpprofiler%xzz ) !Store position of ALT in the field list. Useful because it is not computed on the same Arakawa-grid points jproc_alt = jproc -call Add_profile( 'ZON_WIND', 'Zonal wind', 'm s-1', tprofiler%zon ) -call Add_profile( 'MER_WIND', 'Meridional wind', 'm s-1', tprofiler%mer ) -call Add_profile( 'FF', 'Wind intensity', 'm s-1', tprofiler%ff ) -call Add_profile( 'DD', 'Wind direction', 'degree', tprofiler%dd ) -call Add_profile( 'W', 'Air vertical speed', 'm s-1', tprofiler%w ) +call Add_profile( 'ZON_WIND', 'Zonal wind', 'm s-1', tpprofiler%xzon ) +call Add_profile( 'MER_WIND', 'Meridional wind', 'm s-1', tpprofiler%xmer ) +call Add_profile( 'FF', 'Wind intensity', 'm s-1', tpprofiler%xff ) +call Add_profile( 'DD', 'Wind direction', 'degree', tpprofiler%xdd ) +call Add_profile( 'W', 'Air vertical speed', 'm s-1', tpprofiler%xw ) !Store position of W in the field list. Useful because it is not computed on the same Arakawa-grid points jproc_w = jproc if ( ldiag_in_run ) & - call Add_profile( 'TKE_DISS', 'TKE dissipation rate', 'm2 s-2', tprofiler% tke_diss ) - -if ( Size( tprofiler%ciz, 1 ) > 0 ) & - call Add_profile( 'CIT', 'Ice concentration', 'kg-3', tprofiler%ciz ) - -irr = Size( tprofiler%r ) -if ( irr >= 1 ) call Add_profile( 'Rv', 'Water vapor mixing ratio', 'kg kg-1', tprofiler%r(:,:,:,1) ) -if ( irr >= 2 ) call Add_profile( 'Rc', 'Liquid cloud water mixing ratio', 'kg kg-1', tprofiler%r(:,:,:,2) ) -if ( irr >= 3 ) call Add_profile( 'Rr', 'Rain water mixing ratio', 'kg kg-1', tprofiler%r(:,:,:,3) ) -if ( irr >= 4 ) call Add_profile( 'Ri', 'Ice cloud water mixing ratio', 'kg kg-1', tprofiler%r(:,:,:,4) ) -if ( irr >= 5 ) call Add_profile( 'Rs', 'Snow mixing ratio', 'kg kg-1', tprofiler%r(:,:,:,5) ) -if ( irr >= 6 ) call Add_profile( 'Rg', 'Graupel mixing ratio', 'kg kg-1', tprofiler%r(:,:,:,6) ) -if ( irr >= 7 ) call Add_profile( 'Rh', 'Hail mixing ratio', 'kg kg-1', tprofiler%r(:,:,:,7) ) - -call Add_profile( 'Rhod', 'Density of dry air in moist', 'kg m-3', tprofiler%rhod ) -if ( Size( tprofiler%tke, 1 ) > 0 ) & - call Add_profile( 'Tke', 'Turbulent kinetic energy', 'm2 s-2', tprofiler%tke ) - -if ( Size( tprofiler%sv, 4 ) > 0 ) then - ! User scalar variables - do jsv = 1, nsv_user - Write ( yname, fmt = '( a2, i3.3 )' ) 'Sv', jsv - call Add_profile( yname, '', 'kg kg-1', tprofiler%sv(:,:,:,jsv) ) - end do - ! Passive pollutant scalar variables - do jsv = nsv_ppbeg, nsv_ppend - Write ( yname, fmt = '( a2, i3.3 )' ) 'Sv', jsv - call Add_profile( yname, '', '1', tprofiler%sv(:,:,:,jsv) ) - end do - ! microphysical C2R2 scheme scalar variables - do jsv = nsv_ppbeg, nsv_ppend - call Add_profile( Trim( c2r2names(jsv - nsv_c2r2beg + 1) ), '', 'm-3', tprofiler%sv(:,:,:,jsv) ) - end do - ! microphysical C3R5 scheme additional scalar variables - do jsv = nsv_c1r3beg, nsv_c1r3end - call Add_profile( Trim( c1r3names(jsv - nsv_c1r3beg + 1) ), '', 'm-3', tprofiler%sv(:,:,:,jsv) ) - end do - ! LIMA variables - do jsv = nsv_lima_beg, nsv_lima_end - yunits = 'kg-1' - if ( jsv == nsv_lima_nc ) then - yname = Trim( clima_warm_names(1) ) // 'T' - else if ( jsv == nsv_lima_nr ) then - yname = Trim( clima_warm_names(2) ) // 'T' - else if ( jsv >= nsv_lima_ccn_free .and. jsv < nsv_lima_ccn_free + nmod_ccn ) then - Write( yidx, '( i2.2 )' ) jsv - nsv_lima_ccn_free + 1 - yname = Trim( clima_warm_names(3) ) // yidx // 'T' - else if ( jsv >= nsv_lima_ccn_acti .and. jsv < nsv_lima_ccn_acti + nmod_ccn ) then - Write( yidx, '( i2.2 )' ) jsv - nsv_lima_ccn_acti + 1 - yname = Trim( clima_warm_names(4) ) // yidx // 'T' - else if ( jsv == nsv_lima_scavmass ) then - yname = Trim( caero_mass(1) ) // 'T' - yunits = 'kg kg-1' - else if ( jsv == nsv_lima_ni ) then - yname = Trim( clima_cold_names(1) ) // 'T' - else if ( jsv == nsv_lima_ns ) then - yname = Trim( clima_cold_names(2) ) // 'T' - else if ( jsv == nsv_lima_ng ) then - yname = Trim( clima_cold_names(3) ) // 'T' - else if ( jsv == nsv_lima_nh ) then - yname = Trim( clima_cold_names(4) ) // 'T' - else if ( jsv >= nsv_lima_ifn_free .and. jsv < nsv_lima_ifn_free + nmod_ifn ) then - Write( yidx, '( i2.2 )' ) jsv - nsv_lima_ifn_free + 1 - yname = Trim( clima_cold_names(5) ) // yidx // 'T' - else if ( jsv >= nsv_lima_ifn_nucl .and. jsv < nsv_lima_ifn_nucl + nmod_ifn ) then - Write( yidx, '( i2.2 )' ) jsv - nsv_lima_ifn_nucl + 1 - yname = Trim( clima_cold_names(6) ) // yidx // 'T' - else if ( jsv >= nsv_lima_imm_nucl .and. jsv < nsv_lima_imm_nucl + nmod_imm ) then - write( yidx, '( i2.2 )' ) nindice_ccn_imm(jsv - nsv_lima_imm_nucl + 1) - yname = Trim( clima_cold_names(7) ) // yidx // 'T' - else if ( jsv == nsv_lima_hom_haze ) then - yname = Trim( clima_cold_names(8) ) // 'T' - else if ( jsv == nsv_lima_spro ) then - yname = Trim( clima_warm_names(5) ) // 'T' + call Add_profile( 'TKE_DISS', 'TKE dissipation rate', 'm2 s-2', tpprofiler%xtke_diss ) + +if ( ccloud == 'ICE3' .or. ccloud == 'ICE4' ) & + call Add_profile( 'CIT', 'Ice concentration', 'kg-3', tpprofiler%xciz ) + +if ( nrr >= 1 ) call Add_profile( 'Rv', 'Water vapor mixing ratio', 'kg kg-1', tpprofiler%xr(:,:,1) ) +if ( nrr >= 2 ) call Add_profile( 'Rc', 'Liquid cloud water mixing ratio', 'kg kg-1', tpprofiler%xr(:,:,2) ) +if ( nrr >= 3 ) call Add_profile( 'Rr', 'Rain water mixing ratio', 'kg kg-1', tpprofiler%xr(:,:,3) ) +if ( nrr >= 4 ) call Add_profile( 'Ri', 'Ice cloud water mixing ratio', 'kg kg-1', tpprofiler%xr(:,:,4) ) +if ( nrr >= 5 ) call Add_profile( 'Rs', 'Snow mixing ratio', 'kg kg-1', tpprofiler%xr(:,:,5) ) +if ( nrr >= 6 ) call Add_profile( 'Rg', 'Graupel mixing ratio', 'kg kg-1', tpprofiler%xr(:,:,6) ) +if ( nrr >= 7 ) call Add_profile( 'Rh', 'Hail mixing ratio', 'kg kg-1', tpprofiler%xr(:,:,7) ) + +call Add_profile( 'Rhod', 'Density of dry air in moist', 'kg m-3', tpprofiler%xrhod ) +if ( cturb == 'TKEL') & + call Add_profile( 'Tke', 'Turbulent kinetic energy', 'm2 s-2', tpprofiler%xtke ) + +if ( nsv > 0 ) then + ! Scalar variables + Allocate( zwork, mold = tpprofiler%xsv(:,:,1) ) + do jsv = 1, nsv + if ( Trim( tsvlist(jsv)%cunits ) == 'ppv' ) then + yunits = 'ppb' + zwork = tpprofiler%xsv(:,:,jsv) * 1.e9 !*1e9 for conversion ppv->ppb + else + yunits = Trim( tsvlist(jsv)%cunits ) + zwork = tpprofiler%xsv(:,:,jsv) end if - call Add_profile( yname, '', yunits, tprofiler%sv(:,:,:,jsv) ) - end do - ! electrical scalar variables - do jsv = nsv_elecbeg, nsv_elecend - call Add_profile( Trim( celecnames(jsv - nsv_elecbeg + 1) ), '', 'C', tprofiler%sv(:,:,:,jsv) ) + call Add_profile( tsvlist(jsv)%cmnhname, '', yunits, zwork ) end do - ! chemical scalar variables - do jsv = nsv_chembeg, nsv_chemend - Write( ycomment, '( a5, a3, i3.3 )' ) 'T(s) ', 'SVT', jsv - call Add_profile( Trim( cnames(jsv - nsv_chembeg + 1) ), ycomment, 'ppb', tprofiler%sv(:,:,:,jsv) * 1.e9 ) - end do - IF ( LORILAM .AND. .NOT.(ANY(TPROFILER%P(:,:,KI) == 0.)) ) THEN - ALLOCATE (ZSV (1,iku,size(tprofiler%tpdates),NSV_AER)) - ALLOCATE (ZRHO(1,iku,size(tprofiler%tpdates))) - ALLOCATE (ZN0 (1,iku,size(tprofiler%tpdates),JPMODE)) - ALLOCATE (ZRG (1,iku,size(tprofiler%tpdates),JPMODE)) - ALLOCATE (ZSIG(1,iku,size(tprofiler%tpdates),JPMODE)) + Deallocate( zwork ) + + IF ( LORILAM .AND. .NOT.(ANY(TPPROFILER%XP(:,:) == 0.)) ) THEN + ALLOCATE (ZSV (1,iku,ISTORE,NSV_AER)) + ALLOCATE (ZRHO(1,iku,ISTORE)) + ALLOCATE (ZN0 (1,iku,ISTORE,JPMODE)) + ALLOCATE (ZRG (1,iku,ISTORE,JPMODE)) + ALLOCATE (ZSIG(1,iku,ISTORE,JPMODE)) do ji = 1, iku - ZSV(1,ji,:,1:NSV_AER) = TPROFILER%SV(:,ji,KI,NSV_AERBEG:NSV_AEREND) + ZSV(1,ji,:,1:NSV_AER) = TPPROFILER%XSV(:,ji,NSV_AERBEG:NSV_AEREND) end do - IF (SIZE(TPROFILER%R,4) >0) THEN + IF ( NRR > 0) THEN ZRHO(1,:,:) = 0. do ji = 1, iku - DO JRR=1,SIZE(TPROFILER%R,4) - ZRHO(1,ji,:) = ZRHO(1,ji,:) + TPROFILER%R(:,ji,KI,JRR) + DO JRR = 1, NRR + ZRHO(1,ji,:) = ZRHO(1,ji,:) + TPPROFILER%XR(:,ji,JRR) ENDDO - ZRHO(1,ji,:) = TPROFILER%TH(:,ji,KI) * ( 1. + XRV/XRD*TPROFILER%R(:,ji,KI,1) ) & + ZRHO(1,ji,:) = TPPROFILER%XTH(:,ji) * ( 1. + XRV/XRD*TPPROFILER%XR(:,ji,1) ) & / ( 1. + ZRHO(1,ji,:) ) end do ELSE do ji = 1, iku - ZRHO(1,ji,:) = TPROFILER%TH(:,ji,KI) + ZRHO(1,ji,:) = TPPROFILER%XTH(:,ji) end do ENDIF do ji = 1, iku - ZRHO(1,ji,:) = TPROFILER%P(:,ji,KI) / & - (XRD *ZRHO(1,ji,:) *((TPROFILER%P(:,ji,KI)/XP00)**(XRD/XCPD)) ) + ZRHO(1,ji,:) = TPPROFILER%XP(:,ji) / & + (XRD *ZRHO(1,ji,:) *((TPPROFILER%XP(:,ji)/XP00)**(XRD/XCPD)) ) end do CALL PPP2AERO(ZSV,ZRHO, PSIG3D=ZSIG, PRG3D=ZRG, PN3D=ZN0) DO JSV=1,JPMODE @@ -319,36 +511,32 @@ if ( Size( tprofiler%sv, 4 ) > 0 ) then DEALLOCATE (ZSV,ZRHO) DEALLOCATE (ZN0,ZRG,ZSIG) END IF - ! dust scalar variables - do jsv = nsv_dstbeg, nsv_dstend - call Add_profile( Trim( cdustnames(jsv - nsv_dstbeg + 1) ), '', 'ppb', tprofiler%sv(:,:,:,jsv) * 1.e9 ) - end do - IF ((LDUST).AND. .NOT.(ANY(TPROFILER%P(:,:,KI) == 0.))) THEN - ALLOCATE (ZSV (1,iku,size(tprofiler%tpdates),NSV_DST)) - ALLOCATE (ZRHO(1,iku,size(tprofiler%tpdates))) - ALLOCATE (ZN0 (1,iku,size(tprofiler%tpdates),NMODE_DST)) - ALLOCATE (ZRG (1,iku,size(tprofiler%tpdates),NMODE_DST)) - ALLOCATE (ZSIG(1,iku,size(tprofiler%tpdates),NMODE_DST)) + IF ((LDUST).AND. .NOT.(ANY(TPPROFILER%XP(:,:) == 0.))) THEN + ALLOCATE (ZSV (1,iku,ISTORE,NSV_DST)) + ALLOCATE (ZRHO(1,iku,ISTORE)) + ALLOCATE (ZN0 (1,iku,ISTORE,NMODE_DST)) + ALLOCATE (ZRG (1,iku,ISTORE,NMODE_DST)) + ALLOCATE (ZSIG(1,iku,ISTORE,NMODE_DST)) do ji = 1, iku - ZSV(1,ji,:,1:NSV_DST) = TPROFILER%SV(:,ji,KI,NSV_DSTBEG:NSV_DSTEND) + ZSV(1,ji,:,1:NSV_DST) = TPPROFILER%XSV(:,ji,NSV_DSTBEG:NSV_DSTEND) end do - IF (SIZE(TPROFILER%R,4) >0) THEN + IF ( NRR > 0 ) THEN ZRHO(1,:,:) = 0. do ji = 1, iku - DO JRR=1,SIZE(TPROFILER%R,4) - ZRHO(1,ji,:) = ZRHO(1,ji,:) + TPROFILER%R(:,ji,KI,JRR) + DO JRR = 1, NRR + ZRHO(1,ji,:) = ZRHO(1,ji,:) + TPPROFILER%XR(:,ji,JRR) ENDDO - ZRHO(1,ji,:) = TPROFILER%TH(:,ji,KI) * ( 1. + XRV/XRD*TPROFILER%R(:,ji,KI,1) ) & + ZRHO(1,ji,:) = TPPROFILER%XTH(:,ji) * ( 1. + XRV/XRD*TPPROFILER%XR(:,ji,1) ) & / ( 1. + ZRHO(1,ji,:) ) end do ELSE do ji = 1, iku - ZRHO(1,ji,:) = TPROFILER%TH(:,ji,KI) + ZRHO(1,ji,:) = TPPROFILER%XTH(:,ji) end do ENDIF do ji = 1, iku - ZRHO(1,ji,:) = TPROFILER%P(:,ji,KI) / & - (XRD *ZRHO(1,ji,:) *((TPROFILER%P(:,ji,KI)/XP00)**(XRD/XCPD)) ) + ZRHO(1,ji,:) = TPPROFILER%XP(:,ji) / & + (XRD *ZRHO(1,ji,:) *((TPPROFILER%XP(:,ji)/XP00)**(XRD/XCPD)) ) end do CALL PPP2DUST(ZSV,ZRHO, PSIG3D=ZSIG, PRG3D=ZRG, PN3D=ZN0) DO JSV=1,NMODE_DST @@ -380,14 +568,10 @@ if ( Size( tprofiler%sv, 4 ) > 0 ) then DEALLOCATE (ZSV,ZRHO) DEALLOCATE (ZN0,ZRG,ZSIG) END IF - ! sea salt scalar variables - do jsv = nsv_sltbeg, nsv_sltend - call Add_profile( Trim( csaltnames(jsv - nsv_sltbeg + 1) ), '', 'ppb', tprofiler%sv(:,:,:,jsv) * 1.e9 ) - end do if ( ldust .or. lorilam .or. lsalt ) then do jsv = 1, naer Write( yname, '( a, i1 )' ) 'AEREXT', jsv - call Add_profile( yname, 'Aerosol Extinction', '1', tprofiler%aer(:,:,:,jsv) ) + call Add_profile( yname, 'Aerosol Extinction', '1', tpprofiler%xaer(:,:,jsv) ) end do end if end if @@ -420,12 +604,12 @@ tzbudiachro%clevels (NLVL_SUBCATEGORY) = '' tzbudiachro%ccomments(NLVL_SUBCATEGORY) = '' tzbudiachro%lleveluse(NLVL_GROUP) = .true. -tzbudiachro%clevels (NLVL_GROUP) = ygroup -tzbudiachro%ccomments(NLVL_GROUP) = 'Data at position of profiler ' // Trim( ygroup ) +tzbudiachro%clevels (NLVL_GROUP) = tpprofiler%cname +tzbudiachro%ccomments(NLVL_GROUP) = 'Data at position of profiler ' // Trim( tpprofiler%cname ) tzbudiachro%lleveluse(NLVL_SHAPE) = .true. tzbudiachro%clevels (NLVL_SHAPE) = 'Vertical_profile' -tzbudiachro%ccomments(NLVL_SHAPE) = 'Vertical profiles at position of profiler ' // Trim( ygroup ) +tzbudiachro%ccomments(NLVL_SHAPE) = 'Vertical profiles at position of profiler ' // Trim( tpprofiler%cname ) tzbudiachro%lleveluse(NLVL_TIMEAVG) = .false. tzbudiachro%clevels (NLVL_TIMEAVG) = 'Not_time_averaged' @@ -461,7 +645,7 @@ tzbudiachro%njh = 1 tzbudiachro%nkl = 1 tzbudiachro%nkh = iku -call Write_diachro( tpdiafile, tzbudiachro, tzfields, tprofiler%tpdates, xwork6(:,:,:,:,:,:jproc) ) +call Write_diachro( tpdiafile, tzbudiachro, tzfields, tprofilers_time%tpdates, xwork6(:,:,:,:,:,:jproc) ) Deallocate( tzfields ) Deallocate( xwork6 ) @@ -469,33 +653,33 @@ Deallocate( xwork6 ) !---------------------------------------------------------------------------- !Treat point values -ALLOCATE (XWORK6(1,1,1,size(tprofiler%tpdates),1,IPROC)) +ALLOCATE ( XWORK6(1, 1, 1, ISTORE, 1, IPROC) ) jproc = 0 if ( ldiag_in_run ) then - call Add_point( 'T2m', '2-m temperature', 'K', tprofiler%t2m ) - call Add_point( 'Q2m', '2-m humidity', 'kg kg-1', tprofiler%q2m ) - call Add_point( 'HU2m', '2-m relative humidity', 'percent', tprofiler%hu2m ) - call Add_point( 'zon10m', '10-m zonal wind', 'm s-1', tprofiler%zon10m ) - call Add_point( 'mer10m', '10-m meridian wind', 'm s-1', tprofiler%mer10m ) - call Add_point( 'RN', 'Net radiation', 'W m-2', tprofiler%rn ) - call Add_point( 'H', 'Sensible heat flux', 'W m-2', tprofiler%h ) - call Add_point( 'LE', 'Total Latent heat flux', 'W m-2', tprofiler%le ) - call Add_point( 'G', 'Storage heat flux', 'W m-2', tprofiler%gflux ) + call Add_point( 'T2m', '2-m temperature', 'K', tpprofiler%xt2m ) + call Add_point( 'Q2m', '2-m humidity', 'kg kg-1', tpprofiler%xq2m ) + call Add_point( 'HU2m', '2-m relative humidity', 'percent', tpprofiler%xhu2m ) + call Add_point( 'zon10m', '10-m zonal wind', 'm s-1', tpprofiler%xzon10m ) + call Add_point( 'mer10m', '10-m meridian wind', 'm s-1', tpprofiler%xmer10m ) + call Add_point( 'RN', 'Net radiation', 'W m-2', tpprofiler%xrn ) + call Add_point( 'H', 'Sensible heat flux', 'W m-2', tpprofiler%xh ) + call Add_point( 'LE', 'Total Latent heat flux', 'W m-2', tpprofiler%xle ) + call Add_point( 'G', 'Storage heat flux', 'W m-2', tpprofiler%xgflux ) if ( crad /= 'NONE' ) then - call Add_point( 'SWD', 'Downward short-wave radiation', 'W m-2', tprofiler%swd ) - call Add_point( 'SWU', 'Upward short-wave radiation', 'W m-2', tprofiler%swu ) - call Add_point( 'LWD', 'Downward long-wave radiation', 'W m-2', tprofiler%lwd ) - call Add_point( 'LWU', 'Upward long-wave radiation', 'W m-2', tprofiler%lwu ) + call Add_point( 'SWD', 'Downward short-wave radiation', 'W m-2', tpprofiler%xswd ) + call Add_point( 'SWU', 'Upward short-wave radiation', 'W m-2', tpprofiler%xswu ) + call Add_point( 'LWD', 'Downward long-wave radiation', 'W m-2', tpprofiler%xlwd ) + call Add_point( 'LWU', 'Upward long-wave radiation', 'W m-2', tpprofiler%xlwu ) end if - call Add_point( 'LEI', 'Solid Latent heat flux', 'W m-2', tprofiler%lei ) + call Add_point( 'LEI', 'Solid Latent heat flux', 'W m-2', tpprofiler%xlei ) end if -call Add_point( 'IWV', 'Integrated Water Vapour', 'kg m-2', tprofiler%iwv ) -call Add_point( 'ZTD', 'Zenith Tropospheric Delay', 'm', tprofiler%ztd ) -call Add_point( 'ZWD', 'Zenith Wet Delay', 'm', tprofiler%zwd ) -call Add_point( 'ZHD', 'Zenith Hydrostatic Delay', 'm', tprofiler%zhd ) +call Add_point( 'IWV', 'Integrated Water Vapour', 'kg m-2', tpprofiler%xiwv ) +call Add_point( 'ZTD', 'Zenith Tropospheric Delay', 'm', tpprofiler%xztd ) +call Add_point( 'ZWD', 'Zenith Wet Delay', 'm', tpprofiler%xzwd ) +call Add_point( 'ZHD', 'Zenith Hydrostatic Delay', 'm', tpprofiler%xzhd ) Allocate( tzfields( jproc ) ) @@ -523,12 +707,12 @@ tzbudiachro%clevels (NLVL_SUBCATEGORY) = '' tzbudiachro%ccomments(NLVL_SUBCATEGORY) = '' tzbudiachro%lleveluse(NLVL_GROUP) = .true. -tzbudiachro%clevels (NLVL_GROUP) = ygroup -tzbudiachro%ccomments(NLVL_GROUP) = 'Data at position of profiler ' // Trim( ygroup ) +tzbudiachro%clevels (NLVL_GROUP) = tpprofiler%cname +tzbudiachro%ccomments(NLVL_GROUP) = 'Data at position of profiler ' // Trim( tpprofiler%cname ) tzbudiachro%lleveluse(NLVL_SHAPE) = .true. tzbudiachro%clevels (NLVL_SHAPE) = 'Point' -tzbudiachro%ccomments(NLVL_SHAPE) = 'Values at position of profiler ' // Trim( ygroup ) +tzbudiachro%ccomments(NLVL_SHAPE) = 'Values at position of profiler ' // Trim( tpprofiler%cname ) tzbudiachro%lleveluse(NLVL_TIMEAVG) = .false. tzbudiachro%clevels (NLVL_TIMEAVG) = 'Not_time_averaged' @@ -560,7 +744,7 @@ tzbudiachro%njh = 1 tzbudiachro%nkl = 1 tzbudiachro%nkh = 1 -call Write_diachro( tpdiafile, tzbudiachro, tzfields, tprofiler%tpdates, xwork6(:,:,:,:,:,:jproc) ) +call Write_diachro( tpdiafile, tzbudiachro, tzfields, tprofilers_time%tpdates, xwork6(:,:,:,:,:,:jproc) ) Deallocate( tzfields ) @@ -574,13 +758,13 @@ JPROC = JPROC + 1 CTITLE (JPROC) = 'LON' CUNIT (JPROC) = 'degree' CCOMMENT (JPROC) = 'Longitude' -XWORK6 (1,1,1,:,1,JPROC) = TPROFILER%LON(KI) +XWORK6 (1,1,1,:,1,JPROC) = TPPROFILER%XLON JPROC = JPROC + 1 CTITLE (JPROC) = 'LAT' CUNIT (JPROC) = 'degree' CCOMMENT (JPROC) = 'Latitude' -XWORK6 (1,1,1,:,1,JPROC) = TPROFILER%LAT(KI) +XWORK6 (1,1,1,:,1,JPROC) = TPPROFILER%XLAT Allocate( tzfields( jproc ) ) @@ -599,7 +783,7 @@ tzfields(:)%ndimlist(4) = NMNHDIM_UNUSED tzfields(:)%ndimlist(5) = NMNHDIM_UNUSED tzfields(:)%ndimlist(6) = NMNHDIM_PROFILER_PROC -call Write_diachro( tpdiafile, tzbudiachro, tzfields, tprofiler%tpdates, xwork6(:,:,:,:,:,:jproc) ) +call Write_diachro( tpdiafile, tzbudiachro, tzfields, tprofilers_time%tpdates, xwork6(:,:,:,:,:,:jproc) ) !Necessary because global variables (private inside module) @@ -608,7 +792,6 @@ Deallocate (ccomment) Deallocate (ctitle ) Deallocate (cunit ) - contains @@ -616,23 +799,23 @@ subroutine Add_profile( htitle, hcomment, hunits, pfield ) use mode_msg -character(len=*), intent(in) :: htitle -character(len=*), intent(in) :: hcomment -character(len=*), intent(in) :: hunits -real, dimension(:,:,:), intent(in) :: pfield +character(len=*), intent(in) :: htitle +character(len=*), intent(in) :: hcomment +character(len=*), intent(in) :: hunits +real, dimension(:,:), intent(in) :: pfield integer :: jk jproc = jproc + 1 -if ( jproc > iproc ) call Print_msg( NVERB_FATAL, 'IO', 'Add_profile', 'more profiles than expected' ) +if ( jproc > iproc ) call Print_msg( NVERB_FATAL, 'IO', 'Add_profile', 'more processes than expected' ) -ctitle(jproc) = Trim( htitle) +ctitle(jproc) = Trim( htitle ) ccomment(jproc) = Trim( hcomment ) cunit(jproc) = Trim( hunits ) do jk = 1, iku - xwork6(1, 1, jk, :, 1, jproc) = pfield(:, jk, ki) + xwork6(1, 1, jk, :, 1, jproc) = pfield(:, jk) end do end subroutine Add_profile @@ -642,22 +825,22 @@ subroutine Add_point( htitle, hcomment, hunits, pfield ) use mode_msg -character(len=*), intent(in) :: htitle -character(len=*), intent(in) :: hcomment -character(len=*), intent(in) :: hunits -real, dimension(:,:), intent(in) :: pfield +character(len=*), intent(in) :: htitle +character(len=*), intent(in) :: hcomment +character(len=*), intent(in) :: hunits +real, dimension(:), intent(in) :: pfield integer :: jk jproc = jproc + 1 -if ( jproc > iproc ) call Print_msg( NVERB_FATAL, 'IO', 'Add_profile', 'more profiles than expected' ) +if ( jproc > iproc ) call Print_msg( NVERB_FATAL, 'IO', 'Add_point', 'more processes than expected' ) ctitle(jproc) = Trim( htitle) ccomment(jproc) = Trim( hcomment ) cunit(jproc) = Trim( hunits ) -xwork6(1, 1, 1, :, 1, jproc) = pfield(:, ki) +xwork6(1, 1, 1, :, 1, jproc) = pfield(:) end subroutine Add_point diff --git a/src/MNH/write_seriesn.f90 b/src/MNH/write_seriesn.f90 index 54ed6c7c8cc5667860dc1c0bc285787c09f76772..62999fff5f6b00cc7cc4939150669c14894f29a3 100644 --- a/src/MNH/write_seriesn.f90 +++ b/src/MNH/write_seriesn.f90 @@ -74,7 +74,7 @@ use modd_budget, only: NLVL_CATEGORY, NLVL_SUBCATEGORY, NLVL_GROUP, NLVL_ use modd_field, only: NMNHDIM_NI, NMNHDIM_NI_U, & NMNHDIM_SERIES_LEVEL, NMNHDIM_SERIES_LEVEL_W, NMNHDIM_SERIES_TIME, NMNHDIM_SERIES_PROC, & NMNHDIM_UNUSED, & - tfield_metadata_base, TYPEREAL + tfieldmetadata_base, TYPEREAL USE MODD_IO, ONLY: NGEN_VERB, TFILEDATA USE MODD_LUNIT_n, ONLY: TLUOUT USE MODD_PARAMETERS @@ -117,9 +117,9 @@ INTEGER :: INFO_ll ! Return code of FM-routines INTEGER :: ISER,INAV REAL :: ZSIZEHB CHARACTER(LEN=100) :: YMSG -type(tbudiachrometadata) :: tzbudiachro -type(tfield_metadata_base), dimension(:), allocatable :: tzfields -type(tfiledata) :: tzfile +type(tbudiachrometadata) :: tzbudiachro +type(tfieldmetadata_base), dimension(:), allocatable :: tzfields +type(tfiledata) :: tzfile !---------------------------------------------------------------------------- ! !* 1. INITIALIZATION diff --git a/src/MNH/write_stationn.f90 b/src/MNH/write_stationn.f90 index 7efb9adaa863a844ec485d803cec0a409b8b69e6..309b4eb21b6f089d388f11b2e4808bfe637cbf15 100644 --- a/src/MNH/write_stationn.f90 +++ b/src/MNH/write_stationn.f90 @@ -1,97 +1,61 @@ -!MNH_LIC Copyright 2002-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2002-2022 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 MODI_WRITE_STATION_n -! ########################### -! -INTERFACE -! - SUBROUTINE WRITE_STATION_n(TPDIAFILE) -! -USE MODD_IO, ONLY: TFILEDATA -! -TYPE(TFILEDATA), INTENT(IN) :: TPDIAFILE ! diachronic file to write -! -END SUBROUTINE WRITE_STATION_n -! -END INTERFACE -! -END MODULE MODI_WRITE_STATION_n -! -! ########################################## - SUBROUTINE WRITE_STATION_n(TPDIAFILE) -! ########################################## +! Author: +! P. Tulet 15/02/2002 ! -! -!!**** *WRITE_STATION* - write the balloon and aircraft trajectories and records -!! in the diachronic file -!! -!! PURPOSE -!! ------- -! -! -!!** METHOD -!! ------ -!! -!! -!! -!! -!! -!! EXTERNAL -!! -------- -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! -!! REFERENCE -!! --------- -!! -!! AUTHOR -!! ------ -!! Pierre TULET * Meteo-France * -!! -!! MODIFICATIONS -!! ------------- -!! Original 15/02/2002 -!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O +! Modifications +! P. Wautelet: 05/2016-04/2018: new data structures and calls for I/O ! P. Wautelet 13/09/2019: budget: simplify and modernize date/time management ! P. Wautelet 09/10/2020: Write_diachro: use new datatype tpfields ! P. Wautelet 03/03/2021: budgets: add tbudiachrometadata type (useful to pass more information to Write_diachro) +! P. Wautelet 04/02/2022: use TSVLIST to manage metadata of scalar variables +! P. Wautelet 04/2022: restructure stations for better performance, reduce memory usage and correct some problems/bugs ! -------------------------------------------------------------------------- +! ########################### +MODULE MODE_WRITE_STATION_n +! ########################### + +use modd_parameters, only: NCOMMENTLGTMAX, NMNHNAMELGTMAX, NUNITLGTMAX + +implicit none + +private + +public :: WRITE_STATION_n + +CHARACTER(LEN=NCOMMENTLGTMAX), DIMENSION(:), ALLOCATABLE :: CCOMMENT ! comment string +CHARACTER(LEN=NMNHNAMELGTMAX), DIMENSION(:), ALLOCATABLE :: CTITLE ! title +CHARACTER(LEN=NUNITLGTMAX), DIMENSION(:), ALLOCATABLE :: CUNIT ! physical unit + +REAL, DIMENSION(:,:,:,:,:,:), ALLOCATABLE :: XWORK6 ! contains temporal serie + +contains +! +! ##################################### +SUBROUTINE WRITE_STATION_n( TPDIAFILE ) +! ##################################### +! +! +!**** *WRITE_STATION* - write the stations records in the diachronic file ! !* 0. DECLARATIONS ! ------------ ! -use MODD_BUDGET, ONLY: tbudiachrometadata -USE MODD_CH_M9_n, ONLY: CNAMES -USE MODD_CH_AEROSOL, ONLY: CAERONAMES, LORILAM, JPMODE -USE MODD_CONF -USE MODD_CST -USE MODD_DIAG_IN_RUN -USE MODD_DIM_n -USE MODD_DUST, ONLY: CDUSTNAMES, LDUST, NMODE_DST -USE MODD_ELEC_DESCR, ONLY: CELECNAMES -USE MODD_GRID_n -USE MODD_ICE_C1R3_DESCR, ONLY: C1R3NAMES -USE MODD_IO, ONLY: TFILEDATA -USE MODD_LG, ONLY: CLGNAMES -USE MODD_LUNIT -USE MODD_NSV -USE MODD_PARAMETERS -USE MODD_PARAM_n, ONLY: CRAD, CSURF -USE MODD_PASPOL -USE MODD_RAIN_C2R2_DESCR, ONLY: C2R2NAMES -USE MODD_SALT, ONLY: CSALTNAMES, LSALT, NMODE_SLT -USE MODD_STATION_n USE MODD_ALLSTATION_n, ONLY: LDIAG_SURFRAD -! -USE MODE_AERO_PSD -USE MODE_DUST_PSD -USE MODE_SALT_PSD -use MODE_WRITE_DIACHRO, ONLY: Write_diachro +USE MODD_CONF_n, ONLY: NRR +USE MODD_IO, ONLY: ISNPROC, ISP, TFILEDATA +USE MODD_MPIF +USE MODD_NSV, ONLY: nsv +USE MODD_PARAM_n, ONLY: CRAD, CSURF, CTURB +USE MODD_PRECISION, ONLY: MNHINT_MPI, MNHREAL_MPI +USE MODD_STATION_n, only: NUMBSTAT_LOC, TSTATIONS, tstations_time +USE MODD_TYPE_STATPROF, ONLY: TSTATIONDATA +! +USE MODE_MSG +USE MODE_STATPROF_TOOLS, ONLY: STATION_ALLOCATE ! IMPLICIT NONE ! @@ -104,653 +68,569 @@ TYPE(TFILEDATA), INTENT(IN) :: TPDIAFILE ! diachronic file to write ! ! 0.2 declaration of local variables ! -INTEGER :: II ! loop -INTEGER :: K ! loop -! -!---------------------------------------------------------------------------- -! -DO II=1,NUMBSTAT -CALL STATION_DIACHRO_n(TSTATION, II) -ENDDO +INTEGER, PARAMETER :: ITAG = 100 +INTEGER :: IERR +INTEGER :: JP, JS +INTEGER :: IDX +INTEGER :: INUMSTAT ! Total number of stations (for the current model) +INTEGER :: IPACKSIZE ! Size of the ZPACK buffer +INTEGER :: IPOS ! Position in the ZPACK buffer +INTEGER :: ISTORE +INTEGER, DIMENSION(:), ALLOCATABLE :: INSTATPRC ! Array to store the number of stations per process (for the current model) +INTEGER, DIMENSION(:), ALLOCATABLE :: ISTATIDS ! Intermediate array for MPI communication +INTEGER, DIMENSION(:), ALLOCATABLE :: ISTATPRCRANK ! Array to store the ranks of the processes where the stations are +INTEGER, DIMENSION(:), ALLOCATABLE :: IDS ! Array to store the station number to send +INTEGER, DIMENSION(:), ALLOCATABLE :: IDISP ! Array to store the displacements for MPI communications +REAL, DIMENSION(:), ALLOCATABLE :: ZPACK ! Buffer to store raw data of a station (used for MPI communication) +TYPE(TSTATIONDATA) :: TZSTATION ! !---------------------------------------------------------------------------- -!---------------------------------------------------------------------------- -! -CONTAINS -! -!---------------------------------------------------------------------------- -!---------------------------------------------------------------------------- -! -!---------------------------------------------------------------------------- -SUBROUTINE STATION_DIACHRO_n(TSTATION,II) -use modd_budget, only: NLVL_CATEGORY, NLVL_SUBCATEGORY, NLVL_GROUP, NLVL_SHAPE, NLVL_TIMEAVG, NLVL_NORM, NLVL_MASK -use modd_field, only: NMNHDIM_STATION_TIME, NMNHDIM_STATION_PROC, NMNHDIM_UNUSED, & - tfield_metadata_base, TYPEREAL +ALLOCATE( INSTATPRC(ISNPROC) ) +ALLOCATE( IDS(NUMBSTAT_LOC) ) + +!Gather number of station present on each process +CALL MPI_ALLGATHER( NUMBSTAT_LOC, 1, MNHINT_MPI, INSTATPRC, 1, MNHINT_MPI, TPDIAFILE%NMPICOMM, IERR ) + +!Store the identification number of local stations (these numbers are globals) +DO JS = 1, NUMBSTAT_LOC + IDS(JS) = TSTATIONS(JS)%NID +END DO + +ALLOCATE( IDISP(ISNPROC) ) +IDISP(1) = 0 +DO JP = 2, ISNPROC + IDISP(JP) = IDISP(JP-1) + INSTATPRC(JP-1) +END DO + +INUMSTAT = SUM( INSTATPRC(:) ) +ALLOCATE( ISTATIDS(INUMSTAT) ) +ALLOCATE( ISTATPRCRANK(INUMSTAT) ) + +!Gather the list of all the stations of all processes +CALL MPI_ALLGATHERV( IDS(:), NUMBSTAT_LOC, MNHINT_MPI, ISTATIDS(:), INSTATPRC(:), & + IDISP(:), MNHINT_MPI, TPDIAFILE%NMPICOMM, IERR ) + +!Store the rank of each process corresponding to a given station +IDX = 1 +ISTATPRCRANK(:) = -1 +DO JP = 1, ISNPROC + DO JS = 1, INSTATPRC(JP) + ISTATPRCRANK(ISTATIDS(IDX)) = JP + IDX = IDX + 1 + END DO +END DO + +CALL STATION_ALLOCATE( TZSTATION, SIZE( tstations_time%tpdates ) ) + +!Determine the size of the ZPACK buffer used to transfer station data in 1 MPI communication +IF ( ISNPROC > 1 ) THEN + ISTORE = SIZE( TSTATIONS_TIME%TPDATES ) + IPACKSIZE = 7 + IPACKSIZE = IPACKSIZE + ISTORE * ( 5 + NRR + NSV ) + IF ( CTURB == 'TKEL') IPACKSIZE = IPACKSIZE + ISTORE !Tke term + IF ( CRAD /= 'NONE' ) IPACKSIZE = IPACKSIZE + ISTORE !XTSRAD term + IF ( LDIAG_SURFRAD ) THEN + IF ( CSURF == 'EXTE' ) IPACKSIZE = IPACKSIZE + ISTORE * 10 + IF ( CRAD /= 'NONE' ) IPACKSIZE = IPACKSIZE + ISTORE * 7 + IPACKSIZE = IPACKSIZE + ISTORE !XSFCO2 term + END IF + + ALLOCATE( ZPACK(IPACKSIZE) ) +END IF + +IDX = 1 -TYPE(STATION), INTENT(IN) :: TSTATION -INTEGER, INTENT(IN) :: II +STATION: DO JS = 1, INUMSTAT + IF ( ISTATPRCRANK(JS) == TPDIAFILE%NMASTER_RANK ) THEN + !No communication necessary, the station data is already on the writer process + IF ( ISP == TPDIAFILE%NMASTER_RANK ) THEN + TZSTATION = TSTATIONS(IDX) + IDX = IDX + 1 + END IF + ELSE + !The station data is not on the writer process + IF ( ISP == ISTATPRCRANK(JS) ) THEN + ! This process has the data and needs to send it to the writer process + IPOS = 1 + ZPACK(IPOS) = TSTATIONS(IDX)%NID; IPOS = IPOS + 1 + ZPACK(IPOS) = TSTATIONS(IDX)%XX; IPOS = IPOS + 1 + ZPACK(IPOS) = TSTATIONS(IDX)%XY; IPOS = IPOS + 1 + ZPACK(IPOS) = TSTATIONS(IDX)%XZ; IPOS = IPOS + 1 + ZPACK(IPOS) = TSTATIONS(IDX)%XLON; IPOS = IPOS + 1 + ZPACK(IPOS) = TSTATIONS(IDX)%XLAT; IPOS = IPOS + 1 + ZPACK(IPOS) = TSTATIONS(IDX)%XZS; IPOS = IPOS + 1 + ZPACK(IPOS:IPOS+ISTORE-1) = TSTATIONS(IDX)%XZON(:); IPOS = IPOS + ISTORE + ZPACK(IPOS:IPOS+ISTORE-1) = TSTATIONS(IDX)%XMER(:); IPOS = IPOS + ISTORE + ZPACK(IPOS:IPOS+ISTORE-1) = TSTATIONS(IDX)%XW(:); IPOS = IPOS + ISTORE + ZPACK(IPOS:IPOS+ISTORE-1) = TSTATIONS(IDX)%XP(:); IPOS = IPOS + ISTORE + IF ( CTURB == 'TKEL') THEN + ZPACK(IPOS:IPOS+ISTORE-1) = TSTATIONS(IDX)%XTKE(:); IPOS = IPOS + ISTORE + END IF + ZPACK(IPOS:IPOS+ISTORE-1) = TSTATIONS(IDX)%XTH(:); IPOS = IPOS + ISTORE + ZPACK(IPOS:IPOS+ISTORE*NRR-1) = RESHAPE( TSTATIONS(IDX)%XR(:,:), [ISTORE*NRR] ); IPOS = IPOS + ISTORE * NRR + ZPACK(IPOS:IPOS+ISTORE*NSV-1) = RESHAPE( TSTATIONS(IDX)%XSV(:,:), [ISTORE*NSV] ); IPOS = IPOS + ISTORE * NSV + IF ( CRAD /= 'NONE' ) THEN + ZPACK(IPOS:IPOS+ISTORE-1) = TSTATIONS(IDX)%XTSRAD(:); IPOS = IPOS + ISTORE + END IF + IF ( LDIAG_SURFRAD ) THEN + IF ( CSURF == 'EXTE') THEN + ZPACK(IPOS:IPOS+ISTORE-1) = TSTATIONS(IDX)%XT2M; IPOS = IPOS + ISTORE + ZPACK(IPOS:IPOS+ISTORE-1) = TSTATIONS(IDX)%XQ2M; IPOS = IPOS + ISTORE + ZPACK(IPOS:IPOS+ISTORE-1) = TSTATIONS(IDX)%XHU2M; IPOS = IPOS + ISTORE + ZPACK(IPOS:IPOS+ISTORE-1) = TSTATIONS(IDX)%XZON10M; IPOS = IPOS + ISTORE + ZPACK(IPOS:IPOS+ISTORE-1) = TSTATIONS(IDX)%XMER10M; IPOS = IPOS + ISTORE + ZPACK(IPOS:IPOS+ISTORE-1) = TSTATIONS(IDX)%XRN; IPOS = IPOS + ISTORE + ZPACK(IPOS:IPOS+ISTORE-1) = TSTATIONS(IDX)%XH; IPOS = IPOS + ISTORE + ZPACK(IPOS:IPOS+ISTORE-1) = TSTATIONS(IDX)%XLE; IPOS = IPOS + ISTORE + ZPACK(IPOS:IPOS+ISTORE-1) = TSTATIONS(IDX)%XGFLUX; IPOS = IPOS + ISTORE + ZPACK(IPOS:IPOS+ISTORE-1) = TSTATIONS(IDX)%XLEI; IPOS = IPOS + ISTORE + END IF + IF ( CRAD /= 'NONE' ) THEN + ZPACK(IPOS:IPOS+ISTORE-1) = TSTATIONS(IDX)%XSWD; IPOS = IPOS + ISTORE + ZPACK(IPOS:IPOS+ISTORE-1) = TSTATIONS(IDX)%XSWU; IPOS = IPOS + ISTORE + ZPACK(IPOS:IPOS+ISTORE-1) = TSTATIONS(IDX)%XLWD; IPOS = IPOS + ISTORE + ZPACK(IPOS:IPOS+ISTORE-1) = TSTATIONS(IDX)%XLWU; IPOS = IPOS + ISTORE + ZPACK(IPOS:IPOS+ISTORE-1) = TSTATIONS(IDX)%XSWDIR; IPOS = IPOS + ISTORE + ZPACK(IPOS:IPOS+ISTORE-1) = TSTATIONS(IDX)%XSWDIFF; IPOS = IPOS + ISTORE + ZPACK(IPOS:IPOS+ISTORE-1) = TSTATIONS(IDX)%XDSTAOD; IPOS = IPOS + ISTORE + END IF + ZPACK(IPOS:IPOS+ISTORE-1) = TSTATIONS(IDX)%XSFCO2; IPOS = IPOS + ISTORE + END IF + + IF ( IPOS-1 /= IPACKSIZE ) & + call Print_msg( NVERB_WARNING, 'IO', 'WRITE_STATION_n', 'IPOS-1 /= IPACKSIZE (sender side)', OLOCAL = .TRUE. ) + + CALL MPI_SEND( TSTATIONS(IDX)%CNAME, LEN(TSTATIONS(IDX)%CNAME), MPI_CHARACTER, TPDIAFILE%NMASTER_RANK - 1, & + ITAG, TPDIAFILE%NMPICOMM, IERR ) + CALL MPI_SEND( ZPACK, IPACKSIZE, MNHREAL_MPI, TPDIAFILE%NMASTER_RANK - 1, ITAG, TPDIAFILE%NMPICOMM, IERR ) + + IDX = IDX + 1 + + ELSE IF ( ISP == TPDIAFILE%NMASTER_RANK ) THEN + ! This process is the writer and will receive the station data from its owner + CALL MPI_RECV( TZSTATION%CNAME, LEN(TZSTATION%CNAME), MPI_CHARACTER, & + ISTATPRCRANK(JS) - 1, ITAG, TPDIAFILE%NMPICOMM, MPI_STATUS_IGNORE, IERR ) + CALL MPI_RECV( ZPACK, IPACKSIZE, MNHREAL_MPI, ISTATPRCRANK(JS) - 1, ITAG, TPDIAFILE%NMPICOMM, MPI_STATUS_IGNORE, IERR ) + + IPOS = 1 + TZSTATION%NID = NINT( ZPACK(IPOS) ); IPOS = IPOS + 1 + TZSTATION%XX = ZPACK(IPOS); IPOS = IPOS + 1 + TZSTATION%XY = ZPACK(IPOS); IPOS = IPOS + 1 + TZSTATION%XZ = ZPACK(IPOS); IPOS = IPOS + 1 + TZSTATION%XLON = ZPACK(IPOS); IPOS = IPOS + 1 + TZSTATION%XLAT = ZPACK(IPOS); IPOS = IPOS + 1 + TZSTATION%XZS = ZPACK(IPOS); IPOS = IPOS + 1 + TZSTATION%XZON(:) = ZPACK(IPOS:IPOS+ISTORE-1); IPOS = IPOS + ISTORE + TZSTATION%XMER(:) = ZPACK(IPOS:IPOS+ISTORE-1); IPOS = IPOS + ISTORE + TZSTATION%XW(:) = ZPACK(IPOS:IPOS+ISTORE-1); IPOS = IPOS + ISTORE + TZSTATION%XP(:) = ZPACK(IPOS:IPOS+ISTORE-1); IPOS = IPOS + ISTORE + IF ( CTURB == 'TKEL') THEN + TZSTATION%XTKE(:) = ZPACK(IPOS:IPOS+ISTORE-1); IPOS = IPOS + ISTORE + END IF + TZSTATION%XTH(:) = ZPACK(IPOS:IPOS+ISTORE-1); IPOS = IPOS + ISTORE + TZSTATION%XR(:,:) = RESHAPE( ZPACK(IPOS:IPOS+ISTORE*NRR-1), [ ISTORE, NRR ] ); IPOS = IPOS + ISTORE * NRR + TZSTATION%XSV(:,:) = RESHAPE( ZPACK(IPOS:IPOS+ISTORE*NSV-1), [ ISTORE, NSV ] ); IPOS = IPOS + ISTORE * NSV + IF ( CRAD /= 'NONE' ) THEN + TZSTATION%XTSRAD(:) = ZPACK(IPOS:IPOS+ISTORE-1); IPOS = IPOS + ISTORE + END IF + IF ( LDIAG_SURFRAD ) THEN + IF ( CSURF == 'EXTE' ) THEN + TZSTATION%XT2M = ZPACK(IPOS:IPOS+ISTORE-1); IPOS = IPOS + ISTORE + TZSTATION%XQ2M = ZPACK(IPOS:IPOS+ISTORE-1); IPOS = IPOS + ISTORE + TZSTATION%XHU2M = ZPACK(IPOS:IPOS+ISTORE-1); IPOS = IPOS + ISTORE + TZSTATION%XZON10M = ZPACK(IPOS:IPOS+ISTORE-1); IPOS = IPOS + ISTORE + TZSTATION%XMER10M = ZPACK(IPOS:IPOS+ISTORE-1); IPOS = IPOS + ISTORE + TZSTATION%XRN = ZPACK(IPOS:IPOS+ISTORE-1); IPOS = IPOS + ISTORE + TZSTATION%XH = ZPACK(IPOS:IPOS+ISTORE-1); IPOS = IPOS + ISTORE + TZSTATION%XLE = ZPACK(IPOS:IPOS+ISTORE-1); IPOS = IPOS + ISTORE + TZSTATION%XGFLUX = ZPACK(IPOS:IPOS+ISTORE-1); IPOS = IPOS + ISTORE + TZSTATION%XLEI = ZPACK(IPOS:IPOS+ISTORE-1); IPOS = IPOS + ISTORE + END IF + IF ( CRAD /= 'NONE' ) THEN + TZSTATION%XSWD = ZPACK(IPOS:IPOS+ISTORE-1); IPOS = IPOS + ISTORE + TZSTATION%XSWU = ZPACK(IPOS:IPOS+ISTORE-1); IPOS = IPOS + ISTORE + TZSTATION%XLWD = ZPACK(IPOS:IPOS+ISTORE-1); IPOS = IPOS + ISTORE + TZSTATION%XLWU = ZPACK(IPOS:IPOS+ISTORE-1); IPOS = IPOS + ISTORE + TZSTATION%XSWDIR = ZPACK(IPOS:IPOS+ISTORE-1); IPOS = IPOS + ISTORE + TZSTATION%XSWDIFF = ZPACK(IPOS:IPOS+ISTORE-1); IPOS = IPOS + ISTORE + TZSTATION%XDSTAOD = ZPACK(IPOS:IPOS+ISTORE-1); IPOS = IPOS + ISTORE + END IF + TZSTATION%XSFCO2 = ZPACK(IPOS:IPOS+ISTORE-1); IPOS = IPOS + ISTORE + END IF + + IF ( IPOS-1 /= IPACKSIZE ) & + call Print_msg( NVERB_WARNING, 'IO', 'WRITE_STATION_n', 'IPOS-1 /= IPACKSIZE (receiver side)', OLOCAL = .TRUE. ) + END IF + END IF + + CALL STATION_DIACHRO_n( TPDIAFILE, TZSTATION ) + +END DO STATION + +END SUBROUTINE WRITE_STATION_n + +! ################################################## +SUBROUTINE STATION_DIACHRO_n( TPDIAFILE, TPSTATION ) +! ################################################## + +USE MODD_ALLSTATION_n, ONLY: LDIAG_SURFRAD +use modd_budget, only: NLVL_CATEGORY, NLVL_SUBCATEGORY, NLVL_GROUP, NLVL_SHAPE, NLVL_TIMEAVG, NLVL_NORM, NLVL_MASK, & + tbudiachrometadata +USE MODD_CONF, ONLY: LCARTESIAN +USE MODD_CST, ONLY: XRV +use modd_field, only: NMNHDIM_STATION_TIME, NMNHDIM_STATION_PROC, NMNHDIM_UNUSED, & + tfieldmetadata_base, TYPEREAL +USE MODD_IO, ONLY: TFILEDATA +USE MODD_NSV, ONLY: nsv, nsv_aer, nsv_aerbeg, nsv_aerend, & + nsv_dst, nsv_dstbeg, nsv_dstend, nsv_slt, nsv_sltbeg, nsv_sltend, & + tsvlist +USE MODD_PARAM_n, ONLY: CRAD, CSURF, CTURB +use modd_station_n, only: tstations_time +use modd_type_statprof, only: tstationdata + +USE MODE_AERO_PSD +USE MODE_DUST_PSD +USE MODE_SALT_PSD +use MODE_WRITE_DIACHRO, ONLY: Write_diachro + +TYPE(TFILEDATA), INTENT(IN) :: TPDIAFILE ! diachronic file to write +TYPE(TSTATIONDATA), INTENT(IN) :: TPSTATION ! !* 0.2 declaration of local variables for diachro ! -REAL, DIMENSION(:,:,:,:,:,:), ALLOCATABLE :: ZWORK6 ! contains temporal series -REAL, DIMENSION(:,:,:,:,:,:), ALLOCATABLE :: ZW6 ! contains temporal series to write +REAL, DIMENSION(:,:,:,:,:,:), ALLOCATABLE :: XWORK6 ! contains temporal series REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZSV, ZN0, ZSIG, ZRG -REAL, DIMENSION(:,:,:,:,:), ALLOCATABLE :: ZPTOTA +REAL, DIMENSION(:,:,:,:,:), ALLOCATABLE :: ZPTOTA REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRHO ! -INTEGER, DIMENSION(:), ALLOCATABLE :: IGRID ! grid indicator -CHARACTER(LEN= 8) :: YGROUP ! group title -CHARACTER(LEN=100), DIMENSION(:), ALLOCATABLE :: YCOMMENT ! comment string -CHARACTER(LEN=100), DIMENSION(:), ALLOCATABLE :: YTITLE ! title -CHARACTER(LEN=100), DIMENSION(:), ALLOCATABLE :: YUNIT ! physical unit +CHARACTER(LEN=NCOMMENTLGTMAX) :: YCOMMENT ! comment string +CHARACTER(LEN=NMNHNAMELGTMAX) :: YTITLE ! title ! !!! do not forget to increment the IPROC value if you add diagnostic !!! INTEGER :: IPROC ! number of variables records !!! do not forget to increment the JPROC value if you add diagnostic !!! +INTEGER :: ISTORE INTEGER :: JPROC ! loop counter INTEGER :: JRR ! loop counter INTEGER :: JSV ! loop counter -type(tbudiachrometadata) :: tzbudiachro -type(tfield_metadata_base), dimension(:), allocatable :: tzfields +type(tbudiachrometadata) :: tzbudiachro +type(tfieldmetadata_base), dimension(:), allocatable :: tzfields ! !---------------------------------------------------------------------------- -IF (TSTATION%X(II)==XUNDEF) RETURN -IF (TSTATION%Y(II)==XUNDEF) RETURN ! -IPROC = 8 + SIZE(TSTATION%R,3) + SIZE(TSTATION%SV,3) +IPROC = 8 + SIZE(TPSTATION%XR,2) + SIZE(TPSTATION%XSV,2) -IF (TSTATION%X(II)==XUNDEF) IPROC = IPROC + 2 -IF (SIZE(TSTATION%TKE )>0) IPROC = IPROC + 1 +IF ( CTURB == 'TKEL' ) IPROC = IPROC + 1 IF (LDIAG_SURFRAD) THEN IF(CSURF=="EXTE") IPROC = IPROC + 10 IF(CRAD/="NONE") IPROC = IPROC + 7 + IPROC = IPROC + 1 ! XSFCO2 term END IF IF (LORILAM) IPROC = IPROC + JPMODE*(3+NSOA+NCARB+NSP) IF (LDUST) IPROC = IPROC + NMODE_DST*3 IF (LSALT) IPROC = IPROC + NMODE_SLT*3 -IF (ANY(TSTATION%TSRAD(:,:)/=XUNDEF)) IPROC = IPROC + 1 -IF (ANY(TSTATION%SFCO2(:,:)/=XUNDEF)) IPROC = IPROC + 1 +IF ( CRAD /= 'NONE' ) IPROC = IPROC + 1 ! -ALLOCATE (ZWORK6(1,1,1,SIZE(tstation%tpdates),1,IPROC)) -ALLOCATE (YCOMMENT(IPROC)) -ALLOCATE (YTITLE (IPROC)) -ALLOCATE (YUNIT (IPROC)) -ALLOCATE (IGRID (IPROC)) +ISTORE = SIZE( TSTATIONS_TIME%TPDATES ) + +ALLOCATE( XWORK6(1, 1, 1, ISTORE, 1, IPROC) ) +ALLOCATE( CCOMMENT(IPROC) ) +ALLOCATE( CTITLE (IPROC) ) +ALLOCATE( CUNIT (IPROC) ) ! -IGRID = 1 -YGROUP = TSTATION%NAME(II) JPROC = 0 ! !---------------------------------------------------------------------------- ! -JPROC = JPROC + 1 -YTITLE (JPROC) = 'ZS' -YUNIT (JPROC) = 'm' -YCOMMENT (JPROC) = 'Orography' -ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%ZS(II) -! -JPROC = JPROC + 1 -YTITLE (JPROC) = 'P' -YUNIT (JPROC) = 'Pa' -YCOMMENT (JPROC) = 'Pressure' -ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%P(:,II) -! -!JPROC = JPROC + 1 -!YTITLE (JPROC) = 'Z' -!YUNIT (JPROC) = 'm' -!YCOMMENT (JPROC) = 'Z Pos' -!ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%Z(II) -! -IF (LCARTESIAN) THEN - JPROC = JPROC + 1 - YTITLE (JPROC) = 'X' - YUNIT (JPROC) = 'm' - YCOMMENT (JPROC) = 'X Pos' - ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%X(II) - ! - JPROC = JPROC + 1 - YTITLE (JPROC) = 'Y' - YUNIT (JPROC) = 'm' - YCOMMENT (JPROC) = 'Y Pos' - ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%Y(II) - ! - JPROC = JPROC + 1 - YTITLE (JPROC) = 'U' - YUNIT (JPROC) = 'm s-1' - YCOMMENT (JPROC) = 'Axial velocity' - ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%ZON(:,II) - ! - JPROC = JPROC + 1 - YTITLE (JPROC) = 'V' - YUNIT (JPROC) = 'm s-1' - YCOMMENT (JPROC) = 'Transversal velocity' - ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%MER(:,II) -ELSE - JPROC = JPROC + 1 - YTITLE (JPROC) = 'LON' - YUNIT (JPROC) = 'degree' - YCOMMENT (JPROC) = 'Longitude' - ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%LON(II) - ! - JPROC = JPROC + 1 - YTITLE (JPROC) = 'LAT' - YUNIT (JPROC) = 'degree' - YCOMMENT (JPROC) = 'Latitude' - ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%LAT(II) - ! - JPROC = JPROC + 1 - YTITLE (JPROC) = 'ZON_WIND' - YUNIT (JPROC) = 'm s-1' - YCOMMENT (JPROC) = 'Zonal wind' - ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%ZON(:,II) - ! - JPROC = JPROC + 1 - YTITLE (JPROC) = 'MER_WIND' - YUNIT (JPROC) = 'm s-1' - YCOMMENT (JPROC) = 'Meridional wind' - ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%MER(:,II) -ENDIF -! -JPROC = JPROC + 1 -YTITLE (JPROC) = 'W' -YUNIT (JPROC) = 'm s-1' -YCOMMENT (JPROC) = 'Air vertical speed' -ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%W(:,II) -! -JPROC = JPROC + 1 -YTITLE (JPROC) = 'Th' -YUNIT (JPROC) = 'K' -YCOMMENT (JPROC) = 'Potential temperature' -ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%TH(:,II) -! -IF (LDIAG_SURFRAD) THEN - IF (CSURF=="EXTE") THEN - JPROC = JPROC + 1 - YTITLE (JPROC) = 'T2m' - YUNIT (JPROC) = 'K' - YCOMMENT (JPROC) = '2-m temperature' - ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%T2M(:,II) - ! - JPROC = JPROC + 1 - YTITLE (JPROC) = 'Q2m' - YUNIT (JPROC) = 'kg kg-1' - YCOMMENT (JPROC) = '2-m humidity' - ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%Q2M(:,II) - ! - JPROC = JPROC + 1 - YTITLE (JPROC) = 'HU2m' - YUNIT (JPROC) = 'percent' - YCOMMENT (JPROC) = '2-m relative humidity' - ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%HU2M(:,II) - ! - JPROC = JPROC + 1 - YTITLE (JPROC) = 'zon10m' - YUNIT (JPROC) = 'm s-1' - YCOMMENT (JPROC) = '10-m zonal wind' - ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%ZON10M(:,II) - ! - JPROC = JPROC + 1 - YTITLE (JPROC) = 'mer10m' - YUNIT (JPROC) = 'm s-1' - YCOMMENT (JPROC) = '10-m meridian wind' - ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%MER10M(:,II) - ! - JPROC = JPROC + 1 - YTITLE (JPROC) = 'RN' - YUNIT (JPROC) = 'W m-2' - YCOMMENT (JPROC) = 'Net radiation' - ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%RN(:,II) - ! - JPROC = JPROC + 1 - YTITLE (JPROC) = 'H' - YUNIT (JPROC) = 'W m-2' - YCOMMENT (JPROC) = 'Sensible heat flux' - ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%H(:,II) - ! - JPROC = JPROC + 1 - YTITLE (JPROC) = 'LE' - YUNIT (JPROC) = 'W m-2' - YCOMMENT (JPROC) = 'Total Latent heat flux' - ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%LE(:,II) - ! - JPROC = JPROC + 1 - YTITLE (JPROC) = 'G' - YUNIT (JPROC) = 'W m-2' - YCOMMENT (JPROC) = 'Storage heat flux' - ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%GFLUX(:,II) - ! - JPROC = JPROC + 1 - YTITLE (JPROC) = 'LEI' - YUNIT (JPROC) = 'W m-2' - YCOMMENT (JPROC) = 'Solid Latent heat flux' - ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%LEI(:,II) - END IF - IF (CRAD /= 'NONE') THEN - JPROC = JPROC + 1 - YTITLE (JPROC) = 'SWD' - YUNIT (JPROC) = 'W m-2' - YCOMMENT (JPROC) = 'Downward short-wave radiation' - ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%SWD(:,II) - ! - JPROC = JPROC + 1 - YTITLE (JPROC) = 'SWU' - YUNIT (JPROC) = 'W m-2' - YCOMMENT (JPROC) = 'Upward short-wave radiation' - ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%SWU(:,II) - ! - JPROC = JPROC + 1 - YTITLE (JPROC) = 'LWD' - YUNIT (JPROC) = 'W m-2' - YCOMMENT (JPROC) = 'Downward long-wave radiation' - ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%LWD(:,II) - ! - JPROC = JPROC + 1 - YTITLE (JPROC) = 'LWU' - YUNIT (JPROC) = 'W m-2' - YCOMMENT (JPROC) = 'Upward long-wave radiation' - ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%LWU(:,II) - JPROC = JPROC + 1 - ! - YTITLE (JPROC) = 'SWDIR' - YUNIT (JPROC) = 'W m-2' - YCOMMENT (JPROC) = 'Downward direct short-wave radiation' - ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%SWDIR(:,II) - ! - JPROC = JPROC + 1 - YTITLE (JPROC) = 'SWDIFF' - YUNIT (JPROC) = 'W m-2' - YCOMMENT (JPROC) = 'Downward diffuse short-wave radiation' - ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%SWDIFF(:,II) - ! - JPROC = JPROC + 1 - YTITLE (JPROC) = 'DSTAOD' - YUNIT (JPROC) = 'm' - YCOMMENT (JPROC) = 'Dust aerosol optical depth' - ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%DSTAOD(:,II) - ! - END IF -ENDIF -! -DO JRR=1,SIZE(TSTATION%R,3) - JPROC = JPROC+1 - YUNIT (JPROC) = 'kg kg-1' - ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%R(:,II,JRR) - IF (JRR==1) THEN - YTITLE (JPROC) = 'Rv' - YCOMMENT (JPROC) = 'Water vapor mixing ratio' - ELSE IF (JRR==2) THEN - YTITLE (JPROC) = 'Rc' - YCOMMENT (JPROC) = 'Liquid cloud water mixing ratio' - ELSE IF (JRR==3) THEN - YTITLE (JPROC) = 'Rr' - YCOMMENT (JPROC) = 'Rain water mixing ratio' - ELSE IF (JRR==4) THEN - YTITLE (JPROC) = 'Ri' - YCOMMENT (JPROC) = 'Ice cloud water mixing ratio' - ELSE IF (JRR==5) THEN - YTITLE (JPROC) = 'Rs' - YCOMMENT (JPROC) = 'Snow mixing ratio' - ELSE IF (JRR==6) THEN - YTITLE (JPROC) = 'Rg' - YCOMMENT (JPROC) = 'Graupel mixing ratio' - ELSE IF (JRR==7) THEN - YTITLE (JPROC) = 'Rh' - YCOMMENT (JPROC) = 'Hail mixing ratio' - END IF -END DO -! -IF (SIZE(TSTATION%TKE,1)>0) THEN - JPROC = JPROC+1 - YTITLE (JPROC) = 'Tke' - YUNIT (JPROC) = 'm2 s-2' - YCOMMENT (JPROC) = 'Turbulent kinetic energy' - ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%TKE(:,II) -END IF -! -! -IF (LPASPOL) THEN - JSV=1 - JPROC = JPROC+1 - WRITE (YTITLE(JPROC),FMT='(A2,I3.3)') 'Sv',JSV - YUNIT (JPROC) = 'kg kg-1' - YCOMMENT (JPROC) = ' ' - ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%SV(:,II,JSV) -ENDIF -! -IF (SIZE(TSTATION%SV,3)>=1) THEN - ! User scalar variables - DO JSV = 1,NSV_USER - JPROC = JPROC+1 - WRITE (YTITLE(JPROC),FMT='(A2,I3.3)') 'Sv',JSV - YUNIT (JPROC) = 'kg kg-1' - YCOMMENT (JPROC) = ' ' - ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%SV(:,II,JSV) - END DO - ! microphysical C2R2 scheme scalar variables - DO JSV = NSV_C2R2BEG,NSV_C2R2END - JPROC = JPROC+1 - YTITLE(JPROC)= TRIM(C2R2NAMES(JSV-NSV_C2R2BEG+1)) - YUNIT (JPROC) = 'm-3' - YCOMMENT (JPROC) = ' ' - ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%SV(:,II,JSV) - END DO - ! microphysical C3R5 scheme additional scalar variables - DO JSV = NSV_C1R3BEG,NSV_C1R3END - JPROC = JPROC+1 - YTITLE(JPROC)= TRIM(C1R3NAMES(JSV-NSV_C1R3BEG+1)) - YUNIT (JPROC) = 'm-3' - YCOMMENT (JPROC) = ' ' - ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%SV(:,II,JSV) - END DO - ! electrical scalar variables - DO JSV = NSV_ELECBEG,NSV_ELECEND - JPROC = JPROC+1 - YTITLE(JPROC)= TRIM(CELECNAMES(JSV-NSV_ELECBEG+1)) - YUNIT (JPROC) = 'C' - YCOMMENT (JPROC) = ' ' - ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%SV(:,II,JSV) - END DO - ! chemical scalar variables - DO JSV = NSV_CHEMBEG,NSV_CHEMEND - JPROC = JPROC+1 - YTITLE(JPROC)= TRIM(CNAMES(JSV-NSV_CHEMBEG+1)) - YUNIT (JPROC) = 'ppb' - WRITE(YCOMMENT (JPROC),'(A5,A3,I3.3)') 'T(s) ','SVT',JSV - ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%SV(:,II,JSV) * 1.E9 - END DO - ! LiNOX passive tracer - DO JSV = NSV_LNOXBEG,NSV_LNOXEND - JPROC = JPROC+1 - WRITE (YTITLE(JPROC),FMT='(A5)') 'LiNOx' - YUNIT (JPROC) = 'ppb' - YCOMMENT (JPROC) = ' ' - ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%SV(:,II,JSV) * 1.E9 - END DO - ! aerosol scalar variables - DO JSV = NSV_AERBEG,NSV_AEREND - JPROC = JPROC+1 - YTITLE(JPROC)= TRIM(CAERONAMES(JSV-NSV_AERBEG+1)) - YUNIT (JPROC) = 'ppb' - YCOMMENT (JPROC) = ' ' - ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%SV(:,II,JSV) *1.E9 +call Add_point( 'ZS', 'Orography', 'm', SPREAD( tpstation%xzs, 1, istore ) ) +call Add_point( 'P', 'Pressure', 'Pa', tpstation%xp(:) ) +! call Add_point( 'Z', 'Z Pos', 'm', SPREAD( tpstation%xz, 1, istore ) ) + +if ( lcartesian ) then + call Add_point( 'X', 'X Pos', 'm', SPREAD( tpstation%xx, 1, istore ) ) + call Add_point( 'Y', 'Y Pos', 'm', SPREAD( tpstation%xy, 1, istore ) ) + call Add_point( 'U', 'Axial velocity', 'm s-1', tpstation%xzon(:) ) + call Add_point( 'V', 'Transversal velocity', 'm s-1', tpstation%xmer(:) ) +else + call Add_point( 'LON', 'Longitude', 'degree', SPREAD( tpstation%xlon, 1, istore ) ) + call Add_point( 'LAT', 'Latitude', 'degree', SPREAD( tpstation%xlat, 1, istore ) ) + call Add_point( 'ZON_WIND', 'Zonal wind', 'm s-1', tpstation%xzon(:) ) + call Add_point( 'MER_WIND', 'Meridional wind', 'm s-1', tpstation%xmer(:) ) +end if + +call Add_point( 'W', 'Air vertical speed', 'm s-1', tpstation%xw(:) ) +call Add_point( 'Th', 'Potential temperature', 'K', tpstation%xth(:) ) + +if ( ldiag_surfrad ) then + if ( csurf == "EXTE" ) then + call Add_point( 'T2m', '2-m temperature', 'K', tpstation%xt2m(:) ) + call Add_point( 'Q2m', '2-m humidity', 'kg kg-1', tpstation%xq2m(:) ) + call Add_point( 'HU2m', '2-m relative humidity', 'percent', tpstation%xhu2m(:) ) + call Add_point( 'zon10m', '10-m zonal wind', 'm s-1', tpstation%xzon10m(:) ) + call Add_point( 'mer10m', '10-m meridian wind', 'm s-1', tpstation%xmer10m(:) ) + call Add_point( 'RN', 'Net radiation', 'W m-2', tpstation%xrn(:) ) + call Add_point( 'H', 'Sensible heat flux', 'W m-2', tpstation%xh(:) ) + call Add_point( 'LE', 'Total Latent heat flux', 'W m-2', tpstation%xle(:) ) + call Add_point( 'G', 'Storage heat flux', 'W m-2', tpstation%xgflux(:) ) + call Add_point( 'LEI', 'Solid Latent heat flux', 'W m-2', tpstation%xlei(:) ) + end if + if ( crad /= 'NONE' ) then + call Add_point( 'SWD', 'Downward short-wave radiation', 'W m-2', tpstation%xswd(:) ) + call Add_point( 'SWU', 'Upward short-wave radiation', 'W m-2', tpstation%xswu(:) ) + call Add_point( 'LWD', 'Downward long-wave radiation', 'W m-2', tpstation%xlwd(:) ) + call Add_point( 'LWU', 'Upward long-wave radiation', 'W m-2', tpstation%xlwu(:) ) + call Add_point( 'SWDIR', 'Downward direct short-wave radiation', 'W m-2', tpstation%xswdir(:) ) + call Add_point( 'SWDIFF', 'Downward diffuse short-wave radiation', 'W m-2', tpstation%xswdiff(:) ) + call Add_point( 'DSTAOD', 'Dust aerosol optical depth', 'm', tpstation%xdstaod(:) ) + end if +end if + +do jrr = 1, SIZE( tpstation%xr, 2 ) + select case( jrr ) + case (1) + call Add_point( 'Rv', 'Water vapor mixing ratio', 'kg kg-1', tpstation%xr(:,jrr) ) + case (2) + call Add_point( 'Rc', 'Liquid cloud water mixing ratio', 'kg kg-1', tpstation%xr(:,jrr) ) + case (3) + call Add_point( 'Rr', 'Rain water mixing ratio', 'kg kg-1', tpstation%xr(:,jrr) ) + case (4) + call Add_point( 'Ri', 'Ice cloud water mixing ratio', 'kg kg-1', tpstation%xr(:,jrr) ) + case (5) + call Add_point( 'Rs', 'Snow mixing ratio', 'kg kg-1', tpstation%xr(:,jrr) ) + case (6) + call Add_point( 'Rg', 'Graupel mixing ratio', 'kg kg-1', tpstation%xr(:,jrr) ) + case (7) + call Add_point( 'Rh', 'Hail mixing ratio', 'kg kg-1', tpstation%xr(:,jrr) ) + end select +end do + +if ( cturb == 'TKEL' ) call Add_point( 'Tke', 'Turbulent kinetic energy', 'm2 s-2', tpstation%xtke(:) ) + +if ( nsv > 0 ) then + ! Scalar variables + DO JSV = 1, NSV + IF ( TRIM( TSVLIST(JSV)%CUNITS ) == 'ppv' ) THEN + !*1e9 for conversion ppv->ppb + call Add_point( TRIM( TSVLIST(JSV)%CMNHNAME ), '', 'ppb', TPSTATION%XSV(:,JSV) * 1.e9 ) + ELSE + call Add_point( TRIM( TSVLIST(JSV)%CMNHNAME ), '', TSVLIST(JSV)%CUNITS, TPSTATION%XSV(:,JSV) ) + END IF END DO - IF ((LORILAM).AND. .NOT.(ANY(TSTATION%P(:,II) == 0.))) THEN - ALLOCATE (ZSV(1,1,SIZE(tstation%tpdates),NSV_AER)) - ALLOCATE (ZRHO(1,1,SIZE(tstation%tpdates))) - ALLOCATE (ZN0(1,1,SIZE(tstation%tpdates),JPMODE)) - ALLOCATE (ZRG(1,1,SIZE(tstation%tpdates),JPMODE)) - ALLOCATE (ZSIG(1,1,SIZE(tstation%tpdates),JPMODE)) - ALLOCATE (ZPTOTA(1,1,SIZE(tstation%tpdates),NSP+NCARB+NSOA,JPMODE)) - ZSV(1,1,:,1:NSV_AER) = TSTATION%SV(:,II,NSV_AERBEG:NSV_AEREND) - IF (SIZE(TSTATION%R,3) >0) THEN + IF ((LORILAM).AND. .NOT.(ANY(TPSTATION%XP(:) == 0.))) THEN + ALLOCATE (ZSV(1,1,ISTORE,NSV_AER)) + ALLOCATE (ZRHO(1,1,ISTORE)) + ALLOCATE (ZN0(1,1,ISTORE,JPMODE)) + ALLOCATE (ZRG(1,1,ISTORE,JPMODE)) + ALLOCATE (ZSIG(1,1,ISTORE,JPMODE)) + ALLOCATE (ZPTOTA(1,1,ISTORE,NSP+NCARB+NSOA,JPMODE)) + ZSV(1,1,:,1:NSV_AER) = TPSTATION%XSV(:,NSV_AERBEG:NSV_AEREND) + IF (SIZE(TPSTATION%XR,2) >0) THEN ZRHO(1,1,:) = 0. - DO JRR=1,SIZE(TSTATION%R,3) - ZRHO(1,1,:) = ZRHO(1,1,:) + TSTATION%R(:,II,JRR) + DO JRR=1,SIZE(TPSTATION%XR,2) + ZRHO(1,1,:) = ZRHO(1,1,:) + TPSTATION%XR(:,JRR) ENDDO - ZRHO(1,1,:) = TSTATION%TH(:,II) * ( 1. + XRV/XRD*TSTATION%R(:,II,1) ) & - / ( 1. + ZRHO(1,1,:) ) + ZRHO(1,1,:) = TPSTATION%XTH(:) * ( 1. + XRV/XRD*TPSTATION%XR(:,1) ) & + / ( 1. + ZRHO(1,1,:) ) ELSE - ZRHO(1,1,:) = TSTATION%TH(:,II) + ZRHO(1,1,:) = TPSTATION%XTH(:) ENDIF - ZRHO(1,1,:) = TSTATION%P(:,II) / & - (XRD *ZRHO(1,1,:) *((TSTATION%P(:,II)/XP00)**(XRD/XCPD)) ) + ZRHO(1,1,:) = TPSTATION%XP(:) / & + (XRD *ZRHO(1,1,:) *((TPSTATION%XP(:)/XP00)**(XRD/XCPD)) ) - - CALL PPP2AERO(ZSV,ZRHO, PSIG3D=ZSIG, PRG3D=ZRG, PN3D=ZN0,PCTOTA=ZPTOTA) + CALL PPP2AERO(ZSV,ZRHO, PSIG3D=ZSIG, PRG3D=ZRG, PN3D=ZN0,PCTOTA=ZPTOTA) DO JSV=1,JPMODE ! mean radius - JPROC = JPROC+1 - WRITE(YTITLE(JPROC),'(A6,I1)')'AERRGA',JSV - YUNIT (JPROC) = 'um' - WRITE(YCOMMENT(JPROC),'(A18,I1)')'RG (nb) AERO MODE ',JSV - ZWORK6 (1,1,1,:,1,JPROC) = ZRG(1,1,:,JSV) + WRITE(YTITLE,'(A6,I1)')'AERRGA',JSV + WRITE(YCOMMENT,'(A18,I1)')'RG (nb) AERO MODE ',JSV + call Add_point( ytitle, ycomment, 'um', ZRG(1,1,:,JSV) ) + ! standard deviation - JPROC = JPROC+1 - WRITE(YTITLE(JPROC),'(A7,I1)')'AERSIGA',JSV - YUNIT (JPROC) = ' ' - WRITE(YCOMMENT(JPROC),'(A16,I1)')'SIGMA AERO MODE ',JSV - ZWORK6 (1,1,1,:,1,JPROC) = ZSIG(1,1,:,JSV) + WRITE(YTITLE,'(A7,I1)')'AERSIGA',JSV + WRITE(YCOMMENT,'(A16,I1)')'SIGMA AERO MODE ',JSV + call Add_point( ytitle, ycomment, '',ZSIG(1,1,:,JSV) ) + ! particles number - JPROC = JPROC+1 - WRITE(YTITLE(JPROC),'(A6,I1)')'AERN0A',JSV - YUNIT (JPROC) = 'm-3' - WRITE(YCOMMENT(JPROC),'(A13,I1)')'N0 AERO MODE ',JSV - ZWORK6 (1,1,1,:,1,JPROC) = ZN0(1,1,:,JSV) - JPROC = JPROC+1 - WRITE(YTITLE(JPROC),'(A5,I1)')'MOC ',JSV - YUNIT (JPROC) = 'ug m-3' - WRITE(YCOMMENT,'(A23,I1)')'MASS OC AEROSOL MODE ',JSV - ZWORK6(1,1,1,:,1,JPROC)=ZPTOTA(1,1,:,JP_AER_OC,JSV) + WRITE(YTITLE,'(A6,I1)')'AERN0A',JSV + WRITE(YCOMMENT,'(A13,I1)')'N0 AERO MODE ',JSV + call Add_point( ytitle, ycomment, 'm-3', ZN0(1,1,:,JSV) ) - JPROC = JPROC+1 - WRITE(YTITLE(JPROC),'(A5,I1)')'MBC ',JSV - YUNIT (JPROC) = 'ug m-3' - WRITE(YCOMMENT,'(A23,I1)')'MASS BC AEROSOL MODE ',JSV - ZWORK6(1,1,1,:,1,JPROC)=ZPTOTA(1,1,:,JP_AER_BC,JSV) + WRITE(YTITLE,'(A5,I1)')'MOC ',JSV + WRITE(CCOMMENT,'(A23,I1)')'MASS OC AEROSOL MODE ',JSV + call Add_point( ytitle, ycomment, 'ug m-3', ZPTOTA(1,1,:,JP_AER_OC,JSV) ) - JPROC = JPROC+1 - WRITE(YTITLE(JPROC),'(A5,I1)')'MDST ',JSV - YUNIT (JPROC) = 'ug m-3' - WRITE(YCOMMENT,'(A23,I1)')'MASS DST AEROSOL MODE ',JSV - ZWORK6(1,1,1,:,1,JPROC)=ZPTOTA(1,1,:,JP_AER_DST,JSV) + WRITE(YTITLE,'(A5,I1)')'MBC ',JSV + WRITE(CCOMMENT,'(A23,I1)')'MASS BC AEROSOL MODE ',JSV + call Add_point( ytitle, ycomment, 'ug m-3', ZPTOTA(1,1,:,JP_AER_BC,JSV) ) - JPROC = JPROC+1 - WRITE(YTITLE(JPROC),'(A5,I1)')'MSO4 ',JSV - YUNIT (JPROC) = 'ug m-3' - WRITE(YCOMMENT,'(A23,I1)')'MASS SO4 AEROSOL MODE ',JSV - ZWORK6(1,1,1,:,1,JPROC)=ZPTOTA(1,1,:,JP_AER_SO4,JSV) + WRITE(YTITLE,'(A5,I1)')'MDST ',JSV + WRITE(CCOMMENT,'(A23,I1)')'MASS DST AEROSOL MODE ',JSV + call Add_point( ytitle, ycomment, 'ug m-3', ZPTOTA(1,1,:,JP_AER_DST,JSV) ) - JPROC = JPROC+1 - WRITE(YTITLE(JPROC),'(A5,I1)')'MNO3 ',JSV - YUNIT (JPROC) = 'ug m-3' - WRITE(YCOMMENT,'(A23,I1)')'MASS NO3 AEROSOL MODE ',JSV - ZWORK6(1,1,1,:,1,JPROC)=ZPTOTA(1,1,:,JP_AER_NO3,JSV) + WRITE(YTITLE,'(A5,I1)')'MSO4 ',JSV + WRITE(CCOMMENT,'(A23,I1)')'MASS SO4 AEROSOL MODE ',JSV + call Add_point( ytitle, ycomment, 'ug m-3', ZPTOTA(1,1,:,JP_AER_SO4,JSV) ) - JPROC = JPROC+1 - WRITE(YTITLE(JPROC),'(A5,I1)')'MH2O ',JSV - YUNIT (JPROC) = 'ug m-3' - WRITE(YCOMMENT,'(A23,I1)')'MASS H2O AEROSOL MODE ',JSV - ZWORK6(1,1,1,:,1,JPROC)=ZPTOTA(1,1,:,JP_AER_H2O,JSV) - JPROC = JPROC+1 - WRITE(YTITLE(JPROC),'(A5,I1)')'MNH3 ',JSV - YUNIT (JPROC) = 'ug m-3' - WRITE(YCOMMENT,'(A23,I1)')'MASS NH3 AEROSOL MODE ',JSV - ZWORK6(1,1,1,:,1,JPROC)=ZPTOTA(1,1,:,JP_AER_NH3,JSV) - JPROC = JPROC+1 - IF (NSOA == 10) THEN - WRITE(YTITLE(JPROC),'(A5,I1)')'MSOA1',JSV - YUNIT (JPROC) = 'ug m-3' - WRITE(YCOMMENT,'(A23,I1)')'MASS SOA1 AEROSOL MODE ',JSV - ZWORK6(1,1,1,:,1,JPROC)=ZPTOTA(1,1,:,JP_AER_SOA1,JSV) - JPROC = JPROC+1 - WRITE(YTITLE(JPROC),'(A5,I1)')'MSOA2',JSV - YUNIT (JPROC) = 'ug m-3' - WRITE(YCOMMENT,'(A23,I1)')'MASS SOA2 AEROSOL MODE ',JSV - ZWORK6(1,1,1,:,1,JPROC)=ZPTOTA(1,1,:,JP_AER_SOA2,JSV) - JPROC = JPROC+1 - WRITE(YTITLE(JPROC),'(A5,I1)')'MSOA3',JSV - YUNIT (JPROC) = 'ug m-3' - WRITE(YCOMMENT,'(A23,I1)')'MASS SOA3 AEROSOL MODE ',JSV - ZWORK6(1,1,1,:,1,JPROC)=ZPTOTA(1,1,:,JP_AER_SOA3,JSV) - JPROC = JPROC+1 - WRITE(YTITLE(JPROC),'(A5,I1)')'MSOA4',JSV - YUNIT (JPROC) = 'ug m-3' - WRITE(YCOMMENT,'(A23,I1)')'MASS SOA4 AEROSOL MODE ',JSV - ZWORK6(1,1,1,:,1,JPROC)=ZPTOTA(1,1,:,JP_AER_SOA4,JSV) - JPROC = JPROC+1 - WRITE(YTITLE(JPROC),'(A5,I1)')'MSOA5',JSV - YUNIT (JPROC) = 'ug m-3' - WRITE(YCOMMENT,'(A23,I1)')'MASS SOA5 AEROSOL MODE ',JSV - ZWORK6(1,1,1,:,1,JPROC)=ZPTOTA(1,1,:,JP_AER_SOA5,JSV) - JPROC = JPROC+1 - WRITE(YTITLE(JPROC),'(A5,I1)')'MSOA6',JSV - YUNIT (JPROC) = 'ug m-3' - WRITE(YCOMMENT,'(A23,I1)')'MASS SOA6 AEROSOL MODE ',JSV - ZWORK6(1,1,1,:,1,JPROC)=ZPTOTA(1,1,:,JP_AER_SOA6,JSV) - JPROC = JPROC+1 - WRITE(YTITLE(JPROC),'(A5,I1)')'MSOA7',JSV - YUNIT (JPROC) = 'ug m-3' - WRITE(YCOMMENT,'(A23,I1)')'MASS SOA7 AEROSOL MODE ',JSV - ZWORK6(1,1,1,:,1,JPROC)=ZPTOTA(1,1,:,JP_AER_SOA7,JSV) - JPROC = JPROC+1 - WRITE(YTITLE(JPROC),'(A5,I1)')'MSOA8',JSV - YUNIT (JPROC) = 'ug m-3' - WRITE(YCOMMENT,'(A23,I1)')'MASS SOA8 AEROSOL MODE ',JSV - ZWORK6(1,1,1,:,1,JPROC)=ZPTOTA(1,1,:,JP_AER_SOA8,JSV) - JPROC = JPROC+1 - WRITE(YTITLE(JPROC),'(A5,I1)')'MSOA9',JSV - YUNIT (JPROC) = 'ug m-3' - WRITE(YCOMMENT,'(A23,I1)')'MASS SOA9 AEROSOL MODE ',JSV - ZWORK6(1,1,1,:,1,JPROC)=ZPTOTA(1,1,:,JP_AER_SOA9,JSV) - JPROC = JPROC+1 - WRITE(YTITLE(JPROC),'(A6,I1)')'MSOA10',JSV - YUNIT (JPROC) = 'ug m-3' - WRITE(YCOMMENT,'(A24,I1)')'MASS SOA10 AEROSOL MODE ',JSV - ZWORK6(1,1,1,:,1,JPROC)=ZPTOTA(1,1,:,JP_AER_SOA10,JSV) + WRITE(YTITLE,'(A5,I1)')'MNO3 ',JSV + WRITE(CCOMMENT,'(A23,I1)')'MASS NO3 AEROSOL MODE ',JSV + call Add_point( ytitle, ycomment, 'ug m-3', ZPTOTA(1,1,:,JP_AER_NO3,JSV) ) + + WRITE(YTITLE,'(A5,I1)')'MH2O ',JSV + WRITE(CCOMMENT,'(A23,I1)')'MASS H2O AEROSOL MODE ',JSV + call Add_point( ytitle, ycomment, 'ug m-3', ZPTOTA(1,1,:,JP_AER_H2O,JSV) ) + + WRITE(YTITLE,'(A5,I1)')'MNH3 ',JSV + WRITE(CCOMMENT,'(A23,I1)')'MASS NH3 AEROSOL MODE ',JSV + call Add_point( ytitle, ycomment, 'ug m-3', ZPTOTA(1,1,:,JP_AER_NH3,JSV) ) + + IF ( NSOA == 10 ) THEN + WRITE(YTITLE,'(A5,I1)')'MSOA1',JSV + WRITE(CCOMMENT,'(A23,I1)')'MASS SOA1 AEROSOL MODE ',JSV + call Add_point( ytitle, ycomment, 'ug m-3', ZPTOTA(1,1,:,JP_AER_SOA1,JSV) ) + + WRITE(YTITLE,'(A5,I1)')'MSOA2',JSV + WRITE(CCOMMENT,'(A23,I1)')'MASS SOA2 AEROSOL MODE ',JSV + call Add_point( ytitle, ycomment, 'ug m-3', ZPTOTA(1,1,:,JP_AER_SOA2,JSV) ) + + WRITE(YTITLE,'(A5,I1)')'MSOA3',JSV + WRITE(CCOMMENT,'(A23,I1)')'MASS SOA3 AEROSOL MODE ',JSV + call Add_point( ytitle, ycomment, 'ug m-3', ZPTOTA(1,1,:,JP_AER_SOA3,JSV) ) + + WRITE(YTITLE,'(A5,I1)')'MSOA4',JSV + WRITE(CCOMMENT,'(A23,I1)')'MASS SOA4 AEROSOL MODE ',JSV + call Add_point( ytitle, ycomment, 'ug m-3', ZPTOTA(1,1,:,JP_AER_SOA4,JSV) ) + + WRITE(YTITLE,'(A5,I1)')'MSOA5',JSV + WRITE(CCOMMENT,'(A23,I1)')'MASS SOA5 AEROSOL MODE ',JSV + call Add_point( ytitle, ycomment, 'ug m-3', ZPTOTA(1,1,:,JP_AER_SOA5,JSV) ) + + WRITE(YTITLE,'(A5,I1)')'MSOA6',JSV + WRITE(CCOMMENT,'(A23,I1)')'MASS SOA6 AEROSOL MODE ',JSV + call Add_point( ytitle, ycomment, 'ug m-3', ZPTOTA(1,1,:,JP_AER_SOA6,JSV) ) + + WRITE(YTITLE,'(A5,I1)')'MSOA7',JSV + WRITE(CCOMMENT,'(A23,I1)')'MASS SOA7 AEROSOL MODE ',JSV + call Add_point( ytitle, ycomment, 'ug m-3', ZPTOTA(1,1,:,JP_AER_SOA7,JSV) ) + + WRITE(YTITLE,'(A5,I1)')'MSOA8',JSV + WRITE(CCOMMENT,'(A23,I1)')'MASS SOA8 AEROSOL MODE ',JSV + call Add_point( ytitle, ycomment, 'ug m-3', ZPTOTA(1,1,:,JP_AER_SOA8,JSV) ) + + WRITE(YTITLE,'(A5,I1)')'MSOA9',JSV + WRITE(CCOMMENT,'(A23,I1)')'MASS SOA9 AEROSOL MODE ',JSV + call Add_point( ytitle, ycomment, 'ug m-3', ZPTOTA(1,1,:,JP_AER_SOA9,JSV) ) + + WRITE(YTITLE,'(A6,I1)')'MSOA10',JSV + WRITE(CCOMMENT,'(A24,I1)')'MASS SOA10 AEROSOL MODE ',JSV + call Add_point( ytitle, ycomment, 'ug m-3', ZPTOTA(1,1,:,JP_AER_SOA10,JSV) ) END IF - ENDDO + END DO - DEALLOCATE (ZSV,ZRHO) - DEALLOCATE (ZN0,ZRG,ZSIG) + DEALLOCATE (ZSV,ZRHO) + DEALLOCATE (ZN0,ZRG,ZSIG) END IF - ! dust scalar variables - DO JSV = NSV_DSTBEG,NSV_DSTEND - JPROC = JPROC+1 - YTITLE(JPROC)= TRIM(CDUSTNAMES(JSV-NSV_DSTBEG+1)) - YUNIT (JPROC) = 'ppb' - YCOMMENT (JPROC) = ' ' - ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%SV(:,II,JSV) *1.E9 - END DO - IF ((LDUST).AND. .NOT.(ANY(TSTATION%P(:,II) == 0.))) THEN - ALLOCATE (ZSV(1,1,SIZE(tstation%tpdates),NSV_DST)) - ALLOCATE (ZRHO(1,1,SIZE(tstation%tpdates))) - ALLOCATE (ZN0(1,1,SIZE(tstation%tpdates),NMODE_DST)) - ALLOCATE (ZRG(1,1,SIZE(tstation%tpdates),NMODE_DST)) - ALLOCATE (ZSIG(1,1,SIZE(tstation%tpdates),NMODE_DST)) - ZSV(1,1,:,1:NSV_DST) = TSTATION%SV(:,II,NSV_DSTBEG:NSV_DSTEND) - IF (SIZE(TSTATION%R,3) >0) THEN + + IF ((LDUST).AND. .NOT.(ANY(TPSTATION%XP(:) == 0.))) THEN + ALLOCATE (ZSV(1,1,ISTORE,NSV_DST)) + ALLOCATE (ZRHO(1,1,ISTORE)) + ALLOCATE (ZN0(1,1,ISTORE,NMODE_DST)) + ALLOCATE (ZRG(1,1,ISTORE,NMODE_DST)) + ALLOCATE (ZSIG(1,1,ISTORE,NMODE_DST)) + ZSV(1,1,:,1:NSV_DST) = TPSTATION%XSV(:,NSV_DSTBEG:NSV_DSTEND) + IF (SIZE(TPSTATION%XR,2) >0) THEN ZRHO(1,1,:) = 0. - DO JRR=1,SIZE(TSTATION%R,3) - ZRHO(1,1,:) = ZRHO(1,1,:) + TSTATION%R(:,II,JRR) + DO JRR=1,SIZE(TPSTATION%XR,2) + ZRHO(1,1,:) = ZRHO(1,1,:) + TPSTATION%XR(:,JRR) ENDDO - ZRHO(1,1,:) = TSTATION%TH(:,II) * ( 1. + XRV/XRD*TSTATION%R(:,II,1) ) & - / ( 1. + ZRHO(1,1,:) ) + ZRHO(1,1,:) = TPSTATION%XTH(:) * ( 1. + XRV/XRD*TPSTATION%XR(:,1) ) & + / ( 1. + ZRHO(1,1,:) ) ELSE - ZRHO(1,1,:) = TSTATION%TH(:,II) + ZRHO(1,1,:) = TPSTATION%XTH(:) ENDIF - ZRHO(1,1,:) = TSTATION%P(:,II) / & - (XRD *ZRHO(1,1,:) *((TSTATION%P(:,II)/XP00)**(XRD/XCPD)) ) + ZRHO(1,1,:) = TPSTATION%XP(:) / & + (XRD *ZRHO(1,1,:) *((TPSTATION%XP(:)/XP00)**(XRD/XCPD)) ) CALL PPP2DUST(ZSV,ZRHO, PSIG3D=ZSIG, PRG3D=ZRG, PN3D=ZN0) DO JSV=1,NMODE_DST ! mean radius JPROC = JPROC+1 - WRITE(YTITLE(JPROC),'(A6,I1)')'DSTRGA',JSV - YUNIT (JPROC) = 'um' - WRITE(YCOMMENT(JPROC),'(A18,I1)')'RG (nb) DUST MODE ',JSV - ZWORK6 (1,1,1,:,1,JPROC) = ZRG(1,1,:,JSV) + WRITE(CTITLE(JPROC),'(A6,I1)')'DSTRGA',JSV + CUNIT (JPROC) = 'um' + WRITE(CCOMMENT(JPROC),'(A18,I1)')'RG (nb) DUST MODE ',JSV + XWORK6 (1,1,1,:,1,JPROC) = ZRG(1,1,:,JSV) ! standard deviation JPROC = JPROC+1 - WRITE(YTITLE(JPROC),'(A7,I1)')'DSTSIGA',JSV - YUNIT (JPROC) = ' ' - WRITE(YCOMMENT(JPROC),'(A16,I1)')'SIGMA DUST MODE ',JSV - ZWORK6 (1,1,1,:,1,JPROC) = ZSIG(1,1,:,JSV) + WRITE(CTITLE(JPROC),'(A7,I1)')'DSTSIGA',JSV + CUNIT (JPROC) = ' ' + WRITE(CCOMMENT(JPROC),'(A16,I1)')'SIGMA DUST MODE ',JSV + XWORK6 (1,1,1,:,1,JPROC) = ZSIG(1,1,:,JSV) ! particles number JPROC = JPROC+1 - WRITE(YTITLE(JPROC),'(A6,I1)')'DSTN0A',JSV - YUNIT (JPROC) = 'm-3' - WRITE(YCOMMENT(JPROC),'(A13,I1)')'N0 DUST MODE ',JSV - ZWORK6 (1,1,1,:,1,JPROC) = ZN0(1,1,:,JSV) + WRITE(CTITLE(JPROC),'(A6,I1)')'DSTN0A',JSV + CUNIT (JPROC) = 'm-3' + WRITE(CCOMMENT(JPROC),'(A13,I1)')'N0 DUST MODE ',JSV + XWORK6 (1,1,1,:,1,JPROC) = ZN0(1,1,:,JSV) ENDDO - DEALLOCATE (ZSV,ZRHO) - DEALLOCATE (ZN0,ZRG,ZSIG) + DEALLOCATE (ZSV,ZRHO) + DEALLOCATE (ZN0,ZRG,ZSIG) END IF - ! sea salt scalar variables - DO JSV = NSV_SLTBEG,NSV_SLTEND - JPROC = JPROC+1 - YTITLE(JPROC)= TRIM(CSALTNAMES(JSV-NSV_SLTBEG+1)) - YUNIT (JPROC) = 'ppb' - YCOMMENT (JPROC) = ' ' - ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%SV(:,II,JSV) *1.E9 - END DO -ENDIF -! - IF ((LSALT).AND. .NOT.(ANY(TSTATION%P(:,II) == 0.))) THEN - ALLOCATE (ZSV(1,1,SIZE(tstation%tpdates),NSV_SLT)) - ALLOCATE (ZRHO(1,1,SIZE(tstation%tpdates))) - ALLOCATE (ZN0(1,1,SIZE(tstation%tpdates),NMODE_SLT)) - ALLOCATE (ZRG(1,1,SIZE(tstation%tpdates),NMODE_SLT)) - ALLOCATE (ZSIG(1,1,SIZE(tstation%tpdates),NMODE_SLT)) - ZSV(1,1,:,1:NSV_SLT) = TSTATION%SV(:,II,NSV_SLTBEG:NSV_SLTEND) - IF (SIZE(TSTATION%R,3) >0) THEN + + IF ((LSALT).AND. .NOT.(ANY(TPSTATION%XP(:) == 0.))) THEN + ALLOCATE (ZSV(1,1,ISTORE,NSV_SLT)) + ALLOCATE (ZRHO(1,1,ISTORE)) + ALLOCATE (ZN0(1,1,ISTORE,NMODE_SLT)) + ALLOCATE (ZRG(1,1,ISTORE,NMODE_SLT)) + ALLOCATE (ZSIG(1,1,ISTORE,NMODE_SLT)) + ZSV(1,1,:,1:NSV_SLT) = TPSTATION%XSV(:,NSV_SLTBEG:NSV_SLTEND) + IF (SIZE(TPSTATION%XR,2) >0) THEN ZRHO(1,1,:) = 0. - DO JRR=1,SIZE(TSTATION%R,3) - ZRHO(1,1,:) = ZRHO(1,1,:) + TSTATION%R(:,II,JRR) + DO JRR=1,SIZE(TPSTATION%XR,2) + ZRHO(1,1,:) = ZRHO(1,1,:) + TPSTATION%XR(:,JRR) ENDDO - ZRHO(1,1,:) = TSTATION%TH(:,II) * ( 1. + XRV/XRD*TSTATION%R(:,II,1) ) & - / ( 1. + ZRHO(1,1,:) ) + ZRHO(1,1,:) = TPSTATION%XTH(:) * ( 1. + XRV/XRD*TPSTATION%XR(:,1) ) & + / ( 1. + ZRHO(1,1,:) ) ELSE - ZRHO(1,1,:) = TSTATION%TH(:,II) + ZRHO(1,1,:) = TPSTATION%XTH(:) ENDIF - ZRHO(1,1,:) = TSTATION%P(:,II) / & - (XRD *ZRHO(1,1,:) *((TSTATION%P(:,II)/XP00)**(XRD/XCPD)) ) + ZRHO(1,1,:) = TPSTATION%XP(:) / & + (XRD *ZRHO(1,1,:) *((TPSTATION%XP(:)/XP00)**(XRD/XCPD)) ) CALL PPP2SALT(ZSV,ZRHO, PSIG3D=ZSIG, PRG3D=ZRG, PN3D=ZN0) DO JSV=1,NMODE_SLT ! mean radius - JPROC = JPROC+1 - WRITE(YTITLE(JPROC),'(A6,I1)')'SLTRGA',JSV - YUNIT (JPROC) = 'um' - WRITE(YCOMMENT(JPROC),'(A18,I1)')'RG (nb) SALT MODE ',JSV - ZWORK6 (1,1,1,:,1,JPROC) = ZRG(1,1,:,JSV) + WRITE(CTITLE(JPROC),'(A6,I1)')'SLTRGA',JSV + WRITE(CCOMMENT(JPROC),'(A18,I1)')'RG (nb) SALT MODE ',JSV + call Add_point( ytitle, ycomment, 'um', ZRG(1,1,:,JSV) ) + ! standard deviation - JPROC = JPROC+1 - WRITE(YTITLE(JPROC),'(A7,I1)')'SLTSIGA',JSV - YUNIT (JPROC) = ' ' - WRITE(YCOMMENT(JPROC),'(A16,I1)')'SIGMA DUST MODE ',JSV - ZWORK6 (1,1,1,:,1,JPROC) = ZSIG(1,1,:,JSV) + WRITE(CTITLE(JPROC),'(A7,I1)')'SLTSIGA',JSV + WRITE(CCOMMENT(JPROC),'(A16,I1)')'SIGMA DUST MODE ',JSV + call Add_point( ytitle, ycomment, '',ZSIG(1,1,:,JSV) ) + ! particles number - JPROC = JPROC+1 - WRITE(YTITLE(JPROC),'(A6,I1)')'SLTN0A',JSV - YUNIT (JPROC) = 'm-3' - WRITE(YCOMMENT(JPROC),'(A13,I1)')'N0 DUST MODE ',JSV - ZWORK6 (1,1,1,:,1,JPROC) = ZN0(1,1,:,JSV) + WRITE(CTITLE(JPROC),'(A6,I1)')'SLTN0A',JSV + WRITE(CCOMMENT(JPROC),'(A13,I1)')'N0 DUST MODE ',JSV + call Add_point( ytitle, ycomment, 'm-3', ZN0(1,1,:,JSV) ) ENDDO - DEALLOCATE (ZSV,ZRHO) - DEALLOCATE (ZN0,ZRG,ZSIG) + DEALLOCATE (ZSV,ZRHO) + DEALLOCATE (ZN0,ZRG,ZSIG) END IF +end if -IF (ANY(TSTATION%TSRAD(:,:)/=XUNDEF)) THEN - JPROC = JPROC+1 - YTITLE (JPROC) = 'Tsrad' - YUNIT (JPROC) = 'K' - YCOMMENT (JPROC) = 'Radiative Surface Temperature' - ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%TSRAD(:,II) -END IF -! -IF (ANY(TSTATION%SFCO2(:,:)/=XUNDEF)) THEN - JPROC = JPROC+1 - YTITLE (JPROC) = 'SFCO2' - YUNIT (JPROC) = 'mg m-2 s-1' - YCOMMENT (JPROC) = 'CO2 Surface Flux' - ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%SFCO2(:,II) -END IF +if ( crad /= 'NONE' ) call Add_point( 'Tsrad', 'Radiative Surface Temperature', 'K', tpstation%xtsrad(:) ) + +if ( ldiag_surfrad ) call Add_point( 'SFCO2', 'CO2 Surface Flux', 'mg m-2 s-1', tpstation%xsfco2(:) ) ! !---------------------------------------------------------------------------- ! ! -ALLOCATE (ZW6(1,1,1,SIZE(tstation%tpdates),1,JPROC)) -ZW6 = ZWORK6(:,:,:,:,:,:JPROC) -DEALLOCATE(ZWORK6) -! allocate( tzfields( jproc ) ) -tzfields(:)%cmnhname = ytitle(1 : jproc) +tzfields(:)%cmnhname = ctitle(1 : jproc) tzfields(:)%cstdname = '' -tzfields(:)%clongname = ytitle(1 : jproc) -tzfields(:)%cunits = yunit(1 : jproc) -tzfields(:)%ccomment = ycomment(1 : jproc) +tzfields(:)%clongname = ctitle(1 : jproc) +tzfields(:)%cunits = cunit(1 : jproc) +tzfields(:)%ccomment = ccomment(1 : jproc) tzfields(:)%ngrid = 0 tzfields(:)%ntype = TYPEREAL tzfields(:)%ndims = 2 @@ -770,12 +650,12 @@ tzbudiachro%clevels (NLVL_SUBCATEGORY) = '' tzbudiachro%ccomments(NLVL_SUBCATEGORY) = '' tzbudiachro%lleveluse(NLVL_GROUP) = .true. -tzbudiachro%clevels (NLVL_GROUP) = ygroup -tzbudiachro%ccomments(NLVL_GROUP) = 'Values at position of station ' // Trim( ygroup ) +tzbudiachro%clevels (NLVL_GROUP) = tpstation%cname +tzbudiachro%ccomments(NLVL_GROUP) = 'Values at position of station ' // Trim( tpstation%cname ) tzbudiachro%lleveluse(NLVL_SHAPE) = .false. tzbudiachro%clevels (NLVL_SHAPE) = 'Point' -tzbudiachro%ccomments(NLVL_SHAPE) = 'Values at position of station ' // Trim( ygroup ) +tzbudiachro%ccomments(NLVL_SHAPE) = 'Values at position of station ' // Trim( tpstation%cname ) tzbudiachro%lleveluse(NLVL_TIMEAVG) = .false. tzbudiachro%clevels (NLVL_TIMEAVG) = 'Not_time_averaged' @@ -807,18 +687,45 @@ tzbudiachro%njh = 1 tzbudiachro%nkl = 1 tzbudiachro%nkh = 1 -call Write_diachro( tpdiafile, tzbudiachro, tzfields, tstation%tpdates, zw6 ) +call Write_diachro( tpdiafile, tzbudiachro, tzfields, tstations_time%tpdates, xwork6(:,:,:,:,:,:jproc) ) deallocate( tzfields ) -DEALLOCATE (ZW6) -DEALLOCATE (YCOMMENT) -DEALLOCATE (YTITLE ) -DEALLOCATE (YUNIT ) -DEALLOCATE (IGRID ) +!Necessary because global variables (private inside module) +Deallocate( xwork6 ) +Deallocate (ccomment) +Deallocate (ctitle ) +Deallocate (cunit ) + !---------------------------------------------------------------------------- + +contains + +! ###################################################### +subroutine Add_point( htitle, hcomment, hunits, pfield ) +! ###################################################### + +use mode_msg + +character(len=*), intent(in) :: htitle +character(len=*), intent(in) :: hcomment +character(len=*), intent(in) :: hunits +real, dimension(:), intent(in) :: pfield + +integer :: jk + +jproc = jproc + 1 + +if ( jproc > iproc ) call Print_msg( NVERB_FATAL, 'IO', 'Add_point', 'more processes than expected' ) + +ctitle(jproc) = Trim( htitle) +ccomment(jproc) = Trim( hcomment ) +cunit(jproc) = Trim( hunits ) + +xwork6(1, 1, 1, :, 1, jproc) = pfield(:) + +end subroutine Add_point + END SUBROUTINE STATION_DIACHRO_n -!---------------------------------------------------------------------------- -!---------------------------------------------------------------------------- -! -END SUBROUTINE WRITE_STATION_n + +END MODULE MODE_WRITE_STATION_n diff --git a/src/MNH/write_surf_mnh.f90 b/src/MNH/write_surf_mnh.f90 index 58e08d8dc9a0d7189d1b0a6b53f3b0b5ae157b48..ca3d3d1244620687fdcbc69d5c32d8c458aac39f 100644 --- a/src/MNH/write_surf_mnh.f90 +++ b/src/MNH/write_surf_mnh.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1997-2020 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1997-2022 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. @@ -11,7 +11,7 @@ CONTAINS SUBROUTINE PREPARE_METADATA_WRITE_SURF(HREC,HDIR,HCOMMENT,KGRID,KTYPE,KDIMS,HSUBR,TPFIELD) ! -use modd_field, only: tfielddata, tfieldlist, TYPECHAR, TYPEDATE, TYPELOG +use modd_field, only: tfieldmetadata, tfieldlist use mode_field, only: Find_field_id_from_mnhname USE MODE_MSG @@ -23,7 +23,7 @@ INTEGER, INTENT(IN) :: KGRID ! Localization on the model grid INTEGER, INTENT(IN) :: KTYPE ! Datatype INTEGER, INTENT(IN) :: KDIMS ! Number of dimensions CHARACTER(LEN=*), INTENT(IN) :: HSUBR ! name of the subroutine calling -TYPE(TFIELDDATA), INTENT(OUT) :: TPFIELD ! metadata of field +TYPE(TFIELDMETADATA), INTENT(OUT) :: TPFIELD ! metadata of field ! CHARACTER(LEN=32) :: YTXT INTEGER :: IDX,IID, IRESP @@ -31,7 +31,7 @@ LOGICAL :: GWARN ! CALL FIND_FIELD_ID_FROM_MNHNAME(TRIM(HREC),IID,IRESP,ONOWARNING=.TRUE.) IF (IRESP==0) THEN - TPFIELD = TFIELDLIST(IID) + TPFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) !Modify and check CLONGNAME IF (TRIM(TPFIELD%CLONGNAME)/=TRIM(HREC)) THEN CALL PRINT_MSG(NVERB_WARNING,'IO',TRIM(HSUBR),'CLONGNAME different ('//TRIM(TPFIELD%CLONGNAME) & @@ -99,23 +99,23 @@ IF (IRESP==0) THEN END IF ELSE CALL PRINT_MSG(NVERB_DEBUG,'IO',TRIM(HSUBR),TRIM(HREC)//' not found in FIELDLIST. Generating default metadata') - TPFIELD%CMNHNAME = TRIM(HREC) - TPFIELD%CSTDNAME = '' - TPFIELD%CLONGNAME = TRIM(HREC) - TPFIELD%CUNITS = '' - TPFIELD%CDIR = HDIR - TPFIELD%CCOMMENT = TRIM(HCOMMENT) - TPFIELD%NGRID = KGRID - TPFIELD%NTYPE = KTYPE - TPFIELD%NDIMS = KDIMS + TPFIELD = TFIELDMETADATA( & + CMNHNAME = TRIM(HREC), & + CSTDNAME = '', & + CLONGNAME = TRIM(HREC), & + CUNITS = '', & + CDIR = HDIR, & + CCOMMENT = TRIM(HCOMMENT), & + NGRID = KGRID, & + NTYPE = KTYPE, & + NDIMS = KDIMS, & + LTIMEDEP = .FALSE. ) #if 0 IF (TPFIELD%NDIMS==0 .OR. TPFIELD%NTYPE==TYPECHAR .OR. TPFIELD%NTYPE==TYPEDATE .OR. TPFIELD%NTYPE==TYPELOG) THEN TPFIELD%LTIMEDEP = .FALSE. ELSE TPFIELD%LTIMEDEP = .TRUE. END IF -#else - TPFIELD%LTIMEDEP = .FALSE. #endif END IF ! @@ -175,7 +175,7 @@ END MODULE MODE_WRITE_SURF_MNH_TOOLS ! USE MODD_CONF, ONLY: CPROGRAM USE MODD_CONF_n, ONLY: CSTORAGE_TYPE -use modd_field, only: tfielddata,TYPEREAL +use modd_field, only: tfieldmetadata, TYPEREAL USE MODD_GRID USE MODD_IO, ONLY: TFILE_SURFEX @@ -194,9 +194,9 @@ CHARACTER(LEN=100), INTENT(IN) :: HCOMMENT ! Comment string ! !* 0.2 Declarations of local variables ! -CHARACTER(LEN=5) :: YMSG -INTEGER :: IID, IRESP -TYPE(TFIELDDATA) :: TZFIELD +CHARACTER(LEN=5) :: YMSG +INTEGER :: IID, IRESP +TYPE(TFIELDMETADATA) :: TZFIELD ! !------------------------------------------------------------------------------- ! @@ -285,8 +285,8 @@ END SUBROUTINE WRITE_SURFX0_MNH ! ------------ ! USE MODD_CONF_n, ONLY: CSTORAGE_TYPE -use modd_field, only: tfielddata, tfieldlist, TYPEREAL -USE MODD_GRID_n, ONLY: XXHAT, XYHAT +use modd_field, only: tfieldmetadata, tfieldlist, TYPEREAL +USE MODD_GRID_n, ONLY: XXHAT, XXHATM, XYHAT, XYHATM USE MODD_IO, ONLY: TFILE_SURFEX USE MODD_IO_SURF_MNH, ONLY :NMASK, CMASK, & NIU, NJU, NIB, NJB, NIE, NJE, & @@ -297,6 +297,7 @@ USE MODD_PARAMETERS, ONLY: XUNDEF, JPHEXT use mode_field, only: Find_field_id_from_mnhname use MODE_IO_FIELD_WRITE, only: IO_Field_write USE MODE_MSG +USE MODE_SET_GRID, only: INTERP_HORGRID_1DIR_TO_MASSPOINTS USE MODE_TOOLS_ll USE MODE_WRITE_SURF_MNH_TOOLS @@ -334,8 +335,8 @@ INTEGER :: IIU, IJU, IIB, IJB, IIE, IJE ! dimensions of horizontal fie INTEGER, DIMENSION(:), ALLOCATABLE :: IMASK ! mask for unpacking REAL :: ZUNDEF ! undefined value in SURFEX ! -CHARACTER(LEN=5) :: YMSG -TYPE(TFIELDDATA) :: TZFIELD +CHARACTER(LEN=5) :: YMSG +TYPE(TFIELDMETADATA) :: TZFIELD !------------------------------------------------------------------------------- ! CALL PRINT_MSG(NVERB_DEBUG,'IO','WRITE_SURFX1_MNH',TRIM(TFILE_SURFEX%CNAME)//': writing '//TRIM(HREC)) @@ -437,7 +438,7 @@ IF ( (CSTORAGE_TYPE=='PG' .OR. CSTORAGE_TYPE=='SU') & ! IF (HDIR=='A') THEN CALL FIND_FIELD_ID_FROM_MNHNAME('XHAT',IID,IRESP) - TZFIELD = TFIELDLIST(IID) + TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) TZFIELD%CDIR = '--' CALL IO_Field_write(TFILE_SURFEX,TZFIELD,ZW1D(:),KRESP) END IF @@ -447,7 +448,11 @@ IF ( (CSTORAGE_TYPE=='PG' .OR. CSTORAGE_TYPE=='SU') & IF (.NOT. (ASSOCIATED(XXHAT))) THEN !Store XXHAT if not yet done (necessary for PREP_PGD program when writing netCDF files) ALLOCATE(XXHAT(IIU-2*NHALO)) + ALLOCATE(XXHATM(IIU-2*NHALO)) XXHAT(:) = ZW1D(1+NHALO:IIU-NHALO) + + ! Interpolations of positions to mass points + CALL INTERP_HORGRID_1DIR_TO_MASSPOINTS( 'X', XXHAT, XXHATM ) END IF END IF DEALLOCATE(ZW1D) @@ -468,7 +473,7 @@ ELSE IF ( (CSTORAGE_TYPE=='PG' .OR. CSTORAGE_TYPE=='SU') & END IF IF (HDIR=='A') THEN CALL FIND_FIELD_ID_FROM_MNHNAME('YHAT',IID,IRESP) - TZFIELD = TFIELDLIST(IID) + TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) TZFIELD%CDIR = '--' CALL IO_Field_write(TFILE_SURFEX,TZFIELD,ZW1D(:),KRESP) END IF @@ -478,7 +483,11 @@ ELSE IF ( (CSTORAGE_TYPE=='PG' .OR. CSTORAGE_TYPE=='SU') & IF (.NOT. (ASSOCIATED(XYHAT))) THEN !Store XYHAT if not yet done (necessary for PREP_PGD program when writing netCDF files) ALLOCATE(XYHAT(IJU-2*NHALO)) + ALLOCATE(XYHATM(IJU-2*NHALO)) XYHAT(:) = ZW1D(1+NHALO:IJU-NHALO) + + ! Interpolations of positions to mass points + CALL INTERP_HORGRID_1DIR_TO_MASSPOINTS( 'Y', XYHAT, XYHATM ) END IF END IF DEALLOCATE(ZW1D) @@ -549,7 +558,7 @@ END SUBROUTINE WRITE_SURFX1_MNH ! ------------ ! USE MODD_CONF_n, ONLY: CSTORAGE_TYPE -use modd_field, only: tfielddata, TYPELOG, TYPEREAL +use modd_field, only: tfieldmetadata, TYPELOG, TYPEREAL USE MODD_DATA_COVER_PAR, ONLY: JPCOVER USE MODD_IO, ONLY: TFILE_SURFEX USE MODD_IO_SURF_MNH, ONLY: NMASK, CMASK, & @@ -603,8 +612,8 @@ REAL,DIMENSION(:,:,:), ALLOCATABLE :: ZWORK3D !JUANZ LOGICAL :: GCOVER_PACKED ! .T. if cover fields are all packed together ! -CHARACTER(LEN=5) :: YMSG -TYPE(TFIELDDATA) :: TZFIELD +CHARACTER(LEN=5) :: YMSG +TYPE(TFIELDMETADATA) :: TZFIELD !------------------------------------------------------------------------------- ! CALL PRINT_MSG(NVERB_DEBUG,'IO','WRITE_SURFX2COV_MNH',TRIM(TFILE_SURFEX%CNAME)//': writing '//TRIM(HREC)) @@ -641,16 +650,17 @@ END IF !GCOVER_PACKED = ( NB_PROCIO_W /= 1 ) GCOVER_PACKED = .FALSE. ! -TZFIELD%CMNHNAME = 'COVER_PACKED' -TZFIELD%CSTDNAME = '' -TZFIELD%CLONGNAME = 'COVER_PACKED' -TZFIELD%CUNITS = '' -TZFIELD%CDIR = '--' -TZFIELD%CCOMMENT = '' -TZFIELD%NGRID = 0 -TZFIELD%NTYPE = TYPELOG -TZFIELD%NDIMS = 0 -TZFIELD%LTIMEDEP = .FALSE. +TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'COVER_PACKED', & + CSTDNAME = '', & + CLONGNAME = 'COVER_PACKED', & + CUNITS = '', & + CDIR = '--', & + CCOMMENT = '', & + NGRID = 0, & + NTYPE = TYPELOG, & + NDIMS = 0, & + LTIMEDEP = .FALSE. ) CALL IO_Field_write(TFILE_SURFEX,TZFIELD,GCOVER_PACKED,KRESP) ! IF (KRESP /=0) THEN @@ -671,17 +681,19 @@ END DO ! IF (.NOT. GCOVER_PACKED) THEN ICOVER=0 - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = '' - TZFIELD%NGRID = 4 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 2 - TZFIELD%LTIMEDEP = .FALSE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'generic for COVER variables', & !Temporary name to ease identification + CSTDNAME = '', & + CUNITS = '', & + CDIR = YDIR, & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .FALSE. ) DO JL2=1,SIZE(OFLAG) WRITE(YREC,'(A5,I3.3)') 'COVER',JL2 TZFIELD%CMNHNAME = TRIM(YREC) TZFIELD%CLONGNAME = TRIM(YREC) - TZFIELD%CDIR = YDIR TZFIELD%CCOMMENT = 'X_Y_'//TRIM(YREC) IF (OFLAG(JL2)) THEN ICOVER=ICOVER+1 @@ -751,7 +763,7 @@ END SUBROUTINE WRITE_SURFX2COV_MNH ! USE MODD_CONF_n, ONLY: CSTORAGE_TYPE USE MODD_DATA_COVER_PAR, ONLY: JPCOVER -use modd_field, only: tfielddata, TYPEREAL +use modd_field, only: tfieldmetadata, TYPEREAL USE MODD_IO, ONLY: TFILE_SURFEX USE MODD_IO_SURF_MNH, ONLY: NMASK, CMASK, & NIU, NJU, NIB, NJB, NIE, NJE, & @@ -794,8 +806,8 @@ INTEGER :: IIU, IJU, IIB, IJB, IIE, IJE ! dimensions of horizontal fie INTEGER, DIMENSION(:), ALLOCATABLE :: IMASK ! mask for unpacking REAL :: ZUNDEF ! undefined value in SURFEX ! -CHARACTER(LEN=5) :: YMSG -TYPE(TFIELDDATA) :: TZFIELD +CHARACTER(LEN=5) :: YMSG +TYPE(TFIELDMETADATA) :: TZFIELD !------------------------------------------------------------------------------- ! CALL PRINT_MSG(NVERB_DEBUG,'IO','WRITE_SURFX2_MNH',TRIM(TFILE_SURFEX%CNAME)//': writing '//TRIM(HREC)) @@ -901,7 +913,7 @@ END SUBROUTINE WRITE_SURFX2_MNH ! ------------ ! USE MODD_CONF_n, ONLY: CSTORAGE_TYPE -use modd_field, only: tfielddata, TYPEINT +use modd_field, only: tfieldmetadata, TYPEINT USE MODD_IO, ONLY: TFILE_SURFEX USE MODD_IO_SURF_MNH, ONLY: NIU_ALL, NJU_ALL USE MODD_PARAMETERS, ONLY: JPHEXT @@ -921,9 +933,9 @@ CHARACTER(LEN=100), INTENT(IN) :: HCOMMENT ! Comment string ! !* 0.2 Declarations of local variables ! -INTEGER :: IFIELD -TYPE(TFIELDDATA) :: TZFIELD -CHARACTER(LEN=5) :: YMSG +INTEGER :: IFIELD +TYPE(TFIELDMETADATA) :: TZFIELD +CHARACTER(LEN=5) :: YMSG !------------------------------------------------------------------------------- ! CALL PRINT_MSG(NVERB_DEBUG,'IO','WRITE_SURFN0_MNH',TRIM(TFILE_SURFEX%CNAME)//': writing '//TRIM(HREC)) @@ -995,7 +1007,7 @@ END SUBROUTINE WRITE_SURFN0_MNH !* 0. DECLARATIONS ! ------------ ! -use modd_field, only: tfielddata, TYPEINT +use modd_field, only: tfieldmetadata, TYPEINT USE MODD_IO, ONLY: TFILE_SURFEX USE MODD_IO_SURF_MNH, ONLY: NMASK, CMASK, & NIU, NJU, NIB, NJB, NIE, NJE @@ -1025,8 +1037,8 @@ CHARACTER(LEN=1), INTENT(IN) :: HDIR ! type of field : ! INTEGER, DIMENSION(:,:), ALLOCATABLE :: IWORK ! work array written in the file ! -CHARACTER(LEN=5) :: YMSG -TYPE(TFIELDDATA) :: TZFIELD +CHARACTER(LEN=5) :: YMSG +TYPE(TFIELDMETADATA) :: TZFIELD !------------------------------------------------------------------------------- ! CALL PRINT_MSG(NVERB_DEBUG,'IO','WRITE_SURFN1_MNH',TRIM(TFILE_SURFEX%CNAME)//': writing '//TRIM(HREC)) @@ -1099,7 +1111,7 @@ END SUBROUTINE WRITE_SURFN1_MNH ! ------------ ! USE MODD_CONF_n, ONLY: CSTORAGE_TYPE -use modd_field, only: tfielddata, TYPECHAR, TYPELOG +use modd_field, only: tfieldmetadata, TYPECHAR, TYPELOG USE MODD_IO, ONLY: TFILE_SURFEX USE MODD_IO_SURF_MNH, ONLY: NIU_ALL, NJU_ALL @@ -1118,9 +1130,9 @@ CHARACTER(LEN=100), INTENT(IN) :: HCOMMENT ! Comment string ! !* 0.2 Declarations of local variables ! -LOGICAL :: GCARTESIAN -TYPE(TFIELDDATA) :: TZFIELD -CHARACTER(LEN=5) :: YMSG +LOGICAL :: GCARTESIAN +TYPE(TFIELDMETADATA) :: TZFIELD +CHARACTER(LEN=5) :: YMSG !------------------------------------------------------------------------------- ! CALL PRINT_MSG(NVERB_DEBUG,'IO','WRITE_SURFC0_MNH',TRIM(TFILE_SURFEX%CNAME)//': writing '//TRIM(HREC)) @@ -1195,7 +1207,7 @@ END SUBROUTINE WRITE_SURFC0_MNH ! ------------ ! USE MODD_CONF_n, ONLY: CSTORAGE_TYPE -use modd_field, only: tfielddata, TYPEINT, TYPELOG +use modd_field, only: tfieldmetadata, TYPEINT, TYPELOG USE MODD_IO, ONLY: TFILE_SURFEX USE MODD_IO_SURF_MNH, ONLY: NMASK, CMASK, & NIU, NJU, NIB, NJB, NIE, NJE @@ -1225,8 +1237,8 @@ CHARACTER(LEN=1), INTENT(IN) :: HDIR ! type of field : LOGICAL, DIMENSION(:,:), ALLOCATABLE :: GWORK ! work array written in the file INTEGER, DIMENSION(:,:), ALLOCATABLE :: IWORK ! work array written in the file ! -CHARACTER(LEN=5) :: YMSG -TYPE(TFIELDDATA) :: TZFIELD +CHARACTER(LEN=5) :: YMSG +TYPE(TFIELDMETADATA) :: TZFIELD !------------------------------------------------------------------------------- ! CALL PRINT_MSG(NVERB_DEBUG,'IO','WRITE_SURFL1_MNH',TRIM(TFILE_SURFEX%CNAME)//': writing '//TRIM(HREC)) @@ -1310,7 +1322,7 @@ END SUBROUTINE WRITE_SURFL1_MNH ! ------------ ! USE MODD_CONF_n, ONLY: CSTORAGE_TYPE -use modd_field, only: tfielddata, TYPELOG +use modd_field, only: tfieldmetadata, TYPELOG USE MODD_IO, ONLY: TFILE_SURFEX USE MODD_IO_SURF_MNH, ONLY: CMASK @@ -1329,8 +1341,8 @@ CHARACTER(LEN=100), INTENT(IN) :: HCOMMENT ! Comment string ! !* 0.2 Declarations of local variables ! -CHARACTER(LEN=5) :: YMSG -TYPE(TFIELDDATA) :: TZFIELD +CHARACTER(LEN=5) :: YMSG +TYPE(TFIELDMETADATA) :: TZFIELD ! CALL PRINT_MSG(NVERB_DEBUG,'IO','WRITE_SURFL0_MNH',TRIM(TFILE_SURFEX%CNAME)//': writing '//TRIM(HREC)) ! @@ -1393,7 +1405,7 @@ END SUBROUTINE WRITE_SURFL0_MNH ! ------------ ! USE MODD_CONF_n, ONLY: CSTORAGE_TYPE -use modd_field, only: tfielddata, TYPEDATE +use modd_field, only: tfieldmetadata, TYPEDATE USE MODD_IO, ONLY: TFILE_SURFEX USE MODD_TYPE_DATE @@ -1417,11 +1429,11 @@ CHARACTER(LEN=100), INTENT(IN) :: HCOMMENT ! Comment string !* 0.2 Declarations of local variables ! ! -CHARACTER(LEN=LEN_HREC) :: YRECFM ! Name of the article to be written -INTEGER, DIMENSION(3) :: ITDATE -CHARACTER(LEN=5) :: YMSG -TYPE (DATE_TIME) :: TZDATA -TYPE(TFIELDDATA) :: TZFIELD +CHARACTER(LEN=LEN_HREC) :: YRECFM ! Name of the article to be written +INTEGER, DIMENSION(3) :: ITDATE +CHARACTER(LEN=5) :: YMSG +TYPE (DATE_TIME) :: TZDATA +TYPE(TFIELDMETADATA) :: TZFIELD !------------------------------------------------------------------------------- ! CALL PRINT_MSG(NVERB_DEBUG,'IO','WRITE_SURFT0_MNH',TRIM(TFILE_SURFEX%CNAME)//': writing '//TRIM(HREC)) @@ -1487,7 +1499,7 @@ END SUBROUTINE WRITE_SURFT0_MNH !* 0. DECLARATIONS ! ------------ ! -use modd_field, only: tfielddata, TYPEINT, TYPEREAL +use modd_field, only: tfieldmetadata, TYPEINT, TYPEREAL USE MODD_IO, ONLY: TFILE_SURFEX USE MODD_CONF_n, ONLY: CSTORAGE_TYPE @@ -1511,9 +1523,9 @@ CHARACTER(LEN=100), INTENT(IN) :: HCOMMENT ! Comment string !* 0.2 Declarations of local variables ! ! -INTEGER, DIMENSION(3,KL1) :: ITDATE -CHARACTER(LEN=5) :: YMSG -TYPE(TFIELDDATA) :: TZFIELD +CHARACTER(LEN=5) :: YMSG +INTEGER, DIMENSION(3,KL1) :: ITDATE +TYPE(TFIELDMETADATA) :: TZFIELD !------------------------------------------------------------------------------- ! CALL PRINT_MSG(NVERB_DEBUG,'IO','WRITE_SURFT1_MNH',TRIM(TFILE_SURFEX%CNAME)//': writing '//TRIM(HREC)) @@ -1527,16 +1539,17 @@ ELSE ITDATE(2,:) = KMONTH (:) ITDATE(3,:) = KDAY (:) ! - TZFIELD%CMNHNAME = TRIM(HREC)//'%TDATE' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = '' - TZFIELD%CDIR = '--' - TZFIELD%CCOMMENT = TRIM(HCOMMENT) - TZFIELD%NGRID = 0 - TZFIELD%NTYPE = TYPEINT - TZFIELD%NDIMS = 2 - TZFIELD%LTIMEDEP = .FALSE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = TRIM(HREC)//'%TDATE', & + CSTDNAME = '', & + CLONGNAME = TRIM(HREC)//'%TDATE', & + CUNITS = '', & + CDIR = '--', & + CCOMMENT = TRIM(HCOMMENT), & + NGRID = 0, & + NTYPE = TYPEINT, & + NDIMS = 2, & + LTIMEDEP = .FALSE. ) ! CALL IO_Field_write(TFILE_SURFEX,TZFIELD,ITDATE(:,:),KRESP) ! @@ -1545,16 +1558,17 @@ ELSE CALL PRINT_MSG(NVERB_ERROR,'IO','WRITE_SURFT1_MNH','error when writing article '//TRIM(HREC)//' KRESP='//YMSG) END IF ! - TZFIELD%CMNHNAME = TRIM(HREC)//'%xtime' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = '' - TZFIELD%CDIR = '--' - TZFIELD%CCOMMENT = TRIM(HCOMMENT) - TZFIELD%NGRID = 0 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 1 - TZFIELD%LTIMEDEP = .FALSE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = TRIM(HREC)//'%xtime', & + CSTDNAME = '', & + CLONGNAME = TRIM(HREC)//'%xtime', & + CUNITS = '', & + CDIR = '--', & + CCOMMENT = TRIM(HCOMMENT), & + NGRID = 0, & + NTYPE = TYPEREAL, & + NDIMS = 1, & + LTIMEDEP = .FALSE. ) ! CALL IO_Field_write(TFILE_SURFEX,TZFIELD,PTIME(:),KRESP) ! diff --git a/src/MNH/write_ts1d.f90 b/src/MNH/write_ts1d.f90 index 440d7303ff4f9f56889afa15d364373aa129129c..4ffad8b5fe05581fc7a394cc4beefbd94708a242 100644 --- a/src/MNH/write_ts1d.f90 +++ b/src/MNH/write_ts1d.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1995-2020 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1995-2022 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. @@ -375,7 +375,7 @@ DO JN=1,NBPROF DO JL = 1, NSV IF (JL>=NSV_CHEMBEG .AND. JL<=NSV_CHEMEND) THEN DO JK = NKMAX + JPVEXT , JPVEXT + 1, -1 - ! convert ppp to ppt + ! convert ppv to ppt CALL WRITECLIP ( XSVT(IINDEX,JINDEX,JK,JL) * 1E12 ) ENDDO ELSE diff --git a/src/MNH/xy_to_latlon.f90 b/src/MNH/xy_to_latlon.f90 index f8782a519e3cbe897bd676f5b72d5334b5559ee6..4537388a16dd24a541a507d24512bbaca8c2c4b6 100644 --- a/src/MNH/xy_to_latlon.f90 +++ b/src/MNH/xy_to_latlon.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1996-2020 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1996-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. @@ -131,7 +131,7 @@ CALL IO_Init() ! CALL INI_CST() ! -CALL INI_FIELD_LIST(1) +CALL INI_FIELD_LIST() ! !* 2. Reading of namelist file ! ------------------------ diff --git a/src/MNH/zsmt_pgd.f90 b/src/MNH/zsmt_pgd.f90 index b7c97c10a8e1faffcd9225f65eb62b282cc8273e..3aea708e68726cdae989f5b7320123247ef02daa 100644 --- a/src/MNH/zsmt_pgd.f90 +++ b/src/MNH/zsmt_pgd.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2005-2020 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2005-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. @@ -67,7 +67,7 @@ END MODULE MODI_ZSMT_PGD ! !* 0. DECLARATIONS ! -use modd_field, only: tfielddata, TYPEREAL +use modd_field, only: tfieldmetadata, TYPEREAL USE MODD_IO, ONLY : TFILEDATA USE MODD_PARAMETERS, ONLY : JPHEXT, XUNDEF ! @@ -122,7 +122,7 @@ INTEGER :: INFO_ll ! error return code INTEGER :: IIB,IIE,IJB,IJE REAL, DIMENSION(:), ALLOCATABLE :: ZXHAT REAL, DIMENSION(:), ALLOCATABLE :: ZYHAT -TYPE(TFIELDDATA) :: TZFIELD +TYPE(TFIELDMETADATA) :: TZFIELD !------------------------------------------------------------------------------- ! !* 1. Read orography in the file @@ -333,41 +333,44 @@ IF(OHSLOP) THEN END DO END DO ! - ! Writes filtred orography and slopes along i and j - TZFIELD%CMNHNAME = 'ZSLOPEX' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'ZSLOPEX' - TZFIELD%CUNITS = '' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'orography slope along x' - TZFIELD%NGRID = 4 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 2 - TZFIELD%LTIMEDEP = .FALSE. + ! Writes filtred orography and slopes along i and j + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'ZSLOPEX', & + CSTDNAME = '', & + CLONGNAME = 'ZSLOPEX', & + CUNITS = '', & + CDIR = 'XY', & + CCOMMENT = 'orography slope along x', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .FALSE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZSLOPEX) ! - TZFIELD%CMNHNAME = 'ZSLOPEY' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'ZSLOPEY' - TZFIELD%CUNITS = '' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'orography slope along y' - TZFIELD%NGRID = 4 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 2 - TZFIELD%LTIMEDEP = .FALSE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'ZSLOPEY', & + CSTDNAME = '', & + CLONGNAME = 'ZSLOPEY', & + CUNITS = '', & + CDIR = 'XY', & + CCOMMENT = 'orography slope along y', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .FALSE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZSLOPEY) ! - TZFIELD%CMNHNAME = 'ZS_FILTR' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'ZS_FILTR' - TZFIELD%CUNITS = 'm' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'filtred orography' - TZFIELD%NGRID = 4 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 2 - TZFIELD%LTIMEDEP = .FALSE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'ZS_FILTR', & + CSTDNAME = '', & + CLONGNAME = 'ZS_FILTR', & + CUNITS = 'm', & + CDIR = 'XY', & + CCOMMENT = 'filtred orography', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .FALSE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZSMOOTH_ZSINI-ZFINE_ZS) END IF !------------------------------------------------------------------------------- diff --git a/src/Makefile b/src/Makefile index 29752361f40dec77111d5e7c66db036a0f1a873f..2539d55dd293aaa515e01fe6d73e091ceb8aa384 100644 --- a/src/Makefile +++ b/src/Makefile @@ -1,4 +1,4 @@ -#MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier +#MNH_LIC Copyright 1994-2023 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. @@ -342,7 +342,7 @@ NETCDF_OPT ?= ${OPT_BASE_I4:-$OPT_BASE} # cdf : $(CDF_MOD) $(CDF_MOD) : - cd ${DIR_LIBAEC} && ./configure --disable-shared --prefix=${CDF_PATH} --libdir=${CDF_PATH}/lib64 CC="$(CC)" CFLAGS="$(HDF_OPT)" && \ + cd ${DIR_LIBAEC} && autoreconf -i && ./configure --disable-shared --prefix=${CDF_PATH} --libdir=${CDF_PATH}/lib64 CC="$(CC)" CFLAGS="$(HDF_OPT)" && \ $(MAKE) && $(MAKE) install && $(MAKE) clean cd ${DIR_HDF} && ./configure --enable-fortran --disable-shared --prefix=${CDF_PATH} --libdir=${CDF_PATH}/lib64 --with-szlib=${CDF_PATH}/include,${CDF_PATH}/lib64 \ CC="$(CC)" CFLAGS="$(HDF_OPT)" FC="$(FC)" FCFLAGS="$(NETCDF_OPT)" LDFLAGS="-L${CDF_PATH}/lib64" LIBS="-lsz -laec -lz -ldl " && \ diff --git a/src/PHYEX/aux/modd_budget.f90 b/src/PHYEX/aux/modd_budget.f90 index 1f052f57816156c74cb71cd7363b82aa3bb1114c..0270f474a0e5b53d71ccc86620c9c9bcafefd866 100644 --- a/src/PHYEX/aux/modd_budget.f90 +++ b/src/PHYEX/aux/modd_budget.f90 @@ -35,7 +35,7 @@ ! 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 27/01/2020: use the tfieldmetadata_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 @@ -53,7 +53,7 @@ !* 0. DECLARATIONS ! ------------ -use modd_field, only: tfield_metadata_base +use modd_field, only: tfieldmetadata_base use modd_parameters, only: NBUNAMELGTMAX, NCOMMENTLGTMAX implicit none @@ -102,7 +102,7 @@ character(len=*), dimension(NMAXLEVELS), parameter :: CNCGROUPNAMES = [ & integer :: nbudgets ! Number of budget categories -type, extends( tfield_metadata_base ) :: tbusourcedata +type, extends( tfieldmetadata_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), @@ -114,16 +114,17 @@ type, extends( tfield_metadata_base ) :: tbusourcedata ! 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 +type, extends( tfieldmetadata_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 +type, extends( tfieldmetadata_base ) :: tburhodata real, dimension(:,:,:), allocatable :: xdata ! Array to store the budget data end type tburhodata +!PW: a commenter + renommer??? 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 diff --git a/src/PHYEX/aux/modd_cst.f90 b/src/PHYEX/aux/modd_cst.f90 index 544c754648621b3c66d725c261c57bedf412b244..cb0aed25e632bec67853d370ac79198d944051e4 100644 --- a/src/PHYEX/aux/modd_cst.f90 +++ b/src/PHYEX/aux/modd_cst.f90 @@ -1,10 +1,10 @@ -!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1994-2023 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 version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. !----------------------------------------------------------------- ! ############### - MODULE MODD_CST + MODULE MODD_CST ! ############### ! !!**** *MODD_CST* - declaration of Physic constants @@ -12,7 +12,7 @@ !! PURPOSE !! ------- ! The purpose of this declarative module is to declare the -! Physics constants. +! Physics constants. ! !! !!** IMPLICIT ARGUMENTS @@ -38,85 +38,85 @@ !! V. Masson 01/03/03 add conductivity of ice !! R. El Khatib 04/08/14 add pre-computed quantities !! J.Escobar : 10/2017 : for real*4 , add XMNH_HUGE_12_LOG -!! J.L. Redelsperger 03/2021 add constants for ocean penetrating solar -!! S. Riette: Jan 2022: introduction of a strucuture +! J.L. Redelsperger 03/2021: add constants for ocean penetrating solar +! S. Riette 01/2022: introduction of a structure +! P. Wautelet 20/05/2022: add RASTA cloud radar wavelength !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ ! IMPLICIT NONE + +REAL, PARAMETER :: XLAM_CRAD = 3.154E-3 ! RASTA cloud radar wavelength (m) <=> 95.04 GHz + TYPE CST_t -REAL :: XPI ! Pi -! -REAL :: XDAY,XSIYEA,XSIDAY ! day duration, sideral year duration, - ! sideral day duration -! -REAL :: XKARMAN ! von karman constant -REAL :: XLIGHTSPEED ! light speed -REAL :: XPLANCK ! Planck constant -REAL :: XBOLTZ ! Boltzman constant -REAL :: XAVOGADRO ! Avogadro number -! -REAL :: XRADIUS,XOMEGA ! Earth radius, earth rotation -REAL :: XG ! Gravity constant -! -REAL :: XP00 ! Reference pressure -REAL :: XP00OCEAN ! Reference pressure for ocean model -REAL :: XRH00OCEAN ! Reference density for ocean model -! -REAL :: XSTEFAN,XI0 ! Stefan-Boltzman constant, solar constant -! -REAL :: XMD,XMV ! Molar mass of dry air and molar mass of vapor -REAL :: XRD,XRV ! Gaz constant for dry air, gaz constant for vapor -REAL :: XEPSILO ! XMV/XMD -REAL :: XCPD,XCPV ! Cpd (dry air), Cpv (vapor) -REAL :: XRHOLW ! Volumic mass of liquid water -REAL :: XCL,XCI ! Cl (liquid), Ci (ice) -REAL :: XTT ! Triple point temperature -REAL :: XLVTT ! Vaporization heat constant -REAL :: XLSTT ! Sublimation heat constant -REAL :: XLMTT ! Melting heat constant -REAL :: XESTT ! Saturation vapor pressure at triple point - ! temperature -REAL :: XALPW,XBETAW,XGAMW ! Constants for saturation vapor - ! pressure function -REAL :: XALPI,XBETAI,XGAMI ! Constants for saturation vapor - ! pressure function over solid ice -REAL :: XCONDI ! thermal conductivity of ice (W m-1 K-1) -REAL :: XALPHAOC ! thermal expansion coefficient for ocean (K-1) -REAL :: XBETAOC ! Haline contraction coeff for ocean (S-1) -REAL :: XTH00 ! reference value for the potential temperature -REAL :: XTH00OCEAN ! Ref value for pot temp in ocean model -REAL :: XSA00OCEAN ! Ref value for SAlinity in ocean model -REAL :: XROC=0.69! 3 coeffs for SW penetration in Ocean (Hoecker et al) -REAL :: XD1=1.1 -REAL :: XD2=23. -! Values used in SURFEX CMO -!REAL :: XROC=0.58 -!REAL :: XD1=0.35 -!REAL :: XD2=23. + REAL :: XPI ! Pi + ! + REAL :: XDAY,XSIYEA,XSIDAY ! day duration, sideral year duration, sideral day duration + ! + REAL :: XKARMAN ! von karman constant + REAL :: XLIGHTSPEED ! light speed + REAL :: XPLANCK ! Planck constant + REAL :: XBOLTZ ! Boltzman constant + REAL :: XAVOGADRO ! Avogadro number + ! + REAL :: XRADIUS,XOMEGA ! Earth radius, earth rotation + REAL :: XG ! Gravity constant + ! + REAL :: XP00 ! Reference pressure + REAL :: XP00OCEAN ! Reference pressure for ocean model + REAL :: XRH00OCEAN ! Reference density for ocean model + ! + REAL :: XSTEFAN,XI0 ! Stefan-Boltzman constant, solar constant + ! + REAL :: XMD,XMV ! Molar mass of dry air and molar mass of vapor + REAL :: XRD,XRV ! Gaz constant for dry air, gaz constant for vapor + REAL :: XEPSILO ! XMV/XMD + REAL :: XCPD,XCPV ! Cpd (dry air), Cpv (vapor) + REAL :: XRHOLW ! Volumic mass of liquid water + REAL :: XCL,XCI ! Cl (liquid), Ci (ice) + REAL :: XTT ! Triple point temperature + REAL :: XLVTT ! Vaporization heat constant + REAL :: XLSTT ! Sublimation heat constant + REAL :: XLMTT ! Melting heat constant + REAL :: XESTT ! Saturation vapor pressure at triple point temperature + REAL :: XALPW,XBETAW,XGAMW ! Constants for saturation vapor pressure function + REAL :: XALPI,XBETAI,XGAMI ! Constants for saturation vapor pressure function over solid ice + REAL :: XCONDI ! thermal conductivity of ice (W m-1 K-1) + REAL :: XALPHAOC ! thermal expansion coefficient for ocean (K-1) + REAL :: XBETAOC ! Haline contraction coeff for ocean (S-1) + REAL :: XTH00 ! reference value for the potential temperature + REAL :: XTH00OCEAN ! Ref value for pot temp in ocean model + REAL :: XSA00OCEAN ! Ref value for SAlinity in ocean model + REAL :: XROC=0.69! 3 coeffs for SW penetration in Ocean (Hoecker et al) + REAL :: XD1=1.1 + REAL :: XD2=23. + ! Values used in SURFEX CMO + !REAL :: XROC=0.58 + !REAL :: XD1=0.35 + !REAL :: XD2=23. -REAL :: XRHOLI ! Volumic mass of ice -! -INTEGER :: NDAYSEC ! Number of seconds in a day -! -REAL :: RDSRV ! XRD/XRV -REAL :: RDSCPD ! XRD/XCPD -REAL :: RINVXP00 ! 1./XP00 -! -! Some machine precision value depending of real4/8 use -! -REAL :: XMNH_TINY ! minimum real on this machine -REAL :: XMNH_TINY_12 ! sqrt(minimum real on this machine) -REAL :: XMNH_EPSILON ! minimum space with 1.0 -REAL :: XMNH_HUGE ! maximum real on this machine -REAL :: XMNH_HUGE_12_LOG ! maximum log(sqrt(real)) on this machine + REAL :: XRHOLI ! Volumic mass of ice + ! + INTEGER :: NDAYSEC ! Number of seconds in a day + ! + REAL :: RDSRV ! XRD/XRV + REAL :: RDSCPD ! XRD/XCPD + REAL :: RINVXP00 ! 1./XP00 + ! + ! Some machine precision value depending of real4/8 use + ! + REAL :: XMNH_TINY ! minimum real on this machine + REAL :: XMNH_TINY_12 ! sqrt(minimum real on this machine) + REAL :: XMNH_EPSILON ! minimum space with 1.0 + REAL :: XMNH_HUGE ! maximum real on this machine + REAL :: XMNH_HUGE_12_LOG ! maximum log(sqrt(real)) on this machine -REAL :: XEPS_DT ! default value for DT test -REAL :: XRES_FLAT_CART ! default flat&cart residual tolerance -REAL :: XRES_OTHER ! default not flat&cart residual tolerance -REAL :: XRES_PREP ! default prep residual tolerance + REAL :: XEPS_DT ! default value for DT test + REAL :: XRES_FLAT_CART ! default flat&cart residual tolerance + REAL :: XRES_OTHER ! default not flat&cart residual tolerance + REAL :: XRES_PREP ! default prep residual tolerance END TYPE CST_t TYPE(CST_t), TARGET, SAVE :: CST @@ -172,6 +172,7 @@ REAL, POINTER :: XRES_OTHER=>NULL() REAL, POINTER :: XRES_PREP=>NULL() ! CONTAINS + SUBROUTINE CST_ASSOCIATE() IMPLICIT NONE XPI=>CST%XPI diff --git a/src/PHYEX/aux/mode_io_field_write.f90 b/src/PHYEX/aux/mode_io_field_write.f90 index a4a6a28c0f76c12701db46b997a5cf1cc96fbb80..e513093ca60097b15caa167b738b12576ebc5a8e 100644 --- a/src/PHYEX/aux/mode_io_field_write.f90 +++ b/src/PHYEX/aux/mode_io_field_write.f90 @@ -25,7 +25,8 @@ MODULE MODE_IO_FIELD_WRITE - use modd_field, only: tfielddata, tfieldlist, TYPECHAR, TYPEDATE, TYPEINT, TYPELOG, TYPEREAL + use modd_field, only: tfieldlist, tfieldmetadata, tfieldmetadata_base, & + TYPECHAR, TYPEDATE, TYPEINT, TYPELOG, TYPEREAL USE MODD_IO, ONLY: TFILEDATA, TOUTBAK USE MODD_MPIF use modd_parameters, only: NMNHNAMELGTMAX @@ -86,10 +87,10 @@ MODULE MODE_IO_FIELD_WRITE CONTAINS SUBROUTINE IO_Field_metadata_check(TPFIELD,KTYPE,KDIMS,HCALLER) - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD ! Field to check - INTEGER, INTENT(IN) :: KTYPE ! Expected datatype - INTEGER, INTENT(IN) :: KDIMS ! Expected number of dimensions - CHARACTER(LEN=*), INTENT(IN) :: HCALLER ! name of the calling subroutine + CLASS(tfieldmetadata_base), INTENT(IN) :: TPFIELD ! Field to check + INTEGER, INTENT(IN) :: KTYPE ! Expected datatype + INTEGER, INTENT(IN) :: KDIMS ! Expected number of dimensions + CHARACTER(LEN=*), INTENT(IN) :: HCALLER ! name of the calling subroutine ! CHARACTER(LEN=2) :: YDIMOK,YDIMKO CHARACTER(LEN=8) :: YTYPEOK,YTYPEKO @@ -182,13 +183,13 @@ CONTAINS subroutine IO_Field_write_error_check( tpfile, tpfield, hsubr, kresp_in, kresp_lfi, kresp_nc4, kresp_out ) use modd_io, only: gsmonoproc - type(tfiledata), intent(in) :: tpfile - type(tfielddata), intent(in) :: tpfield - character(len=*), intent(in) :: hsubr - integer, intent(in) :: kresp_in - integer, intent(in) :: kresp_lfi - integer, intent(in) :: kresp_nc4 - integer, intent(out) :: kresp_out + type(tfiledata), intent(in) :: tpfile + class(tfieldmetadata_base), intent(in) :: tpfield + character(len=*), intent(in) :: hsubr + integer, intent(in) :: kresp_in + integer, intent(in) :: kresp_lfi + integer, intent(in) :: kresp_nc4 + integer, intent(out) :: kresp_out character(len=:), allocatable :: ymsg character(len=6) :: yresp @@ -316,14 +317,14 @@ subroutine IO_Field_create( tpfile, tpfield ) use modd_field use modd_io, only: gsmonoproc, isp - type(tfiledata), intent(in) :: tpfile - type(tfielddata), intent(in) :: tpfield + type(tfiledata), intent(in) :: tpfile + class(tfieldmetadata), intent(in) :: tpfield - integer :: ik_file - integer :: iresp - logical :: glfi, gnc4 - type(tfielddata) :: tzfield - type(tfiledata), pointer :: tzfile + integer :: ik_file + integer :: iresp + logical :: glfi, gnc4 + class(tfieldmetadata), allocatable :: tzfield + type(tfiledata), pointer :: tzfile call Print_msg( NVERB_DEBUG, 'IO', 'IO_Field_create', Trim( tpfile%cname ) // ': creating ' // Trim( tpfield%cmnhname ) ) @@ -345,7 +346,7 @@ subroutine IO_Field_create( tpfile, tpfield ) end if if ( iresp == 0 ) then - tzfield = tpfield + Allocate( tzfield, source = tpfield ) if ( All( tzfield%ntype /= [ TYPEINT, TYPELOG, TYPEREAL, TYPECHAR, TYPEDATE ] ) ) then call Print_msg( NVERB_ERROR, 'IO', 'IO_Field_create', Trim( tpfile%cname ) // ': ' & @@ -448,8 +449,8 @@ subroutine IO_Ndimlist_reduce( tpfile, tpfield ) use modd_io, only: gsmonoproc, l1d, l2d, lpack use modd_parameters_ll, only: jphext - type(tfiledata), intent(in) :: tpfile - type(tfielddata), intent(inout) :: tpfield + type(tfiledata), intent(in) :: tpfile + class(tfieldmetadata_base), intent(inout) :: tpfield integer :: ihextot integer :: ji @@ -534,7 +535,7 @@ end subroutine IO_Ndimlist_reduce !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD + CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD REAL,TARGET, INTENT(IN) :: PFIELD ! array containing the data field INTEGER,OPTIONAL, INTENT(OUT):: KRESP ! return-code ! @@ -633,7 +634,7 @@ end subroutine IO_Ndimlist_reduce ! TYPE(DIMPHYEX_t), INTENT(IN) :: D TYPE(TFILEDATA), INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD + TYPE(TFIELDMETADATA), INTENT(IN) :: TPFIELD REAL,DIMENSION(D%NIJT,D%NKT),TARGET, INTENT(IN) :: PFIELD ! array containing the data field INTEGER, OPTIONAL, INTENT(OUT) :: KRESP ! return-code integer, dimension(3), optional, intent(in) :: koffset @@ -651,7 +652,7 @@ end subroutine IO_Ndimlist_reduce ! TYPE(DIMPHYEX_t), INTENT(IN) :: D TYPE(TFILEDATA), INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD + TYPE(TFIELDMETADATA), INTENT(IN) :: TPFIELD REAL,DIMENSION(D%NIT,D%NJT,D%NKT),TARGET, INTENT(IN) :: PFIELD ! array containing the data field INTEGER, OPTIONAL, INTENT(OUT) :: KRESP ! return-code integer, dimension(3), optional, intent(in) :: koffset @@ -669,7 +670,7 @@ end subroutine IO_Ndimlist_reduce ! TYPE(DIMPHYEX_t), INTENT(IN) :: D TYPE(TFILEDATA), INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD + TYPE(TFIELDMETADATA), INTENT(IN) :: TPFIELD REAL,DIMENSION(D%NIJT),TARGET, INTENT(IN) :: PFIELD ! array containing the data field INTEGER, OPTIONAL, INTENT(OUT) :: KRESP ! return-code integer, dimension(3), optional, intent(in) :: koffset @@ -687,7 +688,7 @@ end subroutine IO_Ndimlist_reduce ! TYPE(DIMPHYEX_t), INTENT(IN) :: D TYPE(TFILEDATA), INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD + TYPE(TFIELDMETADATA), INTENT(IN) :: TPFIELD REAL,DIMENSION(D%NIT,D%NJT),TARGET, INTENT(IN) :: PFIELD ! array containing the data field INTEGER, OPTIONAL, INTENT(OUT) :: KRESP ! return-code integer, dimension(3), optional, intent(in) :: koffset @@ -708,7 +709,7 @@ end subroutine IO_Ndimlist_reduce !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD + CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD REAL,DIMENSION(:),TARGET, INTENT(IN) :: PFIELD ! array containing the data field INTEGER, OPTIONAL, INTENT(OUT) :: KRESP ! return-code integer, dimension(1), optional, intent(in) :: koffset @@ -838,7 +839,7 @@ end subroutine IO_Ndimlist_reduce !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD + CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD REAL,DIMENSION(:,:),TARGET, INTENT(IN) :: PFIELD ! array containing the data field INTEGER, OPTIONAL, INTENT(OUT) :: KRESP ! return-code integer, dimension(2), optional, intent(in) :: koffset @@ -866,7 +867,7 @@ end subroutine IO_Ndimlist_reduce INTEGER :: IHEXTOT CHARACTER(LEN=:),ALLOCATABLE :: YMSG CHARACTER(LEN=6) :: YRESP - type(tfielddata) :: tzfield + class(tfieldmetadata), allocatable :: tzfield ! YFILEM = TPFILE%CNAME YRECFM = TPFIELD%CMNHNAME @@ -897,8 +898,8 @@ end subroutine IO_Ndimlist_reduce IF (GSMONOPROC) THEN ! sequential execution ! IF (LPACK .AND. L1D .AND. YDIR=='XY') THEN IF (LPACK .AND. L1D .AND. SIZE(PFIELD,1)==IHEXTOT .AND. SIZE(PFIELD,2)==IHEXTOT) THEN + Allocate( tzfield, source = tpfield ) if ( tpfile%ldimreduced ) then - tzfield = tpfield tzfield%ndims = tzfield%ndims - 2 if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(1) = tzfield%ndimlist(3) !Necessary if time dimension @@ -915,7 +916,6 @@ end subroutine IO_Ndimlist_reduce if ( gnc4 ) call IO_Field_write_nc4( tpfile, tzfield, zfieldp0d, iresp_nc4 ) end if else - tzfield = tpfield if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(1:2) = NMNHDIM_ONE end if @@ -930,8 +930,8 @@ end subroutine IO_Ndimlist_reduce endif ! ELSE IF (LPACK .AND. L2D .AND. YDIR=='XY') THEN ELSEIF (LPACK .AND. L2D .AND. SIZE(PFIELD,2)==IHEXTOT) THEN + Allocate( tzfield, source = tpfield ) if ( tpfile%ldimreduced ) then - tzfield = tpfield tzfield%ndims = tzfield%ndims - 1 if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(2) = tzfield%ndimlist(3) !Necessary if time dimension @@ -947,7 +947,6 @@ end subroutine IO_Ndimlist_reduce if ( gnc4 ) call IO_Field_write_nc4( tpfile, tzfield, zfieldp1d, iresp_nc4 ) end if else - tzfield = tpfield if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(2) = NMNHDIM_ONE end if @@ -1097,7 +1096,7 @@ end subroutine IO_Ndimlist_reduce !* 0.1 Declarations of arguments ! TYPE(TFILEDATA),TARGET, INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD + CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD REAL,DIMENSION(:,:,:),TARGET, INTENT(IN) :: PFIELD ! array containing the data field INTEGER, OPTIONAL, INTENT(OUT) :: KRESP ! return-code integer, dimension(3), optional, intent(in) :: koffset @@ -1140,7 +1139,7 @@ end subroutine IO_Ndimlist_reduce INTEGER :: IHEXTOT CHARACTER(LEN=:),ALLOCATABLE :: YMSG CHARACTER(LEN=6) :: YRESP - type(tfielddata) :: tzfield + class(tfieldmetadata), allocatable :: tzfield TYPE(TFILEDATA),POINTER :: TZFILE ! TZFILE => NULL() @@ -1178,8 +1177,8 @@ end subroutine IO_Ndimlist_reduce IF (GSMONOPROC .AND. TPFILE%NSUBFILES_IOZ==0 ) THEN ! sequential execution ! IF (LPACK .AND. L1D .AND. YDIR=='XY') THEN IF (LPACK .AND. L1D .AND. SIZE(PFIELD,1)==IHEXTOT .AND. SIZE(PFIELD,2)==IHEXTOT) THEN + Allocate( tzfield, source = tpfield ) if ( tpfile%ldimreduced ) then - tzfield = tpfield tzfield%ndims = tzfield%ndims - 2 if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(1) = tzfield%ndimlist(3) @@ -1196,7 +1195,6 @@ end subroutine IO_Ndimlist_reduce if ( gnc4 ) call IO_Field_write_nc4( tpfile, tzfield, zfieldp1d, iresp_nc4 ) end if else - tzfield = tpfield if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(1:2) = NMNHDIM_ONE end if @@ -1210,8 +1208,8 @@ end subroutine IO_Ndimlist_reduce end if endif ELSEIF (LPACK .AND. L2D .AND. SIZE(PFIELD,2)==IHEXTOT) THEN + Allocate( tzfield, source = tpfield ) if ( tpfile%ldimreduced ) then - tzfield = tpfield tzfield%ndims = tzfield%ndims - 1 if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(2) = tzfield%ndimlist(3) @@ -1229,7 +1227,6 @@ end subroutine IO_Ndimlist_reduce if ( gnc4 ) call IO_Field_write_nc4( tpfile, tzfield, zfieldp2d, iresp_nc4 ) end if else - tzfield = tpfield if ( tzfield%ndimlist(2) /= NMNHDIM_UNKNOWN ) tzfield%ndimlist(2) = NMNHDIM_ONE zfieldp => pfield(:, jphext + 1 : jphext + 1, :) if ( Present ( koffset ) ) then @@ -1503,7 +1500,7 @@ end subroutine IO_Ndimlist_reduce ! end of MNH_GA #endif !Not global reduction because a broadcast is done in IO_Field_write_error_check - call MPI_REDUCE( -Abs( [ iresp_lfi, iresp_nc4 ] ), iresps(:), 1, MNHINT_MPI, MPI_MIN, & + call MPI_REDUCE( -Abs( [ iresp_lfi, iresp_nc4 ] ), iresps(:), 2, MNHINT_MPI, MPI_MIN, & tpfile%nmaster_rank - 1, tpfile%nmpicomm, ierr ) iresp_lfi = iresps(1) iresp_nc4 = iresps(2) @@ -1562,7 +1559,7 @@ end subroutine IO_Ndimlist_reduce !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD + CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD REAL,DIMENSION(:,:,:,:),TARGET, INTENT(IN) :: PFIELD ! array containing the data field INTEGER, OPTIONAL, INTENT(OUT) :: KRESP ! return-code integer, dimension(4), optional, intent(in) :: koffset @@ -1585,7 +1582,7 @@ end subroutine IO_Ndimlist_reduce INTEGER :: IHEXTOT CHARACTER(LEN=:),ALLOCATABLE :: YMSG CHARACTER(LEN=6) :: YRESP - type(tfielddata) :: tzfield + class(tfieldmetadata), allocatable :: tzfield ! YFILEM = TPFILE%CNAME YRECFM = TPFIELD%CMNHNAME @@ -1615,8 +1612,8 @@ end subroutine IO_Ndimlist_reduce IF (GSMONOPROC) THEN ! sequential execution ! IF (LPACK .AND. L1D .AND. YDIR=='XY') THEN IF (LPACK .AND. L1D .AND. SIZE(PFIELD,1)==IHEXTOT .AND. SIZE(PFIELD,2)==IHEXTOT) THEN + Allocate( tzfield, source = tpfield ) if ( tpfile%ldimreduced ) then - tzfield = tpfield tzfield%ndims = tzfield%ndims - 2 if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(1) = tzfield%ndimlist(3) @@ -1635,7 +1632,6 @@ end subroutine IO_Ndimlist_reduce if ( gnc4 ) call IO_Field_write_nc4( tpfile, tzfield, zfieldp2d, iresp_nc4 ) end if else - tzfield = tpfield if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(1:2) = NMNHDIM_ONE end if @@ -1650,8 +1646,8 @@ end subroutine IO_Ndimlist_reduce endif ! ELSE IF (LPACK .AND. L2D .AND. YDIR=='XY') THEN ELSEIF (LPACK .AND. L2D .AND. SIZE(PFIELD,2)==IHEXTOT) THEN + Allocate( tzfield, source = tpfield ) if ( tpfile%ldimreduced ) then - tzfield = tpfield tzfield%ndims = tzfield%ndims - 1 if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(2) = tzfield%ndimlist(3) @@ -1671,7 +1667,6 @@ end subroutine IO_Ndimlist_reduce if ( gnc4 ) call IO_Field_write_nc4( tpfile, tzfield, zfieldp3d, iresp_nc4 ) end if else - tzfield = tpfield if ( tzfield%ndimlist(2) /= NMNHDIM_UNKNOWN ) tzfield%ndimlist(2) = NMNHDIM_ONE zfieldp => pfield(:, jphext + 1 : jphext + 1, :, :) if ( Present( koffset ) ) then @@ -1777,7 +1772,7 @@ end subroutine IO_Ndimlist_reduce !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD + CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD REAL,DIMENSION(:,:,:,:,:),TARGET,INTENT(IN) :: PFIELD ! array containing the data field INTEGER,OPTIONAL, INTENT(OUT):: KRESP ! return-code ! @@ -1797,7 +1792,7 @@ end subroutine IO_Ndimlist_reduce INTEGER :: IHEXTOT CHARACTER(LEN=:),ALLOCATABLE :: YMSG CHARACTER(LEN=6) :: YRESP - type(tfielddata) :: tzfield + class(tfieldmetadata), allocatable :: tzfield ! YFILEM = TPFILE%CNAME YRECFM = TPFIELD%CMNHNAME @@ -1822,8 +1817,8 @@ end subroutine IO_Ndimlist_reduce IF (GSMONOPROC) THEN ! sequential execution ! IF (LPACK .AND. L1D .AND. YDIR=='XY') THEN IF (LPACK .AND. L1D .AND. SIZE(PFIELD,1)==IHEXTOT .AND. SIZE(PFIELD,2)==IHEXTOT) THEN + Allocate( tzfield, source = tpfield ) if ( tpfile%ldimreduced ) then - tzfield = tpfield tzfield%ndims = tzfield%ndims - 2 if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(1) = tzfield%ndimlist(3) @@ -1836,7 +1831,6 @@ end subroutine IO_Ndimlist_reduce if ( glfi ) call IO_Field_write_lfi( tpfile, tzfield, zfieldp3d, iresp_lfi ) if ( gnc4 ) call IO_Field_write_nc4( tpfile, tzfield, zfieldp3d, iresp_nc4 ) else - tzfield = tpfield if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(1:2) = NMNHDIM_ONE end if @@ -1846,8 +1840,8 @@ end subroutine IO_Ndimlist_reduce endif ! ELSE IF (LPACK .AND. L2D .AND. YDIR=='XY') THEN ELSEIF (LPACK .AND. L2D .AND. SIZE(PFIELD,2)==IHEXTOT) THEN + Allocate( tzfield, source = tpfield ) if ( tpfile%ldimreduced ) then - tzfield = tpfield tzfield%ndims = tzfield%ndims - 1 if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(2) = tzfield%ndimlist(3) @@ -1860,7 +1854,6 @@ end subroutine IO_Ndimlist_reduce if ( glfi ) call IO_Field_write_lfi( tpfile, tzfield, zfieldp4d, iresp_lfi ) if ( gnc4 ) call IO_Field_write_nc4( tpfile, tzfield, zfieldp4d, iresp_nc4 ) else - tzfield = tpfield if ( tzfield%ndimlist(2) /= NMNHDIM_UNKNOWN ) tzfield%ndimlist(2) = NMNHDIM_ONE zfieldp => pfield(:, jphext + 1 : jphext + 1, :, :, :) if ( glfi ) call IO_Field_write_lfi( tpfile, tzfield, zfieldp, iresp_lfi ) @@ -1950,7 +1943,7 @@ end subroutine IO_Ndimlist_reduce !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD + CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD REAL,DIMENSION(:,:,:,:,:,:),TARGET,INTENT(IN) :: PFIELD ! array containing the data field INTEGER,OPTIONAL, INTENT(OUT):: KRESP ! return-code ! @@ -2061,7 +2054,7 @@ end subroutine IO_Ndimlist_reduce !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD + CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD INTEGER, INTENT(IN) :: KFIELD ! array containing the data field INTEGER,OPTIONAL, INTENT(OUT):: KRESP ! return-code ! @@ -2153,7 +2146,7 @@ end subroutine IO_Ndimlist_reduce !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD + CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD INTEGER,DIMENSION(:),TARGET, INTENT(IN) :: KFIELD ! array containing the data field INTEGER,OPTIONAL, INTENT(OUT):: KRESP ! return-code ! @@ -2265,7 +2258,7 @@ end subroutine IO_Ndimlist_reduce !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD + CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD INTEGER,DIMENSION(:,:),TARGET,INTENT(IN) :: KFIELD ! array containing the data field INTEGER,OPTIONAL, INTENT(OUT):: KRESP ! return-code ! @@ -2288,7 +2281,7 @@ end subroutine IO_Ndimlist_reduce INTEGER :: IHEXTOT CHARACTER(LEN=:),ALLOCATABLE :: YMSG CHARACTER(LEN=6) :: YRESP - type(tfielddata) :: tzfield + class(tfieldmetadata), allocatable :: tzfield ! YFILEM = TPFILE%CNAME YRECFM = TPFIELD%CMNHNAME @@ -2314,8 +2307,8 @@ end subroutine IO_Ndimlist_reduce IF (IRESP==0) THEN IF (GSMONOPROC) THEN ! sequential execution IF (LPACK .AND. L1D .AND. SIZE(KFIELD,1)==IHEXTOT .AND. SIZE(KFIELD,2)==IHEXTOT) THEN + Allocate( tzfield, source = tpfield ) if ( tpfile%ldimreduced ) then - tzfield = tpfield tzfield%ndims = tzfield%ndims - 2 if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(1) = tzfield%ndimlist(3) !Necessary if time dimension @@ -2325,7 +2318,6 @@ end subroutine IO_Ndimlist_reduce if ( glfi ) call IO_Field_write_lfi( tpfile, tzfield, ifieldp0d, iresp_lfi ) if ( gnc4 ) call IO_Field_write_nc4( tpfile, tzfield, ifieldp0d, iresp_nc4 ) else - tzfield = tpfield if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(1:2) = NMNHDIM_ONE end if @@ -2335,8 +2327,8 @@ end subroutine IO_Ndimlist_reduce endif ! ELSE IF (LPACK .AND. L2D .AND. YDIR=='XY') THEN ELSEIF (LPACK .AND. L2D .AND. SIZE(KFIELD,2)==IHEXTOT) THEN + Allocate( tzfield, source = tpfield ) if ( tpfile%ldimreduced ) then - tzfield = tpfield tzfield%ndims = tzfield%ndims - 1 if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(2) = tzfield%ndimlist(3) !Necessary if time dimension @@ -2346,7 +2338,6 @@ end subroutine IO_Ndimlist_reduce if ( glfi ) call IO_Field_write_lfi( tpfile, tzfield, ifieldp1d, iresp_lfi ) if ( gnc4 ) call IO_Field_write_nc4( tpfile, tzfield, ifieldp1d, iresp_nc4 ) else - tzfield = tpfield if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(2) = NMNHDIM_ONE end if @@ -2446,7 +2437,7 @@ end subroutine IO_Ndimlist_reduce !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD + CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD INTEGER,DIMENSION(:,:,:),TARGET,INTENT(IN) :: KFIELD ! array containing the data field INTEGER,OPTIONAL, INTENT(OUT):: KRESP ! return-code ! @@ -2468,7 +2459,7 @@ end subroutine IO_Ndimlist_reduce INTEGER :: IHEXTOT CHARACTER(LEN=:),ALLOCATABLE :: YMSG CHARACTER(LEN=6) :: YRESP - type(tfielddata) :: tzfield + class(tfieldmetadata), allocatable :: tzfield ! YFILEM = TPFILE%CNAME YRECFM = TPFIELD%CMNHNAME @@ -2494,8 +2485,8 @@ end subroutine IO_Ndimlist_reduce IF (IRESP==0) THEN IF (GSMONOPROC) THEN ! sequential execution IF (LPACK .AND. L1D .AND. SIZE(KFIELD,1)==IHEXTOT .AND. SIZE(KFIELD,2)==IHEXTOT) THEN + Allocate( tzfield, source = tpfield ) if ( tpfile%ldimreduced ) then - tzfield = tpfield tzfield%ndims = tzfield%ndims - 2 if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(1) = tzfield%ndimlist(3) @@ -2506,7 +2497,6 @@ end subroutine IO_Ndimlist_reduce if ( glfi ) call IO_Field_write_lfi( tpfile, tzfield, ifieldp1d, iresp_lfi ) if ( gnc4 ) call IO_Field_write_nc4( tpfile, tzfield, ifieldp1d, iresp_nc4 ) else - tzfield = tpfield if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(1:2) = NMNHDIM_ONE end if @@ -2516,8 +2506,8 @@ end subroutine IO_Ndimlist_reduce endif ! ELSE IF (LPACK .AND. L2D .AND. YDIR=='XY') THEN ELSEIF (LPACK .AND. L2D .AND. SIZE(KFIELD,2)==IHEXTOT) THEN + Allocate( tzfield, source = tpfield ) if ( tpfile%ldimreduced ) then - tzfield = tpfield tzfield%ndims = tzfield%ndims - 1 if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(2) = tzfield%ndimlist(3) @@ -2528,7 +2518,6 @@ end subroutine IO_Ndimlist_reduce if ( glfi ) call IO_Field_write_lfi( tpfile, tzfield, ifieldp2d, iresp_lfi ) if ( gnc4 ) call IO_Field_write_nc4( tpfile, tzfield, ifieldp2d, iresp_nc4 ) else - tzfield = tpfield if ( tzfield%ndimlist(2) /= NMNHDIM_UNKNOWN ) tzfield%ndimlist(2) = NMNHDIM_ONE ifieldp => kfield(:, jphext + 1 : jphext + 1, :) if ( glfi ) call IO_Field_write_lfi( tpfile, tzfield, ifieldp, iresp_lfi ) @@ -2624,7 +2613,7 @@ end subroutine IO_Ndimlist_reduce !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD + CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD INTEGER,DIMENSION(:,:,:,:),TARGET, INTENT(IN) :: KFIELD ! array containing the data field INTEGER, OPTIONAL, INTENT(OUT) :: KRESP ! return-code integer, dimension(4), optional, intent(in) :: koffset @@ -2647,7 +2636,7 @@ end subroutine IO_Ndimlist_reduce INTEGER :: IHEXTOT CHARACTER(LEN=:),ALLOCATABLE :: YMSG CHARACTER(LEN=6) :: YRESP - type(tfielddata) :: tzfield + class(tfieldmetadata), allocatable :: tzfield ! YFILEM = TPFILE%CNAME YRECFM = TPFIELD%CMNHNAME @@ -2677,8 +2666,8 @@ end subroutine IO_Ndimlist_reduce IF (GSMONOPROC) THEN ! sequential execution ! IF (LPACK .AND. L1D .AND. YDIR=='XY') THEN IF (LPACK .AND. L1D .AND. SIZE(KFIELD,1)==IHEXTOT .AND. SIZE(KFIELD,2)==IHEXTOT) THEN + Allocate( tzfield, source = tpfield ) if ( tpfile%ldimreduced ) then - tzfield = tpfield tzfield%ndims = tzfield%ndims - 2 if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(1) = tzfield%ndimlist(3) @@ -2697,7 +2686,6 @@ end subroutine IO_Ndimlist_reduce if ( gnc4 ) call IO_Field_write_nc4( tpfile, tzfield, ifieldp2d, iresp_nc4 ) end if else - tzfield = tpfield if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(1:2) = NMNHDIM_ONE end if @@ -2712,8 +2700,8 @@ end subroutine IO_Ndimlist_reduce endif ! ELSE IF (LPACK .AND. L2D .AND. YDIR=='XY') THEN ELSEIF (LPACK .AND. L2D .AND. SIZE(KFIELD,2)==IHEXTOT) THEN + Allocate( tzfield, source = tpfield ) if ( tpfile%ldimreduced ) then - tzfield = tpfield tzfield%ndims = tzfield%ndims - 1 if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(2) = tzfield%ndimlist(3) @@ -2733,7 +2721,6 @@ end subroutine IO_Ndimlist_reduce if ( gnc4 ) call IO_Field_write_nc4( tpfile, tzfield, ifieldp3d, iresp_nc4 ) end if else - tzfield = tpfield if ( tzfield%ndimlist(2) /= NMNHDIM_UNKNOWN ) tzfield%ndimlist(2) = NMNHDIM_ONE ifieldp => kfield(:, jphext + 1 : jphext + 1, :, :) if ( Present( koffset ) ) then @@ -2833,7 +2820,7 @@ end subroutine IO_Ndimlist_reduce !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD + CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD LOGICAL, INTENT(IN) :: OFIELD ! array containing the data field INTEGER,OPTIONAL, INTENT(OUT):: KRESP ! return-code ! @@ -2925,7 +2912,7 @@ end subroutine IO_Ndimlist_reduce !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD + CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD LOGICAL,DIMENSION(:),TARGET, INTENT(IN) :: OFIELD ! array containing the data field INTEGER,OPTIONAL, INTENT(OUT):: KRESP ! return-code ! @@ -3032,7 +3019,7 @@ end subroutine IO_Ndimlist_reduce !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD + CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD CHARACTER(LEN=*), INTENT(IN) :: HFIELD ! array containing the data field INTEGER,OPTIONAL, INTENT(OUT):: KRESP ! return-code ! @@ -3112,7 +3099,7 @@ end subroutine IO_Ndimlist_reduce !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD + CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD CHARACTER(LEN=*),DIMENSION(:),INTENT(IN) :: HFIELD ! array containing the data field INTEGER,OPTIONAL, INTENT(OUT):: KRESP ! return-code ! @@ -3216,7 +3203,7 @@ end subroutine IO_Ndimlist_reduce !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD + CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD TYPE (DATE_TIME), INTENT(IN) :: TFIELD ! array containing the data field INTEGER,OPTIONAL, INTENT(OUT):: KRESP ! return-code ! @@ -3293,7 +3280,7 @@ end subroutine IO_Ndimlist_reduce !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD + CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD TYPE (DATE_TIME),DIMENSION(:), INTENT(IN) :: TFIELD ! array containing the data field INTEGER,OPTIONAL, INTENT(OUT):: KRESP ! return-code ! @@ -3373,7 +3360,7 @@ end subroutine IO_Ndimlist_reduce !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD + CLASS(TFIELDMETADATA), INTENT(INOUT) :: TPFIELD INTEGER, INTENT(IN) :: KL3D ! size of the LB array in FM REAL,DIMENSION(:,:,:),TARGET,INTENT(IN) :: PLB ! array containing the LB field INTEGER,OPTIONAL, INTENT(OUT) :: KRESP ! return-code @@ -3402,7 +3389,7 @@ end subroutine IO_Ndimlist_reduce TYPE(TX_3DP),ALLOCATABLE,DIMENSION(:) :: T_TX3DP CHARACTER(LEN=:),ALLOCATABLE :: YMSG CHARACTER(LEN=6) :: YRESP - type(tfielddata) :: tzfield + class(tfieldmetadata), allocatable :: tzfield ! YFILEM = TPFILE%CNAME YRECFM = TPFIELD%CMNHNAME @@ -3437,8 +3424,8 @@ end subroutine IO_Ndimlist_reduce IF (IRESP==0) THEN IF (GSMONOPROC) THEN ! sequential execution IF (LPACK .AND. L2D) THEN + Allocate( tzfield, source = tpfield ) if ( tpfile%ldimreduced ) then - tzfield = tpfield tzfield%ndims = tzfield%ndims - 1 if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(2) = tzfield%ndimlist(3) @@ -3449,7 +3436,6 @@ end subroutine IO_Ndimlist_reduce if ( glfi ) call IO_Field_write_lfi( tpfile, tzfield, ztx2dp, iresp_lfi ) if ( gnc4 ) call IO_Field_write_nc4( tpfile, tzfield, ztx2dp, iresp_nc4 ) else - tzfield = tpfield if ( tzfield%ndimlist(2) /= NMNHDIM_UNKNOWN ) tzfield%ndimlist(2) = NMNHDIM_ONE tx3dp => plb(:, jphext + 1 : jphext + 1, :) if ( glfi ) call IO_Field_write_lfi( tpfile, tzfield, tx3dp, iresp_lfi ) @@ -3533,7 +3519,7 @@ end subroutine IO_Ndimlist_reduce !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD + CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD CHARACTER(LEN=*), INTENT(IN) :: HBUDGET ! 'BUDGET' (budget) or 'OTHER' (MesoNH field) REAL, DIMENSION(:,:), TARGET, INTENT(IN) :: PFIELD ! array containing the data field INTEGER, INTENT(IN) :: KXOBOX ! @@ -3627,7 +3613,7 @@ end subroutine IO_Ndimlist_reduce !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD + CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD CHARACTER(LEN=*), INTENT(IN) :: HBUDGET ! 'BUDGET' (budget) or 'OTHER' (MesoNH field) REAL, DIMENSION(:,:,:), TARGET, INTENT(IN) :: PFIELD ! array containing the data field INTEGER, INTENT(IN) :: KXOBOX ! @@ -3721,7 +3707,7 @@ end subroutine IO_Ndimlist_reduce !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD + CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD CHARACTER(LEN=*), INTENT(IN) :: HBUDGET ! 'BUDGET' (budget) or 'OTHER' (MesoNH field) REAL, DIMENSION(:,:,:,:), TARGET, INTENT(IN) :: PFIELD ! array containing the data field INTEGER, INTENT(IN) :: KXOBOX ! @@ -3815,7 +3801,7 @@ end subroutine IO_Ndimlist_reduce !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD + CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD CHARACTER(LEN=*), INTENT(IN) :: HBUDGET ! 'BUDGET' (budget) or 'OTHER' (MesoNH field) REAL,DIMENSION(:,:,:,:,:),TARGET,INTENT(IN) :: PFIELD ! array containing the data field INTEGER, INTENT(IN) :: KXOBOX ! @@ -4325,7 +4311,7 @@ IMPLICIT NONE ! TYPE(TOUTBAK), INTENT(IN) :: TPOUTPUT !Output structure ! -TYPE(TFIELDDATA) :: TZFIELD +TYPE(TFIELDMETADATA) :: TZFIELD ! #if 0 INTEGER :: IKB diff --git a/src/PHYEX/micro/c2r2_adjust.f90 b/src/PHYEX/micro/c2r2_adjust.f90 index b97914d1af619016ef85478e6aa2c275eb31421c..c5e9d27bcd264a39895284056bb1fdaa9c22b715 100644 --- a/src/PHYEX/micro/c2r2_adjust.f90 +++ b/src/PHYEX/micro/c2r2_adjust.f90 @@ -146,7 +146,7 @@ use modd_budget, only: lbudget_th, lbudget_rv, lbudget_rc, lbudget_sv, tbudgets USE MODD_CONF USE MODD_CST -USE MODD_FIELD, only: tfielddata, TYPEREAL +USE MODD_FIELD, only: tfieldmetadata, TYPEREAL USE MODD_IO, ONLY: TFILEDATA USE MODD_LUNIT_n, ONLY: TLUOUT USE MODD_NSV, ONLY: NSV_C2R2BEG @@ -195,10 +195,10 @@ REAL, DIMENSION(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3)) & ZW1,ZW2,ZW3 ! Work arrays for intermediate ! fields ! -INTEGER :: IRESP ! Return code of FM routines -INTEGER :: JITER,ITERMAX ! iterative loop for first order adjustment -INTEGER :: ILUOUT ! Logical unit of output listing -TYPE(TFIELDDATA) :: TZFIELD +INTEGER :: IRESP ! Return code of FM routines +INTEGER :: JITER,ITERMAX ! iterative loop for first order adjustment +INTEGER :: ILUOUT ! Logical unit of output listing +TYPE(TFIELDMETADATA) :: TZFIELD !------------------------------------------------------------------------------- ! !* 1. PRELIMINARIES @@ -405,16 +405,17 @@ IF ( HRAD /= 'NONE' ) THEN END IF ! IF ( tpfile%lopened ) THEN - TZFIELD%CMNHNAME = 'NEB' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'NEB' - TZFIELD%CUNITS = '1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_NEB' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'NEB', & + CSTDNAME = '', & + CLONGNAME = 'NEB', & + CUNITS = '1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_NEB', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZW1) END IF ! diff --git a/src/PHYEX/micro/lima_adjust.f90 b/src/PHYEX/micro/lima_adjust.f90 index 189fe45146155c66740f559f4db5c9e2bd006a29..54b749e8be0e1166ef23eda588f09ffb95cc164b 100644 --- a/src/PHYEX/micro/lima_adjust.f90 +++ b/src/PHYEX/micro/lima_adjust.f90 @@ -151,7 +151,7 @@ use modd_budget, only: lbu_enable, nbumod, tbudgets USE MODD_CONF USE MODD_CST -use modd_field, only: TFIELDDATA, TYPEREAL +use modd_field, only: TFIELDMETADATA, TYPEREAL USE MODD_IO, ONLY: TFILEDATA USE MODD_LUNIT_n, ONLY: TLUOUT USE MODD_NSV @@ -288,7 +288,7 @@ INTEGER :: JL ! and PACK intrinsics INTEGER :: JMOD, JMOD_IFN, JMOD_IMM ! INTEGER , DIMENSION(3) :: BV -TYPE(TFIELDDATA) :: TZFIELD +TYPE(TFIELDMETADATA) :: TZFIELD ! !------------------------------------------------------------------------------- ! @@ -1201,16 +1201,17 @@ IF ( SIZE(PSRCS,3) /= 0 ) THEN END IF ! IF ( tpfile%lopened ) THEN - TZFIELD%CMNHNAME = 'NEB' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'NEB' - TZFIELD%CUNITS = '1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_NEB' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'NEB', & + CSTDNAME = '', & + CLONGNAME = 'NEB', & + CUNITS = '1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_NEB', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZW) END IF ! @@ -1256,16 +1257,17 @@ IF ( tpfile%lopened ) THEN ZW1(:,:,:)= PPABSTT(:,:,:) ZW(:,:,:) = PRVT(:,:,:)*( ZW1(:,:,:)-ZW(:,:,:) ) / ( (XMV/XMD) * ZW(:,:,:) ) - 1.0 - TZFIELD%CMNHNAME = 'SSI' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'SSI' - TZFIELD%CUNITS = '' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_SSI' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'SSI', & + CSTDNAME = '', & + CLONGNAME = 'SSI', & + CUNITS = '', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_SSI', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZW) END IF ! diff --git a/src/PHYEX/micro/lima_adjust_split.f90 b/src/PHYEX/micro/lima_adjust_split.f90 index 9482c616c1ab714ffb485cf24867d399e5f362b2..724b835b9729e2f9a6ac930affaa28ced1ad815c 100644 --- a/src/PHYEX/micro/lima_adjust_split.f90 +++ b/src/PHYEX/micro/lima_adjust_split.f90 @@ -158,7 +158,7 @@ use modd_budget, only: lbu_enable, nbumod, tbudgets USE MODD_CONF USE MODD_CST -use modd_field, only: TFIELDDATA, TYPEREAL +use modd_field, only: TFIELDMETADATA, TYPEREAL USE MODD_IO, ONLY: TFILEDATA USE MODD_LUNIT_n, ONLY: TLUOUT USE MODD_NSV @@ -302,6 +302,7 @@ INTEGER :: JITER,ITERMAX ! iterative loop for first order adju INTEGER :: ILUOUT ! Logical unit of output listing ! INTEGER :: ISIZE +LOGICAL :: G_SIGMAS, GUSERI REAL, DIMENSION(:), ALLOCATABLE :: ZRTMIN REAL, DIMENSION(:), ALLOCATABLE :: ZCTMIN ! @@ -309,8 +310,7 @@ integer :: idx integer :: JI, JJ, JK, jl INTEGER :: JMOD, JMOD_IFN, JMOD_IMM ! -TYPE(TFIELDDATA) :: TZFIELD -LOGICAL :: G_SIGMAS, GUSERI +TYPE(TFIELDMETADATA) :: TZFIELD ! !------------------------------------------------------------------------------- ! @@ -683,16 +683,17 @@ ELSE END IF ! IF ( tpfile%lopened ) THEN - TZFIELD%CMNHNAME = 'NEB' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'NEB' - TZFIELD%CUNITS = '1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_NEB' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'NEB', & + CSTDNAME = '', & + CLONGNAME = 'NEB', & + CUNITS = '1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_NEB', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,PCLDFR) END IF ! @@ -737,16 +738,17 @@ IF ( tpfile%lopened ) THEN ZW1(:,:,:)= PPABSTT(:,:,:) ZW(:,:,:) = PRVT(:,:,:)*( ZW1(:,:,:)-ZW(:,:,:) ) / ( (XMV/XMD) * ZW(:,:,:) ) - 1.0 - TZFIELD%CMNHNAME = 'SSI' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'SSI' - TZFIELD%CUNITS = '' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_SSI' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'SSI', & + CSTDNAME = '', & + CLONGNAME = 'SSI', & + CUNITS = '', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_SSI', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZW) END IF ! diff --git a/src/PHYEX/micro/lima_ccn_activation.f90 b/src/PHYEX/micro/lima_ccn_activation.f90 index fa0a276ebcc591f7dc6dbdbdaf505f044d97c6ba..bac576fa00f953074ced8034ceeb6e1271f3aadb 100644 --- a/src/PHYEX/micro/lima_ccn_activation.f90 +++ b/src/PHYEX/micro/lima_ccn_activation.f90 @@ -98,7 +98,7 @@ END MODULE MODI_LIMA_CCN_ACTIVATION ! ------------ ! USE MODD_CST, ONLY: XALPW, XBETAW, XCL, XCPD, XCPV, XGAMW, XLVTT, XMD, XMNH_EPSILON, XMV, XRV, XTT -use modd_field, only: TFIELDDATA, TYPEREAL +use modd_field, only: TFIELDMETADATA, TYPEREAL USE MODD_IO, ONLY: TFILEDATA USE MODD_LUNIT_n, ONLY: TLUOUT USE MODD_PARAMETERS, ONLY: JPHEXT, JPVEXT @@ -181,7 +181,7 @@ INTEGER :: JMOD INTEGER :: IIB, IIE, IJB, IJE, IKB, IKE ! Physical domain ! INTEGER :: ILUOUT ! Logical unit of output listing -TYPE(TFIELDDATA) :: TZFIELD +TYPE(TFIELDMETADATA) :: TZFIELD !------------------------------------------------------------------------------- ! ILUOUT = TLUOUT%NLU @@ -502,29 +502,30 @@ IF ( tpfile%lopened ) THEN ZW (:,:,:) = 0. ZW2(:,:,:) = 0. END IF - - TZFIELD%CMNHNAME ='SMAX' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = '' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_SMAX' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'SMAX', & + CSTDNAME = '', & + CLONGNAME = 'SMAX', & + CUNITS = '', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_SMAX', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZW) ! - TZFIELD%CMNHNAME ='NACT' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'kg-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_NACT' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'NACT', & + CSTDNAME = '', & + CLONGNAME = 'NACT', & + CUNITS = 'kg-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_NACT', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZW2) END IF ! diff --git a/src/PHYEX/micro/lima_notadjust.f90 b/src/PHYEX/micro/lima_notadjust.f90 index 42a0b33d59f64b1be5a978b25edc8970fd9b4331..ddd221297382b329637fea4589002845dcf4a696 100644 --- a/src/PHYEX/micro/lima_notadjust.f90 +++ b/src/PHYEX/micro/lima_notadjust.f90 @@ -83,7 +83,7 @@ use modd_budget, only: lbu_enable, nbumod, tbudgets USE MODD_CONF USE MODD_CST -USE MODD_FIELD, ONLY: TFIELDDATA,TYPEREAL +USE MODD_FIELD, ONLY: TFIELDMETADATA, TYPEREAL USE MODD_IO, ONLY: TFILEDATA USE MODD_LUNIT_n, ONLY: TLUOUT USE MODD_NSV @@ -168,7 +168,7 @@ REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) ::& ZSAT,ZCCS INTEGER :: JK ! For loop integer :: idx -TYPE(TFIELDDATA) :: TZFIELD +TYPE(TFIELDMETADATA) :: TZFIELD REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZNFS ! CCN C. available source REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZNAS ! Cloud C. nuclei C. source REAL, DIMENSION(:,:), ALLOCATABLE :: ZZNFS ! CCN C. available source @@ -588,16 +588,17 @@ ENDWHERE ! IF ( tpfile%lopened ) THEN ZW(:,:,:)=SUM(ZNAS,4)-ZW(:,:,:) - TZFIELD%CMNHNAME = 'NACT' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'NACT' - TZFIELD%CUNITS = '' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_NACT' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'NACT', & + CSTDNAME = '', & + CLONGNAME = 'NACT', & + CUNITS = 'kg-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_NACT', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZW) END IF ! diff --git a/src/PHYEX/micro/lima_warm_nucl.f90 b/src/PHYEX/micro/lima_warm_nucl.f90 index cf5382b50799966e699e28adabb1054c237fddb6..8591b848e0ade496014c0816624fb589b36b7804 100644 --- a/src/PHYEX/micro/lima_warm_nucl.f90 +++ b/src/PHYEX/micro/lima_warm_nucl.f90 @@ -108,7 +108,7 @@ END MODULE MODI_LIMA_WARM_NUCL ! ------------ ! USE MODD_CST -use modd_field, only: TFIELDDATA, TYPEREAL +use modd_field, only: TFIELDMETADATA, TYPEREAL USE MODD_IO, ONLY: TFILEDATA USE MODD_LUNIT_n, ONLY: TLUOUT USE MODD_PARAMETERS, ONLY : JPHEXT, JPVEXT @@ -198,7 +198,7 @@ INTEGER :: JMOD INTEGER :: IIB, IIE, IJB, IJE, IKB, IKE ! Physical domain ! INTEGER :: ILUOUT ! Logical unit of output listing -TYPE(TFIELDDATA) :: TZFIELD +TYPE(TFIELDMETADATA) :: TZFIELD !------------------------------------------------------------------------------- ! ILUOUT = TLUOUT%NLU @@ -509,28 +509,30 @@ IF ( tpfile%lopened ) THEN ZW2(:,:,:) = 0. END IF - TZFIELD%CMNHNAME ='SMAX' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = '' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_SMAX' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'SMAX', & + CSTDNAME = '', & + CLONGNAME = 'SMAX', & + CUNITS = '', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_SMAX', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZW) ! - TZFIELD%CMNHNAME ='NACT' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'kg-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_NACT' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'NACT', & + CSTDNAME = '', & + CLONGNAME = 'NACT', & + CUNITS = 'kg-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_NACT', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZW2) END IF ! diff --git a/src/PHYEX/micro/rain_c2r2_khko.f90 b/src/PHYEX/micro/rain_c2r2_khko.f90 index 5708c0d4c4742afee013137bff42bc0fc1d51c48..cc19dbbf0cc7dc6aa5a287f8dec73f6ba3b46952 100644 --- a/src/PHYEX/micro/rain_c2r2_khko.f90 +++ b/src/PHYEX/micro/rain_c2r2_khko.f90 @@ -225,7 +225,7 @@ USE MODD_CH_AEROSOL USE MODD_CONF USE MODD_CST USE MODD_DUST -use modd_field, only: tfielddata, TYPEREAL +use modd_field, only: tfieldmetadata, TYPEREAL USE MODD_IO, ONLY: TFILEDATA USE MODD_NSV, ONLY : NSV_C2R2BEG USE MODD_PARAM_C2R2 @@ -415,7 +415,7 @@ REAL :: ZFACT, JSV, ZMU, ZALPHA REAL, DIMENSION(:), ALLOCATABLE :: ZRTMIN REAL, DIMENSION(:), ALLOCATABLE :: ZCTMIN REAL :: ZTMP -TYPE(TFIELDDATA) :: TZFIELD +TYPE(TFIELDMETADATA) :: TZFIELD ! ! ! @@ -595,16 +595,17 @@ end if !! !! ! IF ( tpfile%lopened ) THEN -! TZFIELD%CMNHNAME = 'ZCHEN' -! TZFIELD%CSTDNAME = '' -! TZFIELD%CLONGNAME = 'ZCHEN' -! TZFIELD%CUNITS = '' -! TZFIELD%CDIR = 'XY' -! TZFIELD%CCOMMENT = 'X_Y_Z_ZCHEN' -! TZFIELD%NGRID = 1 -! TZFIELD%NTYPE = TYPEREAL -! TZFIELD%NDIMS = 3 -! TZFIELD%LTIMEDEP = .TRUE. +! TZFIELD = TFIELDMETADATA( & +! CMNHNAME = 'ZCHEN', & +! CSTDNAME = '', & +! CLONGNAME = 'ZCHEN', & +! CUNITS = '', & +! CDIR = 'XY', & +! CCOMMENT = 'X_Y_Z_ZCHEN', & +! NGRID = 1, & +! NTYPE = TYPEREAL, & +! NDIMS = 3, & +! LTIMEDEP = .TRUE. ) ! CALL IO_Field_write(TPFILE,TZFIELD,ZCHEN) ! END IF ! @@ -878,16 +879,17 @@ INUCT = COUNTJV( GNUCT(:,:,:),I1(:),I2(:),I3(:)) ! END IF ! IF ( tpfile%lopened ) THEN - TZFIELD%CMNHNAME = 'SMAX' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'SMAX' - TZFIELD%CUNITS = '1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_SMAX' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'SMAX', & + CSTDNAME = '', & + CLONGNAME = 'SMAX', & + CUNITS = '1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_SMAX', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZZW1LOG) END IF ! @@ -1896,28 +1898,30 @@ DO JN = 1 , KSPLITR END IF ! IF ( OSEDC .AND. tpfile%lopened ) THEN - TZFIELD%CMNHNAME = 'SEDFLUXC' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'SEDFLUXC' - TZFIELD%CUNITS = '' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_SEDFLUXC' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'SEDFLUXC', & + CSTDNAME = '', & + CLONGNAME = 'SEDFLUXC', & + CUNITS = '', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_SEDFLUXC', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWSEDC) ! - TZFIELD%CMNHNAME = 'SEDFLUXR' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'SEDFLUXR' - TZFIELD%CUNITS = '' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_SEDFLUXR' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'SEDFLUXR', & + CSTDNAME = '', & + CLONGNAME = 'SEDFLUXR', & + CUNITS = '', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_SEDFLUXR', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWSEDR) END IF END DO diff --git a/src/PHYEX/turb/mode_ibm_mixinglength.f90 b/src/PHYEX/turb/mode_ibm_mixinglength.f90 index 7f74c571a60118414f48f509d1f3b7f95e3d5e26..bc584c94082a6a3b64adb527556d6373f11e944b 100644 --- a/src/PHYEX/turb/mode_ibm_mixinglength.f90 +++ b/src/PHYEX/turb/mode_ibm_mixinglength.f90 @@ -55,7 +55,7 @@ SUBROUTINE IBM_MIXINGLENGTH(D,PLM,PLEPS,PMU,PHI,PTKE) USE MODD_REF_n, ONLY: XRHODJ,XRHODREF USE MODD_CTURB USE MODD_CST - USE MODD_GRID_n, ONLY: XXHAT,XYHAT,XZZ + USE MODD_GRID_n, ONLY: XZZ ! ! interface ! diff --git a/src/PHYEX/turb/mode_prandtl.f90 b/src/PHYEX/turb/mode_prandtl.f90 index 120b784a5e170829bae52f188ff7f2b49a1501ce..9a0d77c6dd45218aecc31b142635e444bbb1d2c4 100644 --- a/src/PHYEX/turb/mode_prandtl.f90 +++ b/src/PHYEX/turb/mode_prandtl.f90 @@ -144,16 +144,16 @@ CONTAINS USE PARKIND1, ONLY : JPRB USE YOMHOOK , ONLY : LHOOK, DR_HOOK ! -USE MODD_CST, ONLY : CST_t -USE MODD_CTURB, ONLY : CSTURB_t -USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t -USE MODD_FIELD, ONLY: TFIELDDATA, TYPEREAL +USE MODD_CST, ONLY: CST_t +USE MODD_CTURB, ONLY: CSTURB_t +USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t +USE MODD_FIELD, ONLY: TFIELDMETADATA, TYPEREAL USE MODD_IO, ONLY: TFILEDATA -USE MODD_PARAMETERS, ONLY: JPVEXT_TURB +USE MODD_PARAMETERS, ONLY: JPVEXT_TURB ! +USE MODE_EMOIST, ONLY: EMOIST +USE MODE_ETHETA, ONLY: ETHETA USE MODE_GRADIENT_M_PHY, ONLY: GX_M_M_PHY, GY_M_M_PHY -USE MODE_EMOIST, ONLY : EMOIST -USE MODE_ETHETA, ONLY : ETHETA USE MODE_IO_FIELD_WRITE, ONLY: IO_FIELD_WRITE_PHY ! IMPLICIT NONE @@ -174,7 +174,7 @@ LOGICAL, INTENT(IN) :: OTURB_DIAG ! switch to write some LOGICAL, INTENT(IN) :: OOCEAN ! switch for Ocean model version LOGICAL, INTENT(IN) :: OHARAT LOGICAL, INTENT(IN) :: OCOMPUTE_SRC ! flag to define dimensions of SIGS and -LOGICAL, INTENT(IN) :: O2D ! Logical for 2D model version (modd_conf) +LOGICAL, INTENT(IN) :: O2D ! Logical for 2D model version (modd_conf) LOGICAL, INTENT(IN) :: OFLAT ! Logical for zero ororography CHARACTER(LEN=4), INTENT(IN) :: HTURBDIM ! Kind of turbulence param. TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file @@ -230,7 +230,7 @@ INTEGER :: IIJB,IIJE,IKT,IKA,IKL INTEGER :: JLOOP REAL :: ZMINVAL -TYPE(TFIELDDATA) :: TZFIELD +TYPE(TFIELDMETADATA) :: TZFIELD ! --------------------------------------------------------------------------- ! !* 1. DEFAULT VALUES, 1D REDELSPERGER NUMBERS @@ -656,68 +656,73 @@ END DO IF ( OTURB_DIAG .AND. TPFILE%LOPENED ) THEN ! ! stores the RED_TH1 - TZFIELD%CMNHNAME = 'RED_TH1' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'RED_TH1' - TZFIELD%CUNITS = '1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_RED_TH1' - TZFIELD%NGRID = 4 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'RED_TH1', & + CSTDNAME = '', & + CLONGNAME = 'RED_TH1', & + CUNITS = '1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_RED_TH1', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE_PHY(D,TPFILE,TZFIELD,PREDTH1) ! ! stores the RED_R1 - TZFIELD%CMNHNAME = 'RED_R1' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'RED_R1' - TZFIELD%CUNITS = '1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_RED_R1' - TZFIELD%NGRID = 4 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'RED_R1', & + CSTDNAME = '', & + CLONGNAME = 'RED_R1', & + CUNITS = '1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_RED_R1', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE_PHY(D,TPFILE,TZFIELD,PREDR1) ! ! stores the RED2_TH3 - TZFIELD%CMNHNAME = 'RED2_TH3' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'RED2_TH3' - TZFIELD%CUNITS = '1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_RED2_TH3' - TZFIELD%NGRID = 4 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'RED2_TH3', & + CSTDNAME = '', & + CLONGNAME = 'RED2_TH3', & + CUNITS = '1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_RED2_TH3', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE_PHY(D,TPFILE,TZFIELD,PRED2TH3) ! ! stores the RED2_R3 - TZFIELD%CMNHNAME = 'RED2_R3' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'RED2_R3' - TZFIELD%CUNITS = '1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_RED2_R3' - TZFIELD%NGRID = 4 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'RED2_R3', & + CSTDNAME = '', & + CLONGNAME = 'RED2_R3', & + CUNITS = '1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_RED2_R3', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE_PHY(D,TPFILE,TZFIELD,PRED2R3) ! ! stores the RED2_THR3 - TZFIELD%CMNHNAME = 'RED2_THR3' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'RED2_THR3' - TZFIELD%CUNITS = '1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_RED2_THR3' - TZFIELD%NGRID = 4 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'RED2_THR3', & + CSTDNAME = '', & + CLONGNAME = 'RED2_THR3', & + CUNITS = '1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_RED2_THR3', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE_PHY(D,TPFILE,TZFIELD,PRED2THR3) ! END IF diff --git a/src/PHYEX/turb/mode_tke_eps_sources.f90 b/src/PHYEX/turb/mode_tke_eps_sources.f90 index 516d4e6896a51f3b007965a5f8cae6dae742175b..f7f6a5082ae0c68b332cc8b4fed22347fbd2bfd1 100644 --- a/src/PHYEX/turb/mode_tke_eps_sources.f90 +++ b/src/PHYEX/turb/mode_tke_eps_sources.f90 @@ -2,6 +2,7 @@ !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 MODE_TKE_EPS_SOURCES IMPLICIT NONE CONTAINS @@ -116,7 +117,6 @@ CONTAINS !! 2012-02 Y. Seity, add possibility to run with reversed !! 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 @@ -127,29 +127,28 @@ CONTAINS !* 0. DECLARATIONS ! ------------ ! -USE PARKIND1, ONLY : JPRB -USE YOMHOOK , ONLY : LHOOK, DR_HOOK +USE PARKIND1, ONLY: JPRB +USE SHUMAN_PHY, ONLY: MZM_PHY, MZF_PHY, DZF_PHY, DZM_PHY +USE YOMHOOK, ONLY: LHOOK, DR_HOOK ! USE MODD_ARGSLIST_ll, ONLY: LIST_ll -USE MODD_BUDGET, ONLY: TBUDGETCONF_t, NBUDGET_TKE, NBUDGET_TH, TBUDGETDATA -USE MODD_CST, ONLY: CST_t -USE MODD_CTURB, ONLY: CSTURB_t -USE MODD_TURB_n, ONLY: TURB_t -USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t -USE MODD_FIELD, ONLY: TFIELDDATA, TYPEREAL -USE MODD_IO, ONLY: TFILEDATA -USE MODD_LES, ONLY: TLES_t -USE MODD_PARAMETERS, ONLY: JPVEXT_TURB -! -USE MODE_BUDGET, ONLY: BUDGET_STORE_ADD_PHY, BUDGET_STORE_END_PHY, BUDGET_STORE_INIT_PHY +USE MODD_BUDGET, ONLY: TBUDGETCONF_t, NBUDGET_TKE, NBUDGET_TH, TBUDGETDATA +USE MODD_CST, ONLY: CST_t +USE MODD_CTURB, ONLY: CSTURB_t +USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t +USE MODD_FIELD, ONLY: TFIELDMETADATA, TYPEREAL +USE MODD_IO, ONLY: TFILEDATA +USE MODD_LES, ONLY: TLES_t +USE MODD_PARAMETERS, ONLY: JPVEXT_TURB +USE MODD_TURB_n, ONLY: TURB_t +! +USE MODE_BUDGET, ONLY: BUDGET_STORE_ADD_PHY, BUDGET_STORE_END_PHY, BUDGET_STORE_INIT_PHY USE MODE_IO_FIELD_WRITE, ONLY: IO_FIELD_WRITE_PHY USE MODE_ll ! -USE SHUMAN_PHY, ONLY: MZM_PHY, MZF_PHY, DZF_PHY, DZM_PHY -! USE MODI_GET_HALO USE MODI_LES_MEAN_SUBGRID_PHY -USE MODE_TRIDIAG_TKE, ONLY: TRIDIAG_TKE +USE MODE_TRIDIAG_TKE, ONLY: TRIDIAG_TKE ! ! IMPLICIT NONE @@ -164,37 +163,35 @@ TYPE(CSTURB_t), INTENT(IN) :: CSTURB TYPE(TBUDGETCONF_t), INTENT(IN) :: BUCONF TYPE(TURB_t), INTENT(IN) :: TURBN TYPE(TLES_t), INTENT(INOUT):: TLES +CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! CPROGRAM is the program currently running (modd_conf) INTEGER, INTENT(IN) :: KMI ! model index number REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PTKEM ! TKE at t-deltat REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PLM ! mixing length REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PLEPS ! dissipative length +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT):: PDP ! Dyn. prod. of TKE +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PTRH REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PRHODJ ! density * grid volume -REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PDXX,PDYY,PDZZ,PDZX,PDZY - ! metric coefficients +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PDXX,PDYY,PDZZ,PDZX,PDZY ! metric coefficients REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PZZ ! physical height w-pt REAL, INTENT(IN) :: PTSTEP ! Time step REAL, INTENT(IN) :: PEXPL ! Coef. temporal. disc. -CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! CPROGRAM is the program currently running (modd_conf) TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file LOGICAL, INTENT(IN) :: ODIAG_IN_RUN ! switch to activate online diagnostics (mesonh) -LOGICAL, INTENT(IN) :: OOCEAN ! switch for Ocean model version -REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT):: PDP ! Dyn. prod. of TKE -REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PTRH +LOGICAL, INTENT(IN) :: OOCEAN ! switch for Ocean model version +REAL, DIMENSION(D%NIJT), INTENT(IN) :: PSFUM,PSFVM ! momentum sfc flux REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PTP ! Ther. prod. of TKE -REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT):: PRTKES ! RHOD * Jacobian * - ! TKE at t+deltat +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT):: PRTKES ! RHOD * Jacobian * TKE at t+deltat REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT):: PRTHLS ! Source of Theta_l REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PCOEF_DISS ! 1/(Cph*Exner) REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT) :: PTDIFF ! Diffusion TKE term REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT) :: PTDISS ! Dissipation TKE term -REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PRTKEMS ! Advection source +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PRTKEMS ! Advection source TYPE(TBUDGETDATA), DIMENSION(KBUDGETS), INTENT(INOUT) :: TBUDGETS -INTEGER, INTENT(IN) :: KBUDGETS -REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT), OPTIONAL :: PTR ! Transport prod. of TKE -REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT), OPTIONAL :: PDISS ! Dissipation of TKE -REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT), OPTIONAL :: PEDR ! EDR -REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT), OPTIONAL :: PCURRENT_TKE_DISS ! if ODIAG_IN_RUN in mesonh -REAL, DIMENSION(D%NIJT), INTENT(IN) :: PSFUM,PSFVM ! momentum sfc flux +INTEGER, INTENT(IN) :: KBUDGETS +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT), OPTIONAL :: PEDR ! EDR +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT), OPTIONAL :: PTR ! Transport prod. of TKE +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT), OPTIONAL :: PDISS ! Dissipation of TKE +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT), OPTIONAL :: PCURRENT_TKE_DISS ! if ODIAG_IN_RUN in mesonh ! ! ! @@ -220,7 +217,7 @@ INTEGER :: IIJB,IIJE,IKB,IKE,IKT,IKA,IKL ! Index value for the mass ! TYPE(LIST_ll), POINTER :: TZFIELDDISS_ll ! list of fields to exchange INTEGER :: IINFO_ll ! return code of parallel routine -TYPE(TFIELDDATA) :: TZFIELD +TYPE(TFIELDMETADATA) :: TZFIELD REAL(KIND=JPRB) :: ZHOOK_HANDLE INTEGER :: JIJ,JK ! @@ -476,58 +473,62 @@ IF ( TURBN%LTURB_DIAG .AND. TPFILE%LOPENED ) THEN ! ! stores the dynamic production ! - 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. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'DP', & + CSTDNAME = '', & + CLONGNAME = 'DP', & + CUNITS = 'm2 s-3', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_DP', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE_PHY(D,TPFILE,TZFIELD,PDP) ! ! stores the thermal production ! - 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. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'TP', & + CSTDNAME = '', & + CLONGNAME = 'TP', & + CUNITS = 'm2 s-3', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_TP', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE_PHY(D,TPFILE,TZFIELD,PTP) ! ! stores the whole turbulent transport ! - 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. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'TR', & + CSTDNAME = '', & + CLONGNAME = 'TR', & + CUNITS = 'm2 s-3', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_TR', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE_PHY(D,TPFILE,TZFIELD,ZTR) ! ! stores the dissipation of TKE ! - 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. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'DISS', & + CSTDNAME = '', & + CLONGNAME = 'DISS', & + CUNITS = 'm2 s-3', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_DISS', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE_PHY(D,TPFILE,TZFIELD,PDISS) END IF ! diff --git a/src/PHYEX/turb/mode_turb_hor_dyn_corr.f90 b/src/PHYEX/turb/mode_turb_hor_dyn_corr.f90 index 6bfd6f98ef8d968586fcd46d5bea23844f4855f1..32270e64e5176722c2eaf993ef9376614878d4e9 100644 --- a/src/PHYEX/turb/mode_turb_hor_dyn_corr.f90 +++ b/src/PHYEX/turb/mode_turb_hor_dyn_corr.f90 @@ -75,7 +75,7 @@ USE MODD_TURB_n, ONLY: TURB_t USE MODD_ARGSLIST_ll, ONLY: LIST_ll USE MODD_CST USE MODD_CTURB -USE MODD_FIELD, ONLY: TFIELDDATA, TYPEREAL +use modd_field, only: tfieldmetadata, TYPEREAL USE MODD_IO, ONLY: TFILEDATA USE MODD_PARAMETERS USE MODD_LES, ONLY: TLES_t @@ -189,7 +189,7 @@ REAL :: ZTIME1, ZTIME2 REAL, DIMENSION(SIZE(PDZZ,1),SIZE(PDZZ,2),1+JPVEXT:3+JPVEXT) :: ZCOEFF , ZDZZ ! coefficients for the uncentred gradient ! computation near the ground -TYPE(TFIELDDATA) :: TZFIELD +TYPE(TFIELDMETADATA) :: TZFIELD ! -------------------------------------------------------------------------- ! !* 1. PRELIMINARY COMPUTATIONS @@ -304,17 +304,18 @@ ZFLX(:,:,IKB-1) = 2. * ZFLX(:,:,IKB-1) - ZFLX(:,:,IKB) CALL UPDATE_HALO_ll(TZFIELDS_ll, IINFO_ll) IF ( TPFILE%LOPENED .AND. TURBN%LTURB_FLX ) THEN ! stores <U U> - TZFIELD%CMNHNAME = 'U_VAR' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'U_VAR' - TZFIELD%CUNITS = 'm2 s-2' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_U_VAR' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_FIELD_WRITE(TPFILE,TZFIELD,ZFLX) + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'U_VAR', & + CSTDNAME = '', & + CLONGNAME = 'U_VAR', & + CUNITS = 'm2 s-2', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_U_VAR', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) + CALL IO_Field_write(TPFILE,TZFIELD,ZFLX) END IF ! ! Complete the U tendency @@ -399,17 +400,18 @@ CALL UPDATE_HALO_ll(TZFIELDS_ll, IINFO_ll) ! IF ( TPFILE%LOPENED .AND. TURBN%LTURB_FLX ) THEN ! stores <V V> - TZFIELD%CMNHNAME = 'V_VAR' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'V_VAR' - TZFIELD%CUNITS = 'm2 s-2' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_V_VAR' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_FIELD_WRITE(TPFILE,TZFIELD,ZFLX) + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'V_VAR', & + CSTDNAME = '', & + CLONGNAME = 'V_VAR', & + CUNITS = 'm2 s-2', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_V_VAR', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) + CALL IO_Field_write(TPFILE,TZFIELD,ZFLX) END IF ! ! Complete the V tendency @@ -486,17 +488,18 @@ ZFLX(:,:,IKB-1) = 2. * ZFLX(:,:,IKB-1) - ZFLX(:,:,IKB) ! IF ( TPFILE%LOPENED .AND. TURBN%LTURB_FLX ) THEN ! stores <W W> - TZFIELD%CMNHNAME = 'W_VAR' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'W_VAR' - TZFIELD%CUNITS = 'm2 s-2' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_W_VAR' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_FIELD_WRITE(TPFILE,TZFIELD,ZFLX) + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'W_VAR', & + CSTDNAME = '', & + CLONGNAME = 'W_VAR', & + CUNITS = 'm2 s-2', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_W_VAR', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) + CALL IO_Field_write(TPFILE,TZFIELD,ZFLX) END IF ! ! Complete the W tendency diff --git a/src/PHYEX/turb/mode_turb_hor_sv_flux.f90 b/src/PHYEX/turb/mode_turb_hor_sv_flux.f90 index ae50bb870a833b4b7553d7eb95c33ba992679fcd..db1b033eb0a08f2670ba8cc52706c4b97b8bf8f1 100644 --- a/src/PHYEX/turb/mode_turb_hor_sv_flux.f90 +++ b/src/PHYEX/turb/mode_turb_hor_sv_flux.f90 @@ -63,7 +63,7 @@ USE MODD_TURB_n, ONLY: TURB_t ! USE MODD_CST USE MODD_CTURB -USE MODD_FIELD, ONLY: TFIELDDATA, TYPEREAL +use modd_field, only: tfieldmetadata, TYPEREAL USE MODD_IO, ONLY: TFILEDATA USE MODD_PARAMETERS USE MODD_LES, ONLY: TLES_t @@ -139,8 +139,9 @@ REAL, DIMENSION(SIZE(PDZZ,1),SIZE(PDZZ,2),1+JPVEXT:3+JPVEXT) :: ZCOEFF ! coefficients for the uncentred gradient ! computation near the ground ! +CHARACTER(LEN=NMNHNAMELGTMAX) :: YMNHNAME INTEGER :: IKU -TYPE(TFIELDDATA) :: TZFIELD +TYPE(TFIELDMETADATA) :: TZFIELD REAL :: ZTIME1, ZTIME2 ! --------------------------------------------------------------------------- ! @@ -202,17 +203,19 @@ DO JSV=1,ISV ! ! stores <U SVth> IF ( TPFILE%LOPENED .AND. TURBN%LTURB_FLX ) THEN - WRITE(TZFIELD%CMNHNAME,'("USV_FLX_",I3.3)') JSV - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'SVUNIT m s-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME) - TZFIELD%NGRID = 2 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_FIELD_WRITE(TPFILE,TZFIELD,ZFLXX) + WRITE(YMNHNAME,'("USV_FLX_",I3.3)') JSV + TZFIELD = TFIELDMETADATA( & + CMNHNAME = TRIM( YMNHNAME ), & + CSTDNAME = '', & + CLONGNAME = TRIM( YMNHNAME ), & + CUNITS = 'SVUNIT m s-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_' // TRIM( YMNHNAME ), & + NGRID = 2, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) + CALL IO_Field_write(TPFILE,TZFIELD,ZFLXX) END IF ! IF (TLES%LLES_CALL .AND. KSPLT==1) THEN @@ -253,17 +256,19 @@ DO JSV=1,ISV ! ! stores <V SVth> IF ( TPFILE%LOPENED .AND. TURBN%LTURB_FLX ) THEN - WRITE(TZFIELD%CMNHNAME,'("VSV_FLX_",I3.3)') JSV - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'SVUNIT m s-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME) - TZFIELD%NGRID = 3 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_FIELD_WRITE(TPFILE,TZFIELD,ZFLXY) + WRITE(YMNHNAME,'("VSV_FLX_",I3.3)') JSV + TZFIELD = TFIELDMETADATA( & + CMNHNAME = TRIM( YMNHNAME ), & + CSTDNAME = '', & + CLONGNAME = TRIM(TZFIELD%CMNHNAME), & + CUNITS = 'SVUNIT m s-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME), & + NGRID = 3, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) + CALL IO_Field_write(TPFILE,TZFIELD,ZFLXY) END IF ! ELSE diff --git a/src/PHYEX/turb/mode_turb_hor_thermo_corr.f90 b/src/PHYEX/turb/mode_turb_hor_thermo_corr.f90 index 6c00603eac98ae37d90ce1b495ed6df6a695eaf3..268f923931607513832a9af54690e02638893bde 100644 --- a/src/PHYEX/turb/mode_turb_hor_thermo_corr.f90 +++ b/src/PHYEX/turb/mode_turb_hor_thermo_corr.f90 @@ -59,14 +59,14 @@ CONTAINS !* 0. DECLARATIONS ! ------------ ! -USE MODD_CST, ONLY : CST_t +USE MODD_CST, ONLY : CST_t USE MODD_CTURB -USE MODD_FIELD, ONLY: TFIELDDATA, TYPEREAL -USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t -USE MODD_TURB_n, ONLY: TURB_t +USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t +USE MODD_FIELD, ONLY: TFIELDMETADATA, TYPEREAL USE MODD_IO, ONLY: TFILEDATA -USE MODD_PARAMETERS USE MODD_LES, ONLY: TLES_t +USE MODD_PARAMETERS +USE MODD_TURB_n, ONLY: TURB_t ! USE MODE_IO_FIELD_WRITE, ONLY: IO_FIELD_WRITE ! @@ -142,7 +142,7 @@ REAL, DIMENSION(SIZE(PDZZ,1),SIZE(PDZZ,2),1+JPVEXT:3+JPVEXT) :: ZCOEFF ! coefficients for the uncentred gradient ! computation near the ground REAL :: ZTIME1, ZTIME2 -TYPE(TFIELDDATA) :: TZFIELD +TYPE(TFIELDMETADATA) :: TZFIELD ! ! --------------------------------------------------------------------------- ! @@ -211,16 +211,17 @@ IF ( ( KRRL > 0 .AND. TURBN%LSUBG_COND) .OR. ( TURBN%LTURB_FLX .AND. TPFILE%LOPE ! ! stores <THl THl> IF ( TURBN%LTURB_FLX .AND. TPFILE%LOPENED ) THEN - TZFIELD%CMNHNAME = 'THL_HVAR' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'THL_HVAR' - TZFIELD%CUNITS = 'K2' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_THL_HVAR' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'THL_HVAR', & + CSTDNAME = '', & + CLONGNAME = 'THL_HVAR', & + CUNITS = 'K2', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_THL_HVAR', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE(TPFILE,TZFIELD,ZFLX) END IF ! @@ -299,16 +300,17 @@ IF ( ( KRRL > 0 .AND. TURBN%LSUBG_COND) .OR. ( TURBN%LTURB_FLX .AND. TPFILE%LOPE ! ! stores <THl Rnp> IF ( TURBN%LTURB_FLX .AND. TPFILE%LOPENED ) THEN - TZFIELD%CMNHNAME = 'THLR_HCOR' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'THLR_HCOR' - TZFIELD%CUNITS = 'K kg kg-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_THLR_HCOR' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'THLR_HCOR', & + CSTDNAME = '', & + CLONGNAME = 'THLR_HCOR', & + CUNITS = 'K kg kg-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_THLR_HCOR', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE(TPFILE,TZFIELD,ZFLX) END IF ! @@ -367,16 +369,17 @@ IF ( ( KRRL > 0 .AND. TURBN%LSUBG_COND) .OR. ( TURBN%LTURB_FLX .AND. TPFILE%LOPE ! ! stores <Rnp Rnp> IF ( TURBN%LTURB_FLX .AND. TPFILE%LOPENED ) THEN - TZFIELD%CMNHNAME = 'R_HVAR' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'R_HVAR' - TZFIELD%CUNITS = 'kg2 kg-2' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_R_HVAR' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'R_HVAR', & + CSTDNAME = '', & + CLONGNAME = 'R_HVAR', & + CUNITS = 'kg2 kg-2', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_R_HVAR', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE(TPFILE,TZFIELD,ZFLX) END IF ! diff --git a/src/PHYEX/turb/mode_turb_hor_thermo_flux.f90 b/src/PHYEX/turb/mode_turb_hor_thermo_flux.f90 index 93313669a3ffc01ca0ddf57ed8b0a999e541259f..0654ed9918e6e044ccc1c1ee87988a1e6d9e674c 100644 --- a/src/PHYEX/turb/mode_turb_hor_thermo_flux.f90 +++ b/src/PHYEX/turb/mode_turb_hor_thermo_flux.f90 @@ -65,7 +65,7 @@ USE MODD_TURB_n, ONLY: TURB_t ! USE MODD_CST USE MODD_CTURB -USE MODD_FIELD, ONLY: TFIELDDATA, TYPEREAL +USE MODD_FIELD, ONLY: TFIELDMETADATA, TYPEREAL USE MODD_IO, ONLY: TFILEDATA USE MODD_PARAMETERS USE MODD_LES, ONLY: TLES_t @@ -149,7 +149,7 @@ REAL, DIMENSION(SIZE(PDZZ,1),SIZE(PDZZ,2),1+JPVEXT:3+JPVEXT) :: ZCOEFF ! computation near the ground ! REAL :: ZTIME1, ZTIME2 -TYPE(TFIELDDATA) :: TZFIELD +TYPE(TFIELDMETADATA) :: TZFIELD ! --------------------------------------------------------------------------- ! !* 1. PRELIMINARY COMPUTATIONS @@ -246,16 +246,17 @@ END IF ! ! stores the horizontal <U THl> IF ( TPFILE%LOPENED .AND. TURBN%LTURB_FLX ) THEN - TZFIELD%CMNHNAME = 'UTHL_FLX' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'UTHL_FLX' - TZFIELD%CUNITS = 'K m s-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_UTHL_FLX' - TZFIELD%NGRID = 2 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'UTHL_FLX', & + CSTDNAME = '', & + CLONGNAME = 'UTHL_FLX', & + CUNITS = 'K m s-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_UTHL_FLX', & + NGRID = 2, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE(TPFILE,TZFIELD,ZFLX) END IF ! @@ -349,16 +350,17 @@ IF (KRR/=0) THEN ! ! stores the horizontal <U Rnp> IF ( TPFILE%LOPENED .AND. TURBN%LTURB_FLX ) THEN - TZFIELD%CMNHNAME = 'UR_FLX' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'UR_FLX' - TZFIELD%CUNITS = 'kg kg-1 m s-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_UR_FLX' - TZFIELD%NGRID = 2 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'UR_FLX', & + CSTDNAME = '', & + CLONGNAME = 'UR_FLX', & + CUNITS = 'kg kg-1 m s-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_UR_FLX', & + NGRID = 2, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE(TPFILE,TZFIELD,ZFLX) END IF ! @@ -398,16 +400,17 @@ END IF !! ! !! ! stores the horizontal <U VPT> !! IF ( TPFILE%LOPENED .AND. TURBN%LTURB_FLX ) THEN -!! TZFIELD%CMNHNAME = 'UVPT_FLX' -!! TZFIELD%CSTDNAME = '' -!! TZFIELD%CLONGNAME = 'UVPT_FLX' -!! TZFIELD%CUNITS = 'K m s-1' -!! TZFIELD%CDIR = 'XY' -!! TZFIELD%CCOMMENT = 'X_Y_Z_UVPT_FLX' -!! TZFIELD%NGRID = 2 -!! TZFIELD%NTYPE = TYPEREAL -!! TZFIELD%NDIMS = 3 -!! TZFIELD%LTIMEDEP = .TRUE. +!! TZFIELD = TFIELDMETADATA( & +!! CMNHNAME = 'UVPT_FLX', & +!! CSTDNAME = '', & +!! CLONGNAME = 'UVPT_FLX', & +!! CUNITS = 'K m s-1', & +!! CDIR = 'XY', & +!! CCOMMENT = 'X_Y_Z_UVPT_FLX', & +!! NGRID = 2, & +!! NTYPE = TYPEREAL, & +!! NDIMS = 3, & +!! LTIMEDEP = .TRUE. ) !! CALL IO_FIELD_WRITE(TPFILE,TZFIELD,ZVPTU) !! END IF !!! @@ -501,16 +504,17 @@ END IF ! ! stores the horizontal <V THl> IF ( TPFILE%LOPENED .AND. TURBN%LTURB_FLX ) THEN - TZFIELD%CMNHNAME = 'VTHL_FLX' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'VTHL_FLX' - TZFIELD%CUNITS = 'K m s-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_VTHL_FLX' - TZFIELD%NGRID = 3 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'VTHL_FLX', & + CSTDNAME = '', & + CLONGNAME = 'VTHL_FLX', & + CUNITS = 'K m s-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_VTHL_FLX', & + NGRID = 3, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE(TPFILE,TZFIELD,ZFLX) END IF ! @@ -613,16 +617,17 @@ IF (KRR/=0) THEN ! ! stores the horizontal <V Rnp> IF ( TPFILE%LOPENED .AND. TURBN%LTURB_FLX ) THEN - TZFIELD%CMNHNAME = 'VR_FLX' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'VR_FLX' - TZFIELD%CUNITS = 'kg kg-1 m s-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_VR_FLX' - TZFIELD%NGRID = 3 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'VR_FLX', & + CSTDNAME = '', & + CLONGNAME = 'VR_FLX', & + CUNITS = 'kg kg-1 m s-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_VR_FLX', & + NGRID = 3, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE(TPFILE,TZFIELD,ZFLX) END IF ! @@ -666,16 +671,17 @@ END IF !! ! !! ! stores the horizontal <V VPT> !! IF ( TPFILE%LOPENED .AND. TURBN%LTURB_FLX ) THEN -!! TZFIELD%CMNHNAME = 'VVPT_FLX' -!! TZFIELD%CSTDNAME = '' -!! TZFIELD%CLONGNAME = 'VVPT_FLX' -!! TZFIELD%CUNITS = 'K m s-1' -!! TZFIELD%CDIR = 'XY' -!! TZFIELD%CCOMMENT = 'X_Y_Z_VVPT_FLX' -!! TZFIELD%NGRID = 3 -!! TZFIELD%NTYPE = TYPEREAL -!! TZFIELD%NDIMS = 3 -!! TZFIELD%LTIMEDEP = .TRUE. +!! TZFIELD = TFIELDMETADATA( & +!! CMNHNAME = 'VVPT_FLX', & +!! CSTDNAME = '', & +!! CLONGNAME = 'VVPT_FLX', & +!! CUNITS = 'K m s-1', & +!! CDIR = 'XY', & +!! CCOMMENT = 'X_Y_Z_VVPT_FLX', & +!! NGRID = 3, & +!! NTYPE = TYPEREAL, & +!! NDIMS = 3, & +!! LTIMEDEP = .TRUE. ) !! CALL IO_FIELD_WRITE(TPFILE,TZFIELD,ZVPTV) !! END IF !!! diff --git a/src/PHYEX/turb/mode_turb_hor_uv.f90 b/src/PHYEX/turb/mode_turb_hor_uv.f90 index cd9a3f32a3147c77477cbd5c035ad92d62a56d75..717ef59073695384a958d49e2c3a1ff00090ec2b 100644 --- a/src/PHYEX/turb/mode_turb_hor_uv.f90 +++ b/src/PHYEX/turb/mode_turb_hor_uv.f90 @@ -62,7 +62,7 @@ USE MODD_TURB_n, ONLY: TURB_t ! USE MODD_CST USE MODD_CTURB -USE MODD_FIELD, ONLY: TFIELDDATA, TYPEREAL +USE MODD_FIELD, ONLY: TFIELDMETADATA, TYPEREAL USE MODD_IO, ONLY: TFILEDATA USE MODD_PARAMETERS USE MODD_LES, ONLY: TLES_t @@ -146,7 +146,7 @@ REAL, DIMENSION(SIZE(PUM,1),SIZE(PUM,2),SIZE(PUM,3)) :: GY_U_UV_PUM REAL, DIMENSION(SIZE(PVM,1),SIZE(PVM,2),SIZE(PVM,3)) :: GX_V_UV_PVM ! REAL :: ZTIME1, ZTIME2 -TYPE(TFIELDDATA) :: TZFIELD +TYPE(TFIELDMETADATA) :: TZFIELD ! --------------------------------------------------------------------------- ! !* 1. PRELIMINARY COMPUTATIONS @@ -208,16 +208,17 @@ ZFLX(:,:,IKB-1:IKB-1) = 2. * MXM( MYM( ZFLX(:,:,IKB-1:IKB-1) ) ) & ! ! stores <U V> IF ( TPFILE%LOPENED .AND. TURBN%LTURB_FLX ) THEN - TZFIELD%CMNHNAME = 'UV_FLX' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'UV_FLX' - TZFIELD%CUNITS = 'm2 s-2' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_UV_FLX' - TZFIELD%NGRID = 5 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'UV_FLX', & + CSTDNAME = '', & + CLONGNAME = 'UV_FLX', & + CUNITS = 'm2 s-2', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_UV_FLX', & + NGRID = 5, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE(TPFILE,TZFIELD,ZFLX) END IF ! diff --git a/src/PHYEX/turb/mode_turb_hor_uw.f90 b/src/PHYEX/turb/mode_turb_hor_uw.f90 index b13acfaa287d3038bec942634f4c1b85dcde385a..1885d3d9eda92940af4df9714b87cb8cf6db225a 100644 --- a/src/PHYEX/turb/mode_turb_hor_uw.f90 +++ b/src/PHYEX/turb/mode_turb_hor_uw.f90 @@ -66,7 +66,7 @@ USE MODD_TURB_n, ONLY: TURB_t ! USE MODD_CST USE MODD_CTURB -USE MODD_FIELD, ONLY: TFIELDDATA, TYPEREAL +USE MODD_FIELD, ONLY: TFIELDMETADATA, TYPEREAL USE MODD_IO, ONLY: TFILEDATA USE MODD_PARAMETERS USE MODD_LES, ONLY: TLES_t @@ -137,7 +137,7 @@ INTEGER :: JSV ! scalar loop counter REAL, DIMENSION(SIZE(PWM,1),SIZE(PWM,2),SIZE(PWM,3)) :: GX_W_UW_PWM ! REAL :: ZTIME1, ZTIME2 -TYPE(TFIELDDATA) :: TZFIELD +TYPE(TFIELDMETADATA) :: TZFIELD ! --------------------------------------------------------------------------- ! !* 1. PRELIMINARY COMPUTATIONS @@ -170,16 +170,17 @@ ZFLX(:,:,IKB-1)=2.*ZFLX(:,:,IKB)- ZFLX(:,:,IKB+1) ! ! stores <U W> IF ( TPFILE%LOPENED .AND. TURBN%LTURB_FLX ) THEN - TZFIELD%CMNHNAME = 'UW_HFLX' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'UW_HFLX' - TZFIELD%CUNITS = 'm2 s-2' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_UW_HFLX' - TZFIELD%NGRID = 6 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'UW_HFLX', & + CSTDNAME = '', & + CLONGNAME = 'UW_HFLX', & + CUNITS = 'm2 s-2', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_UW_HFLX', & + NGRID = 6, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE(TPFILE,TZFIELD,ZFLX) END IF ! diff --git a/src/PHYEX/turb/mode_turb_hor_vw.f90 b/src/PHYEX/turb/mode_turb_hor_vw.f90 index 196734ea63a19cd4b31ef7e735e9fc2a50c89104..2fe089f60f8dc098787ad3c5dea9dd9b858fa9d2 100644 --- a/src/PHYEX/turb/mode_turb_hor_vw.f90 +++ b/src/PHYEX/turb/mode_turb_hor_vw.f90 @@ -65,7 +65,7 @@ USE MODD_TURB_n, ONLY: TURB_t ! USE MODD_CST USE MODD_CTURB -USE MODD_FIELD, ONLY: TFIELDDATA, TYPEREAL +USE MODD_FIELD, ONLY: TFIELDMETADATA, TYPEREAL USE MODD_IO, ONLY: TFILEDATA USE MODD_PARAMETERS USE MODD_LES, ONLY: TLES_t @@ -136,7 +136,7 @@ INTEGER :: JSV ! scalar loop counter REAL, DIMENSION(SIZE(PWM,1),SIZE(PWM,2),SIZE(PWM,3)) :: GY_W_VW_PWM ! REAL :: ZTIME1, ZTIME2 -TYPE(TFIELDDATA) :: TZFIELD +TYPE(TFIELDMETADATA) :: TZFIELD ! --------------------------------------------------------------------------- ! !* 1. PRELIMINARY COMPUTATIONS @@ -176,16 +176,17 @@ ZFLX(:,:,IKB-1)= 2.*ZFLX(:,:,IKB) - ZFLX(:,:,IKB+1) ! ! stores <V W> IF ( TPFILE%LOPENED .AND. TURBN%LTURB_FLX ) THEN - TZFIELD%CMNHNAME = 'VW_HFLX' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'VW_HFLX' - TZFIELD%CUNITS = 'm2 s-2' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_VW_HFLX' - TZFIELD%NGRID = 7 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'VW_HFLX', & + CSTDNAME = '', & + CLONGNAME = 'VW_HFLX', & + CUNITS = 'm2 s-2', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_VW_HFLX', & + NGRID = 7, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE(TPFILE,TZFIELD,ZFLX) END IF ! diff --git a/src/PHYEX/turb/mode_turb_ver.f90 b/src/PHYEX/turb/mode_turb_ver.f90 index ddc28851ffc77d70ccf07113d61a243b2297a583..9cc0ef405d29fc3304612ef0d308c516265045ef 100644 --- a/src/PHYEX/turb/mode_turb_ver.f90 +++ b/src/PHYEX/turb/mode_turb_ver.f90 @@ -2,6 +2,7 @@ !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 MODE_TURB_VER IMPLICIT NONE CONTAINS @@ -209,29 +210,29 @@ SUBROUTINE TURB_VER(D,CST,CSTURB,TURBN,TLES,KRR,KRRL,KRRI,KGRADIENTS,& !* 0. DECLARATIONS ! ------------ ! -USE PARKIND1, ONLY : JPRB -USE YOMHOOK , ONLY : LHOOK, DR_HOOK +USE PARKIND1, ONLY: JPRB +USE YOMHOOK, ONLY: LHOOK, DR_HOOK ! -USE MODD_CST, ONLY: CST_t -USE MODD_CTURB, ONLY: CSTURB_t -USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t -USE MODD_FIELD, ONLY: TFIELDDATA, TYPEREAL +USE MODD_CST, ONLY: CST_t +USE MODD_CTURB, ONLY: CSTURB_t +USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t +USE MODD_FIELD, ONLY: TFIELDMETADATA, TYPEREAL USE MODD_IO, ONLY: TFILEDATA -USE MODD_PARAMETERS, ONLY: JPVEXT_TURB -USE MODD_LES, ONLY: TLES_t -USE MODD_TURB_n, ONLY: TURB_t -! -USE MODE_EMOIST, ONLY: EMOIST -USE MODE_ETHETA, ONLY: ETHETA -USE MODE_GRADIENT_M_PHY, ONLY : GZ_M_W_PHY -USE MODE_IO_FIELD_WRITE, ONLY: IO_FIELD_WRITE_PHY -USE MODE_PRANDTL, ONLY: PSI_SV, PSI3, PHI3, PRANDTL -USE MODE_SBL_DEPTH, ONLY: SBL_DEPTH +USE MODD_PARAMETERS, ONLY: JPVEXT_TURB +USE MODD_LES, ONLY: TLES_t +USE MODD_TURB_n, ONLY: TURB_t +! +USE MODE_EMOIST, ONLY: EMOIST +USE MODE_ETHETA, ONLY: ETHETA +USE MODE_GRADIENT_M_PHY, ONLY: GZ_M_W_PHY +USE MODE_IO_FIELD_WRITE, ONLY: IO_FIELD_WRITE_PHY +USE MODE_PRANDTL, ONLY: PSI_SV, PSI3, PHI3, PRANDTL +USE MODE_SBL_DEPTH, ONLY: SBL_DEPTH +USE MODE_TURB_VER_DYN_FLUX, ONLY: TURB_VER_DYN_FLUX +USE MODE_TURB_VER_SV_FLUX, ONLY: TURB_VER_SV_FLUX +USE MODE_TURB_VER_SV_CORR, ONLY: TURB_VER_SV_CORR USE MODE_TURB_VER_THERMO_FLUX, ONLY: TURB_VER_THERMO_FLUX USE MODE_TURB_VER_THERMO_CORR, ONLY: TURB_VER_THERMO_CORR -USE MODE_TURB_VER_DYN_FLUX, ONLY: TURB_VER_DYN_FLUX -USE MODE_TURB_VER_SV_FLUX, ONLY: TURB_VER_SV_FLUX -USE MODE_TURB_VER_SV_CORR, ONLY: TURB_VER_SV_CORR ! USE MODI_LES_MEAN_SUBGRID_PHY USE MODI_SECOND_MNH @@ -386,8 +387,8 @@ INTEGER :: IKB,IKE,IIJE,IIJB,IKT ! index value for the Beginning INTEGER :: JSV,JIJ,JK ! loop counter REAL :: ZTIME1 REAL :: ZTIME2 -REAL(KIND=JPRB) :: ZHOOK_HANDLE -TYPE(TFIELDDATA) :: TZFIELD +REAL(KIND=JPRB) :: ZHOOK_HANDLE +TYPE(TFIELDMETADATA) :: TZFIELD !---------------------------------------------------------------------------- !---------------------------------------------------------------------------- ! @@ -613,42 +614,46 @@ IF ( TURBN%LTURB_FLX .AND. TPFILE%LOPENED .AND. .NOT. TURBN%LHARAT) THEN ! ! stores the Turbulent Prandtl number ! - TZFIELD%CMNHNAME = 'PHI3' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'PHI3' - TZFIELD%CUNITS = '1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'Turbulent Prandtl number' - TZFIELD%NGRID = 4 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'PHI3', & + CSTDNAME = '', & + CLONGNAME = 'PHI3', & + CUNITS = '1', & + CDIR = 'XY', & + CCOMMENT = 'Turbulent Prandtl number', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE_PHY(D,TPFILE,TZFIELD,ZPHI3) ! ! stores the Turbulent Schmidt number ! - TZFIELD%CMNHNAME = 'PSI3' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'PSI3' - TZFIELD%CUNITS = '1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'Turbulent Schmidt number' - TZFIELD%NGRID = 4 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'PSI3', & + CSTDNAME = '', & + CLONGNAME = 'PSI3', & + CUNITS = '1', & + CDIR = 'XY', & + CCOMMENT = 'Turbulent Schmidt number', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE_PHY(D,TPFILE,TZFIELD,ZPSI3) ! ! ! stores the Turbulent Schmidt number for the scalar variables ! - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = '1' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 4 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'generic for SV in turb_ver', & !Temporary name to ease identification + CSTDNAME = '', & + CUNITS = '1', & + CDIR = 'XY', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) DO JSV=1,KSV WRITE(TZFIELD%CMNHNAME, '("PSI_SV_",I3.3)') JSV TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) diff --git a/src/PHYEX/turb/mode_turb_ver_dyn_flux.f90 b/src/PHYEX/turb/mode_turb_ver_dyn_flux.f90 index f68fc2d2377fd6263dac088a2fc9570162bf782f..17f8d55009e8e4a0c251bc3f79d9b715a4ebcf6c 100644 --- a/src/PHYEX/turb/mode_turb_ver_dyn_flux.f90 +++ b/src/PHYEX/turb/mode_turb_ver_dyn_flux.f90 @@ -204,31 +204,29 @@ SUBROUTINE TURB_VER_DYN_FLUX(D,CST,CSTURB,TURBN,TLES,KSV,O2D,OFLAT, & !* 0. DECLARATIONS ! ------------ ! -USE PARKIND1, ONLY : JPRB -USE YOMHOOK , ONLY : LHOOK, DR_HOOK +USE PARKIND1, ONLY: JPRB +USE SHUMAN_PHY +USE YOMHOOK, ONLY: LHOOK, DR_HOOK ! -USE MODD_CST, ONLY: CST_t -USE MODD_CTURB, ONLY: CSTURB_t -USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t -USE MODD_FIELD, ONLY: TFIELDDATA, TYPEREAL +USE MODD_CST, ONLY: CST_t +USE MODD_CTURB, ONLY: CSTURB_t +USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t +USE MODD_FIELD, ONLY: TFIELDMETADATA, TYPEREAL USE MODD_IO, ONLY: TFILEDATA -USE MODD_LES, ONLY: TLES_t -USE MODD_PARAMETERS, ONLY: JPVEXT_TURB,XUNDEF -USE MODD_TURB_n, ONLY: TURB_t +USE MODD_LES, ONLY: TLES_t +USE MODD_PARAMETERS, ONLY: JPVEXT_TURB, XUNDEF +USE MODD_TURB_n, ONLY: TURB_t ! -USE SHUMAN_PHY USE MODE_GRADIENT_U_PHY, ONLY : GZ_U_UW_PHY, GX_U_M_PHY USE MODE_GRADIENT_V_PHY, ONLY : GZ_V_VW_PHY, GY_V_M_PHY USE MODE_GRADIENT_W_PHY, ONLY : GX_W_UW_PHY, GY_W_VW_PHY, GZ_W_M_PHY USE MODE_GRADIENT_M_PHY, ONLY : GX_M_U_PHY, GY_M_V_PHY -! -USE MODI_SECOND_MNH -! -USE MODE_TRIDIAG_WIND, ONLY: TRIDIAG_WIND -USE MODI_LES_MEAN_SUBGRID_PHY -! USE MODE_IO_FIELD_WRITE, only: IO_FIELD_WRITE_PHY USE MODE_ll +USE MODE_TRIDIAG_WIND, ONLY: TRIDIAG_WIND +! +USE MODI_LES_MEAN_SUBGRID_PHY +USE MODI_SECOND_MNH ! IMPLICIT NONE ! @@ -334,7 +332,7 @@ REAL, DIMENSION(D%NIJT) :: ZCOEFFLXU, & ! PVSLOPEM in local 3D arrays ! REAL :: ZTIME1, ZTIME2, ZCMFS -TYPE(TFIELDDATA) :: TZFIELD +TYPE(TFIELDMETADATA) :: TZFIELD !---------------------------------------------------------------------------- ! !* 1. PRELIMINARIES @@ -516,16 +514,17 @@ END IF ! IF ( TURBN%LTURB_FLX .AND. TPFILE%LOPENED ) THEN ! stores the U wind component vertical flux - TZFIELD%CMNHNAME = 'UW_VFLX' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'UW_VFLX' - TZFIELD%CUNITS = 'm2 s-2' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'U wind component vertical flux' - TZFIELD%NGRID = 4 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'UW_VFLX', & + CSTDNAME = '', & + CLONGNAME = 'UW_VFLX', & + CUNITS = 'm2 s-2', & + CDIR = 'XY', & + CCOMMENT = 'U wind component vertical flux', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE_PHY(D,TPFILE,TZFIELD,ZFLXZ) END IF ! @@ -882,16 +881,17 @@ END IF ! IF ( TURBN%LTURB_FLX .AND. TPFILE%LOPENED ) THEN ! stores the V wind component vertical flux - TZFIELD%CMNHNAME = 'VW_VFLX' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'VW_VFLX' - TZFIELD%CUNITS = 'm2 s-2' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'V wind component vertical flux' - TZFIELD%NGRID = 4 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'VW_VFLX', & + CSTDNAME = '', & + CLONGNAME = 'VW_VFLX', & + CUNITS = 'm2 s-2', & + CDIR = 'XY', & + CCOMMENT = 'V wind component vertical flux', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE_PHY(D,TPFILE,TZFIELD,ZFLXZ) END IF ! @@ -1119,16 +1119,17 @@ IF ( TURBN%LTURB_FLX .AND. TPFILE%LOPENED .AND. TURBN%CTURBDIM == '1DIM') THEN ! to be tested & ! +XCMFB*(4./3.)*PLM(:,:,:)/SQRT(PTKEM(:,:,:))*PTP(:,:,:) ! stores the W variance - TZFIELD%CMNHNAME = 'W_VVAR' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'W_VVAR' - TZFIELD%CUNITS = 'm2 s-2' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_W_VVAR' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'W_VVAR', & + CSTDNAME = '', & + CLONGNAME = 'W_VVAR', & + CUNITS = 'm2 s-2', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_W_VVAR', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE_PHY(D,TPFILE,TZFIELD,ZFLXZ) END IF ! diff --git a/src/PHYEX/turb/mode_turb_ver_sv_flux.f90 b/src/PHYEX/turb/mode_turb_ver_sv_flux.f90 index 99e56fa5845abff67b6ed71aecbd6f12492654b6..dc1ad272ad4b53b52f7f50c015527e05db19662c 100644 --- a/src/PHYEX/turb/mode_turb_ver_sv_flux.f90 +++ b/src/PHYEX/turb/mode_turb_ver_sv_flux.f90 @@ -1,7 +1,8 @@ -!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1994-2022 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 MODE_TURB_VER_SV_FLUX IMPLICIT NONE CONTAINS @@ -201,35 +202,36 @@ SUBROUTINE TURB_VER_SV_FLUX(D,CST,CSTURB,TURBN,TLES,ONOMIXLG, & !! to avoid unknwon values outside physical domain !! and avoid negative values in sv tendencies !! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O -!! Modifications: June 2019 (Wim de Rooy) with energycascade, 50MF nog -!! longer necessary +! Wim de Rooy 06/2019: with energycascade, 50MF nog longer necessary +! P. Wautelet 30/11/2022: compute PWSV only when needed !!-------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ ! -USE PARKIND1, ONLY : JPRB -USE YOMHOOK , ONLY : LHOOK, DR_HOOK -! -USE MODD_CST, ONLY: CST_t -USE MODD_CTURB, ONLY: CSTURB_t -USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t -USE MODD_TURB_n, ONLY: TURB_t -USE MODD_FIELD, ONLY: TFIELDDATA, TYPEREAL -USE MODD_IO, ONLY: TFILEDATA -USE MODD_PARAMETERS, ONLY: JPVEXT_TURB -USE MODD_LES, ONLY: TLES_t -USE MODE_IO_FIELD_WRITE, ONLY: IO_FIELD_WRITE_PHY -! - -USE SHUMAN_PHY , ONLY : DZM_PHY, MZM_PHY, MZF_PHY +USE PARKIND1, ONLY: JPRB +USE SHUMAN_PHY, ONLY: DZM_PHY, MZM_PHY, MZF_PHY +USE YOMHOOK, ONLY: LHOOK, DR_HOOK +! +USE MODD_AIRCRAFT_BALLOON, ONLY: LFLYER +USE MODD_CST, ONLY: CST_t +USE MODD_CTURB, ONLY: CSTURB_t +USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t +USE MODD_FIELD, ONLY: TFIELDMETADATA, TYPEREAL +USE MODD_IO, ONLY: TFILEDATA +USE MODD_LES, ONLY: TLES_t +USE MODD_NSV, ONLY: XSVMIN, NSV_LGBEG, NSV_LGEND +USE MODD_PARAMETERS, ONLY: JPVEXT_TURB, NMNHNAMELGTMAX +USE MODD_TURB_n, ONLY: TURB_t +! +USE MODE_EMOIST, ONLY: EMOIST +USE MODE_ETHETA, ONLY: ETHETA USE MODE_GRADIENT_W_PHY, ONLY: GZ_W_M_PHY USE MODE_GRADIENT_M_PHY, ONLY: GZ_M_W_PHY -USE MODE_TRIDIAG, ONLY: TRIDIAG -USE MODE_EMOIST, ONLY: EMOIST -USE MODE_ETHETA, ONLY: ETHETA -USE MODI_LES_MEAN_SUBGRID_PHY +USE MODE_IO_FIELD_WRITE, ONLY: IO_FIELD_WRITE_PHY +USE MODE_TRIDIAG, ONLY: TRIDIAG ! +USE MODI_LES_MEAN_SUBGRID_PHY USE MODI_SECOND_MNH ! IMPLICIT NONE @@ -302,13 +304,14 @@ REAL :: ZTIME1, ZTIME2 REAL :: ZCSVP = 4.0 ! constant for scalar flux presso-correlation (RS81) REAL :: ZCSV !constant for the scalar flux ! -TYPE(TFIELDDATA) :: TZFIELD +CHARACTER(LEN=NMNHNAMELGTMAX) :: YMNHNAME +REAL(KIND=JPRB) :: ZHOOK_HANDLE +TYPE(TFIELDMETADATA) :: TZFIELD !---------------------------------------------------------------------------- ! !* 1. PRELIMINARIES ! ------------- ! -REAL(KIND=JPRB) :: ZHOOK_HANDLE IF (LHOOK) CALL DR_HOOK('TURB_VER_SV_FLUX',0,ZHOOK_HANDLE) ! IKT=D%NKT @@ -429,30 +432,35 @@ DO JSV=1,KSV !$mnh_expand_array(JIJ=IIJB:IIJE) ZFLXZ(IIJB:IIJE,IKA) = ZFLXZ(IIJB:IIJE,IKB) !$mnh_end_expand_array(JIJ=IIJB:IIJE) - DO JK=IKTB+1,IKTE-1 + + IF ( LFLYER ) THEN + DO JK=IKTB+1,IKTE-1 + !$mnh_expand_array(JIJ=IIJB:IIJE) + PWSV(IIJB:IIJE,JK,JSV)=0.5*(ZFLXZ(IIJB:IIJE,JK)+ZFLXZ(IIJB:IIJE,JK+IKL)) + !$mnh_end_expand_array(JIJ=IIJB:IIJE) + END DO !$mnh_expand_array(JIJ=IIJB:IIJE) - PWSV(IIJB:IIJE,JK,JSV)=0.5*(ZFLXZ(IIJB:IIJE,JK)+ZFLXZ(IIJB:IIJE,JK+IKL)) + PWSV(IIJB:IIJE,IKB,JSV)=0.5*(ZFLXZ(IIJB:IIJE,IKB)+ZFLXZ(IIJB:IIJE,IKB+IKL)) + PWSV(IIJB:IIJE,IKE,JSV)=PWSV(IIJB:IIJE,IKE-IKL,JSV) !$mnh_end_expand_array(JIJ=IIJB:IIJE) - END DO - !$mnh_expand_array(JIJ=IIJB:IIJE) - PWSV(IIJB:IIJE,IKB,JSV)=0.5*(ZFLXZ(IIJB:IIJE,IKB)+ZFLXZ(IIJB:IIJE,IKB+IKL)) - PWSV(IIJB:IIJE,IKE,JSV)=PWSV(IIJB:IIJE,IKE-IKL,JSV) - !$mnh_end_expand_array(JIJ=IIJB:IIJE) + END IF END IF ! IF (TURBN%LTURB_FLX .AND. TPFILE%LOPENED) THEN ! stores the JSVth vertical flux - WRITE(TZFIELD%CMNHNAME,'("WSV_FLX_",I3.3)') JSV - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) + WRITE(YMNHNAME,'("WSV_FLX_",I3.3)') JSV + TZFIELD = TFIELDMETADATA( & + CMNHNAME = TRIM( YMNHNAME ), & + CSTDNAME = '', & + CLONGNAME = TRIM( YMNHNAME ), & !PW: TODO: use the correct units of the JSV variable (and multiply it by m s-1) - TZFIELD%CUNITS = 'SVUNIT m s-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME) - TZFIELD%NGRID = 4 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + CUNITS = 'SVUNIT m s-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_' // TRIM( YMNHNAME ), & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ! CALL IO_FIELD_WRITE_PHY(D,TPFILE,TZFIELD,ZFLXZ) END IF diff --git a/src/PHYEX/turb/mode_turb_ver_thermo_corr.f90 b/src/PHYEX/turb/mode_turb_ver_thermo_corr.f90 index 6d71d9196a2fb302dd634267dfcd024065342357..56c4e01d7c54ac8f2e02d8f7a272f356846a767a 100644 --- a/src/PHYEX/turb/mode_turb_ver_thermo_corr.f90 +++ b/src/PHYEX/turb/mode_turb_ver_thermo_corr.f90 @@ -2,6 +2,7 @@ !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 MODE_TURB_VER_THERMO_CORR IMPLICIT NONE CONTAINS @@ -203,23 +204,23 @@ SUBROUTINE TURB_VER_THERMO_CORR(D,CST,CSTURB,TURBN,TLES, & !* 0. DECLARATIONS ! ------------ ! -USE PARKIND1, ONLY : JPRB -USE YOMHOOK , ONLY : LHOOK, DR_HOOK -USE MODD_CST, ONLY: CST_t -USE MODD_CTURB, ONLY: CSTURB_t -USE MODD_TURB_n, ONLY: TURB_t -USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t -USE MODD_FIELD, ONLY: TFIELDDATA, TYPEREAL -USE MODD_IO, ONLY: TFILEDATA -USE MODD_PARAMETERS, ONLY: JPVEXT_TURB -USE MODD_LES, ONLY: TLES_t +USE PARKIND1, ONLY: JPRB +USE SHUMAN_PHY, ONLY: MZM_PHY, MZF_PHY, DZM_PHY +USE YOMHOOK, ONLY: LHOOK, DR_HOOK ! -USE MODI_LES_MEAN_SUBGRID_PHY +USE MODD_CST, ONLY: CST_t +USE MODD_CTURB, ONLY: CSTURB_t +USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t +USE MODD_FIELD, ONLY: TFIELDMETADATA, TYPEREAL +USE MODD_IO, ONLY: TFILEDATA +USE MODD_LES, ONLY: TLES_t +USE MODD_PARAMETERS, ONLY: JPVEXT_TURB +USE MODD_TURB_n, ONLY: TURB_t ! USE MODE_IO_FIELD_WRITE, ONLY: IO_FIELD_WRITE_PHY USE MODE_PRANDTL -USE SHUMAN_PHY, ONLY: MZM_PHY, MZF_PHY, DZM_PHY ! +USE MODI_LES_MEAN_SUBGRID_PHY USE MODI_SECOND_MNH ! IMPLICIT NONE @@ -248,7 +249,6 @@ REAL, DIMENSION(D%NIJT), INTENT(IN) :: PDIRCOSZW ! Director Cosinus of t ! normal to the ground surface ! REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PRHODJ ! dry density * grid volum -REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: MFMOIST ! moist mass flux dual scheme REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PTHVREF ! ref. state Virtual ! Potential Temperature @@ -299,6 +299,7 @@ REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PFTHR ! d(w'th'r')/dz (at REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PTHLP ! guess of thl at t+ deltat REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PRP ! guess of r at t+ deltat ! +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: MFMOIST ! moist mass flux dual scheme REAL, DIMENSION(MERGE(D%NIJT,0,OCOMPUTE_SRC),& MERGE(D%NKT,0,OCOMPUTE_SRC)), INTENT(OUT) :: PSIGS ! Vert. part of Sigma_s at t ! @@ -346,7 +347,7 @@ LOGICAL :: GFWTH ! flag to use w'2th' LOGICAL :: GFR2 ! flag to use w'r'2 LOGICAL :: GFWR ! flag to use w'2r' LOGICAL :: GFTHR ! flag to use w'th'r' -TYPE(TFIELDDATA) :: TZFIELD +TYPE(TFIELDMETADATA) :: TZFIELD !---------------------------------------------------------------------------- ! !* 1. PRELIMINARIES @@ -614,16 +615,17 @@ END IF ! ! stores <THl THl> IF ( TURBN%LTURB_FLX .AND. TPFILE%LOPENED ) THEN - TZFIELD%CMNHNAME = 'THL_VVAR' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'THL_VVAR' - TZFIELD%CUNITS = 'K2' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_THL_VVAR' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'THL_VVAR', & + CSTDNAME = '', & + CLONGNAME = 'THL_VVAR', & + CUNITS = 'K2', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_THL_VVAR', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE_PHY(D,TPFILE,TZFIELD,ZFLXZ) END IF ! @@ -927,16 +929,17 @@ END IF END IF ! stores <THl Rnp> IF ( TURBN%LTURB_FLX .AND. TPFILE%LOPENED ) THEN - TZFIELD%CMNHNAME = 'THLRCONS_VCOR' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'THLRCONS_VCOR' - TZFIELD%CUNITS = 'K kg kg-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_THLRCONS_VCOR' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'THLRCONS_VCOR', & + CSTDNAME = '', & + CLONGNAME = 'THLRCONS_VCOR', & + CUNITS = 'K kg kg-1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_THLRCONS_VCOR', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE_PHY(D,TPFILE,TZFIELD,ZFLXZ) END IF ! @@ -1192,16 +1195,17 @@ ENDIF END IF ! stores <Rnp Rnp> IF ( TURBN%LTURB_FLX .AND. TPFILE%LOPENED ) THEN - TZFIELD%CMNHNAME = 'RTOT_VVAR' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'RTOT_VVAR' - TZFIELD%CUNITS = 'kg2 kg-2' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_RTOT_VVAR' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'RTOT_VVAR', & + CSTDNAME = '', & + CLONGNAME = 'RTOT_VVAR', & + CUNITS = 'kg2 kg-2', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_RTOT_VVAR', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE_PHY(D,TPFILE,TZFIELD,ZFLXZ) END IF ! diff --git a/src/PHYEX/turb/mode_turb_ver_thermo_flux.f90 b/src/PHYEX/turb/mode_turb_ver_thermo_flux.f90 index 97366b22aef729e9d8007ddaf0108e881367d009..6e1935f3e560aeead72b1474e76b743e8e9d1694 100644 --- a/src/PHYEX/turb/mode_turb_ver_thermo_flux.f90 +++ b/src/PHYEX/turb/mode_turb_ver_thermo_flux.f90 @@ -1,7 +1,8 @@ -!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1994-2022 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 MODE_TURB_VER_THERMO_FLUX IMPLICIT NONE CONTAINS @@ -222,34 +223,33 @@ SUBROUTINE TURB_VER_THERMO_FLUX(D,CST,CSTURB,TURBN,TLES, & !! June 2020 (B. Vie) Patch preventing negative rc and ri in 2.3 and 3.3 !! JL Redelsperger : 03/2021: Ocean and Autocoupling O-A LES Cases !! Sfc flux shape for LDEEPOC Case +! P. Wautelet 30/11/2022: compute PWTH and PWRC only when needed !!-------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ ! -USE PARKIND1, ONLY : JPRB -USE YOMHOOK , ONLY : LHOOK, DR_HOOK +USE PARKIND1, ONLY: JPRB +USE SHUMAN_PHY, ONLY: DZF_PHY, DZM_PHY, MXF_PHY, MYF_PHY, MZF_PHY, MZM_PHY +USE YOMHOOK, ONLY: LHOOK, DR_HOOK ! -USE MODD_CST, ONLY: CST_t -USE MODD_CTURB, ONLY: CSTURB_t -USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t -USE MODD_FIELD, ONLY: TFIELDDATA, TYPEREAL -USE MODD_IO, ONLY: TFILEDATA -USE MODD_PARAMETERS, ONLY: JPVEXT_TURB, JPHEXT -USE MODD_TURB_n, ONLY: TURB_t -USE MODD_LES, ONLY: TLES_t -USE MODD_TURB_n, ONLY: TURB_t -! -USE MODI_LES_MEAN_SUBGRID_PHY -USE MODE_TRIDIAG_THERMO, ONLY: TRIDIAG_THERMO -USE MODE_TM06_H, ONLY: TM06_H +USE MODD_AIRCRAFT_BALLOON, ONLY: LFLYER +USE MODD_CST, ONLY: CST_t +USE MODD_CTURB, ONLY: CSTURB_t +USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t +USE MODD_FIELD, ONLY: TFIELDMETADATA, TYPEREAL +USE MODD_IO, ONLY: TFILEDATA +USE MODD_LES, ONLY: TLES_t +USE MODD_PARAMETERS, ONLY: JPVEXT_TURB, JPHEXT, XUNDEF +USE MODD_TURB_n, ONLY: TURB_t ! +USE MODE_GRADIENT_W_PHY, ONLY: GZ_W_M_PHY USE MODE_IO_FIELD_WRITE, ONLY: IO_FIELD_WRITE_PHY USE MODE_PRANDTL -USE SHUMAN_PHY, ONLY: MZM_PHY, MZF_PHY, DZM_PHY, DZF_PHY, & - MXF_PHY,MYF_PHY -USE MODE_GRADIENT_W_PHY, ONLY: GZ_W_M_PHY +USE MODE_TM06_H, ONLY: TM06_H +USE MODE_TRIDIAG_THERMO, ONLY: TRIDIAG_THERMO ! +USE MODI_LES_MEAN_SUBGRID_PHY USE MODI_SECOND_MNH ! IMPLICIT NONE @@ -263,44 +263,35 @@ TYPE(CST_t), INTENT(IN) :: CST TYPE(CSTURB_t), INTENT(IN) :: CSTURB TYPE(TURB_t), INTENT(IN) :: TURBN TYPE(TLES_t), INTENT(INOUT):: TLES ! modd_les structure -INTEGER, INTENT(IN) :: KGRADIENTS ! Number of stored horizontal gradients INTEGER, INTENT(IN) :: KRR ! number of moist var. -INTEGER, INTENT(IN) :: KSV ! number of scalar var. INTEGER, INTENT(IN) :: KRRL ! number of liquid water var. INTEGER, INTENT(IN) :: KRRI ! number of ice water var. +INTEGER, INTENT(IN) :: KSV ! number of scalar var. +INTEGER, INTENT(IN) :: KGRADIENTS ! Number of stored horizontal gradients LOGICAL, INTENT(IN) :: OOCEAN ! switch for Ocean model version LOGICAL, INTENT(IN) :: ODEEPOC ! activates sfc forcing for ideal ocean deep conv +LOGICAL, INTENT(IN) :: OCOUPLES ! switch to activate atmos-ocean LES version LOGICAL, INTENT(IN) :: OCOMPUTE_SRC ! flag to define dimensions of SIGS and -CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! CPROGRAM is the program currently running (modd_conf) REAL, INTENT(IN) :: PEXPL ! Coef. for temporal disc. REAL, INTENT(IN) :: PTSTEP ! Double Time Step +CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! CPROGRAM is the program currently running (modd_conf) TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file -LOGICAL, INTENT(IN) :: OCOUPLES ! switch to activate atmos-ocean LES version ! -REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PDZZ, PDXX, PDYY, PDZX, PDZY - ! Metric coefficients -REAL, DIMENSION(D%NIJT), INTENT(IN) :: PDIRCOSZW ! Director Cosinus of the - ! normal to the ground surface +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PDZZ, PDXX, PDYY, PDZX, PDZY ! Metric coefficients +REAL, DIMENSION(D%NIJT), INTENT(IN) :: PDIRCOSZW ! Director Cosinus of the normal to the ground surface REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PZZ ! altitudes ! REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PRHODJ ! dry density * grid volum -REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: MFMOIST ! moist mass flux dual scheme -REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PTHVREF ! ref. state Virtual - ! Potential Temperature +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PTHVREF ! ref. state Virtual Potential Temperature ! -REAL, DIMENSION(D%NIJT), INTENT(IN) :: PSFTHM,PSFRM ! surface fluxes at time -! ! t - deltat -! -REAL, DIMENSION(D%NIJT), INTENT(IN) :: PSFTHP,PSFRP ! surface fluxes at time -! ! t + deltat +REAL, DIMENSION(D%NIJT,D%NKT,KGRADIENTS),INTENT(IN) :: PHGRAD ! horizontal gradients REAL, DIMENSION(D%NIJT), INTENT(IN) :: PZS ! orography (for LEONARD terms) +REAL, DIMENSION(D%NIJT), INTENT(IN) :: PSFTHM,PSFRM ! surface fluxes at time t - deltat +REAL, DIMENSION(D%NIJT), INTENT(IN) :: PSFTHP,PSFRP ! surface fluxes at time t + deltat ! -REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PWM -! Vertical wind -REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PTHLM -! potential temperature at t-Delta t -REAL, DIMENSION(D%NIJT,D%NKT,KRR), INTENT(IN) :: PRM ! Mixing ratios - ! at t-Delta t +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PWM ! Vertical wind +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PTHLM ! potential temperature at t-Delta t +REAL, DIMENSION(D%NIJT,D%NKT,KRR), INTENT(IN) :: PRM ! Mixing ratios at t-Delta t REAL, DIMENSION(D%NIJT,D%NKT,KSV), INTENT(IN) :: PSVM ! Mixing ratios ! REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PTKEM ! TKE at time t @@ -335,13 +326,13 @@ REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PFWR ! d(w'2r' )/dz (at REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PFTH2 ! d(w'th'2 )/dz (at mass point) REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PFR2 ! d(w'r'2 )/dz (at mass point) REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PFTHR ! d(w'th'r')/dz (at mass point) -REAL, DIMENSION(D%NIJT,D%NKT,KGRADIENTS),INTENT(IN) :: PHGRAD ! horizontal gradients +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: MFMOIST ! moist mass flux dual scheme REAL, DIMENSION(MERGE(D%NIT,0,TURBN%CTOM=='TM06'),& MERGE(D%NJT,0,TURBN%CTOM=='TM06')), INTENT(INOUT):: PBL_DEPTH ! BL depth REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT) :: PWTHV ! buoyancy flux ! REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) :: PRTHLS ! cumulated source for theta -REAL, DIMENSION(D%NIJT,D%NKT,KRR), INTENT(INOUT) :: PRRS ! cumulated source for rt +REAL, DIMENSION(D%NIJT,D%NKT,KRR), INTENT(INOUT) :: PRRS ! cumulated source for rt REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT) :: PTHLP ! guess of thl at t+ deltat REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT) :: PRP ! guess of r at t+ deltat ! @@ -396,7 +387,7 @@ LOGICAL :: GFWTH ! flag to use w'2th' LOGICAL :: GFR2 ! flag to use w'r'2 LOGICAL :: GFWR ! flag to use w'2r' LOGICAL :: GFTHR ! flag to use w'th'r' -TYPE(TFIELDDATA) :: TZFIELD +TYPE(TFIELDMETADATA) :: TZFIELD !---------------------------------------------------------------------------- ! !* 1. PRELIMINARIES @@ -672,42 +663,48 @@ ELSE !$mnh_end_expand_array(JIJ=IIJB:IIJE) END IF ! -DO JK=IKTB+1,IKTE-1 - !$mnh_expand_array(JIJ=IIJB:IIJE) - PWTH(IIJB:IIJE,JK)=0.5*(ZFLXZ(IIJB:IIJE,JK)+ZFLXZ(IIJB:IIJE,JK+IKL)) - !$mnh_end_expand_array(JIJ=IIJB:IIJE) -END DO -! -!$mnh_expand_array(JIJ=IIJB:IIJE) -PWTH(IIJB:IIJE,IKB)=0.5*(ZFLXZ(IIJB:IIJE,IKB)+ZFLXZ(IIJB:IIJE,IKB+IKL)) -!$mnh_end_expand_array(JIJ=IIJB:IIJE) -! -IF (OOCEAN) THEN - !$mnh_expand_array(JIJ=IIJB:IIJE) - PWTH(IIJB:IIJE,IKE)=0.5*(ZFLXZ(IIJB:IIJE,IKE)+ZFLXZ(IIJB:IIJE,IKE+IKL)) - PWTH(IIJB:IIJE,IKA)=0. - PWTH(IIJB:IIJE,IKU)=PWTH(IIJB:IIJE,IKE)! not used - !$mnh_end_expand_array(JIJ=IIJB:IIJE) -ELSE +IF ( LFLYER ) THEN + PWTH(:,:IKTB) = XUNDEF + PWTH(:,IKTE:) = XUNDEF + ! + DO JK = IKTB + 1, IKTE - 1 + !$mnh_expand_array(JIJ=IIJB:IIJE) + PWTH(IIJB:IIJE,JK)=0.5*(ZFLXZ(IIJB:IIJE,JK)+ZFLXZ(IIJB:IIJE,JK+IKL)) + !$mnh_end_expand_array(JIJ=IIJB:IIJE) + END DO + ! !$mnh_expand_array(JIJ=IIJB:IIJE) - PWTH(IIJB:IIJE,IKA)=0.5*(ZFLXZ(IIJB:IIJE,IKA)+ZFLXZ(IIJB:IIJE,IKA+IKL)) - PWTH(IIJB:IIJE,IKE)=PWTH(IIJB:IIJE,IKE-IKL) - PWTH(IIJB:IIJE,IKU)=0. + PWTH(IIJB:IIJE,IKB)=0.5*(ZFLXZ(IIJB:IIJE,IKB)+ZFLXZ(IIJB:IIJE,IKB+IKL)) !$mnh_end_expand_array(JIJ=IIJB:IIJE) + ! + IF (OOCEAN) THEN + !$mnh_expand_array(JIJ=IIJB:IIJE) + PWTH(IIJB:IIJE,IKE)=0.5*(ZFLXZ(IIJB:IIJE,IKE)+ZFLXZ(IIJB:IIJE,IKE+IKL)) + PWTH(IIJB:IIJE,IKA)=0. + PWTH(IIJB:IIJE,IKU)=PWTH(IIJB:IIJE,IKE)! not used + !$mnh_end_expand_array(JIJ=IIJB:IIJE) + ELSE + !$mnh_expand_array(JIJ=IIJB:IIJE) + PWTH(IIJB:IIJE,IKA)=0.5*(ZFLXZ(IIJB:IIJE,IKA)+ZFLXZ(IIJB:IIJE,IKA+IKL)) + PWTH(IIJB:IIJE,IKE)=PWTH(IIJB:IIJE,IKE-IKL) + PWTH(IIJB:IIJE,IKU)=0. + !$mnh_end_expand_array(JIJ=IIJB:IIJE) + END IF END IF ! IF ( TURBN%LTURB_FLX .AND. TPFILE%LOPENED ) THEN ! stores the conservative potential temperature vertical flux - TZFIELD%CMNHNAME = 'THW_FLX' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'THW_FLX' - TZFIELD%CUNITS = 'K m s-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'Conservative potential temperature vertical flux' - TZFIELD%NGRID = 4 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'THW_FLX', & + CSTDNAME = '', & + CLONGNAME = 'THW_FLX', & + CUNITS = 'K m s-1', & + CDIR = 'XY', & + CCOMMENT = 'Conservative potential temperature vertical flux', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE_PHY(D,TPFILE,TZFIELD,ZFLXZ) END IF ! @@ -1061,41 +1058,44 @@ IF (KRR /= 0) THEN ZFLXZ(IIJB:IIJE,IKU) = ZFLXZ(IIJB:IIJE,IKE) END IF ! - DO JK=IKTB+1,IKTE-1 + IF ( LFLYER ) THEN + DO JK=IKTB+1,IKTE-1 + !$mnh_expand_array(JIJ=IIJB:IIJE) + PWRC(IIJB:IIJE,JK)=0.5*(ZFLXZ(IIJB:IIJE,JK)+ZFLXZ(IIJB:IIJE,JK+IKL)) + !$mnh_end_expand_array(JIJ=IIJB:IIJE) + END DO !$mnh_expand_array(JIJ=IIJB:IIJE) - PWRC(IIJB:IIJE,JK)=0.5*(ZFLXZ(IIJB:IIJE,JK)+ZFLXZ(IIJB:IIJE,JK+IKL)) + PWRC(IIJB:IIJE,IKB)=0.5*(ZFLXZ(IIJB:IIJE,IKB)+ZFLXZ(IIJB:IIJE,IKB+IKL)) !$mnh_end_expand_array(JIJ=IIJB:IIJE) - END DO - !$mnh_expand_array(JIJ=IIJB:IIJE) - PWRC(IIJB:IIJE,IKB)=0.5*(ZFLXZ(IIJB:IIJE,IKB)+ZFLXZ(IIJB:IIJE,IKB+IKL)) - !$mnh_end_expand_array(JIJ=IIJB:IIJE) - ! - IF (OOCEAN) THEN - !$mnh_expand_array(JIJ=IIJB:IIJE) - PWRC(IIJB:IIJE,IKE)=0.5*(ZFLXZ(IIJB:IIJE,IKE)+ZFLXZ(IIJB:IIJE,IKE+IKL)) - PWRC(IIJB:IIJE,IKA)=0. - PWRC(IIJB:IIJE,IKE+1)=ZFLXZ(IIJB:IIJE,IKE+1) - !$mnh_end_expand_array(JIJ=IIJB:IIJE) - ELSE - !$mnh_expand_array(JIJ=IIJB:IIJE) - PWRC(IIJB:IIJE,IKA)=0.5*(ZFLXZ(IIJB:IIJE,IKA)+ZFLXZ(IIJB:IIJE,IKA+IKL)) - PWRC(IIJB:IIJE,IKE)=PWRC(IIJB:IIJE,IKE-IKL) - PWRC(IIJB:IIJE,IKU)=0. - !$mnh_end_expand_array(JIJ=IIJB:IIJE) - ENDIF + ! + IF (OOCEAN) THEN + !$mnh_expand_array(JIJ=IIJB:IIJE) + PWRC(IIJB:IIJE,IKE)=0.5*(ZFLXZ(IIJB:IIJE,IKE)+ZFLXZ(IIJB:IIJE,IKE+IKL)) + PWRC(IIJB:IIJE,IKA)=0. + PWRC(IIJB:IIJE,IKE+1)=ZFLXZ(IIJB:IIJE,IKE+1) + !$mnh_end_expand_array(JIJ=IIJB:IIJE) + ELSE + !$mnh_expand_array(JIJ=IIJB:IIJE) + PWRC(IIJB:IIJE,IKA)=0.5*(ZFLXZ(IIJB:IIJE,IKA)+ZFLXZ(IIJB:IIJE,IKA+IKL)) + PWRC(IIJB:IIJE,IKE)=PWRC(IIJB:IIJE,IKE-IKL) + PWRC(IIJB:IIJE,IKU)=0. + !$mnh_end_expand_array(JIJ=IIJB:IIJE) + END IF + END IF ! IF ( TURBN%LTURB_FLX .AND. TPFILE%LOPENED ) THEN ! stores the conservative mixing ratio vertical flux - TZFIELD%CMNHNAME = 'RCONSW_FLX' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'RCONSW_FLX' - TZFIELD%CUNITS = 'kg m s-1 kg-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'Conservative mixing ratio vertical flux' - TZFIELD%NGRID = 4 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'RCONSW_FLX', & + CSTDNAME = '', & + CLONGNAME = 'RCONSW_FLX', & + CUNITS = 'kg m s-1 kg-1', & + CDIR = 'XY', & + CCOMMENT = 'Conservative mixing ratio vertical flux', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE_PHY(D,TPFILE,TZFIELD,ZFLXZ) END IF ! @@ -1273,16 +1273,17 @@ IF ( ((TURBN%LTURB_FLX .AND. TPFILE%LOPENED) .OR. TLES%LLES_CALL) .AND. (KRRL > ! ! store the liquid water mixing ratio vertical flux IF ( TURBN%LTURB_FLX .AND. TPFILE%LOPENED ) THEN - TZFIELD%CMNHNAME = 'RCW_FLX' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'RCW_FLX' - TZFIELD%CUNITS = 'kg m s-1 kg-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'Liquid water mixing ratio vertical flux' - TZFIELD%NGRID = 4 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'RCW_FLX', & + CSTDNAME = '', & + CLONGNAME = 'RCW_FLX', & + CUNITS = 'kg m s-1 kg-1', & + CDIR = 'XY', & + CCOMMENT = 'Liquid water mixing ratio vertical flux', & + NGRID = 4, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE_PHY(D,TPFILE,TZFIELD,ZFLXZ) END IF ! diff --git a/src/PHYEX/turb/shallow_mf.f90 b/src/PHYEX/turb/shallow_mf.f90 index ec3a76764d15e02c60fa00531c59a39a99fb6bad..898883076890bc04c938b2339d1c956b653fff5c 100644 --- a/src/PHYEX/turb/shallow_mf.f90 +++ b/src/PHYEX/turb/shallow_mf.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1994-2023 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. @@ -72,6 +72,10 @@ !* 0. DECLARATIONS ! ------------ ! +USE PARKIND1, ONLY: JPRB +USE SHUMAN_PHY, ONLY: MXM_PHY, MYM_PHY +USE YOMHOOK, ONLY: LHOOK, DR_HOOK +! USE MODD_BUDGET, ONLY: TBUDGETCONF_t, TBUDGETDATA, NBUDGET_U, NBUDGET_V, & NBUDGET_TH, NBUDGET_RV, NBUDGET_SV1 USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t @@ -82,18 +86,15 @@ USE MODD_TURB_n, ONLY: TURB_t USE MODD_CTURB, ONLY: CSTURB_t USE MODD_PARAMETERS, ONLY: JPSVMAX ! -USE MODE_BUDGET, ONLY: BUDGET_STORE_ADD_PHY -USE MODE_THL_RT_FROM_TH_R_MF, ONLY: THL_RT_FROM_TH_R_MF -USE MODE_COMPUTE_UPDRAFT, ONLY: COMPUTE_UPDRAFT +USE MODE_BUDGET, ONLY: BUDGET_STORE_ADD_PHY +USE MODE_COMPUTE_MF_CLOUD, ONLY: COMPUTE_MF_CLOUD +USE MODE_COMPUTE_UPDRAFT, ONLY: COMPUTE_UPDRAFT +USE MODE_COMPUTE_UPDRAFT_RAHA, ONLY: COMPUTE_UPDRAFT_RAHA USE MODE_COMPUTE_UPDRAFT_RHCJ10, ONLY: COMPUTE_UPDRAFT_RHCJ10 -USE MODE_COMPUTE_UPDRAFT_RAHA, ONLY: COMPUTE_UPDRAFT_RAHA -USE MODE_MF_TURB, ONLY: MF_TURB -USE MODE_MF_TURB_EXPL, ONLY: MF_TURB_EXPL -USE MODE_COMPUTE_MF_CLOUD, ONLY: COMPUTE_MF_CLOUD -USE MODE_MSG, ONLY: PRINT_MSG, NVERB_FATAL -USE PARKIND1, ONLY : JPRB -USE YOMHOOK , ONLY : LHOOK, DR_HOOK -USE SHUMAN_PHY, ONLY: MXM_PHY, MYM_PHY +USE MODE_MF_TURB, ONLY: MF_TURB +USE MODE_MF_TURB_EXPL, ONLY: MF_TURB_EXPL +USE MODE_MSG, ONLY: PRINT_MSG, NVERB_FATAL +USE MODE_THL_RT_FROM_TH_R_MF, ONLY: THL_RT_FROM_TH_R_MF ! IMPLICIT NONE @@ -120,16 +121,15 @@ REAL, INTENT(IN) :: PTSTEP ! Dynamical timestep REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PZZ ! Height of flux point REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PDZZ ! Metric coefficients REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PRHODJ ! dry density * Grid size -REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PRHODREF ! dry density of the - ! reference state +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PRHODREF ! dry density of the reference state REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PPABSM ! Pressure at time t-1 REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PEXNM ! Exner function at t-dt -REAL, DIMENSION(D%NIJT), INTENT(IN) :: PSFTH,PSFRV ! normal surface fluxes of theta and Rv -REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PTHM ! Theta at t-dt +REAL, DIMENSION(D%NIJT), INTENT(IN) :: PSFTH,PSFRV ! normal surface fluxes of theta and Rv +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PTHM ! Theta at t-dt REAL, DIMENSION(D%NIJT,D%NKT,KRR), INTENT(IN) :: PRM ! water var. at t-dt -REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PUM,PVM ! wind components at t-dt -REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PTKEM ! tke at t-dt +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PUM,PVM ! wind components at t-dt +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PTKEM ! tke at t-dt REAL, DIMENSION(D%NIJT,D%NKT,KSV), INTENT(IN) :: PSVM ! scalar variable a t-dt REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT):: PDUDT_MF ! tendency of U by massflux scheme @@ -157,13 +157,13 @@ REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) :: PFRAC_UP ! updraft fraction REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) :: PEMF ! updraft mass flux REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT) :: PDETR ! updraft detrainment REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT) :: PENTR ! updraft entrainment -INTEGER,DIMENSION(D%NIJT), INTENT(OUT) :: KKLCL,KKETL,KKCTL ! level of LCL,ETL and CTL -REAL, INTENT(IN) :: PDX, PDY -REAL, DIMENSION(D%NIJT,D%NKT,KSV), INTENT(IN),OPTIONAL :: PRSVS ! sources of sv (for Budgets with lagrangian tracer) -TYPE(TBUDGETCONF_t), INTENT(IN),OPTIONAL :: BUCONF ! budget structure -INTEGER, INTENT(IN) :: KBUDGETS ! option. because not used in arpifs -TYPE(TBUDGETDATA), DIMENSION(KBUDGETS), INTENT(INOUT),OPTIONAL :: TBUDGETS -REAL,DIMENSION(JPSVMAX),INTENT(IN),OPTIONAL :: PSVMIN ! minimum value for SV variables (for Budgets) +INTEGER,DIMENSION(D%NIJT), INTENT(OUT) :: KKLCL,KKETL,KKCTL ! level of LCL,ETL and CTL +REAL, INTENT(IN) :: PDX, PDY +REAL, DIMENSION(D%NIJT,D%NKT,KSV), INTENT(IN), OPTIONAL :: PRSVS ! sources of sv (for Budgets with lagrangian tracer) +REAL,DIMENSION(JPSVMAX), INTENT(IN), OPTIONAL :: PSVMIN ! minimum value for SV variables (for Budgets) +TYPE(TBUDGETCONF_t), INTENT(IN), OPTIONAL :: BUCONF ! budget structure +TYPE(TBUDGETDATA), DIMENSION(KBUDGETS), INTENT(INOUT), OPTIONAL :: TBUDGETS +INTEGER, INTENT(IN) :: KBUDGETS ! option. because not used in arpifs ! ! 0.2 Declaration of local variables diff --git a/src/PHYEX/turb/turb.f90 b/src/PHYEX/turb/turb.f90 index e0713fcd3a642d3f4888df1f9548d6769958e08a..dd5029524d292cc0350d5121c4a5c42984aef2d2 100644 --- a/src/PHYEX/turb/turb.f90 +++ b/src/PHYEX/turb/turb.f90 @@ -226,7 +226,7 @@ ! P. Wautelet 05/2016-04/2018: new data structures and calls for I/O ! Q. Rodier 01/2018: introduction of RM17 ! P. Wautelet 20/05/2019: add name argument to ADDnFIELD_ll + new ADD4DFIELD_ll subroutine -!! June 2019 (Wim de Rooy) update statistical cloud scheme +! Wim de Rooy 06/2019: update statistical cloud scheme ! P. Wautelet 02/2020: use the new data structures and subroutines for budgets ! B. Vie 03/2020: LIMA negativity checks after turbulence, advection and microphysics budgets ! P. Wautelet 11/06/2020: bugfix: correct PRSVS array indices @@ -239,45 +239,44 @@ !* 0. DECLARATIONS ! ------------ ! -USE PARKIND1, ONLY : JPRB -USE YOMHOOK , ONLY : LHOOK, DR_HOOK +USE PARKIND1, ONLY: JPRB +USE SHUMAN_PHY, ONLY: MZF_PHY,MXF_PHY,MYF_PHY +USE YOMHOOK , ONLY: LHOOK, DR_HOOK ! -USE MODD_PARAMETERS, ONLY: JPVEXT_TURB, XUNDEF -USE MODD_CST, ONLY: CST_t -USE MODD_CTURB, ONLY: CSTURB_t -USE MODD_BUDGET, ONLY: NBUDGET_U, NBUDGET_V, NBUDGET_W, NBUDGET_TH, NBUDGET_RV, NBUDGET_RC, & +USE MODD_BUDGET, ONLY: NBUDGET_U, NBUDGET_V, NBUDGET_W, NBUDGET_TH, NBUDGET_RV, NBUDGET_RC, & NBUDGET_RR, NBUDGET_RI, NBUDGET_RS, NBUDGET_RG, NBUDGET_RH, NBUDGET_SV1, & TBUDGETDATA, TBUDGETCONF_t -USE MODD_FIELD, ONLY: TFIELDDATA,TYPEREAL -USE MODD_IO, ONLY: TFILEDATA -! -USE MODD_LES, ONLY : TLES_t +USE MODD_CST, ONLY: CST_t +USE MODD_CTURB, ONLY: CSTURB_t USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t -USE MODD_TURB_n, ONLY: TURB_t -! -USE MODE_BL89, ONLY: BL89 -USE MODE_TURB_VER, ONLY : TURB_VER -USE MODE_ROTATE_WIND, ONLY: ROTATE_WIND, UPDATE_ROTATE_WIND -USE MODE_TURB_HOR_SPLT, ONLY: TURB_HOR_SPLT -USE MODE_TKE_EPS_SOURCES, ONLY: TKE_EPS_SOURCES -USE MODE_RMC01, ONLY: RMC01 -USE MODE_TM06, ONLY: TM06 -USE MODE_UPDATE_LM, ONLY: UPDATE_LM -USE MODE_BUDGET, ONLY: BUDGET_STORE_INIT_PHY, BUDGET_STORE_END_PHY -USE MODE_IO_FIELD_WRITE, ONLY: IO_FIELD_WRITE_PHY -USE MODE_SBL_PHY, ONLY: LMO +USE MODD_FIELD, ONLY: TFIELDMETADATA, TYPEREAL +USE MODD_IO, ONLY: TFILEDATA +USE MODD_LES, ONLY: TLES_t +USE MODD_PARAMETERS, ONLY: JPVEXT_TURB, XUNDEF +USE MODD_TURB_n, ONLY: TURB_t +! +USE MODE_BL89, ONLY: BL89 +USE MODE_BUDGET, ONLY: BUDGET_STORE_INIT_PHY, BUDGET_STORE_END_PHY +USE MODE_EMOIST, ONLY: EMOIST +USE MODE_ETHETA, ONLY: ETHETA +USE MODE_GRADIENT_U_PHY, ONLY: GZ_U_UW_PHY +USE MODE_GRADIENT_V_PHY, ONLY: GZ_V_VW_PHY +USE MODE_GRADIENT_W_PHY, ONLY: GZ_W_M_PHY +USE MODE_GRADIENT_M_PHY, ONLY: GZ_M_W_PHY +USE MODE_IBM_MIXINGLENGTH, ONLY: IBM_MIXINGLENGTH +USE MODE_IO_FIELD_WRITE, ONLY: IO_FIELD_WRITE_PHY +USE MODE_RMC01, ONLY: RMC01 +USE MODE_ROTATE_WIND, ONLY: ROTATE_WIND, UPDATE_ROTATE_WIND +USE MODE_SBL_PHY, ONLY: LMO USE MODE_SOURCES_NEG_CORRECT, ONLY: SOURCES_NEG_CORRECT_PHY -USE MODE_EMOIST, ONLY: EMOIST -USE MODE_ETHETA, ONLY: ETHETA -USE MODE_IBM_MIXINGLENGTH, ONLY: IBM_MIXINGLENGTH +USE MODE_TM06, ONLY: TM06 +USE MODE_TKE_EPS_SOURCES, ONLY: TKE_EPS_SOURCES +USE MODE_TURB_HOR_SPLT, ONLY: TURB_HOR_SPLT +USE MODE_TURB_VER, ONLY : TURB_VER +USE MODE_UPDATE_LM, ONLY: UPDATE_LM ! USE MODI_LES_MEAN_SUBGRID_PHY ! -USE SHUMAN_PHY, ONLY : MZF_PHY,MXF_PHY,MYF_PHY -USE MODE_GRADIENT_U_PHY, ONLY : GZ_U_UW_PHY -USE MODE_GRADIENT_V_PHY, ONLY : GZ_V_VW_PHY -USE MODE_GRADIENT_W_PHY, ONLY : GZ_W_M_PHY -USE MODE_GRADIENT_M_PHY, ONLY : GZ_M_W_PHY ! IMPLICIT NONE ! @@ -500,7 +499,7 @@ REAL :: ZALPHA ! work coefficient : ! ! BL89 mixing length near the surface ! REAL :: ZTIME1, ZTIME2 -TYPE(TFIELDDATA) :: TZFIELD +TYPE(TFIELDMETADATA) :: TZFIELD ! !* 1.PRELIMINARIES ! ------------- @@ -641,28 +640,30 @@ IF (KRRL >=1) THEN ! ! IF ( TPFILE%LOPENED .AND. TURBN%LTURB_DIAG ) THEN - TZFIELD%CMNHNAME = 'ATHETA' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'ATHETA' - TZFIELD%CUNITS = 'm' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_ATHETA' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'ATHETA', & + CSTDNAME = '', & + CLONGNAME = 'ATHETA', & + CUNITS = 'm', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_ATHETA', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE_PHY(D,TPFILE,TZFIELD,ZATHETA) ! - TZFIELD%CMNHNAME = 'AMOIST' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'AMOIST' - TZFIELD%CUNITS = 'm' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_AMOIST' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'AMOIST', & + CSTDNAME = '', & + CLONGNAME = 'AMOIST', & + CUNITS = 'm', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_AMOIST', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE_PHY(D,TPFILE,TZFIELD,ZAMOIST) END IF ! @@ -1239,46 +1240,49 @@ IF ( TURBN%LTURB_DIAG .AND. TPFILE%LOPENED ) THEN ! ! stores the mixing length ! - TZFIELD%CMNHNAME = 'LM' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'LM' - TZFIELD%CUNITS = 'm' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'Mixing length' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'LM', & + CSTDNAME = '', & + CLONGNAME = 'LM', & + CUNITS = 'm', & + CDIR = 'XY', & + CCOMMENT = 'Mixing length', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE_PHY(D,TPFILE,TZFIELD,ZLM) ! IF (KRR /= 0) THEN ! ! stores the conservative potential temperature ! - TZFIELD%CMNHNAME = 'THLM' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'THLM' - TZFIELD%CUNITS = 'K' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'Conservative potential temperature' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'THLM', & + CSTDNAME = '', & + CLONGNAME = 'THLM', & + CUNITS = 'K', & + CDIR = 'XY', & + CCOMMENT = 'Conservative potential temperature', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE_PHY(D,TPFILE,TZFIELD,PTHLT) ! ! stores the conservative mixing ratio ! - TZFIELD%CMNHNAME = 'RNPM' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'RNPM' - TZFIELD%CUNITS = 'kg kg-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'Conservative mixing ratio' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'RNPM', & + CSTDNAME = '', & + CLONGNAME = 'RNPM', & + CUNITS = 'kg kg-1', & + CDIR = 'XY', & + CCOMMENT = 'Conservative mixing ratio',& + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE_PHY(D,TPFILE,TZFIELD,PRT(:,:,1)) END IF END IF @@ -1973,16 +1977,17 @@ ENDIF ! ! Impression before modification of the mixing length IF ( TURBN%LTURB_DIAG .AND. TPFILE%LOPENED ) THEN - TZFIELD%CMNHNAME = 'LM_CLEAR_SKY' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'LM_CLEAR_SKY' - TZFIELD%CUNITS = 'm' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_LM CLEAR SKY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'LM_CLEAR_SKY', & + CSTDNAME = '', & + CLONGNAME = 'LM_CLEAR_SKY', & + CUNITS = 'm', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_LM CLEAR SKY', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE_PHY(D,TPFILE,TZFIELD,ZLM) ENDIF ! @@ -2007,27 +2012,30 @@ END WHERE ! ---------- ! IF ( TURBN%LTURB_DIAG .AND. TPFILE%LOPENED ) THEN - TZFIELD%CMNHNAME = 'COEF_AMPL' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'COEF_AMPL' - TZFIELD%CUNITS = '1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_COEF AMPL' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'COEF_AMPL', & + CSTDNAME = '', & + CLONGNAME = 'COEF_AMPL', & + CUNITS = '1', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_COEF AMPL', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE_PHY(D,TPFILE,TZFIELD,ZCOEF_AMPL) ! - TZFIELD%CMNHNAME = 'LM_CLOUD' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'LM_CLOUD' - TZFIELD%CUNITS = 'm' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_LM CLOUD' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 + TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'LM_CLOUD', & + CSTDNAME = '', & + CLONGNAME = 'LM_CLOUD', & + CUNITS = 'm', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_LM CLOUD', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_FIELD_WRITE_PHY(D,TPFILE,TZFIELD,ZLM_CLOUD) ! ENDIF diff --git a/src/SURFEX/build_emisstabn.F90 b/src/SURFEX/build_emisstabn.F90 index 48b4dc5b2e46c4bb736f171a7542a52e3c517c6a..5a8ecc2a0d7992b508c58f8d6a6c34edec795240 100644 --- a/src/SURFEX/build_emisstabn.F90 +++ b/src/SURFEX/build_emisstabn.F90 @@ -1,4 +1,4 @@ -!SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!SFX_LIC Copyright 1994-2022 CNRS, Meteo-France and Universite Paul Sabatier !SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence !SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !SFX_LIC for details. version 1. @@ -110,13 +110,13 @@ ALLOCATE (PCONVERSION(SIZE(PRHODREF,1))) ! determine the conversion factor PCONVERSION(:) = 1. SELECT CASE (YUNIT) -CASE ('MIX') ! flux given ppp*m/s, conversion to molec/m2/s -! where 1 molecule/cm2/s = (224.14/6.022136E23) ppp*m/s +CASE ('MIX') ! flux given ppv*m/s, conversion to molec/m2/s +! where 1 molecule/cm2/s = (224.14/6.022136E23) ppv*m/s PCONVERSION(:) = XAVOGADRO * PRHODREF(:) / XMD CASE ('CON') ! flux given in molecules/cm2/s, conversion to molec/m2/s PCONVERSION(:) = 1E4 CASE ('MOL') ! flux given in microMol/m2/day, conversion to molec/m2/s -! where 1 microMol/m2/day = (22.414/86.400)*1E-12 ppp*m/s +! where 1 microMol/m2/day = (22.414/86.400)*1E-12 ppv*m/s !XCONVERSION(:) = (22.414/86.400)*1E-12 * XAVOGADRO * PRHODREF(:) / XMD PCONVERSION(:) = 1E-6 * XAVOGADRO / 86400. diff --git a/src/SURFEX/ch_aer_emission.F90 b/src/SURFEX/ch_aer_emission.F90 index 3aba32d7f500bb6e5fa41848dc9aeab6e61ea643..eb3ad3af3bada4e17ab3dd090f7352d798c9c821 100644 --- a/src/SURFEX/ch_aer_emission.F90 +++ b/src/SURFEX/ch_aer_emission.F90 @@ -1,4 +1,4 @@ -!SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!SFX_LIC Copyright 1994-2022 CNRS, Meteo-France and Universite Paul Sabatier !SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence !SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !SFX_LIC for details. version 1. @@ -249,7 +249,7 @@ ZFM(:,3) = ZFM(:,1) * (ZEMISRADIUSI**6) *EXP(18 *(LOG(XEMISSIGI))**2) ! ZFM(:,6) = ZFM(:,4) * (ZEMISRADIUSJ**6) *EXP(18 *(LOG(XEMISSIGJ))**2) ! -!* 1.4 conversion en ppp.m.s-1 +!* 1.4 conversion en ppv.m.s-1 ! ! conversion in atmospheric unit only for moments 0 and 6 PFLUX(:,I_CH_M0i) = ZFM(:,1) * 1E-6 / (ZDEN2MOL * PRHODREF(:)) @@ -275,7 +275,7 @@ PFLUX(:,I_CH_BCj) = PFLUX(:,I_CH_BCj) * ZCONVERSION(:) / (ZMI(JP_AER_BC)*1E-3) PFLUX(:,I_CH_DSTi) = PFLUX(:,I_CH_DSTi) * ZCONVERSION(:) / (ZMI(JP_AER_DST)*1E-3) PFLUX(:,I_CH_DSTj) = PFLUX(:,I_CH_DSTj) * ZCONVERSION(:) / (ZMI(JP_AER_DST)*1E-3) ! -! conversion M0 and M6 ppp.m.s-1 into molecules.m-2.s-1 +! conversion M0 and M6 ppv.m.s-1 into molecules.m-2.s-1 PFLUX(:,I_CH_M0i) = PFLUX(:,I_CH_M0i) * ZCONVERSION(:) PFLUX(:,I_CH_M0j) = PFLUX(:,I_CH_M0j) * ZCONVERSION(:) ! diff --git a/src/SURFEX/ch_bvocemn.F90 b/src/SURFEX/ch_bvocemn.F90 index 0b3504e362d4855d14cc85bbd7b25260d8703b46..ac823459dca56febcf85dd91076c861cecb1587c 100644 --- a/src/SURFEX/ch_bvocemn.F90 +++ b/src/SURFEX/ch_bvocemn.F90 @@ -1,4 +1,4 @@ -!SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!SFX_LIC Copyright 1994-2022 CNRS, Meteo-France and Universite Paul Sabatier !SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence !SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !SFX_LIC for details. version 1. @@ -190,7 +190,7 @@ ENDIF !3.Summation of different contribution for fluxes !------------------------------------------------ ! -!isoprene in ppp.m.s-1 +!isoprene in ppv.m.s-1 GB%XFISO (:)=(3.0012E-10/3600.) * ( ZFISO_FOR (:) + ZFISO_GRASS(:) + ZFISO_CROP(:) ) + 1E-17 !monoterpenes GB%XFMONO(:)=(1.5006E-10/3600.) * ( ZFMONO_FOR(:) + ZFMONO_GRASS(:)+ ZFMONO_CROP(:) ) + 1E-17 diff --git a/src/SURFEX/ch_conversion_factor.F90 b/src/SURFEX/ch_conversion_factor.F90 index 31cdb9b3729a95ea5935a27b81a48459f81da491..89d59dea0c33db390ac70e692b429714f226d6d5 100644 --- a/src/SURFEX/ch_conversion_factor.F90 +++ b/src/SURFEX/ch_conversion_factor.F90 @@ -1,4 +1,4 @@ -!SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!SFX_LIC Copyright 1994-2022 CNRS, Meteo-France and Universite Paul Sabatier !SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence !SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !SFX_LIC for details. version 1. @@ -57,7 +57,7 @@ IF (LHOOK) CALL DR_HOOK('CH_CONVERSION_FACTOR',0,ZHOOK_HANDLE) ! determine the conversion factor PCONVERSION(:) = 1. SELECT CASE (HCONVERSION) - CASE ('MIX') ! flux given ppp*m/s, conversion to molec/m2/s + CASE ('MIX') ! flux given ppv*m/s, conversion to molec/m2/s PCONVERSION(:) = XAVOGADRO * PRHOA(:) / XMD CASE ('CON') ! flux given in molecules/cm2/s, conversion to molec/m2/s PCONVERSION(:) = 1E4 diff --git a/src/SURFEX/ch_emission_fluxn.F90 b/src/SURFEX/ch_emission_fluxn.F90 index f9eae54518a9396b0c73cce922894b0fad2493f7..f12a9bae34ddbff5a878fddb134e34f7e9f039ce 100644 --- a/src/SURFEX/ch_emission_fluxn.F90 +++ b/src/SURFEX/ch_emission_fluxn.F90 @@ -1,4 +1,4 @@ -!SFX_LIC Copyright 2000-2020 CNRS, Meteo-France and Universite Paul Sabatier +!SFX_LIC Copyright 2000-2022 CNRS, Meteo-France and Universite Paul Sabatier !SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence !SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !SFX_LIC for details. version 1. @@ -80,7 +80,7 @@ TYPE(CH_SURF_t), INTENT(INOUT) :: CHU REAL, INTENT(IN) :: PSIMTIME ! time of simulation in sec UTC ! (counting from midnight of ! the current day) -REAL,DIMENSION(:,:), INTENT(INOUT) :: PSFSV ! emission flux in ppp*m/s +REAL,DIMENSION(:,:), INTENT(INOUT) :: PSFSV ! emission flux in ppv*m/s REAL, DIMENSION(:), INTENT(IN) :: PRHOA ! air density (kg/m3) REAL, INTENT(IN) :: PTSTEP ! atmospheric time-step (s) INTEGER, INTENT(IN) :: KNBTS_MAX !max size of TEMISS%NETIMES diff --git a/src/SURFEX/modd_gr_biog_gardenn.F90 b/src/SURFEX/modd_gr_biog_gardenn.F90 index 1849ecf631f149accf16225a5a965bef1d7cefbd..55097e16b670746f9360ce0ee21127fcca169ac4 100644 --- a/src/SURFEX/modd_gr_biog_gardenn.F90 +++ b/src/SURFEX/modd_gr_biog_gardenn.F90 @@ -1,4 +1,4 @@ -!SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!SFX_LIC Copyright 1994-2022 CNRS, Meteo-France and Universite Paul Sabatier !SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence !SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !SFX_LIC for details. version 1. @@ -44,8 +44,8 @@ TYPE GR_BIOG_GARDEN_t !* Radiation at different level(cf Gauss) in the canopy REAL, DIMENSION(:,:,:),POINTER ::XIACAN ! PAR at 3 gauss level for each patch ! -!* XFISO = isoprene emission flux (ppp.m.s-1) -! XFMONO = monoterpenes emission flux (ppp m s-1) +!* XFISO = isoprene emission flux (ppv.m.s-1) +! XFMONO = monoterpenes emission flux (ppv m s-1) REAL, DIMENSION(:), POINTER :: XFISO, XFMONO ! ! diff --git a/src/SURFEX/modd_gr_biog_greenroofn.F90 b/src/SURFEX/modd_gr_biog_greenroofn.F90 index 4f861e10e9044d568beb0d13f9eb7dd19a8232c8..6b87cb20d822fb60ec72d377827adcfd16f48d1d 100644 --- a/src/SURFEX/modd_gr_biog_greenroofn.F90 +++ b/src/SURFEX/modd_gr_biog_greenroofn.F90 @@ -1,4 +1,4 @@ -!SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!SFX_LIC Copyright 1994-2022 CNRS, Meteo-France and Universite Paul Sabatier !SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence !SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !SFX_LIC for details. version 1. @@ -45,8 +45,8 @@ TYPE GR_BIOG_GREENROOF_t REAL, DIMENSION(:), POINTER :: XP_IACAN !pack radiation REAL, DIMENSION(:,:,:),POINTER ::XIACAN ! PAR at 3 gauss level for each patch ! -!* XFISO = isoprene emission flux (ppp.m.s-1) -! XFMONO = monoterpenes emission flux (ppp m s-1) +!* XFISO = isoprene emission flux (ppv.m.s-1) +! XFMONO = monoterpenes emission flux (ppv m s-1) REAL, DIMENSION(:), POINTER :: XFISO, XFMONO ! ! diff --git a/src/SURFEX/modd_gr_biogn.F90 b/src/SURFEX/modd_gr_biogn.F90 index 9090cc3f7f2b6108d597a5a04b1b00f992ed7dd5..a6c1477d4840f8be83da27b8fdfabc0faeb56c04 100644 --- a/src/SURFEX/modd_gr_biogn.F90 +++ b/src/SURFEX/modd_gr_biogn.F90 @@ -1,4 +1,4 @@ -!SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!SFX_LIC Copyright 1994-2022 CNRS, Meteo-France and Universite Paul Sabatier !SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence !SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !SFX_LIC for details. version 1. @@ -44,8 +44,8 @@ TYPE GR_BIOG_t !* Radiation at different level(cf Gauss) in the canopy REAL, DIMENSION(:,:),POINTER ::XIACAN ! PAR at 3 gauss level for each patch ! -!* XFISO = isoprene emission flux (ppp.m.s-1) -! XFMONO = monoterpenes emission flux (ppp m s-1) +!* XFISO = isoprene emission flux (ppv.m.s-1) +! XFMONO = monoterpenes emission flux (ppv m s-1) REAL, DIMENSION(:), POINTER :: XFISO, XFMONO !SOILNOX REAL, DIMENSION(:), POINTER :: XNOFLUX diff --git a/src/SURFEX/mode_aer_surf.F90 b/src/SURFEX/mode_aer_surf.F90 index a23ac0cdb8bb8f53f88d4f3148a08d0dead73d78..e70fa26ef78a32266aef76bd2bcf6960f48960a1 100644 --- a/src/SURFEX/mode_aer_surf.F90 +++ b/src/SURFEX/mode_aer_surf.F90 @@ -1,4 +1,4 @@ -!SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!SFX_LIC Copyright 1994-2022 CNRS, Meteo-France and Universite Paul Sabatier !SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence !SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !SFX_LIC for details. version 1. @@ -7,7 +7,7 @@ MODULE MODE_AER_SURF !! ######################## !! !! MODULE DUST PSD (Particle Size Distribution) -!! Purpose: Contains subroutines to convert from transported variables (ppp) +!! Purpose: Contains subroutines to convert from transported variables (ppv) !! to understandable aerosol variables, e.g. #/m3, kg/m3, sigma, R_{n} !------------------------------------------------------------------------------- !! MODIFICATIONS @@ -147,7 +147,7 @@ END SUBROUTINE INIT_VAR ! !! ############################################################ SUBROUTINE PPP2AERO_SURF( & - PSVT, &!I [ppp] input scalar variables (moment of distribution) + PSVT, &!I [ppv] input scalar variables (moment of distribution) PRHODREF, &!I [kg/m3] density of air PSIG1D, &!O [-] standard deviation of aerosol distribution PRG1D, &!O [um] number median diameter of aerosol distribution @@ -160,7 +160,7 @@ SUBROUTINE PPP2AERO_SURF( & !! !! PURPOSE !! ------- -!! Translate the three moments M0, M3 and M6 given in ppp into +!! Translate the three moments M0, M3 and M6 given in ppv into !! Values which can be understood more easily (R, sigma, N, M) !! !! CALLING STRUCTURE NOTE: OPTIONAL VARIABLES @@ -353,7 +353,7 @@ IF (LHOOK) CALL DR_HOOK('MODE_AER_SURF:PPP2AERO_SURF',1,ZHOOK_HANDLE) END SUBROUTINE PPP2AERO_SURF !! ############################################################ SUBROUTINE AERO2PPP_SURF( & - PSVT, &!IO [ppp] input scalar variables (moment of distribution) + PSVT, &!IO [ppv] input scalar variables (moment of distribution) PRHODREF, &!I [kg/m3] density of air PSIG1D, &!I [-] standard deviation of aerosol distribution PRG1D &!I [um] number median diameter of aerosol distribution @@ -363,7 +363,7 @@ SUBROUTINE AERO2PPP_SURF( & !! !! PURPOSE !! ------- -!! Translate the aerosol Mass, RG and SIGMA in the three moments M0, M3 and M6 given in ppp +!! Translate the aerosol Mass, RG and SIGMA in the three moments M0, M3 and M6 given in ppv !! !! REFERENCE !! --------- @@ -440,7 +440,7 @@ ZM(:,4)= ZM(:,5)/ ( (PRG1D(:,2)**3)*EXP(4.5 * LOG(PSIG1D(:,2))**2) ) ZM(:,3) = ZM(:,1)*(PRG1D(:,1)**6) * EXP(18 *(LOG(PSIG1D(:,1)))**2) ZM(:,6) = ZM(:,4)*(PRG1D(:,2)**6) * EXP(18 *(LOG(PSIG1D(:,2)))**2) ! -!* 6 return to ppp +!* 6 return to ppv ! PSVT(:,JP_CH_M0i) = ZM(:,1) * 1E-6 PSVT(:,JP_CH_M0j) = ZM(:,4) * 1E-6 diff --git a/src/SURFEX/mode_dslt_surf.F90 b/src/SURFEX/mode_dslt_surf.F90 index 408f179f1c2fea06682802fac0b1df65a26c53c1..742a4de2fc6c6e5e2d21e1d66052f1df15156b82 100644 --- a/src/SURFEX/mode_dslt_surf.F90 +++ b/src/SURFEX/mode_dslt_surf.F90 @@ -1,4 +1,4 @@ -!SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!SFX_LIC Copyright 1994-2022 CNRS, Meteo-France and Universite Paul Sabatier !SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence !SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !SFX_LIC for details. version 1. @@ -188,7 +188,7 @@ SUBROUTINE DSLTMOMENT2SIZE( & !! !! PURPOSE !! ------- -!! Translate the three moments M0, M3 and M6 given in ppp into +!! Translate the three moments M0, M3 and M6 given in ppv into !! Values which can be understood more easily (R, sigma, N, M) !! At this point, M3 is in kg/m3, M0 in #/m3*(kg_{dst}/mole), M6 in um6/m3*1.d6*(kg_{dst}/mole) !! @@ -225,7 +225,7 @@ IMPLICIT NONE !* 0.1 declarations of arguments ! !INPUT -REAL, DIMENSION(:,:), INTENT(IN) :: PSVT !I [ppp] moments in surface units +REAL, DIMENSION(:,:), INTENT(IN) :: PSVT !I [ppv] moments in surface units REAL, DIMENSION(:), INTENT(IN) :: PRHODREF !I [kg/m3] density of air REAL, DIMENSION(:), INTENT(IN) :: PEMISSIG REAL, DIMENSION(:), INTENT(IN) :: PEMISRADIUS diff --git a/src/configure b/src/configure index 534c5abb9260b94cad7daa6b66f06f90207be928..b2bbc76148429ecfecd650f28b698bd619b61455 100755 --- a/src/configure +++ b/src/configure @@ -1,5 +1,5 @@ #!/bin/bash -#MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier +#MNH_LIC Copyright 1994-2023 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. @@ -12,11 +12,11 @@ export VERSION_MASTER=${VERSION_MASTER:-MNH-V5-5} export VERSION_BUG=${VERSION_BUG:-1} export VERSION_XYZ=${VERSION_XYZ:-${VERSION_MASTER}-${VERSION_BUG}${VER_OASIS:+-${VER_OASIS}}} export VERSION_DATE=${VERSION_DATE:-"19/03/2021"} -export VERSION_LIBAEC=${VERSION_LIBAEC:-"0.3.4"} -export VERSION_HDF=${VERSION_HDF:-"1.12.0"} -export VERSION_CDFC=${VERSION_CDFC:-"4.7.4"} +export VERSION_LIBAEC=${VERSION_LIBAEC:-"v1.0.6"} +export VERSION_HDF=${VERSION_HDF:-"1.14.0"} +export VERSION_CDFC=${VERSION_CDFC:-"4.9.0"} export VERSION_CDFCXX=${VERSION_CDFCXX:-"4.3.1"} -export VERSION_CDFF=${VERSION_CDFF:-"4.5.3"} +export VERSION_CDFF=${VERSION_CDFF:-"4.6.0"} export VERSION_GRIBAPI=${VERSION_GRIBAPI:-"1.26.0-Source"} export VERSION_ECCODES=${VERSION_ECCODES:-"2.18.0"} export ECCODES_DEFINITION_PATH=${ECCODES_DEFINITION_PATH:-${SRC_MESONH}/src/LIB/eccodes-${VERSION_ECCODES}"/definitions/"}