From 0e0491f953386d36fc70edae14a7d2e7bd2e8278 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Fri, 24 Sep 2021 13:59:51 +0200 Subject: [PATCH 001/157] Philippe 24/09/2021: add NLONGNAMELGTMAX and NUNITLGTMAX parameters + use them --- src/LIB/SURCOUCHE/src/modd_field.f90 | 14 +++++++------- src/MNH/ini_budget.f90 | 8 ++++---- src/MNH/modd_parameters.f90 | 21 ++++++++++++--------- 3 files changed, 23 insertions(+), 20 deletions(-) diff --git a/src/LIB/SURCOUCHE/src/modd_field.f90 b/src/LIB/SURCOUCHE/src/modd_field.f90 index b81b59f1f..9c7f50c90 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. @@ -15,7 +15,7 @@ !----------------------------------------------------------------- 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 @@ -179,11 +179,11 @@ TYPE TFIELDPTR_T1D 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) + 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 diff --git a/src/MNH/ini_budget.f90 b/src/MNH/ini_budget.f90 index 3152cb6e5..cff4e82db 100644 --- a/src/MNH/ini_budget.f90 +++ b/src/MNH/ini_budget.f90 @@ -4148,7 +4148,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 @@ -4159,9 +4159,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/modd_parameters.f90 b/src/MNH/modd_parameters.f90 index c21c6e709..f4849d401 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-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. @@ -39,10 +39,11 @@ !! 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 !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -78,10 +79,12 @@ 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 :: NDIRNAMELGTMAX = 512 ! Maximum length of a directory name INTEGER, PARAMETER :: NFILENAMELGTMAX = 32 ! Maximum length of a file name (must be at least NFILENAMELGTMAXLFI) -- GitLab From 2e828589e08c35cca36c63ed5cdf4ba1907de215 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Fri, 24 Sep 2021 14:25:47 +0200 Subject: [PATCH 002/157] Philippe 24/09/2021: add Fill_tfielddata and use it as a custom constructor for tfielddata type --- src/LIB/SURCOUCHE/src/modd_field.f90 | 245 +++++++++++++++++++++++++++ 1 file changed, 245 insertions(+) diff --git a/src/LIB/SURCOUCHE/src/modd_field.f90 b/src/LIB/SURCOUCHE/src/modd_field.f90 index 9c7f50c90..fbcd3d35e 100644 --- a/src/LIB/SURCOUCHE/src/modd_field.f90 +++ b/src/LIB/SURCOUCHE/src/modd_field.f90 @@ -12,6 +12,7 @@ ! 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 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 !----------------------------------------------------------------- module modd_field @@ -211,6 +212,8 @@ TYPE, extends( tfield_metadata_base ) :: TFIELDDATA CHARACTER(LEN=4) :: CLBTYPE = 'NONE' !Type of the lateral boundary (LBX,LBY,LBXU,LBYV) LOGICAL :: LTIMEDEP = .FALSE. !Is the field time-dependent? ! + INTEGER :: NMODELMAX = -1 !Number of models for which the field has been allocated + ! 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,4 +241,246 @@ integer, save :: NMODEL_ALLOCATED LOGICAL, SAVE :: LFIELDLIST_ISINIT = .FALSE. TYPE(TFIELDDATA),DIMENSION(MAXFIELDS),SAVE :: TFIELDLIST +interface TFIELDDATA + module procedure :: Fill_tfielddata +end interface TFIELDDATA + +contains + +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=*), 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 + + ! cmnhname + 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 ) ) + + ! 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( cmnhname ) ) + 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( cmnhname ) ) + 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( cmnhname ) ) + 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( cmnhname ) ) + 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( cmnhname ) ) + 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( cmnhname ) // ' 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( cmnhname ) // ' 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( cmnhname ) // ' 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( cmnhname ) // ' 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( cmnhname ) // ' of type TYPEDATE' ) + case default + call Print_msg( NVERB_ERROR, 'GEN', 'Fill_tfielddata', & + 'invalid value of ntype for variable ' // Trim( cmnhname ) ) + + 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( cmnhname ) ) + + 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 == 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( cmnhname ) ) + end if + else + call Print_msg( NVERB_DEBUG, 'GEN', 'Fill_tfielddata', 'ndimlist not filled for variable ' // Trim( cmnhname ) ) + end if + else + call Print_msg( NVERB_DEBUG, 'GEN', 'Fill_tfielddata', 'ndimlist not filled for variable ' // Trim( cmnhname ) ) + 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( cmnhname ) ) + !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( cmnhname ) ) + 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( cmnhname ) ) + 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( cmnhname ) ) + 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( cmnhname ) ) + if ( Present( nvalidmin ) ) then + if ( nvalidmax < nvalidmin ) & + call Print_msg( NVERB_WARNING, 'GEN', 'Fill_tfielddata', 'nvalidmax < nvalidmin for variable ' // Trim( cmnhname ) ) + 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( cmnhname ) ) + 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( cmnhname ) ) + if ( Present( xvalidmin ) ) then + if ( xvalidmax < xvalidmin ) & + call Print_msg( NVERB_WARNING, 'GEN', 'Fill_tfielddata', 'xvalidmax < xvalidmin for variable ' // Trim( cmnhname ) ) + 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( cmnhname ) ) + 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( cmnhname ) ) + end if + end if + + ! ltimedep + if ( Present( ltimedep ) ) tpfield%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. + tpfield%nmodelmax = 0 +end function Fill_tfielddata + end module modd_field -- GitLab From e964ab16aa4bf4ec4bb30332021c647e30f1cd1e Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Fri, 24 Sep 2021 15:49:00 +0200 Subject: [PATCH 003/157] Philippe 24/09/2021: add Goto_model_1field generic procedure + procedure for real 3D arrays --- src/LIB/SURCOUCHE/src/mode_field.f90 | 56 ++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/src/LIB/SURCOUCHE/src/mode_field.f90 b/src/LIB/SURCOUCHE/src/mode_field.f90 index 97466a414..37299698a 100644 --- a/src/LIB/SURCOUCHE/src/mode_field.f90 +++ b/src/LIB/SURCOUCHE/src/mode_field.f90 @@ -15,6 +15,7 @@ ! 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 24/09/2021: add Goto_model_1field generic procedure !----------------------------------------------------------------- module mode_field @@ -36,6 +37,10 @@ public :: Fieldlist_goto_model public :: Fieldlist_nmodel_resize public :: Ini_field_scalars +interface Goto_model_1field + module procedure :: Goto_model_1field_x3d +end interface + contains SUBROUTINE INI_FIELD_LIST(KMODEL) @@ -4606,6 +4611,57 @@ END IF !KFROM/=KTO END SUBROUTINE FIELDLIST_GOTO_MODEL +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 +integer :: isize +integer :: ji +type(tfieldptr_x3d), dimension(:), allocatable :: tzfield_x3d + +call Find_field_id_from_mnhname( hname, iid, iresp ) + +isize = Max( kfrom, kto ) + +if ( tfieldlist(iid)%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 + tfieldlist(iid)%nmodelmax = Size( tfieldlist(iid)%tfield_x3d ) +end if + +if ( isize > tfieldlist(iid)%nmodelmax ) then + if ( tfieldlist(iid)%nmodelmax == 0 ) then + Allocate( tfieldlist(iid)%tfield_x3d(isize) ) + do ji = 1, isize + tfieldlist(iid)%tfield_x3d(ji)%data => null() + end do + else + Allocate( tzfield_x3d(isize) ) + do ji = 1, Size( tfieldlist(iid)%tfield_x3d) + tzfield_x3d(ji)%data => tfieldlist(iid)%tfield_x3d(ji)%data + end do + do ji = Size( tfieldlist(iid)%tfield_x3d) + 1, isize + tzfield_x3d(ji)%data => null() + end do + call Move_alloc( from = tzfield_x3d, to = tfieldlist(iid)%tfield_x3d ) + end if + tfieldlist(iid)%nmodelmax = isize +end if + +tfieldlist(iid)%tfield_x3d(kfrom)%data => pdata +if ( kfrom /= kto ) pdata => tfieldlist(iid)%tfield_x3d(kto)%data + +end subroutine Goto_model_1field_x3d + + subroutine Fieldlist_nmodel_resize( kmodelnew ) implicit none -- GitLab From 4d9ee7c4abc6220ef673ba3455a9b31e38dd6435 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Fri, 8 Oct 2021 11:21:28 +0200 Subject: [PATCH 004/157] Philippe 08/10/2021: add 2 new dimensions: LW_bands and SW_bands --- src/LIB/SURCOUCHE/src/modd_field.f90 | 68 +++++++++++---------- src/LIB/SURCOUCHE/src/mode_io_tools_nc4.f90 | 10 ++- 2 files changed, 45 insertions(+), 33 deletions(-) diff --git a/src/LIB/SURCOUCHE/src/modd_field.f90 b/src/LIB/SURCOUCHE/src/modd_field.f90 index fbcd3d35e..24272038d 100644 --- a/src/LIB/SURCOUCHE/src/modd_field.f90 +++ b/src/LIB/SURCOUCHE/src/modd_field.f90 @@ -13,6 +13,7 @@ ! P. Wautelet 14/09/2020: add ndimlist field to tfield_metadata_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) !----------------------------------------------------------------- module modd_field @@ -43,49 +44,52 @@ integer, parameter :: NMNHDIM_TIME = 9 integer, parameter :: NMNHDIM_ONE = 10 -integer, parameter :: NMNHDIM_LASTDIM_NODIACHRO = 10 ! Index of the last defined dimension for non-diachronic files +integer, parameter :: NMNHDIM_NSWB = 11 +integer, parameter :: NMNHDIM_NLWB = 12 -integer, parameter :: NMNHDIM_COMPLEX = 11 +integer, parameter :: NMNHDIM_LASTDIM_NODIACHRO = 12 ! Index of the last defined dimension for non-diachronic files -integer, parameter :: NMNHDIM_BUDGET_CART_NI = 12 -integer, parameter :: NMNHDIM_BUDGET_CART_NJ = 13 -integer, parameter :: NMNHDIM_BUDGET_CART_NI_U = 14 -integer, parameter :: NMNHDIM_BUDGET_CART_NJ_U = 15 -integer, parameter :: NMNHDIM_BUDGET_CART_NI_V = 16 -integer, parameter :: NMNHDIM_BUDGET_CART_NJ_V = 17 -integer, parameter :: NMNHDIM_BUDGET_CART_LEVEL = 18 -integer, parameter :: NMNHDIM_BUDGET_CART_LEVEL_W = 19 +integer, parameter :: NMNHDIM_COMPLEX = 13 -integer, parameter :: NMNHDIM_BUDGET_MASK_LEVEL = 20 -integer, parameter :: NMNHDIM_BUDGET_MASK_LEVEL_W = 21 -integer, parameter :: NMNHDIM_BUDGET_MASK_NBUMASK = 22 +integer, parameter :: NMNHDIM_BUDGET_CART_NI = 14 +integer, parameter :: NMNHDIM_BUDGET_CART_NJ = 15 +integer, parameter :: NMNHDIM_BUDGET_CART_NI_U = 16 +integer, parameter :: NMNHDIM_BUDGET_CART_NJ_U = 17 +integer, parameter :: NMNHDIM_BUDGET_CART_NI_V = 18 +integer, parameter :: NMNHDIM_BUDGET_CART_NJ_V = 19 +integer, parameter :: NMNHDIM_BUDGET_CART_LEVEL = 20 +integer, parameter :: NMNHDIM_BUDGET_CART_LEVEL_W = 21 -integer, parameter :: NMNHDIM_BUDGET_TIME = 23 +integer, parameter :: NMNHDIM_BUDGET_MASK_LEVEL = 22 +integer, parameter :: NMNHDIM_BUDGET_MASK_LEVEL_W = 23 +integer, parameter :: NMNHDIM_BUDGET_MASK_NBUMASK = 24 -integer, parameter :: NMNHDIM_BUDGET_LES_TIME = 24 -integer, parameter :: NMNHDIM_BUDGET_LES_AVG_TIME = 25 -integer, parameter :: NMNHDIM_BUDGET_LES_LEVEL = 26 -integer, parameter :: NMNHDIM_BUDGET_LES_SV = 27 -integer, parameter :: NMNHDIM_BUDGET_LES_PDF = 28 +integer, parameter :: NMNHDIM_BUDGET_TIME = 25 + +integer, parameter :: NMNHDIM_BUDGET_LES_TIME = 26 +integer, parameter :: NMNHDIM_BUDGET_LES_AVG_TIME = 27 +integer, parameter :: NMNHDIM_BUDGET_LES_LEVEL = 28 +integer, parameter :: NMNHDIM_BUDGET_LES_SV = 29 +integer, parameter :: NMNHDIM_BUDGET_LES_PDF = 30 integer, parameter :: NMNHDIM_BUDGET_LES_MASK = 100 ! This is not a true dimension -integer, parameter :: NMNHDIM_SPECTRA_2PTS_NI = 29 -integer, parameter :: NMNHDIM_SPECTRA_2PTS_NJ = 30 -integer, parameter :: NMNHDIM_SPECTRA_SPEC_NI = 31 -integer, parameter :: NMNHDIM_SPECTRA_SPEC_NJ = 32 -integer, parameter :: NMNHDIM_SPECTRA_LEVEL = 33 +integer, parameter :: NMNHDIM_SPECTRA_2PTS_NI = 31 +integer, parameter :: NMNHDIM_SPECTRA_2PTS_NJ = 32 +integer, parameter :: NMNHDIM_SPECTRA_SPEC_NI = 33 +integer, parameter :: NMNHDIM_SPECTRA_SPEC_NJ = 34 +integer, parameter :: NMNHDIM_SPECTRA_LEVEL = 35 -integer, parameter :: NMNHDIM_SERIES_LEVEL = 34 -integer, parameter :: NMNHDIM_SERIES_LEVEL_W = 35 -integer, parameter :: NMNHDIM_SERIES_TIME = 36 ! Time dimension for time series +integer, parameter :: NMNHDIM_SERIES_LEVEL = 36 +integer, parameter :: NMNHDIM_SERIES_LEVEL_W = 37 +integer, parameter :: NMNHDIM_SERIES_TIME = 38 ! Time dimension for time series -integer, parameter :: NMNHDIM_FLYER_TIME = 37 ! Time dimension for aircraft/balloon (dimension local to each flyer) -integer, parameter :: NMNHDIM_PROFILER_TIME = 38 ! Time dimension for profilers -integer, parameter :: NMNHDIM_STATION_TIME = 39 ! Time dimension for stations +integer, parameter :: NMNHDIM_FLYER_TIME = 39 ! Time dimension for aircraft/balloon (dimension local to each flyer) +integer, parameter :: NMNHDIM_PROFILER_TIME = 40 ! Time dimension for profilers +integer, parameter :: NMNHDIM_STATION_TIME = 41 ! Time dimension for stations -integer, parameter :: NMNHDIM_PAIR = 40 ! For values coming by pair (ie boundaries) +integer, parameter :: NMNHDIM_PAIR = 42 ! For values coming by pair (ie boundaries) -integer, parameter :: NMNHDIM_LASTDIM_DIACHRO = 40 ! Index of the last defined dimension for diachronic files +integer, parameter :: NMNHDIM_LASTDIM_DIACHRO = 42 ! Index of the last defined dimension for diachronic files integer, parameter :: NMNHDIM_BUDGET_NGROUPS = 101 ! This is not a true dimension integer, parameter :: NMNHDIM_FLYER_PROC = 102 ! This is not a true dimension diff --git a/src/LIB/SURCOUCHE/src/mode_io_tools_nc4.f90 b/src/LIB/SURCOUCHE/src/mode_io_tools_nc4.f90 index 477c389db..50412e8c0 100644 --- a/src/LIB/SURCOUCHE/src/mode_io_tools_nc4.f90 +++ b/src/LIB/SURCOUCHE/src/mode_io_tools_nc4.f90 @@ -19,6 +19,7 @@ ! P. Wautelet 18/03/2021: workaround for an intel compiler bug ! P. Wautelet 04/05/2021: improve IO_Vdims_fill_nc4 if l2d and lpack ! P. Wautelet 27/05/2021: improve IO_Mnhname_clean to autocorrect names to be CF compliant +! P. Wautelet 08/10/2021: add 2 new dimensions: LW_bands and SW_bands !----------------------------------------------------------------- #ifdef MNH_IOCDF4 module mode_io_tools_nc4 @@ -254,7 +255,7 @@ use modd_dyn, only: xseglen use modd_dyn_n, only: xtstep use modd_field, only: NMNHDIM_NI, NMNHDIM_NJ, NMNHDIM_NI_U, NMNHDIM_NJ_U, NMNHDIM_NI_V, NMNHDIM_NJ_V, & NMNHDIM_LEVEL, NMNHDIM_LEVEL_W, NMNHDIM_TIME, & - NMNHDIM_ONE, NMNHDIM_COMPLEX, & + NMNHDIM_ONE, NMNHDIM_NSWB, NMNHDIM_NLWB, NMNHDIM_COMPLEX, & NMNHDIM_BUDGET_CART_NI, NMNHDIM_BUDGET_CART_NJ, NMNHDIM_BUDGET_CART_NI_U, & NMNHDIM_BUDGET_CART_NJ_U, NMNHDIM_BUDGET_CART_NI_V, NMNHDIM_BUDGET_CART_NJ_V, & NMNHDIM_BUDGET_CART_LEVEL, NMNHDIM_BUDGET_CART_LEVEL_W, & @@ -274,7 +275,9 @@ use modd_les, only: lles_pdf, nles_k, npdf, nspectra_k, xles_temp_mean 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_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 @@ -336,6 +339,11 @@ if ( tpfile%ctype == 'MNHDIACHRONIC' .or. ( lpack .and. l2d ) ) then call IO_Add_dim_nc4( tpfile, NMNHDIM_ONE, 'one', 1 ) end if +if ( tpfile%ctype /= 'MNHDIACHRONIC' .and. crad /= 'NONE' ) then + call IO_Add_dim_nc4( tpfile, NMNHDIM_NSWB, 'SW_bands', nswb_mnh ) !number of SW bands practically used + call IO_Add_dim_nc4( tpfile, NMNHDIM_NLWB, 'LW_bands', nlwb_mnh ) !number of LW bands practically used +end if + !Write dimensions used in diachronic files if ( tpfile%ctype == 'MNHDIACHRONIC' ) then !Dimension of size 2 used for NMNHDIM_COMPLEX -- GitLab From ee3962e07e096fd95c4b77af0c0993518b0def9e Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Fri, 8 Oct 2021 15:02:05 +0200 Subject: [PATCH 005/157] Philippe 08/10/2021: add Goto_model_1field + Extend_1field_* procedures --- src/LIB/SURCOUCHE/src/mode_field.f90 | 1086 +++++++++++++++++++++++++- 1 file changed, 1063 insertions(+), 23 deletions(-) diff --git a/src/LIB/SURCOUCHE/src/mode_field.f90 b/src/LIB/SURCOUCHE/src/mode_field.f90 index 37299698a..b224d123e 100644 --- a/src/LIB/SURCOUCHE/src/mode_field.f90 +++ b/src/LIB/SURCOUCHE/src/mode_field.f90 @@ -15,7 +15,7 @@ ! 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 24/09/2021: add Goto_model_1field generic procedure +! P. Wautelet 08/10/2021: add Goto_model_1field procedures !----------------------------------------------------------------- module mode_field @@ -38,9 +38,26 @@ 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) @@ -4611,7 +4628,312 @@ END IF !KFROM/=KTO END SUBROUTINE FIELDLIST_GOTO_MODEL -subroutine Goto_model_1field_x3d(hname, kfrom, kto, pdata) +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 @@ -4622,44 +4944,762 @@ real, dimension(:,:,:), pointer, intent(inout) :: pdata integer :: iid integer :: iresp -integer :: isize -integer :: ji -type(tfieldptr_x3d), dimension(:), allocatable :: tzfield_x3d call Find_field_id_from_mnhname( hname, iid, iresp ) -isize = Max( kfrom, kto ) +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 + +type(tfielddata), intent(inout) :: tpfield +integer, intent(in) :: ksize -if ( tfieldlist(iid)%nmodelmax < 0 ) then +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 - tfieldlist(iid)%nmodelmax = Size( tfieldlist(iid)%tfield_x3d ) + tpfield%nmodelmax = Size( tpfield%tfield_c0d ) end if -if ( isize > tfieldlist(iid)%nmodelmax ) then - if ( tfieldlist(iid)%nmodelmax == 0 ) then - Allocate( tfieldlist(iid)%tfield_x3d(isize) ) - do ji = 1, isize - tfieldlist(iid)%tfield_x3d(ji)%data => null() +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 else - Allocate( tzfield_x3d(isize) ) - do ji = 1, Size( tfieldlist(iid)%tfield_x3d) - tzfield_x3d(ji)%data => tfieldlist(iid)%tfield_x3d(ji)%data + Allocate( tzfield_c0d(ksize) ) + do ji = 1, Size( tpfield%tfield_c0d) + tzfield_c0d(ji)%data => tpfield%tfield_c0d(ji)%data end do - do ji = Size( tfieldlist(iid)%tfield_x3d) + 1, isize - tzfield_x3d(ji)%data => null() + do ji = Size( tpfield%tfield_c0d) + 1, ksize + tzfield_c0d(ji)%data => null() end do - call Move_alloc( from = tzfield_x3d, to = tfieldlist(iid)%tfield_x3d ) + call Move_alloc( from = tzfield_c0d, to = tpfield%tfield_c0d ) end if - tfieldlist(iid)%nmodelmax = isize + tpfield%nmodelmax = ksize end if -tfieldlist(iid)%tfield_x3d(kfrom)%data => pdata -if ( kfrom /= kto ) pdata => tfieldlist(iid)%tfield_x3d(kto)%data +end subroutine Extend_1field_c0d -end subroutine Goto_model_1field_x3d + +subroutine Extend_1field_c1d( tpfield, ksize ) + +implicit none + +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 + else + Allocate( tzfield_c1d(ksize) ) + do ji = 1, Size( tpfield%tfield_c1d) + tzfield_c1d(ji)%data => tpfield%tfield_c1d(ji)%data + end do + 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 + +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 + else + Allocate( tzfield_l0d(ksize) ) + do ji = 1, Size( tpfield%tfield_l0d) + tzfield_l0d(ji)%data => tpfield%tfield_l0d(ji)%data + end do + 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 + +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 + else + Allocate( tzfield_l1d(ksize) ) + do ji = 1, Size( tpfield%tfield_l1d) + tzfield_l1d(ji)%data => tpfield%tfield_l1d(ji)%data + end do + 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 ( 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 + else + Allocate( tzfield_n0d(ksize) ) + do ji = 1, Size( tpfield%tfield_n0d) + tzfield_n0d(ji)%data => tpfield%tfield_n0d(ji)%data + end do + 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 ( 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 + else + Allocate( tzfield_n1d(ksize) ) + do ji = 1, Size( tpfield%tfield_n1d) + tzfield_n1d(ji)%data => tpfield%tfield_n1d(ji)%data + end do + 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 ( 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 + else + Allocate( tzfield_n2d(ksize) ) + do ji = 1, Size( tpfield%tfield_n2d) + tzfield_n2d(ji)%data => tpfield%tfield_n2d(ji)%data + end do + 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 ( 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 + else + Allocate( tzfield_n3d(ksize) ) + do ji = 1, Size( tpfield%tfield_n3d) + tzfield_n3d(ji)%data => tpfield%tfield_n3d(ji)%data + end do + 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 ( 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 + else + Allocate( tzfield_t0d(ksize) ) + do ji = 1, Size( tpfield%tfield_t0d) + tzfield_t0d(ji)%data => tpfield%tfield_t0d(ji)%data + end do + 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 ( 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 + else + Allocate( tzfield_t1d(ksize) ) + do ji = 1, Size( tpfield%tfield_t1d) + tzfield_t1d(ji)%data => tpfield%tfield_t1d(ji)%data + end do + 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 + +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 + else + Allocate( tzfield_x0d(ksize) ) + do ji = 1, Size( tpfield%tfield_x0d) + tzfield_x0d(ji)%data => tpfield%tfield_x0d(ji)%data + end do + 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 ) + +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 + else + Allocate( tzfield_x1d(ksize) ) + do ji = 1, Size( tpfield%tfield_x1d) + tzfield_x1d(ji)%data => tpfield%tfield_x1d(ji)%data + end do + 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 ) + +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 + else + Allocate( tzfield_x2d(ksize) ) + do ji = 1, Size( tpfield%tfield_x2d) + tzfield_x2d(ji)%data => tpfield%tfield_x2d(ji)%data + end do + 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 ) + +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 + else + Allocate( tzfield_x3d(ksize) ) + do ji = 1, Size( tpfield%tfield_x3d) + tzfield_x3d(ji)%data => tpfield%tfield_x3d(ji)%data + end do + 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 ) + +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 + else + Allocate( tzfield_x4d(ksize) ) + do ji = 1, Size( tpfield%tfield_x4d) + tzfield_x4d(ji)%data => tpfield%tfield_x4d(ji)%data + end do + 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 ) + +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 + else + Allocate( tzfield_x5d(ksize) ) + do ji = 1, Size( tpfield%tfield_x5d) + tzfield_x5d(ji)%data => tpfield%tfield_x5d(ji)%data + end do + 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 ) + +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 + +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 Extend_1field_x6d subroutine Fieldlist_nmodel_resize( kmodelnew ) -- GitLab From a1ae3363aeca142fd66569e56afb28ab76156b68 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Fri, 8 Oct 2021 15:11:26 +0200 Subject: [PATCH 006/157] Philippe 08/10/2021: add Add_field2list subroutine + use it for tfieldlist variables --- src/LIB/SURCOUCHE/src/modd_field.f90 | 3 +- src/LIB/SURCOUCHE/src/mode_field.f90 | 6403 +++++++++++------------- src/MNH/write_lfifm1_for_diag_supp.f90 | 4 +- src/MNH/write_lfin.f90 | 4 +- 4 files changed, 2998 insertions(+), 3416 deletions(-) diff --git a/src/LIB/SURCOUCHE/src/modd_field.f90 b/src/LIB/SURCOUCHE/src/modd_field.f90 index 24272038d..81aef5eb5 100644 --- a/src/LIB/SURCOUCHE/src/modd_field.f90 +++ b/src/LIB/SURCOUCHE/src/modd_field.f90 @@ -241,7 +241,8 @@ 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 :: NMODEL_ALLOCATED = 0 +integer, save :: NFIELDS_USED = 0 LOGICAL, SAVE :: LFIELDLIST_ISINIT = .FALSE. TYPE(TFIELDDATA),DIMENSION(MAXFIELDS),SAVE :: TFIELDLIST diff --git a/src/LIB/SURCOUCHE/src/mode_field.f90 b/src/LIB/SURCOUCHE/src/mode_field.f90 index b224d123e..deba33040 100644 --- a/src/LIB/SURCOUCHE/src/mode_field.f90 +++ b/src/LIB/SURCOUCHE/src/mode_field.f90 @@ -15,7 +15,7 @@ ! 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 procedures +! P. Wautelet 08/10/2021: add Goto_model_1field + Add_field2list procedures !----------------------------------------------------------------- module mode_field @@ -68,7 +68,7 @@ USE MODD_CONF, ONLY: NMODEL ! INTEGER,INTENT(IN),OPTIONAL :: KMODEL ! -INTEGER :: IDX, IMODEL +INTEGER :: IMODEL CHARACTER(LEN=42) :: YMSG ! !F90/95: TFIELDLIST(1) = TFIELDDATA('UT','x_wind','m s-1','XY','X_Y_Z_U component of wind',2) @@ -102,3468 +102,3025 @@ 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' +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', & !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' + 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', & !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' + 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 = '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 = '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 = '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 = '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 = '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 = '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 = '' -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 = '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. ) ) + +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 = '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 = '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 -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 = '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 = '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_Nact', & + 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 = '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 = '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 = '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) /= '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,MAXFIELDS 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) @@ -4628,6 +4185,26 @@ END IF !KFROM/=KTO END SUBROUTINE FIELDLIST_GOTO_MODEL +subroutine Add_field2list( tpfield ) + +implicit none + +type(tfielddata) :: tpfield + +CHARACTER(LEN=42) :: YMSG + +if ( nfields_used >= MAXFIELDS ) then + WRITE(YMSG,'( "nfields_used>=MAXFIELDS (",I5,")" )') MAXFIELDS + CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_FIELD_LIST',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 diff --git a/src/MNH/write_lfifm1_for_diag_supp.f90 b/src/MNH/write_lfifm1_for_diag_supp.f90 index 1bb11e435..94887adeb 100644 --- a/src/MNH/write_lfifm1_for_diag_supp.f90 +++ b/src/MNH/write_lfifm1_for_diag_supp.f90 @@ -97,7 +97,7 @@ END MODULE MODI_WRITE_LFIFM1_FOR_DIAG_SUPP ! USE MODE_ll USE MODD_CST -use modd_field, only: tfielddata, tfieldlist, TYPEINT, TYPEREAL +use modd_field, only: NMNHDIM_UNUSED, tfielddata, tfieldlist, TYPEINT, TYPEREAL USE MODD_IO, ONLY: TFILEDATA USE MODD_PARAMETERS USE MODD_CONF_n @@ -564,6 +564,8 @@ IF (NRAD_3D >= 0) THEN CALL FIND_FIELD_ID_FROM_MNHNAME('EMIS',IID,IRESP) TZFIELD = 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) diff --git a/src/MNH/write_lfin.f90 b/src/MNH/write_lfin.f90 index ea08bd41d..fdc5c4767 100644 --- a/src/MNH/write_lfin.f90 +++ b/src/MNH/write_lfin.f90 @@ -188,7 +188,7 @@ END MODULE MODI_WRITE_LFIFM_n USE MODD_DIM_n USE MODD_CONF USE MODD_CONF_n -use modd_field, only: tfielddata, tfieldlist, TYPEDATE, TYPEINT, TYPELOG, TYPEREAL +use modd_field, only: NMNHDIM_UNUSED, tfielddata, tfieldlist, TYPEDATE, TYPEINT, TYPELOG, TYPEREAL USE MODD_GRID USE MODD_GRID_n USE MODD_TIME @@ -1661,6 +1661,8 @@ IF (CRAD /= 'NONE') THEN CALL FIND_FIELD_ID_FROM_MNHNAME('EMIS',IID,IRESP) TZFIELD = 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) -- GitLab From 23981265e14c3773e89f914e5547edfb51ed2b7e Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Fri, 8 Oct 2021 15:17:53 +0200 Subject: [PATCH 007/157] Philippe 08/10/2021: use Goto_model_1field --- src/LIB/SURCOUCHE/src/mode_field.f90 | 969 ++++++++------------------- 1 file changed, 279 insertions(+), 690 deletions(-) diff --git a/src/LIB/SURCOUCHE/src/mode_field.f90 b/src/LIB/SURCOUCHE/src/mode_field.f90 index deba33040..05c5d892c 100644 --- a/src/LIB/SURCOUCHE/src/mode_field.f90 +++ b/src/LIB/SURCOUCHE/src/mode_field.f90 @@ -3244,109 +3244,93 @@ 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 + call Goto_model_1field( 'LEN2', 1, 1, 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 + call Goto_model_1field( 'DTMOD', 1, 1, 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 + call Goto_model_1field( 'DTCUR', 1, 1, 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 + call Goto_model_1field( 'DTRAD_FULL', 1, 1, 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 + call Goto_model_1field( 'DTRAD_CLLY', 1, 1, 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 + call Goto_model_1field( 'DTDCONV', 1, 1, 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 = '' + call Goto_model_1field( 'SURF', 1, 1, 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 + call Goto_model_1field( 'DRYMASST', 1, 1, XDRYMASST ) END IF ! 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('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) + call Goto_model_1field( 'RIMY', 1, 1, 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) + call Goto_model_1field( 'HORELAX_UVWTH', 1, 1, 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) + call Goto_model_1field( 'HORELAX_TKE', 1, 1, 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 ! @@ -3430,758 +3414,363 @@ END IF ! ! 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 - +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); 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 +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('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 - ! + 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) - TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XRRS_CLD(:,:,:,CONF_MODEL(KFROM)%IDX_RVT) + 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('RCS_CLD',IID,IRESP) - TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XRRS_CLD(:,:,:,CONF_MODEL(KFROM)%IDX_RCT) + 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('RRS_CLD',IID,IRESP) - TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XRRS_CLD(:,:,:,CONF_MODEL(KFROM)%IDX_RRT) + 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('RIS_CLD',IID,IRESP) - TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XRRS_CLD(:,:,:,CONF_MODEL(KFROM)%IDX_RIT) + 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('RSS_CLD',IID,IRESP) - TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XRRS_CLD(:,:,:,CONF_MODEL(KFROM)%IDX_RST) + 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('RGS_CLD',IID,IRESP) - TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XRRS_CLD(:,:,:,CONF_MODEL(KFROM)%IDX_RGT) + 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('RHS_CLD',IID,IRESP) - TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XRRS_CLD(:,:,:,CONF_MODEL(KFROM)%IDX_RHT) + 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('CLDFR',IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XCLDFR - 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 -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); 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 -END IF -! -! MODD_GR_FIELD_n variables -! -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 -! -! MODD_PRECIP_n variables -! -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 -! -! MODD_DEF_EDDY_FLUX_n variables -! -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 -! -! MODD_DEF_EDDYUV_FLUX_n variables -! -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 -! -! MODD_HURR_FIELD_n variables -! -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 -END IF -! -! -! -! -! Current model is set to model KTO -! -! -! -! -IF( KFROM/=KTO) THEN -! -! 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 -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 -! -IF (CPROGRAM == 'MESONH') THEN - ! - 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) - 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) - 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) - 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) - 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) - 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) - 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) - 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('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( '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 + call Goto_model_1field( 'LSRVM', kfrom, kto, XLSRVM ) 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 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 ) ! ! 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( 'ZHAT', kfrom, kto, XZHAT ) +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 ) ! ! 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_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 + 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 -- GitLab From f54e38463c18c0da670e6003676e9e9de4824f98 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Fri, 8 Oct 2021 15:18:53 +0200 Subject: [PATCH 008/157] Philippe 08/10/2021: remove unnecessary stage in FIELDLIST_GOTO_MODEL --- src/LIB/SURCOUCHE/src/mode_field.f90 | 24 ------------------------ 1 file changed, 24 deletions(-) diff --git a/src/LIB/SURCOUCHE/src/mode_field.f90 b/src/LIB/SURCOUCHE/src/mode_field.f90 index 05c5d892c..fac837573 100644 --- a/src/LIB/SURCOUCHE/src/mode_field.f90 +++ b/src/LIB/SURCOUCHE/src/mode_field.f90 @@ -3388,30 +3388,6 @@ 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 Goto_model_1field( 'ZWS', kfrom, kto, xzws ) -- GitLab From 754627f25295af187d784840a3b7684f6b3a6a59 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Fri, 8 Oct 2021 15:25:35 +0200 Subject: [PATCH 009/157] Philippe 08/10/2021: remove Fieldlist_nmodel_resize (not useful anymore because reallocation are automatically done in Goto_model) --- src/LIB/SURCOUCHE/src/modd_field.f90 | 1 - src/LIB/SURCOUCHE/src/mode_field.f90 | 439 +-------------------------- src/MNH/ini_segn.f90 | 8 +- 3 files changed, 3 insertions(+), 445 deletions(-) diff --git a/src/LIB/SURCOUCHE/src/modd_field.f90 b/src/LIB/SURCOUCHE/src/modd_field.f90 index 81aef5eb5..277e8ad08 100644 --- a/src/LIB/SURCOUCHE/src/modd_field.f90 +++ b/src/LIB/SURCOUCHE/src/modd_field.f90 @@ -241,7 +241,6 @@ 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 = 0 integer, save :: NFIELDS_USED = 0 LOGICAL, SAVE :: LFIELDLIST_ISINIT = .FALSE. TYPE(TFIELDDATA),DIMENSION(MAXFIELDS),SAVE :: TFIELDLIST diff --git a/src/LIB/SURCOUCHE/src/mode_field.f90 b/src/LIB/SURCOUCHE/src/mode_field.f90 index fac837573..42b139e95 100644 --- a/src/LIB/SURCOUCHE/src/mode_field.f90 +++ b/src/LIB/SURCOUCHE/src/mode_field.f90 @@ -15,7 +15,7 @@ ! 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 +! P. Wautelet 08/10/2021: add Goto_model_1field + Add_field2list procedures + remove Fieldlist_nmodel_resize !----------------------------------------------------------------- module mode_field @@ -34,7 +34,6 @@ 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 @@ -89,7 +88,6 @@ 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 ! @@ -100,8 +98,6 @@ if ( imodel > JPMODELMAX ) & WRITE(YMSG,'("allocating fields for up to ",I4," model(s)")') IMODEL CALL PRINT_MSG(NVERB_DEBUG,'GEN','INI_FIELD_LIST',YMSG) ! -NMODEL_ALLOCATED = IMODEL -! call Add_field2list( TFIELDDATA( & CMNHNAME = 'MNHVERSION', & CSTDNAME = '', & @@ -3385,9 +3381,6 @@ IF (.NOT.LFIELDLIST_ISINIT) THEN 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' ) -! ! MODD_FIELD_n variables ! call Goto_model_1field( 'ZWS', kfrom, kto, xzws ) @@ -4843,434 +4836,4 @@ end if end subroutine Extend_1field_x6d - -subroutine Fieldlist_nmodel_resize( kmodelnew ) - -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 - 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() - 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 - end do - end if - - 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 - 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() - 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 - end do - end if - - 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 - 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() - 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 - end do - end if - - 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 - 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() - 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 - end do - 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 - 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() - 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 - end do - 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 - 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() - 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 - end do - 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 - 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() - 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 - end do - 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 - 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() - 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 - end do - 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 - 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() - 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 - end do - 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 - 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() - 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 - end do - end if - - 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 - 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() - 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 - end do - end if - - 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 - 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() - 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 - end do - end if - - 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 - 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() - 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 - end do - end if - - 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 - 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() - 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 - end do - end if - - 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 - 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() - 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 - end do - end if - - 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 - 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() - 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 - end do - end if - -end do - -nmodel_allocated = kmodelnew - -end subroutine Fieldlist_nmodel_resize - end module mode_field diff --git a/src/MNH/ini_segn.f90 b/src/MNH/ini_segn.f90 index 590efa55c..660947da4 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 @@ -181,7 +181,7 @@ USE MODD_PARAM_n, ONLY: CSURF 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 @@ -457,10 +457,6 @@ CALL READ_EXSEG_n(KMI,TZFILE_DES,YCONF,GFLAT,GUSERV,GUSERC, & YTURB,YTOM,GRMC01,YRAD,YDCONV,YSCONV,YCLOUD,YELEC,YEQNSYS, & PTSTEP_ALL,CSTORAGE_TYPE,CINIFILEPGD_n ) ! -if ( cprogram == 'MESONH' .and. kmi == 1 ) then !Do this only once - call Fieldlist_nmodel_resize(NMODEL) -end if -! IF (CPROGRAM=='SPAWN ' .OR. CPROGRAM=='DIAG ' .OR. CPROGRAM=='SPEC ' & .OR. CPROGRAM=='REAL ') THEN CINIFILE_n = YINIFILE -- GitLab From 189ccba1e7e2176397e86730134dbfadecf976e8 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Thu, 14 Oct 2021 10:16:42 +0200 Subject: [PATCH 010/157] Philippe 14/10/2021: dynamically allocate tfieldlist (+ reallocate if necessary) --- src/LIB/SURCOUCHE/src/modd_field.f90 | 11 ++++++++--- src/LIB/SURCOUCHE/src/mode_field.f90 | 26 +++++++++++++++----------- 2 files changed, 23 insertions(+), 14 deletions(-) diff --git a/src/LIB/SURCOUCHE/src/modd_field.f90 b/src/LIB/SURCOUCHE/src/modd_field.f90 index 277e8ad08..8eecb7d3e 100644 --- a/src/LIB/SURCOUCHE/src/modd_field.f90 +++ b/src/LIB/SURCOUCHE/src/modd_field.f90 @@ -14,6 +14,7 @@ ! 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) !----------------------------------------------------------------- module modd_field @@ -26,9 +27,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 @@ -115,6 +118,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 @@ -216,7 +221,7 @@ TYPE, extends( tfield_metadata_base ) :: TFIELDDATA CHARACTER(LEN=4) :: CLBTYPE = 'NONE' !Type of the lateral boundary (LBX,LBY,LBXU,LBYV) LOGICAL :: LTIMEDEP = .FALSE. !Is the field time-dependent? ! - INTEGER :: NMODELMAX = -1 !Number of models for which the field has been allocated + 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) @@ -243,7 +248,7 @@ END TYPE TFIELDDATA ! integer, save :: NFIELDS_USED = 0 LOGICAL, SAVE :: LFIELDLIST_ISINIT = .FALSE. -TYPE(TFIELDDATA),DIMENSION(MAXFIELDS),SAVE :: TFIELDLIST +TYPE(TFIELDDATA), ALLOCATABLE, DIMENSION(:), SAVE :: TFIELDLIST interface TFIELDDATA module procedure :: Fill_tfielddata diff --git a/src/LIB/SURCOUCHE/src/mode_field.f90 b/src/LIB/SURCOUCHE/src/mode_field.f90 index 42b139e95..326562a42 100644 --- a/src/LIB/SURCOUCHE/src/mode_field.f90 +++ b/src/LIB/SURCOUCHE/src/mode_field.f90 @@ -16,6 +16,7 @@ ! 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) !----------------------------------------------------------------- module mode_field @@ -70,17 +71,14 @@ INTEGER,INTENT(IN),OPTIONAL :: KMODEL INTEGER :: IMODEL CHARACTER(LEN=42) :: YMSG ! -!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') RETURN END IF LFIELDLIST_ISINIT = .TRUE. +Allocate( tfieldlist(NMAXFIELDINIT) ) +NMAXFIELDS = NMAXFIELDINIT ! IF (PRESENT(KMODEL)) THEN IMODEL = KMODEL @@ -3098,7 +3096,7 @@ call Add_field2list( TFIELDDATA( & LTIMEDEP = .FALSE. ) ) ! ! -WRITE(YMSG,'("number of used fields=",I4," out of ",I4)') nfields_used-1,MAXFIELDS +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 @@ -3749,11 +3747,17 @@ implicit none type(tfielddata) :: tpfield -CHARACTER(LEN=42) :: YMSG - -if ( nfields_used >= MAXFIELDS ) then - WRITE(YMSG,'( "nfields_used>=MAXFIELDS (",I5,")" )') MAXFIELDS - CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_FIELD_LIST',TRIM(YMSG)) +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 -- GitLab From 4ddf3ee0a29bec6471abdbb7ac3bcc06a320f9fc Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Thu, 14 Oct 2021 10:19:04 +0200 Subject: [PATCH 011/157] Philippe 14/10/2021: improve slightly FIND_FIELD_ID_FROM_MNHNAME --- src/LIB/SURCOUCHE/src/mode_field.f90 | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/LIB/SURCOUCHE/src/mode_field.f90 b/src/LIB/SURCOUCHE/src/mode_field.f90 index 326562a42..89d2b8d16 100644 --- a/src/LIB/SURCOUCHE/src/mode_field.f90 +++ b/src/LIB/SURCOUCHE/src/mode_field.f90 @@ -3151,14 +3151,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 + 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 @@ -3172,8 +3170,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 -- GitLab From a309c489646d0bca24ea471965fd3ec92f56ce6c Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Thu, 14 Oct 2021 10:44:38 +0200 Subject: [PATCH 012/157] Philippe 14/10/2021: INI_FIELD_LIST: remove KMODEL dummy argument (not used anymore) --- LIBTOOLS/tools/lfi2cdf/src/lfi2cdf.f90 | 4 ++-- src/LIB/SURCOUCHE/src/mode_field.f90 | 31 ++++++-------------------- src/MNH/ini_segn.f90 | 8 +++---- src/MNH/latlon_to_xy.f90 | 4 ++-- src/MNH/mnh2lpdm.f90 | 4 ++-- src/MNH/prep_ideal_case.f90 | 2 +- src/MNH/prep_nest_pgd.f90 | 2 +- src/MNH/prep_pgd.f90 | 2 +- src/MNH/prep_real_case.f90 | 2 +- src/MNH/prep_surfex.f90 | 2 +- src/MNH/xy_to_latlon.f90 | 4 ++-- 11 files changed, 23 insertions(+), 42 deletions(-) diff --git a/LIBTOOLS/tools/lfi2cdf/src/lfi2cdf.f90 b/LIBTOOLS/tools/lfi2cdf/src/lfi2cdf.f90 index 39bb56a69..106804883 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/src/LIB/SURCOUCHE/src/mode_field.f90 b/src/LIB/SURCOUCHE/src/mode_field.f90 index 89d2b8d16..b8674cc39 100644 --- a/src/LIB/SURCOUCHE/src/mode_field.f90 +++ b/src/LIB/SURCOUCHE/src/mode_field.f90 @@ -60,42 +60,25 @@ 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 :: IMODEL -CHARACTER(LEN=42) :: YMSG -! + +CHARACTER(LEN=64) :: YMSG + 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') RETURN END IF + LFIELDLIST_ISINIT = .TRUE. + Allocate( tfieldlist(NMAXFIELDINIT) ) NMAXFIELDS = NMAXFIELDINIT -! -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 - 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) -! + call Add_field2list( TFIELDDATA( & CMNHNAME = 'MNHVERSION', & CSTDNAME = '', & diff --git a/src/MNH/ini_segn.f90 b/src/MNH/ini_segn.f90 index 660947da4..7cd8620da 100644 --- a/src/MNH/ini_segn.f90 +++ b/src/MNH/ini_segn.f90 @@ -369,13 +369,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 diff --git a/src/MNH/latlon_to_xy.f90 b/src/MNH/latlon_to_xy.f90 index 972999064..98b134a36 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/mnh2lpdm.f90 b/src/MNH/mnh2lpdm.f90 index d7ed74c74..deb8dda23 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/prep_ideal_case.f90 b/src/MNH/prep_ideal_case.f90 index 370e21412..0a4aa09b9 100644 --- a/src/MNH/prep_ideal_case.f90 +++ b/src/MNH/prep_ideal_case.f90 @@ -712,7 +712,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() ! diff --git a/src/MNH/prep_nest_pgd.f90 b/src/MNH/prep_nest_pgd.f90 index 80b493fbc..e894cd407 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 046ddde78..2df254d5e 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 2796da451..7014fc3b2 100644 --- a/src/MNH/prep_real_case.f90 +++ b/src/MNH/prep_real_case.f90 @@ -638,7 +638,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() ! diff --git a/src/MNH/prep_surfex.f90 b/src/MNH/prep_surfex.f90 index 68ec7b3a8..547f5b1bc 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/xy_to_latlon.f90 b/src/MNH/xy_to_latlon.f90 index f8782a519..4537388a1 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 ! ------------------------ -- GitLab From 89c4f1772cac04ee9f2b30a254d7c1548df99517 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Fri, 22 Oct 2021 14:11:10 +0200 Subject: [PATCH 013/157] Philippe 22/10/2021: Fill_tfielddata: cmnhname is now optional --- src/LIB/SURCOUCHE/src/modd_field.f90 | 73 ++++++++++++++++------------ 1 file changed, 41 insertions(+), 32 deletions(-) diff --git a/src/LIB/SURCOUCHE/src/modd_field.f90 b/src/LIB/SURCOUCHE/src/modd_field.f90 index 8eecb7d3e..a192ac851 100644 --- a/src/LIB/SURCOUCHE/src/modd_field.f90 +++ b/src/LIB/SURCOUCHE/src/modd_field.f90 @@ -263,7 +263,7 @@ type(tfielddata) function Fill_tfielddata( cmnhname, cstdname, clongname, cunits use mode_msg - character(len=*), intent(in) :: cmnhname + character(len=*), optional, intent(in) :: cmnhname character(len=*), optional, intent(in) :: cstdname character(len=*), optional, intent(in) :: clongname character(len=*), optional, intent(in) :: cunits @@ -283,11 +283,18 @@ type(tfielddata) function Fill_tfielddata( cmnhname, cstdname, clongname, cunits character(len=*), optional, intent(in) :: clbtype logical, optional, intent(in) :: ltimedep + character(len=:), allocatable :: ymnhname + ! cmnhname - 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 ) ) + 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 @@ -295,7 +302,7 @@ type(tfielddata) function Fill_tfielddata( cmnhname, cstdname, clongname, cunits 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( cmnhname ) ) + // ' for variable ' // Trim( ymnhname ) ) end if ! clongname @@ -304,7 +311,7 @@ type(tfielddata) function Fill_tfielddata( cmnhname, cstdname, clongname, cunits 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( cmnhname ) ) + // ' for variable ' // Trim( ymnhname ) ) end if ! cunits @@ -313,7 +320,7 @@ type(tfielddata) function Fill_tfielddata( cmnhname, cstdname, clongname, 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( cmnhname ) ) + // ' for variable ' // Trim( ymnhname ) ) end if ! ccomment @@ -328,7 +335,7 @@ type(tfielddata) function Fill_tfielddata( cmnhname, cstdname, clongname, cunits 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( cmnhname ) ) + 'invalid value of ngrid for variable ' // Trim( ymnhname ) ) else tpfield%ngrid = ngrid end if @@ -337,7 +344,7 @@ type(tfielddata) function Fill_tfielddata( cmnhname, cstdname, clongname, cunits ! ntype if ( All( ntype /= [ TYPEINT, TYPELOG, TYPEREAL, TYPECHAR, TYPEDATE ] ) ) & call Print_msg( NVERB_ERROR, 'GEN', 'Fill_tfielddata', & - 'invalid value of ntype for variable ' // Trim( cmnhname ) ) + 'invalid value of ntype for variable ' // Trim( ymnhname ) ) tpfield%ntype = ntype ! ndims @@ -346,26 +353,26 @@ type(tfielddata) function Fill_tfielddata( cmnhname, cstdname, clongname, cunits case ( TYPECHAR ) if ( ndims < 0 .or. ndims > 1 ) & call Print_msg( NVERB_ERROR, 'GEN', 'Fill_tfielddata', 'invalid value of ndims for variable ' & - // Trim( cmnhname ) // ' of type TYPECHAR' ) + // 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( cmnhname ) // ' of type TYPELOG' ) + // 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( cmnhname ) // ' of type TYPEINT' ) + // 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( cmnhname ) // ' of type TYPEREAL' ) + // 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( cmnhname ) // ' of type TYPEDATE' ) + // Trim( ymnhname ) // ' of type TYPEDATE' ) case default call Print_msg( NVERB_ERROR, 'GEN', 'Fill_tfielddata', & - 'invalid value of ntype for variable ' // Trim( cmnhname ) ) + 'invalid value of ntype for variable ' // Trim( ymnhname ) ) end select tpfield%ndims = ndims @@ -374,7 +381,7 @@ type(tfielddata) function Fill_tfielddata( cmnhname, cstdname, clongname, cunits ! 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( cmnhname ) ) + 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 @@ -382,23 +389,25 @@ type(tfielddata) function Fill_tfielddata( cmnhname, cstdname, clongname, cunits !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 == 3 ) 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( cmnhname ) ) + 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( cmnhname ) ) + 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( cmnhname ) ) + 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( cmnhname ) ) + '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 @@ -412,7 +421,7 @@ type(tfielddata) function Fill_tfielddata( cmnhname, cstdname, clongname, cunits if ( Present( nfillvalue ) ) then if ( ntype /= TYPEINT ) & call Print_msg( NVERB_WARNING, 'GEN', 'Fill_tfielddata', & - 'nfillvalue provided for the non-integer variable ' // Trim( cmnhname ) ) + 'nfillvalue provided for the non-integer variable ' // Trim( ymnhname ) ) tpfield%nfillvalue = nfillvalue end if @@ -420,7 +429,7 @@ type(tfielddata) function Fill_tfielddata( cmnhname, cstdname, clongname, cunits if ( Present( xfillvalue ) ) then if ( ntype /= TYPEREAL ) & call Print_msg( NVERB_WARNING, 'GEN', 'Fill_tfielddata', & - 'xfillvalue provided for the non-real variable ' // Trim( cmnhname ) ) + 'xfillvalue provided for the non-real variable ' // Trim( ymnhname ) ) tpfield%xfillvalue = xfillvalue end if @@ -428,7 +437,7 @@ type(tfielddata) function Fill_tfielddata( cmnhname, cstdname, clongname, cunits if ( Present( nvalidmin ) ) then if ( ntype /= TYPEINT ) & call Print_msg( NVERB_WARNING, 'GEN', 'Fill_tfielddata', & - 'nvalidmin provided for the non-integer variable ' // Trim( cmnhname ) ) + 'nvalidmin provided for the non-integer variable ' // Trim( ymnhname ) ) tpfield%nvalidmin = nvalidmin end if @@ -436,10 +445,10 @@ type(tfielddata) function Fill_tfielddata( cmnhname, cstdname, clongname, cunits if ( Present( nvalidmax ) ) then if ( ntype /= TYPEINT ) & call Print_msg( NVERB_WARNING, 'GEN', 'Fill_tfielddata', & - 'nvalidmax provided for the non-integer variable ' // Trim( cmnhname ) ) + '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( cmnhname ) ) + call Print_msg( NVERB_WARNING, 'GEN', 'Fill_tfielddata', 'nvalidmax < nvalidmin for variable ' // Trim( ymnhname ) ) end if tpfield%nvalidmax = nvalidmax end if @@ -448,7 +457,7 @@ type(tfielddata) function Fill_tfielddata( cmnhname, cstdname, clongname, cunits if ( Present( xvalidmin ) ) then if ( ntype /= TYPEREAL ) & call Print_msg( NVERB_WARNING, 'GEN', 'Fill_tfielddata', & - 'xvalidmin provided for the non-real variable ' // Trim( cmnhname ) ) + 'xvalidmin provided for the non-real variable ' // Trim( ymnhname ) ) tpfield%xvalidmin = xvalidmin end if @@ -456,10 +465,10 @@ type(tfielddata) function Fill_tfielddata( cmnhname, cstdname, clongname, cunits if ( Present( xvalidmax ) ) then if ( ntype /= TYPEREAL ) & call Print_msg( NVERB_WARNING, 'GEN', 'Fill_tfielddata', & - 'xvalidmax provided for the non-real variable ' // Trim( cmnhname ) ) + '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( cmnhname ) ) + call Print_msg( NVERB_WARNING, 'GEN', 'Fill_tfielddata', 'xvalidmax < xvalidmin for variable ' // Trim( ymnhname ) ) end if tpfield%xvalidmax = xvalidmax end if @@ -470,7 +479,7 @@ type(tfielddata) function Fill_tfielddata( cmnhname, cstdname, clongname, cunits tpfield%cdir = cdir else call Print_msg( NVERB_ERROR, 'GEN', 'Fill_tfielddata', & - 'invalid value of cdir (' // Trim( cdir ) // ') for variable ' // Trim( cmnhname ) ) + 'invalid value of cdir (' // Trim( cdir ) // ') for variable ' // Trim( ymnhname ) ) end if end if @@ -480,7 +489,7 @@ type(tfielddata) function Fill_tfielddata( cmnhname, cstdname, clongname, cunits tpfield%clbtype = clbtype else call Print_msg( NVERB_ERROR, 'GEN', 'Fill_tfielddata', & - 'invalid value of clbtype (' // Trim( clbtype ) // ') for variable ' // Trim( cmnhname ) ) + 'invalid value of clbtype (' // Trim( clbtype ) // ') for variable ' // Trim( ymnhname ) ) end if end if -- GitLab From b3f0e4f9348028800041363e25db72b8d3797092 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Fri, 22 Oct 2021 14:40:03 +0200 Subject: [PATCH 014/157] Philippe 22/10/2021: use the custom constructor for tfielddata type --- src/LIB/SURCOUCHE/src/mode_io_tools.f90 | 23 +- src/MNH/advection_metsv.f90 | 84 +- src/MNH/c2r2_adjust.f90 | 21 +- src/MNH/call_rttov11.f90 | 27 +- src/MNH/call_rttov13.f90 | 31 +- src/MNH/call_rttov8.f90 | 115 +- src/MNH/compute_r00.f90 | 139 +- src/MNH/free_atm_profile.f90 | 91 +- src/MNH/ini_aircraft_balloon.f90 | 107 +- src/MNH/ini_deep_convection.f90 | 17 +- src/MNH/ini_lb.f90 | 37 +- src/MNH/khko_notadjust.f90 | 42 +- src/MNH/lima_adjust.f90 | 42 +- src/MNH/lima_adjust_split.f90 | 42 +- src/MNH/lima_ccn_activation.f90 | 42 +- src/MNH/lima_notadjust.f90 | 21 +- src/MNH/lima_warm_nucl.f90 | 42 +- src/MNH/menu_diachro.f90 | 84 +- src/MNH/mnh2lpdm_ech.f90 | 87 +- src/MNH/mnh2lpdm_ini.f90 | 19 +- src/MNH/paspol.f90 | 26 +- src/MNH/prandtl.f90 | 105 +- src/MNH/radiations.f90 | 804 +++----- src/MNH/rain_c2r2_khko.f90 | 84 +- src/MNH/read_dummy_gr_fieldn.f90 | 48 +- src/MNH/read_surf_mnh.f90 | 190 +- src/MNH/shallow_mf_pack.f90 | 105 +- src/MNH/tke_eps_sources.f90 | 84 +- src/MNH/turb.f90 | 169 +- src/MNH/turb_cloud_index.f90 | 168 +- src/MNH/turb_hor_dyn_corr.f90 | 63 +- src/MNH/turb_hor_sv_flux.f90 | 45 +- src/MNH/turb_hor_thermo_corr.f90 | 63 +- src/MNH/turb_hor_thermo_flux.f90 | 126 +- src/MNH/turb_hor_uv.f90 | 21 +- src/MNH/turb_hor_uw.f90 | 21 +- src/MNH/turb_hor_vw.f90 | 21 +- src/MNH/turb_ver.f90 | 58 +- src/MNH/turb_ver_dyn_flux.f90 | 63 +- src/MNH/turb_ver_sv_flux.f90 | 23 +- src/MNH/turb_ver_thermo_corr.f90 | 63 +- src/MNH/turb_ver_thermo_flux.f90 | 63 +- src/MNH/ver_thermo.f90 | 23 +- src/MNH/write_balloonn.f90 | 107 +- src/MNH/write_budget.f90 | 103 +- src/MNH/write_diachro.f90 | 339 ++-- src/MNH/write_dummy_gr_fieldn.f90 | 44 +- src/MNH/write_lbn.f90 | 46 +- src/MNH/write_lfifm1_for_diag.f90 | 2297 ++++++++++++----------- src/MNH/write_lfifm1_for_diag_supp.f90 | 826 ++++---- src/MNH/write_lfin.f90 | 1085 ++++++----- src/MNH/write_surf_mnh.f90 | 105 +- src/MNH/zsmt_pgd.f90 | 67 +- 53 files changed, 4341 insertions(+), 4227 deletions(-) diff --git a/src/LIB/SURCOUCHE/src/mode_io_tools.f90 b/src/LIB/SURCOUCHE/src/mode_io_tools.f90 index 42236655f..193083863 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. @@ -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 = tfielddata( & + 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/MNH/advection_metsv.f90 b/src/MNH/advection_metsv.f90 index cd93fe4fa..107970bb1 100644 --- a/src/MNH/advection_metsv.f90 +++ b/src/MNH/advection_metsv.f90 @@ -366,54 +366,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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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/c2r2_adjust.f90 b/src/MNH/c2r2_adjust.f90 index b97914d1a..0112cd87a 100644 --- a/src/MNH/c2r2_adjust.f90 +++ b/src/MNH/c2r2_adjust.f90 @@ -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 = TFIELDDATA( & + 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/MNH/call_rttov11.f90 b/src/MNH/call_rttov11.f90 index e9eda58c8..e6a43b03e 100644 --- a/src/MNH/call_rttov11.f90 +++ b/src/MNH/call_rttov11.f90 @@ -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 = TFIELDDATA( & + 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 97ccf20af..5c427dce7 100644 --- a/src/MNH/call_rttov13.f90 +++ b/src/MNH/call_rttov13.f90 @@ -262,6 +262,7 @@ 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 !------------------------------------------------------------------------------- @@ -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 = TFIELDDATA( & + 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 946021f40..d38a71c2b 100644 --- a/src/MNH/call_rttov8.f90 +++ b/src/MNH/call_rttov8.f90 @@ -686,6 +686,7 @@ 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) +CHARACTER(LEN=:), ALLOCATABLE :: YMNHNAME, YUNITS, YCOMMENT TYPE(TFIELDDATA) :: TZFIELD ! - End of header -------------------------------------------------------- @@ -1567,16 +1568,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 = TFIELDDATA( & + 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 +1621,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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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 +1727,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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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/compute_r00.f90 b/src/MNH/compute_r00.f90 index 692fb3a1e..85f43d0d2 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. @@ -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 @@ -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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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/free_atm_profile.f90 b/src/MNH/free_atm_profile.f90 index 50496da72..34fefa20a 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. @@ -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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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/ini_aircraft_balloon.f90 b/src/MNH/ini_aircraft_balloon.f90 index 0b22d3403..f5938cbc1 100644 --- a/src/MNH/ini_aircraft_balloon.f90 +++ b/src/MNH/ini_aircraft_balloon.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. @@ -474,69 +474,74 @@ END IF 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. + TZFIELD = TFIELDDATA( & + CMNHNAME = TRIM(TPFLYER%TITLE)//'LAT', & + CSTDNAME = '', & + CLONGNAME = TRIM(TPFLYER%TITLE)//'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 WRITE(ILUOUT,*) "INI_LAUCH: Initial location take for ",TPFLYER%TITLE 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. + TZFIELD = TFIELDDATA( & + CMNHNAME = TRIM(TPFLYER%TITLE)//'LON', & + CSTDNAME = '', & + CLONGNAME = TRIM(TPFLYER%TITLE)//'LON', & + CUNITS = 'degree', & + CDIR = '--', & + CCOMMENT = '', & + NGRID = 0, & + NTYPE = TYPEREAL, & + NDIMS = 0, & + 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. + TZFIELD = TFIELDDATA( & + CMNHNAME = TRIM(TPFLYER%TITLE)//'ALT', & + CSTDNAME = '', & + CLONGNAME = TRIM(TPFLYER%TITLE)//'ALT', & + CUNITS = 'm', & + CDIR = '--', & + CCOMMENT = '', & + NGRID = 0, & + NTYPE = TYPEREAL, & + NDIMS = 0, & + 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. + TZFIELD = TFIELDDATA( & + CMNHNAME = TRIM(TPFLYER%TITLE)//'WASCENT', & + CSTDNAME = '', & + CLONGNAME = TRIM(TPFLYER%TITLE)//'WASCENT', & + CUNITS = 'm s-1', & + CDIR = '--', & + CCOMMENT = '', & + NGRID = 0, & + NTYPE = TYPEREAL, & + NDIMS = 0, & + 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. + TZFIELD = TFIELDDATA( & + CMNHNAME = TRIM(TPFLYER%TITLE)//'RHO', & + CSTDNAME = '', & + CLONGNAME = TRIM(TPFLYER%TITLE)//'RHO', & + CUNITS = 'kg m-3', & + CDIR = '--', & + CCOMMENT = '', & + NGRID = 0, & + NTYPE = TYPEREAL, & + NDIMS = 0, & + LTIMEDEP = .TRUE. ) CALL IO_Field_read(TPINIFILE,TZFIELD,TPFLYER%RHO) ! CALL SM_XYHAT(PLATOR,PLONOR,& diff --git a/src/MNH/ini_deep_convection.f90 b/src/MNH/ini_deep_convection.f90 index f4747410b..447fac0b0 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-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. @@ -260,13 +260,14 @@ ELSE ! 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. + TZFIELD = TFIELDDATA( & + 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 diff --git a/src/MNH/ini_lb.f90 b/src/MNH/ini_lb.f90 index b4d44b50a..b91b85868 100644 --- a/src/MNH/ini_lb.f90 +++ b/src/MNH/ini_lb.f90 @@ -361,17 +361,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 = TFIELDDATA( & + 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 +390,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 = TFIELDDATA( & + CUNITS = 'kg kg-1', & + CDIR = '', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ! IRR=0 JRR=1 diff --git a/src/MNH/khko_notadjust.f90 b/src/MNH/khko_notadjust.f90 index 344c2e976..b69b6a18a 100644 --- a/src/MNH/khko_notadjust.f90 +++ b/src/MNH/khko_notadjust.f90 @@ -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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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/lima_adjust.f90 b/src/MNH/lima_adjust.f90 index 31ea1fefa..0a7f2a4de 100644 --- a/src/MNH/lima_adjust.f90 +++ b/src/MNH/lima_adjust.f90 @@ -1187,16 +1187,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 = TFIELDDATA( & + 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 ! @@ -1242,16 +1243,17 @@ IF ( tpfile%lopened ) THEN ZW1(:,:,:)= 2.0*PPABST(:,:,:)-PPABSM(:,:,:) 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 = TFIELDDATA( & + 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/MNH/lima_adjust_split.f90 b/src/MNH/lima_adjust_split.f90 index 6f7dbb738..67eefa30b 100644 --- a/src/MNH/lima_adjust_split.f90 +++ b/src/MNH/lima_adjust_split.f90 @@ -726,16 +726,17 @@ IF ( OSUBG_COND ) THEN END IF ! fin test OSUBG_COND 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 = TFIELDDATA( & + 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 ! @@ -781,16 +782,17 @@ IF ( tpfile%lopened ) THEN ZW1(:,:,:)= 2.0*PPABST(:,:,:)-PPABSM(:,:,:) 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 = TFIELDDATA( & + 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/MNH/lima_ccn_activation.f90 b/src/MNH/lima_ccn_activation.f90 index b7786ea4f..2c2902a37 100644 --- a/src/MNH/lima_ccn_activation.f90 +++ b/src/MNH/lima_ccn_activation.f90 @@ -488,28 +488,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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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/MNH/lima_notadjust.f90 b/src/MNH/lima_notadjust.f90 index 94ea1f4fd..e1eb550e4 100644 --- a/src/MNH/lima_notadjust.f90 +++ b/src/MNH/lima_notadjust.f90 @@ -566,16 +566,17 @@ END IF ! 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 = TFIELDDATA( & + 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/MNH/lima_warm_nucl.f90 b/src/MNH/lima_warm_nucl.f90 index 549a5fc84..8f50a8798 100644 --- a/src/MNH/lima_warm_nucl.f90 +++ b/src/MNH/lima_warm_nucl.f90 @@ -513,28 +513,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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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/MNH/menu_diachro.f90 b/src/MNH/menu_diachro.f90 index 7c4fcea5a..88149a569 100644 --- a/src/MNH/menu_diachro.f90 +++ b/src/MNH/menu_diachro.f90 @@ -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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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/mnh2lpdm_ech.f90 b/src/MNH/mnh2lpdm_ech.f90 index 67eb3ed1c..62d3d9939 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. @@ -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 = tfielddata( & + 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 = tfielddata( & + 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 = tfielddata( & + 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 = tfielddata( & + 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 = tfielddata( & + 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 a430219a2..52a31e084 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. @@ -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 = tfielddata( & + 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/paspol.f90 b/src/MNH/paspol.f90 index b3043a864..19ef98129 100644 --- a/src/MNH/paspol.f90 +++ b/src/MNH/paspol.f90 @@ -141,7 +141,7 @@ 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 @@ -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 = TFIELDDATA( & + 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/prandtl.f90 b/src/MNH/prandtl.f90 index fbfe0a762..370e025c4 100644 --- a/src/MNH/prandtl.f90 +++ b/src/MNH/prandtl.f90 @@ -538,68 +538,73 @@ END IF ! end of HTURBDIM if-block 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 = TFIELDDATA( & + 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(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 = TFIELDDATA( & + 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(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 = TFIELDDATA( & + 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(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 = TFIELDDATA( & + 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(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 = TFIELDDATA( & + 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(TPFILE,TZFIELD,PRED2THR3) ! END IF diff --git a/src/MNH/radiations.f90 b/src/MNH/radiations.f90 index e0bda3fca..b6151ba3f 100644 --- a/src/MNH/radiations.f90 +++ b/src/MNH/radiations.f90 @@ -535,7 +535,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(TFIELDDATA) :: TZFIELD2D, TZFIELD3D ! REAL, DIMENSION(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3)) :: ZDZPABST REAL :: ZMINVAL @@ -2684,6 +2684,24 @@ IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN ZSTORE_3D2(:,:,:) = 0.0 ZSTORE_2D(:,:) = 0.0 ! + TZFIELD2D = TFIELDDATA( & + CMNHNAME = 'generic 2D for radiations', & !Temporary name to ease identification + CSTDNAME = '', & + CDIR = 'XY', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) + + TZFIELD3D = TFIELDDATA( & + 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 @@ -2698,17 +2716,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 @@ -2719,17 +2731,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 @@ -2740,17 +2746,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 @@ -2761,17 +2761,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 @@ -2782,17 +2776,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 @@ -2803,17 +2791,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 @@ -2822,17 +2804,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 @@ -2841,17 +2817,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 @@ -2859,17 +2829,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 @@ -2877,17 +2841,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 @@ -2895,17 +2853,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 ! ! @@ -2919,17 +2871,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 @@ -2940,17 +2886,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 @@ -2961,17 +2901,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 @@ -2982,17 +2916,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 @@ -3003,17 +2931,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 @@ -3024,17 +2946,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 @@ -3045,17 +2961,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 @@ -3066,17 +2976,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 @@ -3084,17 +2988,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 @@ -3102,17 +3000,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 @@ -3120,17 +3012,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 ! ! @@ -3141,17 +3027,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 @@ -3159,17 +3039,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 @@ -3177,17 +3051,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 @@ -3195,17 +3063,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 @@ -3213,17 +3075,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 @@ -3231,17 +3087,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 @@ -3257,17 +3107,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 @@ -3278,17 +3122,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 @@ -3299,17 +3137,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 @@ -3320,17 +3152,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 @@ -3341,17 +3167,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 @@ -3362,17 +3182,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 @@ -3383,17 +3197,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 @@ -3404,17 +3212,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 @@ -3431,41 +3233,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 @@ -3478,17 +3262,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 @@ -3499,17 +3277,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 @@ -3520,17 +3292,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 ! @@ -3548,17 +3314,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 ! @@ -3579,17 +3339,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 @@ -3608,17 +3362,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 @@ -3637,17 +3385,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 @@ -3666,17 +3408,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 @@ -3695,17 +3431,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 @@ -3724,17 +3454,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/rain_c2r2_khko.f90 b/src/MNH/rain_c2r2_khko.f90 index 5708c0d4c..2aa49c4a4 100644 --- a/src/MNH/rain_c2r2_khko.f90 +++ b/src/MNH/rain_c2r2_khko.f90 @@ -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 = TFIELDDATA( & +! 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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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/MNH/read_dummy_gr_fieldn.f90 b/src/MNH/read_dummy_gr_fieldn.f90 index 80f9ceefd..7aa4136af 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. @@ -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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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_surf_mnh.f90 b/src/MNH/read_surf_mnh.f90 index f051ed739..881e58362 100644 --- a/src/MNH/read_surf_mnh.f90 +++ b/src/MNH/read_surf_mnh.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. @@ -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: tfielddata, tfieldlist use mode_field, only: Find_field_id_from_mnhname ! CHARACTER(LEN=LEN_HREC),INTENT(IN) :: HREC ! name of the article to write @@ -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 = TFIELDDATA( & + 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 @@ -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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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) @@ -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 = TFIELDDATA( & + 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 = YDIR1 - TZFIELD%CCOMMENT = 'X_Y_'//TRIM(YREC) - TZFIELD%NGRID = 4 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 2 - TZFIELD%LTIMEDEP = .FALSE. + TZFIELD = TFIELDDATA( & + CMNHNAME = TRIM(YREC), & + CSTDNAME = '', & + CLONGNAME = TRIM(YREC), & + CUNITS = '', & + CDIR = YDIR1, & + 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' ) @@ -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 = TFIELDDATA( & + 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 @@ -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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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/shallow_mf_pack.f90 b/src/MNH/shallow_mf_pack.f90 index d5c0bbdfe..b898b4bda 100644 --- a/src/MNH/shallow_mf_pack.f90 +++ b/src/MNH/shallow_mf_pack.f90 @@ -395,72 +395,77 @@ end if IF ( OMF_FLX .AND. tpfile%lopened ) THEN ! stores the conservative potential temperature vertical flux ZWORK(:,:,:)=RESHAPE(ZFLXZTHMF (:,:),(/ IIU,IJU,IKU /) ) - 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 = TFIELDDATA( & + 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,ZWORK) ! ! stores the conservative mixing ratio vertical flux ZWORK(:,:,:)=RESHAPE(ZFLXZRMF(:,:),(/ IIU,IJU,IKU /) ) - 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 = TFIELDDATA( & + 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,ZWORK) ! ! 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 = TFIELDDATA( & + 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 (OMIXUV) THEN ! stores the U momentum vertical flux ZWORK(:,:,:)=RESHAPE(ZFLXZUMF(:,:),(/ IIU,IJU,IKU /) ) - 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 = TFIELDDATA( & + 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,ZWORK) ! ! stores the V momentum vertical flux ZWORK(:,:,:)=RESHAPE(ZFLXZVMF(:,:),(/ IIU,IJU,IKU /) ) - 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 = TFIELDDATA( & + 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,ZWORK) ! END IF diff --git a/src/MNH/tke_eps_sources.f90 b/src/MNH/tke_eps_sources.f90 index 4efe246be..40a902d17 100644 --- a/src/MNH/tke_eps_sources.f90 +++ b/src/MNH/tke_eps_sources.f90 @@ -415,58 +415,62 @@ IF ( OTURB_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 = TFIELDDATA( & + 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(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 = TFIELDDATA( & + 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(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 = TFIELDDATA( & + 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(TPFILE,TZFIELD,PTR) ! ! 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 = TFIELDDATA( & + 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(TPFILE,TZFIELD,PDISS) END IF ! diff --git a/src/MNH/turb.f90 b/src/MNH/turb.f90 index 228241e2c..44178ca88 100644 --- a/src/MNH/turb.f90 +++ b/src/MNH/turb.f90 @@ -699,28 +699,30 @@ IF (KRRL >=1) THEN ! ! IF ( tpfile%lopened .AND. OTURB_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 = TFIELDDATA( & + 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(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 = TFIELDDATA( & + 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(TPFILE,TZFIELD,ZAMOIST) END IF ! @@ -1152,46 +1154,49 @@ IF ( OTURB_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 = TFIELDDATA( & + CMNHNAME = 'LM', & + CSTDNAME = '', & + CLONGNAME = 'LM', & + CUNITS = 'm', & + CDIR = 'XY', & + CCOMMENT = 'Mixing length', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,PLEM) ! 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 = TFIELDDATA( & + 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(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 = TFIELDDATA( & + 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(TPFILE,TZFIELD,PRT(:,:,:,1)) END IF END IF @@ -1820,16 +1825,17 @@ ENDIF ! ! Impression before modification of the mixing length IF ( OTURB_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 = TFIELDDATA( & + 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(TPFILE,TZFIELD,PLEM) ENDIF ! @@ -1846,27 +1852,30 @@ WHERE (PCEI(:,:,:) == -1.) PLEM(:,:,:) = ZLM_CLOUD(:,:,:) ! ---------- ! IF ( OTURB_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 = TFIELDDATA( & + 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(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 = TFIELDDATA( & + 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(TPFILE,TZFIELD,ZLM_CLOUD) ! ENDIF diff --git a/src/MNH/turb_cloud_index.f90 b/src/MNH/turb_cloud_index.f90 index c194db611..44392d8fa 100644 --- a/src/MNH/turb_cloud_index.f90 +++ b/src/MNH/turb_cloud_index.f90 @@ -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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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/turb_hor_dyn_corr.f90 b/src/MNH/turb_hor_dyn_corr.f90 index 2a4a3e98d..a0c5ad948 100644 --- a/src/MNH/turb_hor_dyn_corr.f90 +++ b/src/MNH/turb_hor_dyn_corr.f90 @@ -371,16 +371,17 @@ ZFLX(:,:,IKB-1) = 2. * ZFLX(:,:,IKB-1) - ZFLX(:,:,IKB) CALL UPDATE_HALO_ll(TZFIELDS_ll, IINFO_ll) IF ( tpfile%lopened .AND. OTURB_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. + TZFIELD = TFIELDDATA( & + 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 ! @@ -466,16 +467,17 @@ CALL UPDATE_HALO_ll(TZFIELDS_ll, IINFO_ll) ! IF ( tpfile%lopened .AND. OTURB_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. + TZFIELD = TFIELDDATA( & + 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 ! @@ -553,16 +555,17 @@ ZFLX(:,:,IKB-1) = 2. * ZFLX(:,:,IKB-1) - ZFLX(:,:,IKB) ! IF ( tpfile%lopened .AND. OTURB_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. + TZFIELD = TFIELDDATA( & + 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 ! diff --git a/src/MNH/turb_hor_sv_flux.f90 b/src/MNH/turb_hor_sv_flux.f90 index 163ee3d02..de501f779 100644 --- a/src/MNH/turb_hor_sv_flux.f90 +++ b/src/MNH/turb_hor_sv_flux.f90 @@ -185,6 +185,7 @@ 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 REAL :: ZTIME1, ZTIME2 @@ -248,16 +249,18 @@ DO JSV=1,ISV ! ! stores <U SVth> IF ( tpfile%lopened .AND. OTURB_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. + WRITE(YMNHNAME,'("USV_FLX_",I3.3)') JSV + TZFIELD = TFIELDDATA( & + 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 ! @@ -299,16 +302,18 @@ DO JSV=1,ISV ! ! stores <V SVth> IF ( tpfile%lopened .AND. OTURB_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. + WRITE(YMNHNAME,'("VSV_FLX_",I3.3)') JSV + TZFIELD = TFIELDDATA( & + 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 ! diff --git a/src/MNH/turb_hor_thermo_corr.f90 b/src/MNH/turb_hor_thermo_corr.f90 index b61948676..d5102212b 100644 --- a/src/MNH/turb_hor_thermo_corr.f90 +++ b/src/MNH/turb_hor_thermo_corr.f90 @@ -266,16 +266,17 @@ IF ( ( KRRL > 0 .AND. OSUBG_COND) .OR. ( OTURB_FLX .AND. tpfile%lopened ) & ! ! stores <THl THl> IF ( OTURB_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 = TFIELDDATA( & + 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 ! @@ -354,16 +355,17 @@ IF ( ( KRRL > 0 .AND. OSUBG_COND) .OR. ( OTURB_FLX .AND. tpfile%lopened ) & ! ! stores <THl Rnp> IF ( OTURB_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 = TFIELDDATA( & + 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 ! @@ -422,16 +424,17 @@ IF ( ( KRRL > 0 .AND. OSUBG_COND) .OR. ( OTURB_FLX .AND. tpfile%lopened ) & ! ! stores <Rnp Rnp> IF ( OTURB_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 = TFIELDDATA( & + 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/MNH/turb_hor_thermo_flux.f90 b/src/MNH/turb_hor_thermo_flux.f90 index 90d189a2b..a4dd3bdee 100644 --- a/src/MNH/turb_hor_thermo_flux.f90 +++ b/src/MNH/turb_hor_thermo_flux.f90 @@ -311,16 +311,17 @@ END IF ! ! stores the horizontal <U THl> IF ( tpfile%lopened .AND. OTURB_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 = TFIELDDATA( & + 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 ! @@ -414,16 +415,17 @@ IF (KRR/=0) THEN ! ! stores the horizontal <U Rnp> IF ( tpfile%lopened .AND. OTURB_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 = TFIELDDATA( & + 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 ! @@ -463,16 +465,17 @@ END IF !! ! !! ! stores the horizontal <U VPT> !! IF ( tpfile%lopened .AND. OTURB_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 = TFIELDDATA( & +!! 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 !!! @@ -566,16 +569,17 @@ END IF ! ! stores the horizontal <V THl> IF ( tpfile%lopened .AND. OTURB_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 = TFIELDDATA( & + 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 ! @@ -678,16 +682,17 @@ IF (KRR/=0) THEN ! ! stores the horizontal <V Rnp> IF ( tpfile%lopened .AND. OTURB_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 = TFIELDDATA( & + 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 ! @@ -731,16 +736,17 @@ END IF !! ! !! ! stores the horizontal <V VPT> !! IF ( tpfile%lopened .AND. OTURB_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 = TFIELDDATA( & +!! 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/MNH/turb_hor_uv.f90 b/src/MNH/turb_hor_uv.f90 index 3fcecc20e..112c60c85 100644 --- a/src/MNH/turb_hor_uv.f90 +++ b/src/MNH/turb_hor_uv.f90 @@ -270,16 +270,17 @@ ZFLX(:,:,IKB-1:IKB-1) = 2. * MXM( MYM( ZFLX(:,:,IKB-1:IKB-1) ) ) & ! ! stores <U V> IF ( tpfile%lopened .AND. OTURB_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 = TFIELDDATA( & + 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/MNH/turb_hor_uw.f90 b/src/MNH/turb_hor_uw.f90 index d19c68bae..f1289d73a 100644 --- a/src/MNH/turb_hor_uw.f90 +++ b/src/MNH/turb_hor_uw.f90 @@ -220,16 +220,17 @@ ZFLX(:,:,IKB-1)=2.*ZFLX(:,:,IKB)- ZFLX(:,:,IKB+1) ! ! stores <U W> IF ( tpfile%lopened .AND. OTURB_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 = TFIELDDATA( & + 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/MNH/turb_hor_vw.f90 b/src/MNH/turb_hor_vw.f90 index df888c2c7..48f5be9bc 100644 --- a/src/MNH/turb_hor_vw.f90 +++ b/src/MNH/turb_hor_vw.f90 @@ -222,16 +222,17 @@ ZFLX(:,:,IKB-1)= 2.*ZFLX(:,:,IKB) - ZFLX(:,:,IKB+1) ! ! stores <V W> IF ( tpfile%lopened .AND. OTURB_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 = TFIELDDATA( & + 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/MNH/turb_ver.f90 b/src/MNH/turb_ver.f90 index 4117d8191..d7b0f4800 100644 --- a/src/MNH/turb_ver.f90 +++ b/src/MNH/turb_ver.f90 @@ -696,42 +696,46 @@ IF ( OTURB_FLX .AND. tpfile%lopened ) 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 = TFIELDDATA( & + 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(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 = TFIELDDATA( & + 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(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 = TFIELDDATA( & + 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,NSV WRITE(TZFIELD%CMNHNAME, '("PSI_SV_",I3.3)') JSV TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) diff --git a/src/MNH/turb_ver_dyn_flux.f90 b/src/MNH/turb_ver_dyn_flux.f90 index 51bc4e7e1..ad27b69f2 100644 --- a/src/MNH/turb_ver_dyn_flux.f90 +++ b/src/MNH/turb_ver_dyn_flux.f90 @@ -541,16 +541,17 @@ END IF ! IF ( OTURB_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 = TFIELDDATA( & + 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(TPFILE,TZFIELD,ZFLXZ) END IF ! @@ -769,16 +770,17 @@ END IF ! IF ( OTURB_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 = TFIELDDATA( & + 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(TPFILE,TZFIELD,ZFLXZ) END IF ! @@ -906,16 +908,17 @@ IF ( OTURB_FLX .AND. tpfile%lopened .AND. HTURBDIM == '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 = TFIELDDATA( & + 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(TPFILE,TZFIELD,ZFLXZ) END IF ! diff --git a/src/MNH/turb_ver_sv_flux.f90 b/src/MNH/turb_ver_sv_flux.f90 index 23d8bee03..08491bc73 100644 --- a/src/MNH/turb_ver_sv_flux.f90 +++ b/src/MNH/turb_ver_sv_flux.f90 @@ -359,6 +359,7 @@ REAL :: ZTIME1, ZTIME2 REAL :: ZCSVP = 4.0 ! constant for scalar flux presso-correlation (RS81) REAL :: ZCSV !constant for the scalar flux ! +CHARACTER(LEN=NMNHNAMELGTMAX) :: YMNHNAME TYPE(TFIELDDATA) :: TZFIELD !---------------------------------------------------------------------------- ! @@ -453,17 +454,19 @@ DO JSV=1,ISV ! IF (OTURB_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 = TFIELDDATA( & + 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(TPFILE,TZFIELD,ZFLXZ) END IF diff --git a/src/MNH/turb_ver_thermo_corr.f90 b/src/MNH/turb_ver_thermo_corr.f90 index bdd074e5c..0175f76c9 100644 --- a/src/MNH/turb_ver_thermo_corr.f90 +++ b/src/MNH/turb_ver_thermo_corr.f90 @@ -568,16 +568,17 @@ END IF ! ! stores <THl THl> IF ( OTURB_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 = TFIELDDATA( & + 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(TPFILE,TZFIELD,ZFLXZ) END IF ! @@ -695,16 +696,17 @@ END IF END IF ! stores <THl Rnp> IF ( OTURB_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 = TFIELDDATA( & + 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(TPFILE,TZFIELD,ZFLXZ) END IF ! @@ -802,16 +804,17 @@ END IF END IF ! stores <Rnp Rnp> IF ( OTURB_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 = TFIELDDATA( & + 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(TPFILE,TZFIELD,ZFLXZ) END IF ! diff --git a/src/MNH/turb_ver_thermo_flux.f90 b/src/MNH/turb_ver_thermo_flux.f90 index cf539984e..816cb9a4e 100644 --- a/src/MNH/turb_ver_thermo_flux.f90 +++ b/src/MNH/turb_ver_thermo_flux.f90 @@ -753,16 +753,17 @@ END IF ! IF ( OTURB_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 = TFIELDDATA( & + 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(TPFILE,TZFIELD,ZFLXZ) END IF ! @@ -989,16 +990,17 @@ IF (KRR /= 0) THEN ! IF ( OTURB_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 = TFIELDDATA( & + 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(TPFILE,TZFIELD,ZFLXZ) END IF ! @@ -1078,16 +1080,17 @@ IF ( ((OTURB_FLX .AND. tpfile%lopened) .OR. LLES_CALL) .AND. (KRRL > 0) ) THEN ! ! store the liquid water mixing ratio vertical flux IF ( OTURB_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 = TFIELDDATA( & + 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(TPFILE,TZFIELD,ZFLXZ) END IF ! diff --git a/src/MNH/ver_thermo.f90 b/src/MNH/ver_thermo.f90 index d926e6c26..d7462dd35 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-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. @@ -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 = TFIELDDATA( & + 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 !------------------------------------------------------------------------------- diff --git a/src/MNH/write_balloonn.f90 b/src/MNH/write_balloonn.f90 index f0c790ddd..cc6d8269c 100644 --- a/src/MNH/write_balloonn.f90 +++ b/src/MNH/write_balloonn.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2001-2020 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2001-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. @@ -113,64 +113,69 @@ 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. +TZFIELD = TFIELDDATA( & + CMNHNAME = TRIM(TPFLYER%TITLE)//'LAT', & + CSTDNAME = '', & + CLONGNAME = TRIM(TPFLYER%TITLE)//'LAT', & + CUNITS = 'degree', & + CDIR = '--', & + CCOMMENT = '', & + NGRID = 0, & + NTYPE = TYPEREAL, & + NDIMS = 0, & + 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. +TZFIELD = TFIELDDATA( & + CMNHNAME = TRIM(TPFLYER%TITLE)//'LON', & + CSTDNAME = '', & + CLONGNAME = TRIM(TPFLYER%TITLE)//'LON', & + CUNITS = 'degree', & + CDIR = '--', & + CCOMMENT = '', & + NGRID = 0, & + NTYPE = TYPEREAL, & + NDIMS = 0, & + 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. +TZFIELD = TFIELDDATA( & + CMNHNAME = TRIM(TPFLYER%TITLE)//'ALT', & + CSTDNAME = '', & + CLONGNAME = TRIM(TPFLYER%TITLE)//'ALT', & + CUNITS = 'm', & + CDIR = '--', & + CCOMMENT = '', & + NGRID = 0, & + NTYPE = TYPEREAL, & + NDIMS = 0, & + 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. +TZFIELD = TFIELDDATA( & + CMNHNAME = TRIM(TPFLYER%TITLE)//'WASCENT', & + CSTDNAME = '', & + CLONGNAME = TRIM(TPFLYER%TITLE)//'WASCENT', & + CUNITS = 'm s-1', & + CDIR = '--', & + CCOMMENT = '', & + NGRID = 0, & + NTYPE = TYPEREAL, & + NDIMS = 0, & + 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. +TZFIELD = TFIELDDATA( & + CMNHNAME = TRIM(TPFLYER%TITLE)//'RHO', & + CSTDNAME = '', & + CLONGNAME = TRIM(TPFLYER%TITLE)//'RHO', & + CUNITS = 'kg m-3', & + CDIR = '--', & + CCOMMENT = '', & + NGRID = 0, & + NTYPE = TYPEREAL, & + NDIMS = 0, & + LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,TPFLYER%RHO) ! ! diff --git a/src/MNH/write_budget.f90 b/src/MNH/write_budget.f90 index 767541ad9..9f82ff30c 100644 --- a/src/MNH/write_budget.f90 +++ b/src/MNH/write_budget.f90 @@ -108,7 +108,7 @@ subroutine Write_budget( tpdiafile, tpdtcur, ptstep, ksv ) tfielddata, 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 @@ -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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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 = tfielddata( & + 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 = tfielddata( & + 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 ) diff --git a/src/MNH/write_diachro.f90 b/src/MNH/write_diachro.f90 index 8ad7c4538..46984a2c5 100644 --- a/src/MNH/write_diachro.f90 +++ b/src/MNH/write_diachro.f90 @@ -408,30 +408,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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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 @@ -488,16 +490,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 = TFIELDDATA( & + 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(:)) @@ -505,16 +508,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 = TFIELDDATA( & + 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(:)) @@ -522,16 +526,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 = TFIELDDATA( & + 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(:)) @@ -564,30 +569,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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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 @@ -596,16 +603,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 = TFIELDDATA( & + 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 & @@ -635,28 +643,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. + TZFIELD = TFIELDDATA( & + 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%x, [1, Size( tpflyer%x), 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 = TFIELDDATA( & + 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 ), & @@ -666,28 +676,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. + TZFIELD = TFIELDDATA( & + 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%y, [1, Size( tpflyer%y), 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 = TFIELDDATA( & + 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 ), & @@ -697,28 +709,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. + TZFIELD = TFIELDDATA( & + 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%z, [1, Size( tpflyer%z), 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 = TFIELDDATA( & + 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 @@ -730,16 +744,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 = TFIELDDATA( & + 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) ) ) @@ -1480,18 +1495,18 @@ if ( Present( tpflyer ) ) then 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 + tzfield = tfielddata( & + 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%x ) diff --git a/src/MNH/write_dummy_gr_fieldn.f90 b/src/MNH/write_dummy_gr_fieldn.f90 index 74f56e63c..6b9aa7949 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. @@ -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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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 dc3fd036f..f3614c14a 100644 --- a/src/MNH/write_lbn.f90 +++ b/src/MNH/write_lbn.f90 @@ -213,17 +213,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 = TFIELDDATA( & + 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) ! @@ -268,17 +269,18 @@ 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. + TZFIELD = TFIELDDATA( & + 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) ! IRIMX =(NSIZELBXSV_ll-2*JPHEXT)/2 diff --git a/src/MNH/write_lfifm1_for_diag.f90 b/src/MNH/write_lfifm1_for_diag.f90 index 60240e9ca..6f4d6d5c4 100644 --- a/src/MNH/write_lfifm1_for_diag.f90 +++ b/src/MNH/write_lfifm1_for_diag.f90 @@ -511,16 +511,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 = TFIELDDATA( & + 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 +531,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) = TFIELDDATA( & + 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) = TFIELDDATA( & + 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 @@ -737,16 +740,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 = TFIELDDATA( & + 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 ! @@ -816,152 +820,164 @@ IF (LHU_FLX) THEN ENDIF ! Ecriture ! composantes U et V du flux surfacique d'humidit� - 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. + TZFIELD = TFIELDDATA( & + 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 = TFIELDDATA( & + 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'humidit� int�gr� 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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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'humidit� - 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 = TFIELDDATA( & + 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'humidit� int�gr� sur 3000 m�tres - 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 = TFIELDDATA( & + 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'hydrom�t�ores - 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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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'hydrom�t�ores int�gr� 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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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'hydrom�t�ores - 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 = TFIELDDATA( & + 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'hydrom�t�ores int�gr� sur 3000 m�tres - 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 = TFIELDDATA( & + 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 +987,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 = TFIELDDATA( & + 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' @@ -1050,13 +1068,15 @@ 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. + TZFIELD = TFIELDDATA( & + CMNHNAME = 'generic for scalar variables', & !Temporary name to ease identification + CSTDNAME = '', & + CUNITS = 'g kg-1', & + CDIR = 'XY', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ! DO JSV = 1,NSV_USER WRITE(TZFIELD%CMNHNAME,'(A4,I3.3)')'MRSV',JSV @@ -1183,31 +1203,33 @@ 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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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 @@ -1324,16 +1346,17 @@ 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. + TZFIELD = TFIELDDATA( & + 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(:,:,:)) ! ZWORK21(:,:) = 0. @@ -1343,16 +1366,17 @@ IF(LBLOWSNOW) THEN 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. + TZFIELD = TFIELDDATA( & + 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(:,:)) ! IF(.NOT.ALLOCATED(ZBET_SNW)) & @@ -1365,52 +1389,56 @@ IF(LBLOWSNOW) THEN 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. + TZFIELD = TFIELDDATA( & + 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%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. + TZFIELD = TFIELDDATA( & + 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%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. + TZFIELD = TFIELDDATA( & + 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%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. + TZFIELD = TFIELDDATA( & + 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. @@ -1419,16 +1447,17 @@ IF(LBLOWSNOW) THEN (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. + TZFIELD = TFIELDDATA( & + 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 ! Lagrangian variables @@ -1478,6 +1507,7 @@ END IF ! linox scalar variables IF (.NOT.(LUSECHEM .OR. LCHEMDIAG) .AND. LCH_CONV_LINOX) THEN DO JSV = NSV_LNOXBEG,NSV_LNOXEND +!PW:BUG?: same name for all variables TZFIELD%CMNHNAME = 'LINOXT' TZFIELD%CSTDNAME = '' TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) @@ -2036,27 +2066,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) = TFIELDDATA( & + 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) = TFIELDDATA( & + 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 @@ -2079,124 +2111,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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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 @@ -2209,23 +2251,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 = TFIELDDATA( & + 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%CMNHNAME = 'PRES' TZFIELD%CUNITS = 'hPa' CALL IO_Field_write(TPFILE,TZFIELD,XPABST(:,:,:)*1E-2) ! @@ -2248,28 +2291,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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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) ! @@ -2277,29 +2322,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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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 @@ -2331,16 +2378,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 = TFIELDDATA( & + 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 ! @@ -2364,16 +2412,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 = TFIELDDATA( & + 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 @@ -2384,28 +2433,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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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) @@ -2431,16 +2482,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 = TFIELDDATA( & + 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 @@ -2457,16 +2509,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 = TFIELDDATA( & + 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 ! @@ -2508,16 +2561,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 = TFIELDDATA( & + 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 ! @@ -2563,30 +2617,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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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 ! @@ -2600,84 +2656,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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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) = TFIELDDATA( & + 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) = TFIELDDATA( & + 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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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 @@ -2700,16 +2762,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 = TFIELDDATA( & + 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 ! @@ -2722,16 +2785,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 = TFIELDDATA( & + 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 @@ -2744,16 +2808,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 = TFIELDDATA( & + 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 @@ -2768,16 +2833,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 = TFIELDDATA( & + 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 @@ -2790,16 +2856,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 = TFIELDDATA( & + 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 @@ -2815,16 +2882,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 = TFIELDDATA( & + 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 ! @@ -2836,29 +2904,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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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) @@ -2884,40 +2954,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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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 ! @@ -2961,52 +3034,56 @@ 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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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) = TFIELDDATA( & + 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) = TFIELDDATA( & + 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 @@ -3023,52 +3100,56 @@ 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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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) = TFIELDDATA( & + 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) = TFIELDDATA( & + 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 @@ -3092,16 +3173,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 = TFIELDDATA( & + 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 !------------------------------------------------------------------------------- @@ -3125,16 +3207,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 = TFIELDDATA( & + 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 !------------------------------------------------------------------------------- @@ -3150,16 +3233,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 = TFIELDDATA( & + 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 ! @@ -3170,16 +3254,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 = TFIELDDATA( & + 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 ! @@ -3190,16 +3275,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 = TFIELDDATA( & + 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 ! @@ -3210,16 +3296,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 = TFIELDDATA( & + 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 ! @@ -3230,16 +3317,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 = TFIELDDATA( & + 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 ! @@ -3250,16 +3338,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 = TFIELDDATA( & + 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 ! @@ -3270,16 +3359,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 = TFIELDDATA( & + 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 @@ -3311,16 +3401,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 = TFIELDDATA( & + 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' @@ -3330,15 +3421,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 = TFIELDDATA( & + CSTDNAME = '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) @@ -3376,16 +3469,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 = TFIELDDATA( & + 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' @@ -3397,15 +3491,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 = TFIELDDATA( & + 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 ! @@ -3425,65 +3521,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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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 ! @@ -3492,16 +3593,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 = TFIELDDATA( & + 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 @@ -3524,16 +3626,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 = TFIELDDATA( & + 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 @@ -3550,16 +3653,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 = TFIELDDATA( & + 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 @@ -3578,41 +3682,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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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 @@ -3648,52 +3755,56 @@ IF(LRADAR .AND. LUSERR) THEN 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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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 @@ -3992,28 +4103,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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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 @@ -4048,16 +4161,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 = TFIELDDATA( & + 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) @@ -4092,16 +4206,17 @@ 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 = TFIELDDATA( & + 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) diff --git a/src/MNH/write_lfifm1_for_diag_supp.f90 b/src/MNH/write_lfifm1_for_diag_supp.f90 index 94887adeb..456337d78 100644 --- a/src/MNH/write_lfifm1_for_diag_supp.f90 +++ b/src/MNH/write_lfifm1_for_diag_supp.f90 @@ -256,16 +256,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 = TFIELDDATA( & + 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,16 +276,17 @@ 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 = TFIELDDATA( & + 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 @@ -456,16 +458,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 = TFIELDDATA( & + 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 +496,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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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) @@ -527,16 +532,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 = TFIELDDATA( & + 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) @@ -582,16 +588,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 = TFIELDDATA( & + 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 @@ -603,32 +610,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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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 @@ -638,16 +647,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 = TFIELDDATA( & + 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 @@ -659,32 +669,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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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 @@ -694,16 +706,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 = TFIELDDATA( & + 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 @@ -715,32 +728,34 @@ 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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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 @@ -814,28 +829,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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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) @@ -901,138 +918,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) = TFIELDDATA( & + 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) = TFIELDDATA( & + 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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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_LWD) END IF END IF @@ -1072,12 +1099,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 = TFIELDDATA( & + CMNHNAME = 'variables at pressure levels', & !Temporary name to ease identification + CSTDNAME = '', & + CDIR = 'XY', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) ! ! !* Standard Variables @@ -1177,12 +1206,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 = TFIELDDATA( & + CMNHNAME = 'variables at pot. temp. levels', & !Temporary name to ease identification + CSTDNAME = '', & + CDIR = 'XY', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) ! ! !* Standard Variables @@ -1279,16 +1310,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 = TFIELDDATA( & + 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 @@ -1302,16 +1334,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 = TFIELDDATA( & + 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 @@ -1324,48 +1357,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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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 @@ -1389,16 +1425,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 = TFIELDDATA( & + 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 @@ -1406,31 +1443,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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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) @@ -1442,16 +1481,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 = TFIELDDATA( & + 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 ! @@ -1484,16 +1524,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 = TFIELDDATA( & + 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 @@ -1514,16 +1555,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 = TFIELDDATA( & + 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 ! diff --git a/src/MNH/write_lfin.f90 b/src/MNH/write_lfin.f90 index fdc5c4767..4e80261f8 100644 --- a/src/MNH/write_lfin.f90 +++ b/src/MNH/write_lfin.f90 @@ -445,15 +445,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 = TFIELDDATA( & + 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 : @@ -491,16 +493,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 = TFIELDDATA( & + 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)) ! @@ -508,189 +511,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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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 = TFIELDDATA( & + CMNHNAME = 'generic for mean_count variables', & !Temporary name to ease identification + CSTDNAME = '', & + CDIR = 'XY', & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ! TZFIELD%NGRID = 2 ! @@ -1026,16 +1044,17 @@ 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 = TFIELDDATA( & + 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) @@ -1074,16 +1093,17 @@ IF (NSV >=1) THEN 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 = TFIELDDATA( & + 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) ! @@ -1487,29 +1507,31 @@ IF (NSV >=1) THEN 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. + TZFIELD = TFIELDDATA( & + CMNHNAME = 'NSV.DIM', & + CSTDNAME = '', & + CLONGNAME = 'NSV.DIM', & + CUNITS = '', & + CDIR = '--', & + CCOMMENT = 'Number of chemical variables', & + NGRID = 0, & + NTYPE = TYPEINT, & + NDIMS = 0, & + 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. + TZFIELD = TFIELDDATA( & + CMNHNAME = 'NSV.TITRE', & + CSTDNAME = '', & + CLONGNAME = 'NSV.TITRE', & + CUNITS = '', & + CDIR = '--', & + CCOMMENT = '', & + NGRID = 0, & + NTYPE = TYPEINT, & + NDIMS = 1, & + LTIMEDEP = .FALSE. ) ILREC=LEN(YCHNAMES(1)) ILENG=ILREC*ICH_NBR ALLOCATE(ICH_NAMES(ILENG)) @@ -1610,29 +1632,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 = TFIELDDATA( & +! 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 = TFIELDDATA( & +! 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 @@ -1928,16 +1952,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 = TFIELDDATA( & + 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 @@ -1946,16 +1971,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 = TFIELDDATA( & + 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 @@ -1967,52 +1993,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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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 @@ -2027,160 +2057,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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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 @@ -2191,56 +2234,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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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 @@ -2248,56 +2295,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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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 @@ -2366,13 +2417,15 @@ 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 = TFIELDDATA( & + 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)) @@ -2389,11 +2442,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 = TFIELDDATA( & + 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' @@ -2432,11 +2489,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 = TFIELDDATA( & + 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' @@ -2468,9 +2529,13 @@ SELECT CASE(CMETH_EOL) ! CASE('ALM') ! Actuator Line Method ! - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%CDIR = '--' + TZFIELD = TFIELDDATA( & + CMNHNAME = 'generic for ALM variables', & !Temporary name to ease identification + CSTDNAME = '', & + CDIR = '--', & + NGRID = 1, & + NTYPE = TYPEREAL, & + LTIMEDEP = .TRUE. ) ! TZFIELD%NDIMS = 1 ! @@ -2534,9 +2599,13 @@ SELECT CASE(CMETH_EOL) ! IF (MEAN_COUNT /= 0) THEN ! - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%CDIR = '--' + TZFIELD = TFIELDDATA( & + 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_surf_mnh.f90 b/src/MNH/write_surf_mnh.f90 index 58e08d8dc..21ac274af 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-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. @@ -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: tfielddata, tfieldlist use mode_field, only: Find_field_id_from_mnhname USE MODE_MSG @@ -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 = TFIELDDATA( & + 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 ! @@ -641,16 +641,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 = TFIELDDATA( & + 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 +672,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 = TFIELDDATA( & + 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 @@ -1527,16 +1530,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 = TFIELDDATA( & + 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 +1549,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 = TFIELDDATA( & + 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/zsmt_pgd.f90 b/src/MNH/zsmt_pgd.f90 index b7c97c10a..c6c85422f 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. @@ -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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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 = TFIELDDATA( & + 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 !------------------------------------------------------------------------------- -- GitLab From aaf10ccdcffbe83d906d80022cc1957d70b5333d Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Thu, 4 Nov 2021 09:14:37 +0100 Subject: [PATCH 015/157] Philippe 04/11/2021: add tfieldmetadata type --- src/LIB/SURCOUCHE/src/modd_field.f90 | 95 +++++++++++++++++++++++++--- 1 file changed, 85 insertions(+), 10 deletions(-) diff --git a/src/LIB/SURCOUCHE/src/modd_field.f90 b/src/LIB/SURCOUCHE/src/modd_field.f90 index a192ac851..75901ba3d 100644 --- a/src/LIB/SURCOUCHE/src/modd_field.f90 +++ b/src/LIB/SURCOUCHE/src/modd_field.f90 @@ -15,6 +15,7 @@ ! 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 @@ -215,12 +216,14 @@ type :: tfield_metadata_base REAL :: XVALIDMAX = 1.E36 !Maximum valid value for real fields end type tfield_metadata_base -!Structure describing the characteristics of a field -TYPE, extends( tfield_metadata_base ) :: TFIELDDATA +TYPE, extends( tfield_metadata_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) @@ -250,16 +253,20 @@ integer, save :: NFIELDS_USED = 0 LOGICAL, SAVE :: LFIELDLIST_ISINIT = .FALSE. TYPE(TFIELDDATA), ALLOCATABLE, DIMENSION(:), SAVE :: TFIELDLIST +interface TFIELDMETADATA + module procedure :: Fill_tfieldmetadata +end interface TFIELDMETADATA + interface TFIELDDATA module procedure :: Fill_tfielddata end interface TFIELDDATA contains -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) +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 @@ -495,10 +502,78 @@ type(tfielddata) function Fill_tfielddata( cmnhname, cstdname, clongname, cunits ! ltimedep if ( Present( ltimedep ) ) tpfield%ltimedep = ltimedep +end function Fill_tfieldmetadata + +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() ) - ! 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. - tpfield%nmodelmax = 0 end function Fill_tfielddata end module modd_field -- GitLab From e3e78ff5a77e63f47cbb8d092c4b59d5fb0a3bf0 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Thu, 4 Nov 2021 09:55:47 +0100 Subject: [PATCH 016/157] Philippe 04/11/2021: rename tfield_metadata_base -> tfieldmetadata_base --- src/LIB/SURCOUCHE/src/modd_field.f90 | 10 ++-- src/MNH/les_specn.f90 | 10 ++-- src/MNH/modd_budget.f90 | 11 ++-- src/MNH/mode_les_diachro.f90 | 90 ++++++++++++++-------------- src/MNH/write_aircraft_balloon.f90 | 4 +- src/MNH/write_diachro.f90 | 80 ++++++++++++------------- src/MNH/write_les_budgetn.f90 | 10 ++-- src/MNH/write_les_rt_budgetn.f90 | 10 ++-- src/MNH/write_les_sv_budgetn.f90 | 10 ++-- src/MNH/write_lesn.f90 | 10 ++-- src/MNH/write_profilern.f90 | 32 +++++----- src/MNH/write_seriesn.f90 | 8 +-- src/MNH/write_stationn.f90 | 6 +- 13 files changed, 146 insertions(+), 145 deletions(-) diff --git a/src/LIB/SURCOUCHE/src/modd_field.f90 b/src/LIB/SURCOUCHE/src/modd_field.f90 index 75901ba3d..1fa797e41 100644 --- a/src/LIB/SURCOUCHE/src/modd_field.f90 +++ b/src/LIB/SURCOUCHE/src/modd_field.f90 @@ -9,8 +9,8 @@ ! 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) @@ -189,7 +189,7 @@ TYPE TFIELDPTR_T1D TYPE(DATE_TIME), DIMENSION(:), POINTER :: DATA => NULL() END TYPE TFIELDPTR_T1D ! -type :: tfield_metadata_base +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) @@ -214,9 +214,9 @@ 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 -TYPE, extends( tfield_metadata_base ) :: TFIELDMETADATA +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? diff --git a/src/MNH/les_specn.f90 b/src/MNH/les_specn.f90 index 9be8e1f80..7bbdadc48 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/modd_budget.f90 b/src/MNH/modd_budget.f90 index 7442dfd3e..39366e022 100644 --- a/src/MNH/modd_budget.f90 +++ b/src/MNH/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/MNH/mode_les_diachro.f90 b/src/MNH/mode_les_diachro.f90 index f56b2ce0f..a9dda2c89 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 !----------------------------------------------------------------- @@ -658,18 +658,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 @@ -703,18 +703,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 @@ -760,11 +760,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 @@ -774,7 +774,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 @@ -858,11 +858,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 @@ -872,7 +872,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 @@ -962,7 +962,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 @@ -971,25 +971,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 ) @@ -1242,7 +1242,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 @@ -1253,8 +1253,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 !------------------------------------------------------------------------------- @@ -1277,7 +1277,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 @@ -1286,7 +1286,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 @@ -1301,7 +1301,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 ! ---------------------------------------------------------- @@ -1450,14 +1450,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 @@ -1473,7 +1473,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, & @@ -1486,7 +1486,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 @@ -1500,7 +1500,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/write_aircraft_balloon.f90 b/src/MNH/write_aircraft_balloon.f90 index e132daa83..cd693d89c 100644 --- a/src/MNH/write_aircraft_balloon.f90 +++ b/src/MNH/write_aircraft_balloon.f90 @@ -179,7 +179,7 @@ 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 + tfieldmetadata_base, TYPEREAL use modi_aircraft_balloon, only: Aircraft_balloon_longtype_get @@ -217,7 +217,7 @@ INTEGER :: IKU, IK CHARACTER(LEN=2) :: INDICE INTEGER :: JLOOP type(tbudiachrometadata) :: tzbudiachro -type(tfield_metadata_base), dimension(:), allocatable :: tzfields +type(tfieldmetadata_base), dimension(:), allocatable :: tzfields ! !---------------------------------------------------------------------------- ! diff --git a/src/MNH/write_diachro.f90 b/src/MNH/write_diachro.f90 index 46984a2c5..9265bd855 100644 --- a/src/MNH/write_diachro.f90 +++ b/src/MNH/write_diachro.f90 @@ -97,7 +97,7 @@ subroutine Write_diachro( tpdiafile, tpbudiachro, tpfields, & use modd_aircraft_balloon, only: flyer use modd_budget, only: tbudiachrometadata use modd_conf, only: lpack -use modd_field, only: tfield_metadata_base +use modd_field, only: tfieldmetadata_base use modd_io, only: tfiledata use modd_type_date, only: date_time ! @@ -105,13 +105,13 @@ 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 +type(flyer), intent(in), optional :: tpflyer ! !* 0.1 Local variables ! --------------- @@ -146,7 +146,7 @@ use modd_budget, only: NLVL_CATEGORY, NLVL_GROUP, NLVL_SHAPE, nbumask, n 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, tfielddata 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 @@ -161,12 +161,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 +type(flyer), intent(in), optional :: tpflyer integer, parameter :: LFITITLELGT = 100 integer, parameter :: LFIUNITLGT = 100 @@ -807,12 +807,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 +type(flyer), intent(in), optional :: tpflyer character(len=:), allocatable :: ycategory character(len=:), allocatable :: ylevelname @@ -1523,22 +1523,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: tfielddata, 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 @@ -1770,14 +1770,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, tfielddata, tfieldmetadata_base + +class(tfieldmetadata_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 integer :: idims integer :: jdim diff --git a/src/MNH/write_les_budgetn.f90 b/src/MNH/write_les_budgetn.f90 index 7827ba184..cb76368d5 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 114d39cda..66df13ade 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 6a3997964..8a412845f 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 e4adb2045..b090d3312 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_profilern.f90 b/src/MNH/write_profilern.f90 index 486978e1c..13d9e1a8e 100644 --- a/src/MNH/write_profilern.f90 +++ b/src/MNH/write_profilern.f90 @@ -86,7 +86,7 @@ USE MODD_CH_M9_n, ONLY: CNAMES USE MODD_CST, ONLY: XRV USE MODD_ELEC_DESCR, ONLY: CELECNAMES use modd_field, only: NMNHDIM_LEVEL, NMNHDIM_PROFILER_TIME, NMNHDIM_PROFILER_PROC, NMNHDIM_UNUSED, & - tfield_metadata_base, TYPEREAL + tfieldmetadata_base, TYPEREAL USE MODD_ICE_C1R3_DESCR, ONLY: C1R3NAMES USE MODD_IO, ONLY: TFILEDATA USE MODD_LG, ONLY: CLGNAMES @@ -111,21 +111,21 @@ INTEGER, INTENT(IN) :: KI ! !* 0.2 declaration of local variables for diachro ! -character(len=2) :: yidx -character(len=100) :: ycomment -character(len=100) :: yname -CHARACTER(LEN=:), allocatable :: YGROUP ! group title -INTEGER :: IKU -INTEGER :: IPROC ! number of variables records -INTEGER :: JPROC -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=2) :: yidx +character(len=100) :: ycomment +character(len=100) :: yname +CHARACTER(LEN=:), allocatable :: YGROUP ! group title +INTEGER :: IKU +INTEGER :: IPROC ! number of variables records +INTEGER :: JPROC +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(tfieldmetadata_base), dimension(:), allocatable :: tzfields ! !---------------------------------------------------------------------------- ! diff --git a/src/MNH/write_seriesn.f90 b/src/MNH/write_seriesn.f90 index 54ed6c7c8..62999fff5 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 7efb9adaa..972805565 100644 --- a/src/MNH/write_stationn.f90 +++ b/src/MNH/write_stationn.f90 @@ -126,7 +126,7 @@ 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 + tfieldmetadata_base, TYPEREAL TYPE(STATION), INTENT(IN) :: TSTATION INTEGER, INTENT(IN) :: II @@ -151,8 +151,8 @@ INTEGER :: IPROC ! number of variables records 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 -- GitLab From 875229abfdf2956a380e93badc4568d7cf2ac86b Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Thu, 4 Nov 2021 16:30:42 +0100 Subject: [PATCH 017/157] Philippe 04/11/2021: IO: use field classes (instead of type(tfielddata)) for I/O subroutines --- src/LIB/SURCOUCHE/src/mode_io_field_read.f90 | 203 +++++++++--------- src/LIB/SURCOUCHE/src/mode_io_field_write.f90 | 154 ++++++------- src/LIB/SURCOUCHE/src/mode_io_read_lfi.f90 | 128 +++++------ src/LIB/SURCOUCHE/src/mode_io_read_nc4.f90 | 96 ++++----- src/LIB/SURCOUCHE/src/mode_io_tools.f90 | 6 +- src/LIB/SURCOUCHE/src/mode_io_tools_nc4.f90 | 8 +- src/LIB/SURCOUCHE/src/mode_io_write_lfi.f90 | 46 ++-- src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 | 167 +++++++------- 8 files changed, 392 insertions(+), 416 deletions(-) diff --git a/src/LIB/SURCOUCHE/src/mode_io_field_read.f90 b/src/LIB/SURCOUCHE/src/mode_io_field_read.f90 index 15bb499d2..f0eb696c9 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_field_write.f90 b/src/LIB/SURCOUCHE/src/mode_io_field_write.f90 index b48a37b26..da3889629 100644 --- a/src/LIB/SURCOUCHE/src/mode_io_field_write.f90 +++ b/src/LIB/SURCOUCHE/src/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 @@ -81,10 +82,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 @@ -177,13 +178,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 @@ -311,14 +312,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 ) ) @@ -340,7 +341,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 ) // ': ' & @@ -443,8 +444,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 @@ -529,7 +530,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 ! @@ -632,7 +633,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 @@ -762,7 +763,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 @@ -790,7 +791,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 @@ -821,8 +822,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 @@ -839,7 +840,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 @@ -854,8 +854,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 @@ -871,7 +871,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 @@ -1021,7 +1020,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 @@ -1064,7 +1063,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() @@ -1102,8 +1101,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) @@ -1120,7 +1119,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 @@ -1134,8 +1132,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) @@ -1153,7 +1151,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 @@ -1486,7 +1483,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 @@ -1509,7 +1506,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 @@ -1539,8 +1536,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) @@ -1559,7 +1556,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 @@ -1574,8 +1570,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) @@ -1595,7 +1591,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 @@ -1701,7 +1696,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 ! @@ -1721,7 +1716,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 @@ -1746,8 +1741,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) @@ -1760,7 +1755,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 @@ -1770,8 +1764,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) @@ -1784,7 +1778,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 ) @@ -1874,7 +1867,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 ! @@ -1985,7 +1978,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 ! @@ -2077,7 +2070,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 ! @@ -2189,7 +2182,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 ! @@ -2212,7 +2205,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 @@ -2238,8 +2231,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 @@ -2249,7 +2242,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 @@ -2259,8 +2251,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 @@ -2270,7 +2262,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 @@ -2370,7 +2361,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 ! @@ -2392,7 +2383,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 @@ -2418,8 +2409,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) @@ -2430,7 +2421,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 @@ -2440,8 +2430,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) @@ -2452,7 +2442,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 ) @@ -2548,7 +2537,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 @@ -2571,7 +2560,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 @@ -2601,8 +2590,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) @@ -2621,7 +2610,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 @@ -2636,8 +2624,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) @@ -2657,7 +2645,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 @@ -2757,7 +2744,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 ! @@ -2849,7 +2836,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 ! @@ -2956,7 +2943,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 ! @@ -3036,7 +3023,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 ! @@ -3140,7 +3127,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 ! @@ -3217,7 +3204,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 ! @@ -3297,7 +3284,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 @@ -3326,7 +3313,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 @@ -3361,8 +3348,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) @@ -3373,7 +3360,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 ) @@ -3457,7 +3443,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 ! @@ -3551,7 +3537,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 ! @@ -3645,7 +3631,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 ! @@ -3739,7 +3725,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 ! @@ -4249,7 +4235,7 @@ IMPLICIT NONE ! TYPE(TOUTBAK), INTENT(IN) :: TPOUTPUT !Output structure ! -TYPE(TFIELDDATA) :: TZFIELD +TYPE(TFIELDMETADATA) :: TZFIELD ! #if 0 INTEGER :: IKB diff --git a/src/LIB/SURCOUCHE/src/mode_io_read_lfi.f90 b/src/LIB/SURCOUCHE/src/mode_io_read_lfi.f90 index f98999c1e..66aab0cef 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 a257e66b8..248257734 100644 --- a/src/LIB/SURCOUCHE/src/mode_io_read_nc4.f90 +++ b/src/LIB/SURCOUCHE/src/mode_io_read_nc4.f90 @@ -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 @@ -260,10 +260,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 +315,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 +382,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 +464,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 +536,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 +610,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 +687,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 +765,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 +822,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 +890,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 +972,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 +1042,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 +1112,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 +1199,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 +1268,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 193083863..7346177c4 100644 --- a/src/LIB/SURCOUCHE/src/mode_io_tools.f90 +++ b/src/LIB/SURCOUCHE/src/mode_io_tools.f90 @@ -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,7 +123,7 @@ subroutine IO_Mnhversion_get(tpfile) if ( .not. associated( tpfile%tmainfile ) ) then imnhversion(:) = 0 !use tzfield because tfieldlist could be not initialised - tzfield = tfielddata( & + tzfield = tfieldmetadata( & cmnhname = 'MNHVERSION', & cstdname = '', & clongname = 'MesoNH version', & diff --git a/src/LIB/SURCOUCHE/src/mode_io_tools_nc4.f90 b/src/LIB/SURCOUCHE/src/mode_io_tools_nc4.f90 index 50412e8c0..a7d7604f2 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 @@ -253,6 +253,8 @@ USE MODD_CONF_n, ONLY: CSTORAGE_TYPE USE MODD_DIM_n, ONLY: NIMAX_ll, NJMAX_ll, NKMAX use modd_dyn, only: xseglen use modd_dyn_n, only: xtstep + +!PW: check if all parameters are used... use modd_field, only: NMNHDIM_NI, NMNHDIM_NJ, NMNHDIM_NI_U, NMNHDIM_NJ_U, NMNHDIM_NI_V, NMNHDIM_NJ_V, & NMNHDIM_LEVEL, NMNHDIM_LEVEL_W, NMNHDIM_TIME, & NMNHDIM_ONE, NMNHDIM_NSWB, NMNHDIM_NLWB, NMNHDIM_COMPLEX, & @@ -515,7 +517,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 430f06ccf..588ac539b 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 53053069c..4019f6346 100644 --- a/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 +++ b/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 @@ -32,7 +32,7 @@ #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 @@ -87,7 +87,7 @@ use modd_parameters, only: jphext use mode_tools_ll, only: Get_globaldims_ll 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 @@ -177,7 +177,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 @@ -373,7 +373,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) @@ -525,7 +525,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 ! @@ -548,7 +548,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 ! @@ -574,19 +574,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 ! @@ -610,7 +610,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 ! @@ -636,7 +636,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 ! @@ -662,7 +662,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 ! @@ -688,7 +688,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 ! @@ -723,7 +723,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 ! @@ -773,7 +773,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 ! @@ -799,7 +799,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 ! @@ -825,7 +825,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 ! @@ -851,7 +851,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 ! @@ -877,7 +877,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 ! @@ -908,7 +908,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 ! @@ -942,7 +942,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 ! @@ -980,7 +980,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 ! @@ -1017,22 +1017,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. @@ -1071,24 +1071,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. @@ -1128,7 +1128,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 @@ -1165,20 +1165,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 @@ -1211,7 +1211,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 @@ -1248,7 +1248,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 @@ -1285,20 +1285,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 @@ -1331,20 +1331,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 @@ -1377,20 +1377,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 @@ -2454,8 +2454,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 @@ -2469,9 +2469,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 -- GitLab From 7e2f7f91384e2a856890a2475f10663d2a55ffa5 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Fri, 5 Nov 2021 09:16:13 +0100 Subject: [PATCH 018/157] Philippe 05/11/2021: add Fill_tfieldmetadata_from_tfielddata constructor --- src/LIB/SURCOUCHE/src/modd_field.f90 | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/LIB/SURCOUCHE/src/modd_field.f90 b/src/LIB/SURCOUCHE/src/modd_field.f90 index 1fa797e41..2c91243c5 100644 --- a/src/LIB/SURCOUCHE/src/modd_field.f90 +++ b/src/LIB/SURCOUCHE/src/modd_field.f90 @@ -255,6 +255,7 @@ TYPE(TFIELDDATA), ALLOCATABLE, DIMENSION(:), SAVE :: TFIELDLIST interface TFIELDMETADATA module procedure :: Fill_tfieldmetadata + module procedure :: Fill_tfieldmetadata_from_tfielddata end interface TFIELDMETADATA interface TFIELDDATA @@ -504,6 +505,32 @@ type(tfieldmetadata) function Fill_tfieldmetadata( cmnhname, cstdname, clongname 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, & -- GitLab From 0c5bb7c0d4078891eb090d31b866c2ab6a2a1aa6 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Fri, 5 Nov 2021 11:28:41 +0100 Subject: [PATCH 019/157] Philippe 05/11/2021: IO: use tfieldmetadata instead of tfielddata when possible --- LIBTOOLS/tools/lfi2cdf/src/mode_util.f90 | 8 +- src/MNH/advection_metsv.f90 | 20 +- src/MNH/c2r2_adjust.f90 | 12 +- src/MNH/call_rttov11.f90 | 6 +- src/MNH/call_rttov13.f90 | 6 +- src/MNH/call_rttov8.f90 | 13 +- src/MNH/compare_dad.f90 | 14 +- src/MNH/compute_r00.f90 | 16 +- src/MNH/free_atm_profile.f90 | 12 +- src/MNH/ini_aircraft_balloon.f90 | 14 +- src/MNH/ini_deep_convection.f90 | 18 +- src/MNH/ini_lb.f90 | 10 +- src/MNH/ini_prog_var.f90 | 4 +- src/MNH/ini_size_spawn.f90 | 10 +- src/MNH/ini_surf_rad.f90 | 10 +- src/MNH/khko_notadjust.f90 | 10 +- src/MNH/lima_adjust.f90 | 8 +- src/MNH/lima_adjust_split.f90 | 8 +- src/MNH/lima_ccn_activation.f90 | 9 +- src/MNH/lima_notadjust.f90 | 6 +- src/MNH/lima_warm_nucl.f90 | 8 +- src/MNH/menu_diachro.f90 | 12 +- src/MNH/mnh2lpdm_ech.f90 | 14 +- src/MNH/mnh2lpdm_ini.f90 | 22 +- src/MNH/paspol.f90 | 22 +- src/MNH/prandtl.f90 | 14 +- src/MNH/radiations.f90 | 8 +- src/MNH/rain_c2r2_khko.f90 | 12 +- src/MNH/read_dummy_gr_fieldn.f90 | 8 +- src/MNH/read_field.f90 | 30 +-- src/MNH/read_hgrid.f90 | 10 +- src/MNH/read_hgridn.f90 | 26 +-- src/MNH/read_precip_field.f90 | 34 +-- src/MNH/read_surf_mnh.f90 | 146 ++++++------ src/MNH/set_grid.f90 | 10 +- src/MNH/shallow_mf_pack.f90 | 14 +- src/MNH/spawn_field2.f90 | 4 +- src/MNH/tke_eps_sources.f90 | 12 +- src/MNH/turb.f90 | 20 +- src/MNH/turb_cloud_index.f90 | 20 +- src/MNH/turb_hor_dyn_corr.f90 | 10 +- src/MNH/turb_hor_sv_flux.f90 | 8 +- src/MNH/turb_hor_thermo_corr.f90 | 10 +- src/MNH/turb_hor_thermo_flux.f90 | 16 +- src/MNH/turb_hor_uv.f90 | 6 +- src/MNH/turb_hor_uw.f90 | 6 +- src/MNH/turb_hor_vw.f90 | 6 +- src/MNH/turb_ver.f90 | 10 +- src/MNH/turb_ver_dyn_flux.f90 | 10 +- src/MNH/turb_ver_sv_flux.f90 | 6 +- src/MNH/turb_ver_thermo_corr.f90 | 10 +- src/MNH/turb_ver_thermo_flux.f90 | 10 +- src/MNH/uv_to_zonal_and_merid.f90 | 82 +++---- src/MNH/ver_thermo.f90 | 6 +- src/MNH/write_balloonn.f90 | 18 +- src/MNH/write_budget.f90 | 14 +- src/MNH/write_diachro.f90 | 46 ++-- src/MNH/write_dummy_gr_fieldn.f90 | 8 +- src/MNH/write_lbn.f90 | 10 +- src/MNH/write_lfifm1_for_diag.f90 | 268 +++++++++++------------ src/MNH/write_lfifm1_for_diag_supp.f90 | 88 ++++---- src/MNH/write_lfin.f90 | 160 +++++++------- src/MNH/write_surf_mnh.f90 | 98 ++++----- src/MNH/zsmt_pgd.f90 | 10 +- 64 files changed, 788 insertions(+), 788 deletions(-) diff --git a/LIBTOOLS/tools/lfi2cdf/src/mode_util.f90 b/LIBTOOLS/tools/lfi2cdf/src/mode_util.f90 index 5bca2401c..d60a7fc79 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/src/MNH/advection_metsv.f90 b/src/MNH/advection_metsv.f90 index 107970bb1..ec9b54f0c 100644 --- a/src/MNH/advection_metsv.f90 +++ b/src/MNH/advection_metsv.f90 @@ -152,7 +152,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 @@ -275,11 +275,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,7 +366,7 @@ 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 = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'CFLU', & CSTDNAME = '', & CLONGNAME = 'CFLU', & @@ -380,7 +380,7 @@ IF ( tpfile%lopened .AND. OCFL_WRIT .AND. (.NOT. L1D) ) THEN CALL IO_Field_write(TPFILE,TZFIELD,ZCFLU) ! IF (.NOT. L2D) THEN - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'CFLV', & CSTDNAME = '', & CLONGNAME = 'CFLV', & @@ -394,7 +394,7 @@ IF ( tpfile%lopened .AND. OCFL_WRIT .AND. (.NOT. L1D) ) THEN CALL IO_Field_write(TPFILE,TZFIELD,ZCFLV) END IF ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'CFLW', & CSTDNAME = '', & CLONGNAME = 'CFLW', & @@ -407,7 +407,7 @@ IF ( tpfile%lopened .AND. OCFL_WRIT .AND. (.NOT. L1D) ) THEN LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZCFLW) ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'CFL', & CSTDNAME = '', & CLONGNAME = 'CFL', & diff --git a/src/MNH/c2r2_adjust.f90 b/src/MNH/c2r2_adjust.f90 index 0112cd87a..c5e9d27bc 100644 --- a/src/MNH/c2r2_adjust.f90 +++ b/src/MNH/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,7 +405,7 @@ IF ( HRAD /= 'NONE' ) THEN END IF ! IF ( tpfile%lopened ) THEN - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'NEB', & CSTDNAME = '', & CLONGNAME = 'NEB', & diff --git a/src/MNH/call_rttov11.f90 b/src/MNH/call_rttov11.f90 index e6a43b03e..c949ca4eb 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,7 +585,7 @@ DO JSAT=1,IJSAT ! loop over sensors YEND=YTWO//YCHAN END IF - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = TRIM(YBEG)//'_'//TRIM(YEND)//'BT', & CSTDNAME = '', & CLONGNAME = TRIM(YBEG)//'_'//TRIM(YEND)//'BT', & diff --git a/src/MNH/call_rttov13.f90 b/src/MNH/call_rttov13.f90 index 5c427dce7..90526ac29 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 @@ -264,7 +264,7 @@ 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 @@ -705,7 +705,7 @@ DO JSAT=1,IJSAT ! loop over sensors YUNITS = '-' YCOMMENT = TRIM(YBEG)//'_'//TRIM(YEND)//' bidirectional reflectance factor' END IF - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = TRIM( YMNHNAME ), & CSTDNAME = '', & CLONGNAME = 'MesoNH: ' // TRIM( YMNHNAME ), & diff --git a/src/MNH/call_rttov8.f90 b/src/MNH/call_rttov8.f90 index d38a71c2b..ab370816e 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 @@ -687,7 +688,7 @@ REAL(Kind=jprb), PARAMETER :: o3_mixratio_to_ppmv = 6.03504e+5_JPRB INTEGER(Kind=jpim) :: alloc_status(40) CHARACTER(LEN=:), ALLOCATABLE :: YMNHNAME, YUNITS, YCOMMENT -TYPE(TFIELDDATA) :: TZFIELD +TYPE(TFIELDMETADATA) :: TZFIELD ! - End of header -------------------------------------------------------- !!!---------------------------------------------------------------------------- @@ -1568,7 +1569,7 @@ 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 = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = TRIM(YINST)//'_ANGL', & CSTDNAME = '', & CLONGNAME = TRIM(YINST)//'_ANGL', & @@ -1629,7 +1630,7 @@ DO JSAT=1,IJSAT ! loop over sensors YUNITS = 'K' YCOMMENT = TRIM(YBEG)//'_'//TRIM(YEND)//' BT' ENDIF - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = TRIM( YMNHNAME ), & CSTDNAME = '', & CLONGNAME = TRIM( YMNHNAME ), & @@ -1645,7 +1646,7 @@ DO JSAT=1,IJSAT ! loop over sensors 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 = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = TRIM(YBEG)//'_UTH', & CSTDNAME = '', & CLONGNAME = TRIM(YBEG)//'_UTH', & @@ -1727,7 +1728,7 @@ DO JSAT=1,IJSAT ! loop over sensors END DO END DO ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = TRIM(YBEG)//'_'//TRIM(YEND)//'JAT', & CSTDNAME = '', & CLONGNAME = TRIM(YBEG)//'_'//TRIM(YEND)//'JAT', & @@ -1743,7 +1744,7 @@ DO JSAT=1,IJSAT ! loop over sensors MAXVAL(ZTEMPK(:,:,:),ZTEMPK(:,:,:)/=XUNDEF) CALL IO_Field_write(TPFILE,TZFIELD,ZTEMPK(:,:,:)) ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = TRIM(YBEG)//'_'//TRIM(YEND)//'JAV', & CSTDNAME = '', & CLONGNAME = TRIM(YBEG)//'_'//TRIM(YEND)//'JAV', & diff --git a/src/MNH/compare_dad.f90 b/src/MNH/compare_dad.f90 index fe145cee4..983eb5188 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 85f43d0d2..727b230ff 100644 --- a/src/MNH/compute_r00.f90 +++ b/src/MNH/compute_r00.f90 @@ -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 @@ -114,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 ! !------------------------------------------------------------------------------- @@ -277,7 +277,7 @@ DO JFILECUR=1,NFILES IF (GSTART) THEN PRINT *,'INBR_START',INBR_START,' NBRFILES(JFILECUR)',NBRFILES(JFILECUR) WRITE(YMNHNAME,'(A2,I2.2)')'X0',INBR_START - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = TRIM( YMNHNAME ), & CSTDNAME = '', & CLONGNAME = TRIM( YMNHNAME ), & @@ -292,7 +292,7 @@ DO JFILECUR=1,NFILES CALL IO_Field_write(TPFILE,TZFIELD,ZX00(:,:,:)) ! WRITE(YMNHNAME,'(A2,I2.2)')'Y0',INBR_START - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = TRIM( YMNHNAME ), & CSTDNAME = '', & CLONGNAME = TRIM(TZFIELD%CMNHNAME), & @@ -307,7 +307,7 @@ DO JFILECUR=1,NFILES CALL IO_Field_write(TPFILE,TZFIELD,ZY00(:,:,:)) ! WRITE(YMNHNAME,'(A2,I2.2)')'Z0',INBR_START - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = TRIM( YMNHNAME ), & CSTDNAME = '', & CLONGNAME = TRIM( YMNHNAME ), & @@ -338,7 +338,7 @@ DO JFILECUR=1,NFILES IF (GSTART) THEN ! WRITE(YMNHNAME,'(A3,I2.2)')'TH0',INBR_START - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = TRIM( YMNHNAME ), & CSTDNAME = '', & CLONGNAME = TRIM( YMNHNAME ), & @@ -353,7 +353,7 @@ DO JFILECUR=1,NFILES CALL IO_Field_write(TPFILE,TZFIELD,ZWORK1(:,:,:)) ! WRITE(YMNHNAME,'(A3,I2.2)')'RV0',INBR_START - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = TRIM( YMNHNAME ), & CSTDNAME = '', & CLONGNAME = TRIM( YMNHNAME ), & @@ -370,7 +370,7 @@ DO JFILECUR=1,NFILES !* 4.4 compute the origin of the particules using one more segment ! IF (JFILECUR /= NFILES) THEN - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA(& CMNHNAME = 'LGXT', & CSTDNAME = '', & CLONGNAME = 'LGXT', & diff --git a/src/MNH/free_atm_profile.f90 b/src/MNH/free_atm_profile.f90 index 34fefa20a..572dd91d8 100644 --- a/src/MNH/free_atm_profile.f90 +++ b/src/MNH/free_atm_profile.f90 @@ -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,7 +468,7 @@ 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 = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'HBLTOP', & CSTDNAME = 'atmosphere_boundary_layer_thickness', & CLONGNAME = 'HBLTOP', & @@ -484,7 +484,7 @@ IF (CPROGRAM == 'DIAG ' ) THEN !* 11.2 Writing of level of boundary layer top ! -------------------------------------- ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'KBLTOP', & CSTDNAME = 'model_level_number_at_top_of_atmosphere_boundary_layer', & CLONGNAME = 'KBLTOP', & @@ -503,7 +503,7 @@ IF (CPROGRAM /= 'DIAG ' .AND. CPROGRAM /= 'IDEAL ' ) THEN !* 11.3 Writing of free atmosphere gradient ! ----------------------------------- ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'FREE_ATM_GR', & CSTDNAME = '', & CLONGNAME = 'FREE_ATM_GR', & @@ -525,7 +525,7 @@ 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 = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'THV_FREE', & CSTDNAME = '', & CLONGNAME = 'THV_FREE', & diff --git a/src/MNH/ini_aircraft_balloon.f90 b/src/MNH/ini_aircraft_balloon.f90 index f5938cbc1..5d9ea3a67 100644 --- a/src/MNH/ini_aircraft_balloon.f90 +++ b/src/MNH/ini_aircraft_balloon.f90 @@ -89,7 +89,7 @@ USE MODD_AIRCRAFT_BALLOON USE MODD_CONF USE MODD_DIAG_FLAG USE MODD_DYN_n -use modd_field, only: tfielddata, TYPEREAL +use modd_field, only: tfieldmetadata, TYPEREAL USE MODD_GRID USE MODD_IO, ONLY: TFILEDATA USE MODD_LUNIT_n, ONLY: TLUOUT @@ -128,7 +128,7 @@ INTEGER :: ISTORE ! number of storage instants INTEGER :: ILUOUT ! logical unit INTEGER :: IRESP ! return code INTEGER :: JSEG ! loop counter -TYPE(TFIELDDATA) :: TZFIELD +TYPE(TFIELDMETADATA) :: TZFIELD ! !---------------------------------------------------------------------------- ! @@ -474,7 +474,7 @@ END IF IF ( CPROGRAM == 'MESONH' .OR. CPROGRAM == 'SPAWN ' .OR. CPROGRAM == 'REAL ' ) THEN ! read the current location in the FM_FILE ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = TRIM(TPFLYER%TITLE)//'LAT', & CSTDNAME = '', & CLONGNAME = TRIM(TPFLYER%TITLE)//'LAT', & @@ -490,7 +490,7 @@ IF ( CPROGRAM == 'MESONH' .OR. CPROGRAM == 'SPAWN ' .OR. CPROGRAM == 'REAL ' ) IF ( IRESP /= 0 ) THEN WRITE(ILUOUT,*) "INI_LAUCH: Initial location take for ",TPFLYER%TITLE ELSE - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = TRIM(TPFLYER%TITLE)//'LON', & CSTDNAME = '', & CLONGNAME = TRIM(TPFLYER%TITLE)//'LON', & @@ -503,7 +503,7 @@ IF ( CPROGRAM == 'MESONH' .OR. CPROGRAM == 'SPAWN ' .OR. CPROGRAM == 'REAL ' ) LTIMEDEP = .TRUE. ) CALL IO_Field_read(TPINIFILE,TZFIELD,ZLON) ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = TRIM(TPFLYER%TITLE)//'ALT', & CSTDNAME = '', & CLONGNAME = TRIM(TPFLYER%TITLE)//'ALT', & @@ -518,7 +518,7 @@ IF ( CPROGRAM == 'MESONH' .OR. CPROGRAM == 'SPAWN ' .OR. CPROGRAM == 'REAL ' ) ! TPFLYER%P_CUR = XUNDEF ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = TRIM(TPFLYER%TITLE)//'WASCENT', & CSTDNAME = '', & CLONGNAME = TRIM(TPFLYER%TITLE)//'WASCENT', & @@ -531,7 +531,7 @@ IF ( CPROGRAM == 'MESONH' .OR. CPROGRAM == 'SPAWN ' .OR. CPROGRAM == 'REAL ' ) LTIMEDEP = .TRUE. ) CALL IO_Field_read(TPINIFILE,TZFIELD,TPFLYER%WASCENT) ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = TRIM(TPFLYER%TITLE)//'RHO', & CSTDNAME = '', & CLONGNAME = TRIM(TPFLYER%TITLE)//'RHO', & diff --git a/src/MNH/ini_deep_convection.f90 b/src/MNH/ini_deep_convection.f90 index 447fac0b0..695d39a4d 100644 --- a/src/MNH/ini_deep_convection.f90 +++ b/src/MNH/ini_deep_convection.f90 @@ -120,7 +120,7 @@ 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_field, only: tfieldmetadata, tfieldlist, TYPEREAL USE MODD_ICE_C1R3_DESCR, ONLY: C1R3NAMES USE MODD_IO, ONLY: TFILEDATA USE MODD_LG, ONLY: CLGNAMES @@ -180,10 +180,10 @@ 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 +TYPE(TFIELDMETADATA) :: TZFIELD ! !------------------------------------------------------------------------------- ! @@ -233,19 +233,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 @@ -260,7 +260,7 @@ ELSE ! SELECT CASE(HGETSVCONV) CASE('READ') - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'generic for ini_deep_convection', & !Temporary name to ease identification CUNITS = 's-1', & CDIR = 'XY', & diff --git a/src/MNH/ini_lb.f90 b/src/MNH/ini_lb.f90 index b91b85868..3c610aa2d 100644 --- a/src/MNH/ini_lb.f90 +++ b/src/MNH/ini_lb.f90 @@ -145,7 +145,7 @@ USE MODD_CTURB USE MODD_CONF USE MODD_DUST USE MODD_ELEC_DESCR, ONLY: CELECNAMES -use modd_field, only: tfielddata, TYPELOG, TYPEREAL +use modd_field, only: tfieldmetadata, TYPELOG, TYPEREAL USE MODD_ICE_C1R3_DESCR, ONLY: C1R3NAMES USE MODD_IO, ONLY: TFILEDATA USE MODD_LG, ONLY: CLGNAMES @@ -231,8 +231,8 @@ LOGICAL :: GHORELAX_R, GHORELAX_SV ! switch for the horizontal relaxation 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=2) :: INDICE ! to index CCN and IFN fields of LIMA scheme +TYPE(TFIELDMETADATA) :: TZFIELD !------------------------------------------------------------------------------- ! ! @@ -361,7 +361,7 @@ END SELECT !* 2.5 LB-Rx ! IF(KSIZELBXR_ll > 0 ) THEN - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'HORELAX_R', & CSTDNAME = '', & CLONGNAME = 'HORELAX_R', & @@ -390,7 +390,7 @@ IF(KSIZELBXR_ll > 0 ) THEN IL3DY=2*JPHEXT ! 2 END IF ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CUNITS = 'kg kg-1', & CDIR = '', & NGRID = 1, & diff --git a/src/MNH/ini_prog_var.f90 b/src/MNH/ini_prog_var.f90 index 1f099672e..216426209 100644 --- a/src/MNH/ini_prog_var.f90 +++ b/src/MNH/ini_prog_var.f90 @@ -113,7 +113,7 @@ USE MODD_CONF_n USE MODD_DIM_n USE MODD_DUST USE MODD_DYN_n -use modd_field, only: TFIELDDATA, TYPEREAL +use modd_field, only: TFIELDMETADATA, TYPEREAL USE MODD_FIELD_n USE MODD_IO, ONLY: TFILEDATA USE MODD_LSFIELD_n @@ -163,7 +163,7 @@ 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 +TYPE(TFIELDMETADATA) :: TZFIELD TYPE(TFILEDATA),POINTER :: TZCHEMFILE => NULL() !------------------------------------------------------------------------------- ! diff --git a/src/MNH/ini_size_spawn.f90 b/src/MNH/ini_size_spawn.f90 index 0de2efdb4..abab91578 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-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 @@ 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) ! diff --git a/src/MNH/ini_surf_rad.f90 b/src/MNH/ini_surf_rad.f90 index be7c6f342..19b5f8df6 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/khko_notadjust.f90 b/src/MNH/khko_notadjust.f90 index b69b6a18a..74be8f433 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,7 +389,7 @@ END IF PNPRO(:,:,:) = ZACT(:,:,:) ! IF ( tpfile%lopened ) THEN - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'SURSAT', & CSTDNAME = '', & CLONGNAME = 'SURSAT', & @@ -402,7 +402,7 @@ IF ( tpfile%lopened ) THEN LTIMEDEP = .FALSE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK) ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'ACT_OD', & CSTDNAME = '', & CLONGNAME = 'ACT_OD', & diff --git a/src/MNH/lima_adjust.f90 b/src/MNH/lima_adjust.f90 index 0a7f2a4de..d6338d3bf 100644 --- a/src/MNH/lima_adjust.f90 +++ b/src/MNH/lima_adjust.f90 @@ -149,7 +149,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 @@ -284,7 +284,7 @@ INTEGER :: JL ! and PACK intrinsics INTEGER :: JMOD, JMOD_IFN, JMOD_IMM ! INTEGER , DIMENSION(3) :: BV -TYPE(TFIELDDATA) :: TZFIELD +TYPE(TFIELDMETADATA) :: TZFIELD ! !------------------------------------------------------------------------------- ! @@ -1187,7 +1187,7 @@ IF ( SIZE(PSRCS,3) /= 0 ) THEN END IF ! IF ( tpfile%lopened ) THEN - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'NEB', & CSTDNAME = '', & CLONGNAME = 'NEB', & @@ -1243,7 +1243,7 @@ IF ( tpfile%lopened ) THEN ZW1(:,:,:)= 2.0*PPABST(:,:,:)-PPABSM(:,:,:) ZW(:,:,:) = PRVT(:,:,:)*( ZW1(:,:,:)-ZW(:,:,:) ) / ( (XMV/XMD) * ZW(:,:,:) ) - 1.0 - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'SSI', & CSTDNAME = '', & CLONGNAME = 'SSI', & diff --git a/src/MNH/lima_adjust_split.f90 b/src/MNH/lima_adjust_split.f90 index 67eefa30b..b1ea3ad39 100644 --- a/src/MNH/lima_adjust_split.f90 +++ b/src/MNH/lima_adjust_split.f90 @@ -153,7 +153,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 @@ -309,7 +309,7 @@ INTEGER :: JL ! and PACK intrinsics INTEGER :: JMOD, JMOD_IFN, JMOD_IMM ! INTEGER , DIMENSION(3) :: BV -TYPE(TFIELDDATA) :: TZFIELD +TYPE(TFIELDMETADATA) :: TZFIELD ! !------------------------------------------------------------------------------- ! @@ -726,7 +726,7 @@ IF ( OSUBG_COND ) THEN END IF ! fin test OSUBG_COND IF ( tpfile%lopened ) THEN - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'NEB', & CSTDNAME = '', & CLONGNAME = 'NEB', & @@ -782,7 +782,7 @@ IF ( tpfile%lopened ) THEN ZW1(:,:,:)= 2.0*PPABST(:,:,:)-PPABSM(:,:,:) ZW(:,:,:) = PRVT(:,:,:)*( ZW1(:,:,:)-ZW(:,:,:) ) / ( (XMV/XMD) * ZW(:,:,:) ) - 1.0 - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'SSI', & CSTDNAME = '', & CLONGNAME = 'SSI', & diff --git a/src/MNH/lima_ccn_activation.f90 b/src/MNH/lima_ccn_activation.f90 index 2c2902a37..2cbaf374d 100644 --- a/src/MNH/lima_ccn_activation.f90 +++ b/src/MNH/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 @@ -487,8 +487,7 @@ IF ( tpfile%lopened ) THEN ZW (:,:,:) = 0. ZW2(:,:,:) = 0. END IF - - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'SMAX', & CSTDNAME = '', & CLONGNAME = 'SMAX', & @@ -501,7 +500,7 @@ IF ( tpfile%lopened ) THEN LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZW) ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'NACT', & CSTDNAME = '', & CLONGNAME = 'NACT', & diff --git a/src/MNH/lima_notadjust.f90 b/src/MNH/lima_notadjust.f90 index e1eb550e4..9f43f46d0 100644 --- a/src/MNH/lima_notadjust.f90 +++ b/src/MNH/lima_notadjust.f90 @@ -81,7 +81,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 @@ -164,7 +164,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 @@ -566,7 +566,7 @@ END IF ! IF ( tpfile%lopened ) THEN ZW(:,:,:)=SUM(ZNAS,4)-ZW(:,:,:) - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'NACT', & CSTDNAME = '', & CLONGNAME = 'NACT', & diff --git a/src/MNH/lima_warm_nucl.f90 b/src/MNH/lima_warm_nucl.f90 index 8f50a8798..ce103114d 100644 --- a/src/MNH/lima_warm_nucl.f90 +++ b/src/MNH/lima_warm_nucl.f90 @@ -110,7 +110,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 @@ -202,7 +202,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 @@ -513,7 +513,7 @@ IF ( tpfile%lopened ) THEN ZW2(:,:,:) = 0. END IF - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'SMAX', & CSTDNAME = '', & CLONGNAME = 'SMAX', & @@ -526,7 +526,7 @@ IF ( tpfile%lopened ) THEN LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZW) ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'NACT', & CSTDNAME = '', & CLONGNAME = 'NACT', & diff --git a/src/MNH/menu_diachro.f90 b/src/MNH/menu_diachro.f90 index 88149a569..f6d0ff1c9 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,7 +115,7 @@ IF(HGROUP == 'END')THEN ILENG=NMNHNAMELGTMAX*IGROUP - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'MENU_BUDGET.DIM', & CSTDNAME = '', & CLONGNAME = 'MENU_BUDGET.DIM', & @@ -135,7 +135,7 @@ IF(HGROUP == 'END')THEN ENDDO ENDDO - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'MENU_BUDGET', & CSTDNAME = '', & CLONGNAME = 'MENU_BUDGET', & @@ -156,7 +156,7 @@ ELSE IF(HGROUP == 'READ')THEN tzfile = tpdiafile tzfile%cformat = 'LFI' - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'MENU_BUDGET.DIM', & CSTDNAME = '', & CLONGNAME = 'MENU_BUDGET.DIM', & @@ -175,7 +175,7 @@ ELSE IF(HGROUP == 'READ')THEN ENDIF ALLOCATE(ITABCHAR(ILENG)) - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'MENU_BUDGET', & CSTDNAME = '', & CLONGNAME = 'MENU_BUDGET', & diff --git a/src/MNH/mnh2lpdm_ech.f90 b/src/MNH/mnh2lpdm_ech.f90 index 62d3d9939..37bd578e9 100644 --- a/src/MNH/mnh2lpdm_ech.f90 +++ b/src/MNH/mnh2lpdm_ech.f90 @@ -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,7 +110,7 @@ CALL IO_Field_read(TPFILE,'WT', XWT) CALL IO_Field_read(TPFILE,'THT', XTHT) CALL IO_Field_read(TPFILE,'TKET', XTKET) -tzfield = tfielddata( & +tzfield = tfieldmetadata( & cmnhname = 'LM', & clongname = '', & cunits = 'm', & @@ -121,7 +121,7 @@ tzfield = tfielddata( & ndims = 3 ) CALL IO_Field_read(TPFILE, tzfield, XLM) -tzfield = tfielddata( & +tzfield = tfieldmetadata(& cmnhname = 'THW_FLX', & clongname = '', & cunits = 'K s-1', & !correct? @@ -132,7 +132,7 @@ tzfield = tfielddata( & ndims = 3 ) CALL IO_Field_read(TPFILE, tzfield, XWPTHP) -tzfield = tfielddata( & +tzfield = tfieldmetadata( & cmnhname = 'DISS', & clongname = '', & cunits = '', & !TODO: set units @@ -143,7 +143,7 @@ tzfield = tfielddata( & ndims = 3 ) CALL IO_Field_read(TPFILE, tzfield, XDISSIP) -tzfield = tfielddata( & +tzfield = tfieldmetadata( & cmnhname = 'FMU', & clongname = '', & cunits = 'kg m-1 s-2', & @@ -154,7 +154,7 @@ tzfield = tfielddata( & ndims = 2 ) CALL IO_Field_read(TPFILE, tzfield, XSFU) -tzfield = tfielddata( & +tzfield = tfieldmetadata( & cmnhname = 'FMV', & clongname = '', & cunits = 'kg m-1 s-2', & diff --git a/src/MNH/mnh2lpdm_ini.f90 b/src/MNH/mnh2lpdm_ini.f90 index 52a31e084..4993f4c29 100644 --- a/src/MNH/mnh2lpdm_ini.f90 +++ b/src/MNH/mnh2lpdm_ini.f90 @@ -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,15 +207,15 @@ CALL IO_Field_read(TPFILE1,'ZS',XZS) ! !* 2.8 Rugosite Z0. ! -tzfield = tfielddata( & - cmnhname = 'Z0', & - clongname = '', & - cunits = 'm', & - cdir = 'XY', & - ccomment = 'X_Y_Z0', & - ngrid = 4, & - ntype = TYPEREAL, & - 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/paspol.f90 b/src/MNH/paspol.f90 index 19ef98129..7287cb0b4 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 @@ -143,8 +143,8 @@ REAL :: ZP, ZTH, ZT, ZRHO, ZMASAIR REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRHOM ! 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,15 +579,15 @@ END DO !* 3.4 Ecriture conditionnelle. ! IF ( tpfile%lopened ) THEN - TZFIELD = TFIELDDATA( & + 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. ) + CSTDNAME = '', & + CUNITS = 'm-3', & + CDIR = 'XY', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) ! DO JSV=1,NSV_PP WRITE(TZFIELD%CMNHNAME,'(A3,I3.3)')'ATC',JSV+NSV_PPBEG-1 diff --git a/src/MNH/prandtl.f90 b/src/MNH/prandtl.f90 index 370e025c4..01e4320f2 100644 --- a/src/MNH/prandtl.f90 +++ b/src/MNH/prandtl.f90 @@ -197,7 +197,7 @@ USE MODD_CST USE MODD_CONF USE MODD_CTURB USE MODD_DYN_n, ONLY: LOCEAN -use modd_field, only: tfielddata, TYPEREAL +use modd_field, only: tfieldmetadata, TYPEREAL USE MODD_IO, ONLY: TFILEDATA USE MODD_PARAMETERS ! @@ -270,7 +270,7 @@ INTEGER:: JSV ! loop index for the scalar variables INTEGER :: JLOOP REAL :: ZMINVAL -TYPE(TFIELDDATA) :: TZFIELD +TYPE(TFIELDMETADATA) :: TZFIELD ! --------------------------------------------------------------------------- ! !* 1. DEFAULT VALUES, 1D REDELSPERGER NUMBERS @@ -538,7 +538,7 @@ END IF ! end of HTURBDIM if-block IF ( OTURB_DIAG .AND. tpfile%lopened ) THEN ! ! stores the RED_TH1 - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'RED_TH1', & CSTDNAME = '', & CLONGNAME = 'RED_TH1', & @@ -552,7 +552,7 @@ IF ( OTURB_DIAG .AND. tpfile%lopened ) THEN CALL IO_Field_write(TPFILE,TZFIELD,PREDTH1) ! ! stores the RED_R1 - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'RED_R1', & CSTDNAME = '', & CLONGNAME = 'RED_R1', & @@ -566,7 +566,7 @@ IF ( OTURB_DIAG .AND. tpfile%lopened ) THEN CALL IO_Field_write(TPFILE,TZFIELD,PREDR1) ! ! stores the RED2_TH3 - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'RED2_TH3', & CSTDNAME = '', & CLONGNAME = 'RED2_TH3', & @@ -580,7 +580,7 @@ IF ( OTURB_DIAG .AND. tpfile%lopened ) THEN CALL IO_Field_write(TPFILE,TZFIELD,PRED2TH3) ! ! stores the RED2_R3 - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'RED2_R3', & CSTDNAME = '', & CLONGNAME = 'RED2_R3', & @@ -594,7 +594,7 @@ IF ( OTURB_DIAG .AND. tpfile%lopened ) THEN CALL IO_Field_write(TPFILE,TZFIELD,PRED2R3) ! ! stores the RED2_THR3 - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'RED2_THR3', & CSTDNAME = '', & CLONGNAME = 'RED2_THR3', & diff --git a/src/MNH/radiations.f90 b/src/MNH/radiations.f90 index b6151ba3f..809d0d6f0 100644 --- a/src/MNH/radiations.f90 +++ b/src/MNH/radiations.f90 @@ -133,7 +133,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 @@ -535,7 +535,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) :: TZFIELD2D, TZFIELD3D +TYPE(TFIELDMeTaDATA) :: TZFIELD2D, TZFIELD3D ! REAL, DIMENSION(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3)) :: ZDZPABST REAL :: ZMINVAL @@ -2684,7 +2684,7 @@ IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN ZSTORE_3D2(:,:,:) = 0.0 ZSTORE_2D(:,:) = 0.0 ! - TZFIELD2D = TFIELDDATA( & + TZFIELD2D = TFIELDMETADATA( & CMNHNAME = 'generic 2D for radiations', & !Temporary name to ease identification CSTDNAME = '', & CDIR = 'XY', & @@ -2693,7 +2693,7 @@ IF( tpfile%lopened .AND. (KRAD_DIAG >= 1) ) THEN NDIMS = 2, & LTIMEDEP = .TRUE. ) - TZFIELD3D = TFIELDDATA( & + TZFIELD3D = TFIELDMETADATA( & CMNHNAME = 'generic 3D for radiations', & !Temporary name to ease identification CSTDNAME = '', & CDIR = 'XY', & diff --git a/src/MNH/rain_c2r2_khko.f90 b/src/MNH/rain_c2r2_khko.f90 index 2aa49c4a4..cc19dbbf0 100644 --- a/src/MNH/rain_c2r2_khko.f90 +++ b/src/MNH/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,7 +595,7 @@ end if !! !! ! IF ( tpfile%lopened ) THEN -! TZFIELD = TFIELDDATA( & +! TZFIELD = TFIELDMETADATA( & ! CMNHNAME = 'ZCHEN', & ! CSTDNAME = '', & ! CLONGNAME = 'ZCHEN', & @@ -879,7 +879,7 @@ INUCT = COUNTJV( GNUCT(:,:,:),I1(:),I2(:),I3(:)) ! END IF ! IF ( tpfile%lopened ) THEN - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'SMAX', & CSTDNAME = '', & CLONGNAME = 'SMAX', & @@ -1898,7 +1898,7 @@ DO JN = 1 , KSPLITR END IF ! IF ( OSEDC .AND. tpfile%lopened ) THEN - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'SEDFLUXC', & CSTDNAME = '', & CLONGNAME = 'SEDFLUXC', & @@ -1911,7 +1911,7 @@ DO JN = 1 , KSPLITR LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWSEDC) ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'SEDFLUXR', & CSTDNAME = '', & CLONGNAME = 'SEDFLUXR', & diff --git a/src/MNH/read_dummy_gr_fieldn.f90 b/src/MNH/read_dummy_gr_fieldn.f90 index 7aa4136af..edb10fbbf 100644 --- a/src/MNH/read_dummy_gr_fieldn.f90 +++ b/src/MNH/read_dummy_gr_fieldn.f90 @@ -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,7 +147,7 @@ END IF ! ! IF (TPINIFILE%NMNHVERSION(1)>=4) THEN - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'DUMMY_GR_NBR', & CSTDNAME = '', & CLONGNAME = 'DUMMY_GR_NBR', & @@ -177,7 +177,7 @@ 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 = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = TRIM(YRECFM), & CSTDNAME = '', & CLONGNAME = TRIM(YRECFM), & diff --git a/src/MNH/read_field.f90 b/src/MNH/read_field.f90 index 1f8d4b3ca..90b6c3552 100644 --- a/src/MNH/read_field.f90 +++ b/src/MNH/read_field.f90 @@ -274,7 +274,7 @@ USE MODD_CTURB USE MODD_DUST 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 @@ -424,7 +424,7 @@ CHARACTER(LEN=2) :: INDICE CHARACTER(LEN=3) :: YFRC ! To mark the different forcing dates CHARACTER(LEN=15) :: YVAL REAL, DIMENSION(KIU,KJU,KKU) :: ZWORK ! to compute supersaturation -TYPE(TFIELDDATA) :: TZFIELD +TYPE(TFIELDMETADATA) :: TZFIELD ! !------------------------------------------------------------------------------- ! @@ -443,27 +443,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 @@ -478,7 +478,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 @@ -512,7 +512,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 @@ -526,7 +526,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 @@ -540,7 +540,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 @@ -554,7 +554,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 @@ -568,7 +568,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 @@ -582,7 +582,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 @@ -596,7 +596,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 diff --git a/src/MNH/read_hgrid.f90 b/src/MNH/read_hgrid.f90 index c695be83b..30a92650b 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 41385f588..d75ca9bba 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-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. @@ -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 @@ -106,21 +106,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 ! @@ -279,12 +279,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 b8181b6d3..798985578 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(PINPRC) /= 0 .AND. (LDEPOSC .OR. LDEPOC .OR. MDEPOC) ) 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 881e58362..17648717d 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 +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,7 +71,7 @@ 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 = TFIELDDATA( & + TPFIELD = TFIELDMETADATA( & CMNHNAME = TRIM(HREC), & CSTDNAME = '', & CLONGNAME = TRIM(HREC), & @@ -140,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 @@ -164,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)) @@ -202,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) ! @@ -290,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, & @@ -336,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)) @@ -391,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 @@ -411,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 @@ -431,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 @@ -451,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 @@ -580,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 @@ -610,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)) @@ -716,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, & @@ -765,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)) @@ -809,7 +809,7 @@ CALL IO_Field_read(TPINFILE,'BUG', IBUGFIX) IF (IVERSION<7 .OR. (IVERSION==7 .AND. IBUGFIX==0)) THEN GCOVER_PACKED = .FALSE. ELSE - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'COVER_PACKED', & CSTDNAME = '', & CLONGNAME = 'COVER_PACKED', & @@ -825,7 +825,7 @@ END IF ! IF (.NOT. GCOVER_PACKED) THEN ICOVER=0 - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA(& CMNHNAME = 'generic no COVER_PACKED', & !Temporary name to ease identification CSTDNAME = '', & CUNITS = '', & @@ -913,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, & @@ -961,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)) @@ -1006,7 +1006,7 @@ CALL IO_Field_read(TPINFILE,'BUG', IBUGFIX) IF (IVERSION<7 .OR. (IVERSION==7 .AND. IBUGFIX==0)) THEN GCOVER_PACKED = .FALSE. ELSE - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'COVER_PACKED', & CSTDNAME = '', & CLONGNAME = 'COVER_PACKED', & @@ -1022,7 +1022,7 @@ END IF ! IF (.NOT. GCOVER_PACKED) THEN WRITE(YREC,'(A5,I3.3)') 'COVER',KCOVER - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = TRIM(YREC), & CSTDNAME = '', & CLONGNAME = TRIM(YREC), & @@ -1098,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 @@ -1118,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 ! !------------------------------------------------------------------------------- ! @@ -1193,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 ! @@ -1224,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)) @@ -1302,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 @@ -1323,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 !---------------------------------------------------------------------------- @@ -1457,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 ! @@ -1483,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)) ! @@ -1573,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 @@ -1592,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)) ! @@ -1669,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 @@ -1697,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)) @@ -1710,7 +1710,7 @@ 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 = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'STORAGETYPE', & CSTDNAME = '', & CLONGNAME = 'STORAGETYPE', & @@ -1793,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 @@ -1822,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)) @@ -1834,7 +1834,7 @@ 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 = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'STORAGETYPE', & CSTDNAME = '', & CLONGNAME = 'STORAGETYPE', & @@ -1858,7 +1858,7 @@ END IF ! RETURN !END IF ! -TZFIELD = TFIELDDATA( & +TZFIELD = TFIELDMETADATA( & CMNHNAME = TRIM(HREC)//'%TDATE', & CSTDNAME = '', & CLONGNAME = TRIM(HREC)//'%TDATE', & @@ -1884,7 +1884,7 @@ IF (KRESP /=0) THEN WRITE(ILUOUT,*) ' ' ENDIF ! -TZFIELD = TFIELDDATA( & +TZFIELD = TFIELDMETADATA( & CMNHNAME = TRIM(HREC)//'%xtime', & CSTDNAME = '', & CLONGNAME = TRIM(HREC)//'%xtime', & diff --git a/src/MNH/set_grid.f90 b/src/MNH/set_grid.f90 index 80b75a187..3945848c8 100644 --- a/src/MNH/set_grid.f90 +++ b/src/MNH/set_grid.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. @@ -214,7 +214,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 @@ -299,7 +299,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 @@ -336,12 +336,12 @@ IF (.NOT.LCARTESIAN) THEN ! ELSE 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) ! diff --git a/src/MNH/shallow_mf_pack.f90 b/src/MNH/shallow_mf_pack.f90 index b898b4bda..47816c603 100644 --- a/src/MNH/shallow_mf_pack.f90 +++ b/src/MNH/shallow_mf_pack.f90 @@ -129,7 +129,7 @@ use modd_budget, only: lbudget_u, lbudget_v, lbudget_th, lbudget_rv, lb USE MODD_CONF USE MODD_CST USE MODD_IO, ONLY: TFILEDATA -use modd_field, only: tfielddata, TYPEREAL +use modd_field, only: tfieldmetadata, TYPEREAL USE MODD_NSV USE MODD_PARAMETERS USE MODD_PARAM_ICE, ONLY: CFRAC_ICE_SHALLOW_MF @@ -258,7 +258,7 @@ REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3),SIZE(PSVM,4)) :: ZDSVDT INTEGER :: IIU, IJU, IKU, IKB, IKE, IRR, ISV INTEGER :: JK,JRR,JSV ! Loop counters -TYPE(TFIELDDATA) :: TZFIELD +TYPE(TFIELDMETADATA) :: TZFIELD !------------------------------------------------------------------------ !!! 1. Initialisation @@ -395,7 +395,7 @@ end if IF ( OMF_FLX .AND. tpfile%lopened ) THEN ! stores the conservative potential temperature vertical flux ZWORK(:,:,:)=RESHAPE(ZFLXZTHMF (:,:),(/ IIU,IJU,IKU /) ) - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'MF_THW_FLX', & CSTDNAME = '', & CLONGNAME = 'MF_THW_FLX', & @@ -410,7 +410,7 @@ IF ( OMF_FLX .AND. tpfile%lopened ) THEN ! ! stores the conservative mixing ratio vertical flux ZWORK(:,:,:)=RESHAPE(ZFLXZRMF(:,:),(/ IIU,IJU,IKU /) ) - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'MF_RCONSW_FLX', & CSTDNAME = '', & CLONGNAME = 'MF_RCONSW_FLX', & @@ -424,7 +424,7 @@ IF ( OMF_FLX .AND. tpfile%lopened ) THEN CALL IO_Field_write(TPFILE,TZFIELD,ZWORK) ! ! stores the theta_v vertical flux - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'MF_THVW_FLX', & CSTDNAME = '', & CLONGNAME = 'MF_THVW_FLX', & @@ -440,7 +440,7 @@ IF ( OMF_FLX .AND. tpfile%lopened ) THEN IF (OMIXUV) THEN ! stores the U momentum vertical flux ZWORK(:,:,:)=RESHAPE(ZFLXZUMF(:,:),(/ IIU,IJU,IKU /) ) - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'MF_UW_FLX', & CSTDNAME = '', & CLONGNAME = 'MF_UW_FLX', & @@ -455,7 +455,7 @@ IF ( OMF_FLX .AND. tpfile%lopened ) THEN ! ! stores the V momentum vertical flux ZWORK(:,:,:)=RESHAPE(ZFLXZVMF(:,:),(/ IIU,IJU,IKU /) ) - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'MF_VW_FLX', & CSTDNAME = '', & CLONGNAME = 'MF_VW_FLX', & diff --git a/src/MNH/spawn_field2.f90 b/src/MNH/spawn_field2.f90 index 44aa7c3ce..360cb0e0e 100644 --- a/src/MNH/spawn_field2.f90 +++ b/src/MNH/spawn_field2.f90 @@ -172,7 +172,7 @@ USE MODD_CST 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 @@ -279,7 +279,7 @@ LOGICAL :: GUSERV ! CHARACTER(LEN=15) :: YVAL CHARACTER(LEN=2) :: INDICE -TYPE(TFIELDDATA) :: TZFIELD +TYPE(TFIELDMETADATA) :: TZFIELD ! !------------------------------------------------------------------------------- ! diff --git a/src/MNH/tke_eps_sources.f90 b/src/MNH/tke_eps_sources.f90 index 40a902d17..d2df4fcf7 100644 --- a/src/MNH/tke_eps_sources.f90 +++ b/src/MNH/tke_eps_sources.f90 @@ -177,7 +177,7 @@ USE MODD_CONF USE MODD_CST USE MODD_CTURB USE MODD_DIAG_IN_RUN, ONLY: LDIAG_IN_RUN, XCURRENT_TKE_DISS -use modd_field, only: tfielddata, TYPEREAL +use modd_field, only: tfieldmetadata, TYPEREAL USE MODD_IO, ONLY: TFILEDATA USE MODD_LES USE MODD_PARAMETERS @@ -255,7 +255,7 @@ INTEGER :: IIU,IJU,IKU ! array size in the 3 dimensions ! 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 ! !---------------------------------------------------------------------------- NULLIFY(TZFIELDDISS_ll) @@ -415,7 +415,7 @@ IF ( OTURB_DIAG .AND. tpfile%lopened ) THEN ! ! stores the dynamic production ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'DP', & CSTDNAME = '', & CLONGNAME = 'DP', & @@ -430,7 +430,7 @@ IF ( OTURB_DIAG .AND. tpfile%lopened ) THEN ! ! stores the thermal production ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'TP', & CSTDNAME = '', & CLONGNAME = 'TP', & @@ -445,7 +445,7 @@ IF ( OTURB_DIAG .AND. tpfile%lopened ) THEN ! ! stores the whole turbulent transport ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'TR', & CSTDNAME = '', & CLONGNAME = 'TR', & @@ -460,7 +460,7 @@ IF ( OTURB_DIAG .AND. tpfile%lopened ) THEN ! ! stores the dissipation of TKE ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'DISS', & CSTDNAME = '', & CLONGNAME = 'DISS', & diff --git a/src/MNH/turb.f90 b/src/MNH/turb.f90 index 44178ca88..639cd19a0 100644 --- a/src/MNH/turb.f90 +++ b/src/MNH/turb.f90 @@ -360,7 +360,7 @@ USE MODD_CONF USE MODD_CST USE MODD_CTURB USE MODD_DYN_n, ONLY : LOCEAN -use modd_field, only: tfielddata, TYPEREAL +use modd_field, only: tfieldmetadata, TYPEREAL USE MODD_IO, ONLY: TFILEDATA USE MODD_LES USE MODD_NSV @@ -557,7 +557,7 @@ REAL :: ZALPHA ! work coefficient : REAL :: ZTIME1, ZTIME2 REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)):: ZTT,ZEXNE,ZLV,ZLS,ZCPH,ZCOR REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)):: ZSHEAR, ZDUDZ, ZDVDZ -TYPE(TFIELDDATA) :: TZFIELD +TYPE(TFIELDMETADATA) :: TZFIELD ! !------------------------------------------------------------------------------------------ ALLOCATE ( & @@ -699,7 +699,7 @@ IF (KRRL >=1) THEN ! ! IF ( tpfile%lopened .AND. OTURB_DIAG ) THEN - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'ATHETA', & CSTDNAME = '', & CLONGNAME = 'ATHETA', & @@ -712,7 +712,7 @@ IF (KRRL >=1) THEN LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZATHETA) ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'AMOIST', & CSTDNAME = '', & CLONGNAME = 'AMOIST', & @@ -1154,7 +1154,7 @@ IF ( OTURB_DIAG .AND. tpfile%lopened ) THEN ! ! stores the mixing length ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'LM', & CSTDNAME = '', & CLONGNAME = 'LM', & @@ -1171,7 +1171,7 @@ IF ( OTURB_DIAG .AND. tpfile%lopened ) THEN ! ! stores the conservative potential temperature ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'THLM', & CSTDNAME = '', & CLONGNAME = 'THLM', & @@ -1186,7 +1186,7 @@ IF ( OTURB_DIAG .AND. tpfile%lopened ) THEN ! ! stores the conservative mixing ratio ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'RNPM', & CSTDNAME = '', & CLONGNAME = 'RNPM', & @@ -1825,7 +1825,7 @@ ENDIF ! ! Impression before modification of the mixing length IF ( OTURB_DIAG .AND. tpfile%lopened ) THEN - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'LM_CLEAR_SKY', & CSTDNAME = '', & CLONGNAME = 'LM_CLEAR_SKY', & @@ -1852,7 +1852,7 @@ WHERE (PCEI(:,:,:) == -1.) PLEM(:,:,:) = ZLM_CLOUD(:,:,:) ! ---------- ! IF ( OTURB_DIAG .AND. tpfile%lopened ) THEN - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'COEF_AMPL', & CSTDNAME = '', & CLONGNAME = 'COEF_AMPL', & @@ -1865,7 +1865,7 @@ IF ( OTURB_DIAG .AND. tpfile%lopened ) THEN LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZCOEF_AMPL) ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'LM_CLOUD', & CSTDNAME = '', & CLONGNAME = 'LM_CLOUD', & diff --git a/src/MNH/turb_cloud_index.f90 b/src/MNH/turb_cloud_index.f90 index 44392d8fa..18c0e8ffb 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,7 +244,7 @@ ENDDO !* 2.5 Writing ! IF ( OTURB_DIAG .AND. tpfile%lopened ) THEN - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'RVCI', & CSTDNAME = '', & CLONGNAME = 'RVCI', & @@ -257,7 +257,7 @@ IF ( OTURB_DIAG .AND. tpfile%lopened ) THEN LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZRVCI) ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'GX_RVCI', & CSTDNAME = '', & CLONGNAME = 'GX_RVCI', & @@ -270,7 +270,7 @@ IF ( OTURB_DIAG .AND. tpfile%lopened ) THEN LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZG_RVCI(:,:,:,1)) ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'GY_RVCI', & CSTDNAME = '', & CLONGNAME = 'GY_RVCI', & @@ -283,7 +283,7 @@ IF ( OTURB_DIAG .AND. tpfile%lopened ) THEN LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZG_RVCI(:,:,:,2)) ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'GNORM_RVCI', & CSTDNAME = '', & CLONGNAME = 'GNORM_RVCI', & @@ -296,7 +296,7 @@ IF ( OTURB_DIAG .AND. tpfile%lopened ) THEN LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZGNORM_RVCI) ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'QX_RVCI', & CSTDNAME = '', & CLONGNAME = 'QX_RVCI', & @@ -309,7 +309,7 @@ IF ( OTURB_DIAG .AND. tpfile%lopened ) THEN LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZQ_RVCI(:,:,:,1)) ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'QY_RVCI', & CSTDNAME = '', & CLONGNAME = 'QY_RVCI', & @@ -322,7 +322,7 @@ IF ( OTURB_DIAG .AND. tpfile%lopened ) THEN LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZQ_RVCI(:,:,:,2)) ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'QNORM_RVCI', & CSTDNAME = '', & CLONGNAME = 'QNORM_RVCI', & @@ -335,7 +335,7 @@ IF ( OTURB_DIAG .AND. tpfile%lopened ) THEN LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZQNORM_RVCI) ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'CEI', & CSTDNAME = '', & CLONGNAME = 'CEI', & diff --git a/src/MNH/turb_hor_dyn_corr.f90 b/src/MNH/turb_hor_dyn_corr.f90 index a0c5ad948..8c9cb916f 100644 --- a/src/MNH/turb_hor_dyn_corr.f90 +++ b/src/MNH/turb_hor_dyn_corr.f90 @@ -144,7 +144,7 @@ USE MODD_ARGSLIST_ll, ONLY: LIST_ll USE MODD_CST USE MODD_CONF 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 @@ -256,7 +256,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 @@ -371,7 +371,7 @@ ZFLX(:,:,IKB-1) = 2. * ZFLX(:,:,IKB-1) - ZFLX(:,:,IKB) CALL UPDATE_HALO_ll(TZFIELDS_ll, IINFO_ll) IF ( tpfile%lopened .AND. OTURB_FLX ) THEN ! stores <U U> - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'U_VAR', & CSTDNAME = '', & CLONGNAME = 'U_VAR', & @@ -467,7 +467,7 @@ CALL UPDATE_HALO_ll(TZFIELDS_ll, IINFO_ll) ! IF ( tpfile%lopened .AND. OTURB_FLX ) THEN ! stores <V V> - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'V_VAR', & CSTDNAME = '', & CLONGNAME = 'V_VAR', & @@ -555,7 +555,7 @@ ZFLX(:,:,IKB-1) = 2. * ZFLX(:,:,IKB-1) - ZFLX(:,:,IKB) ! IF ( tpfile%lopened .AND. OTURB_FLX ) THEN ! stores <W W> - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'W_VAR', & CSTDNAME = '', & CLONGNAME = 'W_VAR', & diff --git a/src/MNH/turb_hor_sv_flux.f90 b/src/MNH/turb_hor_sv_flux.f90 index de501f779..c7db4b4b9 100644 --- a/src/MNH/turb_hor_sv_flux.f90 +++ b/src/MNH/turb_hor_sv_flux.f90 @@ -113,7 +113,7 @@ END MODULE MODI_TURB_HOR_SV_FLUX USE MODD_CST USE MODD_CONF 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_NSV, ONLY: NSV_LGBEG, NSV_LGEND @@ -187,7 +187,7 @@ REAL, DIMENSION(SIZE(PDZZ,1),SIZE(PDZZ,2),1+JPVEXT:3+JPVEXT) :: ZCOEFF ! CHARACTER(LEN=NMNHNAMELGTMAX) :: YMNHNAME INTEGER :: IKU -TYPE(TFIELDDATA) :: TZFIELD +TYPE(TFIELDMETADATA) :: TZFIELD REAL :: ZTIME1, ZTIME2 ! --------------------------------------------------------------------------- ! @@ -250,7 +250,7 @@ DO JSV=1,ISV ! stores <U SVth> IF ( tpfile%lopened .AND. OTURB_FLX ) THEN WRITE(YMNHNAME,'("USV_FLX_",I3.3)') JSV - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = TRIM( YMNHNAME ), & CSTDNAME = '', & CLONGNAME = TRIM( YMNHNAME ), & @@ -303,7 +303,7 @@ DO JSV=1,ISV ! stores <V SVth> IF ( tpfile%lopened .AND. OTURB_FLX ) THEN WRITE(YMNHNAME,'("VSV_FLX_",I3.3)') JSV - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = TRIM( YMNHNAME ), & CSTDNAME = '', & CLONGNAME = TRIM(TZFIELD%CMNHNAME), & diff --git a/src/MNH/turb_hor_thermo_corr.f90 b/src/MNH/turb_hor_thermo_corr.f90 index d5102212b..a59829330 100644 --- a/src/MNH/turb_hor_thermo_corr.f90 +++ b/src/MNH/turb_hor_thermo_corr.f90 @@ -121,7 +121,7 @@ END MODULE MODI_TURB_HOR_THERMO_CORR USE MODD_CST USE MODD_CONF 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 @@ -197,7 +197,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 ! ! --------------------------------------------------------------------------- ! @@ -266,7 +266,7 @@ IF ( ( KRRL > 0 .AND. OSUBG_COND) .OR. ( OTURB_FLX .AND. tpfile%lopened ) & ! ! stores <THl THl> IF ( OTURB_FLX .AND. tpfile%lopened ) THEN - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'THL_HVAR', & CSTDNAME = '', & CLONGNAME = 'THL_HVAR', & @@ -355,7 +355,7 @@ IF ( ( KRRL > 0 .AND. OSUBG_COND) .OR. ( OTURB_FLX .AND. tpfile%lopened ) & ! ! stores <THl Rnp> IF ( OTURB_FLX .AND. tpfile%lopened ) THEN - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'THLR_HCOR', & CSTDNAME = '', & CLONGNAME = 'THLR_HCOR', & @@ -424,7 +424,7 @@ IF ( ( KRRL > 0 .AND. OSUBG_COND) .OR. ( OTURB_FLX .AND. tpfile%lopened ) & ! ! stores <Rnp Rnp> IF ( OTURB_FLX .AND. tpfile%lopened ) THEN - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'R_HVAR', & CSTDNAME = '', & CLONGNAME = 'R_HVAR', & diff --git a/src/MNH/turb_hor_thermo_flux.f90 b/src/MNH/turb_hor_thermo_flux.f90 index a4dd3bdee..66191d4f5 100644 --- a/src/MNH/turb_hor_thermo_flux.f90 +++ b/src/MNH/turb_hor_thermo_flux.f90 @@ -130,7 +130,7 @@ END MODULE MODI_TURB_HOR_THERMO_FLUX USE MODD_CST USE MODD_CONF 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 @@ -214,7 +214,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 @@ -311,7 +311,7 @@ END IF ! ! stores the horizontal <U THl> IF ( tpfile%lopened .AND. OTURB_FLX ) THEN - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'UTHL_FLX', & CSTDNAME = '', & CLONGNAME = 'UTHL_FLX', & @@ -415,7 +415,7 @@ IF (KRR/=0) THEN ! ! stores the horizontal <U Rnp> IF ( tpfile%lopened .AND. OTURB_FLX ) THEN - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'UR_FLX', & CSTDNAME = '', & CLONGNAME = 'UR_FLX', & @@ -465,7 +465,7 @@ END IF !! ! !! ! stores the horizontal <U VPT> !! IF ( tpfile%lopened .AND. OTURB_FLX ) THEN -!! TZFIELD = TFIELDDATA( & +!! TZFIELD = TFIELDMETADATA( & !! CMNHNAME = 'UVPT_FLX', & !! CSTDNAME = '', & !! CLONGNAME = 'UVPT_FLX', & @@ -569,7 +569,7 @@ END IF ! ! stores the horizontal <V THl> IF ( tpfile%lopened .AND. OTURB_FLX ) THEN - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'VTHL_FLX', & CSTDNAME = '', & CLONGNAME = 'VTHL_FLX', & @@ -682,7 +682,7 @@ IF (KRR/=0) THEN ! ! stores the horizontal <V Rnp> IF ( tpfile%lopened .AND. OTURB_FLX ) THEN - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'VR_FLX', & CSTDNAME = '', & CLONGNAME = 'VR_FLX', & @@ -736,7 +736,7 @@ END IF !! ! !! ! stores the horizontal <V VPT> !! IF ( tpfile%lopened .AND. OTURB_FLX ) THEN -!! TZFIELD = TFIELDDATA( & +!! TZFIELD = TFIELDMETADATA( & !! CMNHNAME = 'VVPT_FLX', & !! CSTDNAME = '', & !! CLONGNAME = 'VVPT_FLX', & diff --git a/src/MNH/turb_hor_uv.f90 b/src/MNH/turb_hor_uv.f90 index 112c60c85..6c09be2ea 100644 --- a/src/MNH/turb_hor_uv.f90 +++ b/src/MNH/turb_hor_uv.f90 @@ -126,7 +126,7 @@ END MODULE MODI_TURB_HOR_UV USE MODD_CST USE MODD_CONF 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 @@ -208,7 +208,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 @@ -270,7 +270,7 @@ ZFLX(:,:,IKB-1:IKB-1) = 2. * MXM( MYM( ZFLX(:,:,IKB-1:IKB-1) ) ) & ! ! stores <U V> IF ( tpfile%lopened .AND. OTURB_FLX ) THEN - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'UV_FLX', & CSTDNAME = '', & CLONGNAME = 'UV_FLX', & diff --git a/src/MNH/turb_hor_uw.f90 b/src/MNH/turb_hor_uw.f90 index f1289d73a..9f467784e 100644 --- a/src/MNH/turb_hor_uw.f90 +++ b/src/MNH/turb_hor_uw.f90 @@ -117,7 +117,7 @@ END MODULE MODI_TURB_HOR_UW USE MODD_CST USE MODD_CONF 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 @@ -187,7 +187,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 @@ -220,7 +220,7 @@ ZFLX(:,:,IKB-1)=2.*ZFLX(:,:,IKB)- ZFLX(:,:,IKB+1) ! ! stores <U W> IF ( tpfile%lopened .AND. OTURB_FLX ) THEN - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'UW_HFLX', & CSTDNAME = '', & CLONGNAME = 'UW_HFLX', & diff --git a/src/MNH/turb_hor_vw.f90 b/src/MNH/turb_hor_vw.f90 index 48f5be9bc..92939a549 100644 --- a/src/MNH/turb_hor_vw.f90 +++ b/src/MNH/turb_hor_vw.f90 @@ -113,7 +113,7 @@ END MODULE MODI_TURB_HOR_VW USE MODD_CST USE MODD_CONF 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 @@ -182,7 +182,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 @@ -222,7 +222,7 @@ ZFLX(:,:,IKB-1)= 2.*ZFLX(:,:,IKB) - ZFLX(:,:,IKB+1) ! ! stores <V W> IF ( tpfile%lopened .AND. OTURB_FLX ) THEN - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'VW_HFLX', & CSTDNAME = '', & CLONGNAME = 'VW_HFLX', & diff --git a/src/MNH/turb_ver.f90 b/src/MNH/turb_ver.f90 index d7b0f4800..f701567c8 100644 --- a/src/MNH/turb_ver.f90 +++ b/src/MNH/turb_ver.f90 @@ -320,7 +320,7 @@ END MODULE MODI_TURB_VER USE MODD_CST USE MODD_CTURB USE MODD_DYN_n, ONLY: LOCEAN -use modd_field, only: tfielddata, TYPEREAL +use modd_field, only: tfieldmetadata, TYPEREAL USE MODD_IO, ONLY: TFILEDATA USE MODD_PARAMETERS USE MODD_LES @@ -475,7 +475,7 @@ INTEGER :: IKB,IKE ! index value for the Beginning INTEGER :: JSV ! loop counter on scalar variables REAL :: ZTIME1 REAL :: ZTIME2 -TYPE(TFIELDDATA) :: TZFIELD +TYPE(TFIELDMETADATA) :: TZFIELD !---------------------------------------------------------------------------- ALLOCATE ( ZBETA(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) ,& ZSQRT_TKE(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)),& @@ -696,7 +696,7 @@ IF ( OTURB_FLX .AND. tpfile%lopened ) THEN ! ! stores the Turbulent Prandtl number ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'PHI3', & CSTDNAME = '', & CLONGNAME = 'PHI3', & @@ -711,7 +711,7 @@ IF ( OTURB_FLX .AND. tpfile%lopened ) THEN ! ! stores the Turbulent Schmidt number ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'PSI3', & CSTDNAME = '', & CLONGNAME = 'PSI3', & @@ -727,7 +727,7 @@ IF ( OTURB_FLX .AND. tpfile%lopened ) THEN ! ! stores the Turbulent Schmidt number for the scalar variables ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'generic for SV in turb_ver', & !Temporary name to ease identification CSTDNAME = '', & CUNITS = '1', & diff --git a/src/MNH/turb_ver_dyn_flux.f90 b/src/MNH/turb_ver_dyn_flux.f90 index ad27b69f2..fcf13abe7 100644 --- a/src/MNH/turb_ver_dyn_flux.f90 +++ b/src/MNH/turb_ver_dyn_flux.f90 @@ -290,7 +290,7 @@ USE MODD_CONF USE MODD_CST USE MODD_CTURB USE MODD_DYN_n, ONLY: LOCEAN -use modd_field, only: tfielddata, TYPEREAL +use modd_field, only: tfieldmetadata, TYPEREAL USE MODD_IO, ONLY: TFILEDATA USE MODD_LES USE MODD_NSV @@ -404,7 +404,7 @@ REAL, DIMENSION(SIZE(PDZZ,1),SIZE(PDZZ,2),1) :: ZCOEFFLXU, & INTEGER :: IIU,IJU ! size of array in x,y,z directions ! REAL :: ZTIME1, ZTIME2 -TYPE(TFIELDDATA) :: TZFIELD +TYPE(TFIELDMETADATA) :: TZFIELD !---------------------------------------------------------------------------- ! !* 1. PRELIMINARIES @@ -541,7 +541,7 @@ END IF ! IF ( OTURB_FLX .AND. tpfile%lopened ) THEN ! stores the U wind component vertical flux - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'UW_VFLX', & CSTDNAME = '', & CLONGNAME = 'UW_VFLX', & @@ -770,7 +770,7 @@ END IF ! IF ( OTURB_FLX .AND. tpfile%lopened ) THEN ! stores the V wind component vertical flux - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'VW_VFLX', & CSTDNAME = '', & CLONGNAME = 'VW_VFLX', & @@ -908,7 +908,7 @@ IF ( OTURB_FLX .AND. tpfile%lopened .AND. HTURBDIM == '1DIM') THEN ! to be tested & ! +XCMFB*(4./3.)*PLM(:,:,:)/SQRT(PTKEM(:,:,:))*PTP(:,:,:) ! stores the W variance - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'W_VVAR', & CSTDNAME = '', & CLONGNAME = 'W_VVAR', & diff --git a/src/MNH/turb_ver_sv_flux.f90 b/src/MNH/turb_ver_sv_flux.f90 index 08491bc73..8a742e185 100644 --- a/src/MNH/turb_ver_sv_flux.f90 +++ b/src/MNH/turb_ver_sv_flux.f90 @@ -270,7 +270,7 @@ END MODULE MODI_TURB_VER_SV_FLUX ! 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 @@ -360,7 +360,7 @@ REAL :: ZCSVP = 4.0 ! constant for scalar flux presso-correlation (RS81) REAL :: ZCSV !constant for the scalar flux ! CHARACTER(LEN=NMNHNAMELGTMAX) :: YMNHNAME -TYPE(TFIELDDATA) :: TZFIELD +TYPE(TFIELDMETADATA) :: TZFIELD !---------------------------------------------------------------------------- ! !* 1. PRELIMINARIES @@ -455,7 +455,7 @@ DO JSV=1,ISV IF (OTURB_FLX .AND. tpfile%lopened) THEN ! stores the JSVth vertical flux WRITE(YMNHNAME,'("WSV_FLX_",I3.3)') JSV - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = TRIM( YMNHNAME ), & CSTDNAME = '', & CLONGNAME = TRIM( YMNHNAME ), & diff --git a/src/MNH/turb_ver_thermo_corr.f90 b/src/MNH/turb_ver_thermo_corr.f90 index 0175f76c9..031c9cd2f 100644 --- a/src/MNH/turb_ver_thermo_corr.f90 +++ b/src/MNH/turb_ver_thermo_corr.f90 @@ -312,7 +312,7 @@ END MODULE MODI_TURB_VER_THERMO_CORR ! 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_CONF @@ -439,7 +439,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 @@ -568,7 +568,7 @@ END IF ! ! stores <THl THl> IF ( OTURB_FLX .AND. tpfile%lopened ) THEN - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'THL_VVAR', & CSTDNAME = '', & CLONGNAME = 'THL_VVAR', & @@ -696,7 +696,7 @@ END IF END IF ! stores <THl Rnp> IF ( OTURB_FLX .AND. tpfile%lopened ) THEN - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'THLRCONS_VCOR', & CSTDNAME = '', & CLONGNAME = 'THLRCONS_VCOR', & @@ -804,7 +804,7 @@ END IF END IF ! stores <Rnp Rnp> IF ( OTURB_FLX .AND. tpfile%lopened ) THEN - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'RTOT_VVAR', & CSTDNAME = '', & CLONGNAME = 'RTOT_VVAR', & diff --git a/src/MNH/turb_ver_thermo_flux.f90 b/src/MNH/turb_ver_thermo_flux.f90 index 816cb9a4e..aa53f0822 100644 --- a/src/MNH/turb_ver_thermo_flux.f90 +++ b/src/MNH/turb_ver_thermo_flux.f90 @@ -338,7 +338,7 @@ END MODULE MODI_TURB_VER_THERMO_FLUX ! USE MODD_CST USE MODD_CTURB -use modd_field, only: tfielddata, TYPEREAL +use modd_field, only: tfieldmetadata, TYPEREAL USE MODD_GRID_n, ONLY: XZS, XXHAT, XYHAT USE MODD_IO, ONLY: TFILEDATA USE MODD_METRICS_n, ONLY: XDXX, XDYY, XDZX, XDZY, XDZZ @@ -522,7 +522,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 @@ -753,7 +753,7 @@ END IF ! IF ( OTURB_FLX .AND. tpfile%lopened ) THEN ! stores the conservative potential temperature vertical flux - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'THW_FLX', & CSTDNAME = '', & CLONGNAME = 'THW_FLX', & @@ -990,7 +990,7 @@ IF (KRR /= 0) THEN ! IF ( OTURB_FLX .AND. tpfile%lopened ) THEN ! stores the conservative mixing ratio vertical flux - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'RCONSW_FLX', & CSTDNAME = '', & CLONGNAME = 'RCONSW_FLX', & @@ -1080,7 +1080,7 @@ IF ( ((OTURB_FLX .AND. tpfile%lopened) .OR. LLES_CALL) .AND. (KRRL > 0) ) THEN ! ! store the liquid water mixing ratio vertical flux IF ( OTURB_FLX .AND. tpfile%lopened ) THEN - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'RCW_FLX', & CSTDNAME = '', & CLONGNAME = 'RCW_FLX', & diff --git a/src/MNH/uv_to_zonal_and_merid.f90 b/src/MNH/uv_to_zonal_and_merid.f90 index 6ce72b8c2..95d768766 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_thermo.f90 b/src/MNH/ver_thermo.f90 index d7462dd35..a4e8ee654 100644 --- a/src/MNH/ver_thermo.f90 +++ b/src/MNH/ver_thermo.f90 @@ -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,7 +295,7 @@ DO JRR=1,SIZE(XRT,4) END DO ! IF (NVERB>=10) THEN - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'THV', & CSTDNAME = '', & CLONGNAME = 'THV', & diff --git a/src/MNH/write_balloonn.f90 b/src/MNH/write_balloonn.f90 index cc6d8269c..8d20985f5 100644 --- a/src/MNH/write_balloonn.f90 +++ b/src/MNH/write_balloonn.f90 @@ -96,7 +96,7 @@ CONTAINS !------------------------------------------------------------------------------- SUBROUTINE WRITE_LFI_BALLOON(TPFLYER) ! -use modd_field, only: tfielddata, TYPEREAL +use modd_field, only: tfieldmetadata, TYPEREAL USE MODE_IO_FIELD_WRITE, only: IO_Field_write ! TYPE(FLYER), INTENT(IN) :: TPFLYER @@ -104,16 +104,16 @@ 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 +REAL :: ZLAT ! latitude of the balloon +REAL :: ZLON ! longitude of the balloon +TYPE(TFIELDMETADATA) :: TZFIELD ! ! CALL SM_LATLON(XLATORI,XLONORI, & TPFLYER%X_CUR,TPFLYER%Y_CUR,ZLAT,ZLON) ! ! -TZFIELD = TFIELDDATA( & +TZFIELD = TFIELDMETADATA( & CMNHNAME = TRIM(TPFLYER%TITLE)//'LAT', & CSTDNAME = '', & CLONGNAME = TRIM(TPFLYER%TITLE)//'LAT', & @@ -126,7 +126,7 @@ TZFIELD = TFIELDDATA( & LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZLAT) ! -TZFIELD = TFIELDDATA( & +TZFIELD = TFIELDMETADATA( & CMNHNAME = TRIM(TPFLYER%TITLE)//'LON', & CSTDNAME = '', & CLONGNAME = TRIM(TPFLYER%TITLE)//'LON', & @@ -139,7 +139,7 @@ TZFIELD = TFIELDDATA( & LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZLON) ! -TZFIELD = TFIELDDATA( & +TZFIELD = TFIELDMETADATA( & CMNHNAME = TRIM(TPFLYER%TITLE)//'ALT', & CSTDNAME = '', & CLONGNAME = TRIM(TPFLYER%TITLE)//'ALT', & @@ -152,7 +152,7 @@ TZFIELD = TFIELDDATA( & LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,TPFLYER%Z_CUR) ! -TZFIELD = TFIELDDATA( & +TZFIELD = TFIELDMETADATA( & CMNHNAME = TRIM(TPFLYER%TITLE)//'WASCENT', & CSTDNAME = '', & CLONGNAME = TRIM(TPFLYER%TITLE)//'WASCENT', & @@ -165,7 +165,7 @@ TZFIELD = TFIELDDATA( & LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,TPFLYER%WASCENT) ! -TZFIELD = TFIELDDATA( & +TZFIELD = TFIELDMETADATA( & CMNHNAME = TRIM(TPFLYER%TITLE)//'RHO', & CSTDNAME = '', & CLONGNAME = TRIM(TPFLYER%TITLE)//'RHO', & diff --git a/src/MNH/write_budget.f90 b/src/MNH/write_budget.f90 index 9f82ff30c..3f09ddc78 100644 --- a/src/MNH/write_budget.f90 +++ b/src/MNH/write_budget.f90 @@ -105,7 +105,7 @@ 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: NCOMMENTLGTMAX, NMNHNAMELGTMAX @@ -135,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 ! !------------------------------------------------------------------------------- ! @@ -147,7 +147,7 @@ subroutine Write_budget( tpdiafile, tpdtcur, ptstep, ksv ) !* Write TSTEP and BULEN ! --------------------- ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'TSTEP', & CSTDNAME = '', & CLONGNAME = 'TSTEP', & @@ -160,7 +160,7 @@ subroutine Write_budget( tpdiafile, tpdtcur, ptstep, ksv ) LTIMEDEP = .FALSE. ) CALL IO_Field_write(TPDIAFILE,TZFIELD,PTSTEP) ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'BULEN', & CSTDNAME = '', & CLONGNAME = 'BULEN', & @@ -251,7 +251,7 @@ subroutine Write_budget( tpdiafile, tpdtcur, ptstep, ksv ) Write( ymnhname, fmt = "( 'MASK_', i4.4, '.MASK' )" ) nbutshift Write( ycomment, fmt = "( 'X_Y_MASK', i4.4 )" ) nbutshift - tzfield = tfielddata( & + tzfield = tfieldmetadata( & cmnhname = Trim( ymnhname ), & cstdname = '', & clongname = Trim( ymnhname ), & @@ -276,7 +276,7 @@ subroutine Write_budget( tpdiafile, tpdtcur, ptstep, ksv ) tzfile = tpdiafile tzfile%cformat = 'NETCDF4' - tzfield = tfielddata( & + tzfield = tfieldmetadata( & cmnhname = CMASK_VARNAME, & cstdname = '', & clongname = CMASK_VARNAME, & diff --git a/src/MNH/write_diachro.f90 b/src/MNH/write_diachro.f90 index 9265bd855..955030068 100644 --- a/src/MNH/write_diachro.f90 +++ b/src/MNH/write_diachro.f90 @@ -146,7 +146,7 @@ use modd_budget, only: NLVL_CATEGORY, NLVL_GROUP, NLVL_SHAPE, nbumask, n use modd_field, only: NMNHDIM_ONE, NMNHDIM_UNKNOWN, NMNHDIM_BUDGET_LES_MASK, & NMNHDIM_FLYER_TIME, NMNHDIM_NOTLISTED, NMNHDIM_UNUSED, & TYPECHAR, TYPEINT, TYPEREAL, & - tfieldmetadata_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 @@ -196,7 +196,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' ) @@ -408,7 +408,7 @@ ILENCOMMENT = LFICOMMENTLGT ! ! 1er enregistrement TYPE ! -TZFIELD = TFIELDDATA( & +TZFIELD = TFIELDMETADATA( & CMNHNAME = TRIM(ygroup)//'.TYPE', & CSTDNAME = '', & CLONGNAME = TRIM(ygroup)//'.TYPE', & @@ -423,7 +423,7 @@ 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 = TFIELDDATA( & +TZFIELD = TFIELDMETADATA( & CMNHNAME = TRIM(ygroup)//'.DIM', & CSTDNAME = '', & CLONGNAME = TRIM(ygroup)//'.DIM', & @@ -490,7 +490,7 @@ END SELECT ! ! 3eme enregistrement TITRE ! -TZFIELD = TFIELDDATA( & +TZFIELD = TFIELDMETADATA( & CMNHNAME = TRIM(ygroup)//'.TITRE', & CSTDNAME = '', & CLONGNAME = TRIM(ygroup)//'.TITRE', & @@ -508,7 +508,7 @@ deallocate( ytitles ) ! ! 4eme enregistrement UNITE ! -TZFIELD = TFIELDDATA( & +TZFIELD = TFIELDMETADATA( & CMNHNAME = TRIM(ygroup)//'.UNITE', & CSTDNAME = '', & CLONGNAME = TRIM(ygroup)//'.UNITE', & @@ -526,7 +526,7 @@ deallocate( yunits ) ! ! 5eme enregistrement COMMENT ! -TZFIELD = TFIELDDATA( & +TZFIELD = TFIELDMETADATA( & CMNHNAME = TRIM(ygroup)//'.COMMENT', & CSTDNAME = '', & CLONGNAME = TRIM(ygroup)//'.COMMENT', & @@ -569,7 +569,7 @@ DO J = 1,IP WRITE(YJ,'(I3)')J ENDIF IF ( gdistributed ) THEN - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = TRIM(ygroup)//'.PROC'//YJ, & CSTDNAME = '', & CLONGNAME = TRIM(ygroup)//'.PROC'//YJ, & @@ -584,7 +584,7 @@ DO J = 1,IP CALL IO_Field_write_BOX(tzfile,TZFIELD,'BUDGET',PVAR(:,:,:,:,:,J), & iil+JPHEXT,iih+JPHEXT,ijl+JPHEXT,ijh+JPHEXT) ELSE - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = TRIM(ygroup)//'.PROC'//YJ, & CSTDNAME = '', & CLONGNAME = TRIM(ygroup)//'.PROC'//YJ, & @@ -603,7 +603,7 @@ ENDDO ! ! 7eme enregistrement TRAJT ! -TZFIELD = TFIELDDATA( & +TZFIELD = TFIELDMETADATA( & CMNHNAME = TRIM(ygroup)//'.TRAJT', & CSTDNAME = '', & CLONGNAME = TRIM(ygroup)//'.TRAJT', & @@ -643,7 +643,7 @@ deallocate( ztimes ) ! 8eme enregistrement TRAJX ! IF(PRESENT(tpflyer))THEN - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = TRIM(ygroup)//'.TRAJX', & CSTDNAME = '', & CLONGNAME = TRIM(ygroup)//'.TRAJX', & @@ -656,7 +656,7 @@ IF(PRESENT(tpflyer))THEN LTIMEDEP = .FALSE. ) CALL IO_Field_write(tzfile,TZFIELD, Reshape( tpflyer%x, [1, Size( tpflyer%x), 1] ) ) ELSE IF ( ycategory == 'LES_budgets' .and. tpbudiachro%clevels(NLVL_SHAPE) == 'Cartesian' ) THEN - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = TRIM(ygroup)//'.TRAJX', & CSTDNAME = '', & CLONGNAME = TRIM(ygroup)//'.TRAJX', & @@ -676,7 +676,7 @@ ENDIF ! 9eme enregistrement TRAJY ! IF(PRESENT(tpflyer))THEN - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = TRIM(ygroup)//'.TRAJY', & CSTDNAME = '', & CLONGNAME = TRIM(ygroup)//'.TRAJY', & @@ -689,7 +689,7 @@ IF(PRESENT(tpflyer))THEN LTIMEDEP = .FALSE. ) CALL IO_Field_write(tzfile,TZFIELD, Reshape( tpflyer%y, [1, Size( tpflyer%y), 1] ) ) ELSE IF ( ycategory == 'LES_budgets' .and. tpbudiachro%clevels(NLVL_SHAPE) == 'Cartesian' ) THEN - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = TRIM(ygroup)//'.TRAJY', & CSTDNAME = '', & CLONGNAME = TRIM(ygroup)//'.TRAJY', & @@ -709,7 +709,7 @@ ENDIF ! 10eme enregistrement TRAJZ ! IF(PRESENT(tpflyer))THEN - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = TRIM(ygroup)//'.TRAJZ', & CSTDNAME = '', & CLONGNAME = TRIM(ygroup)//'.TRAJZ', & @@ -722,7 +722,7 @@ IF(PRESENT(tpflyer))THEN LTIMEDEP = .FALSE. ) CALL IO_Field_write(tzfile,TZFIELD, Reshape( tpflyer%z, [1, Size( tpflyer%z), 1] ) ) ELSE IF ( ycategory == 'LES_budgets' .and. tpbudiachro%clevels(NLVL_SHAPE) == 'Cartesian' ) THEN - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = TRIM(ygroup)//'.TRAJZ', & CSTDNAME = '', & CLONGNAME = TRIM(ygroup)//'.TRAJZ', & @@ -744,7 +744,7 @@ ENDIF ! ! 11eme enregistrement PDATIME ! -TZFIELD = TFIELDDATA( & +TZFIELD = TFIELDMETADATA( & CMNHNAME = TRIM(ygroup)//'.DATIM', & CSTDNAME = '', & CLONGNAME = TRIM(ygroup)//'.DATIM', & @@ -834,7 +834,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' ) @@ -1495,7 +1495,7 @@ if ( Present( tpflyer ) ) then ystdnameprefix = 'projection' endif - tzfield = tfielddata( & + tzfield = tfieldmetadata( & cmnhname = 'X', & cstdname = Trim( ystdnameprefix ) // '_x_coordinate', & clongname = 'x-position of the flyer', & @@ -1523,7 +1523,7 @@ 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, tfieldmetadata_base +use modd_field, only: tfieldmetadata, tfieldmetadata_base use modd_io, only: isp, tfiledata use modd_parameters, only: jphext @@ -1552,7 +1552,7 @@ 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 ) @@ -1770,10 +1770,10 @@ 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, tfieldmetadata_base +use modd_field, only: NMNHDIM_BUDGET_TIME, NMNHDIM_UNUSED, NMNHMAXDIMS, tfieldmetadata, tfieldmetadata_base class(tfieldmetadata_base), intent(in) :: tpfieldin -type(tfielddata), intent(out) :: tpfieldout +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 diff --git a/src/MNH/write_dummy_gr_fieldn.f90 b/src/MNH/write_dummy_gr_fieldn.f90 index 6b9aa7949..c3e6096e0 100644 --- a/src/MNH/write_dummy_gr_fieldn.f90 +++ b/src/MNH/write_dummy_gr_fieldn.f90 @@ -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,7 +104,7 @@ ALLOCATE(ZWORK2D(SIZE(XDUMMY_GR_FIELDS,1),SIZE(XDUMMY_GR_FIELDS,2))) !* 3. Dummy fields : ! ------------ ! -TZFIELD = TFIELDDATA( & +TZFIELD = TFIELDMETADATA( & CMNHNAME = 'DUMMY_GR_NBR', & CSTDNAME = '', & CLONGNAME = 'DUMMY_GR_NBR', & @@ -122,7 +122,7 @@ DO JDUMMY=1,NDUMMY_GR_NBR YSTRING20=CDUMMY_GR_NAME(JDUMMY) YSTRING03=CDUMMY_GR_AREA(JDUMMY) ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = TRIM(YRECFM), & CSTDNAME = '', & CLONGNAME = TRIM(YRECFM), & diff --git a/src/MNH/write_lbn.f90 b/src/MNH/write_lbn.f90 index f3614c14a..001d85f1d 100644 --- a/src/MNH/write_lbn.f90 +++ b/src/MNH/write_lbn.f90 @@ -121,7 +121,7 @@ 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 +use modd_field, only: tfieldmetadata, TYPELOG, TYPEREAL ! ! IMPLICIT NONE @@ -152,8 +152,8 @@ 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=100) :: YMSG +TYPE(TFIELDMETADATA) :: TZFIELD !------------------------------------------------------------------------------- ! !* 1. SOME INITIALIZATIONS @@ -213,7 +213,7 @@ IF (NRR >=1) THEN LHORELAX_RI .OR. LHORELAX_RS .OR. LHORELAX_RG .OR. & LHORELAX_RH ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'HORELAX_R', & CSTDNAME = '', & CLONGNAME = 'HORELAX_R', & @@ -269,7 +269,7 @@ END IF IF (NSV >=1) THEN GHORELAX_SV=ANY ( LHORELAX_SV ) ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'HORELAX_SV', & CSTDNAME = '', & CLONGNAME = 'HORELAX_SV', & diff --git a/src/MNH/write_lfifm1_for_diag.f90 b/src/MNH/write_lfifm1_for_diag.f90 index 6f4d6d5c4..e94351e1e 100644 --- a/src/MNH/write_lfifm1_for_diag.f90 +++ b/src/MNH/write_lfifm1_for_diag.f90 @@ -156,7 +156,7 @@ END MODULE MODI_WRITE_LFIFM1_FOR_DIAG USE MODD_DIM_n USE MODD_CONF USE MODD_CONF_n -use modd_field, only: tfielddata, tfieldlist, TYPEINT, TYPEREAL +use modd_field, only: tfieldmetadata, tfieldlist, TYPEINT, TYPEREAL USE MODD_GRID USE MODD_GRID_n USE MODD_IO, ONLY : TFILEDATA @@ -343,8 +343,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 @@ -511,7 +511,7 @@ ZPOVO(:,:,:)= ZPOVO(:,:,:)*1E6/XRHODREF(:,:,:) ZPOVO(:,:,1) =-1.E+11 ZPOVO(:,:,IKU)=-1.E+11 IF (INDEX(CISO,'EV') /= 0) THEN - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'POVOT', & CSTDNAME = '', & CLONGNAME = 'POVOT', & @@ -531,7 +531,7 @@ IF (LVAR_RS) THEN CALL IO_Field_write(TPFILE,'VT',XVT) ! IF (LWIND_ZM) THEN - TZFIELD2(1) = TFIELDDATA( & + TZFIELD2(1) = TFIELDMETADATA( & CMNHNAME = 'UM_ZM', & CSTDNAME = '', & CLONGNAME = 'UM_ZM', & @@ -543,7 +543,7 @@ IF (LVAR_RS) THEN NDIMS = 3, & LTIMEDEP = .TRUE. ) ! - TZFIELD2(2) = TFIELDDATA( & + TZFIELD2(2) = TFIELDMETADATA( & CMNHNAME = 'VM_ZM', & CSTDNAME = '', & CLONGNAME = 'VM_ZM', & @@ -603,7 +603,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) ! @@ -611,7 +611,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) ! @@ -619,56 +619,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 @@ -679,7 +679,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) ! @@ -690,7 +690,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) ! @@ -700,17 +700,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 @@ -740,7 +740,7 @@ IF (LVAR_PR ) THEN ZWORK23(:,:) = 0. END DO !* Precipitable water in kg/m**2 - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'PRECIP_WAT', & CSTDNAME = '', & CLONGNAME = 'PRECIP_WAT', & @@ -820,7 +820,7 @@ IF (LHU_FLX) THEN ENDIF ! Ecriture ! composantes U et V du flux surfacique d'humidit� - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'UM90', & CSTDNAME = '', & CLONGNAME = 'UM90', & @@ -833,7 +833,7 @@ IF (LHU_FLX) THEN LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'VM90', & CSTDNAME = '', & CLONGNAME = 'VM90', & @@ -846,7 +846,7 @@ IF (LHU_FLX) THEN LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK32) ! composantes U et V du flux d'humidit� int�gr� sur 3000 metres - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'UM91', & CSTDNAME = '', & CLONGNAME = 'UM91', & @@ -859,7 +859,7 @@ IF (LHU_FLX) THEN LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21) ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'VM91', & CSTDNAME = '', & CLONGNAME = 'VM91', & @@ -873,7 +873,7 @@ IF (LHU_FLX) THEN CALL IO_Field_write(TPFILE,TZFIELD,ZWORK22) ! ! Convergence d'humidit� - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'HMCONV', & CSTDNAME = '', & CLONGNAME = 'HMCONV', & @@ -887,7 +887,7 @@ IF (LHU_FLX) THEN CALL IO_Field_write(TPFILE,TZFIELD,-ZWORK35) ! ! Convergence d'humidit� int�gr� sur 3000 m�tres - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'HMCONV3000', & CSTDNAME = '', & CLONGNAME = 'HMCONV3000', & @@ -902,7 +902,7 @@ IF (LHU_FLX) THEN ! IF (CCLOUD(1:3) == 'ICE' .OR. CCLOUD == 'LIMA') THEN ! composantes U et V du flux surfacique d'hydrom�t�ores - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'UM92', & CSTDNAME = '', & CLONGNAME = 'UM92', & @@ -915,7 +915,7 @@ IF (LHU_FLX) THEN LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK33) ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'VM92', & CSTDNAME = '', & CLONGNAME = 'VM92', & @@ -928,7 +928,7 @@ IF (LHU_FLX) THEN LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK34) ! composantes U et V du flux d'hydrom�t�ores int�gr� sur 3000 metres - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'UM93', & CSTDNAME = '', & CLONGNAME = 'UM93', & @@ -941,7 +941,7 @@ IF (LHU_FLX) THEN LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK23) ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'VM93', & CSTDNAME = '', & CLONGNAME = 'VM93', & @@ -954,7 +954,7 @@ IF (LHU_FLX) THEN LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK24) ! Convergence d'hydrom�t�ores - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'HMCONV_TT', & CSTDNAME = '', & CLONGNAME = 'HMCONV_TT', & @@ -967,7 +967,7 @@ IF (LHU_FLX) THEN LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,-ZWORK36) ! Convergence d'hydrom�t�ores int�gr� sur 3000 m�tres - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'HMCONV3000_TT', & CSTDNAME = '', & CLONGNAME = 'HMCONV3000_TT', & @@ -987,7 +987,7 @@ ENDIF IF (LVAR_MRW .OR. LLIMA_DIAG) THEN IF (NRR >=1) THEN ! Moist variables are written individually in file - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'generic for moist variables', & !Temporary name to ease identification CSTDNAME = '', & CDIR = 'XY', & @@ -1068,7 +1068,7 @@ END IF ! User scalar variables ! individually in the file IF (LVAR_MRSV) THEN - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'generic for scalar variables', & !Temporary name to ease identification CSTDNAME = '', & CUNITS = 'g kg-1', & @@ -1203,7 +1203,7 @@ IF (LLIMA_DIAG) THEN END DO ! IF (LUSERC) THEN - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'LWC', & CSTDNAME = '', & CLONGNAME = 'LWC', & @@ -1219,7 +1219,7 @@ IF (LLIMA_DIAG) THEN END IF ! IF (LUSERI) THEN - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'IWC', & CSTDNAME = '', & CLONGNAME = 'IWC', & @@ -1346,7 +1346,7 @@ END IF ! Blowing snow variables ! IF(LBLOWSNOW) THEN - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'SNWSUBL3D', & CSTDNAME = '', & CLONGNAME = 'SNWSUBL3D', & @@ -1366,7 +1366,7 @@ IF(LBLOWSNOW) THEN END DO ZWORK21(:,:) = ZWORK21(:,:)*1000. ! vapor water in mm unit ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'COL_SNWSUBL', & CSTDNAME = '', & CLONGNAME = 'COL_SNWSUBL', & @@ -1389,7 +1389,7 @@ IF(LBLOWSNOW) THEN CALL PPP2SNOW(XSVT(:,:,:,NSV_SNWBEG:NSV_SNWEND),XRHODREF,& PBET3D=ZBET_SNW, PRG3D=ZRG_SNW, PM3D=ZMA_SNW) ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'SNWRGA', & CSTDNAME = '', & CLONGNAME = 'SNWRGA', & @@ -1402,7 +1402,7 @@ IF(LBLOWSNOW) THEN LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZRG_SNW(:,:,:)) ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'SNWBETA', & CSTDNAME = '', & CLONGNAME = 'SNWBETA', & @@ -1415,7 +1415,7 @@ IF(LBLOWSNOW) THEN LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZBET_SNW(:,:,:)) ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'SNWNOA', & CSTDNAME = '', & CLONGNAME = 'SNWNOA', & @@ -1428,7 +1428,7 @@ IF(LBLOWSNOW) THEN LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZMA_SNW(:,:,:,1)) ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'SNWMASS', & CSTDNAME = '', & CLONGNAME = 'SNWMASS', & @@ -1447,7 +1447,7 @@ IF(LBLOWSNOW) THEN (XZZ(:,:,JK+1)-XZZ(:,:,JK))/XRHOLW END DO ZWORK21(:,:) = ZWORK21(:,:)*1000. ! vapor water in mm unit - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'THDS', & CSTDNAME = '', & CLONGNAME = 'THDS', & @@ -2066,7 +2066,7 @@ IF (LVAR_LS) THEN CALL IO_Field_write(TPFILE,'LSVM', XLSVM) ! IF (LWIND_ZM) THEN - TZFIELD2(1) = TFIELDDATA( & + TZFIELD2(1) = TFIELDMETADATA( & CMNHNAME = 'LSUM_ZM', & CSTDNAME = '', & CLONGNAME = 'LSUM_ZM', & @@ -2078,7 +2078,7 @@ IF (LVAR_LS) THEN NDIMS = 3, & LTIMEDEP = .TRUE. ) ! - TZFIELD2(2) = TFIELDDATA( & + TZFIELD2(2) = TFIELDMETADATA( & CMNHNAME = 'LSVM_ZM', & CSTDNAME = '', & CLONGNAME = 'LSVM_ZM', & @@ -2098,7 +2098,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 @@ -2111,7 +2111,7 @@ IF (LVAR_FRC .AND. LFORCING) THEN DO JT=1,NFRC WRITE (YFRC,'(I3.3)') JT ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'UFRC'//YFRC, & CSTDNAME = '', & CLONGNAME = 'UFRC'//YFRC, & @@ -2124,7 +2124,7 @@ IF (LVAR_FRC .AND. LFORCING) THEN LTIMEDEP = .FALSE. ) CALL IO_Field_write(TPFILE,TZFIELD,XUFRC(:,JT)) ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'VFRC'//YFRC, & CSTDNAME = '', & CLONGNAME = 'VFRC'//YFRC, & @@ -2137,7 +2137,7 @@ IF (LVAR_FRC .AND. LFORCING) THEN LTIMEDEP = .FALSE. ) CALL IO_Field_write(TPFILE,TZFIELD,XVFRC(:,JT)) ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'WFRC'//YFRC, & CSTDNAME = '', & CLONGNAME = 'WFRC'//YFRC, & @@ -2150,7 +2150,7 @@ IF (LVAR_FRC .AND. LFORCING) THEN LTIMEDEP = .FALSE. ) CALL IO_Field_write(TPFILE,TZFIELD,XWFRC(:,JT)) ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'THFRC'//YFRC, & CSTDNAME = '', & CLONGNAME = 'THFRC'//YFRC, & @@ -2163,7 +2163,7 @@ IF (LVAR_FRC .AND. LFORCING) THEN LTIMEDEP = .FALSE. ) CALL IO_Field_write(TPFILE,TZFIELD,XTHFRC(:,JT)) ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'RVFRC'//YFRC, & CSTDNAME = '', & CLONGNAME = 'RVFRC'//YFRC, & @@ -2176,7 +2176,7 @@ IF (LVAR_FRC .AND. LFORCING) THEN LTIMEDEP = .FALSE. ) CALL IO_Field_write(TPFILE,TZFIELD,XRVFRC(:,JT)) ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'TENDTHFRC'//YFRC, & CSTDNAME = '', & CLONGNAME = 'TENDTHFRC'//YFRC, & @@ -2189,7 +2189,7 @@ IF (LVAR_FRC .AND. LFORCING) THEN LTIMEDEP = .FALSE. ) CALL IO_Field_write(TPFILE,TZFIELD,XTENDTHFRC(:,JT)) ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'TENDRVFRC'//YFRC, & CSTDNAME = '', & CLONGNAME = 'TENDRVFRC'//YFRC, & @@ -2202,7 +2202,7 @@ IF (LVAR_FRC .AND. LFORCING) THEN LTIMEDEP = .FALSE. ) CALL IO_Field_write(TPFILE,TZFIELD,XTENDRVFRC(:,JT)) ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'GXTHFRC'//YFRC, & CSTDNAME = '', & CLONGNAME = 'GXTHFRC'//YFRC, & @@ -2215,7 +2215,7 @@ IF (LVAR_FRC .AND. LFORCING) THEN LTIMEDEP = .FALSE. ) CALL IO_Field_write(TPFILE,TZFIELD,XGXTHFRC(:,JT)) ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'GYTHFRC'//YFRC, & CSTDNAME = '', & CLONGNAME = 'GYTHFRC'//YFRC, & @@ -2228,7 +2228,7 @@ IF (LVAR_FRC .AND. LFORCING) THEN LTIMEDEP = .FALSE. ) CALL IO_Field_write(TPFILE,TZFIELD,XGYTHFRC(:,JT)) ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'PGROUNDFRC'//YFRC, & CSTDNAME = '', & CLONGNAME = 'PGROUNDFRC'//YFRC, & @@ -2251,7 +2251,7 @@ END IF IF (LTPZH .OR. LCOREF) THEN ! !* Temperature in celsius - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'TEMP', & CSTDNAME = 'air_temperature', & CLONGNAME = 'TEMP', & @@ -2267,7 +2267,7 @@ IF (LTPZH .OR. LCOREF) THEN ! !* Pressure in hPa CALL FIND_FIELD_ID_FROM_MNHNAME('PABST',IID,IRESP) - TZFIELD = TFIELDLIST(IID) + TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) ) TZFIELD%CMNHNAME = 'PRES' TZFIELD%CUNITS = 'hPa' CALL IO_Field_write(TPFILE,TZFIELD,XPABST(:,:,:)*1E-2) @@ -2291,7 +2291,7 @@ IF (LTPZH .OR. LCOREF) THEN END WHERE END IF ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'REHU', & CSTDNAME = 'relative_humidity', & CLONGNAME = 'REHU', & @@ -2304,7 +2304,7 @@ IF (LTPZH .OR. LCOREF) THEN LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK32) ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'VPRES', & CSTDNAME = 'water_vapor_partial_pressure_in_air', & CLONGNAME = 'VPRES', & @@ -2322,7 +2322,7 @@ IF (LTPZH .OR. LCOREF) THEN ZWORK33(:,:,:)=(77.6*( XPABST(:,:,:)*1E-2 & +ZWORK33(:,:,:)*4810/ZTEMP(:,:,:)) & -6*ZWORK33(:,:,:) )/ZTEMP(:,:,:) - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'COREF', & CSTDNAME = '', & CLONGNAME = 'COREF', & @@ -2336,7 +2336,7 @@ IF (LTPZH .OR. LCOREF) THEN CALL IO_Field_write(TPFILE,TZFIELD,ZWORK33) ! ZWORK33(:,:,:)=ZWORK33(:,:,:)+MZF(XZZ(:,:,:))*1E6/XRADIUS - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'MCOREF', & CSTDNAME = '', & CLONGNAME = 'MCOREF', & @@ -2378,7 +2378,7 @@ IF ( LMOIST_V .OR. LMSLP .OR. CBLTOP/='NONE' ) THEN ! IF (LMOIST_V .AND. NRR > 0) THEN ! Virtual potential temperature - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'THETAV', & CSTDNAME = '', & CLONGNAME = 'THETAV', & @@ -2412,7 +2412,7 @@ IF (LVISI) THEN ZVISIKUN(:,:,:) =0.027/(XRT(:,:,:,2)*XRHODREF(:,:,:))**0.88*1000. END WHERE ! Visibity Kunkel - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'VISIKUN', & CSTDNAME = '', & CLONGNAME = 'VISIKUN', & @@ -2433,7 +2433,7 @@ IF (LVISI) THEN ZVISIZHA(:,:,:) =0.187/(XRT(:,:,:,2)*XRHODREF(:,:,:)*XSVT(:,:,:,NSV_C2R2BEG+1))**0.34*1000. END WHERE ! Visibity Gultepe - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'VISIGUL', & CSTDNAME = '', & CLONGNAME = 'VISIGUL', & @@ -2446,7 +2446,7 @@ IF (LVISI) THEN LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZVISIGUL) ! Visibity Zhang - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'VISIZHA', & CSTDNAME = '', & CLONGNAME = 'VISIZHA', & @@ -2482,7 +2482,7 @@ IF (( LMOIST_E .OR. LBV_FR ) .AND. (NRR>0)) THEN *ZWORK31(:,:,:) *(1. +0.81 *ZWORK31(:,:,:)) ) ! IF (LMOIST_E) THEN - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'THETAE', & CSTDNAME = '', & CLONGNAME = 'THETAE', & @@ -2509,7 +2509,7 @@ IF (LMOIST_ES .AND. (NRR>0)) THEN -4.805 ) ) + 55. ZTHETAES(:,:,:)= XTHT(:,:,:) * EXP( (3376. / ZTHETAE(:,:,:) - 2.54) & *ZWORK31(:,:,:) *(1. +0.81 *ZWORK31(:,:,:)) ) - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'THETAES', & CSTDNAME = '', & CLONGNAME = 'THETAES', & @@ -2561,7 +2561,7 @@ IF ( LMOIST_L .OR. LMOIST_S1 .OR. LMOIST_S2 ) THEN ! IF (LMOIST_L .AND. NRR > 0) THEN ! Liquid-Water potential temperature - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'THETAL', & CSTDNAME = '', & CLONGNAME = 'THETAL', & @@ -2617,7 +2617,7 @@ IF ( LMOIST_S1 .OR. LMOIST_S2 ) THEN END IF IF (LMOIST_S1) THEN ! The Moist-air Entropy potential temperature (1st order) - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'THETAS1', & CSTDNAME = '', & CLONGNAME = 'THETAS1', & @@ -2632,7 +2632,7 @@ IF ( LMOIST_S1 .OR. LMOIST_S2 ) THEN END IF IF (LMOIST_S2) THEN ! The Moist-air Entropy potential temperature (2nd order) - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'THETAS2', & CSTDNAME = '', & CLONGNAME = 'THETAS2', & @@ -2656,7 +2656,7 @@ END IF IF (LVORT) THEN ! Vorticity x ZWORK31(:,:,:)=MYF(MZF(MXM(ZVOX(:,:,:)))) - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'UM1', & CSTDNAME = '', & CLONGNAME = 'UM1', & @@ -2671,7 +2671,7 @@ IF (LVORT) THEN ! ! Vorticity y ZWORK32(:,:,:)=MZF(MXF(MYM(ZVOY(:,:,:)))) - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'VM1', & CSTDNAME = '', & CLONGNAME = 'VM1', & @@ -2685,7 +2685,7 @@ IF (LVORT) THEN CALL IO_Field_write(TPFILE,TZFIELD,ZWORK32) ! IF (LWIND_ZM) THEN - TZFIELD2(1) = TFIELDDATA( & + TZFIELD2(1) = TFIELDMETADATA( & CMNHNAME = 'UM1_ZM', & CSTDNAME = '', & CLONGNAME = 'UM1_ZM', & @@ -2697,7 +2697,7 @@ IF (LVORT) THEN NDIMS = 3, & LTIMEDEP = .TRUE. ) ! - TZFIELD2(2) = TFIELDDATA( & + TZFIELD2(2) = TFIELDMETADATA( & CMNHNAME = 'VM1_ZM', & CSTDNAME = '', & CLONGNAME = 'VM1_ZM', & @@ -2714,7 +2714,7 @@ IF (LVORT) THEN ! ! Vorticity z ZWORK31(:,:,:)=MXF(MYF(MZM(ZVOZ(:,:,:)))) - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'WM1', & CSTDNAME = '', & CLONGNAME = 'WM1', & @@ -2729,7 +2729,7 @@ IF (LVORT) THEN ! ! Absolute Vorticity ZWORK31(:,:,:)=MYF(MXF(ZVOZ(:,:,:))) + ZCORIOZ(:,:,:) - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'ABVOR', & CSTDNAME = '', & CLONGNAME = 'ABVOR', & @@ -2762,7 +2762,7 @@ IF ( LMEAN_POVO ) THEN END WHERE END DO WHERE (IWORK1(:,:)>0) ZWORK21(:,:)=ZWORK21(:,:)/REAL( IWORK1(:,:) ) - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'MEAN_POVO', & CSTDNAME = '', & CLONGNAME = 'MEAN_POVO', & @@ -2785,7 +2785,7 @@ IF (LMOIST_V .AND. (NRR>0) ) THEN + ZWORK32(:,:,:)*MZF(MXF(ZVOY(:,:,:))) & + ZWORK33(:,:,:)*(MYF(MXF(ZVOZ(:,:,:))) + ZCORIOZ(:,:,:)) ZWORK34(:,:,:)=ZWORK34(:,:,:)*1E6/XRHODREF(:,:,:) - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'POVOV', & CSTDNAME = '', & CLONGNAME = 'POVOV', & @@ -2808,7 +2808,7 @@ IF (LMOIST_V .AND. (NRR>0) ) THEN END WHERE END DO WHERE(IWORK1(:,:)>0) ZWORK21(:,:)=ZWORK21(:,:)/REAL( IWORK1(:,:) ) - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'MEAN_POVOV', & CSTDNAME = '', & CLONGNAME = 'MEAN_POVOV', & @@ -2833,7 +2833,7 @@ IF (LMOIST_E .AND. (NRR>0) ) THEN + ZWORK32(:,:,:)*MZF(MXF(ZVOY(:,:,:))) & + ZWORK33(:,:,:)*(MYF(MXF(ZVOZ(:,:,:))) + ZCORIOZ(:,:,:)) ZWORK34(:,:,:)=ZWORK34(:,:,:)*1E6/XRHODREF(:,:,:) - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'POVOE', & CSTDNAME = '', & CLONGNAME = 'POVOE', & @@ -2856,7 +2856,7 @@ IF (LMOIST_E .AND. (NRR>0) ) THEN END WHERE END DO WHERE(IWORK1(:,:)>0) ZWORK21(:,:)=ZWORK21(:,:)/REAL( IWORK1(:,:) ) - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'MEAN_POVOE', & CSTDNAME = '', & CLONGNAME = 'MEAN_POVOE', & @@ -2882,7 +2882,7 @@ IF (LMOIST_ES .AND. (NRR>0) ) THEN + ZWORK32(:,:,:)*MZF(MXF(ZVOY(:,:,:))) & + ZWORK33(:,:,:)*(MYF(MXF(ZVOZ(:,:,:))) + ZCORIOZ(:,:,:)) ZWORK34(:,:,:)=ZWORK34(:,:,:)*1E6/XRHODREF(:,:,:) - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'POVOES', & CSTDNAME = '', & CLONGNAME = 'POVOES', & @@ -2904,7 +2904,7 @@ ENDIF IF (LDIV) THEN ! ZWORK31=GX_U_M(XUT,XDXX,XDZZ,XDZX) + GY_V_M(XVT,XDYY,XDZZ,XDZY) - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'HDIV', & CSTDNAME = '', & CLONGNAME = 'HDIV', & @@ -2918,7 +2918,7 @@ IF (LDIV) THEN CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) ! IF (LUSERV) THEN - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'HMDIV', & CSTDNAME = '', & CLONGNAME = 'HMDIV', & @@ -2954,7 +2954,7 @@ IF (LCLSTR) THEN CALL CLUSTERING(GBOTUP,GCLOUD,XWT,ICLUSTERID,ICLUSTERLV,ZCLDSIZE) PRINT *,'GOT OUT OF CLUSTERING' ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'CLUSTERID', & CSTDNAME = '', & CLONGNAME = 'CLUSTERID', & @@ -2967,7 +2967,7 @@ IF (LCLSTR) THEN LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ICLUSTERID) ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'CLUSTERLV', & CSTDNAME = '', & CLONGNAME = 'CLUSTERLV', & @@ -2980,7 +2980,7 @@ IF (LCLSTR) THEN LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ICLUSTERLV) ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'CLDSIZE', & CSTDNAME = '', & CLONGNAME = 'CLDSIZE', & @@ -3034,7 +3034,7 @@ IF (LGEO .OR. LAGEO) THEN DEALLOCATE(ZPHI) ! IF (LGEO) THEN - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'UM88', & CSTDNAME = '', & CLONGNAME = 'UM88', & @@ -3047,7 +3047,7 @@ IF (LGEO .OR. LAGEO) THEN LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'VM88', & CSTDNAME = '', & CLONGNAME = 'VM88', & @@ -3061,7 +3061,7 @@ IF (LGEO .OR. LAGEO) THEN CALL IO_Field_write(TPFILE,TZFIELD,ZWORK32) ! IF (LWIND_ZM) THEN - TZFIELD2(1) = TFIELDDATA( & + TZFIELD2(1) = TFIELDMETADATA( & CMNHNAME = 'UM88_ZM', & CSTDNAME = '', & CLONGNAME = 'UM88_ZM', & @@ -3073,7 +3073,7 @@ IF (LGEO .OR. LAGEO) THEN NDIMS = 3, & LTIMEDEP = .TRUE. ) ! - TZFIELD2(2) = TFIELDDATA( & + TZFIELD2(2) = TFIELDMETADATA( & CMNHNAME = 'VM88_ZM', & CSTDNAME = '', & CLONGNAME = 'VM88_ZM', & @@ -3090,7 +3090,7 @@ IF (LGEO .OR. LAGEO) THEN ! ! 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) @@ -3100,7 +3100,7 @@ IF (LGEO .OR. LAGEO) THEN ZWORK31(:,:,:)=XUT(:,:,:)-ZWORK31(:,:,:) ZWORK32(:,:,:)=XVT(:,:,:)-ZWORK32(:,:,:) ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'UM89', & CSTDNAME = '', & CLONGNAME = 'UM89', & @@ -3113,7 +3113,7 @@ IF (LGEO .OR. LAGEO) THEN LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'VM89', & CSTDNAME = '', & CLONGNAME = 'VM89', & @@ -3127,7 +3127,7 @@ IF (LGEO .OR. LAGEO) THEN CALL IO_Field_write(TPFILE,TZFIELD,ZWORK32) ! IF (LWIND_ZM) THEN - TZFIELD2(1) = TFIELDDATA( & + TZFIELD2(1) = TFIELDMETADATA( & CMNHNAME = 'UM89_ZM', & CSTDNAME = '', & CLONGNAME = 'UM89_ZM', & @@ -3139,7 +3139,7 @@ IF (LGEO .OR. LAGEO) THEN NDIMS = 3, & LTIMEDEP = .TRUE. ) ! - TZFIELD2(2) = TFIELDDATA( & + TZFIELD2(2) = TFIELDMETADATA( & CMNHNAME = 'VM89_ZM', & CSTDNAME = '', & CLONGNAME = 'VM89_ZM', & @@ -3156,7 +3156,7 @@ IF (LGEO .OR. LAGEO) THEN ! ! 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) @@ -3173,7 +3173,7 @@ IF(LWIND_CONTRAV) THEN!$ CALL CONTRAV ((/"TEST","TEST"/),(/"TEST","TEST"/),XUT,XVT,XWT,XDXX,XDYY,XDZZ,XDZX,XDZY, & ZWORK31,ZWORK32,ZWORK33,2) ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'WNORM', & CSTDNAME = '', & CLONGNAME = 'WNORM', & @@ -3207,7 +3207,7 @@ IF (LMSLP) THEN ! sea level pressure (hPa) ZWORK22(:,:) = 1.E-2*ZWORK21(:,:)*EXP(XG*XZS(:,:)/(XRD*ZWORK22(:,:))) ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'MSLP', & CSTDNAME = 'air_pressure_at_sea_level', & CLONGNAME = 'MSLP', & @@ -3233,7 +3233,7 @@ IF (LTHW) THEN (XZZ(:,:,JK+1)-XZZ(:,:,JK))/XRHOLW END DO ZWORK21(:,:) = ZWORK21(:,:)*1000. ! vapor water in mm unit - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'THVW', & CSTDNAME = '', & CLONGNAME = 'THVW', & @@ -3254,7 +3254,7 @@ IF (LTHW) THEN (XZZ(:,:,JK+1)-XZZ(:,:,JK))/XRHOLW END DO ZWORK21(:,:) = ZWORK21(:,:)*1000. ! cloud water in mm unit - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'THCW', & CSTDNAME = '', & CLONGNAME = 'THCW', & @@ -3275,7 +3275,7 @@ IF (LTHW) THEN (XZZ(:,:,JK+1)-XZZ(:,:,JK))/XRHOLW END DO ZWORK21(:,:) = ZWORK21(:,:)*1000. ! rain water in mm unit - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'THRW', & CSTDNAME = '', & CLONGNAME = 'THRW', & @@ -3296,7 +3296,7 @@ IF (LTHW) THEN (XZZ(:,:,JK+1)-XZZ(:,:,JK))/XRHOLW END DO ZWORK21(:,:) = ZWORK21(:,:)*1000. ! ice thickness in mm unit - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'THIC', & CSTDNAME = '', & CLONGNAME = 'THIC', & @@ -3317,7 +3317,7 @@ IF (LTHW) THEN (XZZ(:,:,JK+1)-XZZ(:,:,JK))/XRHOLW END DO ZWORK21(:,:) = ZWORK21(:,:)*1000. ! snow thickness in mm unit - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'THSN', & CSTDNAME = '', & CLONGNAME = 'THSN', & @@ -3338,7 +3338,7 @@ IF (LTHW) THEN (XZZ(:,:,JK+1)-XZZ(:,:,JK))/XRHOLW END DO ZWORK21(:,:) = ZWORK21(:,:)*1000. ! graupel thickness in mm unit - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'THGR', & CSTDNAME = '', & CLONGNAME = 'THGR', & @@ -3359,7 +3359,7 @@ IF (LTHW) THEN (XZZ(:,:,JK+1)-XZZ(:,:,JK))/XRHOLW END DO ZWORK21(:,:) = ZWORK21(:,:)*1000. ! hail thickness in mm unit - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'THHA', & CSTDNAME = '', & CLONGNAME = 'THHA', & @@ -3401,7 +3401,7 @@ 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 = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'ACTOPR', & CSTDNAME = '', & CLONGNAME = 'ACTOPR', & @@ -3421,7 +3421,7 @@ 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 = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CSTDNAME = 'generic LS_ACTOPR', & !Temporary name to ease identification CUNITS = 'mm', & CDIR = 'XY', & @@ -3469,7 +3469,7 @@ 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 = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'INTOPR', & CSTDNAME = '', & CLONGNAME = 'INTOPR', & @@ -3491,7 +3491,7 @@ 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 = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'LS_INTOPR', & CSTDNAME = '', & CLONGNAME = 'LS_INTOPR', & @@ -3521,7 +3521,7 @@ IF (NCAPE >=0 .AND. LUSERV) THEN ZWORK32(:,:,IKB:IKE),ZWORK33(:,:,IKB:IKE), & ZWORK34(:,:,IKB:IKE),ZWORK21,ZWORK22 ) ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'CAPEMAX', & CSTDNAME = '', & CLONGNAME = 'CAPEMAX', & @@ -3534,7 +3534,7 @@ IF (NCAPE >=0 .AND. LUSERV) THEN LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21) ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'CINMAX', & CSTDNAME = '', & CLONGNAME = 'CINMAX', & @@ -3548,7 +3548,7 @@ IF (NCAPE >=0 .AND. LUSERV) THEN CALL IO_Field_write(TPFILE,TZFIELD,ZWORK22) ! IF (NCAPE >=1) THEN - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'CAPE3D', & CSTDNAME = 'atmosphere_convective_available_potential_energy', & CLONGNAME = 'CAPE3D', & @@ -3561,7 +3561,7 @@ IF (NCAPE >=0 .AND. LUSERV) THEN LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK32) ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'CIN3D', & CSTDNAME = 'atmosphere_convective_inhibition', & CLONGNAME = 'CIN3D', & @@ -3574,7 +3574,7 @@ IF (NCAPE >=0 .AND. LUSERV) THEN LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK33) ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'DCAPE3D', & CSTDNAME = '', & CLONGNAME = 'DCAPE3D', & @@ -3593,7 +3593,7 @@ IF (NCAPE >=0 .AND. LUSERV) THEN ZWORK31(:,:,IKU) = 0. ZWORK31=0.5*ZWORK31**2 ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'VKE', & CSTDNAME = '', & CLONGNAME = 'VKE', & @@ -3626,7 +3626,7 @@ IF (LBV_FR) THEN ENDDO ENDDO ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'BV', & CSTDNAME = '', & CLONGNAME = 'BV', & @@ -3653,7 +3653,7 @@ IF (LBV_FR) THEN ENDDO ENDDO ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'BVE', & CSTDNAME = '', & CLONGNAME = 'BVE', & @@ -3682,7 +3682,7 @@ IF ( NGPS>=0 ) THEN YFGRI=ADJUSTL(ADJUSTR(TPFILE%CNAME)//'GPS') CALL GPS_ZENITH (YFGRI,XRT(:,:,:,1),ZTEMP,XPABST,ZWORK21,ZWORK22,ZWORK23,ZWORK24) ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'ZTD', & CSTDNAME = '', & CLONGNAME = 'ZTD', & @@ -3696,7 +3696,7 @@ IF ( NGPS>=0 ) THEN CALL IO_Field_write(TPFILE,TZFIELD,ZWORK22) ! IF (NGPS>=1) THEN - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'ZHD', & CSTDNAME = '', & CLONGNAME = 'ZHD', & @@ -3709,7 +3709,7 @@ IF ( NGPS>=0 ) THEN LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK23) ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'ZWD', & CSTDNAME = '', & CLONGNAME = 'ZWD', & @@ -3755,7 +3755,7 @@ IF(LRADAR .AND. LUSERR) THEN ZWORK33, ZWORK34 ) ENDIF ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'RARE', & CSTDNAME = 'equivalent_reflectivity_factor', & CLONGNAME = 'RARE', & @@ -3768,7 +3768,7 @@ IF(LRADAR .AND. LUSERR) THEN LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'VDOP', & CSTDNAME = '', & CLONGNAME = 'VDOP', & @@ -3781,7 +3781,7 @@ IF(LRADAR .AND. LUSERR) THEN LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK32) ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'ZDR', & CSTDNAME = '', & CLONGNAME = 'ZDR', & @@ -3794,7 +3794,7 @@ IF(LRADAR .AND. LUSERR) THEN LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK33) ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'KDP', & CSTDNAME = '', & CLONGNAME = 'KDP', & @@ -4103,7 +4103,7 @@ IF (LLIDAR) THEN IF( ALLOCATED(ZTMP3) ) DEALLOCATE(ZTMP3) IF( ALLOCATED(ZTMP4) ) DEALLOCATE(ZTMP4) ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'LIDAR', & CSTDNAME = '', & CLONGNAME = 'LIDAR', & @@ -4116,7 +4116,7 @@ IF (LLIDAR) THEN LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'LIPAR', & CSTDNAME = '', & CLONGNAME = 'LIPAR', & @@ -4161,7 +4161,7 @@ IF (CBLTOP == 'THETA') THEN ZSHMIX(:,:)=ZSHMIX(:,:)-XZS(:,:) ZSHMIX(:,:)=MAX(ZSHMIX(:,:),50.0) ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'HBLTOP', & CSTDNAME = 'atmosphere_boundary_layer_thickness', & CLONGNAME = 'HBLTOP', & @@ -4206,7 +4206,7 @@ ELSEIF (CBLTOP == 'RICHA') THEN END DO ZSHMIX(:,:)=ZSHMIX(:,:)-XZS(:,:) ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'HBLTOP', & CSTDNAME = 'atmosphere_boundary_layer_thickness', & CLONGNAME = 'HBLTOP', & diff --git a/src/MNH/write_lfifm1_for_diag_supp.f90 b/src/MNH/write_lfifm1_for_diag_supp.f90 index 456337d78..f24f10f5b 100644 --- a/src/MNH/write_lfifm1_for_diag_supp.f90 +++ b/src/MNH/write_lfifm1_for_diag_supp.f90 @@ -97,7 +97,7 @@ END MODULE MODI_WRITE_LFIFM1_FOR_DIAG_SUPP ! USE MODE_ll USE MODD_CST -use modd_field, only: NMNHDIM_UNUSED, tfielddata, tfieldlist, TYPEINT, TYPEREAL +use modd_field, only: NMNHDIM_UNUSED, tfieldmetadata, tfieldlist, TYPEINT, TYPEREAL USE MODD_IO, ONLY: TFILEDATA USE MODD_PARAMETERS USE MODD_CONF_n @@ -208,8 +208,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 @@ -256,7 +256,7 @@ 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 = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'CLTOPCONV', & CSTDNAME = 'convective_cloud_top_altitude', & CLONGNAME = 'CLTOPCONV', & @@ -276,7 +276,7 @@ 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 = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'CLBASCONV', & CSTDNAME = 'convective_cloud_base_altitude', & CLONGNAME = 'CLBASCONV', & @@ -458,7 +458,7 @@ IF (LCLD_COV .AND. LUSERC) THEN ! 0 if there is no cloud ZWORK21(:,:)=ZWORK21(:,:)/1.E3 ! height (km) of explicit clouds ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'HECL', & CSTDNAME = '', & CLONGNAME = 'HECL', & @@ -496,7 +496,7 @@ IF (LCLD_COV .AND. LUSERC) THEN ! 0 if there is no cloud ZWORK21(:,:)=ZWORK21(:,:)/1.E3 ! max. cloud height (km) ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'HCL', & CSTDNAME = 'cloud_top_altitude', & CLONGNAME = 'HCL', & @@ -510,7 +510,7 @@ IF (LCLD_COV .AND. LUSERC) THEN CALL IO_Field_write(TPFILE,TZFIELD,ZWORK21) ENDIF ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'TCL', & CSTDNAME = 'air_temperature_at_cloud_top', & CLONGNAME = 'TCL', & @@ -532,7 +532,7 @@ IF (LCLD_COV .AND. LUSERC) THEN ZWORK31(:,:,:)=3.9E3/(144.7*(XRHODREF(:,:,:)*1.E3*XRT(:,:,:,2)/(1.+XRT(:,:,:,2)))**0.88) END WHERE ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'VISI_HOR', & CSTDNAME = 'visibility_in_air', & CLONGNAME = 'VISI_HOR', & @@ -568,7 +568,7 @@ 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 @@ -588,7 +588,7 @@ IF (NRAD_3D >= 1) THEN IKRAD = JK - JPVEXT ZWORK31(:,:,JK)= XAER(:,:,IKRAD,3) END DO - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'DSTAOD3D', & CSTDNAME = '', & CLONGNAME = 'DSTAOD3D', & @@ -610,7 +610,7 @@ IF (NRAD_3D >= 1) THEN ENDDO ENDDO ENDDO - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'DSTAOD2D', & CSTDNAME = '', & CLONGNAME = 'DSTAOD2D', & @@ -627,7 +627,7 @@ IF (NRAD_3D >= 1) THEN IKRAD = JK - JPVEXT ZWORK31(:,:,JK)= XAER(:,:,IKRAD,3)/(XZZ(:,:,JK+1)-XZZ(:,:,JK))*1.D3 ENDDO - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'DSTEXT', & CSTDNAME = '', & CLONGNAME = 'DSTEXT', & @@ -647,7 +647,7 @@ IF (NRAD_3D >= 1) THEN IKRAD = JK - JPVEXT ZWORK31(:,:,JK)= XAER(:,:,IKRAD,2) END DO - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'SLTAOD3D', & CSTDNAME = '', & CLONGNAME = 'SLTAOD3D', & @@ -669,7 +669,7 @@ IF (NRAD_3D >= 1) THEN ENDDO ENDDO ENDDO - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'SLTAOD2D', & CSTDNAME = '', & CLONGNAME = 'SLTAOD2D', & @@ -686,7 +686,7 @@ IF (NRAD_3D >= 1) THEN IKRAD = JK - JPVEXT ZWORK31(:,:,JK)= XAER(:,:,IKRAD,2)/(XZZ(:,:,JK+1)-XZZ(:,:,JK))*1.D3 ENDDO - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'SLTEXT', & CSTDNAME = '', & CLONGNAME = 'SLTEXT', & @@ -706,7 +706,7 @@ IF (NRAD_3D >= 1) THEN IKRAD = JK - JPVEXT ZWORK31(:,:,JK)= XAER(:,:,IKRAD,4) END DO - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'AERAOD3D', & CSTDNAME = '', & CLONGNAME = 'AERAOD3D', & @@ -728,7 +728,7 @@ IF (NRAD_3D >= 1) THEN ENDDO ENDDO ENDDO - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'AERAOD2D', & CSTDNAME = '', & CLONGNAME = 'AERAOD2D', & @@ -745,7 +745,7 @@ IF (NRAD_3D >= 1) THEN IKRAD = JK - JPVEXT ZWORK31(:,:,JK)= XAER(:,:,IKRAD,4)/(XZZ(:,:,JK+1)-XZZ(:,:,JK))*1.D3 ENDDO - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'AEREXT', & CSTDNAME = '', & CLONGNAME = 'AEREXT', & @@ -829,7 +829,7 @@ IF (LEN_TRIM(CRAD_SAT) /= 0 .AND. NRR /=0) THEN LSUBG_COND, LRAD_SUBG_COND, ZIRBT, ZWVBT, & INDGEO(JI), VSIGQSAT ) ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = TRIM(YNAM_SAT(JI))//'_IRBT', & CSTDNAME = '', & CLONGNAME = TRIM(YNAM_SAT(JI))//'_IRBT', & @@ -842,7 +842,7 @@ IF (LEN_TRIM(CRAD_SAT) /= 0 .AND. NRR /=0) THEN LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZIRBT) ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = TRIM(YNAM_SAT(JI))//'_WVBT', & CSTDNAME = '', & CLONGNAME = TRIM(YNAM_SAT(JI))//'_WVBT', & @@ -918,7 +918,7 @@ 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) = TFIELDDATA( & + TZFIELD2(1) = TFIELDMETADATA( & CMNHNAME = 'UM10', & CSTDNAME = '', & CLONGNAME = 'UM10', & @@ -930,7 +930,7 @@ IF (CSURF=='EXTE') THEN NDIMS = 2, & LTIMEDEP = .TRUE. ) ! - TZFIELD2(2) = TFIELDDATA( & + TZFIELD2(2) = TFIELDMETADATA( & CMNHNAME = 'VM10', & CSTDNAME = '', & CLONGNAME = 'VM10', & @@ -944,7 +944,7 @@ IF (CSURF=='EXTE') THEN ! CALL UV_TO_ZONAL_AND_MERID(XCURRENT_ZON10M,XCURRENT_MER10M,KGRID=0,TPFILE=TPFILE,TZFIELDS=TZFIELD2) ELSE - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'UM10', & CSTDNAME = '', & CLONGNAME = 'UM10', & @@ -957,7 +957,7 @@ IF (CSURF=='EXTE') THEN LTIMEDEP = .TRUE. ) CALL IO_Field_write(TPFILE,TZFIELD,XCURRENT_ZON10M) ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'VM10', & CSTDNAME = '', & CLONGNAME = 'VM10', & @@ -974,7 +974,7 @@ IF (CSURF=='EXTE') THEN IF (SIZE(XTKET)>0) THEN ZWORK21(:,:) = SQRT(XCURRENT_ZON10M(:,:)**2+XCURRENT_MER10M(:,:)**2) ZWORK21(:,:) = ZWORK21(:,:) + 4. * SQRT(XTKET(:,:,IKB)) - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'FF10MAX', & CSTDNAME = '', & CLONGNAME = 'FF10MAX', & @@ -989,7 +989,7 @@ IF (CSURF=='EXTE') THEN END IF ! IF(ANY(XCURRENT_SFCO2/=XUNDEF))THEN - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'SFCO2', & CSTDNAME = '', & CLONGNAME = 'SFCO2', & @@ -1004,7 +1004,7 @@ IF (CSURF=='EXTE') THEN END IF ! IF(ANY(XCURRENT_SWD/=XUNDEF))THEN - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'SWD', & CSTDNAME = '', & CLONGNAME = 'SWD', & @@ -1019,7 +1019,7 @@ IF (CSURF=='EXTE') THEN END IF ! IF(ANY(XCURRENT_SWU/=XUNDEF))THEN - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'SWU', & CSTDNAME = '', & CLONGNAME = 'SWU', & @@ -1034,7 +1034,7 @@ IF (CSURF=='EXTE') THEN END IF ! IF(ANY(XCURRENT_LWD/=XUNDEF))THEN - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'LWD', & CSTDNAME = '', & CLONGNAME = 'LWD', & @@ -1049,7 +1049,7 @@ IF (CSURF=='EXTE') THEN END IF ! IF(ANY(XCURRENT_LWU/=XUNDEF))THEN - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'LWU', & CSTDNAME = '', & CLONGNAME = 'LWU', & @@ -1099,7 +1099,7 @@ ALLOCATE(ZWORK34(IIU,IJU,IKU)) END DO PRINT *,'PRESSURE LEVELS WHERE TO INTERPOLATE=',ZPRES(1,1,:) ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA(& CMNHNAME = 'variables at pressure levels', & !Temporary name to ease identification CSTDNAME = '', & CDIR = 'XY', & @@ -1206,7 +1206,7 @@ ALLOCATE(ZWORK34(IIU,IJU,IKU)) PRINT *,'POTENTIAL TEMPERATURE LEVELS WHERE TO INTERPOLATE=',ZTH(:) ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA(& CMNHNAME = 'variables at pot. temp. levels', & !Temporary name to ease identification CSTDNAME = '', & CDIR = 'XY', & @@ -1310,7 +1310,7 @@ IF (LISOAL .AND.XISOAL(1)/=0.) THEN ! ********************* ! Altitude ! ********************* - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'ALT_ALT', & CSTDNAME = '', & CLONGNAME = 'ALT_ALT', & @@ -1334,7 +1334,7 @@ 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 = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'ALT_CLOUD', & CSTDNAME = '', & CLONGNAME = 'ALT_CLOUD', & @@ -1357,7 +1357,7 @@ 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 = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'ALT_PRECIP', & CSTDNAME = '', & CLONGNAME = 'ALT_PRECIP', & @@ -1374,7 +1374,7 @@ IF (LISOAL .AND.XISOAL(1)/=0.) THEN ! ********************* CALL ZINTER(XTHT, XZZ, ZWAL, ZAL, IIU, IJU, IKU, IKB, IAL, XUNDEF) WHERE(ZWAL.EQ.XUNDEF) ZWAL=ZFILLVAL - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'ALT_THETA', & CSTDNAME = '', & CLONGNAME = 'ALT_THETA', & @@ -1391,7 +1391,7 @@ IF (LISOAL .AND.XISOAL(1)/=0.) THEN ! ********************* CALL ZINTER(XPABST, XZZ, ZWAL, ZAL, IIU, IJU, IKU, IKB, IAL, XUNDEF) WHERE(ZWAL.EQ.XUNDEF) ZWAL=ZFILLVAL - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'ALT_PRESSURE', & CSTDNAME = '', & CLONGNAME = 'ALT_PRESSURE', & @@ -1425,7 +1425,7 @@ 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 = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'ALT_PV', & CSTDNAME = '', & CLONGNAME = 'ALT_PV', & @@ -1443,7 +1443,7 @@ 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 = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'ALT_U', & CSTDNAME = '', & CLONGNAME = 'ALT_U', & @@ -1459,7 +1459,7 @@ IF (LISOAL .AND.XISOAL(1)/=0.) THEN ZWORK31(:,:,:) = MYF(XVT(:,:,:)) CALL ZINTER(ZWORK31, XZZ, ZWAL, ZAL, IIU, IJU, IKU, IKB, IAL, XUNDEF) WHERE(ZWAL.EQ.XUNDEF) ZWAL=ZFILLVAL - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'ALT_V', & CSTDNAME = '', & CLONGNAME = 'ALT_V', & @@ -1481,7 +1481,7 @@ 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 = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'ALT_DSTEXT', & CSTDNAME = '', & CLONGNAME = 'ALT_DSTEXT', & @@ -1524,7 +1524,7 @@ 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 = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'TKEBAVG'//YDX, & CSTDNAME = '', & CLONGNAME = 'TKEBAVG'//YDX, & @@ -1555,7 +1555,7 @@ 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 = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'TKEMAVG'//YDX, & CSTDNAME = '', & CLONGNAME = 'TKEMAVG'//YDX, & diff --git a/src/MNH/write_lfin.f90 b/src/MNH/write_lfin.f90 index 4e80261f8..6b1823d8c 100644 --- a/src/MNH/write_lfin.f90 +++ b/src/MNH/write_lfin.f90 @@ -188,7 +188,7 @@ END MODULE MODI_WRITE_LFIFM_n USE MODD_DIM_n USE MODD_CONF USE MODD_CONF_n -use modd_field, only: NMNHDIM_UNUSED, tfielddata, tfieldlist, TYPEDATE, TYPEINT, TYPELOG, TYPEREAL +use modd_field, only: NMNHDIM_UNUSED, tfieldmetadata, tfieldlist, TYPEDATE, TYPEINT, TYPELOG, TYPEREAL USE MODD_GRID USE MODD_GRID_n USE MODD_TIME @@ -332,9 +332,9 @@ 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 +CHARACTER(LEN=2) :: INDICE +INTEGER :: IID +TYPE(TFIELDMETADATA) :: TZFIELD !------------------------------------------------------------------------------- ! !* 0. Initialization @@ -445,7 +445,7 @@ CALL IO_Field_write(TPFILE,'SURF', CSURF) CALL IO_Field_write(TPFILE,'CPL_AROME',LCPL_AROME) CALL IO_Field_write(TPFILE,'COUPLING', LCOUPLING) ! -TZFIELD = TFIELDDATA( & +TZFIELD = TFIELDMETADATA( & CMNHNAME = 'RECYCLING', & CLONGNAME = 'RECYCLING', & CSTDNAME = '', & @@ -493,7 +493,7 @@ END IF ! IF (LIBM .OR. LIBM_LSF) THEN ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'LSFP', & CLONGNAME = 'LSFP', & CSTDNAME = '', & @@ -511,7 +511,7 @@ ENDIF ! IF (LRECYCL) THEN ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'RCOUNT', & CLONGNAME = 'RCOUNT', & CSTDNAME = '', & @@ -525,7 +525,7 @@ IF (LRECYCL) THEN CALL IO_Field_write(TPFILE,TZFIELD,NR_COUNT) ! IF (LRECYCLW) THEN - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'URECYCLW', & CLONGNAME = 'URECYCLW', & CSTDNAME = '', & @@ -539,7 +539,7 @@ IF (LRECYCL) THEN ! CALL IO_Field_write(TPFILE,TZFIELD,XUMEANW(:,:,:)) ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'VRECYCLW', & CLONGNAME = 'VRECYCLW', & CSTDNAME = '', & @@ -553,7 +553,7 @@ IF (LRECYCL) THEN ! CALL IO_Field_write(TPFILE,TZFIELD,XVMEANW(:,:,:)) ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'WRECYCLW', & CLONGNAME = 'WRECYCLW', & CSTDNAME = '', & @@ -569,7 +569,7 @@ IF (LRECYCL) THEN ! ENDIF IF (LRECYCLN) THEN - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'URECYCLN', & CLONGNAME = 'URECYCLN', & CSTDNAME = '', & @@ -583,7 +583,7 @@ IF (LRECYCL) THEN ! CALL IO_Field_write(TPFILE,TZFIELD,XUMEANN(:,:,:)) ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'VRECYCLN', & CLONGNAME = 'VRECYCLN', & CSTDNAME = '', & @@ -597,7 +597,7 @@ IF (LRECYCL) THEN ! CALL IO_Field_write(TPFILE,TZFIELD,XVMEANN(:,:,:)) ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'WRECYCLN', & CLONGNAME = 'WRECYCLN', & CSTDNAME = '', & @@ -613,7 +613,7 @@ IF (LRECYCL) THEN ! ENDIF IF (LRECYCLE) THEN - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'URECYCLE', & CLONGNAME = 'URECYCLE', & CSTDNAME = '', & @@ -627,7 +627,7 @@ IF (LRECYCL) THEN ! CALL IO_Field_write(TPFILE,TZFIELD,XUMEANE(:,:,:)) ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'VRECYCLE', & CLONGNAME = 'VRECYCLE', & CSTDNAME = '', & @@ -641,7 +641,7 @@ IF (LRECYCL) THEN ! CALL IO_Field_write(TPFILE,TZFIELD,XVMEANE(:,:,:)) ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'WRECYCLE', & CLONGNAME = 'WRECYCLE', & CSTDNAME = '', & @@ -657,7 +657,7 @@ IF (LRECYCL) THEN ! ENDIF IF (LRECYCLS) THEN - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'URECYCLS', & CLONGNAME = 'URECYCLS', & CSTDNAME = '', & @@ -671,7 +671,7 @@ IF (LRECYCL) THEN ! CALL IO_Field_write(TPFILE,TZFIELD,XUMEANS(:,:,:)) ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'VRECYCLS', & CLONGNAME = 'VRECYCLS', & CSTDNAME = '', & @@ -685,7 +685,7 @@ IF (LRECYCL) THEN ! CALL IO_Field_write(TPFILE,TZFIELD,XVMEANS(:,:,:)) ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'WRECYCLS', & CLONGNAME = 'WRECYCLS', & CSTDNAME = '', & @@ -702,7 +702,7 @@ ENDIF ! IF (MEAN_COUNT /= 0) THEN ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'generic for mean_count variables', & !Temporary name to ease identification CSTDNAME = '', & CDIR = 'XY', & @@ -1044,7 +1044,7 @@ IF (NSV >=1) THEN ! ZWORK2D(:,:) = XRHOLW*XINPRR(:,:)*XSVT(:,:,2,NSV_LIMA_SCAVMASS)/ & max( 1.e-20,XRT(:,:,2,3) ) !~2=at ground level - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'INPBP', & CSTDNAME = '', & CLONGNAME = 'INPBP', & @@ -1093,7 +1093,7 @@ IF (NSV >=1) THEN CALL IO_Field_write(TPFILE,'EFIELDV',XEFIELDV) CALL IO_Field_write(TPFILE,'EFIELDW',XEFIELDW) ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'EMODULE', & CSTDNAME = '', & CLONGNAME = 'EMODULE', & @@ -1108,22 +1108,22 @@ IF (NSV >=1) THEN 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) ! @@ -1507,7 +1507,7 @@ IF (NSV >=1) THEN DO JSV=1,ICH_NBR WRITE(ILUOUT,*)JSV,TRIM(YCHNAMES(JSV)) END DO - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'NSV.DIM', & CSTDNAME = '', & CLONGNAME = 'NSV.DIM', & @@ -1521,7 +1521,7 @@ IF (NSV >=1) THEN CALL IO_Field_write(TPFILE,TZFIELD,ICH_NBR) ! IF (ICH_NBR/=0) THEN - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'NSV.TITRE', & CSTDNAME = '', & CLONGNAME = 'NSV.TITRE', & @@ -1632,7 +1632,7 @@ END IF ! IF (NSV >=1) THEN ! DO JSV = NSV_C2R2BEG,NSV_C2R2END ! IF (JSV == NSV_C2R2BEG ) THEN -! TZFIELD = TFIELDDATA( & +! TZFIELD = TFIELDMETADATA( & ! CMNHNAME = 'RSVS_CLD1', & ! CSTDNAME = '', & ! CLONGNAME = 'RSVS_CLD1', & @@ -1646,7 +1646,7 @@ END IF ! CALL IO_Field_write(TPFILE,TZFIELD,XRRS_CLD(:,:,:,IRR)) ! END IF ! IF (JSV == NSV_C2R2END ) THEN -! TZFIELD = TFIELDDATA( & +! TZFIELD = TFIELDMETADATA( & ! CMNHNAME = 'RSVS_CLD2', & ! CSTDNAME = '', & ! CLONGNAME = 'RSVS_CLD2', & @@ -1683,7 +1683,7 @@ 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 @@ -1713,17 +1713,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) ! @@ -1838,12 +1838,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) ! @@ -1853,12 +1853,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) ! @@ -1868,7 +1868,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) ! @@ -1876,7 +1876,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) ! @@ -1886,12 +1886,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 @@ -1900,12 +1900,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 @@ -1914,12 +1914,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 @@ -1932,7 +1932,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) ! @@ -1941,7 +1941,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 @@ -1952,7 +1952,7 @@ END IF IF(LBLOWSNOW) THEN IF (ASSOCIATED(XSNWSUBL3D)) THEN IF (SIZE(XSNWSUBL3D) /= 0 ) THEN - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'SNWSUBL3D', & CSTDNAME = '', & CLONGNAME = 'SNWSUBL3D', & @@ -1971,7 +1971,7 @@ IF(LBLOWSNOW) THEN END DO ZWORK2D(:,:) = ZWORK2D(:,:)*1000. ! vapor water in mm unit ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'COL_SNWSUBL', & CSTDNAME = '', & CLONGNAME = 'COL_SNWSUBL', & @@ -1993,7 +1993,7 @@ IF ((.NOT.LCOUPLES).AND.LOCEAN) THEN CALL IO_Field_write(TPFILE,'NFRCLT',NFRCLT) CALL IO_Field_write(TPFILE,'NINFRT',NINFRT) ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'SSUFL_T', & CSTDNAME = '', & CLONGNAME = 'SSUFL', & @@ -2006,7 +2006,7 @@ IF ((.NOT.LCOUPLES).AND.LOCEAN) THEN LTIMEDEP = .FALSE. ) CALL IO_Field_write(TPFILE,TZFIELD,XSSUFL_T(:)) ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'SSVFL_T', & CSTDNAME = '', & CLONGNAME = 'SSVFL', & @@ -2019,7 +2019,7 @@ IF ((.NOT.LCOUPLES).AND.LOCEAN) THEN LTIMEDEP = .FALSE. ) CALL IO_Field_write(TPFILE,TZFIELD,XSSVFL_T(:)) ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'SSTFL_T', & CSTDNAME = '', & CLONGNAME = 'SSTFL', & @@ -2032,7 +2032,7 @@ IF ((.NOT.LCOUPLES).AND.LOCEAN) THEN LTIMEDEP = .FALSE. ) CALL IO_Field_write(TPFILE,TZFIELD,XSSTFL_T(:)) ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'SSOLA_T', & CSTDNAME = '', & CLONGNAME = 'SSOLA', & @@ -2057,7 +2057,7 @@ IF (LFORCING) THEN ! WRITE (YFRC,'(I3.3)') JT ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'DTFRC'//YFRC, & CSTDNAME = '', & CLONGNAME = 'DTFRC'//YFRC, & @@ -2070,7 +2070,7 @@ IF (LFORCING) THEN LTIMEDEP = .FALSE. ) CALL IO_Field_write(TPFILE,TZFIELD,TDTFRC(JT)) ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'UFRC'//YFRC, & CSTDNAME = '', & CLONGNAME = 'UFRC'//YFRC, & @@ -2083,7 +2083,7 @@ IF (LFORCING) THEN LTIMEDEP = .FALSE. ) CALL IO_Field_write(TPFILE,TZFIELD,XUFRC(:,JT)) ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'VFRC'//YFRC, & CSTDNAME = '', & CLONGNAME = 'VFRC'//YFRC, & @@ -2096,7 +2096,7 @@ IF (LFORCING) THEN LTIMEDEP = .FALSE. ) CALL IO_Field_write(TPFILE,TZFIELD,XVFRC(:,JT)) ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'WFRC'//YFRC, & CSTDNAME = '', & CLONGNAME = 'WFRC'//YFRC, & @@ -2109,7 +2109,7 @@ IF (LFORCING) THEN LTIMEDEP = .FALSE. ) CALL IO_Field_write(TPFILE,TZFIELD,XWFRC(:,JT)) ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'THFRC'//YFRC, & CSTDNAME = '', & CLONGNAME = 'THFRC'//YFRC, & @@ -2122,7 +2122,7 @@ IF (LFORCING) THEN LTIMEDEP = .FALSE. ) CALL IO_Field_write(TPFILE,TZFIELD,XTHFRC(:,JT)) ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'RVFRC'//YFRC, & CSTDNAME = '', & CLONGNAME = 'RVFRC'//YFRC, & @@ -2135,7 +2135,7 @@ IF (LFORCING) THEN LTIMEDEP = .FALSE. ) CALL IO_Field_write(TPFILE,TZFIELD,XRVFRC(:,JT)) ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'TENDTHFRC'//YFRC, & CSTDNAME = '', & CLONGNAME = 'TENDTHFRC'//YFRC, & @@ -2148,7 +2148,7 @@ IF (LFORCING) THEN LTIMEDEP = .FALSE. ) CALL IO_Field_write(TPFILE,TZFIELD,XTENDTHFRC(:,JT)) ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'TENDRVFRC'//YFRC, & CSTDNAME = '', & CLONGNAME = 'TENDRVFRC'//YFRC, & @@ -2161,7 +2161,7 @@ IF (LFORCING) THEN LTIMEDEP = .FALSE. ) CALL IO_Field_write(TPFILE,TZFIELD,XTENDRVFRC(:,JT)) ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'GXTHFRC'//YFRC, & CSTDNAME = '', & CLONGNAME = 'GXTHFRC'//YFRC, & @@ -2174,7 +2174,7 @@ IF (LFORCING) THEN LTIMEDEP = .FALSE. ) CALL IO_Field_write(TPFILE,TZFIELD,XGXTHFRC(:,JT)) ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'GYTHFRC'//YFRC, & CSTDNAME = '', & CLONGNAME = 'GYTHFRC'//YFRC, & @@ -2187,7 +2187,7 @@ IF (LFORCING) THEN LTIMEDEP = .FALSE. ) CALL IO_Field_write(TPFILE,TZFIELD,XGYTHFRC(:,JT)) ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'PGROUNDFRC'//YFRC, & CSTDNAME = '', & CLONGNAME = 'PGROUNDFRC'//YFRC, & @@ -2200,7 +2200,7 @@ IF (LFORCING) THEN LTIMEDEP = .FALSE. ) CALL IO_Field_write(TPFILE,TZFIELD,XPGROUNDFRC(JT)) ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'TENDUFRC'//YFRC, & CSTDNAME = '', & CLONGNAME = 'TENDUFRC'//YFRC, & @@ -2213,7 +2213,7 @@ IF (LFORCING) THEN LTIMEDEP = .FALSE. ) CALL IO_Field_write(TPFILE,TZFIELD,XTENDUFRC(:,JT)) ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'TENDVFRC'//YFRC, & CSTDNAME = '', & CLONGNAME = 'TENDVFRC'//YFRC, & @@ -2234,7 +2234,7 @@ END IF ! ------------------------------------------------------------------------- IF ( L2D_ADV_FRC ) THEN ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'NADVFRC1', & CSTDNAME = '', & CLONGNAME = 'NADVFRC1', & @@ -2251,7 +2251,7 @@ IF ( L2D_ADV_FRC ) THEN ! WRITE (YFRC,'(I3.3)') JT ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'DTADV'//YFRC, & CSTDNAME = '', & CLONGNAME = 'DTADV'//YFRC, & @@ -2264,7 +2264,7 @@ IF ( L2D_ADV_FRC ) THEN LTIMEDEP = .FALSE. ) CALL IO_Field_write(TPFILE,TZFIELD,TDTADVFRC(JT)) ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'TH_ADV'//YFRC, & CSTDNAME = '', & CLONGNAME = 'TH_ADV'//YFRC, & @@ -2277,7 +2277,7 @@ IF ( L2D_ADV_FRC ) THEN LTIMEDEP = .FALSE. ) CALL IO_Field_write(TPFILE,TZFIELD,XDTHFRC(:,:,:,JT)) ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'Q_ADV'//YFRC, & CSTDNAME = '', & CLONGNAME = 'Q_ADV'//YFRC, & @@ -2295,7 +2295,7 @@ ENDIF ! IF ( L2D_REL_FRC ) THEN ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'NRELFRC1', & CSTDNAME = '', & CLONGNAME = 'NRELFRC1', & @@ -2312,7 +2312,7 @@ IF ( L2D_REL_FRC ) THEN ! WRITE (YFRC,'(I3.3)') JT ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'DTREL'//YFRC, & CSTDNAME = '', & CLONGNAME = 'DTREL'//YFRC, & @@ -2325,7 +2325,7 @@ IF ( L2D_REL_FRC ) THEN LTIMEDEP = .FALSE. ) CALL IO_Field_write(TPFILE,TZFIELD,TDTRELFRC(JT)) ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'TH_REL'//YFRC, & CSTDNAME = '', & CLONGNAME = 'TH_REL'//YFRC, & @@ -2338,7 +2338,7 @@ IF ( L2D_REL_FRC ) THEN LTIMEDEP = .FALSE. ) CALL IO_Field_write(TPFILE,TZFIELD,XTHREL(:,:,:,JT)) ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'Q_REL'//YFRC, & CSTDNAME = '', & CLONGNAME = 'Q_REL'//YFRC, & @@ -2417,7 +2417,7 @@ IF ( CPROGRAM=='REAL ' ) THEN !* 1.16 Dummy variables in PREP_REAL_CASE ! IF (ALLOCATED(CDUMMY_2D)) THEN - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'generic for CDUMMY_2D variables', & !Temporary name to ease identification CSTDNAME = '', & CUNITS = '', & @@ -2442,7 +2442,7 @@ END IF ! i) Main ! IF (LMAIN_EOL .AND. IMI == NMODEL_EOL) THEN - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'generic for wind turbine variables', & !Temporary name to ease identification CSTDNAME = '', & CUNITS = 'N', & @@ -2489,7 +2489,7 @@ SELECT CASE(CMETH_EOL) ! CASE('ADNR') ! Actuator Disc Non-Rotating ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'generic for ADNR variables', & !Temporary name to ease identification CSTDNAME = '', & CUNITS = '1', & @@ -2529,7 +2529,7 @@ SELECT CASE(CMETH_EOL) ! CASE('ALM') ! Actuator Line Method ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'generic for ALM variables', & !Temporary name to ease identification CSTDNAME = '', & CDIR = '--', & @@ -2599,7 +2599,7 @@ SELECT CASE(CMETH_EOL) ! IF (MEAN_COUNT /= 0) THEN ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'generic for ALM mean variables', & !Temporary name to ease identification CSTDNAME = '', & CDIR = '--', & diff --git a/src/MNH/write_surf_mnh.f90 b/src/MNH/write_surf_mnh.f90 index 21ac274af..5ede529c5 100644 --- a/src/MNH/write_surf_mnh.f90 +++ b/src/MNH/write_surf_mnh.f90 @@ -11,7 +11,7 @@ CONTAINS SUBROUTINE PREPARE_METADATA_WRITE_SURF(HREC,HDIR,HCOMMENT,KGRID,KTYPE,KDIMS,HSUBR,TPFIELD) ! -use modd_field, only: tfielddata, tfieldlist +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 @@ -99,7 +99,7 @@ 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 = TFIELDDATA( & + TPFIELD = TFIELDMETADATA( & CMNHNAME = TRIM(HREC), & CSTDNAME = '', & CLONGNAME = TRIM(HREC), & @@ -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,7 +285,7 @@ END SUBROUTINE WRITE_SURFX0_MNH ! ------------ ! USE MODD_CONF_n, ONLY: CSTORAGE_TYPE -use modd_field, only: tfielddata, tfieldlist, TYPEREAL +use modd_field, only: tfieldmetadata, tfieldlist, TYPEREAL USE MODD_GRID_n, ONLY: XXHAT, XYHAT USE MODD_IO, ONLY: TFILE_SURFEX USE MODD_IO_SURF_MNH, ONLY :NMASK, CMASK, & @@ -334,8 +334,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 +437,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 @@ -468,7 +468,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 @@ -549,7 +549,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 +603,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,7 +641,7 @@ END IF !GCOVER_PACKED = ( NB_PROCIO_W /= 1 ) GCOVER_PACKED = .FALSE. ! -TZFIELD = TFIELDDATA( & +TZFIELD = TFIELDMETADATA( & CMNHNAME = 'COVER_PACKED', & CSTDNAME = '', & CLONGNAME = 'COVER_PACKED', & @@ -672,7 +672,7 @@ END DO ! IF (.NOT. GCOVER_PACKED) THEN ICOVER=0 - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'generic for COVER variables', & !Temporary name to ease identification CSTDNAME = '', & CUNITS = '', & @@ -754,7 +754,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, & @@ -797,8 +797,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)) @@ -904,7 +904,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 @@ -924,9 +924,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)) @@ -998,7 +998,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 @@ -1028,8 +1028,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)) @@ -1102,7 +1102,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 @@ -1121,9 +1121,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)) @@ -1198,7 +1198,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 @@ -1228,8 +1228,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)) @@ -1313,7 +1313,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 @@ -1332,8 +1332,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)) ! @@ -1396,7 +1396,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 @@ -1420,11 +1420,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)) @@ -1490,7 +1490,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 @@ -1514,9 +1514,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)) @@ -1530,7 +1530,7 @@ ELSE ITDATE(2,:) = KMONTH (:) ITDATE(3,:) = KDAY (:) ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = TRIM(HREC)//'%TDATE', & CSTDNAME = '', & CLONGNAME = TRIM(HREC)//'%TDATE', & @@ -1549,7 +1549,7 @@ ELSE CALL PRINT_MSG(NVERB_ERROR,'IO','WRITE_SURFT1_MNH','error when writing article '//TRIM(HREC)//' KRESP='//YMSG) END IF ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = TRIM(HREC)//'%xtime', & CSTDNAME = '', & CLONGNAME = TRIM(HREC)//'%xtime', & diff --git a/src/MNH/zsmt_pgd.f90 b/src/MNH/zsmt_pgd.f90 index c6c85422f..3aea708e6 100644 --- a/src/MNH/zsmt_pgd.f90 +++ b/src/MNH/zsmt_pgd.f90 @@ -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 @@ -334,7 +334,7 @@ IF(OHSLOP) THEN END DO ! ! Writes filtred orography and slopes along i and j - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'ZSLOPEX', & CSTDNAME = '', & CLONGNAME = 'ZSLOPEX', & @@ -347,7 +347,7 @@ IF(OHSLOP) THEN LTIMEDEP = .FALSE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZSLOPEX) ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'ZSLOPEY', & CSTDNAME = '', & CLONGNAME = 'ZSLOPEY', & @@ -360,7 +360,7 @@ IF(OHSLOP) THEN LTIMEDEP = .FALSE. ) CALL IO_Field_write(TPFILE,TZFIELD,ZSLOPEY) ! - TZFIELD = TFIELDDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'ZS_FILTR', & CSTDNAME = '', & CLONGNAME = 'ZS_FILTR', & -- GitLab From fef4c4b57f2d3ac760b8a863bfd95422be2a1007 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Fri, 26 Nov 2021 14:05:32 +0100 Subject: [PATCH 020/157] Philippe 26/11/2021: IO: create TSVLIST to store metadata of all scalar variables --- src/MNH/ini_nsv.f90 | 288 ++++++++++++++++++++++++++++++++++++++++- src/MNH/modd_nsv.f90 | 19 ++- src/MNH/update_nsv.f90 | 20 ++- 3 files changed, 317 insertions(+), 10 deletions(-) diff --git a/src/MNH/ini_nsv.f90 b/src/MNH/ini_nsv.f90 index c49362598..eddddd15e 100644 --- a/src/MNH/ini_nsv.f90 +++ b/src/MNH/ini_nsv.f90 @@ -70,7 +70,7 @@ END MODULE MODI_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 !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -98,6 +98,7 @@ 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 #ifdef MNH_FOREFIRE USE MODD_FOREFIRE #endif @@ -106,6 +107,7 @@ 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, NUNITLGTMAX USE MODD_PARAM_LIMA, ONLY: NINDICE_CCN_IMM, NIMM, NMOD_CCN, LSCAV, LAERO_MASS, & NMOD_IFN, NMOD_IMM, LHHONI, & LWARM, LCOLD, LRAIN, LSPRO @@ -136,6 +138,8 @@ INTEGER, INTENT(IN) :: KMI ! model index ! CHARACTER(LEN=2) :: YNUM2 CHARACTER(LEN=3) :: YNUM3 +CHARACTER(LEN=NCOMMENTLGTMAX) :: YCOMMENT +CHARACTER(LEN=NUNITLGTMAX) :: YUNITS INTEGER :: ILUOUT INTEGER :: ISV ! total number of scalar variables INTEGER :: IMODEIDX, IMOMENTS @@ -570,7 +574,7 @@ ELSE NSV_LNOXEND_A(KMI)= 0 END IF ! -! finale number of NSV variable +! Final number of NSV variables ! NSV_A(KMI) = ISV ! @@ -781,113 +785,393 @@ END IF 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_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(2) ) // YNUM2 + TSVLIST_A(JSV, KMI)%CMNHNAME = TRIM( CLIMA_COLD_NAMES(2) ) // 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(3) ) // YNUM2 + TSVLIST_A(JSV, KMI)%CMNHNAME = TRIM( CLIMA_COLD_NAMES(3) ) // 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(4) ) // YNUM2 + TSVLIST_A(JSV, KMI)%CMNHNAME = TRIM( CLIMA_COLD_NAMES(4) ) // YNUM2 ELSE IF ( JSV == NSV_LIMA_HOM_HAZE_A(KMI) ) THEN CSVNAMES_A(JSV,KMI) = TRIM( CLIMA_COLD_NAMES(5) ) + TSVLIST_A(JSV, KMI)%CMNHNAME = TRIM( CLIMA_COLD_NAMES(5) ) ELSE IF ( JSV == NSV_LIMA_SPRO_A(KMI) ) THEN CSVNAMES_A(JSV,KMI) = TRIM( CLIMA_WARM_NAMES(5) ) + 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 m-3' + WRITE( YCOMMENT, '( A6, A3, I3.3 )' ) 'X_Y_Z_', 'SVT', JSV + ELSE + YUNITS = 'm-3' + WRITE( YCOMMENT, '( A6, A3, I3.3, A8 )' ) 'X_Y_Z_', 'SVT', JSV, ' (nb ions/m3)' + 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) ) + + 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 = 'ppp', & + 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) ) + + 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 = 'ppp', & + 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) ) + + WRITE( YNUM3, '( I3.3 )' ) JSV + + TSVLIST_A(JSV, KMI) = TFIELDMETADATA( & + CMNHNAME = TRIM( CAERONAMES(JSV-NSV_AERBEG_A(KMI)+1) ), & + CSTDNAME = '', & + CLONGNAME = TRIM( CAERONAMES(JSV-NSV_AERBEG_A(KMI)+1) ), & + CUNITS = 'ppp', & + 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) ) + + 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 = 'ppp', & + 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) ) + + WRITE( YNUM3, '( I3.3 )' ) JSV + + TSVLIST_A(JSV, KMI) = TFIELDMETADATA( & + CMNHNAME = TRIM( CDUSTNAMES(JSV-NSV_DSTBEG_A(KMI)+1) ), & + CSTDNAME = '', & + CLONGNAME = TRIM( CDUSTNAMES(JSV-NSV_DSTBEG_A(KMI)+1) ), & + CUNITS = 'ppp', & + 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) ) + + 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 = 'ppp', & + 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) ) + + WRITE( YNUM3, '( I3.3 )' ) JSV + + TSVLIST_A(JSV, KMI) = TFIELDMETADATA( & + CMNHNAME = TRIM( CSALTNAMES(JSV-NSV_SLTBEG_A(KMI)+1) ), & + CSTDNAME = '', & + CLONGNAME = TRIM( CSALTNAMES(JSV-NSV_SLTBEG_A(KMI)+1) ), & + CUNITS = 'ppp', & + 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) ) + + 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 = 'ppp', & + 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 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 + + TSVLIST_A(JSV, KMI) = TFIELDMETADATA( & + CMNHNAME = 'SVLNOX' // YNUM3, & + CSTDNAME = '', & + CLONGNAME = 'SVLNOX' // YNUM3, & + CUNITS = 'ppp', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_Z_' // 'SVT' // YNUM3, & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 3, & + LTIMEDEP = .TRUE. ) END DO END SUBROUTINE INI_NSV diff --git a/src/MNH/modd_nsv.f90 b/src/MNH/modd_nsv.f90 index 7a842a5c1..1f152e85a 100644 --- a/src/MNH/modd_nsv.f90 +++ b/src/MNH/modd_nsv.f90 @@ -30,15 +30,16 @@ !! 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 !------------------------------------------------------------------------------- ! !* 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 ! IMPLICIT NONE SAVE @@ -47,7 +48,8 @@ REAL,DIMENSION(JPSVMAX) :: XSVMIN ! minimum value for SV variables ! LOGICAL :: LINI_NSV = .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=JPSVNAMELGTMAX), DIMENSION(:,:), ALLOCATABLE, TARGET :: CSVNAMES_A !Names of all the scalar 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+.. @@ -89,7 +91,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 @@ -151,8 +153,11 @@ 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=JPSVNAMELGTMAX), DIMENSION(:), POINTER :: CSVNAMES !Names of all the scalar 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_USER = 0 ! number of user scalar variables with indices diff --git a/src/MNH/update_nsv.f90 b/src/MNH/update_nsv.f90 index c706bfe90..6e2e7f502 100644 --- a/src/MNH/update_nsv.f90 +++ b/src/MNH/update_nsv.f90 @@ -27,9 +27,11 @@ END MODULE MODI_UPDATE_NSV !! 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 !------------------------------------------------------------------------------- ! -USE MODD_CONF, ONLY : NVERB +USE MODD_CONF, ONLY: NVERB +USE MODD_FIELD, ONLY: tfieldmetadata USE MODD_NSV use mode_msg @@ -40,6 +42,7 @@ INTEGER, INTENT(IN) :: KMI ! Model index CHARACTER(LEN=JPSVNAMELGTMAX), DIMENSION(:,:), ALLOCATABLE :: YSVNAMES_TMP INTEGER :: JI, JJ +TYPE(tfieldmetadata), DIMENSION(:,:), ALLOCATABLE :: YSVLIST_TMP ! ! STOP if INI_NSV has not be called yet IF (.NOT. LINI_NSV) THEN @@ -65,6 +68,21 @@ END IF CSVNAMES => CSVNAMES_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) NSV_C2R2 = NSV_C2R2_A(KMI) -- GitLab From 19b149c1f3369e87d7b6cec2f1accd39ad807f36 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Fri, 26 Nov 2021 14:23:06 +0100 Subject: [PATCH 021/157] Philippe 26/11/2021: IO: use TSVLIST for LIMA variables --- src/MNH/ini_lb.f90 | 258 ++++++++++++++++------------- src/MNH/read_field.f90 | 71 +------- src/MNH/spawn_field2.f90 | 72 +------- src/MNH/write_aircraft_balloon.f90 | 42 +---- src/MNH/write_lbn.f90 | 55 +++--- src/MNH/write_lfin.f90 | 78 +-------- src/MNH/write_profilern.f90 | 52 ++---- 7 files changed, 206 insertions(+), 422 deletions(-) diff --git a/src/MNH/ini_lb.f90 b/src/MNH/ini_lb.f90 index 3c610aa2d..710de1454 100644 --- a/src/MNH/ini_lb.f90 +++ b/src/MNH/ini_lb.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1998-2020 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1998-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. @@ -151,10 +151,8 @@ 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_PARAMETERS, ONLY: JPHEXT, NMNHNAMELGTMAX +USE MODD_PARAM_LIMA, ONLY: NMOD_CCN, NMOD_IFN USE MODD_PARAM_n USE MODD_RAIN_C2R2_DESCR, ONLY: C2R2NAMES USE MODD_SALT @@ -224,14 +222,14 @@ INTEGER :: JSV,JRR ! Loop index for MOIST AND 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 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 +CHARACTER(LEN=NMNHNAMELGTMAX) :: YMNHNAME_BASE TYPE(TFIELDMETADATA) :: TZFIELD !------------------------------------------------------------------------------- ! @@ -676,120 +674,131 @@ 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 - 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_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 + DO JSV = NSV_LIMA_CCN_FREE, NSV_LIMA_CCN_FREE + NMOD_CCN - 1 + SELECT CASE(HGETSVM(JSV)) + CASE ('READ') + TZFIELD = TSVLIST(JSV) + TZFIELD%CDIR = '' + YMNHNAME_BASE = TRIM( TZFIELD%CMNHNAME ) + + IF ( KSIZELBXSV_ll /= 0 .AND. SIZE(PLBXSVM,1) /= 0 ) THEN + TZFIELD%CMNHNAME = 'LBX_' // TRIM( YMNHNAME_BASE ) + + 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 + CALL OLD_CMNHNAME_GENERATE_INTERN( TZFIELD%CMNHNAME ) + END IF + + TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) + 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) + 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 + CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize CCN PLBXSVM') + ENDIF END IF - ! - IF (KSIZELBYSV_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_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 + END IF + ! + IF (KSIZELBYSV_ll /= 0 .AND. SIZE(PLBYSVM,1) /= 0 ) THEN + TZFIELD%CMNHNAME = 'LBY_' // TRIM( YMNHNAME_BASE ) + + 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 + CALL OLD_CMNHNAME_GENERATE_INTERN( TZFIELD%CMNHNAME ) + END IF + + TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) + 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) + 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 + CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize CCN PLBYSVM') + ENDIF 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 ! - 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 - TZFIELD%CMNHNAME = 'LBX_'//TRIM(UPCASE(CLIMA_COLD_NAMES(2))//INDICE) - 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 + DO JSV = NSV_LIMA_IFN_FREE,NSV_LIMA_IFN_FREE+NMOD_IFN-1 + SELECT CASE(HGETSVM(JSV)) + CASE ('READ') + TZFIELD = TSVLIST(JSV) + TZFIELD%CDIR = '' + YMNHNAME_BASE = TRIM( TZFIELD%CMNHNAME ) + + IF ( KSIZELBXSV_ll /= 0 .AND. SIZE(PLBXSVM,1) /= 0 ) THEN + TZFIELD%CMNHNAME = 'LBX_' // TRIM( YMNHNAME_BASE ) + + 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 + CALL OLD_CMNHNAME_GENERATE_INTERN( TZFIELD%CMNHNAME ) + END IF + + TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) + 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) + WRITE(ILUOUT,*) 'IFN PLBXSVM will be initialized to 0' + ELSE !callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize IFN') - ENDIF - END IF - END IF + CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize IFN') + ENDIF END IF - ! - IF (KSIZELBYSV_ll /= 0 ) THEN - TZFIELD%CMNHNAME = 'LBY_'//TRIM(UPCASE(CLIMA_COLD_NAMES(2))//INDICE) - 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 + END IF + ! + IF (KSIZELBYSV_ll /= 0 .AND. SIZE(PLBYSVM,1) /= 0 ) THEN + TZFIELD%CMNHNAME = 'LBY_' // TRIM( YMNHNAME_BASE ) + + 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 + CALL OLD_CMNHNAME_GENERATE_INTERN( TZFIELD%CMNHNAME ) + END IF + + TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) + 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) + 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 + CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize IFN') + ENDIF 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 + 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 ! ELEC scalar variables IF (NSV_ELECEND>=NSV_ELECBEG) THEN TZFIELD%CSTDNAME = '' @@ -1634,4 +1643,29 @@ IF (OLSOURCE) THEN ! ENDIF ! +CONTAINS + + SUBROUTINE OLD_CMNHNAME_GENERATE_INTERN( YMNHNAME ) + + CHARACTER(LEN=*), INTENT(INOUT) :: YMNHNAME + + 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 + + END SUBROUTINE OLD_CMNHNAME_GENERATE_INTERN + END SUBROUTINE INI_LB diff --git a/src/MNH/read_field.f90 b/src/MNH/read_field.f90 index 90b6c3552..12df351b5 100644 --- a/src/MNH/read_field.f90 +++ b/src/MNH/read_field.f90 @@ -289,10 +289,6 @@ USE MODD_NSV USE MODD_OCEANH 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_PARAM_n, ONLY: CSCONV USE MODD_PASPOL USE MODD_RAIN_C2R2_DESCR, ONLY: C2R2NAMES @@ -420,7 +416,6 @@ 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 CHARACTER(LEN=3) :: YFRC ! To mark the different forcing dates CHARACTER(LEN=15) :: YVAL REAL, DIMENSION(KIU,KJU,KKU) :: ZWORK ! to compute supersaturation @@ -891,70 +886,12 @@ END IF ! ! LIMA variables ! -DO JSV = NSV_LIMA_BEG,NSV_LIMA_END +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 -! 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(2))//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(3))//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(4))//INDICE//'T' - END IF -! Hom. freez. of CCN - IF (JSV .EQ. NSV_LIMA_HOM_HAZE) THEN - TZFIELD%CMNHNAME = TRIM(CLIMA_COLD_NAMES(5))//'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) + TZFIELD = TSVLIST(JSV) + TZFIELD%CMNHNAME = TRIM( TZFIELD%CMNHNAME ) // 'T' + TZFIELD%CLONGNAME = TRIM( TZFIELD%CMNHNAME ) CALL IO_Field_read(TPINIFILE,TZFIELD,PSVT(:,:,:,JSV)) CASE ('INIT') PSVT(:,:,:,JSV) = 0. diff --git a/src/MNH/spawn_field2.f90 b/src/MNH/spawn_field2.f90 index 360cb0e0e..e774f4c61 100644 --- a/src/MNH/spawn_field2.f90 +++ b/src/MNH/spawn_field2.f90 @@ -182,10 +182,6 @@ 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 @@ -278,7 +274,6 @@ REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZRT1 LOGICAL :: GUSERV ! CHARACTER(LEN=15) :: YVAL -CHARACTER(LEN=2) :: INDICE TYPE(TFIELDMETADATA) :: TZFIELD ! !------------------------------------------------------------------------------- @@ -880,69 +875,12 @@ IF (PRESENT(TPSONFILE)) THEN ! ! 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 - ! 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(2))//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(3))//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(4))//INDICE//'T' - END IF - ! Hom. freez. of CCN - IF (JSV .EQ. NSV_LIMA_HOM_HAZE) THEN - TZFIELD%CMNHNAME = TRIM(CLIMA_COLD_NAMES(5))//'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) + DO JSV = NSV_LIMA_BEG, NSV_LIMA_END + TZFIELD = TSVLIST(JSV) + TZFIELD%CMNHNAME = TRIM( TZFIELD%CMNHNAME ) // '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,:) + IF ( IRESP == 0 ) PSVT(KIB2:KIE2, KJB2:KJE2, :, JSV) = ZWORK3D(KIB1:KIE1, KJB1:KJE1, :) END DO ! ! ELEC Scalar Variables diff --git a/src/MNH/write_aircraft_balloon.f90 b/src/MNH/write_aircraft_balloon.f90 index cd693d89c..a8dc25cb4 100644 --- a/src/MNH/write_aircraft_balloon.f90 +++ b/src/MNH/write_aircraft_balloon.f90 @@ -98,9 +98,6 @@ 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 @@ -214,7 +211,6 @@ INTEGER :: JRR ! loop counter INTEGER :: JSV ! loop counter INTEGER :: JPT ! loop counter INTEGER :: IKU, IK -CHARACTER(LEN=2) :: INDICE INTEGER :: JLOOP type(tbudiachrometadata) :: tzbudiachro type(tfieldmetadata_base), dimension(:), allocatable :: tzfields @@ -435,39 +431,13 @@ IF (SIZE(TPFLYER%SV,2)>=1) THEN ! 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 .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(2))//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(3))//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(4))//INDICE//'T' - ENDIF - IF (JSV .EQ. NSV_LIMA_HOM_HAZE) YTITLE(JPROC)=TRIM(CLIMA_COLD_NAMES(5))//'T' - IF (JSV .EQ. NSV_LIMA_SPRO) YTITLE(JPROC)=TRIM(CLIMA_WARM_NAMES(5))//'T' + + YTITLE(JPROC) = TRIM( TSVLIST(JSV)%CMNHNAME ) + YUNIT(JPROC) = TRIM( TSVLIST(JSV)%CUNITS ) + YCOMMENT(JPROC) = ' ' + ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%SV(:,JSV) - END DO + END DO ! electrical scalar variables DO JSV = NSV_ELECBEG,NSV_ELECEND JPROC = JPROC+1 diff --git a/src/MNH/write_lbn.f90 b/src/MNH/write_lbn.f90 index 001d85f1d..4b612a21e 100644 --- a/src/MNH/write_lbn.f90 +++ b/src/MNH/write_lbn.f90 @@ -91,7 +91,7 @@ USE MODD_LUNIT_n USE MODD_PARAM_n USE MODD_TURB_n USE MODD_NSV -USE MODD_PARAM_LIMA +USE MODD_PARAM_LIMA, ONLY: NMOD_CCN, NMOD_IFN USE MODD_PARAM_n ! USE MODE_IO_FIELD_WRITE, only: IO_Field_write, IO_Field_write_lb @@ -105,8 +105,6 @@ 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 MODI_CH_AER_REALLFI_n @@ -119,9 +117,9 @@ USE MODD_DUST USE MODD_SALT USE MODI_DUSTLFI_n USE MODI_SALTLFI_n -USE MODD_PARAMETERS, ONLY: JPHEXT +USE MODD_PARAMETERS, ONLY: JPHEXT, NMNHNAMELGTMAX USE MODD_IO, ONLY: TFILEDATA -use modd_field, only: tfieldmetadata, TYPELOG, TYPEREAL +use modd_field, only: tfieldmetadata, NMNHDIM_UNKNOWN, TYPELOG, TYPEREAL ! ! IMPLICIT NONE @@ -145,14 +143,13 @@ REAL, DIMENSION(SIZE(XLBXSVM, 1), SIZE(XLBXSVM,2), SIZE(XLBXSVM,3)) :: ZRHODR 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 +CHARACTER(LEN=NMNHNAMELGTMAX) :: YMNHNAME_BASE TYPE(TFIELDMETADATA) :: TZFIELD !------------------------------------------------------------------------------- ! @@ -372,48 +369,48 @@ IF (NSV >=1) THEN ! 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) + TZFIELD = TSVLIST(JSV) + TZFIELD%CDIR = '' + TZFIELD%NDIMLIST(:) = NMNHDIM_UNKNOWN + YMNHNAME_BASE = TRIM( TZFIELD%CMNHNAME ) + ! IF(NSIZELBXSV_ll /= 0) THEN - TZFIELD%CMNHNAME = 'LBX_'//TRIM(UPCASE(CLIMA_WARM_NAMES(3))//INDICE) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) + TZFIELD%CMNHNAME = 'LBX_' // TRIM( YMNHNAME_BASE ) + TZFIELD%CLONGNAME = 'LBX_' // TRIM( YMNHNAME_BASE ) + WRITE( TZFIELD%CCOMMENT, '( A6, A6, I3.3 ) ' ) '2_Y_Z_', 'LBXSVM', JSV 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%CMNHNAME = 'LBY_' // TRIM( YMNHNAME_BASE ) + TZFIELD%CLONGNAME = 'LBY_' // TRIM( YMNHNAME_BASE ) + WRITE( TZFIELD%CCOMMENT, '( A6, A6, I3.3 ) ' ) 'X_2_Z_', 'LBYSVM', JSV 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) + TZFIELD = TSVLIST(JSV) + TZFIELD%CDIR = '' + TZFIELD%NDIMLIST(:) = NMNHDIM_UNKNOWN + YMNHNAME_BASE = TRIM( TZFIELD%CMNHNAME ) + ! IF(NSIZELBXSV_ll /= 0) THEN - TZFIELD%CMNHNAME = 'LBX_'//TRIM(UPCASE(CLIMA_COLD_NAMES(2))//INDICE) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) + TZFIELD%CMNHNAME = 'LBX_' // TRIM( YMNHNAME_BASE ) + TZFIELD%CLONGNAME = 'LBX_' // TRIM( YMNHNAME_BASE ) + WRITE( TZFIELD%CCOMMENT, '( A6, A6, I3.3 ) ' ) '2_Y_Z_', 'LBXSVM', JSV 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(2))//INDICE) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) + TZFIELD%CMNHNAME = 'LBY_' // TRIM( YMNHNAME_BASE ) + TZFIELD%CLONGNAME = 'LBY_' // TRIM( YMNHNAME_BASE ) + WRITE( TZFIELD%CCOMMENT, '( A6, A6, I3.3 ) ' ) 'X_2_Z_', 'LBYSVM', JSV 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 diff --git a/src/MNH/write_lfin.f90 b/src/MNH/write_lfin.f90 index 6b1823d8c..2fdcafd44 100644 --- a/src/MNH/write_lfin.f90 +++ b/src/MNH/write_lfin.f90 @@ -244,10 +244,7 @@ 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_PARAM_LIMA, ONLY: LSCAV, LAERO_MASS USE MODD_LIMA_PRECIP_SCAVENGING_n ! USE MODE_IO_FILE, only: IO_File_close @@ -332,7 +329,6 @@ 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(TFIELDMETADATA) :: TZFIELD !------------------------------------------------------------------------------- @@ -965,73 +961,11 @@ IF (NSV >=1) THEN ! ! 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. - 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 -! 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(2))//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(3))//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(4))//INDICE//'T' - END IF -! Hom. freez. of CCN - IF (JSV .EQ. NSV_LIMA_HOM_HAZE) THEN - TZFIELD%CMNHNAME = TRIM(CLIMA_COLD_NAMES(5))//'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) + DO JSV = NSV_LIMA_BEG, NSV_LIMA_END + + TZFIELD = TSVLIST(JSV) + TZFIELD%CMNHNAME = TRIM( TZFIELD%CMNHNAME ) // 'T' + TZFIELD%CLONGNAME = TRIM( TZFIELD%CMNHNAME ) CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)) ! JSA=JSA+1 diff --git a/src/MNH/write_profilern.f90 b/src/MNH/write_profilern.f90 index 13d9e1a8e..482a67713 100644 --- a/src/MNH/write_profilern.f90 +++ b/src/MNH/write_profilern.f90 @@ -21,16 +21,18 @@ ! ########################### 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 @@ -92,9 +94,6 @@ 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_PROFILER_n USE MODD_RADIATIONS_n, ONLY: NAER @@ -111,9 +110,9 @@ INTEGER, INTENT(IN) :: KI ! !* 0.2 declaration of local variables for diachro ! -character(len=2) :: yidx -character(len=100) :: ycomment -character(len=100) :: yname +character(len=NCOMMENTLGTMAX) :: ycomment +character(len=NMNHNAMELGTMAX) :: yname +character(len=NUNITLGTMAX) :: yunits CHARACTER(LEN=:), allocatable :: YGROUP ! group title INTEGER :: IKU INTEGER :: IPROC ! number of variables records @@ -207,35 +206,10 @@ if ( Size( tprofiler%sv, 4 ) > 0 ) then end do ! LIMA variables do jsv = nsv_lima_beg, nsv_lima_end - 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' - else if ( jsv == nsv_lima_ni ) then - yname = Trim( clima_cold_names(1) ) // '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(2) ) // 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(3) ) // 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(4) ) // yidx // 'T' - else if ( jsv == nsv_lima_hom_haze ) then - yname = Trim( clima_cold_names(5) ) // 'T' - else if ( jsv == nsv_lima_spro ) then - yname = Trim( clima_warm_names(5) ) // 'T' - end if - call Add_profile( yname, '', 'kg-1', tprofiler%sv(:,:,:,jsv) ) + yname = Trim( tsvlist(jsv)%cmnhname ) + yunits = Trim( tsvlist(jsv)%cunits ) + ycomment = '' + call Add_profile( yname, ycomment, yunits, tprofiler%sv(:,:,:,jsv) ) end do ! electrical scalar variables do jsv = nsv_elecbeg, nsv_elecend -- GitLab From 34076db93350ef3b3a14cd5960c34947363d001a Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Wed, 5 Jan 2022 11:38:52 +0100 Subject: [PATCH 022/157] Philippe 05/01/2022: replace ppp by ppv (ppp is not a valid unit) --- src/MNH/aer_monitorn.f90 | 6 +++--- src/MNH/ch_aer_reallfin.f90 | 13 ++++--------- src/MNH/ch_convect_scavenging.f90 | 7 ++++--- src/MNH/ch_emission_flux0d.f90 | 16 ++++++++-------- src/MNH/ch_field_valuen.f90 | 4 ++-- src/MNH/ch_model0d.f90 | 16 ++++++++-------- src/MNH/ch_monitorn.f90 | 6 +++--- src/MNH/ch_read_chem.f90 | 6 +++--- src/MNH/ch_surface0d.f90 | 8 ++++---- src/MNH/ch_write_chem.f90 | 6 +++--- src/MNH/effic_aero.f90 | 12 ++++-------- src/MNH/effic_dust.f90 | 10 +++------- src/MNH/effic_salt.f90 | 10 +++------- src/MNH/ground_paramn.f90 | 14 +++++++------- src/MNH/ini_lb.f90 | 16 ++++++++-------- src/MNH/ini_nsv.f90 | 22 +++++++++++----------- src/MNH/modd_ch_flxn.f90 | 11 +++-------- src/MNH/mode_aero_psd.f90 | 23 +++++++++-------------- src/MNH/mode_blowsnow_psd.f90 | 6 +++--- src/MNH/mode_dust_psd.f90 | 24 ++++++++++-------------- src/MNH/mode_salt_psd.f90 | 24 ++++++++++-------------- src/MNH/mode_salt_psd_wet.f90 | 24 ++++++++++-------------- src/MNH/radiations.f90 | 8 ++++---- src/MNH/read_all_data_grib_case.f90 | 4 ++-- src/MNH/read_chem_data_netcdf_case.f90 | 4 ++-- src/MNH/read_field.f90 | 18 +++++++++--------- src/MNH/sedim_blowsnow.f90 | 4 ++-- src/MNH/sedim_dust.f90 | 6 +++--- src/MNH/sedim_salt.f90 | 6 +++--- src/MNH/spawn_field2.f90 | 14 +++++++------- src/MNH/write_lbn.f90 | 8 ++++---- src/MNH/write_lfifm1_for_diag_supp.f90 | 6 +++--- src/MNH/write_lfin.f90 | 20 ++++++++++---------- src/MNH/write_ts1d.f90 | 4 ++-- 34 files changed, 174 insertions(+), 212 deletions(-) diff --git a/src/MNH/aer_monitorn.f90 b/src/MNH/aer_monitorn.f90 index 97faca64c..22d5f69a9 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/ch_aer_reallfin.f90 b/src/MNH/ch_aer_reallfin.f90 index 99b0f8766..505f3acfa 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 a0bfccfd6..dd8a55917 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 540a03306..74b84f6d4 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 0693c28a2..0dcd5670a 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 c2b4fb457..26ff9fe18 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 eee756dfb..5539015c3 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. @@ -623,7 +623,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 ! @@ -910,7 +910,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,:) ZSIG0(JM+1,:) = LOG(XSIG3D(JI,JJ,JK,:)) ZRG0(JM+1,:) = XRG3D(JI,JJ,JK,:) diff --git a/src/MNH/ch_read_chem.f90 b/src/MNH/ch_read_chem.f90 index bd3ed06df..29a166440 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 ce3bab6c4..8247ae0b7 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 ecc8a4b1e..a3c05fd66 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/effic_aero.f90 b/src/MNH/effic_aero.f90 index 83d653057..f3d053a49 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 0f3755fcf..a3ba0109e 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 a26367896..6b7f152d2 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/ground_paramn.f90 b/src/MNH/ground_paramn.f90 index b504d4b1b..795d0eb7e 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-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,7 +18,7 @@ INTERFACE 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) @@ -195,7 +195,7 @@ IMPLICIT NONE 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) @@ -679,7 +679,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 @@ -690,7 +690,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 @@ -700,7 +700,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 @@ -710,7 +710,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 diff --git a/src/MNH/ini_lb.f90 b/src/MNH/ini_lb.f90 index 710de1454..2d30bdde0 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. @@ -913,7 +913,7 @@ END IF ! Chemical aqueous phase scalar variables IF (NSV_CHACEND>=NSV_CHACBEG) THEN TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppp' + TZFIELD%CUNITS = 'ppv' TZFIELD%CDIR = '' TZFIELD%NGRID = 1 TZFIELD%NTYPE = TYPEREAL @@ -969,7 +969,7 @@ END IF ! Chemical ice phase scalar variables IF (NSV_CHICEND>=NSV_CHICBEG) THEN TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppp' + TZFIELD%CUNITS = 'ppv' TZFIELD%CDIR = '' TZFIELD%NGRID = 1 TZFIELD%NTYPE = TYPEREAL @@ -1025,7 +1025,7 @@ END IF ! Orilam aerosol scalar variables IF (NSV_AEREND>=NSV_AERBEG) THEN TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppp' + TZFIELD%CUNITS = 'ppv' TZFIELD%CDIR = '' TZFIELD%NGRID = 1 TZFIELD%NTYPE = TYPEREAL @@ -1081,7 +1081,7 @@ END IF ! Orilam aerosols moist scalar variables IF (NSV_AERDEPEND>=NSV_AERDEPBEG) THEN TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppp' + TZFIELD%CUNITS = 'ppv' TZFIELD%CDIR = '' TZFIELD%NGRID = 1 TZFIELD%NTYPE = TYPEREAL @@ -1137,7 +1137,7 @@ END IF ! Dust scalar variables IF (NSV_DSTEND>=NSV_DSTBEG) THEN TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppp' + TZFIELD%CUNITS = 'ppv' TZFIELD%CDIR = '' TZFIELD%NGRID = 1 TZFIELD%NTYPE = TYPEREAL @@ -1193,7 +1193,7 @@ END IF ! IF (NSV_DSTDEPEND>=NSV_DSTDEPBEG) THEN TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppp' + TZFIELD%CUNITS = 'ppv' TZFIELD%CDIR = '' TZFIELD%NGRID = 1 TZFIELD%NTYPE = TYPEREAL @@ -1250,7 +1250,7 @@ END IF ! Sea salt scalar variables IF (NSV_SLTEND>=NSV_SLTBEG) THEN TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppp' + TZFIELD%CUNITS = 'ppv' TZFIELD%CDIR = '' TZFIELD%NGRID = 1 TZFIELD%NTYPE = TYPEREAL diff --git a/src/MNH/ini_nsv.f90 b/src/MNH/ini_nsv.f90 index eddddd15e..072ec322b 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. @@ -842,7 +842,7 @@ DO JSV = NSV_LIMA_BEG_A(KMI), NSV_LIMA_END_A(KMI) CMNHNAME = 'SV LIMA ' // YNUM3, & CSTDNAME = '', & CLONGNAME = '', & - CUNITS = 'kg-1', & + CUNITS = 'kg-1', & CDIR = 'XY', & CCOMMENT = 'X_Y_Z_' // 'SVT' // YNUM3, & NGRID = 1, & @@ -1003,7 +1003,7 @@ DO JSV = NSV_CHEMBEG_A(KMI), NSV_CHEMEND_A(KMI) CMNHNAME = TRIM( CNAMES(JSV-NSV_CHEMBEG_A(KMI)+1) ), & CSTDNAME = '', & CLONGNAME = TRIM( CNAMES(JSV-NSV_CHEMBEG_A(KMI)+1) ), & - CUNITS = 'ppp', & + CUNITS = 'ppv', & CDIR = 'XY', & CCOMMENT = 'X_Y_Z_' // 'SVT' // YNUM3, & NGRID = 1, & @@ -1021,7 +1021,7 @@ DO JSV = NSV_CHICBEG_A(KMI), NSV_CHICEND_A(KMI) CMNHNAME = TRIM( CICNAMES(JSV-NSV_CHICBEG_A(KMI)+1) ), & CSTDNAME = '', & CLONGNAME = TRIM( CICNAMES(JSV-NSV_CHICBEG_A(KMI)+1) ), & - CUNITS = 'ppp', & + CUNITS = 'ppv', & CDIR = 'XY', & CCOMMENT = 'X_Y_Z_' // 'SVT' // YNUM3, & NGRID = 1, & @@ -1039,7 +1039,7 @@ DO JSV = NSV_AERBEG_A(KMI), NSV_AEREND_A(KMI) CMNHNAME = TRIM( CAERONAMES(JSV-NSV_AERBEG_A(KMI)+1) ), & CSTDNAME = '', & CLONGNAME = TRIM( CAERONAMES(JSV-NSV_AERBEG_A(KMI)+1) ), & - CUNITS = 'ppp', & + CUNITS = 'ppv', & CDIR = 'XY', & CCOMMENT = 'X_Y_Z_' // 'SVT' // YNUM3, & NGRID = 1, & @@ -1057,7 +1057,7 @@ DO JSV = NSV_AERDEPBEG_A(KMI), NSV_AERDEPEND_A(KMI) CMNHNAME = TRIM( CDEAERNAMES(JSV-NSV_AERDEPBEG_A(KMI)+1) ), & CSTDNAME = '', & CLONGNAME = TRIM( CDEAERNAMES(JSV-NSV_AERDEPBEG_A(KMI)+1) ), & - CUNITS = 'ppp', & + CUNITS = 'ppv', & CDIR = 'XY', & CCOMMENT = 'X_Y_Z_' // 'SVT' // YNUM3, & NGRID = 1, & @@ -1075,7 +1075,7 @@ DO JSV = NSV_DSTBEG_A(KMI), NSV_DSTEND_A(KMI) CMNHNAME = TRIM( CDUSTNAMES(JSV-NSV_DSTBEG_A(KMI)+1) ), & CSTDNAME = '', & CLONGNAME = TRIM( CDUSTNAMES(JSV-NSV_DSTBEG_A(KMI)+1) ), & - CUNITS = 'ppp', & + CUNITS = 'ppv', & CDIR = 'XY', & CCOMMENT = 'X_Y_Z_' // 'SVT' // YNUM3, & NGRID = 1, & @@ -1093,7 +1093,7 @@ DO JSV = NSV_DSTDEPBEG_A(KMI), NSV_DSTDEPEND_A(KMI) CMNHNAME = TRIM( CDEDSTNAMES(JSV-NSV_DSTDEPBEG_A(KMI)+1) ), & CSTDNAME = '', & CLONGNAME = TRIM( CDEDSTNAMES(JSV-NSV_DSTDEPBEG_A(KMI)+1) ), & - CUNITS = 'ppp', & + CUNITS = 'ppv', & CDIR = 'XY', & CCOMMENT = 'X_Y_Z_' // 'SVT' // YNUM3, & NGRID = 1, & @@ -1111,7 +1111,7 @@ DO JSV = NSV_SLTBEG_A(KMI), NSV_SLTEND_A(KMI) CMNHNAME = TRIM( CSALTNAMES(JSV-NSV_SLTBEG_A(KMI)+1) ), & CSTDNAME = '', & CLONGNAME = TRIM( CSALTNAMES(JSV-NSV_SLTBEG_A(KMI)+1) ), & - CUNITS = 'ppp', & + CUNITS = 'ppv', & CDIR = 'XY', & CCOMMENT = 'X_Y_Z_' // 'SVT' // YNUM3, & NGRID = 1, & @@ -1129,7 +1129,7 @@ DO JSV = NSV_SLTDEPBEG_A(KMI), NSV_SLTDEPEND_A(KMI) CMNHNAME = TRIM( CDESLTNAMES(JSV-NSV_SLTDEPBEG_A(KMI)+1) ), & CSTDNAME = '', & CLONGNAME = TRIM( CDESLTNAMES(JSV-NSV_SLTDEPBEG_A(KMI)+1) ), & - CUNITS = 'ppp', & + CUNITS = 'ppv', & CDIR = 'XY', & CCOMMENT = 'X_Y_Z_' // 'SVT' // YNUM3, & NGRID = 1, & @@ -1165,7 +1165,7 @@ DO JSV = NSV_LNOXBEG_A(KMI), NSV_LNOXEND_A(KMI) CMNHNAME = 'SVLNOX' // YNUM3, & CSTDNAME = '', & CLONGNAME = 'SVLNOX' // YNUM3, & - CUNITS = 'ppp', & + CUNITS = 'ppv', & CDIR = 'XY', & CCOMMENT = 'X_Y_Z_' // 'SVT' // YNUM3, & NGRID = 1, & diff --git a/src/MNH/modd_ch_flxn.f90 b/src/MNH/modd_ch_flxn.f90 index 47c729a93..4a1e9930f 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/mode_aero_psd.f90 b/src/MNH/mode_aero_psd.f90 index cb09f5461..9eedf4e47 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 @@ -29,7 +24,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 @@ -43,7 +38,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 @@ -317,7 +312,7 @@ END SUBROUTINE PPP2AERO ! ! ############################################################ 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 @@ -328,7 +323,7 @@ END SUBROUTINE PPP2AERO !! !! 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 !! --------- @@ -519,7 +514,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 @@ -537,7 +532,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 @@ -551,7 +546,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 71298e331..6e741809b 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_dust_psd.f90 b/src/MNH/mode_dust_psd.f90 index 70e078f5e..3fdff9eb7 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 @@ -324,7 +320,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 @@ -334,7 +330,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 !! ------- @@ -539,7 +535,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 @@ -552,7 +548,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 @@ -586,7 +582,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_salt_psd.f90 b/src/MNH/mode_salt_psd.f90 index dc5a8611e..c014096a8 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 @@ -354,7 +350,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 @@ -364,7 +360,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 !! ------- @@ -571,7 +567,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 @@ -584,7 +580,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 @@ -618,7 +614,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 cb5af52f8..2a679f193 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/radiations.f90 b/src/MNH/radiations.f90 index 809d0d6f0..3778dd245 100644 --- a/src/MNH/radiations.f90 +++ b/src/MNH/radiations.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. @@ -897,7 +897,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 @@ -911,7 +911,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 @@ -926,7 +926,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 diff --git a/src/MNH/read_all_data_grib_case.f90 b/src/MNH/read_all_data_grib_case.f90 index 841ae62b0..18ac78eda 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. @@ -1362,7 +1362,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_chem_data_netcdf_case.f90 b/src/MNH/read_chem_data_netcdf_case.f90 index 547a55b53..d779c372a 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. @@ -439,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_field.f90 b/src/MNH/read_field.f90 index a21ac5b41..0264f75c6 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-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. @@ -977,7 +977,7 @@ END IF ! IF (NSV_CHICEND>=NSV_CHICBEG) THEN TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppp' + TZFIELD%CUNITS = 'ppv' TZFIELD%CDIR = 'XY' TZFIELD%NGRID = 1 TZFIELD%NTYPE = TYPEREAL @@ -1000,7 +1000,7 @@ END IF ! IF (NSV_SLTEND>=NSV_SLTBEG) THEN TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppp' + TZFIELD%CUNITS = 'ppv' TZFIELD%CDIR = 'XY' TZFIELD%NGRID = 1 TZFIELD%NTYPE = TYPEREAL @@ -1022,7 +1022,7 @@ END IF ! IF (NSV_SLTDEPEND>=NSV_SLTDEPBEG) THEN TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppp' + TZFIELD%CUNITS = 'ppv' TZFIELD%CDIR = 'XY' TZFIELD%NGRID = 1 TZFIELD%NTYPE = TYPEREAL @@ -1044,7 +1044,7 @@ END IF ! IF (NSV_DSTEND>=NSV_DSTBEG) THEN TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppp' + TZFIELD%CUNITS = 'ppv' TZFIELD%CDIR = 'XY' TZFIELD%NGRID = 1 TZFIELD%NTYPE = TYPEREAL @@ -1066,7 +1066,7 @@ END IF ! IF (NSV_DSTDEPEND>=NSV_DSTDEPBEG) THEN TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppp' + TZFIELD%CUNITS = 'ppv' TZFIELD%CDIR = 'XY' TZFIELD%NGRID = 1 TZFIELD%NTYPE = TYPEREAL @@ -1088,7 +1088,7 @@ END IF ! IF (NSV_AEREND>=NSV_AERBEG) THEN TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppp' + TZFIELD%CUNITS = 'ppv' TZFIELD%CDIR = 'XY' TZFIELD%NGRID = 1 TZFIELD%NTYPE = TYPEREAL @@ -1110,7 +1110,7 @@ END IF ! IF (NSV_AERDEPEND>=NSV_AERDEPBEG) THEN TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppp' + TZFIELD%CUNITS = 'ppv' TZFIELD%CDIR = 'XY' TZFIELD%NGRID = 1 TZFIELD%NTYPE = TYPEREAL @@ -1241,7 +1241,7 @@ END IF ! IF (NSV_LNOXEND>=NSV_LNOXBEG) THEN TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppp' + TZFIELD%CUNITS = 'ppv' TZFIELD%CDIR = 'XY' TZFIELD%NGRID = 1 TZFIELD%NTYPE = TYPEREAL diff --git a/src/MNH/sedim_blowsnow.f90 b/src/MNH/sedim_blowsnow.f90 index 2cb0f8264..75985a3dc 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 145939e1f..339f4cfa7 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 43e407a88..702737741 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/spawn_field2.f90 b/src/MNH/spawn_field2.f90 index e774f4c61..a36f75467 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. @@ -912,7 +912,7 @@ IF (PRESENT(TPSONFILE)) THEN ! IF (NSV_CHEMEND>=NSV_CHEMBEG) THEN TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppp' + TZFIELD%CUNITS = 'ppv' TZFIELD%CDIR = 'XY' TZFIELD%NGRID = 1 TZFIELD%NTYPE = TYPEREAL @@ -932,7 +932,7 @@ IF (PRESENT(TPSONFILE)) THEN ! IF (NSV_CHICEND>=NSV_CHICBEG) THEN TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppp' + TZFIELD%CUNITS = 'ppv' TZFIELD%CDIR = 'XY' TZFIELD%NGRID = 1 TZFIELD%NTYPE = TYPEREAL @@ -953,7 +953,7 @@ IF (PRESENT(TPSONFILE)) THEN ! IF (NSV_AEREND>=NSV_AERBEG) THEN TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppp' + TZFIELD%CUNITS = 'ppv' TZFIELD%CDIR = 'XY' TZFIELD%NGRID = 1 TZFIELD%NTYPE = TYPEREAL @@ -973,7 +973,7 @@ IF (PRESENT(TPSONFILE)) THEN ! IF (NSV_DSTEND>=NSV_DSTBEG) THEN TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppp' + TZFIELD%CUNITS = 'ppv' TZFIELD%CDIR = 'XY' TZFIELD%NGRID = 1 TZFIELD%NTYPE = TYPEREAL @@ -993,7 +993,7 @@ IF (PRESENT(TPSONFILE)) THEN ! IF (NSV_SLTEND>=NSV_SLTBEG) THEN TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppp' + TZFIELD%CUNITS = 'ppv' TZFIELD%CDIR = 'XY' TZFIELD%NGRID = 1 TZFIELD%NTYPE = TYPEREAL @@ -1035,7 +1035,7 @@ IF (PRESENT(TPSONFILE)) THEN !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%CUNITS = 'ppv' !PW: TODO: not sure (depends if LINOX or LINOXT) TZFIELD%CDIR = 'XY' TZFIELD%NGRID = 1 TZFIELD%NTYPE = TYPEREAL diff --git a/src/MNH/write_lbn.f90 b/src/MNH/write_lbn.f90 index 4b612a21e..1051579a1 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. @@ -473,7 +473,7 @@ IF (NSV >=1) THEN END IF ! TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppp' + TZFIELD%CUNITS = 'ppv' TZFIELD%CDIR = '' TZFIELD%NGRID = 1 TZFIELD%NTYPE = TYPEREAL @@ -610,7 +610,7 @@ IF (NSV >=1) THEN END IF ! TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppp' + TZFIELD%CUNITS = 'ppv' TZFIELD%CDIR = '' TZFIELD%NGRID = 1 TZFIELD%NTYPE = TYPEREAL @@ -699,7 +699,7 @@ IF (NSV >=1) THEN END IF ! TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppp' + TZFIELD%CUNITS = 'ppv' TZFIELD%CDIR = '' TZFIELD%NGRID = 1 TZFIELD%NTYPE = TYPEREAL diff --git a/src/MNH/write_lfifm1_for_diag_supp.f90 b/src/MNH/write_lfifm1_for_diag_supp.f90 index f24f10f5b..72c472fc4 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. @@ -1579,7 +1579,7 @@ IF (NEQ_BUDGET>0) THEN TZFIELD%CDIR = 'XY' TZFIELD%NGRID = 1 ! - TZFIELD%CUNITS = 'ppp s-1' + TZFIELD%CUNITS = 'ppv s-1' TZFIELD%NTYPE = TYPEREAL TZFIELD%NDIMS = 4 TZFIELD%LTIMEDEP = .TRUE. @@ -1607,7 +1607,7 @@ END IF ! chemical prod/loss terms IF (NEQ_PLT>0) THEN TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppp s-1' + TZFIELD%CUNITS = 'ppv s-1' TZFIELD%CDIR = 'XY' TZFIELD%NGRID = 1 TZFIELD%NTYPE = TYPEREAL diff --git a/src/MNH/write_lfin.f90 b/src/MNH/write_lfin.f90 index 3324cac3b..cd875dd96 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-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. @@ -1225,7 +1225,7 @@ IF (NSV >=1) THEN DO JSV = NSV_CHEMBEG,NSV_CHEMEND TZFIELD%CMNHNAME = TRIM(UPCASE(CNAMES(JSV-NSV_CHEMBEG+1)))//'T' TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'ppp' + TZFIELD%CUNITS = 'ppv' WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)) ! @@ -1236,7 +1236,7 @@ IF (NSV >=1) 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' + TZFIELD%CUNITS = 'ppv' WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)) ! @@ -1283,7 +1283,7 @@ IF (NSV >=1) THEN ENDIF ELSE IF (LCH_CONV_LINOX) THEN TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppp' + TZFIELD%CUNITS = 'ppv' TZFIELD%CDIR = 'XY' TZFIELD%NGRID = 1 TZFIELD%NTYPE = TYPEREAL @@ -1306,7 +1306,7 @@ IF (NSV >=1) THEN 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%CUNITS = 'ppv' TZFIELD%CDIR = 'XY' TZFIELD%NGRID = 1 TZFIELD%NTYPE = TYPEREAL @@ -1325,7 +1325,7 @@ IF (NSV >=1) THEN END IF IF (LDEPOS_AER(IMI)) THEN TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppp' + TZFIELD%CUNITS = 'ppv' TZFIELD%CDIR = 'XY' TZFIELD%NGRID = 1 TZFIELD%NTYPE = TYPEREAL @@ -1352,7 +1352,7 @@ IF (NSV >=1) THEN !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%CUNITS = 'ppv' TZFIELD%CDIR = 'XY' TZFIELD%NGRID = 1 TZFIELD%NTYPE = TYPEREAL @@ -1372,7 +1372,7 @@ IF (NSV >=1) THEN IF (LDEPOS_DST(IMI)) THEN TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppp' + TZFIELD%CUNITS = 'ppv' TZFIELD%CDIR = 'XY' TZFIELD%NGRID = 1 TZFIELD%NTYPE = TYPEREAL @@ -1399,7 +1399,7 @@ IF (NSV >=1) THEN !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%CUNITS = 'ppv' TZFIELD%CDIR = 'XY' TZFIELD%NGRID = 1 TZFIELD%NTYPE = TYPEREAL @@ -1419,7 +1419,7 @@ IF (NSV >=1) THEN IF (LDEPOS_SLT(IMI)) THEN TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppp' + TZFIELD%CUNITS = 'ppv' TZFIELD%CDIR = 'XY' TZFIELD%NGRID = 1 TZFIELD%NTYPE = TYPEREAL diff --git a/src/MNH/write_ts1d.f90 b/src/MNH/write_ts1d.f90 index 440d7303f..4ffad8b5f 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 -- GitLab From 6545fba13ad0d9a11bd381e3da55a98356f5dee6 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Wed, 5 Jan 2022 11:43:28 +0100 Subject: [PATCH 023/157] Philippe 05/01/2022: SURFEX: replace ppp by ppv (ppp is not a valid unit) --- src/SURFEX/build_emisstabn.F90 | 8 ++++---- src/SURFEX/ch_aer_emission.F90 | 6 +++--- src/SURFEX/ch_bvocemn.F90 | 4 ++-- src/SURFEX/ch_conversion_factor.F90 | 4 ++-- src/SURFEX/ch_emission_fluxn.F90 | 4 ++-- src/SURFEX/modd_gr_biog_gardenn.F90 | 6 +++--- src/SURFEX/modd_gr_biog_greenroofn.F90 | 6 +++--- src/SURFEX/modd_gr_biogn.F90 | 6 +++--- src/SURFEX/mode_aer_surf.F90 | 14 +++++++------- src/SURFEX/mode_dslt_surf.F90 | 6 +++--- 10 files changed, 32 insertions(+), 32 deletions(-) diff --git a/src/SURFEX/build_emisstabn.F90 b/src/SURFEX/build_emisstabn.F90 index 48b4dc5b2..5a8ecc2a0 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 3aba32d7f..eb3ad3af3 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 0b3504e36..ac823459d 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 31cdb9b37..89d59dea0 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 f9eae5451..f12a9bae3 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 1849ecf63..55097e16b 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 4f861e10e..6b87cb20d 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 9090cc3f7..a6c1477d4 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 a23ac0cdb..e70fa26ef 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 408f179f1..742a4de2f 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 -- GitLab From df29957f7f2ea9ed3fad95cd01d7625b824f6b37 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Wed, 5 Jan 2022 13:24:16 +0100 Subject: [PATCH 024/157] Philippe 05/01/2022: replace ppbv by ppb for homogeneity (ppb is the same as ppbv) --- src/MNH/read_field.f90 | 2 +- src/MNH/write_lfifm1_for_diag.f90 | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/MNH/read_field.f90 b/src/MNH/read_field.f90 index 0264f75c6..4f4051254 100644 --- a/src/MNH/read_field.f90 +++ b/src/MNH/read_field.f90 @@ -1241,7 +1241,7 @@ END IF ! IF (NSV_LNOXEND>=NSV_LNOXBEG) THEN TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppv' + TZFIELD%CUNITS = 'ppb' TZFIELD%CDIR = 'XY' TZFIELD%NGRID = 1 TZFIELD%NTYPE = TYPEREAL diff --git a/src/MNH/write_lfifm1_for_diag.f90 b/src/MNH/write_lfifm1_for_diag.f90 index e94351e1e..4adbf49c0 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. @@ -1242,7 +1242,7 @@ IF (LCHEMDIAG) THEN TZFIELD%CMNHNAME = TRIM(UPCASE(CNAMES(JSV-NSV_CHGSBEG+1)))//'T' TZFIELD%CSTDNAME = '' TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'ppbv' + TZFIELD%CUNITS = 'ppb' TZFIELD%CDIR = 'XY' WRITE(TZFIELD%CCOMMENT,'(A6,A4,I3.3)')'X_Y_Z_','CHIM',JSV TZFIELD%NGRID = 1 @@ -1511,7 +1511,7 @@ IF (.NOT.(LUSECHEM .OR. LCHEMDIAG) .AND. LCH_CONV_LINOX) THEN TZFIELD%CMNHNAME = 'LINOXT' TZFIELD%CSTDNAME = '' TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CUNITS = 'ppbv' + TZFIELD%CUNITS = 'ppb' TZFIELD%CDIR = 'XY' WRITE(TZFIELD%CCOMMENT,'(A6,A4,I3.3)')'X_Y_Z_','LNOX',JSV TZFIELD%NGRID = 1 @@ -1554,7 +1554,7 @@ IF (LSALT) THEN ! TZFIELD%CSTDNAME = '' TZFIELD%CDIR = 'XY' - TZFIELD%CUNITS = 'ppbv' + TZFIELD%CUNITS = 'ppb' TZFIELD%NGRID = 1 TZFIELD%NTYPE = TYPEREAL TZFIELD%NDIMS = 3 @@ -1639,7 +1639,7 @@ IF (LSALT.AND.LDEPOS_SLT(IMI)) THEN ZSSLTDEP=XSVT(:,:,:,NSV_SLTDEPBEG:NSV_SLTDEPEND) ! TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppbv' + TZFIELD%CUNITS = 'ppb' TZFIELD%CDIR = 'XY' TZFIELD%NGRID = 1 TZFIELD%NTYPE = TYPEREAL @@ -1739,7 +1739,7 @@ IF (LDUST) THEN ALLOCATE(ZN0_DST(SIZE(XSVT,1), SIZE(XSVT,2), SIZE(XSVT,3), NMODE_DST)) ! TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppbv' + TZFIELD%CUNITS = 'ppb' TZFIELD%CDIR = 'XY' TZFIELD%NGRID = 1 TZFIELD%NTYPE = TYPEREAL @@ -1817,7 +1817,7 @@ IF (LDUST.AND.LDEPOS_DST(IMI)) THEN ZSDSTDEP=XSVT(:,:,:,NSV_DSTDEPBEG:NSV_DSTDEPEND) ! TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppbv' + TZFIELD%CUNITS = 'ppb' TZFIELD%CDIR = 'XY' TZFIELD%NGRID = 1 TZFIELD%NTYPE = TYPEREAL @@ -1910,7 +1910,7 @@ END IF ! Aerosol IF ((LCHEMDIAG).AND.(LORILAM).AND.(LUSECHEM)) THEN TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppbv' + TZFIELD%CUNITS = 'ppb' TZFIELD%CDIR = 'XY' TZFIELD%NGRID = 1 TZFIELD%NTYPE = TYPEREAL -- GitLab From b1c613b1ed11a8f13970e817547a36cfa7722f30 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Wed, 5 Jan 2022 14:14:40 +0100 Subject: [PATCH 025/157] Philippe 05/01/2022: 'M' (molar) replaced by equivalent 'mol l-1' (M not known by udunits) --- src/MNH/write_lfifm1_for_diag.f90 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/MNH/write_lfifm1_for_diag.f90 b/src/MNH/write_lfifm1_for_diag.f90 index 4adbf49c0..70c104339 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-2022 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. @@ -1254,7 +1254,7 @@ IF (LCHEMDIAG) THEN END IF IF (LCHAQDIAG) THEN !aqueous concentration in M TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'M' + TZFIELD%CUNITS = 'mol l-1' !Original value: 'M' (molar) but not known by udunits => replaced by equivalent mol l-1 TZFIELD%CDIR = 'XY' TZFIELD%NGRID = 1 TZFIELD%NTYPE = TYPEREAL -- GitLab From 1b59fdf3b9164b6c89025c8fe17a631b15b0e93d Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Wed, 5 Jan 2022 14:27:21 +0100 Subject: [PATCH 026/157] Philippe 05/01/2022: units: do not write a warning if units in file is ppp instead of ppv or ppbv instead of ppb (they are equivalent anyway) --- src/LIB/SURCOUCHE/src/mode_io_read_nc4.f90 | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/src/LIB/SURCOUCHE/src/mode_io_read_nc4.f90 b/src/LIB/SURCOUCHE/src/mode_io_read_nc4.f90 index 248257734..8c68aeaf9 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. @@ -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)') -- GitLab From e82370968f1f083f27b2934246669b435e647a21 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Wed, 5 Jan 2022 15:45:51 +0100 Subject: [PATCH 027/157] Philippe 05/01/2022: 'mol i m-2' => 'mol m-2' (i was for species #i) --- src/MNH/write_lfin.f90 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/MNH/write_lfin.f90 b/src/MNH/write_lfin.f90 index cd875dd96..a6e257254 100644 --- a/src/MNH/write_lfin.f90 +++ b/src/MNH/write_lfin.f90 @@ -1243,12 +1243,12 @@ IF (NSV >=1) THEN 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) + IF (LUSECHAQ.AND.NRR>=3) THEN ! accumulated moles of aqueous species that fall at the surface (mol/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' + TZFIELD%CUNITS = 'mol m-2' TZFIELD%CCOMMENT = 'X_Y_Accumulated moles of aqueous species at the surface' ZWORK2D(:,:) = XACPRAQ(:,:,JSV-NSV_CHACBEG-NSV_CHAC/2+1) CALL IO_Field_write(TPFILE,TZFIELD,ZWORK2D) -- GitLab From 5931f1b8fae0f3a843a0b60907e46a21d5adbd89 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Fri, 14 Jan 2022 15:44:36 +0100 Subject: [PATCH 028/157] Philippe 14/01/2022: 1 LINI_NSV for each model --- src/MNH/ini_nsv.f90 | 2 +- src/MNH/modd_nsv.f90 | 4 ++-- src/MNH/update_nsv.f90 | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/MNH/ini_nsv.f90 b/src/MNH/ini_nsv.f90 index 072ec322b..8b50992fb 100644 --- a/src/MNH/ini_nsv.f90 +++ b/src/MNH/ini_nsv.f90 @@ -148,7 +148,7 @@ INTEGER :: JMODE, JMOM, JSV_NAME ! !------------------------------------------------------------------------------- ! -LINI_NSV = .TRUE. +LINI_NSV(KMI) = .TRUE. ILUOUT = TLUOUT%NLU ! diff --git a/src/MNH/modd_nsv.f90 b/src/MNH/modd_nsv.f90 index 1f152e85a..6ab654ead 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. @@ -46,7 +46,7 @@ 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 TYPE(tfieldmetadata), DIMENSION(:,:), ALLOCATABLE, TARGET :: TSVLIST_A !Metadata of all the scalar variables diff --git a/src/MNH/update_nsv.f90 b/src/MNH/update_nsv.f90 index 6e2e7f502..58b3abc9e 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. @@ -45,7 +45,7 @@ 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 ! -- GitLab From 651d0baa4b27043400db329398e8964c70228ae1 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Fri, 14 Jan 2022 16:17:06 +0100 Subject: [PATCH 029/157] Philippe 14/01/2022: there is only one (or zero) NSV_LNOX scalar variable --- src/MNH/ini_nsv.f90 | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/MNH/ini_nsv.f90 b/src/MNH/ini_nsv.f90 index 8b50992fb..ee054b972 100644 --- a/src/MNH/ini_nsv.f90 +++ b/src/MNH/ini_nsv.f90 @@ -1156,15 +1156,20 @@ DO JSV = NSV_SNWBEG_A(KMI), NSV_SNWEND_A(KMI) 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) = 'LINOX' - CSVNAMES_A(JSV,KMI) = 'SVLNOX'//YNUM3 + WRITE( YNUM3, '( I3.3 )' ) JSV TSVLIST_A(JSV, KMI) = TFIELDMETADATA( & - CMNHNAME = 'SVLNOX' // YNUM3, & + CMNHNAME = 'LINOX', & CSTDNAME = '', & - CLONGNAME = 'SVLNOX' // YNUM3, & + CLONGNAME = 'LINOX', & CUNITS = 'ppv', & CDIR = 'XY', & CCOMMENT = 'X_Y_Z_' // 'SVT' // YNUM3, & -- GitLab From 939c14ee2c4c08d288923aa3afa28a250c7eb473 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Fri, 14 Jan 2022 16:15:30 +0100 Subject: [PATCH 030/157] Philippe 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 --- src/MNH/ini_nsv.f90 | 45 ++++++++++++++++++++++++++++++++++++++++++ src/MNH/modd_nsv.f90 | 14 ++++++++++--- src/MNH/update_nsv.f90 | 22 +++++++++++++++++++-- 3 files changed, 76 insertions(+), 5 deletions(-) diff --git a/src/MNH/ini_nsv.f90 b/src/MNH/ini_nsv.f90 index ee054b972..01d0547f9 100644 --- a/src/MNH/ini_nsv.f90 +++ b/src/MNH/ini_nsv.f90 @@ -71,6 +71,8 @@ END MODULE MODI_INI_NSV ! 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 +! 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 @@ -141,6 +143,7 @@ CHARACTER(LEN=3) :: YNUM3 CHARACTER(LEN=NCOMMENTLGTMAX) :: YCOMMENT CHARACTER(LEN=NUNITLGTMAX) :: YUNITS INTEGER :: ILUOUT +INTEGER :: ICHIDX ! Index for position in CSV_CHEM_LIST_A array INTEGER :: ISV ! total number of scalar variables INTEGER :: IMODEIDX, IMOMENTS INTEGER :: JI, JJ, JSV @@ -151,6 +154,9 @@ INTEGER :: JMODE, JMOM, JSV_NAME LINI_NSV(KMI) = .TRUE. ILUOUT = TLUOUT%NLU + +ICHIDX = 0 +NSV_CHEM_LIST_A(KMI) = 0 ! ! Users scalar variables are first considered ! @@ -386,6 +392,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 @@ -409,6 +416,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 @@ -447,6 +455,7 @@ 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) ELSE NSV_AER_A(KMI) = 0 ! force First index to be superior to last index @@ -459,6 +468,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 @@ -484,6 +494,7 @@ IF (LDUST) THEN 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 @@ -496,6 +507,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 @@ -521,6 +533,7 @@ IF (LSALT) THEN 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 @@ -533,6 +546,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 @@ -566,6 +580,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 @@ -997,6 +1012,9 @@ 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( & @@ -1015,6 +1033,9 @@ 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( & @@ -1033,6 +1054,9 @@ 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 TSVLIST_A(JSV, KMI) = TFIELDMETADATA( & @@ -1051,6 +1075,9 @@ 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( & @@ -1069,6 +1096,9 @@ 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( & @@ -1087,6 +1117,9 @@ 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( & @@ -1105,6 +1138,9 @@ 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( & @@ -1123,6 +1159,9 @@ 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( & @@ -1164,6 +1203,9 @@ IF ( NSV_LNOX_A(KMI) > 1 ) & DO JSV = NSV_LNOXBEG_A(KMI), NSV_LNOXEND_A(KMI) CSVNAMES_A(JSV,KMI) = 'LINOX' + ICHIDX = ICHIDX + 1 + CSV_CHEM_LIST_A(ICHIDX, KMI) = 'LINOX' + WRITE( YNUM3, '( I3.3 )' ) JSV TSVLIST_A(JSV, KMI) = TFIELDMETADATA( & @@ -1179,4 +1221,7 @@ DO JSV = NSV_LNOXBEG_A(KMI), NSV_LNOXEND_A(KMI) 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/modd_nsv.f90 b/src/MNH/modd_nsv.f90 index 6ab654ead..03631f3fe 100644 --- a/src/MNH/modd_nsv.f90 +++ b/src/MNH/modd_nsv.f90 @@ -31,15 +31,18 @@ ! 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 +! 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_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 +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 @@ -49,10 +52,12 @@ REAL,DIMENSION(JPSVMAX) :: XSVMIN ! minimum value for SV variables 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 ! @@ -154,12 +159,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 diff --git a/src/MNH/update_nsv.f90 b/src/MNH/update_nsv.f90 index 58b3abc9e..a8bbe8e7b 100644 --- a/src/MNH/update_nsv.f90 +++ b/src/MNH/update_nsv.f90 @@ -28,11 +28,13 @@ END MODULE MODI_UPDATE_NSV ! 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_FIELD, ONLY: tfieldmetadata +USE MODD_CONF, ONLY: NVERB +USE MODD_FIELD, ONLY: tfieldmetadata USE MODD_NSV +USE MODD_PARAMETERS, ONLY: JPSVNAMELGTMAX, NMNHNAMELGTMAX use mode_msg @@ -41,6 +43,7 @@ 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 ! @@ -68,6 +71,21 @@ END IF CSVNAMES => CSVNAMES_A(:,KMI) +! 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 = YSVCHEM_LIST_TMP, TO = CSV_CHEM_LIST_A ) +END IF + +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 -- GitLab From 4484abb18309a5e51440e3f962a43920c5362689 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Thu, 3 Feb 2022 15:18:00 +0100 Subject: [PATCH 031/157] Philippe 03/02/2022: ini_nsv: correct some units --- src/MNH/ini_nsv.f90 | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/MNH/ini_nsv.f90 b/src/MNH/ini_nsv.f90 index 01d0547f9..b117f3edb 100644 --- a/src/MNH/ini_nsv.f90 +++ b/src/MNH/ini_nsv.f90 @@ -351,7 +351,6 @@ ELSE END IF ! #ifdef MNH_FOREFIRE - ! ForeFire tracers IF (LFOREFIRE .AND. NFFSCALARS .GT. 0) THEN NSV_FF_A(KMI) = NFFSCALARS @@ -903,6 +902,7 @@ DO JSV = NSV_LIMA_BEG_A(KMI), NSV_LIMA_END_A(KMI) TSVLIST_A(JSV, KMI)%CMNHNAME = TRIM( CLIMA_COLD_NAMES(5) ) 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' ) @@ -915,11 +915,11 @@ 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 m-3' + YUNITS = 'C kg-1' WRITE( YCOMMENT, '( A6, A3, I3.3 )' ) 'X_Y_Z_', 'SVT', JSV ELSE - YUNITS = 'm-3' - WRITE( YCOMMENT, '( A6, A3, I3.3, A8 )' ) 'X_Y_Z_', 'SVT', JSV, ' (nb ions/m3)' + 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( & -- GitLab From 5f392b389e697b36c04f49b9b79f9944fe52c896 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Fri, 4 Feb 2022 09:50:33 +0100 Subject: [PATCH 032/157] Philippe 04/02/2022: use TSVLIST everywhere + correct old problems in scalar variable treatment (incoherencies, missing writes, bugs...) + manage backward compatibility --- src/MNH/ini_deep_convection.f90 | 133 +-- src/MNH/ini_lb.f90 | 1350 ++++------------------ src/MNH/ini_prog_var.f90 | 151 +-- src/MNH/paspol.f90 | 2 +- src/MNH/read_cams_data_netcdf_case.f90 | 4 +- src/MNH/read_field.f90 | 596 ++-------- src/MNH/spawn_field2.f90 | 402 +------ src/MNH/write_aircraft_balloon.f90 | 139 +-- src/MNH/write_lbn.f90 | 724 ++---------- src/MNH/write_lfifm1_for_diag.f90 | 1455 ++++++++++++------------ src/MNH/write_lfifm1_for_diag_supp.f90 | 306 ++--- src/MNH/write_lfin.f90 | 801 +++---------- src/MNH/write_profilern.f90 | 85 +- src/MNH/write_stationn.f90 | 144 +-- 14 files changed, 1624 insertions(+), 4668 deletions(-) diff --git a/src/MNH/ini_deep_convection.f90 b/src/MNH/ini_deep_convection.f90 index 695d39a4d..cd57a04d4 100644 --- a/src/MNH/ini_deep_convection.f90 +++ b/src/MNH/ini_deep_convection.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. @@ -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: tfieldmetadata, tfieldlist, TYPEREAL -USE MODD_ICE_C1R3_DESCR, ONLY: C1R3NAMES 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 ! @@ -183,6 +173,8 @@ REAL, DIMENSION(:,:), INTENT(INOUT) :: PCG_TOTAL_NUMBER ! Total number of CG INTEGER :: IID INTEGER :: IRESP INTEGER :: JSV ! number of tracers +LOGICAL :: GOLDFILEFORMAT +LOGICAL :: GREAD TYPE(TFIELDMETADATA) :: TZFIELD ! !------------------------------------------------------------------------------- @@ -196,6 +188,11 @@ TYPE(TFIELDMETADATA) :: TZFIELD !* 2. INITIALIZE CONVECTIVE TENDENCIES ! -------------------------------- ! +!If TPINIFILE file was written with a MesoNH version < 5.5.1, some variables had different names or were not available +GOLDFILEFORMAT = ( 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 ) ) + PUMFCONV(:,:,:) = 0.0 PDMFCONV(:,:,:) = 0.0 PMFCONV(:,:,:) = 0.0 ! warning, restart may be incorrect @@ -258,8 +255,8 @@ ELSE END IF ! ! - SELECT CASE(HGETSVCONV) - CASE('READ') + GETSVCONV: SELECT CASE(HGETSVCONV) + CASE('READ') GETSVCONV TZFIELD = TFIELDMETADATA( & CMNHNAME = 'generic for ini_deep_convection', & !Temporary name to ease identification CUNITS = 's-1', & @@ -269,73 +266,39 @@ ELSE 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.5.1 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_lb.f90 b/src/MNH/ini_lb.f90 index 2d30bdde0..c45c50666 100644 --- a/src/MNH/ini_lb.f90 +++ b/src/MNH/ini_lb.f90 @@ -131,35 +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: tfieldmetadata, 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_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 MODD_PARAM_n -USE MODD_RAIN_C2R2_DESCR, ONLY: C2R2NAMES -USE MODD_SALT ! USE MODE_IO_FIELD_READ, only: IO_Field_read, IO_Field_read_lb USE MODE_MSG -USE MODE_TOOLS, ONLY: UPCASE ! IMPLICIT NONE ! @@ -221,15 +215,16 @@ 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_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 :: 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=NMNHNAMELGTMAX) :: YMNHNAME_BASE +CHARACTER(LEN=NMNHNAMELGTMAX) :: YMNHNAME_BASE +CHARACTER(LEN=NLONGNAMELGTMAX) :: YLONGNAME_BASE TYPE(TFIELDMETADATA) :: TZFIELD !------------------------------------------------------------------------------- ! @@ -246,7 +241,10 @@ ENDIF !* 1. SOME INITIALIZATIONS ! -------------------- ! -ILUOUT = TLUOUT%NLU +!If TPINIFILE file was written with a MesoNH version < 5.5.1, some variables had different names or were not available +GOLDFILEFORMAT = ( 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 ) ) ! ! !------------------------------------------------------------------------------- @@ -283,37 +281,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 ! @@ -321,11 +296,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 @@ -431,9 +405,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 @@ -449,9 +422,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 @@ -472,1121 +444,216 @@ 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 - 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 - 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 - 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 - DO JSV = NSV_LIMA_CCN_FREE, NSV_LIMA_CCN_FREE + NMOD_CCN - 1 - SELECT CASE(HGETSVM(JSV)) - CASE ('READ') - TZFIELD = TSVLIST(JSV) - TZFIELD%CDIR = '' - YMNHNAME_BASE = TRIM( TZFIELD%CMNHNAME ) - - IF ( KSIZELBXSV_ll /= 0 .AND. SIZE(PLBXSVM,1) /= 0 ) THEN - TZFIELD%CMNHNAME = 'LBX_' // TRIM( YMNHNAME_BASE ) - - 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 - CALL OLD_CMNHNAME_GENERATE_INTERN( TZFIELD%CMNHNAME ) - END IF - - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - 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) - 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 - ! - IF (KSIZELBYSV_ll /= 0 .AND. SIZE(PLBYSVM,1) /= 0 ) THEN - TZFIELD%CMNHNAME = 'LBY_' // TRIM( YMNHNAME_BASE ) - 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 - CALL OLD_CMNHNAME_GENERATE_INTERN( TZFIELD%CMNHNAME ) - END IF +! 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 ) - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV - TZFIELD%CLBTYPE = 'LBY' + IF ( KSIZELBXSV_ll /= 0 .AND. SIZE( PLBXSVM, 1 ) /= 0 ) THEN + TZFIELD%CMNHNAME = 'LBX_' // TRIM( YMNHNAME_BASE ) + TZFIELD%CLONGNAME = 'LBX_' // TRIM( YLONGNAME_BASE ) - CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DY,IRIMY,PLBYSVM(:,:,:,JSV),IRESP) - 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 + !Some variables were written with an other name in MesoNH < 5.5.1 + 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 + 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.5.1) 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 +#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.5.1) 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 +#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.5.1) 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 - ! - DO JSV = NSV_LIMA_IFN_FREE,NSV_LIMA_IFN_FREE+NMOD_IFN-1 - SELECT CASE(HGETSVM(JSV)) - CASE ('READ') - TZFIELD = TSVLIST(JSV) - TZFIELD%CDIR = '' - YMNHNAME_BASE = TRIM( TZFIELD%CMNHNAME ) - IF ( KSIZELBXSV_ll /= 0 .AND. SIZE(PLBXSVM,1) /= 0 ) THEN - TZFIELD%CMNHNAME = 'LBX_' // TRIM( YMNHNAME_BASE ) + WRITE( TZFIELD%CCOMMENT, '( A6, A6, I3.3 )' ) '2_Y_Z_', 'LBXSVM', JSV + TZFIELD%CLBTYPE = 'LBX' - 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 - CALL OLD_CMNHNAME_GENERATE_INTERN( TZFIELD%CMNHNAME ) - END IF - - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - 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 ) - CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DX,IRIMX,PLBXSVM(:,:,:,JSV),IRESP) - IF (IRESP/=0) THEN - IF (PRESENT(PLBXSVMM)) THEN - PLBXSVM(:,:,:,JSV)=PLBXSVMM(:,:,:,JSV) - WRITE(ILUOUT,*) 'IFN PLBXSVM will be initialized to 0' + 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.5.1 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 + 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.5.1 + PLBXSVM(:,:,:,JSV) = 0. + CALL PRINT_MSG( NVERB_WARNING, 'IO', 'INI_LB', 'PLBXSVM is initialized to 0 for ' // TRIM( YMNHNAME_BASE ) ) ELSE -!callabortstop - CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_LB','problem to initialize IFN') - 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 .AND. SIZE(PLBYSVM,1) /= 0 ) THEN - TZFIELD%CMNHNAME = 'LBY_' // TRIM( YMNHNAME_BASE ) - - 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 - CALL OLD_CMNHNAME_GENERATE_INTERN( TZFIELD%CMNHNAME ) - END IF + END IF - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV - TZFIELD%CLBTYPE = 'LBY' + IF ( KSIZELBYSV_ll /= 0 .AND. SIZE( PLBYSVM, 1 ) /= 0 ) THEN + TZFIELD%CMNHNAME = 'LBY_' // TRIM( YMNHNAME_BASE ) + TZFIELD%CLONGNAME = 'LBY_' // TRIM( YLONGNAME_BASE ) - CALL IO_Field_read_lb(TPINIFILE,TZFIELD,IL3DY,IRIMY,PLBYSVM(:,:,:,JSV),IRESP) - 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 - CASE('INIT') - IF ( SIZE(PLBXSVM,1) /= 0 ) PLBXSVM(:,:,:,JSV) = 0. - IF ( SIZE(PLBYSVM,1) /= 0 ) PLBYSVM(:,:,:,JSV) = 0. - END SELECT - END DO -END IF -! 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 = 'ppv' - 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 = 'ppv' - 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 = 'ppv' - 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 = 'ppv' - 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 = 'ppv' - 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 = 'ppv' - 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 = 'ppv' - 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 - 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 + !Some variables were written with an other name in MesoNH < 5.5.1 + 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 + 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.5.1) 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 - 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 + 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.5.1) 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 - 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 + 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.5.1) 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_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 - 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.5.1 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.5.1 + 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 @@ -1645,9 +712,10 @@ ENDIF ! CONTAINS - SUBROUTINE OLD_CMNHNAME_GENERATE_INTERN( YMNHNAME ) + SUBROUTINE OLD_CMNHNAME_GENERATE_INTERN( YMNHNAME, YLONGNAME ) CHARACTER(LEN=*), INTENT(INOUT) :: YMNHNAME + CHARACTER(LEN=*), INTENT(INOUT) :: YLONGNAME INTEGER :: IPOS INTEGER :: JI @@ -1666,6 +734,8 @@ CONTAINS YMNHNAME(JI:JI) = ' ' END DO + YLONGNAME = TRIM( YMNHNAME ) + END SUBROUTINE OLD_CMNHNAME_GENERATE_INTERN END SUBROUTINE INI_LB diff --git a/src/MNH/ini_prog_var.f90 b/src/MNH/ini_prog_var.f90 index 216426209..2e9702b85 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,42 +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: TFIELDMETADATA, 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 +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 +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 @@ -213,7 +208,6 @@ 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 @@ -266,25 +260,18 @@ 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 + + ! Read scalars in chem file 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 + DO JSV = NSV_CHEMBEG, NSV_CHEMEND + TZFIELD = TSVLIST(JSV) + TZFIELD%CMNHNAME = TRIM( TZFIELD%CMNHNAME ) // 'T' + TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T' 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 @@ -298,18 +285,10 @@ IF(PRESENT(HCHEMFILE)) THEN 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) + TZFIELD%CMNHNAME = TRIM( TZFIELD%CMNHNAME ) // 'T' + TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T' 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 @@ -318,18 +297,10 @@ 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) + TZFIELD%CMNHNAME = TRIM( TZFIELD%CMNHNAME ) // 'T' + TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T' 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 @@ -340,18 +311,10 @@ IF(PRESENT(HCHEMFILE)) THEN 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) + TZFIELD%CMNHNAME = TRIM( TZFIELD%CMNHNAME ) // 'T' + TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T' 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)) @@ -359,18 +322,10 @@ 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) + TZFIELD%CMNHNAME = TRIM( TZFIELD%CMNHNAME ) // 'T' + TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T' 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 @@ -381,18 +336,10 @@ 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) + TZFIELD%CMNHNAME = TRIM( TZFIELD%CMNHNAME ) // 'T' + TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T' 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)) @@ -400,18 +347,10 @@ 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) + TZFIELD%CMNHNAME = TRIM( TZFIELD%CMNHNAME ) // 'T' + TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T' 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/paspol.f90 b/src/MNH/paspol.f90 index 7287cb0b4..af5da0665 100644 --- a/src/MNH/paspol.f90 +++ b/src/MNH/paspol.f90 @@ -579,7 +579,7 @@ END DO !* 3.4 Ecriture conditionnelle. ! IF ( tpfile%lopened ) THEN - TZFIELD = TFIELDMetaDATA( & + TZFIELD = TFIELDMETADATA( & CMNHNAME = 'generic for paspol', & !Temporary name to ease identification CSTDNAME = '', & CUNITS = 'm-3', & diff --git a/src/MNH/read_cams_data_netcdf_case.f90 b/src/MNH/read_cams_data_netcdf_case.f90 index 89ab3518c..a4023d091 100644 --- a/src/MNH/read_cams_data_netcdf_case.f90 +++ b/src/MNH/read_cams_data_netcdf_case.f90 @@ -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 diff --git a/src/MNH/read_field.f90 b/src/MNH/read_field.f90 index 4f4051254..34a20049a 100644 --- a/src/MNH/read_field.f90 +++ b/src/MNH/read_field.f90 @@ -247,56 +247,48 @@ 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 +! 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 +! 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: tfieldmetadata, 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_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_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 @@ -418,7 +410,9 @@ 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 +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(TFIELDMETADATA) :: TZFIELD @@ -431,6 +425,10 @@ TYPE(TFIELDMETADATA) :: TZFIELD GLSOURCE=.FALSE. ZWORK = 0.0 ! +!If TPINIFILE file was written with a MesoNH version < 5.5.1, some variables had different names or were not available +GOLDFILEFORMAT = ( 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 ) ) !------------------------------------------------------------------------------- ! !* 2. READ PROGNOSTIC VARIABLES @@ -811,477 +809,83 @@ ENDIF ! 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') +DO JSV = 1, NSV ! initialize according to the get indicators + SELECT CASE( HGETSVT(JSV) ) + CASE ('READ') + TZFIELD = TSVLIST(JSV) + + IF ( GOLDFILEFORMAT .AND. & + ( ( 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.5.1 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(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') + ELSE + TZFIELD%CMNHNAME = TRIM( TZFIELD%CMNHNAME ) // 'T' + TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T' + 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. - IF (LSUPSAT .AND. (HGETRVT == 'READ') ) 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*ALOG(ZWORK(:,:,:))) + ZWORK(:,:,:) = EXP(XALPW-XBETAW/ZWORK(:,:,:)-XGAMW*LOG(ZWORK(:,:,:))) !rvsat ZWORK(:,:,:) = (XMV / XMD)*ZWORK(:,:,:)/(PPABST(:,:,:)-ZWORK(:,:,:)) - ZWORK(:,:,:) = PRT(:,:,:,1)/ZWORK(:,:,:) + ZWORK(:,:,:) = PRT(:,:,:,IDX_RVT)/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 = TSVLIST(JSV) - TZFIELD%CMNHNAME = TRIM( TZFIELD%CMNHNAME ) // 'T' - TZFIELD%CLONGNAME = TRIM( TZFIELD%CMNHNAME ) - CALL IO_Field_read(TPINIFILE,TZFIELD,PSVT(:,:,:,JSV)) - CASE ('INIT') - PSVT(:,:,:,JSV) = 0. + END IF + 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 = 'ppv' - 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 = 'ppv' - 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 = 'ppv' - 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 = 'ppv' - 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 = 'ppv' - 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 = 'ppv' - 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 = 'ppv' - 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. + +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. - 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 -! -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 -! -IF (NSV_LNOXEND>=NSV_LNOXBEG) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppb' - 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 -! -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') - PSVT(:,:,:,JSV) = 0. - END SELECT - END DO -END IF -IF (NSV_SNW>=1) THEN + 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' @@ -1289,20 +893,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 diff --git a/src/MNH/spawn_field2.f90 b/src/MNH/spawn_field2.f90 index a36f75467..993f0ebd3 100644 --- a/src/MNH/spawn_field2.f90 +++ b/src/MNH/spawn_field2.f90 @@ -152,39 +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: 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_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 @@ -194,7 +186,6 @@ USE MODE_MSG USE MODE_MODELN_HANDLER USE MODE_MPPDB USE MODE_THERMO -USE MODE_TOOLS, ONLY: UPCASE ! IMPLICIT NONE ! @@ -265,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 @@ -273,6 +265,7 @@ REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZPABST1,ZHUT1 REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZRT1 LOGICAL :: GUSERV ! +CHARACTER(LEN=3) :: YNUM3 CHARACTER(LEN=15) :: YVAL TYPE(TFIELDMETADATA) :: TZFIELD ! @@ -284,6 +277,13 @@ TYPE(TFIELDMETADATA) :: 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.5.1, some variables had different names or were not available + GOLDFILEFORMAT = ( TPSONFILE%NMNHVERSION(1) < 5 & + .OR. ( TPSONFILE%NMNHVERSION(1) == 5 .AND. TPSONFILE%NMNHVERSION(2) < 5 ) & + .OR. ( TPSONFILE%NMNHVERSION(1) == 5 .AND. TPSONFILE%NMNHVERSION(2) == 5 .AND. TPSONFILE%NMNHVERSION(3) < 1 ) ) +END IF ! !* 1.0 recovers logical unit number of output listing ! @@ -834,327 +834,51 @@ 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 = TSVLIST(JSV) - TZFIELD%CMNHNAME = TRIM( TZFIELD%CMNHNAME ) // '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 = 'ppv' - 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 = 'ppv' - 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 = 'ppv' - 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 = 'ppv' - 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 = 'ppv' - 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 = 'ppv' !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 .AND. & + ( ( 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 + ( JSV >= NSV_CSBEG .AND. JSV <= NSV_CSEND ) ) ) THEN + !Some variables were written with an other name in MesoNH < 5.5.1 + WRITE(TZFIELD%CMNHNAME,'(A3,I3.3)')'SVT',JSV + TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) 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_read(TPSONFILE,TZFIELD,ZWORK3D,IRESP) - IF(IRESP==0) PSVT(KIB2:KIE2,KJB2:KJE2,:,JSV)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:) - END DO + TZFIELD%CCOMMENT = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME) + ELSE + TZFIELD%CMNHNAME = TRIM( TZFIELD%CMNHNAME ) // 'T' + TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T' 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 - 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/write_aircraft_balloon.f90 b/src/MNH/write_aircraft_balloon.f90 index a8dc25cb4..f957e9f77 100644 --- a/src/MNH/write_aircraft_balloon.f90 +++ b/src/MNH/write_aircraft_balloon.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. @@ -71,37 +71,24 @@ END MODULE MODI_WRITE_AIRCRAFT_BALLOON ! 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 ! -------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ ! -USE MODD_CST +USE MODD_CST, ONLY: XRV USE MODD_IO, ONLY: TFILEDATA -USE MODD_LUNIT -USE MODD_PARAMETERS +USE MODD_PARAMETERS, ONLY: XUNDEF ! 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 MODE_MODELN_HANDLER -USE MODE_DUST_PSD +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_DIAG_IN_RUN, ONLY: LDIAG_IN_RUN +! USE MODE_AERO_PSD +USE MODE_DUST_PSD +USE MODE_MODELN_HANDLER, ONLY: GET_CURRENT_MODEL_INDEX use mode_msg use mode_write_diachro, only: Write_diachro ! @@ -404,72 +391,21 @@ IF (LDIAG_IN_RUN) THEN 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 + ! Scalar variables + DO JSV = 1, NSV + JPROC = JPROC + 1 YTITLE(JPROC) = TRIM( TSVLIST(JSV)%CMNHNAME ) - YUNIT(JPROC) = TRIM( TSVLIST(JSV)%CUNITS ) - YCOMMENT(JPROC) = ' ' - - 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 + YCOMMENT(JPROC) = '' + IF ( TRIM( TSVLIST(JSV)%CUNITS ) == 'ppv' ) THEN + YUNIT(JPROC) = 'ppb' + ZWORK6(1,1,1,:,1,JPROC) = TPFLYER%SV(:,JSV) * 1.e9 !*1e9 for conversion ppv->ppb + ELSE + YUNIT(JPROC) = TRIM( TSVLIST(JSV)%CUNITS ) + ZWORK6(1,1,1,:,1,JPROC) = TPFLYER%SV(:,JSV) + END IF END DO + IF ((LORILAM).AND. .NOT.(ANY(TPFLYER%P(:) == 0.))) THEN ALLOCATE (ZSV(1,1,size(tpflyer%tpdates),NSV_AER)) @@ -485,7 +421,7 @@ IF (SIZE(TPFLYER%SV,2)>=1) THEN ZRHO(1,1,:) = ZRHO(1,1,:) + TPFLYER%R(:,JRR) ENDDO ZRHO(1,1,:) = TPFLYER%TH(:) * ( 1. + XRV/XRD*TPFLYER%R(:,1) ) & - / ( 1. + ZRHO(1,1,:) ) + / ( 1. + ZRHO(1,1,:) ) ELSE ZRHO(1,1,:) = TPFLYER%TH(:) ENDIF @@ -623,19 +559,12 @@ IF (SIZE(TPFLYER%SV,2)>=1) THEN 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) + ZWORK6(1,1,1,:,1,JPROC) = 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))) @@ -649,7 +578,7 @@ IF (SIZE(TPFLYER%SV,2)>=1) THEN ZRHO(1,1,:) = ZRHO(1,1,:) + TPFLYER%R(:,JRR) ENDDO ZRHO(1,1,:) = TPFLYER%TH(:) * ( 1. + XRV/XRD*TPFLYER%R(:,1) ) & - / ( 1. + ZRHO(1,1,:) ) + / ( 1. + ZRHO(1,1,:) ) ELSE ZRHO(1,1,:) = TPFLYER%TH(:) ENDIF @@ -676,17 +605,9 @@ IF (SIZE(TPFLYER%SV,2)>=1) THEN WRITE(YCOMMENT(JPROC),'(A13,I1)')'N0 DUST MODE ',JSV ZWORK6 (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) = TPFLYER%SV(:,JSV) * 1.E9 - END DO ENDIF ! IF (SIZE(TPFLYER%TSRAD)>0) THEN diff --git a/src/MNH/write_lbn.f90 b/src/MNH/write_lbn.f90 index 1051579a1..23cec11a8 100644 --- a/src/MNH/write_lbn.f90 +++ b/src/MNH/write_lbn.f90 @@ -78,50 +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, LDSTINIT, LDSTPRES, 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, ONLY: NMOD_CCN, NMOD_IFN -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, LSLTINIT, LSLTPRES + 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_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, NMNHNAMELGTMAX -USE MODD_IO, ONLY: TFILEDATA -use modd_field, only: tfieldmetadata, NMNHDIM_UNKNOWN, TYPELOG, TYPEREAL -! -! + IMPLICIT NONE ! !* 0.1 Declarations of arguments @@ -130,45 +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 -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=NMNHNAMELGTMAX) :: YMNHNAME_BASE +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 ! -------------------------------- @@ -229,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 @@ -278,589 +258,99 @@ IF (NSV >=1) THEN NTYPE = TYPELOG, & NDIMS = 0, & 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 + 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 - DO JSV = NSV_LIMA_CCN_FREE,NSV_LIMA_CCN_FREE+NMOD_CCN-1 - TZFIELD = TSVLIST(JSV) - TZFIELD%CDIR = '' - TZFIELD%NDIMLIST(:) = NMNHDIM_UNKNOWN - YMNHNAME_BASE = TRIM( TZFIELD%CMNHNAME ) - ! - IF(NSIZELBXSV_ll /= 0) THEN - TZFIELD%CMNHNAME = 'LBX_' // TRIM( YMNHNAME_BASE ) - TZFIELD%CLONGNAME = 'LBX_' // TRIM( YMNHNAME_BASE ) - WRITE( TZFIELD%CCOMMENT, '( A6, A6, I3.3 ) ' ) '2_Y_Z_', 'LBXSVM', JSV - TZFIELD%CLBTYPE = 'LBX' - CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBXSV_ll,XLBXSVM(:,:,:,JSV)) - END IF - ! - IF(NSIZELBYSV_ll /= 0) THEN - TZFIELD%CMNHNAME = 'LBY_' // TRIM( YMNHNAME_BASE ) - TZFIELD%CLONGNAME = 'LBY_' // TRIM( YMNHNAME_BASE ) - WRITE( TZFIELD%CCOMMENT, '( A6, A6, I3.3 ) ' ) 'X_2_Z_', 'LBYSVM', JSV - TZFIELD%CLBTYPE = 'LBY' - 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 - TZFIELD = TSVLIST(JSV) - TZFIELD%CDIR = '' - TZFIELD%NDIMLIST(:) = NMNHDIM_UNKNOWN - YMNHNAME_BASE = TRIM( TZFIELD%CMNHNAME ) - ! - IF(NSIZELBXSV_ll /= 0) THEN - TZFIELD%CMNHNAME = 'LBX_' // TRIM( YMNHNAME_BASE ) - TZFIELD%CLONGNAME = 'LBX_' // TRIM( YMNHNAME_BASE ) - WRITE( TZFIELD%CCOMMENT, '( A6, A6, I3.3 ) ' ) '2_Y_Z_', 'LBXSVM', JSV - TZFIELD%CLBTYPE = 'LBX' - CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBXSV_ll,XLBXSVM(:,:,:,JSV)) - END IF - ! - IF(NSIZELBYSV_ll /= 0) THEN - TZFIELD%CMNHNAME = 'LBY_' // TRIM( YMNHNAME_BASE ) - TZFIELD%CLONGNAME = 'LBY_' // TRIM( YMNHNAME_BASE ) - WRITE( TZFIELD%CCOMMENT, '( A6, A6, I3.3 ) ' ) 'X_2_Z_', 'LBYSVM', JSV - TZFIELD%CLBTYPE = 'LBY' - 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 .OR. LDSTPRES ) 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 .OR. LSLTPRES ) 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 = 'ppv' - 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 ) +!PW: TODO: comment a adapter (a la lecture aussi) 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).OR.(LDSTPRES)) 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 = 'ppv' - 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).OR.(LSLTPRES)) 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 = 'ppv' - 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_lfifm1_for_diag.f90 b/src/MNH/write_lfifm1_for_diag.f90 index 70c104339..a14c099e6 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: tfieldmetadata, 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, 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, XLAT, XLEN1, XLEN2, XLON, XZS, XXHAT, XYHAT, 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 -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 +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_GATHER_ll, only: GATHERALL_FIELD_ll +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 ! @@ -303,8 +287,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 @@ -1011,7 +995,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 @@ -1024,7 +1008,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 @@ -1068,76 +1052,52 @@ END IF ! User scalar variables ! individually in the file IF (LVAR_MRSV) THEN - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'generic for scalar variables', & !Temporary name to ease identification - CSTDNAME = '', & - CUNITS = 'g kg-1', & - CDIR = 'XY', & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - 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) + TZFIELD%CMNHNAME = TRIM( TZFIELD%CMNHNAME ) // 'T' + TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T' + 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%CMNHNAME = TRIM( TZFIELD%CMNHNAME ) // 'T' + TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T' 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 @@ -1192,7 +1152,7 @@ IF (LLIMA_DIAG) THEN TZFIELD%CMNHNAME = TRIM(CLIMA_COLD_CONC(5))//'T' END IF ! -! Supersaturation +! Supersaturation IF (JSV .EQ. NSV_LIMA_SPRO) THEN TZFIELD%CMNHNAME = TRIM(CLIMA_WARM_CONC(5))//'T' END IF @@ -1235,36 +1195,127 @@ IF (LLIMA_DIAG) THEN END IF ! END IF +IF (LELECDIAG .AND. CELEC .NE. "NONE") THEN + DO JSV = NSV_ELECBEG,NSV_ELECEND + TZFIELD = TSVLIST(JSV) + TZFIELD%CMNHNAME = TRIM( TZFIELD%CMNHNAME ) // 'T' + TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T' + 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) + TZFIELD%CMNHNAME = TRIM( TZFIELD%CMNHNAME ) // 'T' + TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T' + 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 + 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 = 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*1e-3) + + ! 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*1e-3) +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%CMNHNAME = TRIM( TZFIELD%CMNHNAME ) // 'T' + TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T' + 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 + DO JSV = NSV_CSBEG, NSV_CSEND + TZFIELD = TSVLIST(JSV) + TZFIELD%CMNHNAME = TRIM( TZFIELD%CMNHNAME ) // 'T' + TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T' + 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 = 'ppb' - TZFIELD%CDIR = 'XY' + TZFIELD = TSVLIST(JSV) + TZFIELD%CMNHNAME = TRIM( TZFIELD%CMNHNAME ) // 'T' + TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T' + 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 = 'mol l-1' !Original value: 'M' (molar) but not known by udunits => replaced by equivalent mol l-1 - 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%CMNHNAME = TRIM( TZFIELD%CMNHNAME ) // 'T' + TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T' + 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)) @@ -1274,8 +1325,10 @@ 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%CMNHNAME = TRIM( TZFIELD%CMNHNAME ) // 'T' + TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T' + 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)) @@ -1293,325 +1346,226 @@ 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 +! Aerosol +IF ((LCHEMDIAG).AND.(LORILAM).AND.(LUSECHEM)) THEN + DO JSV = NSV_AERBEG, NSV_AEREND + TZFIELD = TSVLIST(JSV) + TZFIELD%CMNHNAME = TRIM( TZFIELD%CMNHNAME ) // 'T' + TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T' + 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 ! - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'g m-3' - 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 = 1,NSV_PP - ZTMP(:,:,:)=ABS( XSVT(:,:,:,JSV+NSV_PPBEG-1)*ZRHOT(:,:,:) ) - WRITE(TZFIELD%CMNHNAME,'(A3,I3.3)')'PPT',JSV + 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) - 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%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%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 = 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(:,:,:)) - ! - 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 - ! - 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(:,:)) - ! - 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 -! 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. - ! - DO JSV = NSV_LGBEG,NSV_LGEND - TZFIELD%CMNHNAME = TRIM(CLGNAMES(JSV-NSV_LGBEG+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) - 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 -!PW:BUG?: same name for all variables - TZFIELD%CMNHNAME = 'LINOXT' - TZFIELD%CSTDNAME = '' + 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 = 'ppb' - 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 = '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) - 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 = '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 = 'ppb' - 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%CMNHNAME = TRIM( TZFIELD%CMNHNAME ) // 'T' + TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T' + 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)) & @@ -1624,7 +1578,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 @@ -1634,33 +1588,35 @@ 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%CMNHNAME = TRIM( TZFIELD%CMNHNAME ) // 'T' + TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T' + 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 = 'ppb' - 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} @@ -1668,45 +1624,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(:,:,:)) @@ -1718,78 +1674,84 @@ 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 = 'ppb' - 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%CMNHNAME = TRIM( TZFIELD%CMNHNAME ) // 'T' + TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T' + 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)) & @@ -1802,7 +1764,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 @@ -1812,33 +1774,36 @@ 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%CMNHNAME = TRIM( TZFIELD%CMNHNAME ) // 'T' + TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T' + 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 = 'ppb' - 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} @@ -1846,45 +1811,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(:,:,:)) @@ -1896,167 +1861,147 @@ 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 = 'ppb' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. +! +! Blowing snow variables +! +IF(LBLOWSNOW) THEN + 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 - TZFIELD%CMNHNAME = 'RGA' - TZFIELD%CLONGNAME = 'RGA' - TZFIELD%CUNITS = 'um' - WRITE(TZFIELD%CCOMMENT,'(A21,I1)')'RG (nb) AEROSOL MODE ',JJ - CALL IO_Field_write(TPFILE,TZFIELD,XRG3D(:,:,:,JJ)) - ! - TZFIELD%CMNHNAME = 'RGAM' - 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%CMNHNAME = TRIM( TZFIELD%CMNHNAME ) // 'T' + TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T' + 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 @@ -3422,7 +3367,7 @@ IF (LTOTAL_PR .AND. SIZE (XACPRR)>0 ) THEN !large-scale model IF (LMEAN_PR .AND. LUSERR) THEN TZFIELD = TFIELDMETADATA( & - CSTDNAME = 'generic LS_ACTOPR', & !Temporary name to ease identification + CMNHNAME = 'generic LS_ACTOPR', & !Temporary name to ease identification CUNITS = 'mm', & CDIR = 'XY', & CCOMMENT = 'X_Y_Large Scale ACccumulated TOtal Precipitation Rate', & @@ -4221,12 +4166,6 @@ ELSEIF (CBLTOP == 'RICHA') THEN ! 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 72c472fc4..fe258339c 100644 --- a/src/MNH/write_lfifm1_for_diag_supp.f90 +++ b/src/MNH/write_lfifm1_for_diag_supp.f90 @@ -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: NMNHDIM_UNUSED, tfieldmetadata, 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, 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 @@ -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 @@ -288,121 +279,35 @@ IF (NCONV_KF >= 0) THEN 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) @@ -762,22 +667,20 @@ 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 @@ -1575,14 +1478,15 @@ END IF ! ------------------------------- ! IF (NEQ_BUDGET>0) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 1 - ! - TZFIELD%CUNITS = 'ppv 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' @@ -1591,9 +1495,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' @@ -1606,13 +1516,15 @@ END IF ! ! chemical prod/loss terms IF (NEQ_PLT>0) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppv 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_lfin.f90 b/src/MNH/write_lfin.f90 index a6e257254..1a6694ce0 100644 --- a/src/MNH/write_lfin.f90 +++ b/src/MNH/write_lfin.f90 @@ -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 @@ -180,115 +178,105 @@ END MODULE MODI_WRITE_LFIFM_n ! 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 +! P. Wautelet 04/02/2022: use TSVLIST to manage metadata of scalar variables !------------------------------------------------------------------------------- ! !* 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: NMNHDIM_UNUSED, tfieldmetadata, 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_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 +#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_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: LSCAV, LAERO_MASS -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 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 MODI_DUSTLFI_n +USE MODI_SALT_FILTER +USE MODI_SALTLFI_n +USE MODI_WRITE_BALLOON_n +USE MODI_WRITE_LB_n + IMPLICIT NONE ! !* 0.1 Declarations of arguments @@ -303,9 +291,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 ! @@ -320,15 +306,11 @@ 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 ! +INTEGER :: IDX INTEGER :: IID TYPE(TFIELDMETADATA) :: TZFIELD !------------------------------------------------------------------------------- @@ -338,6 +320,8 @@ TYPE(TFIELDMETADATA) :: 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))) @@ -902,75 +886,45 @@ 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 +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 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 + + ! dust scalar variables + IF ( LDUST ) THEN + IF ((CPROGRAM == 'REAL ').AND.(NSV_DST > 1).AND.(IMI==1).AND.(LDSTINIT)) & + 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 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 + + ! sea salt scalar variables + IF ( LSALT ) THEN + IF ((CPROGRAM == 'REAL ').AND.(NSV_SLT > 1).AND.(IMI==1).AND.(LSLTINIT)) & + 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 -! -! microphysical LIMA variables -! - DO JSV = NSV_LIMA_BEG, NSV_LIMA_END + !Store all scalar variables + DO JSV = 1, NSV TZFIELD = TSVLIST(JSV) - TZFIELD%CMNHNAME = TRIM( TZFIELD%CMNHNAME ) // 'T' - TZFIELD%CLONGNAME = TRIM( TZFIELD%CMNHNAME ) + TZFIELD%CMNHNAME = TRIM( TZFIELD%CMNHNAME ) // 'T' + TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T' CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)) -! - JSA=JSA+1 END DO -! + IF (LSCAV .AND. LAERO_MASS) THEN IF (ASSOCIATED(XINPAP)) THEN IF (SIZE(XINPAP) /= 0 ) THEN @@ -995,33 +949,8 @@ IF (NSV >=1) THEN 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) @@ -1067,57 +996,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 @@ -1129,131 +1007,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 -! 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 = 'ppv' - 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 = 'ppv' - 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/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) + 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) @@ -1262,7 +1027,7 @@ IF (NSV >=1) THEN ! 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 @@ -1278,173 +1043,16 @@ IF (NSV >=1) THEN 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 = 'ppv' - 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 = 'ppv' - 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 - END IF - IF (LDEPOS_AER(IMI)) THEN - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = 'ppv' - 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)) & - 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 = 'ppv' - 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 = 'ppv' - 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 - IF ((CPROGRAM == 'REAL ').AND.(NSV_SLT > 1).AND.(IMI==1).AND.(LSLTINIT)) & - 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 = 'ppv' - 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 = 'ppv' - 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 = TFIELDMETADATA( & - CMNHNAME = 'NSV.DIM', & + CMNHNAME = 'NSVCHEM', & CSTDNAME = '', & - CLONGNAME = 'NSV.DIM', & + CLONGNAME = 'NSVCHEM', & CUNITS = '', & CDIR = '--', & CCOMMENT = 'Number of chemical variables', & @@ -1452,52 +1060,24 @@ IF (NSV >=1) THEN NTYPE = TYPEINT, & NDIMS = 0, & LTIMEDEP = .FALSE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ICH_NBR) - ! - IF (ICH_NBR/=0) THEN - TZFIELD = TFIELDMETADATA( & - CMNHNAME = 'NSV.TITRE', & - CSTDNAME = '', & - CLONGNAME = 'NSV.TITRE', & - CUNITS = '', & - CDIR = '--', & - CCOMMENT = '', & - NGRID = 0, & - NTYPE = TYPEINT, & - NDIMS = 1, & - 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 + 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) @@ -1676,95 +1256,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 ! @@ -2366,11 +1871,11 @@ IF ( CPROGRAM=='REAL ' ) THEN 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 ! diff --git a/src/MNH/write_profilern.f90 b/src/MNH/write_profilern.f90 index 0b8eb5a79..cb9dc945a 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,6 +18,7 @@ ! 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 !----------------------------------------------------------------- ! ########################### MODULE MODE_WRITE_PROFILER_n @@ -84,24 +84,18 @@ SUBROUTINE PROFILER_DIACHRO_n( TPDIAFILE, KI ) 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_DUST, ONLY: LDUST, NMODE_DST +USE MODD_CH_AEROSOL, ONLY: LORILAM, JPMODE USE MODD_CST, ONLY: XRV -USE MODD_ELEC_DESCR, ONLY: CELECNAMES use modd_field, only: NMNHDIM_LEVEL, NMNHDIM_LEVEL_W, NMNHDIM_PROFILER_TIME, NMNHDIM_PROFILER_PROC, NMNHDIM_UNUSED, & tfieldmetadata_base, TYPEREAL -USE MODD_ICE_C1R3_DESCR, ONLY: C1R3NAMES USE MODD_IO, ONLY: TFILEDATA -USE MODD_LG, ONLY: CLGNAMES -USE MODD_NSV +USE MODD_NSV, ONLY: tsvlist, nsv, nsv_aer, nsv_aerbeg, nsv_aerend, nsv_dst, nsv_dstbeg, nsv_dstend USE MODD_PARAMETERS, ONLY: XUNDEF USE MODD_PARAM_n, ONLY: CRAD -USE MODD_PROFILER_n +USE MODD_PROFILER_n, ONLY: tprofiler 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 MODE_AERO_PSD USE MODE_DUST_PSD @@ -112,7 +106,6 @@ INTEGER, INTENT(IN) :: KI ! !* 0.2 declaration of local variables for diachro ! -character(len=NCOMMENTLGTMAX) :: ycomment character(len=NMNHNAMELGTMAX) :: yname character(len=NUNITLGTMAX) :: yunits CHARACTER(LEN=:), allocatable :: YGROUP ! group title @@ -125,6 +118,8 @@ INTEGER :: JSV ! loop counter integer :: ji integer :: irr !Number of moist variables REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRHO +REAL, DIMENSION(:,:,:), TARGET, ALLOCATABLE :: ZWORK +REAL, DIMENSION(:,:,:), POINTER :: ZDATA REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZSV, ZN0, ZSIG, ZRG type(tbudiachrometadata) :: tzbudiachro type(tfieldmetadata_base), dimension(:), allocatable :: tzfields @@ -133,7 +128,9 @@ type(tfieldmetadata_base), dimension(:), allocatable :: tzfields ! IF (TPROFILER%X(KI)==XUNDEF) RETURN IF (TPROFILER%Y(KI)==XUNDEF) RETURN -! + +ZDATA => Null() + IKU = SIZE(TPROFILER%W,2) !Number of vertical levels ! !IPROC is too large (not a big problem) due to the separation between vertical profiles and point values @@ -193,40 +190,22 @@ 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 - yname = Trim( tsvlist(jsv)%cmnhname ) - yunits = Trim( tsvlist(jsv)%cunits ) - ycomment = '' - call Add_profile( yname, ycomment, 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) ) - 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 ) + ! Scalar variables + Allocate( zwork, mold = tprofiler%sv(:,:,:,1) ) + do jsv = 1, nsv + if ( Trim( tsvlist(jsv)%cunits ) == 'ppv' ) then + yunits = 'ppb' + zwork = tprofiler%sv(:,:,:,jsv) * 1.e9 !*1e9 for conversion ppv->ppb + zdata => zwork + else + yunits = Trim( tsvlist(jsv)%cunits ) + zdata => tprofiler%sv(:,:,:,jsv) + end if + call Add_profile( tsvlist(jsv)%cmnhname, '', yunits, zdata ) + zdata => Null() end do + Deallocate( zwork ) + 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))) @@ -284,10 +263,6 @@ 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))) @@ -345,10 +320,6 @@ 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 @@ -592,7 +563,7 @@ jproc = jproc + 1 if ( jproc > iproc ) call Print_msg( NVERB_FATAL, 'IO', 'Add_profile', 'more profiles than expected' ) -ctitle(jproc) = Trim( htitle) +ctitle(jproc) = Trim( htitle ) ccomment(jproc) = Trim( hcomment ) cunit(jproc) = Trim( hunits ) diff --git a/src/MNH/write_stationn.f90 b/src/MNH/write_stationn.f90 index 972805565..8d6d36ec6 100644 --- a/src/MNH/write_stationn.f90 +++ b/src/MNH/write_stationn.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. @@ -60,33 +60,22 @@ END MODULE MODI_WRITE_STATION_n ! 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 ! -------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ ! +USE MODD_ALLSTATION_n, ONLY: LDIAG_SURFRAD 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_CONF, ONLY: LCARTESIAN +USE MODD_CST, ONLY: XRV USE MODD_IO, ONLY: TFILEDATA -USE MODD_LG, ONLY: CLGNAMES -USE MODD_LUNIT -USE MODD_NSV -USE MODD_PARAMETERS +USE MODD_NSV, ONLY: tsvlist, nsv, nsv_aer, nsv_aerbeg, nsv_aerend, & + nsv_dst, nsv_dstbeg, nsv_dstend, nsv_slt, nsv_sltbeg, nsv_sltend 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 MODD_PARAMETERS, ONLY: XUNDEF +USE MODD_STATION_n, only: NUMBSTAT, STATION, TSTATION ! USE MODE_AERO_PSD USE MODE_DUST_PSD @@ -408,72 +397,19 @@ IF (SIZE(TSTATION%TKE,1)>0) THEN 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 + ! Scalar variables + DO JSV = 1, NSV + JPROC = JPROC + 1 + YTITLE(JPROC) = TRIM( TSVLIST(JSV)%CMNHNAME ) + YCOMMENT(JPROC) = '' + IF ( TRIM( TSVLIST(JSV)%CUNITS ) == 'ppv' ) THEN + YUNIT(JPROC) = 'ppb' + ZWORK6(1,1,1,:,1,JPROC) = TSTATION%SV(:,II,JSV) * 1.e9 !*1e9 for conversion ppv->ppb + ELSE + YUNIT(JPROC) = TRIM( TSVLIST(JSV)%CUNITS ) + ZWORK6(1,1,1,:,1,JPROC) = TSTATION%SV(:,II,JSV) + END IF END DO IF ((LORILAM).AND. .NOT.(ANY(TSTATION%P(:,II) == 0.))) THEN @@ -490,15 +426,14 @@ IF (SIZE(TSTATION%SV,3)>=1) THEN ZRHO(1,1,:) = ZRHO(1,1,:) + TSTATION%R(:,II,JRR) ENDDO ZRHO(1,1,:) = TSTATION%TH(:,II) * ( 1. + XRV/XRD*TSTATION%R(:,II,1) ) & - / ( 1. + ZRHO(1,1,:) ) + / ( 1. + ZRHO(1,1,:) ) ELSE ZRHO(1,1,:) = TSTATION%TH(:,II) ENDIF ZRHO(1,1,:) = TSTATION%P(:,II) / & (XRD *ZRHO(1,1,:) *((TSTATION%P(:,II)/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 @@ -611,19 +546,12 @@ IF (SIZE(TSTATION%SV,3)>=1) THEN WRITE(YCOMMENT,'(A24,I1)')'MASS SOA10 AEROSOL MODE ',JSV ZWORK6(1,1,1,:,1,JPROC)=ZPTOTA(1,1,:,JP_AER_SOA10,JSV) END IF - ENDDO + ENDDO - 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))) @@ -637,7 +565,7 @@ IF (SIZE(TSTATION%SV,3)>=1) THEN ZRHO(1,1,:) = ZRHO(1,1,:) + TSTATION%R(:,II,JRR) ENDDO ZRHO(1,1,:) = TSTATION%TH(:,II) * ( 1. + XRV/XRD*TSTATION%R(:,II,1) ) & - / ( 1. + ZRHO(1,1,:) ) + / ( 1. + ZRHO(1,1,:) ) ELSE ZRHO(1,1,:) = TSTATION%TH(:,II) ENDIF @@ -664,19 +592,10 @@ IF (SIZE(TSTATION%SV,3)>=1) THEN WRITE(YCOMMENT(JPROC),'(A13,I1)')'N0 DUST MODE ',JSV ZWORK6 (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))) @@ -720,6 +639,7 @@ ENDIF DEALLOCATE (ZSV,ZRHO) DEALLOCATE (ZN0,ZRG,ZSIG) END IF +END IF IF (ANY(TSTATION%TSRAD(:,:)/=XUNDEF)) THEN JPROC = JPROC+1 -- GitLab From 53c7b2fe6e2f7ddf4dbbeb4fb002e8149b1eb163 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Fri, 4 Feb 2022 15:04:02 +0100 Subject: [PATCH 033/157] Philippe 04/02/2022: remove CSVNAMES(_A) variables (not used anymore, replaced by TSVLIST) --- src/MNH/ini_budget.f90 | 15 ++++++------ src/MNH/ini_nsv.f90 | 49 +--------------------------------------- src/MNH/modd_nsv.f90 | 3 --- src/MNH/update_nsv.f90 | 16 ------------- src/MNH/write_budget.f90 | 3 +-- 5 files changed, 9 insertions(+), 77 deletions(-) diff --git a/src/MNH/ini_budget.f90 b/src/MNH/ini_budget.f90 index cff4e82db..5f3d85d34 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 @@ -226,8 +226,7 @@ use modd_dyn, only: lcorio, xseglen use modd_dyn_n, only: xtstep, locean use modd_elec_descr, only: linductive, lrelax2fw_ion use modd_field, only: TYPEREAL -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,7 +238,7 @@ use modd_nsv, only: csvnames, nsv_lima_nc, nsv_lima_nr, nsv_lima_ni, 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 @@ -2887,7 +2886,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' diff --git a/src/MNH/ini_nsv.f90 b/src/MNH/ini_nsv.f90 index b117f3edb..299e9f9bd 100644 --- a/src/MNH/ini_nsv.f90 +++ b/src/MNH/ini_nsv.f90 @@ -67,7 +67,6 @@ 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 @@ -795,10 +794,9 @@ IF ( LBLOWSNOW ) THEN 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, & @@ -814,8 +812,6 @@ DO JSV = 1, NSV_USER_A(KMI) 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( & @@ -832,8 +828,6 @@ DO JSV = NSV_C2R2BEG_A(KMI), NSV_C2R2END_A(KMI) 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( & @@ -865,43 +859,32 @@ DO JSV = NSV_LIMA_BEG_A(KMI), NSV_LIMA_END_A(KMI) 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_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(2) ) // YNUM2 TSVLIST_A(JSV, KMI)%CMNHNAME = TRIM( CLIMA_COLD_NAMES(2) ) // 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(3) ) // YNUM2 TSVLIST_A(JSV, KMI)%CMNHNAME = TRIM( CLIMA_COLD_NAMES(3) ) // 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(4) ) // YNUM2 TSVLIST_A(JSV, KMI)%CMNHNAME = TRIM( CLIMA_COLD_NAMES(4) ) // YNUM2 ELSE IF ( JSV == NSV_LIMA_HOM_HAZE_A(KMI) ) THEN - CSVNAMES_A(JSV,KMI) = TRIM( CLIMA_COLD_NAMES(5) ) TSVLIST_A(JSV, KMI)%CMNHNAME = TRIM( CLIMA_COLD_NAMES(5) ) 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 @@ -912,8 +895,6 @@ DO JSV = NSV_LIMA_BEG_A(KMI), NSV_LIMA_END_A(KMI) 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 @@ -936,8 +917,6 @@ DO JSV = NSV_ELECBEG_A(KMI), NSV_ELECEND_A(KMI) 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( & @@ -956,8 +935,6 @@ 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 = '', & @@ -975,8 +952,6 @@ END DO 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 = '', & @@ -994,8 +969,6 @@ END DO 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 = '', & @@ -1010,8 +983,6 @@ DO JSV = NSV_CSBEG_A(KMI), NSV_CSEND_A(KMI) 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) ) @@ -1031,8 +1002,6 @@ DO JSV = NSV_CHEMBEG_A(KMI), NSV_CHEMEND_A(KMI) 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) ) @@ -1052,8 +1021,6 @@ DO JSV = NSV_CHICBEG_A(KMI), NSV_CHICEND_A(KMI) 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) ) @@ -1073,8 +1040,6 @@ DO JSV = NSV_AERBEG_A(KMI), NSV_AEREND_A(KMI) 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) ) @@ -1094,8 +1059,6 @@ DO JSV = NSV_AERDEPBEG_A(KMI), NSV_AERDEPEND_A(KMI) 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) ) @@ -1115,8 +1078,6 @@ DO JSV = NSV_DSTBEG_A(KMI), NSV_DSTEND_A(KMI) 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) ) @@ -1136,8 +1097,6 @@ DO JSV = NSV_DSTDEPBEG_A(KMI), NSV_DSTDEPEND_A(KMI) 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) ) @@ -1157,8 +1116,6 @@ DO JSV = NSV_SLTBEG_A(KMI), NSV_SLTEND_A(KMI) 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) ) @@ -1178,8 +1135,6 @@ DO JSV = NSV_SLTDEPBEG_A(KMI), NSV_SLTDEPEND_A(KMI) 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( & @@ -1201,8 +1156,6 @@ 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) - CSVNAMES_A(JSV,KMI) = 'LINOX' - ICHIDX = ICHIDX + 1 CSV_CHEM_LIST_A(ICHIDX, KMI) = 'LINOX' diff --git a/src/MNH/modd_nsv.f90 b/src/MNH/modd_nsv.f90 index 03631f3fe..20a50d177 100644 --- a/src/MNH/modd_nsv.f90 +++ b/src/MNH/modd_nsv.f90 @@ -28,7 +28,6 @@ !! 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 ! P. Wautelet 14/01/2022: add CSV_CHEM_LIST(_A) to store the list of all chemical variables @@ -51,7 +50,6 @@ REAL,DIMENSION(JPSVMAX) :: XSVMIN ! minimum value for SV variables ! 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 @@ -158,7 +156,6 @@ 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 diff --git a/src/MNH/update_nsv.f90 b/src/MNH/update_nsv.f90 index a8bbe8e7b..0bb972eff 100644 --- a/src/MNH/update_nsv.f90 +++ b/src/MNH/update_nsv.f90 @@ -26,7 +26,6 @@ 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 !------------------------------------------------------------------------------- @@ -56,21 +55,6 @@ 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) - END DO - END DO - CALL MOVE_ALLOC( FROM = YSVNAMES_TMP, TO = CSVNAMES_A ) -END IF - -CSVNAMES => CSVNAMES_A(:,KMI) - ! 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 diff --git a/src/MNH/write_budget.f90 b/src/MNH/write_budget.f90 index 3f09ddc78..50dcb283b 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. @@ -620,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 -- GitLab From 4c466f586f8dfd013c59a8ac9252f759cc3c8d33 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Wed, 9 Feb 2022 09:49:00 +0100 Subject: [PATCH 034/157] Philippe 09/02/2022: bugfix: add missing XCURRENT_LEI computation --- src/MNH/ground_paramn.f90 | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/MNH/ground_paramn.f90 b/src/MNH/ground_paramn.f90 index 795d0eb7e..0b3026d15 100644 --- a/src/MNH/ground_paramn.f90 +++ b/src/MNH/ground_paramn.f90 @@ -111,6 +111,7 @@ 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 !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -335,7 +336,8 @@ REAL, DIMENSION(:), ALLOCATABLE :: ZP_PET_B_COEF REAL, DIMENSION(:), ALLOCATABLE :: ZP_PEQ_B_COEF REAL, DIMENSION(:), ALLOCATABLE :: ZP_RN ! net radiation (W/m2) REAL, DIMENSION(:), ALLOCATABLE :: ZP_H ! sensible heat flux (W/m2) -REAL, DIMENSION(:), ALLOCATABLE :: ZP_LE ! latent heat flux (W/m2) +REAL, DIMENSION(:), ALLOCATABLE :: ZP_LE ! Total latent heat flux (W/m2) +REAL, DIMENSION(:), ALLOCATABLE :: ZP_LEI ! Solid Latent heat flux (W/m2) REAL, DIMENSION(:), ALLOCATABLE :: ZP_GFLUX ! ground flux (W/m2) REAL, DIMENSION(:), ALLOCATABLE :: ZP_T2M ! Air temperature at 2 meters (K) REAL, DIMENSION(:), ALLOCATABLE :: ZP_Q2M ! Air humidity at 2 meters (kg/kg) @@ -616,9 +618,9 @@ END IF ! IF (CPROGRAM=='DIAG ' .OR. LDIAG_IN_RUN) THEN CALL DIAG_SURF_ATM_n(YSURF_CUR,'MESONH') - CALL MNHGET_SURF_PARAM_n(PRN=ZP_RN,PH=ZP_H,PLE=ZP_LE,PGFLUX=ZP_GFLUX, & - PT2M=ZP_T2M,PQ2M=ZP_Q2M,PHU2M=ZP_HU2M, & - PZON10M=ZP_ZON10M,PMER10M=ZP_MER10M ) + CALL MNHGET_SURF_PARAM_n( PRN = ZP_RN, PH = ZP_H, PLE = ZP_LE, PLEI = ZP_LEI, & + PGFLUX = ZP_GFLUX, PT2M = ZP_T2M, PQ2M = ZP_Q2M, PHU2M = ZP_HU2M, & + PZON10M = ZP_ZON10M, PMER10M = ZP_MER10M ) END IF ! ! Transform 1D output fields into 2D: @@ -841,6 +843,7 @@ ALLOCATE(ZP_QSURF (KDIM1D)) ALLOCATE(ZP_RN (KDIM1D)) ALLOCATE(ZP_H (KDIM1D)) ALLOCATE(ZP_LE (KDIM1D)) +ALLOCATE(ZP_LEI (KDIM1D)) ALLOCATE(ZP_GFLUX (KDIM1D)) ALLOCATE(ZP_T2M (KDIM1D)) ALLOCATE(ZP_Q2M (KDIM1D)) @@ -964,6 +967,7 @@ IF (LDIAG_IN_RUN) THEN XCURRENT_RN (IIB:IIE,IJB:IJE) = RESHAPE(ZP_RN(:), ISHAPE_2) XCURRENT_H (IIB:IIE,IJB:IJE) = RESHAPE(ZP_H (:), ISHAPE_2) XCURRENT_LE (IIB:IIE,IJB:IJE) = RESHAPE(ZP_LE(:), ISHAPE_2) + XCURRENT_LEI (IIB:IIE,IJB:IJE) = RESHAPE(ZP_LEI(:), ISHAPE_2) XCURRENT_GFLUX (IIB:IIE,IJB:IJE) = RESHAPE(ZP_GFLUX(:), ISHAPE_2) XCURRENT_T2M (IIB:IIE,IJB:IJE) = RESHAPE(ZP_T2M(:), ISHAPE_2) XCURRENT_Q2M (IIB:IIE,IJB:IJE) = RESHAPE(ZP_Q2M(:), ISHAPE_2) @@ -1012,6 +1016,7 @@ DEALLOCATE(ZP_EMIS ) DEALLOCATE(ZP_RN ) DEALLOCATE(ZP_H ) DEALLOCATE(ZP_LE ) +DEALLOCATE(ZP_LEI ) DEALLOCATE(ZP_GFLUX ) DEALLOCATE(ZP_T2M ) DEALLOCATE(ZP_Q2M ) -- GitLab From f78bf485f2a476d7a2167eee9abe7d3c05bb4860 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Wed, 9 Feb 2022 10:12:59 +0100 Subject: [PATCH 035/157] Philippe 09/02/2022: profilers: add message when some variables not computed + bugfix: put values in variables in this case + move some operations outside a do loop --- src/MNH/profilern.f90 | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/src/MNH/profilern.f90 b/src/MNH/profilern.f90 index 433a5c6ef..4424b816f 100644 --- a/src/MNH/profilern.f90 +++ b/src/MNH/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. @@ -85,6 +85,9 @@ END MODULE MODI_PROFILER_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 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 ! -------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -103,6 +106,7 @@ USE MODD_TIME, only: tdtexp USE MODD_TIME_n, only: tdtcur ! USE MODE_ll +USE MODE_MSG ! USE MODI_GPS_ZENITH_GRID USE MODI_LIDAR @@ -515,6 +519,14 @@ IF (GSTORE) THEN 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) @@ -881,10 +893,7 @@ IF (GSTORE) THEN 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)) - 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)) + ! IF (LDIAG_IN_RUN) CALL DISTRIBUTE_PROFILER(TPROFILER%TKE_DISS(IN,JK,I)) ! @@ -896,6 +905,11 @@ IF (GSTORE) THEN 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 -- GitLab From d32cbec30e0624c48b3f27d5612d3588543520ae Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Fri, 11 Feb 2022 10:02:38 +0100 Subject: [PATCH 036/157] Philippe 11/02/2022: IO: remove T suffix for scalar variables + backward compatibility --- src/MNH/ini_prog_var.f90 | 50 +++++++++++++++++++--------- src/MNH/read_field.f90 | 24 +++++++------- src/MNH/spawn_field2.f90 | 22 +++++++------ src/MNH/write_lfifm1_for_diag.f90 | 54 +++++++------------------------ src/MNH/write_lfin.f90 | 5 +-- 5 files changed, 73 insertions(+), 82 deletions(-) diff --git a/src/MNH/ini_prog_var.f90 b/src/MNH/ini_prog_var.f90 index 2e9702b85..3a60efc9a 100644 --- a/src/MNH/ini_prog_var.f90 +++ b/src/MNH/ini_prog_var.f90 @@ -158,6 +158,7 @@ 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 +LOGICAL :: GOLDFILEFORMAT TYPE(TFIELDMETADATA) :: TZFIELD TYPE(TFILEDATA),POINTER :: TZCHEMFILE => NULL() !------------------------------------------------------------------------------- @@ -213,7 +214,12 @@ IF(PRESENT(HCHEMFILE)) THEN ! 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.5.1, some variables had different names (or were not available) + GOLDFILEFORMAT = ( TZCHEMFILE%NMNHVERSION(1) < 5 & + .OR. ( TZCHEMFILE%NMNHVERSION(1) == 5 .AND. TZCHEMFILE%NMNHVERSION(2) < 5 ) & + .OR. ( TZCHEMFILE%NMNHVERSION(1) == 5 .AND. TZCHEMFILE%NMNHVERSION(2) == 5 .AND. TZCHEMFILE%NMNHVERSION(3) < 1 ) ) + ILUDES = TZCHEMFILE%TDESFILE%NLU ! CALL IO_Field_read(TZCHEMFILE,'IMAX',IIMAX,IRESP) @@ -270,8 +276,10 @@ IF(PRESENT(HCHEMFILE)) THEN IF (.NOT.LDUST) THEN DO JSV = NSV_CHEMBEG, NSV_CHEMEND TZFIELD = TSVLIST(JSV) - TZFIELD%CMNHNAME = TRIM( TZFIELD%CMNHNAME ) // 'T' - TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T' + 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 @@ -287,8 +295,10 @@ IF(PRESENT(HCHEMFILE)) THEN IF (LORILAM) THEN DO JSV = NSV_AERBEG,NSV_AEREND TZFIELD = TSVLIST(JSV) - TZFIELD%CMNHNAME = TRIM( TZFIELD%CMNHNAME ) // 'T' - TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T' + 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 @@ -299,8 +309,10 @@ IF(PRESENT(HCHEMFILE)) THEN IF (LDEPOS_AER(IMI)) THEN DO JSV = NSV_AERDEPBEG,NSV_AERDEPEND TZFIELD = TSVLIST(JSV) - TZFIELD%CMNHNAME = TRIM( TZFIELD%CMNHNAME ) // 'T' - TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T' + 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 @@ -313,8 +325,10 @@ IF(PRESENT(HCHEMFILE)) THEN IF (LDUST) THEN DO JSV = NSV_DSTBEG, NSV_DSTEND TZFIELD = TSVLIST(JSV) - TZFIELD%CMNHNAME = TRIM( TZFIELD%CMNHNAME ) // 'T' - TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T' + 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)) @@ -324,8 +338,10 @@ IF(PRESENT(HCHEMFILE)) THEN IF (LDEPOS_DST(IMI)) THEN DO JSV = NSV_DSTDEPBEG,NSV_DSTDEPEND TZFIELD = TSVLIST(JSV) - TZFIELD%CMNHNAME = TRIM( TZFIELD%CMNHNAME ) // 'T' - TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T' + 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 @@ -338,8 +354,10 @@ IF(PRESENT(HCHEMFILE)) THEN IF (LSALT) THEN DO JSV = NSV_SLTBEG, NSV_SLTEND TZFIELD = TSVLIST(JSV) - TZFIELD%CMNHNAME = TRIM( TZFIELD%CMNHNAME ) // 'T' - TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T' + 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)) @@ -349,8 +367,10 @@ IF(PRESENT(HCHEMFILE)) THEN IF (LDEPOS_SLT(IMI)) THEN DO JSV = NSV_SLTDEPBEG,NSV_SLTDEPEND TZFIELD = TSVLIST(JSV) - TZFIELD%CMNHNAME = TRIM( TZFIELD%CMNHNAME ) // 'T' - TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T' + 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/read_field.f90 b/src/MNH/read_field.f90 index 34a20049a..8b72ffd03 100644 --- a/src/MNH/read_field.f90 +++ b/src/MNH/read_field.f90 @@ -814,21 +814,23 @@ DO JSV = 1, NSV ! initialize according to the get indicators CASE ('READ') TZFIELD = TSVLIST(JSV) - IF ( GOLDFILEFORMAT .AND. & - ( ( JSV >= 1 .AND. JSV <= NSV_USER ) .OR. & + 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.5.1 - WRITE(TZFIELD%CMNHNAME,'(A3,I3.3)')'SVT',JSV - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CSTDNAME = '' - TZFIELD%CCOMMENT = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME) - ELSE - TZFIELD%CMNHNAME = TRIM( TZFIELD%CMNHNAME ) // 'T' - TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T' + ( JSV >= NSV_CSBEG .AND. JSV <= NSV_CSEND ) ) THEN + !Some variables were written with an other name in MesoNH < 5.5.1 + 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 ) diff --git a/src/MNH/spawn_field2.f90 b/src/MNH/spawn_field2.f90 index 993f0ebd3..ccd4ceaea 100644 --- a/src/MNH/spawn_field2.f90 +++ b/src/MNH/spawn_field2.f90 @@ -836,21 +836,23 @@ IF (PRESENT(TPSONFILE)) THEN ! DO JSV = 1, NSV TZFIELD = TSVLIST(JSV) - IF ( GOLDFILEFORMAT .AND. & - ( ( JSV >= 1 .AND. JSV <= NSV_USER ) .OR. & + 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 + ( JSV >= NSV_CSBEG .AND. JSV <= NSV_CSEND ) ) THEN !Some variables were written with an other name in MesoNH < 5.5.1 - WRITE(TZFIELD%CMNHNAME,'(A3,I3.3)')'SVT',JSV - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CSTDNAME = '' - TZFIELD%CCOMMENT = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME) - ELSE - TZFIELD%CMNHNAME = TRIM( TZFIELD%CMNHNAME ) // 'T' - TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T' + 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( TPSONFILE, TZFIELD, ZWORK3D, IRESP ) diff --git a/src/MNH/write_lfifm1_for_diag.f90 b/src/MNH/write_lfifm1_for_diag.f90 index a14c099e6..08471b0cf 100644 --- a/src/MNH/write_lfifm1_for_diag.f90 +++ b/src/MNH/write_lfifm1_for_diag.f90 @@ -1065,8 +1065,6 @@ END IF IF(LVAR_MRW) THEN DO JSV = NSV_C2R2BEG,NSV_C2R2END TZFIELD = TSVLIST(JSV) - TZFIELD%CMNHNAME = TRIM( TZFIELD%CMNHNAME ) // 'T' - TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T' IF (JSV < NSV_C2R2END) THEN TZFIELD%CUNITS = 'cm-3' ZWORK31(:,:,:)=XSVT(:,:,:,JSV)*1.E-6 @@ -1080,8 +1078,6 @@ IF(LVAR_MRW) THEN ! microphysical C3R5 scheme additional scalar variables DO JSV = NSV_C1R3BEG,NSV_C1R3END TZFIELD = TSVLIST(JSV) - TZFIELD%CMNHNAME = TRIM( TZFIELD%CMNHNAME ) // 'T' - TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T' TZFIELD%CUNITS = 'l-1' CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)*1.E-3) END DO @@ -1107,54 +1103,54 @@ IF (LLIMA_DIAG) THEN ! ! 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 ! 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(2))//INDICE//'T' + TZFIELD%CMNHNAME = TRIM(CLIMA_COLD_CONC(2))//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(3))//INDICE//'T' + TZFIELD%CMNHNAME = TRIM(CLIMA_COLD_CONC(3))//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(4))//INDICE//'T' + TZFIELD%CMNHNAME = TRIM(CLIMA_COLD_CONC(4))//INDICE END IF ! Hom. freez. of CCN IF (JSV .EQ. NSV_LIMA_HOM_HAZE) THEN - TZFIELD%CMNHNAME = TRIM(CLIMA_COLD_CONC(5))//'T' + TZFIELD%CMNHNAME = TRIM(CLIMA_COLD_CONC(5)) END IF ! ! 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) @@ -1198,8 +1194,6 @@ END IF IF (LELECDIAG .AND. CELEC .NE. "NONE") THEN DO JSV = NSV_ELECBEG,NSV_ELECEND TZFIELD = TSVLIST(JSV) - TZFIELD%CMNHNAME = TRIM( TZFIELD%CMNHNAME ) // 'T' - TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T' 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 @@ -1216,8 +1210,6 @@ END IF IF (LTRAJ) THEN DO JSV = NSV_LGBEG, NSV_LGEND TZFIELD = TSVLIST(JSV) - TZFIELD%CMNHNAME = TRIM( TZFIELD%CMNHNAME ) // 'T' - TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T' WRITE(TZFIELD%CCOMMENT,'(A6,A20,I3.3,A4)')'X_Y_Z_','Lagrangian variable ',JSV CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)) END DO @@ -1278,8 +1270,6 @@ IF (LPASPOL) THEN ! DO JSV = NSV_PPBEG, NSV_PPEND TZFIELD = TSVLIST(JSV) - TZFIELD%CMNHNAME = TRIM( TZFIELD%CMNHNAME ) // 'T' - TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T' TZFIELD%CUNITS = 'g m-3' ZTMP(:,:,:)=ABS( XSVT(:,:,:,JSV)*ZRHOT(:,:,:) ) @@ -1293,8 +1283,6 @@ END IF IF (LCONDSAMP) THEN DO JSV = NSV_CSBEG, NSV_CSEND TZFIELD = TSVLIST(JSV) - TZFIELD%CMNHNAME = TRIM( TZFIELD%CMNHNAME ) // 'T' - TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T' CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)) END DO END IF @@ -1302,8 +1290,6 @@ END IF IF (LCHEMDIAG) THEN DO JSV = NSV_CHGSBEG,NSV_CHGSEND TZFIELD = TSVLIST(JSV) - TZFIELD%CMNHNAME = TRIM( TZFIELD%CMNHNAME ) // 'T' - TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T' TZFIELD%CUNITS = 'ppb' WRITE(TZFIELD%CCOMMENT,'(A6,A4,I3.3)')'X_Y_Z_','CHIM',JSV CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)*1.E9) @@ -1313,8 +1299,6 @@ IF (LCHAQDIAG) THEN !aqueous concentration in M ZWORK31(:,:,:)=0. DO JSV = NSV_CHACBEG, NSV_CHACBEG-1+NEQAQ/2 !cloud water TZFIELD = TSVLIST(JSV) - TZFIELD%CMNHNAME = TRIM( TZFIELD%CMNHNAME ) // 'T' - TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T' 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) @@ -1326,8 +1310,6 @@ IF (LCHAQDIAG) THEN !aqueous concentration in M ZWORK31(:,:,:)=0. DO JSV = NSV_CHACBEG+NEQAQ/2, NSV_CHACEND !rain water TZFIELD = TSVLIST(JSV) - TZFIELD%CMNHNAME = TRIM( TZFIELD%CMNHNAME ) // 'T' - TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T' 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) @@ -1337,7 +1319,7 @@ IF (LCHAQDIAG) THEN !aqueous concentration in M END DO ! 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) @@ -1350,8 +1332,6 @@ END IF IF ((LCHEMDIAG).AND.(LORILAM).AND.(LUSECHEM)) THEN DO JSV = NSV_AERBEG, NSV_AEREND TZFIELD = TSVLIST(JSV) - TZFIELD%CMNHNAME = TRIM( TZFIELD%CMNHNAME ) // 'T' - TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T' 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) @@ -1512,8 +1492,6 @@ IF (LDUST) THEN ! DO JSV = NSV_DSTBEG, NSV_DSTEND TZFIELD = TSVLIST(JSV) - TZFIELD%CMNHNAME = TRIM( TZFIELD%CMNHNAME ) // 'T' - TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T' 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) @@ -1591,8 +1569,6 @@ END IF IF (LDUST.AND.LDEPOS_DST(IMI)) THEN DO JSV = NSV_DSTBEG, NSV_DSTEND TZFIELD = TSVLIST(JSV) - TZFIELD%CMNHNAME = TRIM( TZFIELD%CMNHNAME ) // 'T' - TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T' TZFIELD%CUNITS = 'ppb' WRITE(TZFIELD%CCOMMENT,'(A,I3.3)') 'X_Y_Z_DUSTDEP', JSV CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)*1.E9) @@ -1698,8 +1674,6 @@ IF (LSALT) THEN ! DO JSV = NSV_SLTBEG, NSV_SLTEND TZFIELD = TSVLIST(JSV) - TZFIELD%CMNHNAME = TRIM( TZFIELD%CMNHNAME ) // 'T' - TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T' TZFIELD%CUNITS = 'ppb' WRITE(TZFIELD%CCOMMENT,'(A,I3.3)') 'X_Y_Z_SALT', JSV CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)*1.E9) @@ -1778,8 +1752,6 @@ IF (LSALT.AND.LDEPOS_SLT(IMI)) THEN ! DO JSV = NSV_SLTDEPBEG, NSV_SLTDEPEND TZFIELD = TSVLIST(JSV) - TZFIELD%CMNHNAME = TRIM( TZFIELD%CMNHNAME ) // 'T' - TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T' TZFIELD%CUNITS = 'ppb' WRITE(TZFIELD%CCOMMENT,'(A,I3.3)') 'X_Y_Z_SALTDEP', JSV CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)*1.E9) @@ -1996,8 +1968,6 @@ END IF IF (.NOT.(LUSECHEM .OR. LCHEMDIAG) .AND. LCH_CONV_LINOX) THEN DO JSV = NSV_LNOXBEG, NSV_LNOXEND TZFIELD = TSVLIST(JSV) - TZFIELD%CMNHNAME = TRIM( TZFIELD%CMNHNAME ) // 'T' - TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T' TZFIELD%CUNITS = 'ppb' WRITE(TZFIELD%CCOMMENT,'(A,I3.3)') 'X_Y_Z_LNOX', JSV CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)*1.E9) diff --git a/src/MNH/write_lfin.f90 b/src/MNH/write_lfin.f90 index 1a6694ce0..481840839 100644 --- a/src/MNH/write_lfin.f90 +++ b/src/MNH/write_lfin.f90 @@ -919,10 +919,7 @@ IF (NSV >= 1 ) THEN !Store all scalar variables DO JSV = 1, NSV - TZFIELD = TSVLIST(JSV) - TZFIELD%CMNHNAME = TRIM( TZFIELD%CMNHNAME ) // 'T' - TZFIELD%CLONGNAME = TRIM( TZFIELD%CLONGNAME ) // 'T' - CALL IO_Field_write(TPFILE,TZFIELD,XSVT(:,:,:,JSV)) + CALL IO_Field_write( TPFILE, TSVLIST(JSV), XSVT(:,:,:,JSV) ) END DO IF (LSCAV .AND. LAERO_MASS) THEN -- GitLab From b8f0d4892f347b84c7b609c02f530f699f06bf01 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Tue, 11 Jan 2022 15:48:24 +0100 Subject: [PATCH 037/157] Philippe 11/01/2022: bugfix: add ONE parameter (cherry picked from commit ab4a319f8373a9a1d2f8bc9117972257e96b0ef5) --- src/MNH/isocom.f | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/MNH/isocom.f b/src/MNH/isocom.f index f2e6503e6..451c1b485 100644 --- a/src/MNH/isocom.f +++ b/src/MNH/isocom.f @@ -1,4 +1,4 @@ -CMNH_LIC Copyright 1996-2019 CNRS, Meteo-France and Universite Paul Sabatier +CMNH_LIC Copyright 1996-2022 CNRS, Meteo-France and Universite Paul Sabatier CMNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence CMNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt CMNH_LIC for details. version 1. @@ -3782,7 +3782,8 @@ C C IMPLICIT REAL(kind(0.0d0)) (A-H, O-Z) PARAMETER (EXPON=1.D0/3.D0, ZERO=0.D0, THET1=120.D0/180.D0, - & THET2=240.D0/180.D0, PI=3.14159265358932, EPS=1D-50) + & THET2=240.D0/180.D0, PI=3.14159265358932, EPS=1D-50, + & ONE=1.D0 ) REAL(kind(0.0d0)) X(3) C C *** SPECIAL CASE : QUADRATIC*X EQUATION ***************************** -- GitLab From e9ef9a94efa766d60fad1338293c8b9fe7b8409c Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Tue, 11 Jan 2022 15:49:49 +0100 Subject: [PATCH 038/157] Philippe 11/01/2022: minor bugfix: remove ! at end of preprocessor #endif (cherry picked from commit dc76371906b99beaea24f7ca921c74a65e1df9f9) --- src/SURFEX/pgd_grid.F90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/SURFEX/pgd_grid.F90 b/src/SURFEX/pgd_grid.F90 index 5a7158fc1..9c17d153a 100644 --- a/src/SURFEX/pgd_grid.F90 +++ b/src/SURFEX/pgd_grid.F90 @@ -316,7 +316,7 @@ ALLOCATE(UG%XJPDIR (NL)) CALL MPPDB_CHECK_SURFEX2D(UG%G%XLAT,"PGD_GRID after LATLON_GRID:XLAT",PRECISION,ILUOUT) CALL MPPDB_CHECK_SURFEX2D(UG%G%XLON,"PGD_GRID after LATLON_GRID:XLON",PRECISION,ILUOUT) CALL MPPDB_CHECK_SURFEX2D(UG%G%XMESH_SIZE,"PGD_GRID after LATLON_GRID:XMESH_SIZE",PRECISION,ILUOUT) -#endif! +#endif !------------------------------------------------------------------------------ ! !* 7. Average grid length (in degrees) -- GitLab From 4da13e98c10507964d4e7fc0255cd7faeac1c0ab Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Fri, 11 Feb 2022 16:18:39 +0100 Subject: [PATCH 039/157] Philippe 11/02/2022: add meaning of ppv for AER, DUST and SALT variables depending on moment --- src/MNH/ini_nsv.f90 | 188 ++++++++++++++++++++++++++++++-------------- 1 file changed, 127 insertions(+), 61 deletions(-) diff --git a/src/MNH/ini_nsv.f90 b/src/MNH/ini_nsv.f90 index 299e9f9bd..1a9662857 100644 --- a/src/MNH/ini_nsv.f90 +++ b/src/MNH/ini_nsv.f90 @@ -78,8 +78,9 @@ END MODULE MODI_INI_NSV ! ------------ ! 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 @@ -108,7 +109,7 @@ 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, NUNITLGTMAX +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, & LWARM, LCOLD, LRAIN, LSPRO @@ -141,12 +142,17 @@ 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 ! !------------------------------------------------------------------------------- ! @@ -483,12 +489,18 @@ 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) @@ -522,12 +534,18 @@ 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) @@ -703,26 +721,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 @@ -746,26 +777,39 @@ IF ( LSALT ) THEN IF ( NMODE_SLT < 1 .OR. NMODE_SLT > 5 ) CALL Print_msg( NVERB_FATAL, 'GEN', 'INI_NSV', 'NMODE_SLT must in the 1 to 5 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 @@ -786,11 +830,10 @@ 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 @@ -1026,17 +1069,40 @@ DO JSV = NSV_AERBEG_A(KMI), NSV_AEREND_A(KMI) WRITE( YNUM3, '( I3.3 )' ) JSV - TSVLIST_A(JSV, KMI) = TFIELDMETADATA( & - CMNHNAME = TRIM( CAERONAMES(JSV-NSV_AERBEG_A(KMI)+1) ), & - CSTDNAME = '', & - CLONGNAME = TRIM( CAERONAMES(JSV-NSV_AERBEG_A(KMI)+1) ), & - CUNITS = 'ppv', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_' // 'SVT' // YNUM3, & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) + ALLOCATE( YAEROLONGNAMES(NSV_AER_A(KMI)) ) + + !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_BCi, 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) @@ -1064,17 +1130,17 @@ DO JSV = NSV_DSTBEG_A(KMI), NSV_DSTEND_A(KMI) WRITE( YNUM3, '( I3.3 )' ) JSV - TSVLIST_A(JSV, KMI) = TFIELDMETADATA( & - CMNHNAME = TRIM( CDUSTNAMES(JSV-NSV_DSTBEG_A(KMI)+1) ), & - CSTDNAME = '', & - CLONGNAME = TRIM( CDUSTNAMES(JSV-NSV_DSTBEG_A(KMI)+1) ), & - CUNITS = 'ppv', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_' // 'SVT' // YNUM3, & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) + 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) @@ -1102,17 +1168,17 @@ DO JSV = NSV_SLTBEG_A(KMI), NSV_SLTEND_A(KMI) WRITE( YNUM3, '( I3.3 )' ) JSV - TSVLIST_A(JSV, KMI) = TFIELDMETADATA( & - CMNHNAME = TRIM( CSALTNAMES(JSV-NSV_SLTBEG_A(KMI)+1) ), & - CSTDNAME = '', & - CLONGNAME = TRIM( CSALTNAMES(JSV-NSV_SLTBEG_A(KMI)+1) ), & - CUNITS = 'ppv', & - CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_' // 'SVT' // YNUM3, & - NGRID = 1, & - NTYPE = TYPEREAL, & - NDIMS = 3, & - LTIMEDEP = .TRUE. ) + 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) -- GitLab From e9e2eb4338e2524651589e78d2616916425d8d30 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Wed, 9 Mar 2022 11:39:56 +0100 Subject: [PATCH 040/157] Philippe 09/03/2022: IO: bugfix: iresp_tmp_* varaibles were not initialized (crash in some cases due to random values if parallel I/O) --- src/LIB/SURCOUCHE/src/mode_io_field_write.f90 | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/LIB/SURCOUCHE/src/mode_io_field_write.f90 b/src/LIB/SURCOUCHE/src/mode_io_field_write.f90 index da3889629..07bf78a63 100644 --- a/src/LIB/SURCOUCHE/src/mode_io_field_write.f90 +++ b/src/LIB/SURCOUCHE/src/mode_io_field_write.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. @@ -1078,6 +1078,8 @@ end subroutine IO_Ndimlist_reduce iresp = 0 iresp_lfi = 0 iresp_nc4 = 0 + iresp_tmp_lfi = 0 + iresp_tmp_nc4 = 0 GALLOC = .FALSE. GALLOC_ll = .FALSE. IHEXTOT = 2*JPHEXT+1 -- GitLab From 44d0c84b181959c3f289648531ad9e42a15d6779 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Thu, 10 Mar 2022 09:12:41 +0100 Subject: [PATCH 041/157] Philippe 10/03/2022: IO: bugfix: reduce precision was not taken into account for Z-split 3D variables in master files --- src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 b/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 index 4019f6346..2f7836534 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-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. @@ -86,6 +86,8 @@ use modd_parameters, only: jphext use mode_tools_ll, only: Get_globaldims_ll +use NETCDF, only: NF90_FLOAT + type(tfiledata), intent(in) :: tpfile class(tfieldmetadata), intent(in) :: tpfield integer, intent(in) :: knblocks @@ -112,7 +114,11 @@ call IO_Mnhname_clean( tpfield%cmnhname, yvarname ) istatus = NF90_INQ_VARID( incid, yvarname, ivarid ) if ( istatus /= NF90_NOERR ) then - istatus = NF90_DEF_VAR( incid, yvarname, MNHREAL_NF90, ivarid) + if ( tpfile%lncreduce_float_precision ) then + istatus = NF90_DEF_VAR( incid, yvarname, NF90_FLOAT, ivarid ) + else + istatus = NF90_DEF_VAR( incid, yvarname, MNHREAL_NF90, ivarid ) + end if if ( tpfield%ndims /= 3 ) call Print_msg( NVERB_FATAL, 'IO', 'IO_Field_header_split_write_nc4', & trim( tpfile%cname )//': '//trim( yvarname )//': NDIMS should be 3' ) -- GitLab From a00ee173e9041a92c094e6fc540c77772d940518 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Wed, 16 Mar 2022 11:31:11 +0100 Subject: [PATCH 042/157] Philippe 16/03/2022: IO: bugfix: CDIR was wrong for COVERnnn in READ_SURFX2COV_1COV_MNH --- src/MNH/read_surf_mnh.f90 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/MNH/read_surf_mnh.f90 b/src/MNH/read_surf_mnh.f90 index 17648717d..96693291f 100644 --- a/src/MNH/read_surf_mnh.f90 +++ b/src/MNH/read_surf_mnh.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2003-2021 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 for details. version 1. @@ -1027,7 +1027,7 @@ IF (.NOT. GCOVER_PACKED) THEN CSTDNAME = '', & CLONGNAME = TRIM(YREC), & CUNITS = '', & - CDIR = YDIR1, & + CDIR = YDIR, & CCOMMENT = 'X_Y_'//TRIM(YREC), & NGRID = 4, & NTYPE = TYPEREAL, & -- GitLab From 823802ede5916b0facd815c1d106eb2f5ad53171 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Fri, 18 Mar 2022 10:11:58 +0100 Subject: [PATCH 043/157] Philippe 18/03/2022: IO: minor bugfix in IO_Bakout_struct_prepare + adapt diagnostics messages (change verbosity level and remove some unnecessary warnings) --- src/LIB/SURCOUCHE/src/mode_io_manage_struct.f90 | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/LIB/SURCOUCHE/src/mode_io_manage_struct.f90 b/src/LIB/SURCOUCHE/src/mode_io_manage_struct.f90 index f7954781f..60cf44de0 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-2021 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 for details. version 1. @@ -19,6 +19,8 @@ ! P. Wautelet 11/02/2020: bugfix: TDADFILE was wrongly constructed for output files ! 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) !----------------------------------------------------------------- MODULE MODE_IO_MANAGE_STRUCT ! @@ -86,8 +88,8 @@ END IF DO IMI = 1, NMODEL IBAK_NUMB = 0 IOUT_NUMB = 0 - ISTEP_MAX = NINT(XSEGLEN/DYN_MODEL(IMI)%XTSTEP)+1 - IF (IMI == 1) ISTEP_MAX = ISTEP_MAX - KSUP + !Reduce XSEGLEN by time added to XSEGLEN for 1st domain (see set_grid subroutine) + ISTEP_MAX = NINT( ( XSEGLEN - KSUP * DYN_MODEL(1)%XTSTEP ) / DYN_MODEL(IMI)%XTSTEP ) + 1 ! !* Insert regular backups/outputs into XBAK_TIME/XOUT_TIME arrays ! @@ -468,7 +470,7 @@ SUBROUTINE FIND_REMOVE_DUPLICATES(KNUMB,KSTEPS) DO JOUT = 1,KNUMB DO JKLOOP = JOUT+1,KNUMB IF ( KSTEPS(JKLOOP) == KSTEPS(JOUT) .AND. KSTEPS(JKLOOP) > 0 ) THEN - CALL PRINT_MSG(NVERB_INFO,'IO','FIND_REMOVE_DUPLICATES','found duplicated backup/output step (removed extra one)') + CALL PRINT_MSG(NVERB_DEBUG,'IO','FIND_REMOVE_DUPLICATES','found duplicated backup/output step (removed extra one)') KSTEPS(JKLOOP) = NNEGUNDEF END IF END DO @@ -484,7 +486,8 @@ SUBROUTINE FIND_REMOVE_OUTOFTIMERANGE(KNUMB,KSTEPS) ! DO JOUT = 1,KNUMB IF ( KSTEPS(JOUT) < 1 .OR. KSTEPS(JOUT) > ISTEP_MAX ) THEN - CALL PRINT_MSG(NVERB_WARNING,'IO','FIND_REMOVE_OUTOFTIMERANGE','found backup/output step outside of time range') + IF ( KSTEPS(JOUT) /= NNEGUNDEF ) & + CALL PRINT_MSG(NVERB_WARNING,'IO','FIND_REMOVE_OUTOFTIMERANGE','found backup/output step outside of time range') KSTEPS(JOUT) = NNEGUNDEF END IF END DO -- GitLab From 6dbfd11a0ec7c7608e84586cb228b0f704458235 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Fri, 18 Mar 2022 15:51:55 +0100 Subject: [PATCH 044/157] Philippe 18/03/2022: bugfix: correct xseglen by removing xtstep of first model --- src/LIB/SURCOUCHE/src/mode_io_tools_nc4.f90 | 8 ++++---- src/MNH/ground_paramn.f90 | 6 +++--- src/MNH/ini_aircraft_balloon.f90 | 4 ++-- src/MNH/ini_lesn.f90 | 4 ++-- src/MNH/ini_posprofilern.f90 | 4 ++-- src/MNH/ini_surfstationn.f90 | 8 ++------ 6 files changed, 15 insertions(+), 19 deletions(-) diff --git a/src/LIB/SURCOUCHE/src/mode_io_tools_nc4.f90 b/src/LIB/SURCOUCHE/src/mode_io_tools_nc4.f90 index a7d7604f2..22fa1c5db 100644 --- a/src/LIB/SURCOUCHE/src/mode_io_tools_nc4.f90 +++ b/src/LIB/SURCOUCHE/src/mode_io_tools_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. @@ -252,7 +252,7 @@ USE MODD_CONF, ONLY: CPROGRAM, l2d, lpack USE MODD_CONF_n, ONLY: CSTORAGE_TYPE USE MODD_DIM_n, ONLY: NIMAX_ll, NJMAX_ll, NKMAX use modd_dyn, only: xseglen -use modd_dyn_n, only: xtstep +use modd_dyn_n, only: dyn_model !PW: check if all parameters are used... use modd_field, only: NMNHDIM_NI, NMNHDIM_NJ, NMNHDIM_NI_U, NMNHDIM_NJ_U, NMNHDIM_NI_V, NMNHDIM_NJ_V, & @@ -423,13 +423,13 @@ if ( tpfile%ctype == 'MNHDIACHRONIC' ) then !Dimension for the number of profiler times if ( numbprofiler > 0 ) then - iprof = Int ( ( xseglen - xtstep ) / tprofiler%step ) + 1 + iprof = Nint ( ( xseglen - dyn_model(1)%xtstep ) / tprofiler%step ) + 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 = Int ( ( xseglen - xtstep ) / tstation%step ) + 1 + istation = Nint ( ( xseglen - dyn_model(1)%xtstep ) / tstation%step ) + 1 call IO_Add_dim_nc4( tpfile, NMNHDIM_STATION_TIME, 'time_station', istation ) end if diff --git a/src/MNH/ground_paramn.f90 b/src/MNH/ground_paramn.f90 index 0b3026d15..65dfee99c 100644 --- a/src/MNH/ground_paramn.f90 +++ b/src/MNH/ground_paramn.f90 @@ -123,7 +123,7 @@ USE MODI_GET_HALO USE MODI_MNH_OASIS_RECV USE MODI_MNH_OASIS_SEND USE MODD_SFX_OASIS, ONLY : LOASIS -USE MODD_DYN, ONLY : XSEGLEN +USE MODD_DYN, ONLY: DYN_MODEL, XSEGLEN #endif ! USE MODD_LUNIT_n, ONLY: TLUOUT @@ -575,7 +575,7 @@ CALL DATETIME_DISTANCE(TDTSEG,TDTCUR,ZTIMEC) #ifdef CPLOASIS IF (LOASIS) THEN IF ( MOD(ZTIMEC,1.0) .LE. 1E-2 .OR. (1.0 - MOD(ZTIMEC,1.0)) .LE. 1E-2 ) THEN - IF ( NINT(ZTIMEC-(XSEGLEN-XTSTEP)) .LT. 0 ) THEN + IF ( NINT(ZTIMEC-(XSEGLEN-DYN_MODEL(1)%XTSTEP)) .LT. 0 ) THEN WRITE(ILUOUT,*) '----------------------------' WRITE(ILUOUT,*) ' Reception des champs avec OASIS' WRITE(ILUOUT,*) 'NINT(ZTIMEC)=', NINT(ZTIMEC) @@ -605,7 +605,7 @@ CALL COUPLING_SURF_ATM_n(YSURF_CUR,'MESONH', 'E',ZTIMEC, #ifdef CPLOASIS IF (LOASIS) THEN IF ( MOD(ZTIMEC,1.0) .LE. 1E-2 .OR. (1.0 - MOD(ZTIMEC,1.0)) .LE. 1E-2 ) THEN - IF (NINT(ZTIMEC-(XSEGLEN-XTSTEP)) .LT. 0) THEN + IF (NINT(ZTIMEC-(XSEGLEN-DYN_MODEL(1)%XTSTEP)) .LT. 0) THEN WRITE(ILUOUT,*) '----------------------------' WRITE(ILUOUT,*) ' Envoi des champs avec OASIS' WRITE(ILUOUT,*) 'NINT(ZTIMEC)=', NINT(ZTIMEC) diff --git a/src/MNH/ini_aircraft_balloon.f90 b/src/MNH/ini_aircraft_balloon.f90 index 5d9ea3a67..72f52303a 100644 --- a/src/MNH/ini_aircraft_balloon.f90 +++ b/src/MNH/ini_aircraft_balloon.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. @@ -360,7 +360,7 @@ 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 = INT ( (PSEGLEN-XTSTEP) / TPFLYER%STEP ) + 1 + ISTORE = NINT ( ( PSEGLEN - DYN_MODEL(1)%XTSTEP ) / TPFLYER%STEP ) + 1 ENDIF ! IF (TPFLYER%NMODEL == 0) ISTORE=0 diff --git a/src/MNH/ini_lesn.f90 b/src/MNH/ini_lesn.f90 index 45d7b9f9a..05a30c423 100644 --- a/src/MNH/ini_lesn.f90 +++ b/src/MNH/ini_lesn.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. @@ -321,7 +321,7 @@ XLES_TEMP_SAMPLING = XTSTEP * NLES_DTCOUNT ! ---------------------------------------- ! ! -NLES_TIMES = ( INT( (XSEGLEN-XTSTEP+1.E-6) / XTSTEP ) ) / NLES_DTCOUNT +NLES_TIMES = ( NINT( ( XSEGLEN - DYN_MODEL(1)%XTSTEP ) / XTSTEP ) ) / NLES_DTCOUNT ! !* 3.5 current LES time counter ! ------------------------ diff --git a/src/MNH/ini_posprofilern.f90 b/src/MNH/ini_posprofilern.f90 index 08b25fba1..00279c8a8 100644 --- a/src/MNH/ini_posprofilern.f90 +++ b/src/MNH/ini_posprofilern.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. @@ -156,7 +156,7 @@ SUBROUTINE ALLOCATE_PROFILER_n(TPROFILER) ! TYPE(PROFILER), INTENT(INOUT) :: TPROFILER ! -ISTORE = INT ( (PSEGLEN-XTSTEP) / TPROFILER%STEP ) + 1 +ISTORE = NINT( ( PSEGLEN - DYN_MODEL(1)%XTSTEP ) / TPROFILER%STEP ) + 1 ! allocate( tprofiler%tpdates( istore ) ) ALLOCATE(TPROFILER%ERROR (NUMBPROFILER)) diff --git a/src/MNH/ini_surfstationn.f90 b/src/MNH/ini_surfstationn.f90 index f53ee35d1..5b79bb289 100644 --- a/src/MNH/ini_surfstationn.f90 +++ b/src/MNH/ini_surfstationn.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. @@ -171,11 +171,7 @@ if ( tstation%step < xtstep ) then tstation%step = xtstep end if -IF (KMI==1) THEN - ISTORE = NINT ( (PSEGLEN-XTSTEP) / TSTATION%STEP ) + 1 -ELSE - ISTORE = NINT ( (PSEGLEN-XTSTEP * NDTRATIO(KMI)) / TSTATION%STEP ) + 1 -END IF +ISTORE = NINT ( ( PSEGLEN - DYN_MODEL(1)%XTSTEP ) / TSTATION%STEP ) + 1 allocate( tstation%tpdates( istore ) ) ALLOCATE(TSTATION%ERROR (NUMBSTAT)) -- GitLab From 1ca4e62cf481d02e29ecf61f39173e05d5a70cec Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Tue, 22 Mar 2022 13:52:16 +0100 Subject: [PATCH 045/157] Philippe 22/03/2022: LES budgets: LES averaging periods are more reliable (compute with integers instead of reals) --- src/MNH/ini_lesn.f90 | 41 ++++++++++++++++++++++++++ src/MNH/modd_lesn.f90 | 15 +++++++++- src/MNH/mode_les_diachro.f90 | 57 ++++++++++-------------------------- 3 files changed, 70 insertions(+), 43 deletions(-) diff --git a/src/MNH/ini_lesn.f90 b/src/MNH/ini_lesn.f90 index 05a30c423..84f90dba5 100644 --- a/src/MNH/ini_lesn.f90 +++ b/src/MNH/ini_lesn.f90 @@ -40,6 +40,7 @@ ! P. Wautelet 04/01/2021: bugfix: nles_k was used instead of nspectra_k for a loop index ! P. Wautelet 30/03/2021: budgets: LES cartesian subdomain limits are defined in the physical domain ! P. Wautelet 09/07/2021: bugfix: altitude levels are on the correct grid position (mass point) +! P. Wautelet 22/03/2022: LES averaging periods are more reliable (compute with integers instead of reals) ! -------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -342,6 +343,46 @@ IF (NLES_TIMES==0) THEN RETURN END IF ! +!* 3.8 Averaging +! --------- +IF ( XLES_TEMP_MEAN_END == XUNDEF & + .OR. XLES_TEMP_MEAN_START == XUNDEF & + .OR. XLES_TEMP_MEAN_STEP == XUNDEF ) THEN + !No LES temporal averaging + NLES_MEAN_TIMES = 0 + NLES_MEAN_STEP = NNEGUNDEF + NLES_MEAN_START = NNEGUNDEF + NLES_MEAN_END = NNEGUNDEF +ELSE + !LES temporal averaging is enabled + !Ensure that XLES_TEMP_MEAN_END is not after segment end + XLES_TEMP_MEAN_END = MIN( XLES_TEMP_MEAN_END, XSEGLEN - DYN_MODEL(1)%XTSTEP ) + + NLES_MEAN_START = NINT( XLES_TEMP_MEAN_START / XTSTEP ) + + IF ( MODULO( NLES_MEAN_START, NLES_DTCOUNT ) /= 0 ) THEN + CMNHMSG(1) = 'XLES_TEMP_MEAN_START is not a multiple of XLES_TEMP_SAMPLING' + CMNHMSG(2) = 'LES averaging periods could be wrong' + CALL Print_msg( NVERB_WARNING, 'IO', 'INI_LES_n' ) + END IF + + NLES_MEAN_END = NINT( XLES_TEMP_MEAN_END / XTSTEP ) + + NLES_MEAN_STEP = NINT( XLES_TEMP_MEAN_STEP / XTSTEP ) + + IF ( NLES_MEAN_STEP < NLES_DTCOUNT ) & + CALL Print_msg( NVERB_ERROR, 'IO', 'INI_LES_n', 'XLES_TEMP_MEAN_STEP < XLES_TEMP_SAMPLING not allowed' ) + + IF ( MODULO( NLES_MEAN_STEP, NLES_DTCOUNT ) /= 0 ) THEN + CMNHMSG(1) = 'XLES_TEMP_MEAN_STEP is not a multiple of XLES_TEMP_SAMPLING' + CMNHMSG(2) = 'LES averaging periods could be wrong' + CALL Print_msg( NVERB_WARNING, 'IO', 'INI_LES_n' ) + END IF + + NLES_MEAN_TIMES = ( NLES_MEAN_END - NLES_MEAN_START ) / NLES_MEAN_STEP + !Add 1 averaging period if the last one is incomplete (for example: start=0., end=10., step=3.) + IF ( MODULO( NLES_MEAN_END - NLES_MEAN_START, NLES_MEAN_STEP ) > 0 ) NLES_MEAN_TIMES = NLES_MEAN_TIMES + 1 +END IF !------------------------------------------------------------------------------- ! !* 4. Number of vertical levels for local diagnostics diff --git a/src/MNH/modd_lesn.f90 b/src/MNH/modd_lesn.f90 index 28db43c4d..c7b54dd8d 100644 --- a/src/MNH/modd_lesn.f90 +++ b/src/MNH/modd_lesn.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. @@ -42,6 +42,7 @@ ! P. Wautelet 08/02/2019: add missing NULL association for pointers ! C. Lac 02/2019: add rain fraction as a LES diagnostic ! P. Wautelet 13/09/2019: budget: simplify and modernize date/time management +! P. Wautelet 22/03/2022: LES averaging periods are more reliable (compute with integers instead of reals) !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -61,6 +62,10 @@ TYPE LES_t INTEGER :: NLES_TIMES ! number of LES computations in time INTEGER :: NLES_DTCOUNT ! number of time steps between two LES comp. INTEGER :: NLES_TCOUNT ! current time counter for LES comp. + INTEGER :: NLES_MEAN_TIMES ! Number of LES averaging periods + INTEGER :: NLES_MEAN_STEP ! number of time steps between two LES average comp. + INTEGER :: NLES_MEAN_START ! First time step number taken into account for LES averaging + INTEGER :: NLES_MEAN_END ! Last time step number taken into account for LES averaging INTEGER :: NSPECTRA_NI ! number of wave lengths in I direction INTEGER :: NSPECTRA_NJ ! number of wave lengths in J direction ! @@ -660,6 +665,10 @@ TYPE(LES_t), DIMENSION(JPMODELMAX), TARGET, SAVE :: LES_MODEL INTEGER, POINTER :: NLES_TIMES=>NULL() INTEGER, POINTER :: NLES_DTCOUNT=>NULL() INTEGER, POINTER :: NLES_TCOUNT=>NULL() +INTEGER, POINTER :: NLES_MEAN_TIMES => NULL() +INTEGER, POINTER :: NLES_MEAN_STEP => NULL() +INTEGER, POINTER :: NLES_MEAN_START => NULL() +INTEGER, POINTER :: NLES_MEAN_END => NULL() INTEGER, POINTER :: NSPECTRA_NI=>NULL() INTEGER, POINTER :: NSPECTRA_NJ=>NULL() type(date_time), dimension(:), pointer :: tles_dates => null() @@ -1509,6 +1518,10 @@ LES_MODEL(KFROM)%XLES_RADEFF=>XLES_RADEFF NLES_TIMES=>LES_MODEL(KTO)%NLES_TIMES NLES_DTCOUNT=>LES_MODEL(KTO)%NLES_DTCOUNT NLES_TCOUNT=>LES_MODEL(KTO)%NLES_TCOUNT +NLES_MEAN_TIMES => LES_MODEL(KTO)%NLES_MEAN_TIMES +NLES_MEAN_STEP => LES_MODEL(KTO)%NLES_MEAN_STEP +NLES_MEAN_START => LES_MODEL(KTO)%NLES_MEAN_START +NLES_MEAN_END => LES_MODEL(KTO)%NLES_MEAN_END NSPECTRA_NI=>LES_MODEL(KTO)%NSPECTRA_NI NSPECTRA_NJ=>LES_MODEL(KTO)%NSPECTRA_NJ tles_dates=>les_model(kto)%tles_dates diff --git a/src/MNH/mode_les_diachro.f90 b/src/MNH/mode_les_diachro.f90 index a9dda2c89..8f848f4e9 100644 --- a/src/MNH/mode_les_diachro.f90 +++ b/src/MNH/mode_les_diachro.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. @@ -12,6 +12,7 @@ ! 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) !----------------------------------------------------------------- !####################### MODULE MODE_LES_DIACHRO @@ -524,8 +525,7 @@ END SUBROUTINE LES_TIME_AVG subroutine Les_time_avg_4D( pwork4, tpdates, kresp ) !######################################################## -use modd_les, only: nles_current_times, xles_temp_mean_start, xles_temp_mean_end, xles_temp_mean_step -use modd_parameters, only: XUNDEF +use modd_les_n, only: nles_dtcount, nles_mean_start, nles_mean_end, nles_mean_step, nles_mean_times, nles_times use modd_time, only: tdtseg use modd_type_date, only: date_time @@ -537,60 +537,33 @@ real, dimension(:,:,:,:), allocatable, intent(inout) :: pwork4 ! cont type(date_time), dimension(:), allocatable, intent(inout) :: tpdates integer, intent(out) :: kresp ! return code (0 is ok) !------------------------------------------------------------------------------ -integer :: jt ! time counter -integer :: itime ! nb of avg. points -integer :: iavg ! nb of avg. periods integer :: javg ! loop counter on avg. periods integer :: jk ! vertical loop counter integer :: jp ! process loop counter integer :: jsv ! scalar loop counter -integer :: jx ! first spatial or spectral coordinate loop counter -integer :: jy ! second spatial or spectral coordinate loop counter integer :: jtb, jte -real :: zles_temp_mean_start ! initial and end times -real :: zles_temp_mean_end ! of one avergaing preiod real, dimension(:,:,:,:), allocatable :: zwork4 ! contains averaged physical field !------------------------------------------------------------------------------ -if ( xles_temp_mean_end == XUNDEF & - .or. xles_temp_mean_start == XUNDEF & - .or. xles_temp_mean_step == XUNDEF ) then - kresp = -1 - return -end if - -iavg = Int( xles_temp_mean_end - 1.e-10 - xles_temp_mean_start ) / xles_temp_mean_step + 1 -if ( iavg <= 0 ) then +if ( nles_mean_times == 0 ) then kresp = -1 return end if Deallocate( tpdates ) -Allocate( tpdates(iavg) ) -Allocate( zwork4(Size( pwork4, 1 ), iavg, Size( pwork4, 3 ), Size( pwork4, 4 )) ) +Allocate( tpdates(nles_mean_times) ) +Allocate( zwork4(Size( pwork4, 1 ), nles_mean_times, Size( pwork4, 3 ), Size( pwork4, 4 )) ) zwork4(:, :, :, :) = 0. -do javg = 1, iavg - zles_temp_mean_start = xles_temp_mean_start + (javg - 1) * xles_temp_mean_step - zles_temp_mean_end = Min( xles_temp_mean_end, zles_temp_mean_start + xles_temp_mean_step ) - - jtb = -1 - jte = -2 - do jt = 1, nles_current_times - if ( xles_times(jt) >= zles_temp_mean_start ) then - jtb = jt - exit - end if - end do - do jt = jtb, nles_current_times - if ( xles_times(jt) <= zles_temp_mean_end ) then - jte = jt - else - exit - end if - end do +do javg = 1, nles_mean_times + jtb = ( nles_mean_start + ( javg - 1 ) * nles_mean_step ) / nles_dtcount + jte = MIN( jtb + nles_mean_step / nles_dtcount, nles_mean_end / nles_dtcount, nles_times ) + ! jtb could be 0 if nles_mean_start is smaller than the first LES measurement + ! For example, it occurs if xles_temp_mean_start is smaller than xles_temp_sampling (if xles_temp_mean_start=0.) + ! Do this correction only after computation of jte + if ( jtb < 1 ) jtb = 1 do jp = 1, Size( pwork4, 4 ) do jsv = 1, Size( pwork4, 3 ) @@ -603,12 +576,12 @@ do javg = 1, iavg tpdates(javg)%nyear = tdtseg%nyear tpdates(javg)%nmonth = tdtseg%nmonth tpdates(javg)%nday = tdtseg%nday - tpdates(javg)%xtime = tdtseg%xtime + ( zles_temp_mean_start + zles_temp_mean_end ) / 2. + tpdates(javg)%xtime = tdtseg%xtime + ( xles_times(jtb) + xles_times(jte) ) / 2. call Datetime_correctdate( tpdates(javg) ) end do Deallocate( pwork4 ) -Allocate( pwork4(Size( zwork4, 1 ), iavg, Size( zwork4, 3 ), Size( zwork4, 4 )) ) +Allocate( pwork4(Size( zwork4, 1 ), nles_mean_times, Size( zwork4, 3 ), Size( zwork4, 4 )) ) pwork4 = zwork4 -- GitLab From 6ba00360e6d7fb4cffe09d0109baa339418808f3 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Tue, 22 Mar 2022 14:06:32 +0100 Subject: [PATCH 046/157] Philippe 22/03/2022: correct time_les_avg and time_les_avg_bounds coordinates --- src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 | 35 +++++++++++---------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 b/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 index 2f7836534..ead87ec69 100644 --- a/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 +++ b/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 @@ -28,6 +28,7 @@ ! P. Wautelet 14/01/2021: add IO_Field_write_nc4_N4, IO_Field_partial_write_nc4_N2, ! 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 !----------------------------------------------------------------- #ifdef MNH_IOCDF4 module mode_io_write_nc4 @@ -1450,9 +1451,9 @@ use modd_grid, only: xlatori, xlonori use modd_grid_n, only: lsleve, xxhat, xyhat, xzhat 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, xles_temp_mean_start, xles_temp_mean_end, xles_temp_mean_step, & - xspectra_altitudes -use modd_les_n, only: nles_times, nspectra_ni, nspectra_nj, tles_dates + xles_altitudes, xspectra_altitudes +use modd_les_n, only: nles_dtcount, nles_mean_end, nles_mean_start, nles_mean_step, nles_mean_times, & + 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 @@ -1476,14 +1477,13 @@ character(len=:), allocatable :: yprogram integer :: iiu, iju, iku integer :: id, iid, iresp integer :: imi -integer :: iavg integer :: ji integer :: jt +integer :: jtb, jte integer(kind=cdfint) :: incid logical :: gchangemodel logical :: gdealloc logical, pointer :: gsleve -real :: zles_temp_mean_start, zles_temp_mean_end real, dimension(:), pointer :: zxhat, zyhat, zzhat real, dimension(:), allocatable :: zxhatm, zyhatm, zzhatm !Coordinates at mass points in the transformed space real, dimension(:), allocatable :: zles_levels @@ -1746,31 +1746,34 @@ if ( tpfile%lmaster ) then call Write_time_coord( tpfile%tncdims%tdims(NMNHDIM_BUDGET_LES_TIME), 'time axis for LES budgets', tles_dates ) !Coordinates for the number of LES budget time averages - iavg = int( xles_temp_mean_end - 1.e-10 - xles_temp_mean_start ) / xles_temp_mean_step + 1 !Condition also on nles_times to not create this coordinate when not used (no time average if nles_times=0) - if ( nles_times > 0 .and. iavg > 0 ) then - Allocate( tzdates(iavg) ) - Allocate( tzdates_bound(2, iavg) ) - - do jt = 1, iavg - zles_temp_mean_start = xles_temp_mean_start + ( jt - 1 ) * xles_temp_mean_step - zles_temp_mean_end = Min( xles_temp_mean_end, zles_temp_mean_start + xles_temp_mean_step ) + if ( nles_times > 0 .and. nles_mean_times > 0 ) then + Allocate( tzdates(nles_mean_times) ) + Allocate( tzdates_bound(2, nles_mean_times) ) + + do jt = 1, nles_mean_times + jtb = ( nles_mean_start + ( jt - 1 ) * nles_mean_step ) / nles_dtcount + jte = MIN( jtb + nles_mean_step / nles_dtcount, nles_mean_end / nles_dtcount, nles_times ) + ! jtb could be 0 if nles_mean_start is smaller than the first LES measurement + ! For example, it occurs if xles_temp_mean_start is smaller than xles_temp_sampling (if xles_temp_mean_start=0.) + ! Do this correction only after computation of jte + if ( jtb < 1 ) jtb = 1 tzdates(jt)%nyear = tdtseg%nyear tzdates(jt)%nmonth = tdtseg%nmonth tzdates(jt)%nday = tdtseg%nday - tzdates(jt)%xtime = tdtseg%xtime + ( zles_temp_mean_start + zles_temp_mean_end ) / 2. + tzdates(jt)%xtime = tdtseg%xtime + ( xles_times(jtb) + xles_times(jte) ) / 2. !Not necessary: call Datetime_correctdate( tzdates(jt ) ) tzdates_bound(1, jt)%nyear = tdtseg%nyear tzdates_bound(1, jt)%nmonth = tdtseg%nmonth tzdates_bound(1, jt)%nday = tdtseg%nday - tzdates_bound(1, jt)%xtime = tdtseg%xtime + zles_temp_mean_start + tzdates_bound(1, jt)%xtime = tdtseg%xtime + xles_times(jtb) tzdates_bound(2, jt)%nyear = tdtseg%nyear tzdates_bound(2, jt)%nmonth = tdtseg%nmonth tzdates_bound(2, jt)%nday = tdtseg%nday - tzdates_bound(2, jt)%xtime = tdtseg%xtime + zles_temp_mean_end + tzdates_bound(2, jt)%xtime = tdtseg%xtime + xles_times(jte) end do call Write_time_coord( tpfile%tncdims%tdims(NMNHDIM_BUDGET_LES_AVG_TIME), 'time axis for LES budget time averages', & tzdates, tzdates_bound ) -- GitLab From 0289e2b3a7e4a281e1e092b2de31170dc92c7232 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Thu, 31 Mar 2022 09:35:19 +0200 Subject: [PATCH 047/157] Philippe 31/03/2022: minor: correct comment for NPRO field --- src/LIB/SURCOUCHE/src/mode_field.f90 | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/LIB/SURCOUCHE/src/mode_field.f90 b/src/LIB/SURCOUCHE/src/mode_field.f90 index 6288bf39c..b6f5a6ab7 100644 --- a/src/LIB/SURCOUCHE/src/mode_field.f90 +++ b/src/LIB/SURCOUCHE/src/mode_field.f90 @@ -64,7 +64,6 @@ SUBROUTINE INI_FIELD_LIST() ! Modif ! J.Escobar 25/04/2018: missing def of FRC !------------------------------------------------ -USE MODD_CONF, ONLY: NMODEL CHARACTER(LEN=64) :: YMSG @@ -1307,7 +1306,7 @@ call Add_field2list( TFIELDDATA( & CLONGNAME = 'NPRO', & CUNITS = '', & CDIR = 'XY', & - CCOMMENT = 'X_Y_Z_Nact', & + CCOMMENT = 'X_Y_Z_NPRO', & NGRID = 1, & NTYPE = TYPEREAL, & NDIMS = 3, & -- GitLab From 362ad0b434df11e3bf607ed5c7e52a8cb763037c Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Fri, 1 Apr 2022 09:54:02 +0200 Subject: [PATCH 048/157] Philippe 01/04/2022: bugfix: YAEROLONGNAMES allocation was made in a loop --- src/MNH/ini_nsv.f90 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/MNH/ini_nsv.f90 b/src/MNH/ini_nsv.f90 index 1a9662857..b0064200d 100644 --- a/src/MNH/ini_nsv.f90 +++ b/src/MNH/ini_nsv.f90 @@ -460,6 +460,8 @@ IF (LORILAM.AND.(NEQ .GT. 0)) THEN 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 @@ -1069,8 +1071,6 @@ DO JSV = NSV_AERBEG_A(KMI), NSV_AEREND_A(KMI) WRITE( YNUM3, '( I3.3 )' ) JSV - ALLOCATE( YAEROLONGNAMES(NSV_AER_A(KMI)) ) - !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 -- GitLab From b13e1b6ce2133577a5ce3dcef38e7b259dd4d1e4 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Fri, 1 Apr 2022 10:53:54 +0200 Subject: [PATCH 049/157] Philippe 01/04/2022: add error if CDUMMY1 not set correctly --- src/MNH/read_chem_data_netcdf_case.f90 | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/MNH/read_chem_data_netcdf_case.f90 b/src/MNH/read_chem_data_netcdf_case.f90 index d779c372a..c1511ef3b 100644 --- a/src/MNH/read_chem_data_netcdf_case.f90 +++ b/src/MNH/read_chem_data_netcdf_case.f90 @@ -87,6 +87,7 @@ END MODULE MODI_READ_CHEM_DATA_NETCDF_CASE ! P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg ! P. Wautelet 18/09/2019: correct support of 64bit integers (MNH_INT=8) ! P. Wautelet 09/03/2021: move some chemistry initializations to ini_nsv +! P. Wautelet 01/04/2022: add error if CDUMMY1 not set correctly !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -395,6 +396,9 @@ ELSEIF (CDUMMY1=="18") THEN itimeindex=3 ELSEIF ((CDUMMY1=="24").OR.(CDUMMY1=="00")) THEN itimeindex=4 +ELSE + call Print_msg( NVERB_ERROR, 'GEN', 'READ_CHEM_DATA_NETCDF_CASE', 'CDUMMY1 is not set correctly (or not set at all)' ) + itimeindex=1 ENDIF istart3d(4) = itimeindex ! @@ -423,7 +427,7 @@ enddo istatus = nf90_get_var(incid, ips_varid, ZPSMOZ(:,:), start=istart2d, count=icount2d) if (istatus /= nf90_noerr) call handle_err(istatus) - + !------------------------------------------------------------------------ !* 3 Interpolation of MOZART variable !--------------------------------------------------------------------- @@ -580,7 +584,7 @@ DO JI = 1,IMOZ !for every MNH species existing in MOZ1.nam ENDIF ENDDO ! JNCHEM - DO JNAER = NSV_AERBEG, NSV_AEREND + DO JNAER = NSV_AERBEG, NSV_AEREND IF (trim(CAERONAMES(JNAER-NSV_AERBEG+1))==trim(YSPCMNH(JI))) THEN !MNH mechanism species IF (ISPCMOZ(JI)==1) THEN istatus = nf90_inq_varid(incid, trim(YCHANGE(JI,1)), ind_netcdf) @@ -661,7 +665,7 @@ DO JI = 1,IMOZ !for every MNH species existing in MOZ1.nam ENDIF ENDDO ! JNAER ENDDO ! JIDO JNCHEM = NSV_CHEMBEG, NSV_CHEMEND !loop on all MNH species -DEALLOCATE(YSPCMNH) +DEALLOCATE(YSPCMNH) DEALLOCATE(TZSTOC) DEALLOCATE(ISPCMOZ) DEALLOCATE(ZCOEFMOZART) -- GitLab From 84ebb2632fdb9aab52f22a868423870da87223ae Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Fri, 1 Apr 2022 11:38:38 +0200 Subject: [PATCH 050/157] Philippe 01/04/2022: bugfix: error in the list of aerosols --- src/MNH/ini_nsv.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/MNH/ini_nsv.f90 b/src/MNH/ini_nsv.f90 index b0064200d..63a98e801 100644 --- a/src/MNH/ini_nsv.f90 +++ b/src/MNH/ini_nsv.f90 @@ -1077,7 +1077,7 @@ DO JSV = NSV_AERBEG_A(KMI), NSV_AEREND_A(KMI) !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_BCi, JP_CH_DSTi, JP_CH_DSTj ] ) & + 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, & -- GitLab From c78d6fb1a3ee08deb28e4b6d38933e34ded1c914 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Thu, 7 Apr 2022 14:05:37 +0200 Subject: [PATCH 051/157] Philippe 07/04/2022: rewrite types for stations --- src/LIB/SURCOUCHE/src/mode_io_tools_nc4.f90 | 4 +- src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 | 4 +- src/MNH/ini_stationn.f90 | 69 ++--- src/MNH/ini_surfstationn.f90 | 212 +++++++------- src/MNH/modd_stationn.f90 | 29 +- src/MNH/modd_type_station.f90 | 122 ++++---- src/MNH/station_reader.f90 | 71 ++--- src/MNH/stationn.f90 | 206 +++++++------- src/MNH/write_stationn.f90 | 295 ++++++++++---------- 9 files changed, 480 insertions(+), 532 deletions(-) diff --git a/src/LIB/SURCOUCHE/src/mode_io_tools_nc4.f90 b/src/LIB/SURCOUCHE/src/mode_io_tools_nc4.f90 index 22fa1c5db..465f3bf2f 100644 --- a/src/LIB/SURCOUCHE/src/mode_io_tools_nc4.f90 +++ b/src/LIB/SURCOUCHE/src/mode_io_tools_nc4.f90 @@ -282,7 +282,7 @@ use modd_profiler_n, only: numbprofiler, tprofiler 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: numbstat, tstations_time TYPE(TFILEDATA),INTENT(INOUT) :: TPFILE CHARACTER(LEN=*),OPTIONAL,INTENT(IN) :: HPROGRAM_ORIG !To emulate a file coming from this program @@ -429,7 +429,7 @@ if ( tpfile%ctype == 'MNHDIACHRONIC' ) then !Dimension for the number of station times if ( numbstat > 0 ) then - istation = Nint ( ( xseglen - dyn_model(1)%xtstep ) / tstation%step ) + 1 + 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 diff --git a/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 b/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 index ead87ec69..0900e7163 100644 --- a/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 +++ b/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 @@ -1459,7 +1459,7 @@ use modd_parameters, only: jphext, JPVEXT use modd_profiler_n, only: numbprofiler, tprofiler use modd_series, only: lseries use modd_series_n, only: nsnbstept, tpsdates -use modd_station_n, only: numbstat, tstation +use modd_station_n, only: numbstat, tstations_time use modd_time, only: tdtseg use modd_time_n, only: tdtcur use modd_type_date, only: date_time @@ -1841,7 +1841,7 @@ if ( tpfile%lmaster ) then !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 ) + 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 diff --git a/src/MNH/ini_stationn.f90 b/src/MNH/ini_stationn.f90 index 8bfe8866f..8e675165b 100644 --- a/src/MNH/ini_stationn.f90 +++ b/src/MNH/ini_stationn.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. @@ -59,9 +59,9 @@ !! MODIFICATIONS !! ------------- !! Original 15/01/2002 -!! Modification: 02/2021 (E.Jezequel) Read stations from CVS file -!! -!! -------------------------------------------------------------------------- +! E. Jezequel 02/2021: read stations from CVS file +! P. Wautelet 07/04/2022: rewrite types for stations +! -------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ @@ -86,59 +86,40 @@ IMPLICIT NONE INTEGER :: JI ! !---------------------------------------------------------------------------- -! -!* 1. Nameliste -! --------- - IF (CFILE_STAT=="NO_INPUT_CSV") THEN +! +!* 1. Namelist +! -------- 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 - ! + ALLOCATE( TSTATIONS(NUMBSTAT) ) + 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) + TSTATIONS(JI)%XX = XX_STAT(JI) + TSTATIONS(JI)%XY = XY_STAT(JI) + TSTATIONS(JI)%XZ = XZ_STAT(JI) + TSTATIONS(JI)%CNAME = CNAME_STAT(JI) + TSTATIONS(JI)%CTYPE = 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) + TSTATIONS(JI)%XLAT = XLAT_STAT(JI) + TSTATIONS(JI)%XLON = XLON_STAT(JI) + TSTATIONS(JI)%XZ = XZ_STAT(JI) + TSTATIONS(JI)%CNAME = CNAME_STAT(JI) + TSTATIONS(JI)%CTYPE = CTYPE_STAT(JI) END DO - ENDIF - ENDIF + END IF + END IF ELSE ! !* 2. CSV DATA ! - CALL READ_CSV_STATION(CFILE_STAT,TSTATION,LCARTESIAN) - TSTATION%STEP = XSTEP_STAT -END IF + CALL READ_CSV_STATION( CFILE_STAT, TSTATIONS, LCARTESIAN ) +END IF + +TSTATIONS_TIME%XTSTEP = XSTEP_STAT -! END SUBROUTINE INI_STATION_n diff --git a/src/MNH/ini_surfstationn.f90 b/src/MNH/ini_surfstationn.f90 index 5b79bb289..013c342be 100644 --- a/src/MNH/ini_surfstationn.f90 +++ b/src/MNH/ini_surfstationn.f90 @@ -63,13 +63,14 @@ 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 07/04/2022: rewrite types for stations +! -------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ @@ -80,7 +81,6 @@ 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 @@ -115,23 +115,20 @@ INTEGER, INTENT(IN) :: KMI ! MODEL NUMBER ! 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) +CALL DEFAULT_STATION_n() ! ! !* 3. Stations initialization ! ----------------------- ! -CALL INI_STATION_n +CALL INI_STATION_n() LSTATION = (NUMBSTAT>0) ! !---------------------------------------------------------------------------- @@ -140,135 +137,122 @@ LSTATION = (NUMBSTAT>0) ! ----------------------------- ! IF(NUMBSTAT>0) THEN - CALL ALLOCATE_STATION_n(TSTATION,KMI) - IF (.NOT. LCARTESIAN) CALL INI_INTERP_STATION_n(TSTATION) + CALL ALLOCATE_STATION_n() + IF (.NOT. LCARTESIAN) CALL INI_INTERP_STATION_n() ENDIF !---------------------------------------------------------------------------- ! CONTAINS ! !---------------------------------------------------------------------------- -SUBROUTINE DEFAULT_STATION_n(TSTATION) -! -TYPE(STATION), INTENT(INOUT) :: TSTATION +SUBROUTINE DEFAULT_STATION_n() + +USE MODD_DYN_N, ONLY: XTSTEP ! NUMBSTAT = 0 -! -TSTATION%T_CUR = XUNDEF -TSTATION%N_CUR = 0 -TSTATION%STEP = XTSTEP +TSTATIONS_TIME%XTSTEP = 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 +SUBROUTINE ALLOCATE_STATION_n() + +INTEGER :: JI + +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 ( ( PSEGLEN - DYN_MODEL(1)%XTSTEP ) / TSTATIONS_TIME%XTSTEP ) + 1 + +allocate( tstations_time%tpdates(istore) ) + +DO JI = 1, NUMBSTAT + ALLOCATE(TSTATIONS(JI)%XZON (ISTORE)) + ALLOCATE(TSTATIONS(JI)%XMER (ISTORE)) + ALLOCATE(TSTATIONS(JI)%XW (ISTORE)) + ALLOCATE(TSTATIONS(JI)%XP (ISTORE)) + IF (OUSETKE) THEN + ALLOCATE(TSTATIONS(JI)%XTKE (ISTORE)) + ELSE + ALLOCATE(TSTATIONS(JI)%XTKE (0)) + END IF + ALLOCATE(TSTATIONS(JI)%XTH (ISTORE)) + ALLOCATE(TSTATIONS(JI)%XR (ISTORE,KRR)) + ALLOCATE(TSTATIONS(JI)%XSV (ISTORE,KSV)) + ALLOCATE(TSTATIONS(JI)%XTSRAD (ISTORE)) + ALLOCATE(TSTATIONS(JI)%XT2M (ISTORE)) + ALLOCATE(TSTATIONS(JI)%XQ2M (ISTORE)) + ALLOCATE(TSTATIONS(JI)%XHU2M (ISTORE)) + ALLOCATE(TSTATIONS(JI)%XZON10M(ISTORE)) + ALLOCATE(TSTATIONS(JI)%XMER10M(ISTORE)) + ALLOCATE(TSTATIONS(JI)%XRN (ISTORE)) + ALLOCATE(TSTATIONS(JI)%XH (ISTORE)) + ALLOCATE(TSTATIONS(JI)%XLE (ISTORE)) + ALLOCATE(TSTATIONS(JI)%XLEI (ISTORE)) + ALLOCATE(TSTATIONS(JI)%XGFLUX (ISTORE)) + ALLOCATE(TSTATIONS(JI)%XSWD (ISTORE)) + ALLOCATE(TSTATIONS(JI)%XSWU (ISTORE)) + ALLOCATE(TSTATIONS(JI)%XLWD (ISTORE)) + ALLOCATE(TSTATIONS(JI)%XLWU (ISTORE)) + ALLOCATE(TSTATIONS(JI)%XSWDIR (ISTORE)) + ALLOCATE(TSTATIONS(JI)%XSWDIFF(ISTORE)) + ALLOCATE(TSTATIONS(JI)%XDSTAOD(ISTORE)) + ALLOCATE(TSTATIONS(JI)%XSFCO2 (ISTORE)) + + TSTATIONS(JI)%XZON(:) = XUNDEF + TSTATIONS(JI)%XMER(:) = XUNDEF + TSTATIONS(JI)%XW(:) = XUNDEF + TSTATIONS(JI)%XP(:) = XUNDEF + TSTATIONS(JI)%XTKE(:) = XUNDEF + TSTATIONS(JI)%XTH(:) = XUNDEF + TSTATIONS(JI)%XR(:,:) = XUNDEF + TSTATIONS(JI)%XSV(:,:) = XUNDEF + TSTATIONS(JI)%XTSRAD(:) = XUNDEF + TSTATIONS(JI)%XT2M(:) = XUNDEF + TSTATIONS(JI)%XQ2M(:) = XUNDEF + TSTATIONS(JI)%XHU2M(:) = XUNDEF + TSTATIONS(JI)%XZON10M(:) = XUNDEF + TSTATIONS(JI)%XMER10M(:) = XUNDEF + TSTATIONS(JI)%XRN(:) = XUNDEF + TSTATIONS(JI)%XH(:) = XUNDEF + TSTATIONS(JI)%XLE(:) = XUNDEF + TSTATIONS(JI)%XLEI(:) = XUNDEF + TSTATIONS(JI)%XGFLUX(:) = XUNDEF + TSTATIONS(JI)%XSWD(:) = XUNDEF + TSTATIONS(JI)%XSWU(:) = XUNDEF + TSTATIONS(JI)%XLWD(:) = XUNDEF + TSTATIONS(JI)%XLWU(:) = XUNDEF + TSTATIONS(JI)%XSWDIR(:) = XUNDEF + TSTATIONS(JI)%XSWDIFF(:) = XUNDEF + TSTATIONS(JI)%XDSTAOD(:) = XUNDEF + TSTATIONS(JI)%XSFCO2(:) = XUNDEF +END DO -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)) -! -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 -! END SUBROUTINE ALLOCATE_STATION_n !---------------------------------------------------------------------------- !---------------------------------------------------------------------------- -SUBROUTINE INI_INTERP_STATION_n(TSTATION) +SUBROUTINE INI_INTERP_STATION_n() ! -TYPE(STATION), INTENT(INOUT) :: TSTATION ! -INTEGER :: JII ! -INTEGER :: IIU, IJU ! +INTEGER :: JII +INTEGER :: IIU, IJU ! -IF ( ALL(TSTATION%LAT(:)/=XUNDEF) .AND. ALL(TSTATION%LON(:)/=XUNDEF) ) THEN - DO JII=1,NUMBSTAT +IF ( ALL(TSTATIONS(:)%XLAT /= XUNDEF) .AND. ALL(TSTATIONS(:)%XLON /= 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 + TSTATIONS(JII)%XLAT, TSTATIONS(JII)%XLON, & + TSTATIONS(JII)%XX, TSTATIONS(JII)%XY ) + END DO 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','') + CMNHMSG(1) = 'Error in station position' + CMNHMSG(1) = 'either LATitude or LONgitude segment' + CMNHMSG(1) = 'or I and J segment' + CMNHMSG(1) = 'definition is not complete.' + CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_SURFSTATION_n' ) END IF -! -TSTATION%STEP = MAX ( PTSTEP, TSTATION%STEP ) -! -! + END SUBROUTINE INI_INTERP_STATION_n !---------------------------------------------------------------------------- !---------------------------------------------------------------------------- diff --git a/src/MNH/modd_stationn.f90 b/src/MNH/modd_stationn.f90 index fe16b7697..ff5351dee 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,14 +29,16 @@ !! MODIFICATIONS !! ------------- !! Original 15/01/02 +! P. Wautelet 07/04/2022: rewrite types for stations !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ ! ! -USE MODD_TYPE_STATION USE MODD_PARAMETERS, ONLY: JPMODELMAX +USE MODD_TYPE_STATION + IMPLICIT NONE TYPE STATION_t @@ -52,7 +49,8 @@ TYPE STATION_t INTEGER :: NUMBSTAT ! number of stations LOGICAL :: LSTATLAT ! positioning in lat/lon ! - TYPE(STATION) :: TSTATION ! characteristics and records of a station + TYPE(TSTATIONTIME) :: TSTATIONS_TIME + TYPE(TSTATIONDATA), DIMENSION(:), POINTER :: TSTATIONS ! characteristics and records of the stations ! END TYPE STATION_t @@ -61,7 +59,8 @@ 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() +TYPE(TSTATIONTIME), POINTER :: TSTATIONS_TIME => NULL() +TYPE(TSTATIONDATA), DIMENSION(:), POINTER :: TSTATIONS => NULL() CONTAINS @@ -69,12 +68,14 @@ 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 => STATION_MODEL(KTO)%NUMBSTAT +LSTATLAT => STATION_MODEL(KTO)%LSTATLAT +TSTATIONS_TIME => STATION_MODEL(KTO)%TSTATIONS_TIME +TSTATIONS => STATION_MODEL(KTO)%TSTATIONS END SUBROUTINE STATION_GOTO_MODEL diff --git a/src/MNH/modd_type_station.f90 b/src/MNH/modd_type_station.f90 index 3456ac2d2..b929d28d4 100644 --- a/src/MNH/modd_type_station.f90 +++ b/src/MNH/modd_type_station.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. @@ -30,74 +30,72 @@ !! ------------- !! Original 15/01/02 ! P. Wautelet 13/09/2019: budget: simplify and modernize date/time management +! P. Wautelet 07/04/2022: rewrite types for stations !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ ! -! -use modd_type_date, only: date_time +use modd_type_date, only: date_time +use modd_parameters, only: NUNDEF, XUNDEF 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) +private + +public :: TSTATIONTIME, TSTATIONDATA + +TYPE TSTATIONTIME + REAL :: XTIME_CUR = XUNDEF ! current time since last storage + 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 TSTATIONTIME + +TYPE TSTATIONDATA +! Type to store all the data of 1 station +CHARACTER(LEN=8) :: CNAME = '' ! station name +CHARACTER(LEN=8) :: CTYPE = '' ! station type (currently not used) +LOGICAL :: LERROR = .FALSE. ! + +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) +REAL :: XZS = XUNDEF ! zs(n) + +INTEGER :: NK = NUNDEF ! Model level for altitude comparisons + +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 :: XT2M +REAL, DIMENSION(:), ALLOCATABLE :: XQ2M +REAL, DIMENSION(:), ALLOCATABLE :: XHU2M +REAL, DIMENSION(:), ALLOCATABLE :: XZON10M +REAL, DIMENSION(:), ALLOCATABLE :: XMER10M +REAL, DIMENSION(:), ALLOCATABLE :: XRN +REAL, DIMENSION(:), ALLOCATABLE :: XH +REAL, DIMENSION(:), ALLOCATABLE :: XLE +REAL, DIMENSION(:), ALLOCATABLE :: XLEI +REAL, DIMENSION(:), ALLOCATABLE :: XGFLUX +REAL, DIMENSION(:), ALLOCATABLE :: XSWD +REAL, DIMENSION(:), ALLOCATABLE :: XSWU +REAL, DIMENSION(:), ALLOCATABLE :: XLWD +REAL, DIMENSION(:), ALLOCATABLE :: XLWU +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 -END TYPE STATION -! END MODULE MODD_TYPE_STATION diff --git a/src/MNH/station_reader.f90 b/src/MNH/station_reader.f90 index 0f6b74663..3e7741e8b 100644 --- a/src/MNH/station_reader.f90 +++ b/src/MNH/station_reader.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. @@ -9,11 +9,11 @@ ! 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 +SUBROUTINE READ_CSV_STATION( HFILE, TPSTATIONS, OCARTESIAN ) +USE MODD_STATION_n +CHARACTER(LEN=*), INTENT(IN) :: HFILE ! file to read +TYPE(TSTATIONDATA), DIMENSION(:), POINTER, INTENT(INOUT) :: TPSTATIONS +LOGICAL, INTENT(IN) :: OCARTESIAN END SUBROUTINE READ_CSV_STATION ! END INTERFACE @@ -21,7 +21,7 @@ END INTERFACE END MODULE MODI_STATION_READER !------------------------------------------------------------------- ! -!!**** *EOL_READER* - +!!**** *READ_CSV_STATION* - !! !! PURPOSE !! ------- @@ -29,16 +29,16 @@ END MODULE MODI_STATION_READER !! !! AUTHOR !! ------ -!! E. Jézéquel *CNRM & IFPEN* +!! E. Jezequel *CNRM & IFPEN* !! !! MODIFICATIONS !! ------------- !! 03/2020 Original -!! -!!--------------------------------------------------------------- +! P. Wautelet 07/04/2022: rewrite types for stations +!--------------------------------------------------------------- ! !######################################################### -SUBROUTINE READ_CSV_STATION(HFILE,TPSTATION,OCARTESIAN) +SUBROUTINE READ_CSV_STATION( HFILE, TPSTATIONS, OCARTESIAN ) USE MODD_ALLSTATION_n USE MODD_STATION_n USE MODD_PARAMETERS @@ -46,15 +46,15 @@ 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 +CHARACTER(LEN=*), INTENT(IN) :: HFILE ! file to read +TYPE(TSTATIONDATA), DIMENSION(:), POINTER, INTENT(INOUT) :: TPSTATIONS +LOGICAL, INTENT(IN) :: OCARTESIAN ! -INTEGER :: INBLINE ! Nb of line in csv file +INTEGER :: INBLINE ! Nb of line in csv file ! -CHARACTER(LEN=80) :: YERROR -CHARACTER(LEN=400) :: YSTRING -INTEGER :: ILU ! logical unit of the file +CHARACTER(LEN=80) :: YERROR +CHARACTER(LEN=400) :: YSTRING +INTEGER :: ILU ! logical unit of the file ! ! Open file @@ -76,39 +76,22 @@ END DO YERROR = 'Data not found in file : '//TRIM(HFILE) PRINT*, YERROR ELSE - ! Save number of station + ! Save number of stations 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 + ALLOCATE( TPSTATIONS(NUMBSTAT) ) + + ! New reading REWIND(ILU) - READ(ILU,FMT='(A400)') YSTRING ! Lecture du header + READ(ILU,FMT='(A400)') YSTRING ! Reading of 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)!,& + READ(YSTRING,*) TPSTATIONS(INBLINE)%CNAME, & !TPSTATIONS(INBLINE)%CTYPE,& + TPSTATIONS(INBLINE)%XX, TPSTATIONS(INBLINE)%XY, TPSTATIONS(INBLINE)%XZ END DO REWIND(ILU) CLOSE(ILU) @@ -117,8 +100,8 @@ END DO 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)!,& + READ(YSTRING,*) TPSTATIONS(INBLINE)%CNAME, & !TPSTATIONS(INBLINE)%CTYPE,& + TPSTATIONS(INBLINE)%XLAT, TPSTATIONS(INBLINE)%XLON, TPSTATIONS(INBLINE)%XZ END DO REWIND(ILU) CLOSE(ILU) diff --git a/src/MNH/stationn.f90 b/src/MNH/stationn.f90 index 4de047e71..92105242e 100644 --- a/src/MNH/stationn.f90 +++ b/src/MNH/stationn.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2002-2020 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. @@ -72,14 +72,15 @@ 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/J 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 07/04/2022: rewrite types for stations ! ! -------------------------------------------------------------------------- ! @@ -185,27 +186,27 @@ ZYHATM( IJU )=1.5*PYHAT( IJU )-0.5*PYHAT( IJU-1) !* 3.4 instant of storage ! ------------------ ! -IF ( TSTATION%T_CUR == XUNDEF ) TSTATION%T_CUR = TSTATION%STEP - PTSTEP +IF ( TSTATIONS_TIME%XTIME_CUR == XUNDEF ) TSTATIONS_TIME%XTIME_CUR = TSTATIONS_TIME%XTSTEP - PTSTEP ! -TSTATION%T_CUR = TSTATION%T_CUR + PTSTEP +TSTATIONS_TIME%XTIME_CUR = TSTATIONS_TIME%XTIME_CUR + PTSTEP ! -IF ( TSTATION%T_CUR >= TSTATION%STEP - 1.E-10 ) THEN +IF ( TSTATIONS_TIME%XTIME_CUR >= TSTATIONS_TIME%XTSTEP - 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 + TSTATIONS_TIME%XTIME_CUR = TSTATIONS_TIME%XTIME_CUR - TSTATIONS_TIME%XTSTEP + TSTATIONS_TIME%N_CUR = TSTATIONS_TIME%N_CUR + 1 + IN = TSTATIONS_TIME%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 + tstations_time%tpdates(in)%date%year = tdtexp%date%year + tstations_time%tpdates(in)%date%month = tdtexp%date%month + tstations_time%tpdates(in)%date%day = tdtexp%date%day + tstations_time%tpdates(in)%xtime = tdtexp%xtime + ( in - 1 ) * tstation%step #else - tstation%tpdates(in) = tdtcur + tstations_time%tpdates(in) = tdtcur #endif END IF ! @@ -236,7 +237,6 @@ IF (GSTATFIRSTCALL) THEN ZYCOEF(:) =XUNDEF ZVCOEF(:) =XUNDEF -! DO I=1,NUMBSTAT ! ZTHIS_PROCS(I)=0. @@ -244,21 +244,21 @@ IF (GSTATFIRSTCALL) THEN !* 4.1 X position ! ---------- ! - IU(I)=COUNT( PXHAT (:)<=TSTATION%X(I) ) - II(I)=COUNT( ZXHATM(:)<=TSTATION%X(I) ) + IU(I)=COUNT( PXHAT (:)<=TSTATIONS(I)%XX ) + II(I)=COUNT( ZXHATM(:)<=TSTATIONS(I)%XX ) ! - 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. + IF (II(I)<=IIB-1 .AND. LWEST_ll() .AND. .NOT. L1D) TSTATIONS(I)%LERROR=.TRUE. + IF (II(I)>=IIE .AND. LEAST_ll() .AND. .NOT. L1D) TSTATIONS(I)%LERROR=.TRUE. ! ! !* 4.2 Y position ! ---------- ! - IV(I)=COUNT( PYHAT (:)<=TSTATION%Y(I) ) - IJ(I)=COUNT( ZYHATM(:)<=TSTATION%Y(I) ) + IV(I)=COUNT( PYHAT (:)<=TSTATIONS(I)%XY ) + IJ(I)=COUNT( ZYHATM(:)<=TSTATIONS(I)%XY ) ! - 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. + IF (IJ(I)<=IJB-1 .AND. LSOUTH_ll() .AND. .NOT. L1D) TSTATIONS(I)%LERROR=.TRUE. + IF (IJ(I)>=IJE .AND. LNORTH_ll() .AND. .NOT. L1D) TSTATIONS(I)%LERROR=.TRUE. ! ! !* 4.3 Position of station according to processors @@ -272,7 +272,7 @@ IF (GSTATFIRSTCALL) THEN ! -------------------------------------- ZXCOEF(I) = 0. ZYCOEF(I) = 0. - ZUCOEF(I) = 0. + ZUCOEF(I) = 0. ZVCOEF(I) = 0. IF (ZTHIS_PROCS(I) >0. .AND. .NOT. L1D) THEN !---------------------------------------------------------------------------- @@ -280,14 +280,14 @@ IF (GSTATFIRSTCALL) THEN !* 6.1 Interpolation coefficient for X ! ------------------------------- ! - ZXCOEF(I) = (TSTATION%X(I) - ZXHATM(II(I))) / (ZXHATM(II(I)+1) - ZXHATM(II(I))) + ZXCOEF(I) = (TSTATIONS(I)%XX - 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))) + ZYCOEF(I) = (TSTATIONS(I)%XY - ZYHATM(IJ(I))) / (ZYHATM(IJ(I)+1) - ZYHATM(IJ(I))) ! !------------------------------------------------------------------- ! @@ -297,13 +297,13 @@ IF (GSTATFIRSTCALL) THEN !* 7.1 Interpolation coefficient for X (for U) ! ------------------------------- ! - ZUCOEF(I) = (TSTATION%X(I) - PXHAT(IU(I))) / (PXHAT(IU(I)+1) - PXHAT(IU(I))) + ZUCOEF(I) = (TSTATIONS(I)%XX - 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))) + ZVCOEF(I) = (TSTATIONS(I)%XY - PYHAT(IV(I))) / (PYHAT(IV(I)+1) - PYHAT(IV(I))) ! ! @@ -318,70 +318,70 @@ END IF 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 + IF ((ZTHIS_PROCS(I)==1.).AND.(.NOT. TSTATIONS(I)%LERROR)) THEN + IF (TSTATIONS(I)%NK/= XUNDEF) THEN + J = TSTATIONS(I)%NK + ELSE ! suppose TSTATIONS(I)%XZ /= XUNDEF J=1 DO WHILE ((STATION_INTERP_2D(PZ(:,:,J))-STATION_INTERP_2D(PZ(:,:,2))) & - < TSTATION%Z(I)) + < TSTATIONS(I)%XZ) 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 + IF (((STATION_INTERP_2D(PZ(:,:,J))-STATION_INTERP_2D(PZ(:,:,2)))-TSTATIONS(I)%XZ)>& + (TSTATIONS(I)%XZ-(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)) + TSTATIONS(I)%XZON (IN) = STATION_INTERP_2D_U(PU(:,:,J)) + TSTATIONS(I)%XMER (IN) = 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) + ZGAM = (XRPK * (TSTATIONS(I)%XLON - XLON0) - XBETA)*(XPI/180.) + TSTATIONS(I)%XZON (IN) = ZU_STAT * COS(ZGAM) + ZV_STAT * SIN(ZGAM) + TSTATIONS(I)%XMER (IN) = - 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)) + TSTATIONS(I)%XW (IN) = STATION_INTERP_2D(PW(:,:,J)) + TSTATIONS(I)%XTH (IN) = STATION_INTERP_2D(PTH(:,:,J)) + TSTATIONS(I)%XP (IN) = STATION_INTERP_2D(PP(:,:,J)) ! DO JSV=1,SIZE(PR,4) - TSTATION%R (IN,I,JSV) = STATION_INTERP_2D(PR(:,:,J,JSV)) + TSTATIONS(I)%XR (IN,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)) + TSTATIONS(I)%XSV (IN,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 (SIZE(PTKE)>0) TSTATIONS(I)%XTKE (IN) = STATION_INTERP_2D(PTKE(:,:,J)) + IF (SIZE(PTS) >0) TSTATIONS(I)%XTSRAD(IN) = STATION_INTERP_2D(PTS) + TSTATIONS(I)%XZS = 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 ) + TSTATIONS(I)%XZON10M(IN) = STATION_INTERP_2D(XCURRENT_ZON10M) + TSTATIONS(I)%XMER10M(IN) = STATION_INTERP_2D(XCURRENT_MER10M) + TSTATIONS(I)%XT2M (IN) = STATION_INTERP_2D(XCURRENT_T2M ) + TSTATIONS(I)%XQ2M (IN) = STATION_INTERP_2D(XCURRENT_Q2M ) + TSTATIONS(I)%XHU2M (IN) = STATION_INTERP_2D(XCURRENT_HU2M ) + TSTATIONS(I)%XRN (IN) = STATION_INTERP_2D(XCURRENT_RN ) + TSTATIONS(I)%XH (IN) = STATION_INTERP_2D(XCURRENT_H ) + TSTATIONS(I)%XLE (IN) = STATION_INTERP_2D(XCURRENT_LE ) + TSTATIONS(I)%XLEI (IN) = STATION_INTERP_2D(XCURRENT_LEI ) + TSTATIONS(I)%XGFLUX (IN) = 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) + TSTATIONS(I)%XSWD (IN) = STATION_INTERP_2D(XCURRENT_SWD ) + TSTATIONS(I)%XSWU (IN) = STATION_INTERP_2D(XCURRENT_SWU ) + TSTATIONS(I)%XLWD (IN) = STATION_INTERP_2D(XCURRENT_LWD ) + TSTATIONS(I)%XLWU (IN) = STATION_INTERP_2D(XCURRENT_LWU ) + TSTATIONS(I)%XSWDIR (IN) = STATION_INTERP_2D(XCURRENT_SWDIR ) + TSTATIONS(I)%XSWDIFF(IN) = STATION_INTERP_2D(XCURRENT_SWDIFF) + TSTATIONS(I)%XDSTAOD(IN) = STATION_INTERP_2D(XCURRENT_DSTAOD) ENDIF - TSTATION%SFCO2 (IN,I) = STATION_INTERP_2D(XCURRENT_SFCO2 ) + TSTATIONS(I)%XSFCO2 (IN) = STATION_INTERP_2D(XCURRENT_SFCO2 ) ENDIF - + ! END IF ! @@ -393,48 +393,48 @@ IF (GSTORE) THEN !* 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)) + CALL DISTRIBUTE_STATION(TSTATIONS(I)%XX ) + CALL DISTRIBUTE_STATION(TSTATIONS(I)%XY ) + CALL DISTRIBUTE_STATION(TSTATIONS(I)%XZ ) + CALL DISTRIBUTE_STATION(TSTATIONS(I)%XLON ) + CALL DISTRIBUTE_STATION(TSTATIONS(I)%XLAT ) + CALL DISTRIBUTE_STATION(TSTATIONS(I)%XZON (IN)) + CALL DISTRIBUTE_STATION(TSTATIONS(I)%XMER (IN)) + CALL DISTRIBUTE_STATION(TSTATIONS(I)%XW (IN)) + CALL DISTRIBUTE_STATION(TSTATIONS(I)%XP (IN)) + CALL DISTRIBUTE_STATION(TSTATIONS(I)%XTH (IN)) DO JSV=1,SIZE(PR,4) - CALL DISTRIBUTE_STATION(TSTATION%R (IN,I,JSV)) + CALL DISTRIBUTE_STATION(TSTATIONS(I)%XR (IN,JSV)) END DO DO JSV=1,SIZE(PSV,4) - CALL DISTRIBUTE_STATION(TSTATION%SV (IN,I,JSV)) + CALL DISTRIBUTE_STATION(TSTATIONS(I)%XSV (IN,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 (SIZE(PTKE)>0) CALL DISTRIBUTE_STATION(TSTATIONS(I)%XTKE (IN)) + IF (SIZE(PTS) >0) CALL DISTRIBUTE_STATION(TSTATIONS(I)%XTSRAD(IN)) + CALL DISTRIBUTE_STATION(TSTATIONS(I)%XZS ) 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)) + CALL DISTRIBUTE_STATION(TSTATIONS(I)%XT2M (IN)) + CALL DISTRIBUTE_STATION(TSTATIONS(I)%XQ2M (IN)) + CALL DISTRIBUTE_STATION(TSTATIONS(I)%XHU2M (IN)) + CALL DISTRIBUTE_STATION(TSTATIONS(I)%XZON10M (IN)) + CALL DISTRIBUTE_STATION(TSTATIONS(I)%XMER10M (IN)) + CALL DISTRIBUTE_STATION(TSTATIONS(I)%XRN (IN)) + CALL DISTRIBUTE_STATION(TSTATIONS(I)%XH (IN)) + CALL DISTRIBUTE_STATION(TSTATIONS(I)%XLE (IN)) + CALL DISTRIBUTE_STATION(TSTATIONS(I)%XLEI (IN)) + CALL DISTRIBUTE_STATION(TSTATIONS(I)%XGFLUX (IN)) 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)) + CALL DISTRIBUTE_STATION(TSTATIONS(I)%XSWD (IN)) + CALL DISTRIBUTE_STATION(TSTATIONS(I)%XSWU (IN)) + CALL DISTRIBUTE_STATION(TSTATIONS(I)%XLWD (IN)) + CALL DISTRIBUTE_STATION(TSTATIONS(I)%XLWU (IN)) + CALL DISTRIBUTE_STATION(TSTATIONS(I)%XSWDIR (IN)) + CALL DISTRIBUTE_STATION(TSTATIONS(I)%XSWDIFF (IN)) + CALL DISTRIBUTE_STATION(TSTATIONS(I)%XDSTAOD (IN)) END IF - CALL DISTRIBUTE_STATION(TSTATION%SFCO2 (IN,I)) + CALL DISTRIBUTE_STATION(TSTATIONS(I)%XSFCO2 (IN)) ENDIF - ! + ENDDO ! END IF diff --git a/src/MNH/write_stationn.f90 b/src/MNH/write_stationn.f90 index 8d6d36ec6..0746c64d2 100644 --- a/src/MNH/write_stationn.f90 +++ b/src/MNH/write_stationn.f90 @@ -56,11 +56,12 @@ END MODULE MODI_WRITE_STATION_n !! MODIFICATIONS !! ------------- !! Original 15/02/2002 -!! 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/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 07/04/2022: rewrite types for stations ! -------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -75,7 +76,7 @@ USE MODD_NSV, ONLY: tsvlist, nsv, nsv_aer, nsv_aerbeg, nsv_aerend, & nsv_dst, nsv_dstbeg, nsv_dstend, nsv_slt, nsv_sltbeg, nsv_sltend USE MODD_PARAM_n, ONLY: CRAD, CSURF USE MODD_PARAMETERS, ONLY: XUNDEF -USE MODD_STATION_n, only: NUMBSTAT, STATION, TSTATION +USE MODD_STATION_n, only: NUMBSTAT, TSTATIONS ! USE MODE_AERO_PSD USE MODE_DUST_PSD @@ -94,12 +95,11 @@ 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) +DO II = 1, NUMBSTAT + CALL STATION_DIACHRO_n( TSTATIONS(II) ) ENDDO ! !---------------------------------------------------------------------------- @@ -111,14 +111,15 @@ CONTAINS !---------------------------------------------------------------------------- ! !---------------------------------------------------------------------------- -SUBROUTINE STATION_DIACHRO_n(TSTATION,II) +SUBROUTINE STATION_DIACHRO_n( TPSTATION ) 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, & tfieldmetadata_base, TYPEREAL +use modd_station_n, only: tstations_time +use modd_type_station, only: tstationdata -TYPE(STATION), INTENT(IN) :: TSTATION -INTEGER, INTENT(IN) :: II +TYPE(TSTATIONDATA), INTENT(IN) :: TPSTATION ! !* 0.2 declaration of local variables for diachro ! @@ -144,13 +145,13 @@ type(tbudiachrometadata) :: tzbudiachro type(tfieldmetadata_base), dimension(:), allocatable :: tzfields ! !---------------------------------------------------------------------------- -IF (TSTATION%X(II)==XUNDEF) RETURN -IF (TSTATION%Y(II)==XUNDEF) RETURN +IF (TPSTATION%XX==XUNDEF) RETURN +IF (TPSTATION%XY==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 (TPSTATION%XX==XUNDEF) IPROC = IPROC + 2 +IF (SIZE(TPSTATION%XTKE )>0) IPROC = IPROC + 1 IF (LDIAG_SURFRAD) THEN IF(CSURF=="EXTE") IPROC = IPROC + 10 IF(CRAD/="NONE") IPROC = IPROC + 7 @@ -158,17 +159,17 @@ 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 (ANY(TPSTATION%XTSRAD(:)/=XUNDEF)) IPROC = IPROC + 1 +IF (ANY(TPSTATION%XSFCO2(:)/=XUNDEF)) IPROC = IPROC + 1 ! -ALLOCATE (ZWORK6(1,1,1,SIZE(tstation%tpdates),1,IPROC)) +ALLOCATE (ZWORK6(1,1,1,SIZE(tstations_time%tpdates),1,IPROC)) ALLOCATE (YCOMMENT(IPROC)) ALLOCATE (YTITLE (IPROC)) ALLOCATE (YUNIT (IPROC)) ALLOCATE (IGRID (IPROC)) ! IGRID = 1 -YGROUP = TSTATION%NAME(II) +YGROUP = TPSTATION%CNAME JPROC = 0 ! !---------------------------------------------------------------------------- @@ -177,227 +178,227 @@ JPROC = JPROC + 1 YTITLE (JPROC) = 'ZS' YUNIT (JPROC) = 'm' YCOMMENT (JPROC) = 'Orography' -ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%ZS(II) +ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XZS ! JPROC = JPROC + 1 YTITLE (JPROC) = 'P' YUNIT (JPROC) = 'Pa' -YCOMMENT (JPROC) = 'Pressure' -ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%P(:,II) +YCOMMENT (JPROC) = 'Pressure' +ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XP(:) ! !JPROC = JPROC + 1 !YTITLE (JPROC) = 'Z' !YUNIT (JPROC) = 'm' !YCOMMENT (JPROC) = 'Z Pos' -!ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%Z(II) +!ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XZ ! 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) + ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XX ! JPROC = JPROC + 1 YTITLE (JPROC) = 'Y' YUNIT (JPROC) = 'm' YCOMMENT (JPROC) = 'Y Pos' - ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%Y(II) + ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XY ! JPROC = JPROC + 1 YTITLE (JPROC) = 'U' YUNIT (JPROC) = 'm s-1' YCOMMENT (JPROC) = 'Axial velocity' - ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%ZON(:,II) + ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XZON(:) ! JPROC = JPROC + 1 YTITLE (JPROC) = 'V' YUNIT (JPROC) = 'm s-1' YCOMMENT (JPROC) = 'Transversal velocity' - ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%MER(:,II) + ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XMER(:) ELSE JPROC = JPROC + 1 YTITLE (JPROC) = 'LON' YUNIT (JPROC) = 'degree' YCOMMENT (JPROC) = 'Longitude' - ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%LON(II) + ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XLON ! JPROC = JPROC + 1 YTITLE (JPROC) = 'LAT' YUNIT (JPROC) = 'degree' YCOMMENT (JPROC) = 'Latitude' - ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%LAT(II) + ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XLAT ! 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) + ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XZON(:) ! 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) + ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XMER(:) 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) +YCOMMENT (JPROC) = 'Air vertical speed' +ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XW(:) ! JPROC = JPROC + 1 YTITLE (JPROC) = 'Th' YUNIT (JPROC) = 'K' -YCOMMENT (JPROC) = 'Potential temperature' -ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%TH(:,II) +YCOMMENT (JPROC) = 'Potential temperature' +ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XTH(:) ! 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) + YCOMMENT (JPROC) = '2-m temperature' + ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XT2M(:) ! 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) + YCOMMENT (JPROC) = '2-m humidity' + ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XQ2M(:) ! JPROC = JPROC + 1 YTITLE (JPROC) = 'HU2m' YUNIT (JPROC) = 'percent' - YCOMMENT (JPROC) = '2-m relative humidity' - ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%HU2M(:,II) + YCOMMENT (JPROC) = '2-m relative humidity' + ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XHU2M(:) ! 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) - ! + YCOMMENT (JPROC) = '10-m zonal wind' + ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XZON10M(:) + ! 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) + YCOMMENT (JPROC) = '10-m meridian wind' + ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XMER10M(:) ! JPROC = JPROC + 1 - YTITLE (JPROC) = 'RN' + YTITLE (JPROC) = 'RN' YUNIT (JPROC) = 'W m-2' - YCOMMENT (JPROC) = 'Net radiation' - ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%RN(:,II) + YCOMMENT (JPROC) = 'Net radiation' + ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XRN(:) ! JPROC = JPROC + 1 - YTITLE (JPROC) = 'H' + YTITLE (JPROC) = 'H' YUNIT (JPROC) = 'W m-2' YCOMMENT (JPROC) = 'Sensible heat flux' - ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%H(:,II) - ! + ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XH(:) + ! JPROC = JPROC + 1 - YTITLE (JPROC) = 'LE' + YTITLE (JPROC) = 'LE' YUNIT (JPROC) = 'W m-2' - YCOMMENT (JPROC) = 'Total Latent heat flux' - ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%LE(:,II) + YCOMMENT (JPROC) = 'Total Latent heat flux' + ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XLE(:) ! JPROC = JPROC + 1 - YTITLE (JPROC) = 'G' + YTITLE (JPROC) = 'G' YUNIT (JPROC) = 'W m-2' - YCOMMENT (JPROC) = 'Storage heat flux' - ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%GFLUX(:,II) + YCOMMENT (JPROC) = 'Storage heat flux' + ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XGFLUX(:) ! JPROC = JPROC + 1 - YTITLE (JPROC) = 'LEI' + YTITLE (JPROC) = 'LEI' YUNIT (JPROC) = 'W m-2' - YCOMMENT (JPROC) = 'Solid Latent heat flux' - ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%LEI(:,II) + YCOMMENT (JPROC) = 'Solid Latent heat flux' + ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XLEI(:) END IF IF (CRAD /= 'NONE') THEN JPROC = JPROC + 1 - YTITLE (JPROC) = 'SWD' + YTITLE (JPROC) = 'SWD' YUNIT (JPROC) = 'W m-2' - YCOMMENT (JPROC) = 'Downward short-wave radiation' - ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%SWD(:,II) - ! + YCOMMENT (JPROC) = 'Downward short-wave radiation' + ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XSWD(:) + ! JPROC = JPROC + 1 - YTITLE (JPROC) = 'SWU' + YTITLE (JPROC) = 'SWU' YUNIT (JPROC) = 'W m-2' - YCOMMENT (JPROC) = 'Upward short-wave radiation' - ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%SWU(:,II) - ! + YCOMMENT (JPROC) = 'Upward short-wave radiation' + ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XSWU(:) + ! JPROC = JPROC + 1 - YTITLE (JPROC) = 'LWD' + YTITLE (JPROC) = 'LWD' YUNIT (JPROC) = 'W m-2' YCOMMENT (JPROC) = 'Downward long-wave radiation' - ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%LWD(:,II) - ! + ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XLWD(:) + ! JPROC = JPROC + 1 - YTITLE (JPROC) = 'LWU' + YTITLE (JPROC) = 'LWU' YUNIT (JPROC) = 'W m-2' YCOMMENT (JPROC) = 'Upward long-wave radiation' - ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%LWU(:,II) + ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XLWU(:) JPROC = JPROC + 1 ! - YTITLE (JPROC) = 'SWDIR' + YTITLE (JPROC) = 'SWDIR' YUNIT (JPROC) = 'W m-2' - YCOMMENT (JPROC) = 'Downward direct short-wave radiation' - ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%SWDIR(:,II) + YCOMMENT (JPROC) = 'Downward direct short-wave radiation' + ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XSWDIR(:) ! JPROC = JPROC + 1 - YTITLE (JPROC) = 'SWDIFF' + YTITLE (JPROC) = 'SWDIFF' YUNIT (JPROC) = 'W m-2' - YCOMMENT (JPROC) = 'Downward diffuse short-wave radiation' - ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%SWDIFF(:,II) - ! + YCOMMENT (JPROC) = 'Downward diffuse short-wave radiation' + ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XSWDIFF(:) + ! JPROC = JPROC + 1 - YTITLE (JPROC) = 'DSTAOD' + YTITLE (JPROC) = 'DSTAOD' YUNIT (JPROC) = 'm' YCOMMENT (JPROC) = 'Dust aerosol optical depth' - ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%DSTAOD(:,II) + ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XDSTAOD(:) ! END IF ENDIF ! -DO JRR=1,SIZE(TSTATION%R,3) +DO JRR=1,SIZE(TPSTATION%XR,2) JPROC = JPROC+1 YUNIT (JPROC) = 'kg kg-1' - ZWORK6 (1,1,1,:,1,JPROC) = TSTATION%R(:,II,JRR) + ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XR(:,JRR) IF (JRR==1) THEN YTITLE (JPROC) = 'Rv' - YCOMMENT (JPROC) = 'Water vapor mixing ratio' + YCOMMENT (JPROC) = 'Water vapor mixing ratio' ELSE IF (JRR==2) THEN YTITLE (JPROC) = 'Rc' - YCOMMENT (JPROC) = 'Liquid cloud water mixing ratio' + YCOMMENT (JPROC) = 'Liquid cloud water mixing ratio' ELSE IF (JRR==3) THEN YTITLE (JPROC) = 'Rr' - YCOMMENT (JPROC) = 'Rain water mixing ratio' + YCOMMENT (JPROC) = 'Rain water mixing ratio' ELSE IF (JRR==4) THEN YTITLE (JPROC) = 'Ri' - YCOMMENT (JPROC) = 'Ice cloud water mixing ratio' + YCOMMENT (JPROC) = 'Ice cloud water mixing ratio' ELSE IF (JRR==5) THEN YTITLE (JPROC) = 'Rs' - YCOMMENT (JPROC) = 'Snow mixing ratio' + YCOMMENT (JPROC) = 'Snow mixing ratio' ELSE IF (JRR==6) THEN YTITLE (JPROC) = 'Rg' - YCOMMENT (JPROC) = 'Graupel mixing ratio' + YCOMMENT (JPROC) = 'Graupel mixing ratio' ELSE IF (JRR==7) THEN YTITLE (JPROC) = 'Rh' - YCOMMENT (JPROC) = 'Hail mixing ratio' + YCOMMENT (JPROC) = 'Hail mixing ratio' END IF END DO ! -IF (SIZE(TSTATION%TKE,1)>0) THEN +IF (SIZE(TPSTATION%XTKE,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) + ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XTKE(:) END IF ! -IF (SIZE(TSTATION%SV,3)>=1) THEN +IF (SIZE(TPSTATION%XSV,2)>=1) THEN ! Scalar variables DO JSV = 1, NSV JPROC = JPROC + 1 @@ -405,33 +406,33 @@ IF (SIZE(TSTATION%SV,3)>=1) THEN YCOMMENT(JPROC) = '' IF ( TRIM( TSVLIST(JSV)%CUNITS ) == 'ppv' ) THEN YUNIT(JPROC) = 'ppb' - ZWORK6(1,1,1,:,1,JPROC) = TSTATION%SV(:,II,JSV) * 1.e9 !*1e9 for conversion ppv->ppb + ZWORK6(1,1,1,:,1,JPROC) = TPSTATION%XSV(:,JSV) * 1.e9 !*1e9 for conversion ppv->ppb ELSE YUNIT(JPROC) = TRIM( TSVLIST(JSV)%CUNITS ) - ZWORK6(1,1,1,:,1,JPROC) = TSTATION%SV(:,II,JSV) + ZWORK6(1,1,1,:,1,JPROC) = 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,SIZE(tstations_time%tpdates),NSV_AER)) + ALLOCATE (ZRHO(1,1,SIZE(tstations_time%tpdates))) + ALLOCATE (ZN0(1,1,SIZE(tstations_time%tpdates),JPMODE)) + ALLOCATE (ZRG(1,1,SIZE(tstations_time%tpdates),JPMODE)) + ALLOCATE (ZSIG(1,1,SIZE(tstations_time%tpdates),JPMODE)) + ALLOCATE (ZPTOTA(1,1,SIZE(tstations_time%tpdates),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) ) & + 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) @@ -552,25 +553,25 @@ IF (SIZE(TSTATION%SV,3)>=1) THEN DEALLOCATE (ZN0,ZRG,ZSIG) END IF - 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,SIZE(tstations_time%tpdates),NSV_DST)) + ALLOCATE (ZRHO(1,1,SIZE(tstations_time%tpdates))) + ALLOCATE (ZN0(1,1,SIZE(tstations_time%tpdates),NMODE_DST)) + ALLOCATE (ZRG(1,1,SIZE(tstations_time%tpdates),NMODE_DST)) + ALLOCATE (ZSIG(1,1,SIZE(tstations_time%tpdates),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) ) & + 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 @@ -596,25 +597,25 @@ IF (SIZE(TSTATION%SV,3)>=1) THEN DEALLOCATE (ZN0,ZRG,ZSIG) END IF - 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,SIZE(tstations_time%tpdates),NSV_SLT)) + ALLOCATE (ZRHO(1,1,SIZE(tstations_time%tpdates))) + ALLOCATE (ZN0(1,1,SIZE(tstations_time%tpdates),NMODE_SLT)) + ALLOCATE (ZRG(1,1,SIZE(tstations_time%tpdates),NMODE_SLT)) + ALLOCATE (ZSIG(1,1,SIZE(tstations_time%tpdates),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 @@ -636,31 +637,31 @@ IF (SIZE(TSTATION%SV,3)>=1) THEN WRITE(YCOMMENT(JPROC),'(A13,I1)')'N0 DUST MODE ',JSV ZWORK6 (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 END IF -IF (ANY(TSTATION%TSRAD(:,:)/=XUNDEF)) THEN +IF (ANY(TPSTATION%XTSRAD(:)/=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) + ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XTSRAD(:) END IF ! -IF (ANY(TSTATION%SFCO2(:,:)/=XUNDEF)) THEN +IF (ANY(TPSTATION%XSFCO2(:)/=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) + ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XSFCO2(:) END IF ! !---------------------------------------------------------------------------- ! ! -ALLOCATE (ZW6(1,1,1,SIZE(tstation%tpdates),1,JPROC)) +ALLOCATE (ZW6(1,1,1,SIZE(tstations_time%tpdates),1,JPROC)) ZW6 = ZWORK6(:,:,:,:,:,:JPROC) DEALLOCATE(ZWORK6) ! @@ -727,7 +728,7 @@ 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, zw6 ) deallocate( tzfields ) -- GitLab From 30f5984cebf1832b9b21e8e0ba7f22f9c8ec6751 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Fri, 8 Apr 2022 10:20:26 +0200 Subject: [PATCH 052/157] Philippe 08/04/2022: merge ini_stationn.f90 and ini_surfstationn.f90 --- src/MNH/ini_stationn.f90 | 125 ----------------------------------- src/MNH/ini_surfstationn.f90 | 51 ++++++++++---- 2 files changed, 39 insertions(+), 137 deletions(-) delete mode 100644 src/MNH/ini_stationn.f90 diff --git a/src/MNH/ini_stationn.f90 b/src/MNH/ini_stationn.f90 deleted file mode 100644 index 8e675165b..000000000 --- a/src/MNH/ini_stationn.f90 +++ /dev/null @@ -1,125 +0,0 @@ -!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. -!----------------------------------------------------------------- -! ####################### - 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 -! E. Jezequel 02/2021: read stations from CVS file -! P. Wautelet 07/04/2022: rewrite types for stations -! -------------------------------------------------------------------------- -! -!* 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 -! -!---------------------------------------------------------------------------- -IF (CFILE_STAT=="NO_INPUT_CSV") THEN -! -!* 1. Namelist -! -------- - NUMBSTAT = NNUMB_STAT - - IF (NUMBSTAT > 0) THEN - ALLOCATE( TSTATIONS(NUMBSTAT) ) - - IF (LCARTESIAN) THEN - DO JI=1,NUMBSTAT - TSTATIONS(JI)%XX = XX_STAT(JI) - TSTATIONS(JI)%XY = XY_STAT(JI) - TSTATIONS(JI)%XZ = XZ_STAT(JI) - TSTATIONS(JI)%CNAME = CNAME_STAT(JI) - TSTATIONS(JI)%CTYPE = CTYPE_STAT(JI) - END DO - ELSE - DO JI=1,NUMBSTAT - TSTATIONS(JI)%XLAT = XLAT_STAT(JI) - TSTATIONS(JI)%XLON = XLON_STAT(JI) - TSTATIONS(JI)%XZ = XZ_STAT(JI) - TSTATIONS(JI)%CNAME = CNAME_STAT(JI) - TSTATIONS(JI)%CTYPE = CTYPE_STAT(JI) - END DO - END IF - END IF -ELSE -! -!* 2. CSV DATA -! - CALL READ_CSV_STATION( CFILE_STAT, TSTATIONS, LCARTESIAN ) -END IF - -TSTATIONS_TIME%XTSTEP = XSTEP_STAT - -END SUBROUTINE INI_STATION_n diff --git a/src/MNH/ini_surfstationn.f90 b/src/MNH/ini_surfstationn.f90 index 013c342be..f68f35028 100644 --- a/src/MNH/ini_surfstationn.f90 +++ b/src/MNH/ini_surfstationn.f90 @@ -116,19 +116,56 @@ INTEGER, INTENT(IN) :: KMI ! MODEL NUMBER ! INTEGER :: ISTORE ! number of storage instants INTEGER :: IIU_ll,IJU_ll,IRESP +INTEGER :: JI ! !---------------------------------------------------------------------------- ! !* 1. Default values ! -------------- ! -CALL DEFAULT_STATION_n() +NUMBSTAT = 0 +TSTATIONS_TIME%XTSTEP = XTSTEP ! ! !* 3. Stations initialization ! ----------------------- ! -CALL INI_STATION_n() +IF (CFILE_STAT=="NO_INPUT_CSV") THEN +! +!* 1. Namelist +! -------- + NUMBSTAT = NNUMB_STAT + + IF (NUMBSTAT > 0) THEN + ALLOCATE( TSTATIONS(NUMBSTAT) ) + + IF (LCARTESIAN) THEN + DO JI=1,NUMBSTAT + TSTATIONS(JI)%XX = XX_STAT(JI) + TSTATIONS(JI)%XY = XY_STAT(JI) + TSTATIONS(JI)%XZ = XZ_STAT(JI) + TSTATIONS(JI)%CNAME = CNAME_STAT(JI) + TSTATIONS(JI)%CTYPE = CTYPE_STAT(JI) + END DO + ELSE + DO JI=1,NUMBSTAT + TSTATIONS(JI)%XLAT = XLAT_STAT(JI) + TSTATIONS(JI)%XLON = XLON_STAT(JI) + TSTATIONS(JI)%XZ = XZ_STAT(JI) + TSTATIONS(JI)%CNAME = CNAME_STAT(JI) + TSTATIONS(JI)%CTYPE = CTYPE_STAT(JI) + END DO + END IF + END IF +ELSE +! +!* 2. CSV DATA +! + CALL READ_CSV_STATION( CFILE_STAT, TSTATIONS, LCARTESIAN ) +END IF + +TSTATIONS_TIME%XTSTEP = XSTEP_STAT + LSTATION = (NUMBSTAT>0) ! !---------------------------------------------------------------------------- @@ -145,16 +182,6 @@ ENDIF CONTAINS ! !---------------------------------------------------------------------------- -SUBROUTINE DEFAULT_STATION_n() - -USE MODD_DYN_N, ONLY: XTSTEP -! -NUMBSTAT = 0 -TSTATIONS_TIME%XTSTEP = XTSTEP -! -END SUBROUTINE DEFAULT_STATION_n -!---------------------------------------------------------------------------- -!---------------------------------------------------------------------------- SUBROUTINE ALLOCATE_STATION_n() INTEGER :: JI -- GitLab From ae50524e13a2b085ec398c859d38f07fa4cbe275 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Fri, 8 Apr 2022 11:51:10 +0200 Subject: [PATCH 053/157] Philippe 08/04/2022: stations: add position and interpolation coefficients in TSTATIONDATA type --- src/MNH/ini_surfstationn.f90 | 3 ++ src/MNH/modd_type_station.f90 | 15 +++++- src/MNH/station_tools.f90 | 95 +++++++++++++++++++++++++++++++++++ src/MNH/stationn.f90 | 43 ++++++++-------- 4 files changed, 134 insertions(+), 22 deletions(-) create mode 100644 src/MNH/station_tools.f90 diff --git a/src/MNH/ini_surfstationn.f90 b/src/MNH/ini_surfstationn.f90 index f68f35028..3cde34d16 100644 --- a/src/MNH/ini_surfstationn.f90 +++ b/src/MNH/ini_surfstationn.f90 @@ -262,6 +262,8 @@ END SUBROUTINE ALLOCATE_STATION_n !---------------------------------------------------------------------------- SUBROUTINE INI_INTERP_STATION_n() ! +USE MODE_STATION_TOOLS, ONLY: STATION_POSITION + INTEGER :: JII INTEGER :: IIU, IJU ! @@ -271,6 +273,7 @@ IF ( ALL(TSTATIONS(:)%XLAT /= XUNDEF) .AND. ALL(TSTATIONS(:)%XLON /= XUNDEF) ) T CALL SM_XYHAT(PLATOR,PLONOR, & TSTATIONS(JII)%XLAT, TSTATIONS(JII)%XLON, & TSTATIONS(JII)%XX, TSTATIONS(JII)%XY ) + CALL STATION_POSITION( TSTATIONS(JII) ) END DO ELSE CMNHMSG(1) = 'Error in station position' diff --git a/src/MNH/modd_type_station.f90 b/src/MNH/modd_type_station.f90 index b929d28d4..ac0134eab 100644 --- a/src/MNH/modd_type_station.f90 +++ b/src/MNH/modd_type_station.f90 @@ -37,7 +37,7 @@ ! ------------ ! use modd_type_date, only: date_time -use modd_parameters, only: NUNDEF, XUNDEF +use modd_parameters, only: NNEGUNDEF, NUNDEF, XUNDEF implicit none @@ -57,6 +57,7 @@ TYPE TSTATIONDATA CHARACTER(LEN=8) :: CNAME = '' ! station name CHARACTER(LEN=8) :: CTYPE = '' ! station type (currently not used) LOGICAL :: LERROR = .FALSE. ! +LOGICAL :: LPRESENT = .FALSE. ! If true, this station is situated on this process REAL :: XX = XUNDEF ! X(n) REAL :: XY = XUNDEF ! Y(n) @@ -65,6 +66,18 @@ REAL :: XLON = XUNDEF ! longitude(n) REAL :: XLAT = XUNDEF ! latitude (n) REAL :: XZS = XUNDEF ! zs(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) + INTEGER :: NK = NUNDEF ! Model level for altitude comparisons REAL, DIMENSION(:), ALLOCATABLE :: XZON ! zonal wind(n) diff --git a/src/MNH/station_tools.f90 b/src/MNH/station_tools.f90 new file mode 100644 index 000000000..1aa02f68e --- /dev/null +++ b/src/MNH/station_tools.f90 @@ -0,0 +1,95 @@ +!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 08/04/2022 +!----------------------------------------------------------------- +! Modifications: +!----------------------------------------------------------------- +! ################## +MODULE MODE_STATION_TOOLS +! ################## + +IMPLICIT NONE + +PRIVATE + +PUBLIC :: STATION_POSITION + +CONTAINS + +! ###################################### +SUBROUTINE STATION_POSITION( TPSTATION ) +! ###################################### +! Subroutine to determine the position of a station on the model grid +! and set the useful coefficient for data interpolation + + USE MODD_CONF, ONLY: L1D + USE MODD_GRID_n, ONLY: XXHAT, XYHAT + USE MODD_TYPE_STATION, ONLY: TSTATIONDATA + + USE MODE_TOOLS_ll, ONLY: GET_INDICE_ll, LWEST_ll, LEAST_ll, LNORTH_ll, LSOUTH_ll + + IMPLICIT NONE + + TYPE(TSTATIONDATA), INTENT(INOUT) :: TPSTATION + + INTEGER :: IIB ! domain sizes of current process + INTEGER :: IJB ! + INTEGER :: IIE ! + INTEGER :: IJE ! + INTEGER :: IIU ! + INTEGER :: IJU ! + REAL, DIMENSION(SIZE(XXHAT)) :: ZXHATM ! mass point coordinates + REAL, DIMENSION(SIZE(XYHAT)) :: ZYHATM ! mass point coordinates + + IIU = SIZE( XXHAT ) + IJU = SIZE( XYHAT ) + + CALL GET_INDICE_ll (IIB, IJB, IIE, IJE ) + + ! Interpolations of model variables to mass points + ZXHATM(1:IIU-1) = 0.5 * XXHAT(1:IIU-1) + 0.5 * XXHAT(2:IIU ) + ZXHATM( IIU ) = 1.5 * XXHAT( IIU ) - 0.5 * XXHAT( IIU-1) + + ZYHATM(1:IJU-1) = 0.5 * XYHAT(1:IJU-1) + 0.5 * XYHAT(2:IJU ) + ZYHATM( IJU ) = 1.5 * XYHAT( IJU ) - 0.5 * XYHAT( IJU-1) + + TPSTATION%LPRESENT = .FALSE. + + ! X position + TPSTATION%NI_U = COUNT( XXHAT (:) <= TPSTATION%XX ) + TPSTATION%NI_M = COUNT( ZXHATM(:) <= TPSTATION%XX ) + + IF ( TPSTATION%NI_M<=IIB-1 .AND. LWEST_ll() .AND. .NOT. L1D ) TPSTATION%LERROR = .TRUE. + IF ( TPSTATION%NI_M>=IIE .AND. LEAST_ll() .AND. .NOT. L1D ) TPSTATION%LERROR = .TRUE. + + ! Y position + TPSTATION%NJ_V = COUNT( XYHAT (:) <= TPSTATION%XY ) + TPSTATION%NJ_M = COUNT( ZYHATM(:) <= TPSTATION%XY ) + + IF ( TPSTATION%NJ_M<=IJB-1 .AND. LSOUTH_ll() .AND. .NOT. L1D ) TPSTATION%LERROR = .TRUE. + IF ( TPSTATION%NJ_M>=IJE .AND. LNORTH_ll() .AND. .NOT. L1D ) TPSTATION%LERROR = .TRUE. + + ! Position of station according to processes + IF ( TPSTATION%NI_U >= IIB .AND. TPSTATION%NI_U <= IIE & + .AND. TPSTATION%NJ_V >= IJB .AND. TPSTATION%NJ_V <= IJE ) TPSTATION%LPRESENT = .TRUE. + IF ( L1D ) TPSTATION%LPRESENT = .TRUE. + + ! Computations only on correct process + IF ( TPSTATION%LPRESENT .AND. .NOT. L1D ) THEN + ! Interpolation coefficient for X (mass-point) + TPSTATION%XXMCOEF = ( TPSTATION%XX - ZXHATM(TPSTATION%NI_M) ) / ( ZXHATM(TPSTATION%NI_M+1) - ZXHATM(TPSTATION%NI_M) ) + ! Interpolation coefficient for Y (mass-point) + TPSTATION%XYMCOEF = ( TPSTATION%XY - ZYHATM(TPSTATION%NJ_M) ) / ( ZYHATM(TPSTATION%NJ_M+1) - ZYHATM(TPSTATION%NJ_M) ) + ! Interpolation coefficient for X (U-point) + TPSTATION%XXUCOEF = ( TPSTATION%XX - XXHAT(TPSTATION%NI_U) ) / ( XXHAT(TPSTATION%NI_U+1) - XXHAT(TPSTATION%NI_U) ) + ! Interpolation coefficient for Y (V-point) + TPSTATION%XYVCOEF = ( TPSTATION%XY - XYHAT(TPSTATION%NJ_V) ) / ( XYHAT(TPSTATION%NJ_V+1) - XYHAT(TPSTATION%NJ_V) ) + END IF + +END SUBROUTINE STATION_POSITION + +END MODULE MODE_STATION_TOOLS diff --git a/src/MNH/stationn.f90 b/src/MNH/stationn.f90 index 92105242e..d59477e66 100644 --- a/src/MNH/stationn.f90 +++ b/src/MNH/stationn.f90 @@ -152,7 +152,6 @@ 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 @@ -318,7 +317,7 @@ END IF IF (GSTORE) THEN DO I=1,NUMBSTAT ! - IF ((ZTHIS_PROCS(I)==1.).AND.(.NOT. TSTATIONS(I)%LERROR)) THEN + IF ( TSTATIONS(I)%LPRESENT .AND. .NOT. TSTATIONS(I)%LERROR ) THEN IF (TSTATIONS(I)%NK/= XUNDEF) THEN J = TSTATIONS(I)%NK ELSE ! suppose TSTATIONS(I)%XZ /= XUNDEF @@ -461,17 +460,17 @@ ELSEIF (L1D) THEN JI=2 JJ=2 ELSE - JI=II(I) - JJ=IJ(I) + JI=TSTATIONS(I)%NI_M + JJ=TSTATIONS(I)%NJ_M 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) +PB = (1.-TSTATIONS(I)%XYMCOEF) * (1.-TSTATIONS(I)%XXMCOEF) * PA(JI,JJ) + & + (1.-TSTATIONS(I)%XYMCOEF) * (TSTATIONS(I)%XXMCOEF) * PA(JI+1,JJ) + & + ( TSTATIONS(I)%XYMCOEF) * (1.-TSTATIONS(I)%XXMCOEF) * PA(JI,JJ+1) + & + ( TSTATIONS(I)%XYMCOEF) * (TSTATIONS(I)%XXMCOEF) * PA(JI+1,JJ+1) ! END FUNCTION STATION_INTERP_2D !---------------------------------------------------------------------------- @@ -491,16 +490,16 @@ ELSEIF (L1D) THEN JI=2 JJ=2 ELSE - JI=II(I) - JJ=IJ(I) + JI=TSTATIONS(I)%NI_M + JJ=TSTATIONS(I)%NJ_M 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) +PB = (1.- TSTATIONS(I)%XYMCOEF) * (1.-TSTATIONS(I)%XXUCOEF) * PA(JI ,JJ ) & + + (1.- TSTATIONS(I)%XYMCOEF) * ( TSTATIONS(I)%XXUCOEF) * PA(JI+1,JJ ) & + + ( TSTATIONS(I)%XYMCOEF) * (1.-TSTATIONS(I)%XXUCOEF) * PA(JI ,JJ+1) & + + ( TSTATIONS(I)%XYMCOEF) * ( TSTATIONS(I)%XXUCOEF) * PA(JI+1,JJ+1) ! END FUNCTION STATION_INTERP_2D_U !---------------------------------------------------------------------------- @@ -520,16 +519,16 @@ ELSEIF (L1D) THEN JI=2 JJ=2 ELSE - JI=II(I) - JJ=IJ(I) + JI=TSTATIONS(I)%NI_M + JJ=TSTATIONS(I)%NJ_M 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) +PB = (1.- TSTATIONS(I)%XYVCOEF) * (1.-TSTATIONS(I)%XXMCOEF) * PA(JI ,JJ ) & + + (1.- TSTATIONS(I)%XYVCOEF) * ( TSTATIONS(I)%XXMCOEF) * PA(JI+1,JJ ) & + + ( TSTATIONS(I)%XYVCOEF) * (1.-TSTATIONS(I)%XXMCOEF) * PA(JI ,JJ+1) & + + ( TSTATIONS(I)%XYVCOEF) * ( TSTATIONS(I)%XXMCOEF) * PA(JI+1,JJ+1) ! END FUNCTION STATION_INTERP_2D_V !---------------------------------------------------------------------------- @@ -538,7 +537,9 @@ SUBROUTINE DISTRIBUTE_STATION(PAS) ! REAL, INTENT(INOUT) :: PAS ! -PAS = PAS * ZTHIS_PROCS(I) +INTEGER :: IINFO_ll ! return code + +IF ( .NOT. TSTATIONS(I)%LPRESENT ) PAS = 0. CALL REDUCESUM_ll(PAS,IINFO_ll) ! END SUBROUTINE DISTRIBUTE_STATION -- GitLab From 417fbfbbb2e8741d6d9cbbd0e466b486e3f6a56e Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Fri, 8 Apr 2022 11:57:42 +0200 Subject: [PATCH 054/157] Philippe 08/04/2022: remove modd_sub_stationn --- src/MNH/goto_model_wrapper.f90 | 4 +- src/MNH/modd_sub_stationn.f90 | 108 --------------------------------- src/MNH/stationn.f90 | 100 ------------------------------ 3 files changed, 1 insertion(+), 211 deletions(-) delete mode 100644 src/MNH/modd_sub_stationn.f90 diff --git a/src/MNH/goto_model_wrapper.f90 b/src/MNH/goto_model_wrapper.f90 index 831cb2028..da4f0e5c7 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. @@ -108,7 +108,6 @@ 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 ! @@ -204,7 +203,6 @@ 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/modd_sub_stationn.f90 b/src/MNH/modd_sub_stationn.f90 deleted file mode 100644 index d9fffb3ec..000000000 --- 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/stationn.f90 b/src/MNH/stationn.f90 index d59477e66..dcb38f6d3 100644 --- a/src/MNH/stationn.f90 +++ b/src/MNH/stationn.f90 @@ -95,7 +95,6 @@ USE MODD_PARAMETERS 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 ! @@ -212,105 +211,6 @@ END IF ! !---------------------------------------------------------------------------- ! -!* 4. STATION POSITION -! -------------- -! -!* 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)) - - ZXCOEF(:) =XUNDEF - ZUCOEF(:) =XUNDEF - ZYCOEF(:) =XUNDEF - ZVCOEF(:) =XUNDEF - - DO I=1,NUMBSTAT -! - ZTHIS_PROCS(I)=0. -! -!* 4.1 X position -! ---------- -! - IU(I)=COUNT( PXHAT (:)<=TSTATIONS(I)%XX ) - II(I)=COUNT( ZXHATM(:)<=TSTATIONS(I)%XX ) -! - IF (II(I)<=IIB-1 .AND. LWEST_ll() .AND. .NOT. L1D) TSTATIONS(I)%LERROR=.TRUE. - IF (II(I)>=IIE .AND. LEAST_ll() .AND. .NOT. L1D) TSTATIONS(I)%LERROR=.TRUE. -! -! -!* 4.2 Y position -! ---------- -! - IV(I)=COUNT( PYHAT (:)<=TSTATIONS(I)%XY ) - IJ(I)=COUNT( ZYHATM(:)<=TSTATIONS(I)%XY ) -! - IF (IJ(I)<=IJB-1 .AND. LSOUTH_ll() .AND. .NOT. L1D) TSTATIONS(I)%LERROR=.TRUE. - IF (IJ(I)>=IJE .AND. LNORTH_ll() .AND. .NOT. L1D) TSTATIONS(I)%LERROR=.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) = (TSTATIONS(I)%XX - ZXHATM(II(I))) / (ZXHATM(II(I)+1) - ZXHATM(II(I))) -! -! -! -!* 6.2 Interpolation coefficient for y -! ------------------------------- -! - ZYCOEF(I) = (TSTATIONS(I)%XY - 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) = (TSTATIONS(I)%XX - PXHAT(IU(I))) / (PXHAT(IU(I)+1) - PXHAT(IU(I))) -! -! -!* 7.2 Interpolation coefficient for y (for V) -! ------------------------------- -! - ZVCOEF(I) = (TSTATIONS(I)%XY - PYHAT(IV(I))) / (PYHAT(IV(I)+1) - PYHAT(IV(I))) -! -! - - END IF - ENDDO -END IF -!---------------------------------------------------------------------------- -! !* 8. DATA RECORDING ! -------------- ! -- GitLab From 488baaf1adbb7f14b8298971463f13809f3e517e Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Wed, 20 Apr 2022 11:35:49 +0200 Subject: [PATCH 055/157] Philippe 20/04/2022: stations: optimise stations (less communications, less memory...) Interpolation was not correct for U and V (did not use correct position indices) --- src/MNH/default_desfmn.f90 | 3 +- src/MNH/ini_modeln.f90 | 6 +- src/MNH/ini_surfstationn.f90 | 295 +++++++++----------------- src/MNH/modd_allstationn.f90 | 16 +- src/MNH/modd_stationn.f90 | 18 +- src/MNH/modd_type_station.f90 | 12 +- src/MNH/modn_stationn.f90 | 10 +- src/MNH/station_reader.f90 | 162 ++++++++------- src/MNH/station_tools.f90 | 376 ++++++++++++++++++++++++++++++---- src/MNH/stationn.f90 | 351 ++++++------------------------- src/MNH/write_stationn.f90 | 228 +++++++++++++++++++-- 11 files changed, 819 insertions(+), 658 deletions(-) diff --git a/src/MNH/default_desfmn.f90 b/src/MNH/default_desfmn.f90 index c1be2c51e..c9f530786 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. @@ -603,7 +603,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/ini_modeln.f90 b/src/MNH/ini_modeln.f90 index 718f11ce6..6ee23d80a 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-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. @@ -2565,9 +2565,7 @@ CALL INI_AIRCRAFT_BALLOON(TPINIFILE,XTSTEP, TDTSEG, XSEGLEN, NRR, NSV, & !* 24. STATION initializations ! ----------------------- ! -CALL INI_SURFSTATION_n(XTSTEP, XSEGLEN, NRR, NSV, & - CTURB=="TKEL" , KMI, & - XLATORI, XLONORI ) +CALL INI_SURFSTATION_n( ) ! !------------------------------------------------------------------------------- ! diff --git a/src/MNH/ini_surfstationn.f90 b/src/MNH/ini_surfstationn.f90 index 3cde34d16..ebd004817 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* - @@ -69,222 +53,143 @@ END MODULE MODI_INI_SURFSTATION_n ! 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 07/04/2022: rewrite types for stations +! 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_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_GRID_n, ONLY: XXHAT, XYHAT +USE MODD_PARAMETERS, ONLY: JPHEXT, JPVEXT USE MODD_STATION_n -USE MODD_TYPE_DATE -USE MODD_VAR_ll, ONLY: IP +USE MODD_TYPE_STATION ! -USE MODE_GATHER_ll -USE MODE_GRIDPROJ -USE MODE_ll USE MODE_MSG -! -USE MODI_INI_STATION_N +USE MODE_STATION_READER +USE MODE_STATION_TOOLS, ONLY: STATION_ADD, STATION_ALLOCATE, STATION_INI_INTERP, STATION_POSITION +USE MODE_ALLOCBUFFER_ll, ONLY: ALLOCBUFFER_ll +USE MODE_GATHER_ll, ONLY: GATHERALL_FIELD_ll ! 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 :: IIU_ll,IJU_ll,IRESP +INTEGER :: IERR +INTEGER :: IIU +INTEGER :: IJU +INTEGER :: ISTORE ! number of storage instants INTEGER :: JI +LOGICAL :: GALLOCX, GALLOCY +LOGICAL :: GINSIDE ! True if station is inside physical domain of model +LOGICAL :: GPRESENT ! True if station is present on the current process +REAL :: ZXHATM_PHYS_MIN, ZYHATM_PHYS_MIN ! Minimum X coordinate of mass points in the physical domain +REAL :: ZXHATM_PHYS_MAX, ZYHATM_PHYS_MAX ! Minimum X coordinate of mass points in the physical domain +REAL, DIMENSION(SIZE(XXHAT)) :: ZXHATM ! mass point coordinates +REAL, DIMENSION(SIZE(XYHAT)) :: ZYHATM ! mass point coordinates +REAL, DIMENSION(:), POINTER :: ZXHAT_GLOB +REAL, DIMENSION(:), POINTER :: ZYHAT_GLOB +TYPE(TSTATIONDATA) :: TZSTATION ! !---------------------------------------------------------------------------- -! -!* 1. Default values -! -------------- -! -NUMBSTAT = 0 -TSTATIONS_TIME%XTSTEP = XTSTEP -! -! -!* 3. Stations initialization -! ----------------------- -! -IF (CFILE_STAT=="NO_INPUT_CSV") THEN -! -!* 1. Namelist -! -------- - NUMBSTAT = NNUMB_STAT - IF (NUMBSTAT > 0) THEN - ALLOCATE( TSTATIONS(NUMBSTAT) ) +TSTATIONS_TIME%XTSTEP = XSTEP_STAT - IF (LCARTESIAN) THEN - DO JI=1,NUMBSTAT - TSTATIONS(JI)%XX = XX_STAT(JI) - TSTATIONS(JI)%XY = XY_STAT(JI) - TSTATIONS(JI)%XZ = XZ_STAT(JI) - TSTATIONS(JI)%CNAME = CNAME_STAT(JI) - TSTATIONS(JI)%CTYPE = CTYPE_STAT(JI) - END DO - ELSE - DO JI=1,NUMBSTAT - TSTATIONS(JI)%XLAT = XLAT_STAT(JI) - TSTATIONS(JI)%XLON = XLON_STAT(JI) - TSTATIONS(JI)%XZ = XZ_STAT(JI) - TSTATIONS(JI)%CNAME = CNAME_STAT(JI) - TSTATIONS(JI)%CTYPE = CTYPE_STAT(JI) - END DO - END IF - END IF -ELSE -! -!* 2. CSV DATA -! - CALL READ_CSV_STATION( CFILE_STAT, TSTATIONS, LCARTESIAN ) -END IF +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 -TSTATIONS_TIME%XTSTEP = XSTEP_STAT +ISTORE = NINT ( ( XSEGLEN - DYN_MODEL(1)%XTSTEP ) / TSTATIONS_TIME%XTSTEP ) + 1 -LSTATION = (NUMBSTAT>0) -! -!---------------------------------------------------------------------------- +allocate( tstations_time%tpdates(istore) ) ! -!* 4. Allocations of storage arrays -! ----------------------------- +! Prepare positioning data ! -IF(NUMBSTAT>0) THEN - CALL ALLOCATE_STATION_n() - IF (.NOT. LCARTESIAN) CALL INI_INTERP_STATION_n() -ENDIF -!---------------------------------------------------------------------------- +IF ( CFILE_STAT /= "NO_INPUT_CSV" .OR. NNUMB_STAT > 0 ) THEN + IIU = SIZE( XXHAT ) + IJU = SIZE( XYHAT ) + + ! Get global XHAT and YHAT (needed by STATION_POSITION) + CALL ALLOCBUFFER_ll( ZXHAT_GLOB, XXHAT, 'XX', GALLOCX ) + CALL ALLOCBUFFER_ll( ZYHAT_GLOB, XYHAT, 'YY', GALLOCY ) + CALL GATHERALL_FIELD_ll( 'XX', XXHAT, ZXHAT_GLOB, IERR ) + CALL GATHERALL_FIELD_ll( 'YY', XYHAT, ZYHAT_GLOB, IERR ) + + ! Interpolations of model variables to mass points + ZXHATM(1:IIU-1) = 0.5 * XXHAT(1:IIU-1) + 0.5 * XXHAT(2:IIU ) + ZXHATM( IIU ) = 1.5 * XXHAT( IIU ) - 0.5 * XXHAT( IIU-1) + + ZYHATM(1:IJU-1) = 0.5 * XYHAT(1:IJU-1) + 0.5 * XYHAT(2:IJU ) + ZYHATM( IJU ) = 1.5 * XYHAT( IJU ) - 0.5 * XYHAT( IJU-1) + + ZXHATM_PHYS_MIN = 0.5 * ( ZXHAT_GLOB(1+JPHEXT) + ZXHAT_GLOB(2+JPHEXT) ) + ZXHATM_PHYS_MAX = 0.5 * ( ZXHAT_GLOB(UBOUND(ZXHAT_GLOB,1)-JPHEXT) + ZXHAT_GLOB(UBOUND(ZXHAT_GLOB,1)-JPHEXT+1) ) + ZYHATM_PHYS_MIN = 0.5 * ( ZYHAT_GLOB(1+JPHEXT) + ZYHAT_GLOB(2+JPHEXT) ) + ZYHATM_PHYS_MAX = 0.5 * ( ZYHAT_GLOB(UBOUND(ZYHAT_GLOB,1)-JPHEXT) + ZYHAT_GLOB(UBOUND(ZYHAT_GLOB,1)-JPHEXT+1) ) +END IF ! -CONTAINS +! Stations initialization ! -!---------------------------------------------------------------------------- -SUBROUTINE ALLOCATE_STATION_n() +NUMBSTAT_LOC = 0 -INTEGER :: JI - -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 +IF (CFILE_STAT=="NO_INPUT_CSV") THEN + ! Treat namelist + NUMBSTAT = 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 STATION_INI_INTERP( TZSTATION ) + END IF + TZSTATION%XZ = XZ_STAT(JI) + TZSTATION%CNAME = CNAME_STAT(JI) -ISTORE = NINT ( ( PSEGLEN - DYN_MODEL(1)%XTSTEP ) / TSTATIONS_TIME%XTSTEP ) + 1 + CALL STATION_POSITION( TZSTATION, ZXHAT_GLOB, ZYHAT_GLOB, ZXHATM, ZYHATM, & + ZXHATM_PHYS_MIN, ZXHATM_PHYS_MAX, ZYHATM_PHYS_MIN, ZYHATM_PHYS_MAX, & + GINSIDE, GPRESENT ) -allocate( tstations_time%tpdates(istore) ) + IF ( GINSIDE ) THEN + NUMBSTAT = NUMBSTAT + 1 + TZSTATION%NID = NUMBSTAT + END IF -DO JI = 1, NUMBSTAT - ALLOCATE(TSTATIONS(JI)%XZON (ISTORE)) - ALLOCATE(TSTATIONS(JI)%XMER (ISTORE)) - ALLOCATE(TSTATIONS(JI)%XW (ISTORE)) - ALLOCATE(TSTATIONS(JI)%XP (ISTORE)) - IF (OUSETKE) THEN - ALLOCATE(TSTATIONS(JI)%XTKE (ISTORE)) - ELSE - ALLOCATE(TSTATIONS(JI)%XTKE (0)) + IF ( GPRESENT ) CALL STATION_ADD( TZSTATION ) + END DO END IF - ALLOCATE(TSTATIONS(JI)%XTH (ISTORE)) - ALLOCATE(TSTATIONS(JI)%XR (ISTORE,KRR)) - ALLOCATE(TSTATIONS(JI)%XSV (ISTORE,KSV)) - ALLOCATE(TSTATIONS(JI)%XTSRAD (ISTORE)) - ALLOCATE(TSTATIONS(JI)%XT2M (ISTORE)) - ALLOCATE(TSTATIONS(JI)%XQ2M (ISTORE)) - ALLOCATE(TSTATIONS(JI)%XHU2M (ISTORE)) - ALLOCATE(TSTATIONS(JI)%XZON10M(ISTORE)) - ALLOCATE(TSTATIONS(JI)%XMER10M(ISTORE)) - ALLOCATE(TSTATIONS(JI)%XRN (ISTORE)) - ALLOCATE(TSTATIONS(JI)%XH (ISTORE)) - ALLOCATE(TSTATIONS(JI)%XLE (ISTORE)) - ALLOCATE(TSTATIONS(JI)%XLEI (ISTORE)) - ALLOCATE(TSTATIONS(JI)%XGFLUX (ISTORE)) - ALLOCATE(TSTATIONS(JI)%XSWD (ISTORE)) - ALLOCATE(TSTATIONS(JI)%XSWU (ISTORE)) - ALLOCATE(TSTATIONS(JI)%XLWD (ISTORE)) - ALLOCATE(TSTATIONS(JI)%XLWU (ISTORE)) - ALLOCATE(TSTATIONS(JI)%XSWDIR (ISTORE)) - ALLOCATE(TSTATIONS(JI)%XSWDIFF(ISTORE)) - ALLOCATE(TSTATIONS(JI)%XDSTAOD(ISTORE)) - ALLOCATE(TSTATIONS(JI)%XSFCO2 (ISTORE)) +ELSE + !Treat CSV datafile + CALL READ_CSV_STATION( CFILE_STAT, ZXHAT_GLOB, ZYHAT_GLOB, ZXHATM, ZYHATM, & + ZXHATM_PHYS_MIN, ZXHATM_PHYS_MAX,ZYHATM_PHYS_MIN, ZYHATM_PHYS_MAX ) +END IF - TSTATIONS(JI)%XZON(:) = XUNDEF - TSTATIONS(JI)%XMER(:) = XUNDEF - TSTATIONS(JI)%XW(:) = XUNDEF - TSTATIONS(JI)%XP(:) = XUNDEF - TSTATIONS(JI)%XTKE(:) = XUNDEF - TSTATIONS(JI)%XTH(:) = XUNDEF - TSTATIONS(JI)%XR(:,:) = XUNDEF - TSTATIONS(JI)%XSV(:,:) = XUNDEF - TSTATIONS(JI)%XTSRAD(:) = XUNDEF - TSTATIONS(JI)%XT2M(:) = XUNDEF - TSTATIONS(JI)%XQ2M(:) = XUNDEF - TSTATIONS(JI)%XHU2M(:) = XUNDEF - TSTATIONS(JI)%XZON10M(:) = XUNDEF - TSTATIONS(JI)%XMER10M(:) = XUNDEF - TSTATIONS(JI)%XRN(:) = XUNDEF - TSTATIONS(JI)%XH(:) = XUNDEF - TSTATIONS(JI)%XLE(:) = XUNDEF - TSTATIONS(JI)%XLEI(:) = XUNDEF - TSTATIONS(JI)%XGFLUX(:) = XUNDEF - TSTATIONS(JI)%XSWD(:) = XUNDEF - TSTATIONS(JI)%XSWU(:) = XUNDEF - TSTATIONS(JI)%XLWD(:) = XUNDEF - TSTATIONS(JI)%XLWU(:) = XUNDEF - TSTATIONS(JI)%XSWDIR(:) = XUNDEF - TSTATIONS(JI)%XSWDIFF(:) = XUNDEF - TSTATIONS(JI)%XDSTAOD(:) = XUNDEF - TSTATIONS(JI)%XSFCO2(:) = XUNDEF -END DO +LSTATION = ( NUMBSTAT > 0 ) -END SUBROUTINE ALLOCATE_STATION_n -!---------------------------------------------------------------------------- -!---------------------------------------------------------------------------- -SUBROUTINE INI_INTERP_STATION_n() +DO JI = 1, NUMBSTAT_LOC + CALL STATION_ALLOCATE( TSTATIONS(JI), ISTORE ) +END DO ! -USE MODE_STATION_TOOLS, ONLY: STATION_POSITION - -INTEGER :: JII -INTEGER :: IIU, IJU +! Clean positioning data ! -IF ( ALL(TSTATIONS(:)%XLAT /= XUNDEF) .AND. ALL(TSTATIONS(:)%XLON /= XUNDEF) ) THEN - DO JII = 1, NUMBSTAT - CALL GET_DIM_EXT_ll ('B',IIU,IJU) - CALL SM_XYHAT(PLATOR,PLONOR, & - TSTATIONS(JII)%XLAT, TSTATIONS(JII)%XLON, & - TSTATIONS(JII)%XX, TSTATIONS(JII)%XY ) - CALL STATION_POSITION( TSTATIONS(JII) ) - END DO -ELSE - CMNHMSG(1) = 'Error in station position' - CMNHMSG(1) = 'either LATitude or LONgitude segment' - CMNHMSG(1) = 'or I and J segment' - CMNHMSG(1) = 'definition is not complete.' - CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_SURFSTATION_n' ) +IF ( CFILE_STAT /= "NO_INPUT_CSV" .OR. NNUMB_STAT > 0 ) THEN + IF ( GALLOCX ) DEALLOCATE( ZXHAT_GLOB ) + IF ( GALLOCY ) DEALLOCATE( ZYHAT_GLOB ) END IF -END SUBROUTINE INI_INTERP_STATION_n !---------------------------------------------------------------------------- -!---------------------------------------------------------------------------- -! + END SUBROUTINE INI_SURFSTATION_n diff --git a/src/MNH/modd_allstationn.f90 b/src/MNH/modd_allstationn.f90 index 933c16571..4229177e4 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,6 +29,7 @@ !! MODIFICATIONS !! ------------- !! Original 01/06/21 +! P. Wautelet 04/2022: restructure stations for better performance, reduce memory usage and correct some problems/bugs !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -36,11 +37,16 @@ ! ! USE MODD_PARAMETERS, ONLY: JPMODELMAX -USE MODD_STATION_n -USE MODD_TYPE_STATION 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,7 +54,7 @@ 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=7), DIMENSION(100) :: CNAME_STAT CHARACTER(LEN=20) :: CFILE_STAT REAL :: XSTEP_STAT LOGICAL :: LDIAG_SURFRAD @@ -66,7 +72,6 @@ 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() 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_stationn.f90 b/src/MNH/modd_stationn.f90 index ff5351dee..6017c0f98 100644 --- a/src/MNH/modd_stationn.f90 +++ b/src/MNH/modd_stationn.f90 @@ -29,25 +29,31 @@ !! MODIFICATIONS !! ------------- !! Original 15/01/02 -! P. Wautelet 07/04/2022: rewrite types for stations +! 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_TYPE_STATION +USE MODD_PARAMETERS, ONLY: JPMODELMAX +USE MODD_TYPE_STATION, ONLY: TSTATIONDATA, TSTATIONTIME IMPLICIT NONE +PRIVATE + +PUBLIC :: LSTATION, NUMBSTAT, 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(TSTATIONTIME) :: TSTATIONS_TIME TYPE(TSTATIONDATA), DIMENSION(:), POINTER :: TSTATIONS ! characteristics and records of the stations @@ -58,7 +64,7 @@ TYPE(STATION_t), DIMENSION(JPMODELMAX), TARGET, SAVE :: STATION_MODEL LOGICAL, POINTER :: LSTATION=>NULL() INTEGER, POINTER :: NUMBSTAT=>NULL() -LOGICAL, POINTER :: LSTATLAT=>NULL() +INTEGER, POINTER :: NUMBSTAT_LOC=>NULL() TYPE(TSTATIONTIME), POINTER :: TSTATIONS_TIME => NULL() TYPE(TSTATIONDATA), DIMENSION(:), POINTER :: TSTATIONS => NULL() @@ -73,7 +79,7 @@ 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 +NUMBSTAT_LOC => STATION_MODEL(KTO)%NUMBSTAT_LOC TSTATIONS_TIME => STATION_MODEL(KTO)%TSTATIONS_TIME TSTATIONS => STATION_MODEL(KTO)%TSTATIONS diff --git a/src/MNH/modd_type_station.f90 b/src/MNH/modd_type_station.f90 index ac0134eab..8d34883fa 100644 --- a/src/MNH/modd_type_station.f90 +++ b/src/MNH/modd_type_station.f90 @@ -30,14 +30,14 @@ !! ------------- !! Original 15/01/02 ! P. Wautelet 13/09/2019: budget: simplify and modernize date/time management -! P. Wautelet 07/04/2022: rewrite types for stations +! P. Wautelet 04/2022: restructure stations 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, NUNDEF, XUNDEF +use modd_parameters, only: NNEGUNDEF, XUNDEF implicit none @@ -54,10 +54,10 @@ END TYPE TSTATIONTIME TYPE TSTATIONDATA ! Type to store all the data of 1 station + CHARACTER(LEN=8) :: CNAME = '' ! station name -CHARACTER(LEN=8) :: CTYPE = '' ! station type (currently not used) -LOGICAL :: LERROR = .FALSE. ! -LOGICAL :: LPRESENT = .FALSE. ! If true, this station is situated on this process + +INTEGER :: NID = 0 ! Global identification number of the station (from 1 to total number of stations of the model) REAL :: XX = XUNDEF ! X(n) REAL :: XY = XUNDEF ! Y(n) @@ -78,7 +78,7 @@ 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) -INTEGER :: NK = NUNDEF ! Model level for altitude comparisons +INTEGER :: NK = NNEGUNDEF ! Model level for altitude comparisons REAL, DIMENSION(:), ALLOCATABLE :: XZON ! zonal wind(n) REAL, DIMENSION(:), ALLOCATABLE :: XMER ! meridian wind(n) diff --git a/src/MNH/modn_stationn.f90 b/src/MNH/modn_stationn.f90 index f388061e7..ab6013ee2 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,6 +21,7 @@ !! MODIFICATIONS !! ------------- !! Original 10/03/20 +! P. Wautelet 04/2022: restructure stations for better performance, reduce memory usage and correct some problems/bugs !! !! IMPLICIT ARGUMENTS !! ------------------ @@ -34,7 +35,6 @@ 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 !! @@ -46,7 +46,7 @@ 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=7), DIMENSION(100),SAVE:: CNAME_STAT CHARACTER (LEN=20) ,SAVE:: CFILE_STAT !filename LOGICAL ,SAVE:: LDIAG_SURFRAD @@ -54,7 +54,7 @@ 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 +69,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 +82,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/station_reader.f90 b/src/MNH/station_reader.f90 index 3e7741e8b..1a72bfe1a 100644 --- a/src/MNH/station_reader.f90 +++ b/src/MNH/station_reader.f90 @@ -4,21 +4,18 @@ !MNH_LIC for details. version 1. !----------------------------------------------------------------- ! ####################### - MODULE MODI_STATION_READER + MODULE MODE_STATION_READER ! ####################### -! -INTERFACE -! -SUBROUTINE READ_CSV_STATION( HFILE, TPSTATIONS, OCARTESIAN ) -USE MODD_STATION_n -CHARACTER(LEN=*), INTENT(IN) :: HFILE ! file to read -TYPE(TSTATIONDATA), DIMENSION(:), POINTER, INTENT(INOUT) :: TPSTATIONS -LOGICAL, INTENT(IN) :: OCARTESIAN -END SUBROUTINE READ_CSV_STATION -! -END INTERFACE -! -END MODULE MODI_STATION_READER + +IMPLICIT NONE + +PRIVATE + +PUBLIC :: READ_CSV_STATION + +INTEGER, PARAMETER :: NMAXLINELGT = 400 + +CONTAINS !------------------------------------------------------------------- ! !!**** *READ_CSV_STATION* - @@ -34,85 +31,85 @@ END MODULE MODI_STATION_READER !! MODIFICATIONS !! ------------- !! 03/2020 Original -! P. Wautelet 07/04/2022: rewrite types for stations +! P. Wautelet 04/2022: restructure stations for better performance, reduce memory usage and correct some problems/bugs !--------------------------------------------------------------- ! -!######################################################### -SUBROUTINE READ_CSV_STATION( HFILE, TPSTATIONS, OCARTESIAN ) -USE MODD_ALLSTATION_n -USE MODD_STATION_n -USE MODD_PARAMETERS -USE MODD_TYPE_STATION -USE MODI_INI_SURFSTATION_n +!############################################################################################### +SUBROUTINE READ_CSV_STATION( HFILE, PXHAT_GLOB, PYHAT_GLOB, PXHATM, PYHATM, & + PXHATM_PHYS_MIN, PXHATM_PHYS_MAX,PYHATM_PHYS_MIN, PYHATM_PHYS_MAX ) +!############################################################################################### +USE MODD_CONF, ONLY: LCARTESIAN +USE MODD_STATION_n, ONLY: NUMBSTAT +USE MODD_TYPE_STATION, ONLY: TSTATIONDATA + +USE MODE_MSG +USE MODE_STATION_TOOLS, ONLY: STATION_ADD, STATION_INI_INTERP, STATION_POSITION + +CHARACTER(LEN=*), INTENT(IN) :: HFILE ! file to read +REAL, DIMENSION(:), INTENT(IN) :: PXHAT_GLOB +REAL, DIMENSION(:), INTENT(IN) :: PYHAT_GLOB +REAL, DIMENSION(:), INTENT(IN) :: PXHATM ! mass point coordinates +REAL, DIMENSION(:), INTENT(IN) :: PYHATM ! mass point coordinates +REAL, INTENT(IN) :: PXHATM_PHYS_MIN, PYHATM_PHYS_MIN ! Minimum X coordinate of mass points in the physical domain +REAL, INTENT(IN) :: PXHATM_PHYS_MAX, PYHATM_PHYS_MAX ! Minimum X coordinate of mass points in the physical domain ! -CHARACTER(LEN=*), INTENT(IN) :: HFILE ! file to read -TYPE(TSTATIONDATA), DIMENSION(:), POINTER, INTENT(INOUT) :: TPSTATIONS -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 -! +CHARACTER(LEN=NMAXLINELGT) :: YSTRING +INTEGER :: ILU ! logical unit of the file +INTEGER :: INBLINE ! Nb of lines in csv file +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 + +INBLINE = 0 !Number of stations found in the file +NUMBSTAT = 0 !Number of stations found in the file AND inside the model domain ! Open file -OPEN(NEWUNIT=ILU,FILE=HFILE, FORM='formatted') -! Count lines -REWIND(ILU) -INBLINE=0 +OPEN( NEWUNIT = ILU, FILE = HFILE, FORM = 'formatted' ) + +READ( ILU, END = 101, FMT = '(A)' ) YSTRING ! Reading of header (skip it) + 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 + ! Read station 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, * ) TZSTATION%CNAME, TZSTATION%XX, TZSTATION%XY, TZSTATION%XZ + ELSE + READ( YSTRING, * ) TZSTATION%CNAME, TZSTATION%XLAT, TZSTATION%XLON, TZSTATION%XZ + END IF + + IF ( .NOT. LCARTESIAN ) CALL STATION_INI_INTERP( TZSTATION ) + CALL STATION_POSITION( TZSTATION, PXHAT_GLOB, PYHAT_GLOB, PXHATM, PYHATM, & + PXHATM_PHYS_MIN, PXHATM_PHYS_MAX, PYHATM_PHYS_MIN, PYHATM_PHYS_MAX, & + GINSIDE, GPRESENT ) + + IF ( GINSIDE ) THEN + NUMBSTAT = NUMBSTAT + 1 + TZSTATION%NID = NUMBSTAT + END IF + + IF ( GPRESENT ) CALL STATION_ADD( TZSTATION ) + 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 stations - NUMBSTAT = INBLINE - 1 - - ALLOCATE( TPSTATIONS(NUMBSTAT) ) - - ! New reading - REWIND(ILU) - READ(ILU,FMT='(A400)') YSTRING ! Reading of header - ! - ! Save the data - IF (OCARTESIAN) THEN - INBLINE = 1 - DO INBLINE=1, NUMBSTAT - READ(ILU,FMT='(A400)') YSTRING - READ(YSTRING,*) TPSTATIONS(INBLINE)%CNAME, & !TPSTATIONS(INBLINE)%CTYPE,& - TPSTATIONS(INBLINE)%XX, TPSTATIONS(INBLINE)%XY, TPSTATIONS(INBLINE)%XZ - END DO - REWIND(ILU) - CLOSE(ILU) - RETURN - ELSE - INBLINE = 1 - DO INBLINE=1, NUMBSTAT - READ(ILU,FMT='(A400)') YSTRING - READ(YSTRING,*) TPSTATIONS(INBLINE)%CNAME, & !TPSTATIONS(INBLINE)%CTYPE,& - TPSTATIONS(INBLINE)%XLAT, TPSTATIONS(INBLINE)%XLON, TPSTATIONS(INBLINE)%XZ - END DO - REWIND(ILU) - CLOSE(ILU) - RETURN - END IF - END IF -! + +CLOSE( ILU ) + +IF ( INBLINE == 0 ) CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'READ_CSV_STATION', 'Data not found in file ' // TRIM( HFILE ) ) + END SUBROUTINE READ_CSV_STATION + !######################################################### SUBROUTINE FRENCH_TO_ENGLISH(HSTRING) -CHARACTER(LEN=400), INTENT(INOUT) :: HSTRING ! csv record +CHARACTER(LEN=NMAXLINELGT), INTENT(INOUT) :: HSTRING ! csv record + INTEGER :: JL LOGICAL :: GFRENCH ! @@ -120,13 +117,13 @@ 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 +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,400 + DO JL = 1, NMAXLINELGT IF (HSTRING(JL:JL)==',') HSTRING(JL:JL)='.' IF (HSTRING(JL:JL)==';') HSTRING(JL:JL)=',' END DO @@ -134,3 +131,4 @@ END IF ! END SUBROUTINE FRENCH_TO_ENGLISH +END MODULE MODE_STATION_READER diff --git a/src/MNH/station_tools.f90 b/src/MNH/station_tools.f90 index 1aa02f68e..10b3c1ee3 100644 --- a/src/MNH/station_tools.f90 +++ b/src/MNH/station_tools.f90 @@ -1,9 +1,10 @@ -!MNH_LIC Copyright 2022-2022 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. !----------------------------------------------------------------- -! Author: +! Authors: +! Misc: some of the code was taken from older subroutines/functions for stations ! P. Wautelet 08/04/2022 !----------------------------------------------------------------- ! Modifications: @@ -12,84 +13,381 @@ MODULE MODE_STATION_TOOLS ! ################## +USE MODD_TYPE_STATION, ONLY: TSTATIONDATA + IMPLICIT NONE PRIVATE +PUBLIC :: STATION_ALLOCATE +PUBLIC :: STATION_INI_INTERP PUBLIC :: STATION_POSITION +PUBLIC :: STATION_ADD +PUBLIC :: STATION_INTERP_2D, STATION_INTERP_2D_U, STATION_INTERP_2D_V CONTAINS -! ###################################### -SUBROUTINE STATION_POSITION( TPSTATION ) -! ###################################### +! ############################################## +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 + + 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 + TPSTATION%XQ2M(:) = XUNDEF + TPSTATION%XHU2M(:) = XUNDEF + TPSTATION%XZON10M(:) = XUNDEF + TPSTATION%XMER10M(:) = XUNDEF + TPSTATION%XRN(:) = XUNDEF + TPSTATION%XH(:) = XUNDEF + TPSTATION%XLE(:) = XUNDEF + TPSTATION%XLEI(:) = XUNDEF + TPSTATION%XGFLUX(:) = XUNDEF + 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 + END IF + +END SUBROUTINE STATION_ALLOCATE + +! ######################################## +SUBROUTINE STATION_INI_INTERP( TPSTATION ) +! ######################################## + + USE MODD_GRID, ONLY: XLATORI, XLONORI + USE MODD_PARAMETERS, ONLY: XUNDEF + + USE MODE_GRIDPROJ, ONLY: SM_XYHAT + USE MODE_MSG + + IMPLICIT NONE + + TYPE(TSTATIONDATA), INTENT(INOUT) :: TPSTATION + + IF ( TPSTATION%XLAT == XUNDEF .OR. TPSTATION%XLON == XUNDEF ) THEN + CMNHMSG(1) = 'Error in station 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', 'STATION_INI_INTERP' ) + END IF + + CALL SM_XYHAT( XLATORI, XLONORI, & + TPSTATION%XLAT, TPSTATION%XLON, & + TPSTATION%XX, TPSTATION%XY ) + +END SUBROUTINE STATION_INI_INTERP + +! ############################################################################################### +SUBROUTINE STATION_POSITION( TPSTATION, PXHAT_GLOB, PYHAT_GLOB, PXHATM, PYHATM, & + PXHATM_PHYS_MIN, PXHATM_PHYS_MAX,PYHATM_PHYS_MIN, PYHATM_PHYS_MAX, & + OINSIDE, OPRESENT ) +! ############################################################################################### ! Subroutine to determine the position of a station on the model grid -! and set the useful coefficient for data interpolation +! and set the useful coefficients for data interpolation - USE MODD_CONF, ONLY: L1D - USE MODD_GRID_n, ONLY: XXHAT, XYHAT - USE MODD_TYPE_STATION, ONLY: TSTATIONDATA + USE MODD_CONF, ONLY: L1D + USE MODD_GRID_n, ONLY: XXHAT, XYHAT, XZZ + USE MODD_PARAMETERS, ONLY: JPHEXT, JPVEXT - USE MODE_TOOLS_ll, ONLY: GET_INDICE_ll, LWEST_ll, LEAST_ll, LNORTH_ll, LSOUTH_ll + USE MODE_MSG + USE MODE_NEST_LL, ONLY: GET_MODEL_NUMBER_ll + USE MODE_TOOLS_ll, ONLY: GET_INDICE_ll IMPLICIT NONE TYPE(TSTATIONDATA), INTENT(INOUT) :: TPSTATION + REAL, DIMENSION(:), INTENT(IN) :: PXHAT_GLOB + REAL, DIMENSION(:), INTENT(IN) :: PYHAT_GLOB + REAL, DIMENSION(:), INTENT(IN) :: PXHATM ! mass point coordinates + REAL, DIMENSION(:), INTENT(IN) :: PYHATM ! mass point coordinates + REAL, INTENT(IN) :: PXHATM_PHYS_MIN, PYHATM_PHYS_MIN ! Minimum X coordinate of mass points in the physical domain + REAL, INTENT(IN) :: PXHATM_PHYS_MAX, PYHATM_PHYS_MAX ! Minimum X coordinate of mass points in the physical domain + LOGICAL, INTENT(OUT) :: OINSIDE ! True if station is inside physical domain of model + LOGICAL, INTENT(OUT) :: OPRESENT ! True if station is present on the current process INTEGER :: IIB ! domain sizes of current process INTEGER :: IJB ! INTEGER :: IIE ! INTEGER :: IJE ! - INTEGER :: IIU ! - INTEGER :: IJU ! - REAL, DIMENSION(SIZE(XXHAT)) :: ZXHATM ! mass point coordinates - REAL, DIMENSION(SIZE(XYHAT)) :: ZYHATM ! mass point coordinates - - IIU = SIZE( XXHAT ) - IJU = SIZE( XYHAT ) + INTEGER :: IMI + INTEGER :: JK + REAL :: ZLOW, ZHIGH - CALL GET_INDICE_ll (IIB, IJB, IIE, IJE ) + OPRESENT = .FALSE. + OINSIDE = .FALSE. - ! Interpolations of model variables to mass points - ZXHATM(1:IIU-1) = 0.5 * XXHAT(1:IIU-1) + 0.5 * XXHAT(2:IIU ) - ZXHATM( IIU ) = 1.5 * XXHAT( IIU ) - 0.5 * XXHAT( IIU-1) + CALL GET_INDICE_ll( IIB, IJB, IIE, IJE ) - ZYHATM(1:IJU-1) = 0.5 * XYHAT(1:IJU-1) + 0.5 * XYHAT(2:IJU ) - ZYHATM( IJU ) = 1.5 * XYHAT( IJU ) - 0.5 * XYHAT( IJU-1) - - TPSTATION%LPRESENT = .FALSE. + IF ( TPSTATION%XX >= PXHAT_GLOB(JPHEXT+1) .AND. TPSTATION%XX <= PXHAT_GLOB(UBOUND(PXHAT_GLOB,1)-JPHEXT+1) & + .AND. TPSTATION%XY >= PYHAT_GLOB(JPHEXT+1) .AND. TPSTATION%XY <= PYHAT_GLOB(UBOUND(PYHAT_GLOB,1)-JPHEXT+1) ) THEN + OINSIDE = .TRUE. + ELSE + CALL GET_MODEL_NUMBER_ll(IMI) + WRITE( CMNHMSG(1), "( 'station ', A, ' is outside of physical domain of model', I3 )" ) TRIM(TPSTATION%CNAME), IMI + CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'STATION_POSITION' ) + END IF ! X position TPSTATION%NI_U = COUNT( XXHAT (:) <= TPSTATION%XX ) - TPSTATION%NI_M = COUNT( ZXHATM(:) <= TPSTATION%XX ) - - IF ( TPSTATION%NI_M<=IIB-1 .AND. LWEST_ll() .AND. .NOT. L1D ) TPSTATION%LERROR = .TRUE. - IF ( TPSTATION%NI_M>=IIE .AND. LEAST_ll() .AND. .NOT. L1D ) TPSTATION%LERROR = .TRUE. + TPSTATION%NI_M = COUNT( PXHATM(:) <= TPSTATION%XX ) ! Y position TPSTATION%NJ_V = COUNT( XYHAT (:) <= TPSTATION%XY ) - TPSTATION%NJ_M = COUNT( ZYHATM(:) <= TPSTATION%XY ) + TPSTATION%NJ_M = COUNT( PYHATM(:) <= TPSTATION%XY ) - IF ( TPSTATION%NJ_M<=IJB-1 .AND. LSOUTH_ll() .AND. .NOT. L1D ) TPSTATION%LERROR = .TRUE. - IF ( TPSTATION%NJ_M>=IJE .AND. LNORTH_ll() .AND. .NOT. L1D ) TPSTATION%LERROR = .TRUE. - - ! Position of station according to processes + ! Position of station according to process IF ( TPSTATION%NI_U >= IIB .AND. TPSTATION%NI_U <= IIE & - .AND. TPSTATION%NJ_V >= IJB .AND. TPSTATION%NJ_V <= IJE ) TPSTATION%LPRESENT = .TRUE. - IF ( L1D ) TPSTATION%LPRESENT = .TRUE. + .AND. TPSTATION%NJ_V >= IJB .AND. TPSTATION%NJ_V <= IJE ) OPRESENT = .TRUE. + IF ( L1D ) OPRESENT = .TRUE. + + ! Check if station is too near of physical domain border (outside of physical domain for mass points) + IF ( OINSIDE .AND. .NOT. L1D ) THEN + IF ( TPSTATION%XX < PXHATM_PHYS_MIN .OR. TPSTATION%XX > PXHATM_PHYS_MAX & + .OR. TPSTATION%XY < PYHATM_PHYS_MIN .OR. TPSTATION%XY > PYHATM_PHYS_MAX ) THEN + CALL GET_MODEL_NUMBER_ll(IMI) + WRITE( CMNHMSG(1), "( 'station ', A, ' is outside of mass-points physical domain of model', I3 )" ) & + TRIM(TPSTATION%CNAME), IMI + CMNHMSG(2) = 'but is inside of flux-points physical domain.' + CMNHMSG(3) = 'Meaning: station is too close to the boundaries of physical domain.' + CMNHMSG(4) = '=> station disabled (not computed)' + CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'STATION_POSITION' ) + OPRESENT = .FALSE. + OINSIDE = .FALSE. + END IF + END IF ! Computations only on correct process - IF ( TPSTATION%LPRESENT .AND. .NOT. L1D ) THEN + IF ( OPRESENT .AND. .NOT. L1D ) THEN ! Interpolation coefficient for X (mass-point) - TPSTATION%XXMCOEF = ( TPSTATION%XX - ZXHATM(TPSTATION%NI_M) ) / ( ZXHATM(TPSTATION%NI_M+1) - ZXHATM(TPSTATION%NI_M) ) + TPSTATION%XXMCOEF = ( TPSTATION%XX - PXHATM(TPSTATION%NI_M) ) / ( PXHATM(TPSTATION%NI_M+1) - PXHATM(TPSTATION%NI_M) ) ! Interpolation coefficient for Y (mass-point) - TPSTATION%XYMCOEF = ( TPSTATION%XY - ZYHATM(TPSTATION%NJ_M) ) / ( ZYHATM(TPSTATION%NJ_M+1) - ZYHATM(TPSTATION%NJ_M) ) + TPSTATION%XYMCOEF = ( TPSTATION%XY - PYHATM(TPSTATION%NJ_M) ) / ( PYHATM(TPSTATION%NJ_M+1) - PYHATM(TPSTATION%NJ_M) ) ! Interpolation coefficient for X (U-point) TPSTATION%XXUCOEF = ( TPSTATION%XX - XXHAT(TPSTATION%NI_U) ) / ( XXHAT(TPSTATION%NI_U+1) - XXHAT(TPSTATION%NI_U) ) ! Interpolation coefficient for Y (V-point) TPSTATION%XYVCOEF = ( TPSTATION%XY - XYHAT(TPSTATION%NJ_V) ) / ( XYHAT(TPSTATION%NJ_V+1) - XYHAT(TPSTATION%NJ_V) ) END IF + IF ( OPRESENT ) THEN + ! The closest K-level to the station altitude is chosen + JK = JPVEXT + 1 + DO WHILE ( ( STATION_INTERP_2D( TPSTATION, XZZ(:,:,JK) ) - STATION_INTERP_2D( TPSTATION, XZZ(:,:,JPVEXT+1) ) ) < TPSTATION%XZ) + JK = JK + 1 + END DO + ZLOW = STATION_INTERP_2D( TPSTATION, XZZ(:,:,JK-1) ) - STATION_INTERP_2D( TPSTATION, XZZ(:,:,JPVEXT+1) ) + ZHIGH = STATION_INTERP_2D( TPSTATION, XZZ(:,:,JK ) ) - STATION_INTERP_2D( TPSTATION, XZZ(:,:,JPVEXT+1) ) + !If the station is nearer from the lower level, select it + IF ( ( ZHIGH - TPSTATION%XZ ) > ( TPSTATION%XZ - ZLOW ) ) JK = JK - 1 + TPSTATION%NK = JK + END IF + END SUBROUTINE STATION_POSITION +! ################################# +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 + + TYPE(TSTATIONDATA), 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 + TZSTATIONS(NUMBSTAT_LOC) = TPSTATION + 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 STATION_INTERP_2D( TPSTATION, PA ) RESULT( PB ) +! ###################################################### + USE MODD_CONF, ONLY: L1D + + USE MODE_MSG + + IMPLICIT NONE + + TYPE(TSTATIONDATA), INTENT(IN) :: TPSTATION + 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 = TPSTATION%NI_M + JJ = TPSTATION%NJ_M + END IF + + IF ( JI >= 1 .AND. JI < SIZE( PA, 1 ) & + .AND. JJ >= 1 .AND. JJ < SIZE( PA, 2 ) ) THEN + PB = (1.-TPSTATION%XXMCOEF) * (1.-TPSTATION%XYMCOEF) * PA(JI,JJ) + & + ( TPSTATION%XXMCOEF) * (1.-TPSTATION%XYMCOEF) * PA(JI+1,JJ) + & + (1.-TPSTATION%XXMCOEF) * ( TPSTATION%XYMCOEF) * PA(JI,JJ+1) + & + ( TPSTATION%XXMCOEF) * ( TPSTATION%XYMCOEF) * PA(JI+1,JJ+1) + ELSE + CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'STATION_INTERP_2D', 'value can not be interpolated' ) + END IF + +END FUNCTION STATION_INTERP_2D + +! ######################################################## +FUNCTION STATION_INTERP_2D_U( TPSTATION, PA ) RESULT( PB ) +! ######################################################## + USE MODD_CONF, ONLY: L1D + + USE MODE_MSG + + IMPLICIT NONE + + TYPE(TSTATIONDATA), INTENT(IN) :: TPSTATION + 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 = TPSTATION%NI_U + JJ = TPSTATION%NJ_M + END IF + + IF ( JI >= 1 .AND. JI < SIZE( PA, 1 ) & + .AND. JJ >= 1 .AND. JJ < SIZE( PA, 2 ) ) THEN + PB = (1.-TPSTATION%XXUCOEF) * (1.-TPSTATION%XYMCOEF) * PA(JI,JJ) + & + ( TPSTATION%XXUCOEF) * (1.-TPSTATION%XYMCOEF) * PA(JI+1,JJ) + & + (1.-TPSTATION%XXUCOEF) * ( TPSTATION%XYMCOEF) * PA(JI,JJ+1) + & + ( TPSTATION%XXUCOEF) * ( TPSTATION%XYMCOEF) * PA(JI+1,JJ+1) + ELSE + CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'STATION_INTERP_2D_U', 'value can not be interpolated' ) + END IF + +END FUNCTION STATION_INTERP_2D_U + +! ######################################################## +FUNCTION STATION_INTERP_2D_V( TPSTATION, PA ) RESULT( PB ) +! ######################################################## + USE MODD_CONF, ONLY: L1D + + USE MODE_MSG + + IMPLICIT NONE + + TYPE(TSTATIONDATA), INTENT(IN) :: TPSTATION + 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 = TPSTATION%NI_M + JJ = TPSTATION%NJ_V + END IF + + IF ( JI >= 1 .AND. JI < SIZE( PA, 1 ) & + .AND. JJ >= 1 .AND. JJ < SIZE( PA, 2 ) ) THEN + PB = (1.-TPSTATION%XXMCOEF) * (1.-TPSTATION%XYVCOEF) * PA(JI,JJ) + & + ( TPSTATION%XXMCOEF) * (1.-TPSTATION%XYVCOEF) * PA(JI+1,JJ) + & + (1.-TPSTATION%XXMCOEF) * ( TPSTATION%XYVCOEF) * PA(JI,JJ+1) + & + ( TPSTATION%XXMCOEF) * ( TPSTATION%XYVCOEF) * PA(JI+1,JJ+1) + ELSE + CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'STATION_INTERP_2D_V', 'value can not be interpolated' ) + END IF + +END FUNCTION STATION_INTERP_2D_V + END MODULE MODE_STATION_TOOLS diff --git a/src/MNH/stationn.f90 b/src/MNH/stationn.f90 index dcb38f6d3..0343d9da3 100644 --- a/src/MNH/stationn.f90 +++ b/src/MNH/stationn.f90 @@ -75,33 +75,29 @@ END MODULE MODI_STATION_n ! 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 +! 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 07/04/2022: rewrite types for stations +! 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, XUNDEF USE MODD_PARAM_n, ONLY: CRAD USE MODD_STATION_n USE MODD_ALLSTATION_n, ONLY: LDIAG_SURFRAD -USE MODD_TIME, ONLY: tdtexp USE MODD_TIME_n, ONLY: tdtcur ! -USE MODE_ll -! -USE MODI_WATER_SUM -! +USE MODE_STATION_TOOLS, ONLY: STATION_INTERP_2D, STATION_INTERP_2D_U, STATION_INTERP_2D_V ! ! IMPLICIT NONE @@ -129,21 +125,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 ! @@ -151,33 +132,8 @@ 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 :: 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 ! !---------------------------------------------------------------------------- ! @@ -189,260 +145,73 @@ IF ( TSTATIONS_TIME%XTIME_CUR == XUNDEF ) TSTATIONS_TIME%XTIME_CUR = TSTATIONS_T TSTATIONS_TIME%XTIME_CUR = TSTATIONS_TIME%XTIME_CUR + PTSTEP ! IF ( TSTATIONS_TIME%XTIME_CUR >= TSTATIONS_TIME%XTSTEP - 1.E-10 ) THEN - GSTORE = .TRUE. - TSTATIONS_TIME%XTIME_CUR = TSTATIONS_TIME%XTIME_CUR - TSTATIONS_TIME%XTSTEP - TSTATIONS_TIME%N_CUR = TSTATIONS_TIME%N_CUR + 1 - IN = TSTATIONS_TIME%N_CUR -ELSE - GSTORE = .FALSE. -END IF -! -IF (GSTORE) THEN -#if 0 - tstations_time%tpdates(in)%date%year = tdtexp%date%year - tstations_time%tpdates(in)%date%month = tdtexp%date%month - tstations_time%tpdates(in)%date%day = tdtexp%date%day - tstations_time%tpdates(in)%xtime = tdtexp%xtime + ( in - 1 ) * tstation%step -#else + TSTATIONS_TIME%XTIME_CUR = TSTATIONS_TIME%XTIME_CUR - TSTATIONS_TIME%XTSTEP + TSTATIONS_TIME%N_CUR = TSTATIONS_TIME%N_CUR + 1 + IN = TSTATIONS_TIME%N_CUR tstations_time%tpdates(in) = tdtcur -#endif +ELSE + !No station storage at this time step + RETURN END IF ! -! !---------------------------------------------------------------------------- ! !* 8. DATA RECORDING ! -------------- ! -IF (GSTORE) THEN - DO I=1,NUMBSTAT - ! - IF ( TSTATIONS(I)%LPRESENT .AND. .NOT. TSTATIONS(I)%LERROR ) THEN - IF (TSTATIONS(I)%NK/= XUNDEF) THEN - J = TSTATIONS(I)%NK - ELSE ! suppose TSTATIONS(I)%XZ /= XUNDEF - J=1 - DO WHILE ((STATION_INTERP_2D(PZ(:,:,J))-STATION_INTERP_2D(PZ(:,:,2))) & - < TSTATIONS(I)%XZ) - J = J + 1 - END DO - IF (((STATION_INTERP_2D(PZ(:,:,J))-STATION_INTERP_2D(PZ(:,:,2)))-TSTATIONS(I)%XZ)>& - (TSTATIONS(I)%XZ-(STATION_INTERP_2D(PZ(:,:,J-1))-STATION_INTERP_2D(PZ(:,:,2))))) THEN - J=J-1 - ENDIF - END IF - ! - IF (LCARTESIAN) THEN - TSTATIONS(I)%XZON (IN) = STATION_INTERP_2D_U(PU(:,:,J)) - TSTATIONS(I)%XMER (IN) = 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 * (TSTATIONS(I)%XLON - XLON0) - XBETA)*(XPI/180.) - TSTATIONS(I)%XZON (IN) = ZU_STAT * COS(ZGAM) + ZV_STAT * SIN(ZGAM) - TSTATIONS(I)%XMER (IN) = - ZU_STAT * SIN(ZGAM) + ZV_STAT * COS(ZGAM) - ENDIF - TSTATIONS(I)%XW (IN) = STATION_INTERP_2D(PW(:,:,J)) - TSTATIONS(I)%XTH (IN) = STATION_INTERP_2D(PTH(:,:,J)) - TSTATIONS(I)%XP (IN) = STATION_INTERP_2D(PP(:,:,J)) - ! - DO JSV=1,SIZE(PR,4) - TSTATIONS(I)%XR (IN,JSV) = STATION_INTERP_2D(PR(:,:,J,JSV)) - END DO - ! - DO JSV=1,SIZE(PSV,4) - TSTATIONS(I)%XSV (IN,JSV) = STATION_INTERP_2D(PSV(:,:,J,JSV)) - END DO - ! - IF (SIZE(PTKE)>0) TSTATIONS(I)%XTKE (IN) = STATION_INTERP_2D(PTKE(:,:,J)) - IF (SIZE(PTS) >0) TSTATIONS(I)%XTSRAD(IN) = STATION_INTERP_2D(PTS) - TSTATIONS(I)%XZS = STATION_INTERP_2D(PZ(:,:,1+JPVEXT)) - ! - IF (LDIAG_SURFRAD) THEN - TSTATIONS(I)%XZON10M(IN) = STATION_INTERP_2D(XCURRENT_ZON10M) - TSTATIONS(I)%XMER10M(IN) = STATION_INTERP_2D(XCURRENT_MER10M) - TSTATIONS(I)%XT2M (IN) = STATION_INTERP_2D(XCURRENT_T2M ) - TSTATIONS(I)%XQ2M (IN) = STATION_INTERP_2D(XCURRENT_Q2M ) - TSTATIONS(I)%XHU2M (IN) = STATION_INTERP_2D(XCURRENT_HU2M ) - TSTATIONS(I)%XRN (IN) = STATION_INTERP_2D(XCURRENT_RN ) - TSTATIONS(I)%XH (IN) = STATION_INTERP_2D(XCURRENT_H ) - TSTATIONS(I)%XLE (IN) = STATION_INTERP_2D(XCURRENT_LE ) - TSTATIONS(I)%XLEI (IN) = STATION_INTERP_2D(XCURRENT_LEI ) - TSTATIONS(I)%XGFLUX (IN) = STATION_INTERP_2D(XCURRENT_GFLUX ) - IF (CRAD /= 'NONE') THEN - TSTATIONS(I)%XSWD (IN) = STATION_INTERP_2D(XCURRENT_SWD ) - TSTATIONS(I)%XSWU (IN) = STATION_INTERP_2D(XCURRENT_SWU ) - TSTATIONS(I)%XLWD (IN) = STATION_INTERP_2D(XCURRENT_LWD ) - TSTATIONS(I)%XLWU (IN) = STATION_INTERP_2D(XCURRENT_LWU ) - TSTATIONS(I)%XSWDIR (IN) = STATION_INTERP_2D(XCURRENT_SWDIR ) - TSTATIONS(I)%XSWDIFF(IN) = STATION_INTERP_2D(XCURRENT_SWDIFF) - TSTATIONS(I)%XDSTAOD(IN) = STATION_INTERP_2D(XCURRENT_DSTAOD) - ENDIF - TSTATIONS(I)%XSFCO2 (IN) = STATION_INTERP_2D(XCURRENT_SFCO2 ) - ENDIF +STATION: DO JS = 1,NUMBSTAT_LOC + JK = TSTATIONS(JS)%NK + + IF (LCARTESIAN) THEN + TSTATIONS(JS)%XZON(IN) = STATION_INTERP_2D_U( TSTATIONS(JS), PU(:,:,JK) ) + TSTATIONS(JS)%XMER(IN) = STATION_INTERP_2D_V( TSTATIONS(JS), PV(:,:,JK) ) + ELSE + ZU_STAT = STATION_INTERP_2D_U( TSTATIONS(JS), PU(:,:,JK) ) + ZV_STAT = STATION_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) = STATION_INTERP_2D( TSTATIONS(JS), PW(:,:,JK) ) + TSTATIONS(JS)%XTH(IN) = STATION_INTERP_2D( TSTATIONS(JS), PTH(:,:,JK) ) + TSTATIONS(JS)%XP (IN) = STATION_INTERP_2D( TSTATIONS(JS), PP(:,:,JK) ) - ! - END IF -! -!---------------------------------------------------------------------------- -! -!* 11. EXCHANGE OF INFORMATION BETWEEN PROCESSORS -! ------------------------------------------ -! -!* 11.2 data stored -! ----------- -! - CALL DISTRIBUTE_STATION(TSTATIONS(I)%XX ) - CALL DISTRIBUTE_STATION(TSTATIONS(I)%XY ) - CALL DISTRIBUTE_STATION(TSTATIONS(I)%XZ ) - CALL DISTRIBUTE_STATION(TSTATIONS(I)%XLON ) - CALL DISTRIBUTE_STATION(TSTATIONS(I)%XLAT ) - CALL DISTRIBUTE_STATION(TSTATIONS(I)%XZON (IN)) - CALL DISTRIBUTE_STATION(TSTATIONS(I)%XMER (IN)) - CALL DISTRIBUTE_STATION(TSTATIONS(I)%XW (IN)) - CALL DISTRIBUTE_STATION(TSTATIONS(I)%XP (IN)) - CALL DISTRIBUTE_STATION(TSTATIONS(I)%XTH (IN)) DO JSV=1,SIZE(PR,4) - CALL DISTRIBUTE_STATION(TSTATIONS(I)%XR (IN,JSV)) + TSTATIONS(JS)%XR(IN,JSV) = STATION_INTERP_2D( TSTATIONS(JS), PR(:,:,JK,JSV) ) END DO + DO JSV=1,SIZE(PSV,4) - CALL DISTRIBUTE_STATION(TSTATIONS(I)%XSV (IN,JSV)) + TSTATIONS(JS)%XSV(IN,JSV) = STATION_INTERP_2D( TSTATIONS(JS), PSV(:,:,JK,JSV) ) END DO - IF (SIZE(PTKE)>0) CALL DISTRIBUTE_STATION(TSTATIONS(I)%XTKE (IN)) - IF (SIZE(PTS) >0) CALL DISTRIBUTE_STATION(TSTATIONS(I)%XTSRAD(IN)) - CALL DISTRIBUTE_STATION(TSTATIONS(I)%XZS ) - IF (LDIAG_SURFRAD) THEN - CALL DISTRIBUTE_STATION(TSTATIONS(I)%XT2M (IN)) - CALL DISTRIBUTE_STATION(TSTATIONS(I)%XQ2M (IN)) - CALL DISTRIBUTE_STATION(TSTATIONS(I)%XHU2M (IN)) - CALL DISTRIBUTE_STATION(TSTATIONS(I)%XZON10M (IN)) - CALL DISTRIBUTE_STATION(TSTATIONS(I)%XMER10M (IN)) - CALL DISTRIBUTE_STATION(TSTATIONS(I)%XRN (IN)) - CALL DISTRIBUTE_STATION(TSTATIONS(I)%XH (IN)) - CALL DISTRIBUTE_STATION(TSTATIONS(I)%XLE (IN)) - CALL DISTRIBUTE_STATION(TSTATIONS(I)%XLEI (IN)) - CALL DISTRIBUTE_STATION(TSTATIONS(I)%XGFLUX (IN)) - IF (CRAD /= 'NONE') THEN - CALL DISTRIBUTE_STATION(TSTATIONS(I)%XSWD (IN)) - CALL DISTRIBUTE_STATION(TSTATIONS(I)%XSWU (IN)) - CALL DISTRIBUTE_STATION(TSTATIONS(I)%XLWD (IN)) - CALL DISTRIBUTE_STATION(TSTATIONS(I)%XLWU (IN)) - CALL DISTRIBUTE_STATION(TSTATIONS(I)%XSWDIR (IN)) - CALL DISTRIBUTE_STATION(TSTATIONS(I)%XSWDIFF (IN)) - CALL DISTRIBUTE_STATION(TSTATIONS(I)%XDSTAOD (IN)) - END IF - CALL DISTRIBUTE_STATION(TSTATIONS(I)%XSFCO2 (IN)) - 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=TSTATIONS(I)%NI_M - JJ=TSTATIONS(I)%NJ_M -END IF -! -! -IF ((JI .GE. 1).AND. (JI .LE. SIZE(PA,1)) .AND. & - (JJ .GE. 1).AND. (JJ .LE. SIZE(PA,2))) & -PB = (1.-TSTATIONS(I)%XYMCOEF) * (1.-TSTATIONS(I)%XXMCOEF) * PA(JI,JJ) + & - (1.-TSTATIONS(I)%XYMCOEF) * (TSTATIONS(I)%XXMCOEF) * PA(JI+1,JJ) + & - ( TSTATIONS(I)%XYMCOEF) * (1.-TSTATIONS(I)%XXMCOEF) * PA(JI,JJ+1) + & - ( TSTATIONS(I)%XYMCOEF) * (TSTATIONS(I)%XXMCOEF) * 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=TSTATIONS(I)%NI_M - JJ=TSTATIONS(I)%NJ_M -END IF -! -IF ((JI .GE. 1).AND. (JI .LE. SIZE(PA,1)) .AND. & - (JJ .GE. 1).AND. (JJ .LE. SIZE(PA,2))) & -PB = (1.- TSTATIONS(I)%XYMCOEF) * (1.-TSTATIONS(I)%XXUCOEF) * PA(JI ,JJ ) & - + (1.- TSTATIONS(I)%XYMCOEF) * ( TSTATIONS(I)%XXUCOEF) * PA(JI+1,JJ ) & - + ( TSTATIONS(I)%XYMCOEF) * (1.-TSTATIONS(I)%XXUCOEF) * PA(JI ,JJ+1) & - + ( TSTATIONS(I)%XYMCOEF) * ( TSTATIONS(I)%XXUCOEF) * 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=TSTATIONS(I)%NI_M - JJ=TSTATIONS(I)%NJ_M -END IF -! -IF ((JI .GT. 0).AND. (JI .LT. SIZE(PA,1)) .AND. & - (JJ .GT. 0).AND. (JJ .LT. SIZE(PA,2))) & -PB = (1.- TSTATIONS(I)%XYVCOEF) * (1.-TSTATIONS(I)%XXMCOEF) * PA(JI ,JJ ) & - + (1.- TSTATIONS(I)%XYVCOEF) * ( TSTATIONS(I)%XXMCOEF) * PA(JI+1,JJ ) & - + ( TSTATIONS(I)%XYVCOEF) * (1.-TSTATIONS(I)%XXMCOEF) * PA(JI ,JJ+1) & - + ( TSTATIONS(I)%XYVCOEF) * ( TSTATIONS(I)%XXMCOEF) * PA(JI+1,JJ+1) -! -END FUNCTION STATION_INTERP_2D_V -!---------------------------------------------------------------------------- -!---------------------------------------------------------------------------- -SUBROUTINE DISTRIBUTE_STATION(PAS) -! -REAL, INTENT(INOUT) :: PAS -! -INTEGER :: IINFO_ll ! return code + IF (SIZE(PTKE)>0) TSTATIONS(JS)%XTKE(IN) = STATION_INTERP_2D( TSTATIONS(JS), PTKE(:,:,JK) ) + IF ( CRAD /= 'NONE' ) TSTATIONS(JS)%XTSRAD(IN) = STATION_INTERP_2D( TSTATIONS(JS), PTS ) + TSTATIONS(JS)%XZS = STATION_INTERP_2D( TSTATIONS(JS), PZ(:,:,1+JPVEXT)) -IF ( .NOT. TSTATIONS(I)%LPRESENT ) PAS = 0. -CALL REDUCESUM_ll(PAS,IINFO_ll) + IF ( LDIAG_SURFRAD ) THEN + TSTATIONS(JS)%XZON10M(IN) = STATION_INTERP_2D( TSTATIONS(JS), XCURRENT_ZON10M ) + TSTATIONS(JS)%XMER10M(IN) = STATION_INTERP_2D( TSTATIONS(JS), XCURRENT_MER10M ) + TSTATIONS(JS)%XT2M (IN) = STATION_INTERP_2D( TSTATIONS(JS), XCURRENT_T2M ) + TSTATIONS(JS)%XQ2M (IN) = STATION_INTERP_2D( TSTATIONS(JS), XCURRENT_Q2M ) + TSTATIONS(JS)%XHU2M (IN) = STATION_INTERP_2D( TSTATIONS(JS), XCURRENT_HU2M ) + TSTATIONS(JS)%XRN (IN) = STATION_INTERP_2D( TSTATIONS(JS), XCURRENT_RN ) + TSTATIONS(JS)%XH (IN) = STATION_INTERP_2D( TSTATIONS(JS), XCURRENT_H ) + TSTATIONS(JS)%XLE (IN) = STATION_INTERP_2D( TSTATIONS(JS), XCURRENT_LE ) + TSTATIONS(JS)%XLEI (IN) = STATION_INTERP_2D( TSTATIONS(JS), XCURRENT_LEI ) + TSTATIONS(JS)%XGFLUX (IN) = STATION_INTERP_2D( TSTATIONS(JS), XCURRENT_GFLUX ) + IF ( CRAD /= 'NONE' ) THEN + TSTATIONS(JS)%XSWD (IN) = STATION_INTERP_2D( TSTATIONS(JS), XCURRENT_SWD ) + TSTATIONS(JS)%XSWU (IN) = STATION_INTERP_2D( TSTATIONS(JS), XCURRENT_SWU ) + TSTATIONS(JS)%XLWD (IN) = STATION_INTERP_2D( TSTATIONS(JS), XCURRENT_LWD ) + TSTATIONS(JS)%XLWU (IN) = STATION_INTERP_2D( TSTATIONS(JS), XCURRENT_LWU ) + TSTATIONS(JS)%XSWDIR (IN) = STATION_INTERP_2D( TSTATIONS(JS), XCURRENT_SWDIR ) + TSTATIONS(JS)%XSWDIFF(IN) = STATION_INTERP_2D( TSTATIONS(JS), XCURRENT_SWDIFF ) + TSTATIONS(JS)%XDSTAOD(IN) = STATION_INTERP_2D( TSTATIONS(JS), XCURRENT_DSTAOD ) + END IF + TSTATIONS(JS)%XSFCO2(IN) = STATION_INTERP_2D( TSTATIONS(JS), XCURRENT_SFCO2 ) + END IF +END DO STATION ! -END SUBROUTINE DISTRIBUTE_STATION !---------------------------------------------------------------------------- ! END SUBROUTINE STATION_n diff --git a/src/MNH/write_stationn.f90 b/src/MNH/write_stationn.f90 index 0746c64d2..9f65f84e1 100644 --- a/src/MNH/write_stationn.f90 +++ b/src/MNH/write_stationn.f90 @@ -61,7 +61,7 @@ END MODULE MODI_WRITE_STATION_n ! 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 07/04/2022: rewrite types for stations +! P. Wautelet 04/2022: restructure stations for better performance, reduce memory usage and correct some problems/bugs ! -------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -70,17 +70,22 @@ END MODULE MODI_WRITE_STATION_n USE MODD_ALLSTATION_n, ONLY: LDIAG_SURFRAD use MODD_BUDGET, ONLY: tbudiachrometadata USE MODD_CONF, ONLY: LCARTESIAN +USE MODD_CONF_n, ONLY: NRR USE MODD_CST, ONLY: XRV -USE MODD_IO, ONLY: TFILEDATA +USE MODD_IO, ONLY: ISNPROC, ISP, TFILEDATA +USE MODD_MPIF USE MODD_NSV, ONLY: tsvlist, nsv, nsv_aer, nsv_aerbeg, nsv_aerend, & nsv_dst, nsv_dstbeg, nsv_dstend, nsv_slt, nsv_sltbeg, nsv_sltend -USE MODD_PARAM_n, ONLY: CRAD, CSURF +USE MODD_PARAM_n, ONLY: CRAD, CSURF, CTURB USE MODD_PARAMETERS, ONLY: XUNDEF -USE MODD_STATION_n, only: NUMBSTAT, TSTATIONS +USE MODD_PRECISION, ONLY: MNHINT_MPI, MNHREAL_MPI +USE MODD_STATION_n, only: NUMBSTAT_LOC, TSTATIONS, tstations_time +USE MODD_TYPE_STATION, ONLY: TSTATIONDATA ! USE MODE_AERO_PSD USE MODE_DUST_PSD USE MODE_SALT_PSD +USE MODE_STATION_TOOLS, ONLY: STATION_ALLOCATE use MODE_WRITE_DIACHRO, ONLY: Write_diachro ! IMPLICIT NONE @@ -94,13 +99,199 @@ TYPE(TFILEDATA), INTENT(IN) :: TPDIAFILE ! diachronic file to write ! ! 0.2 declaration of local variables ! -INTEGER :: II ! loop +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 ! !---------------------------------------------------------------------------- -! -DO II = 1, NUMBSTAT - CALL STATION_DIACHRO_n( TSTATIONS(II) ) -ENDDO + +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 + +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 + + 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 + END IF + END IF + + CALL STATION_DIACHRO_n( TZSTATION ) + +END DO STATION ! !---------------------------------------------------------------------------- !---------------------------------------------------------------------------- @@ -145,13 +336,10 @@ type(tbudiachrometadata) :: tzbudiachro type(tfieldmetadata_base), dimension(:), allocatable :: tzfields ! !---------------------------------------------------------------------------- -IF (TPSTATION%XX==XUNDEF) RETURN -IF (TPSTATION%XY==XUNDEF) RETURN ! IPROC = 8 + SIZE(TPSTATION%XR,2) + SIZE(TPSTATION%XSV,2) -IF (TPSTATION%XX==XUNDEF) IPROC = IPROC + 2 -IF (SIZE(TPSTATION%XTKE )>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 @@ -159,8 +347,8 @@ 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(TPSTATION%XTSRAD(:)/=XUNDEF)) IPROC = IPROC + 1 -IF (ANY(TPSTATION%XSFCO2(:)/=XUNDEF)) IPROC = IPROC + 1 +IF ( CRAD /= 'NONE' ) IPROC = IPROC + 1 +IPROC = IPROC + 1 ! XSFCO2 term ! ALLOCATE (ZWORK6(1,1,1,SIZE(tstations_time%tpdates),1,IPROC)) ALLOCATE (YCOMMENT(IPROC)) @@ -390,7 +578,7 @@ DO JRR=1,SIZE(TPSTATION%XR,2) END IF END DO ! -IF (SIZE(TPSTATION%XTKE,1)>0) THEN +IF ( CTURB == 'TKEL' ) THEN JPROC = JPROC+1 YTITLE (JPROC) = 'Tke' YUNIT (JPROC) = 'm2 s-2' @@ -642,7 +830,7 @@ IF (SIZE(TPSTATION%XSV,2)>=1) THEN END IF END IF -IF (ANY(TPSTATION%XTSRAD(:)/=XUNDEF)) THEN +IF ( CRAD /= 'NONE' ) THEN JPROC = JPROC+1 YTITLE (JPROC) = 'Tsrad' YUNIT (JPROC) = 'K' @@ -650,13 +838,13 @@ IF (ANY(TPSTATION%XTSRAD(:)/=XUNDEF)) THEN ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XTSRAD(:) END IF ! -IF (ANY(TPSTATION%XSFCO2(:)/=XUNDEF)) THEN +! IF (ANY(TPSTATION%XSFCO2(:)/=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) = TPSTATION%XSFCO2(:) -END IF +! END IF ! !---------------------------------------------------------------------------- ! @@ -739,7 +927,5 @@ DEALLOCATE (YUNIT ) DEALLOCATE (IGRID ) !---------------------------------------------------------------------------- END SUBROUTINE STATION_DIACHRO_n -!---------------------------------------------------------------------------- -!---------------------------------------------------------------------------- ! END SUBROUTINE WRITE_STATION_n -- GitLab From c9181a12ef83f5ce833a6269ead495707a397fa6 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Wed, 20 Apr 2022 15:32:01 +0200 Subject: [PATCH 056/157] Philippe 20/04/2022: stations: use parameters for character strings --- src/MNH/modd_allstationn.f90 | 10 +++++----- src/MNH/modd_parameters.f90 | 5 ++++- src/MNH/modd_type_station.f90 | 4 ++-- src/MNH/modn_stationn.f90 | 13 ++++++++----- src/MNH/write_stationn.f90 | 18 ++++++++++-------- 5 files changed, 29 insertions(+), 21 deletions(-) diff --git a/src/MNH/modd_allstationn.f90 b/src/MNH/modd_allstationn.f90 index 4229177e4..809e28845 100644 --- a/src/MNH/modd_allstationn.f90 +++ b/src/MNH/modd_allstationn.f90 @@ -36,7 +36,7 @@ ! ------------ ! ! -USE MODD_PARAMETERS, ONLY: JPMODELMAX +USE MODD_PARAMETERS, ONLY: JPMODELMAX, NFILENAMELGTMAX, NSTATIONNAMELGTMAX IMPLICIT NONE @@ -54,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 - CHARACTER(LEN=20) :: CFILE_STAT + CHARACTER(LEN=NSTATIONNAMELGTMAX), DIMENSION(100) :: CNAME_STAT + CHARACTER(LEN=NFILENAMELGTMAX) :: CFILE_STAT REAL :: XSTEP_STAT LOGICAL :: LDIAG_SURFRAD ! @@ -71,8 +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=20),POINTER :: CFILE_STAT=>NULL() +CHARACTER (LEN=NSTATIONNAMELGTMAX),DIMENSION(:), POINTER :: CNAME_STAT=>NULL() +CHARACTER (LEN=NFILENAMELGTMAX),POINTER :: CFILE_STAT=>NULL() LOGICAL, POINTER :: LDIAG_SURFRAD=>NULL() CONTAINS diff --git a/src/MNH/modd_parameters.f90 b/src/MNH/modd_parameters.f90 index f4849d401..929cec5b6 100644 --- a/src/MNH/modd_parameters.f90 +++ b/src/MNH/modd_parameters.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. @@ -44,6 +44,7 @@ ! 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 NSTATIONNAMELGTMAX parameter !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -86,6 +87,8 @@ INTEGER, PARAMETER :: NSTDNAMELGTMAX = 64 ! Maximum length of the standard nam 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 :: NSTATIONNAMELGTMAX = 8 ! Maximum length for the name of a station + 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_type_station.f90 b/src/MNH/modd_type_station.f90 index 8d34883fa..55c63959c 100644 --- a/src/MNH/modd_type_station.f90 +++ b/src/MNH/modd_type_station.f90 @@ -37,7 +37,7 @@ ! ------------ ! use modd_type_date, only: date_time -use modd_parameters, only: NNEGUNDEF, XUNDEF +use modd_parameters, only: NNEGUNDEF, NSTATIONNAMELGTMAX, XUNDEF implicit none @@ -55,7 +55,7 @@ END TYPE TSTATIONTIME TYPE TSTATIONDATA ! Type to store all the data of 1 station -CHARACTER(LEN=8) :: CNAME = '' ! station name +CHARACTER(LEN=NSTATIONNAMELGTMAX) :: CNAME = '' ! station name INTEGER :: NID = 0 ! Global identification number of the station (from 1 to total number of stations of the model) diff --git a/src/MNH/modn_stationn.f90 b/src/MNH/modn_stationn.f90 index ab6013ee2..0bc56e63f 100644 --- a/src/MNH/modn_stationn.f90 +++ b/src/MNH/modn_stationn.f90 @@ -25,7 +25,6 @@ !! !! IMPLICIT ARGUMENTS !! ------------------ -USE MODD_STATION_n USE MODD_ALLSTATION_n, ONLY:& NNUMB_STAT_n =>NNUMB_STAT ,& XSTEP_STAT_n =>XSTEP_STAT ,& @@ -36,18 +35,22 @@ USE MODD_ALLSTATION_n, ONLY:& XZ_STAT_n =>XZ_STAT ,& CNAME_STAT_n =>CNAME_STAT ,& CFILE_STAT_n =>CFILE_STAT ,& - LDIAG_SURFRAD_n =>LDIAG_SURFRAD -!! + LDIAG_SURFRAD_n =>LDIAG_SURFRAD +USE MODD_PARAMETERS, ONLY: NFILENAMELGTMAX, NSTATIONNAMELGTMAX +USE MODD_STATION_n +! !----------------------------------------------------------------------------- ! !* 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 -CHARACTER (LEN=20) ,SAVE:: CFILE_STAT !filename +CHARACTER (LEN=NSTATIONNAMELGTMAX), DIMENSION(100),SAVE:: CNAME_STAT +CHARACTER (LEN=NFILENAMELGTMAX), SAVE:: CFILE_STAT !filename LOGICAL ,SAVE:: LDIAG_SURFRAD NAMELIST /NAM_STATIONn/ & diff --git a/src/MNH/write_stationn.f90 b/src/MNH/write_stationn.f90 index 9f65f84e1..754f9d41a 100644 --- a/src/MNH/write_stationn.f90 +++ b/src/MNH/write_stationn.f90 @@ -82,11 +82,7 @@ USE MODD_PRECISION, ONLY: MNHINT_MPI, MNHREAL_MPI USE MODD_STATION_n, only: NUMBSTAT_LOC, TSTATIONS, tstations_time USE MODD_TYPE_STATION, ONLY: TSTATIONDATA ! -USE MODE_AERO_PSD -USE MODE_DUST_PSD -USE MODE_SALT_PSD USE MODE_STATION_TOOLS, ONLY: STATION_ALLOCATE -use MODE_WRITE_DIACHRO, ONLY: Write_diachro ! IMPLICIT NONE ! @@ -307,9 +303,15 @@ SUBROUTINE STATION_DIACHRO_n( TPSTATION ) 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, & tfieldmetadata_base, TYPEREAL +use modd_parameters, only: NCOMMENTLGTMAX, NMNHNAMELGTMAX, NSTATIONNAMELGTMAX, NUNITLGTMAX use modd_station_n, only: tstations_time use modd_type_station, only: tstationdata +USE MODE_AERO_PSD +USE MODE_DUST_PSD +USE MODE_SALT_PSD +use MODE_WRITE_DIACHRO, ONLY: Write_diachro + TYPE(TSTATIONDATA), INTENT(IN) :: TPSTATION ! !* 0.2 declaration of local variables for diachro @@ -321,10 +323,10 @@ 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=NSTATIONNAMELGTMAX) :: YGROUP ! group title +CHARACTER(LEN=NCOMMENTLGTMAX), DIMENSION(:), ALLOCATABLE :: YCOMMENT ! comment string +CHARACTER(LEN=NMNHNAMELGTMAX), DIMENSION(:), ALLOCATABLE :: YTITLE ! title +CHARACTER(LEN=NUNITLGTMAX), DIMENSION(:), ALLOCATABLE :: YUNIT ! physical unit ! !!! do not forget to increment the IPROC value if you add diagnostic !!! INTEGER :: IPROC ! number of variables records -- GitLab From a1dc9a9520a06446a61e2ed4836904e3f8f6bbb3 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Wed, 20 Apr 2022 16:36:43 +0200 Subject: [PATCH 057/157] Philippe 20/04/2022: stations: transform modi->mode for write_station_n --- src/MNH/modeln.f90 | 4 ++-- src/MNH/write_stationn.f90 | 26 +++++++++++--------------- 2 files changed, 13 insertions(+), 17 deletions(-) diff --git a/src/MNH/modeln.f90 b/src/MNH/modeln.f90 index 6ba8d8398..61c50c483 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-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. @@ -383,6 +383,7 @@ USE MODE_ONE_WAY_n 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 @@ -450,7 +451,6 @@ 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 ! IMPLICIT NONE diff --git a/src/MNH/write_stationn.f90 b/src/MNH/write_stationn.f90 index 754f9d41a..8ff4c2fc2 100644 --- a/src/MNH/write_stationn.f90 +++ b/src/MNH/write_stationn.f90 @@ -4,22 +4,16 @@ !MNH_LIC for details. version 1. !----------------------------------------------------------------- ! ########################### -MODULE MODI_WRITE_STATION_n +MODULE MODE_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 + +implicit none + +private + +public :: WRITE_STATION_n + +contains ! ! ########################################## SUBROUTINE WRITE_STATION_n(TPDIAFILE) @@ -931,3 +925,5 @@ DEALLOCATE (IGRID ) END SUBROUTINE STATION_DIACHRO_n ! END SUBROUTINE WRITE_STATION_n + +END MODULE MODE_WRITE_STATION_n -- GitLab From 195d355e577232a6772ffe9e73fccce39c129ebd Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Thu, 21 Apr 2022 15:48:08 +0200 Subject: [PATCH 058/157] Philippe 21/04/2022: write_stationn: improve writing code (now similar to write_profilern) --- src/MNH/write_stationn.f90 | 740 ++++++++++++++----------------------- 1 file changed, 280 insertions(+), 460 deletions(-) diff --git a/src/MNH/write_stationn.f90 b/src/MNH/write_stationn.f90 index 8ff4c2fc2..23d6b40e7 100644 --- a/src/MNH/write_stationn.f90 +++ b/src/MNH/write_stationn.f90 @@ -7,17 +7,25 @@ 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) -! ########################################## +! ##################################### +SUBROUTINE WRITE_STATION_n( TPDIAFILE ) +! ##################################### ! ! !!**** *WRITE_STATION* - write the balloon and aircraft trajectories and records @@ -62,16 +70,11 @@ contains ! ------------ ! USE MODD_ALLSTATION_n, ONLY: LDIAG_SURFRAD -use MODD_BUDGET, ONLY: tbudiachrometadata -USE MODD_CONF, ONLY: LCARTESIAN USE MODD_CONF_n, ONLY: NRR -USE MODD_CST, ONLY: XRV USE MODD_IO, ONLY: ISNPROC, ISP, TFILEDATA USE MODD_MPIF -USE MODD_NSV, ONLY: tsvlist, nsv, nsv_aer, nsv_aerbeg, nsv_aerend, & - nsv_dst, nsv_dstbeg, nsv_dstend, nsv_slt, nsv_sltbeg, nsv_sltend +USE MODD_NSV, ONLY: nsv USE MODD_PARAM_n, ONLY: CRAD, CSURF, CTURB -USE MODD_PARAMETERS, ONLY: XUNDEF USE MODD_PRECISION, ONLY: MNHINT_MPI, MNHREAL_MPI USE MODD_STATION_n, only: NUMBSTAT_LOC, TSTATIONS, tstations_time USE MODD_TYPE_STATION, ONLY: TSTATIONDATA @@ -151,7 +154,7 @@ IF ( ISNPROC > 1 ) THEN 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 ( LDIAG_SURFRAD ) THEN IF ( CSURF == 'EXTE' ) IPACKSIZE = IPACKSIZE + ISTORE * 10 IF ( CRAD /= 'NONE' ) IPACKSIZE = IPACKSIZE + ISTORE * 7 IPACKSIZE = IPACKSIZE + ISTORE !XSFCO2 term @@ -194,7 +197,7 @@ STATION: DO JS = 1, INUMSTAT IF ( CRAD /= 'NONE' ) THEN ZPACK(IPOS:IPOS+ISTORE-1) = TSTATIONS(IDX)%XTSRAD(:); IPOS = IPOS + ISTORE END IF - IF (LDIAG_SURFRAD) THEN + 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 @@ -252,7 +255,7 @@ STATION: DO JS = 1, INUMSTAT IF ( CRAD /= 'NONE' ) THEN TZSTATION%XTSRAD(:) = ZPACK(IPOS:IPOS+ISTORE-1); IPOS = IPOS + ISTORE END IF - IF (LDIAG_SURFRAD) THEN + 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 @@ -279,25 +282,28 @@ STATION: DO JS = 1, INUMSTAT END IF END IF - CALL STATION_DIACHRO_n( TZSTATION ) + CALL STATION_DIACHRO_n( TPDIAFILE, TZSTATION ) END DO STATION -! -!---------------------------------------------------------------------------- -!---------------------------------------------------------------------------- -! -CONTAINS -! -!---------------------------------------------------------------------------- -!---------------------------------------------------------------------------- -! -!---------------------------------------------------------------------------- -SUBROUTINE STATION_DIACHRO_n( TPSTATION ) -use modd_budget, only: NLVL_CATEGORY, NLVL_SUBCATEGORY, NLVL_GROUP, NLVL_SHAPE, NLVL_TIMEAVG, NLVL_NORM, NLVL_MASK +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_parameters, only: NCOMMENTLGTMAX, NMNHNAMELGTMAX, NSTATIONNAMELGTMAX, NUNITLGTMAX +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_station, only: tstationdata @@ -306,25 +312,23 @@ USE MODE_DUST_PSD USE MODE_SALT_PSD use MODE_WRITE_DIACHRO, ONLY: Write_diachro -TYPE(TSTATIONDATA), INTENT(IN) :: TPSTATION +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=NSTATIONNAMELGTMAX) :: YGROUP ! group title -CHARACTER(LEN=NCOMMENTLGTMAX), DIMENSION(:), ALLOCATABLE :: YCOMMENT ! comment string -CHARACTER(LEN=NMNHNAMELGTMAX), DIMENSION(:), ALLOCATABLE :: YTITLE ! title -CHARACTER(LEN=NUNITLGTMAX), 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 @@ -339,271 +343,106 @@ 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 ( CRAD /= 'NONE' ) IPROC = IPROC + 1 -IPROC = IPROC + 1 ! XSFCO2 term ! -ALLOCATE (ZWORK6(1,1,1,SIZE(tstations_time%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 = TPSTATION%CNAME JPROC = 0 ! !---------------------------------------------------------------------------- ! -JPROC = JPROC + 1 -YTITLE (JPROC) = 'ZS' -YUNIT (JPROC) = 'm' -YCOMMENT (JPROC) = 'Orography' -ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XZS -! -JPROC = JPROC + 1 -YTITLE (JPROC) = 'P' -YUNIT (JPROC) = 'Pa' -YCOMMENT (JPROC) = 'Pressure' -ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XP(:) -! -!JPROC = JPROC + 1 -!YTITLE (JPROC) = 'Z' -!YUNIT (JPROC) = 'm' -!YCOMMENT (JPROC) = 'Z Pos' -!ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XZ -! -IF (LCARTESIAN) THEN - JPROC = JPROC + 1 - YTITLE (JPROC) = 'X' - YUNIT (JPROC) = 'm' - YCOMMENT (JPROC) = 'X Pos' - ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XX - ! - JPROC = JPROC + 1 - YTITLE (JPROC) = 'Y' - YUNIT (JPROC) = 'm' - YCOMMENT (JPROC) = 'Y Pos' - ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XY - ! - JPROC = JPROC + 1 - YTITLE (JPROC) = 'U' - YUNIT (JPROC) = 'm s-1' - YCOMMENT (JPROC) = 'Axial velocity' - ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XZON(:) - ! - JPROC = JPROC + 1 - YTITLE (JPROC) = 'V' - YUNIT (JPROC) = 'm s-1' - YCOMMENT (JPROC) = 'Transversal velocity' - ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XMER(:) -ELSE - JPROC = JPROC + 1 - YTITLE (JPROC) = 'LON' - YUNIT (JPROC) = 'degree' - YCOMMENT (JPROC) = 'Longitude' - ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XLON - ! - JPROC = JPROC + 1 - YTITLE (JPROC) = 'LAT' - YUNIT (JPROC) = 'degree' - YCOMMENT (JPROC) = 'Latitude' - ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XLAT - ! - JPROC = JPROC + 1 - YTITLE (JPROC) = 'ZON_WIND' - YUNIT (JPROC) = 'm s-1' - YCOMMENT (JPROC) = 'Zonal wind' - ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XZON(:) - ! - JPROC = JPROC + 1 - YTITLE (JPROC) = 'MER_WIND' - YUNIT (JPROC) = 'm s-1' - YCOMMENT (JPROC) = 'Meridional wind' - ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XMER(:) -ENDIF -! -JPROC = JPROC + 1 -YTITLE (JPROC) = 'W' -YUNIT (JPROC) = 'm s-1' -YCOMMENT (JPROC) = 'Air vertical speed' -ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XW(:) -! -JPROC = JPROC + 1 -YTITLE (JPROC) = 'Th' -YUNIT (JPROC) = 'K' -YCOMMENT (JPROC) = 'Potential temperature' -ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XTH(:) -! -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) = TPSTATION%XT2M(:) - ! - JPROC = JPROC + 1 - YTITLE (JPROC) = 'Q2m' - YUNIT (JPROC) = 'kg kg-1' - YCOMMENT (JPROC) = '2-m humidity' - ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XQ2M(:) - ! - JPROC = JPROC + 1 - YTITLE (JPROC) = 'HU2m' - YUNIT (JPROC) = 'percent' - YCOMMENT (JPROC) = '2-m relative humidity' - ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XHU2M(:) - ! - JPROC = JPROC + 1 - YTITLE (JPROC) = 'zon10m' - YUNIT (JPROC) = 'm s-1' - YCOMMENT (JPROC) = '10-m zonal wind' - ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XZON10M(:) - ! - JPROC = JPROC + 1 - YTITLE (JPROC) = 'mer10m' - YUNIT (JPROC) = 'm s-1' - YCOMMENT (JPROC) = '10-m meridian wind' - ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XMER10M(:) - ! - JPROC = JPROC + 1 - YTITLE (JPROC) = 'RN' - YUNIT (JPROC) = 'W m-2' - YCOMMENT (JPROC) = 'Net radiation' - ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XRN(:) - ! - JPROC = JPROC + 1 - YTITLE (JPROC) = 'H' - YUNIT (JPROC) = 'W m-2' - YCOMMENT (JPROC) = 'Sensible heat flux' - ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XH(:) - ! - JPROC = JPROC + 1 - YTITLE (JPROC) = 'LE' - YUNIT (JPROC) = 'W m-2' - YCOMMENT (JPROC) = 'Total Latent heat flux' - ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XLE(:) - ! - JPROC = JPROC + 1 - YTITLE (JPROC) = 'G' - YUNIT (JPROC) = 'W m-2' - YCOMMENT (JPROC) = 'Storage heat flux' - ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XGFLUX(:) - ! - JPROC = JPROC + 1 - YTITLE (JPROC) = 'LEI' - YUNIT (JPROC) = 'W m-2' - YCOMMENT (JPROC) = 'Solid Latent heat flux' - ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XLEI(:) - 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) = TPSTATION%XSWD(:) - ! - JPROC = JPROC + 1 - YTITLE (JPROC) = 'SWU' - YUNIT (JPROC) = 'W m-2' - YCOMMENT (JPROC) = 'Upward short-wave radiation' - ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XSWU(:) - ! - JPROC = JPROC + 1 - YTITLE (JPROC) = 'LWD' - YUNIT (JPROC) = 'W m-2' - YCOMMENT (JPROC) = 'Downward long-wave radiation' - ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XLWD(:) - ! - JPROC = JPROC + 1 - YTITLE (JPROC) = 'LWU' - YUNIT (JPROC) = 'W m-2' - YCOMMENT (JPROC) = 'Upward long-wave radiation' - ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XLWU(:) - JPROC = JPROC + 1 - ! - YTITLE (JPROC) = 'SWDIR' - YUNIT (JPROC) = 'W m-2' - YCOMMENT (JPROC) = 'Downward direct short-wave radiation' - ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XSWDIR(:) - ! - JPROC = JPROC + 1 - YTITLE (JPROC) = 'SWDIFF' - YUNIT (JPROC) = 'W m-2' - YCOMMENT (JPROC) = 'Downward diffuse short-wave radiation' - ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XSWDIFF(:) - ! - JPROC = JPROC + 1 - YTITLE (JPROC) = 'DSTAOD' - YUNIT (JPROC) = 'm' - YCOMMENT (JPROC) = 'Dust aerosol optical depth' - ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XDSTAOD(:) - ! - END IF -ENDIF -! -DO JRR=1,SIZE(TPSTATION%XR,2) - JPROC = JPROC+1 - YUNIT (JPROC) = 'kg kg-1' - ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XR(:,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 ( CTURB == 'TKEL' ) THEN - JPROC = JPROC+1 - YTITLE (JPROC) = 'Tke' - YUNIT (JPROC) = 'm2 s-2' - YCOMMENT (JPROC) = 'Turbulent kinetic energy' - ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XTKE(:) -END IF -! -IF (SIZE(TPSTATION%XSV,2)>=1) THEN +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 - JPROC = JPROC + 1 - YTITLE(JPROC) = TRIM( TSVLIST(JSV)%CMNHNAME ) - YCOMMENT(JPROC) = '' IF ( TRIM( TSVLIST(JSV)%CUNITS ) == 'ppv' ) THEN - YUNIT(JPROC) = 'ppb' - ZWORK6(1,1,1,:,1,JPROC) = TPSTATION%XSV(:,JSV) * 1.e9 !*1e9 for conversion ppv->ppb + !*1e9 for conversion ppv->ppb + call Add_point( TRIM( TSVLIST(JSV)%CMNHNAME ), '', 'ppb', TPSTATION%XSV(:,JSV) * 1.e9 ) ELSE - YUNIT(JPROC) = TRIM( TSVLIST(JSV)%CUNITS ) - ZWORK6(1,1,1,:,1,JPROC) = TPSTATION%XSV(:,JSV) + call Add_point( TRIM( TSVLIST(JSV)%CMNHNAME ), '', TSVLIST(JSV)%CUNITS, TPSTATION%XSV(:,JSV) ) END IF END DO IF ((LORILAM).AND. .NOT.(ANY(TPSTATION%XP(:) == 0.))) THEN - ALLOCATE (ZSV(1,1,SIZE(tstations_time%tpdates),NSV_AER)) - ALLOCATE (ZRHO(1,1,SIZE(tstations_time%tpdates))) - ALLOCATE (ZN0(1,1,SIZE(tstations_time%tpdates),JPMODE)) - ALLOCATE (ZRG(1,1,SIZE(tstations_time%tpdates),JPMODE)) - ALLOCATE (ZSIG(1,1,SIZE(tstations_time%tpdates),JPMODE)) - ALLOCATE (ZPTOTA(1,1,SIZE(tstations_time%tpdates),NSP+NCARB+NSOA,JPMODE)) + 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. @@ -622,127 +461,101 @@ IF (SIZE(TPSTATION%XSV,2)>=1) THEN 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) - ! 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) - ! 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) - - 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,'(A6,I1)')'AERRGA',JSV + WRITE(YCOMMENT,'(A18,I1)')'RG (nb) AERO MODE ',JSV + call Add_point( ytitle, ycomment, 'um', ZRG(1,1,:,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) - - 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) - - 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) + ! standard deviation + WRITE(YTITLE,'(A7,I1)')'AERSIGA',JSV + WRITE(YCOMMENT,'(A16,I1)')'SIGMA AERO MODE ',JSV + call Add_point( ytitle, ycomment, '',ZSIG(1,1,:,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) + ! particles number + 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) ) + + 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) ) + + 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) ) + + 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) ) + + 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) ) + + 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) END IF IF ((LDUST).AND. .NOT.(ANY(TPSTATION%XP(:) == 0.))) THEN - ALLOCATE (ZSV(1,1,SIZE(tstations_time%tpdates),NSV_DST)) - ALLOCATE (ZRHO(1,1,SIZE(tstations_time%tpdates))) - ALLOCATE (ZN0(1,1,SIZE(tstations_time%tpdates),NMODE_DST)) - ALLOCATE (ZRG(1,1,SIZE(tstations_time%tpdates),NMODE_DST)) - ALLOCATE (ZSIG(1,1,SIZE(tstations_time%tpdates),NMODE_DST)) + 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. @@ -760,33 +573,33 @@ IF (SIZE(TPSTATION%XSV,2)>=1) THEN 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) END IF IF ((LSALT).AND. .NOT.(ANY(TPSTATION%XP(:) == 0.))) THEN - ALLOCATE (ZSV(1,1,SIZE(tstations_time%tpdates),NSV_SLT)) - ALLOCATE (ZRHO(1,1,SIZE(tstations_time%tpdates))) - ALLOCATE (ZN0(1,1,SIZE(tstations_time%tpdates),NMODE_SLT)) - ALLOCATE (ZRG(1,1,SIZE(tstations_time%tpdates),NMODE_SLT)) - ALLOCATE (ZSIG(1,1,SIZE(tstations_time%tpdates),NMODE_SLT)) + 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. @@ -803,59 +616,39 @@ IF (SIZE(TPSTATION%XSV,2)>=1) THEN 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) END IF -END IF +end if -IF ( CRAD /= 'NONE' ) THEN - JPROC = JPROC+1 - YTITLE (JPROC) = 'Tsrad' - YUNIT (JPROC) = 'K' - YCOMMENT (JPROC) = 'Radiative Surface Temperature' - ZWORK6 (1,1,1,:,1,JPROC) = TPSTATION%XTSRAD(:) -END IF -! -! IF (ANY(TPSTATION%XSFCO2(:)/=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) = TPSTATION%XSFCO2(:) -! 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(tstations_time%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 @@ -875,12 +668,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' @@ -912,18 +705,45 @@ tzbudiachro%njh = 1 tzbudiachro%nkl = 1 tzbudiachro%nkh = 1 -call Write_diachro( tpdiafile, tzbudiachro, tzfields, tstations_time%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 -- GitLab From 2b51c5557df775e059bae6ed1b81a33e295e2cae Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Fri, 22 Apr 2022 15:12:44 +0200 Subject: [PATCH 059/157] Philippe 22/04/2022: rename NSTATIONNAMELGTMAX to NSTATPROFNAMELGTMAX --- src/MNH/modd_allstationn.f90 | 6 +++--- src/MNH/modd_parameters.f90 | 4 ++-- src/MNH/modd_type_station.f90 | 4 ++-- src/MNH/modn_stationn.f90 | 4 ++-- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/MNH/modd_allstationn.f90 b/src/MNH/modd_allstationn.f90 index 809e28845..4fe0a7be7 100644 --- a/src/MNH/modd_allstationn.f90 +++ b/src/MNH/modd_allstationn.f90 @@ -36,7 +36,7 @@ ! ------------ ! ! -USE MODD_PARAMETERS, ONLY: JPMODELMAX, NFILENAMELGTMAX, NSTATIONNAMELGTMAX +USE MODD_PARAMETERS, ONLY: JPMODELMAX, NFILENAMELGTMAX, NSTATPROFNAMELGTMAX IMPLICIT NONE @@ -54,7 +54,7 @@ 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=NSTATIONNAMELGTMAX), DIMENSION(100) :: CNAME_STAT + CHARACTER(LEN=NSTATPROFNAMELGTMAX), DIMENSION(100) :: CNAME_STAT CHARACTER(LEN=NFILENAMELGTMAX) :: CFILE_STAT REAL :: XSTEP_STAT LOGICAL :: LDIAG_SURFRAD @@ -71,7 +71,7 @@ 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=NSTATIONNAMELGTMAX),DIMENSION(:), POINTER :: CNAME_STAT=>NULL() +CHARACTER (LEN=NSTATPROFNAMELGTMAX),DIMENSION(:), POINTER :: CNAME_STAT=>NULL() CHARACTER (LEN=NFILENAMELGTMAX),POINTER :: CFILE_STAT=>NULL() LOGICAL, POINTER :: LDIAG_SURFRAD=>NULL() CONTAINS diff --git a/src/MNH/modd_parameters.f90 b/src/MNH/modd_parameters.f90 index 929cec5b6..c848073f9 100644 --- a/src/MNH/modd_parameters.f90 +++ b/src/MNH/modd_parameters.f90 @@ -44,7 +44,7 @@ ! 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 NSTATIONNAMELGTMAX parameter +! P. Wautelet 20/04/2022: add NSTATPROFNAMELGTMAX parameter !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -87,7 +87,7 @@ INTEGER, PARAMETER :: NSTDNAMELGTMAX = 64 ! Maximum length of the standard nam 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 :: NSTATIONNAMELGTMAX = 8 ! Maximum length for the name of a station +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) diff --git a/src/MNH/modd_type_station.f90 b/src/MNH/modd_type_station.f90 index 55c63959c..d8d58820a 100644 --- a/src/MNH/modd_type_station.f90 +++ b/src/MNH/modd_type_station.f90 @@ -37,7 +37,7 @@ ! ------------ ! use modd_type_date, only: date_time -use modd_parameters, only: NNEGUNDEF, NSTATIONNAMELGTMAX, XUNDEF +use modd_parameters, only: NNEGUNDEF, NSTATPROFNAMELGTMAX, XUNDEF implicit none @@ -54,8 +54,8 @@ END TYPE TSTATIONTIME TYPE TSTATIONDATA ! Type to store all the data of 1 station +CHARACTER(LEN=NSTATPROFNAMELGTMAX) :: CNAME = '' ! station name -CHARACTER(LEN=NSTATIONNAMELGTMAX) :: CNAME = '' ! station name INTEGER :: NID = 0 ! Global identification number of the station (from 1 to total number of stations of the model) diff --git a/src/MNH/modn_stationn.f90 b/src/MNH/modn_stationn.f90 index 0bc56e63f..9b8737c03 100644 --- a/src/MNH/modn_stationn.f90 +++ b/src/MNH/modn_stationn.f90 @@ -36,7 +36,7 @@ USE MODD_ALLSTATION_n, ONLY:& CNAME_STAT_n =>CNAME_STAT ,& CFILE_STAT_n =>CFILE_STAT ,& LDIAG_SURFRAD_n =>LDIAG_SURFRAD -USE MODD_PARAMETERS, ONLY: NFILENAMELGTMAX, NSTATIONNAMELGTMAX +USE MODD_PARAMETERS, ONLY: NFILENAMELGTMAX, NSTATPROFNAMELGTMAX USE MODD_STATION_n ! !----------------------------------------------------------------------------- @@ -49,7 +49,7 @@ 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=NSTATIONNAMELGTMAX), DIMENSION(100),SAVE:: CNAME_STAT +CHARACTER (LEN=NSTATPROFNAMELGTMAX), DIMENSION(100),SAVE:: CNAME_STAT CHARACTER (LEN=NFILENAMELGTMAX), SAVE:: CFILE_STAT !filename LOGICAL ,SAVE:: LDIAG_SURFRAD -- GitLab From 4cae411f28b0c54206fb36e6c034ed921e1321c7 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Fri, 22 Apr 2022 15:38:56 +0200 Subject: [PATCH 060/157] Philippe 22/04/2022: rename TSTATIONTIME to TSTATPROFTIME --- src/MNH/modd_stationn.f90 | 6 +++--- src/MNH/modd_type_station.f90 | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/MNH/modd_stationn.f90 b/src/MNH/modd_stationn.f90 index 6017c0f98..f86692bf4 100644 --- a/src/MNH/modd_stationn.f90 +++ b/src/MNH/modd_stationn.f90 @@ -37,7 +37,7 @@ ! ! USE MODD_PARAMETERS, ONLY: JPMODELMAX -USE MODD_TYPE_STATION, ONLY: TSTATIONDATA, TSTATIONTIME +USE MODD_TYPE_STATION, ONLY: TSTATIONDATA, TSTATPROFTIME IMPLICIT NONE @@ -55,7 +55,7 @@ TYPE STATION_t INTEGER :: NUMBSTAT ! number of stations INTEGER :: NUMBSTAT_LOC = 0 ! number of stations on this process ! - TYPE(TSTATIONTIME) :: TSTATIONS_TIME + TYPE(TSTATPROFTIME) :: TSTATIONS_TIME TYPE(TSTATIONDATA), DIMENSION(:), POINTER :: TSTATIONS ! characteristics and records of the stations ! END TYPE STATION_t @@ -65,7 +65,7 @@ TYPE(STATION_t), DIMENSION(JPMODELMAX), TARGET, SAVE :: STATION_MODEL LOGICAL, POINTER :: LSTATION=>NULL() INTEGER, POINTER :: NUMBSTAT=>NULL() INTEGER, POINTER :: NUMBSTAT_LOC=>NULL() -TYPE(TSTATIONTIME), POINTER :: TSTATIONS_TIME => NULL() +TYPE(TSTATPROFTIME), POINTER :: TSTATIONS_TIME => NULL() TYPE(TSTATIONDATA), DIMENSION(:), POINTER :: TSTATIONS => NULL() CONTAINS diff --git a/src/MNH/modd_type_station.f90 b/src/MNH/modd_type_station.f90 index d8d58820a..ed408c9af 100644 --- a/src/MNH/modd_type_station.f90 +++ b/src/MNH/modd_type_station.f90 @@ -43,14 +43,14 @@ implicit none private -public :: TSTATIONTIME, TSTATIONDATA +public :: TSTATPROFTIME, TSTATIONDATA -TYPE TSTATIONTIME +TYPE :: TSTATPROFTIME REAL :: XTIME_CUR = XUNDEF ! current time since last storage 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 TSTATIONTIME +END TYPE TSTATPROFTIME TYPE TSTATIONDATA ! Type to store all the data of 1 station -- GitLab From 508731de97023236ee58d0fdcb76bed59ce3e01a Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Wed, 27 Apr 2022 09:47:04 +0200 Subject: [PATCH 061/157] Philippe 27/04/2022: stations/profilers: rename some files (some code will be shared between profilers and stations) --- src/MNH/{modd_type_station.f90 => modd_type_statprof.f90} | 0 src/MNH/{station_reader.f90 => statprof_reader.f90} | 0 src/MNH/{station_tools.f90 => statprof_tools.f90} | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename src/MNH/{modd_type_station.f90 => modd_type_statprof.f90} (100%) rename src/MNH/{station_reader.f90 => statprof_reader.f90} (100%) rename src/MNH/{station_tools.f90 => statprof_tools.f90} (100%) diff --git a/src/MNH/modd_type_station.f90 b/src/MNH/modd_type_statprof.f90 similarity index 100% rename from src/MNH/modd_type_station.f90 rename to src/MNH/modd_type_statprof.f90 diff --git a/src/MNH/station_reader.f90 b/src/MNH/statprof_reader.f90 similarity index 100% rename from src/MNH/station_reader.f90 rename to src/MNH/statprof_reader.f90 diff --git a/src/MNH/station_tools.f90 b/src/MNH/statprof_tools.f90 similarity index 100% rename from src/MNH/station_tools.f90 rename to src/MNH/statprof_tools.f90 -- GitLab From 92ab08e46b150a9c9c7fabe3014babefa798f509 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Wed, 27 Apr 2022 10:16:45 +0200 Subject: [PATCH 062/157] Philippe 27/04/2022: rename modules common to stations and profilers --- src/MNH/ini_surfstationn.f90 | 10 +++++----- src/MNH/modd_stationn.f90 | 4 ++-- src/MNH/modd_type_statprof.f90 | 4 ++-- src/MNH/stationn.f90 | 2 +- src/MNH/statprof_reader.f90 | 12 ++++++------ src/MNH/statprof_tools.f90 | 10 +++++----- src/MNH/write_stationn.f90 | 34 +++++++++++++++++----------------- 7 files changed, 38 insertions(+), 38 deletions(-) diff --git a/src/MNH/ini_surfstationn.f90 b/src/MNH/ini_surfstationn.f90 index ebd004817..8811fa566 100644 --- a/src/MNH/ini_surfstationn.f90 +++ b/src/MNH/ini_surfstationn.f90 @@ -66,13 +66,13 @@ USE MODD_DYN_n, ONLY: DYN_MODEL, XTSTEP USE MODD_GRID_n, ONLY: XXHAT, XYHAT USE MODD_PARAMETERS, ONLY: JPHEXT, JPVEXT USE MODD_STATION_n -USE MODD_TYPE_STATION +USE MODD_TYPE_STATPROF ! USE MODE_MSG -USE MODE_STATION_READER -USE MODE_STATION_TOOLS, ONLY: STATION_ADD, STATION_ALLOCATE, STATION_INI_INTERP, STATION_POSITION -USE MODE_ALLOCBUFFER_ll, ONLY: ALLOCBUFFER_ll -USE MODE_GATHER_ll, ONLY: GATHERALL_FIELD_ll +USE MODE_STATPROF_READER +USE MODE_STATPROF_TOOLS, ONLY: STATION_ADD, STATION_ALLOCATE, STATION_INI_INTERP, STATION_POSITION +USE MODE_ALLOCBUFFER_ll, ONLY: ALLOCBUFFER_ll +USE MODE_GATHER_ll, ONLY: GATHERALL_FIELD_ll ! IMPLICIT NONE ! diff --git a/src/MNH/modd_stationn.f90 b/src/MNH/modd_stationn.f90 index f86692bf4..bd86a1595 100644 --- a/src/MNH/modd_stationn.f90 +++ b/src/MNH/modd_stationn.f90 @@ -36,8 +36,8 @@ ! ------------ ! ! -USE MODD_PARAMETERS, ONLY: JPMODELMAX -USE MODD_TYPE_STATION, ONLY: TSTATIONDATA, TSTATPROFTIME +USE MODD_PARAMETERS, ONLY: JPMODELMAX +USE MODD_TYPE_STATPROF, ONLY: TSTATIONDATA, TSTATPROFTIME IMPLICIT NONE diff --git a/src/MNH/modd_type_statprof.f90 b/src/MNH/modd_type_statprof.f90 index ed408c9af..12150549a 100644 --- a/src/MNH/modd_type_statprof.f90 +++ b/src/MNH/modd_type_statprof.f90 @@ -4,7 +4,7 @@ !MNH_LIC for details. version 1. !----------------------------------------------------------------- ! ############################ - MODULE MODD_TYPE_STATION + MODULE MODD_TYPE_STATPROF ! ############################ ! !!**** *MODD_STATION* - declaration of stations @@ -111,4 +111,4 @@ REAL, DIMENSION(:), ALLOCATABLE :: XSFCO2 ! CO2 surface flux END TYPE TSTATIONDATA -END MODULE MODD_TYPE_STATION +END MODULE MODD_TYPE_STATPROF diff --git a/src/MNH/stationn.f90 b/src/MNH/stationn.f90 index 0343d9da3..41e95dc53 100644 --- a/src/MNH/stationn.f90 +++ b/src/MNH/stationn.f90 @@ -97,7 +97,7 @@ USE MODD_STATION_n USE MODD_ALLSTATION_n, ONLY: LDIAG_SURFRAD USE MODD_TIME_n, ONLY: tdtcur ! -USE MODE_STATION_TOOLS, ONLY: STATION_INTERP_2D, STATION_INTERP_2D_U, STATION_INTERP_2D_V +USE MODE_STATPROF_TOOLS, ONLY: STATION_INTERP_2D, STATION_INTERP_2D_U, STATION_INTERP_2D_V ! ! IMPLICIT NONE diff --git a/src/MNH/statprof_reader.f90 b/src/MNH/statprof_reader.f90 index 1a72bfe1a..ed645d7ab 100644 --- a/src/MNH/statprof_reader.f90 +++ b/src/MNH/statprof_reader.f90 @@ -3,9 +3,9 @@ !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_STATION_READER -! ####################### +! ############################ + MODULE MODE_STATPROF_READER +! ############################ IMPLICIT NONE @@ -41,10 +41,10 @@ SUBROUTINE READ_CSV_STATION( HFILE, PXHAT_GLOB, PYHAT_GLOB, PXHATM, PYHATM, USE MODD_CONF, ONLY: LCARTESIAN USE MODD_STATION_n, ONLY: NUMBSTAT -USE MODD_TYPE_STATION, ONLY: TSTATIONDATA +USE MODD_TYPE_STATPROF, ONLY: TSTATIONDATA USE MODE_MSG -USE MODE_STATION_TOOLS, ONLY: STATION_ADD, STATION_INI_INTERP, STATION_POSITION +USE MODE_STATPROF_TOOLS, ONLY: STATION_ADD, STATION_INI_INTERP, STATION_POSITION CHARACTER(LEN=*), INTENT(IN) :: HFILE ! file to read REAL, DIMENSION(:), INTENT(IN) :: PXHAT_GLOB @@ -131,4 +131,4 @@ END IF ! END SUBROUTINE FRENCH_TO_ENGLISH -END MODULE MODE_STATION_READER +END MODULE MODE_STATPROF_READER diff --git a/src/MNH/statprof_tools.f90 b/src/MNH/statprof_tools.f90 index 10b3c1ee3..0a5e466c3 100644 --- a/src/MNH/statprof_tools.f90 +++ b/src/MNH/statprof_tools.f90 @@ -9,11 +9,11 @@ !----------------------------------------------------------------- ! Modifications: !----------------------------------------------------------------- -! ################## -MODULE MODE_STATION_TOOLS -! ################## +! ################### +MODULE MODE_STATPROF_TOOLS +! ################### -USE MODD_TYPE_STATION, ONLY: TSTATIONDATA +USE MODD_TYPE_STATPROF, ONLY: TSTATIONDATA IMPLICIT NONE @@ -390,4 +390,4 @@ FUNCTION STATION_INTERP_2D_V( TPSTATION, PA ) RESULT( PB ) END FUNCTION STATION_INTERP_2D_V -END MODULE MODE_STATION_TOOLS +END MODULE MODE_STATPROF_TOOLS diff --git a/src/MNH/write_stationn.f90 b/src/MNH/write_stationn.f90 index 23d6b40e7..7b35ea4c8 100644 --- a/src/MNH/write_stationn.f90 +++ b/src/MNH/write_stationn.f90 @@ -77,9 +77,9 @@ 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_STATION, ONLY: TSTATIONDATA +USE MODD_TYPE_STATPROF, ONLY: TSTATIONDATA ! -USE MODE_STATION_TOOLS, ONLY: STATION_ALLOCATE +USE MODE_STATPROF_TOOLS, ONLY: STATION_ALLOCATE ! IMPLICIT NONE ! @@ -292,25 +292,25 @@ 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_station, only: tstationdata +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 +use MODE_WRITE_DIACHRO, ONLY: Write_diachro TYPE(TFILEDATA), INTENT(IN) :: TPDIAFILE ! diachronic file to write TYPE(TSTATIONDATA), INTENT(IN) :: TPSTATION -- GitLab From 6a55784ce758bedecbb2beac0e4bd3437b8dda6d Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Wed, 27 Apr 2022 11:20:34 +0200 Subject: [PATCH 063/157] Philippe 27/04/2022: add namelist for profilers (not yet used) --- src/MNH/default_desfmn.f90 | 18 ++++++- src/MNH/goto_model_wrapper.f90 | 7 ++- src/MNH/modd_allprofilern.f90 | 99 ++++++++++++++++++++++++++++++++++ src/MNH/modn_profilern.f90 | 91 +++++++++++++++++++++++++++++++ src/MNH/read_desfmn.f90 | 13 ++++- src/MNH/read_exsegn.f90 | 8 ++- src/MNH/write_desfmn.f90 | 17 ++++-- 7 files changed, 243 insertions(+), 10 deletions(-) create mode 100644 src/MNH/modd_allprofilern.f90 create mode 100644 src/MNH/modn_profilern.f90 diff --git a/src/MNH/default_desfmn.f90 b/src/MNH/default_desfmn.f90 index c9f530786..ec17d0ffc 100644 --- a/src/MNH/default_desfmn.f90 +++ b/src/MNH/default_desfmn.f90 @@ -219,6 +219,7 @@ END MODULE MODI_DEFAULT_DESFM_n ! Q. Rodier 06/2021: modify default value to LGZ=F (grey-zone corr.), LSEDI and OSEDC=T (LIMA sedimentation) ! F. Couvreux 06/2021: add LRELAX_UVMEAN_FRC ! Q. Rodier 07/2021: modify XPOND=1 +! P. Wautelet 27/04/2022: add namelist for profilers !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -270,6 +271,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 ! ! @@ -592,7 +594,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 diff --git a/src/MNH/goto_model_wrapper.f90 b/src/MNH/goto_model_wrapper.f90 index da4f0e5c7..c0e7e24dd 100644 --- a/src/MNH/goto_model_wrapper.f90 +++ b/src/MNH/goto_model_wrapper.f90 @@ -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 @@ -189,14 +191,15 @@ 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) diff --git a/src/MNH/modd_allprofilern.f90 b/src/MNH/modd_allprofilern.f90 new file mode 100644 index 000000000..fd7cd8eb2 --- /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/modn_profilern.f90 b/src/MNH/modn_profilern.f90 new file mode 100644 index 000000000..d050fddcf --- /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/read_desfmn.f90 b/src/MNH/read_desfmn.f90 index 2f781f8e7..cc91eec5f 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-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. @@ -195,6 +195,7 @@ 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 +! P. Wautelet 27/04/2022: add namelist for profilers !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -263,6 +264,7 @@ 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 @@ -471,6 +473,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 @@ -732,6 +740,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) diff --git a/src/MNH/read_exsegn.f90 b/src/MNH/read_exsegn.f90 index 9db15fc16..f77b127fe 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. @@ -303,6 +303,7 @@ END MODULE MODI_READ_EXSEG_n ! P. Wautelet 10/03/2021: move scalar variable name initializations to ini_nsv ! R. Honnert 23/04/2021: add ADAP mixing length and delete HRIO and BOUT from CMF_UPDRAFT ! S. Riette 11/05/2021 HighLow cloud +! P. Wautelet 27/04/2022: add namelist for profilers !------------------------------------------------------------------------------ ! !* 0. DECLARATIONS @@ -391,6 +392,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 @@ -498,6 +500,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')") @@ -553,6 +556,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) ! @@ -2974,6 +2979,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/write_desfmn.f90 b/src/MNH/write_desfmn.f90 index 8be686e64..c88c912d4 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-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. @@ -146,15 +146,19 @@ 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 +! P. Wautelet 27/04/2022: add namelist for profilers !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ USE MODD_CONF -USE MODD_DYN_n, ONLY: LHORELAX_SVLIMA -USE MODD_IO, ONLY: TFILEDATA -USE MODD_LUNIT_n, ONLY: TLUOUT +USE MODD_DYN_n, ONLY: LHORELAX_SVLIMA +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 ! @@ -205,7 +209,7 @@ 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 ! IMPLICIT NONE @@ -389,6 +393,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) ! -- GitLab From 0034b61a3460b77164fdba49ab312ab15d7ede97 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Wed, 27 Apr 2022 15:07:31 +0200 Subject: [PATCH 064/157] Philippe 27/04/2022: use lstation and lprofiler instead of numbstat and numbprofiler --- src/LIB/SURCOUCHE/src/mode_io_tools_nc4.f90 | 8 ++++---- src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/LIB/SURCOUCHE/src/mode_io_tools_nc4.f90 b/src/LIB/SURCOUCHE/src/mode_io_tools_nc4.f90 index 465f3bf2f..e462d6f19 100644 --- a/src/LIB/SURCOUCHE/src/mode_io_tools_nc4.f90 +++ b/src/LIB/SURCOUCHE/src/mode_io_tools_nc4.f90 @@ -278,11 +278,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, tprofiler 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, tstations_time +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 @@ -422,13 +422,13 @@ 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 + if ( lprofiler ) then iprof = Nint ( ( xseglen - dyn_model(1)%xtstep ) / tprofiler%step ) + 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 + 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 diff --git a/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 b/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 index 0900e7163..223246cca 100644 --- a/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 +++ b/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 @@ -1456,10 +1456,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, tprofiler use modd_series, only: lseries use modd_series_n, only: nsnbstept, tpsdates -use modd_station_n, only: numbstat, tstations_time +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 @@ -1836,11 +1836,11 @@ if ( tpfile%lmaster ) then end if !Coordinates for the number of profiler times - if ( numbprofiler > 0 ) & + if ( lprofiler ) & call Write_time_coord( tpfile%tncdims%tdims(NMNHDIM_PROFILER_TIME), 'time axis for profilers', tprofiler%tpdates ) !Coordinates for the number of station times - if ( numbstat > 0 ) & + 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 -- GitLab From 33d772457b3a15f00c931c7b9ec20f373a584f1e Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Fri, 29 Apr 2022 15:15:00 +0200 Subject: [PATCH 065/157] Philippe 29/04/2022: restructure profilers for better performance, reduce memory usage and correct some problems/bugs + share code with stations --- src/LIB/SURCOUCHE/src/mode_io_tools_nc4.f90 | 4 +- src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 | 4 +- src/MNH/goto_model_wrapper.f90 | 2 - src/MNH/ini_modeln.f90 | 4 +- src/MNH/ini_posprofilern.f90 | 329 ++--- src/MNH/ini_profilern.f90 | 176 --- src/MNH/ini_surfstationn.f90 | 26 +- src/MNH/modd_profilern.f90 | 45 +- src/MNH/modd_stationn.f90 | 5 +- src/MNH/modd_sub_profilern.f90 | 109 -- src/MNH/modd_type_profiler.f90 | 115 -- src/MNH/modd_type_statprof.f90 | 159 ++- src/MNH/modeln.f90 | 13 +- src/MNH/modn_stationn.f90 | 1 - src/MNH/profilern.f90 | 1242 +++++++------------ src/MNH/stationn.f90 | 84 +- src/MNH/statprof_reader.f90 | 99 +- src/MNH/statprof_tools.f90 | 542 ++++++-- src/MNH/write_profilern.f90 | 525 +++++--- src/MNH/write_stationn.f90 | 56 +- 20 files changed, 1659 insertions(+), 1881 deletions(-) delete mode 100644 src/MNH/ini_profilern.f90 delete mode 100644 src/MNH/modd_sub_profilern.f90 delete mode 100644 src/MNH/modd_type_profiler.f90 diff --git a/src/LIB/SURCOUCHE/src/mode_io_tools_nc4.f90 b/src/LIB/SURCOUCHE/src/mode_io_tools_nc4.f90 index e462d6f19..09d1c225a 100644 --- a/src/LIB/SURCOUCHE/src/mode_io_tools_nc4.f90 +++ b/src/LIB/SURCOUCHE/src/mode_io_tools_nc4.f90 @@ -278,7 +278,7 @@ 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: lprofiler, 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 @@ -423,7 +423,7 @@ if ( tpfile%ctype == 'MNHDIACHRONIC' ) then !Dimension for the number of profiler times if ( lprofiler ) then - iprof = Nint ( ( xseglen - dyn_model(1)%xtstep ) / tprofiler%step ) + 1 + 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 diff --git a/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 b/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 index 223246cca..c554d7da1 100644 --- a/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 +++ b/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 @@ -1456,7 +1456,7 @@ 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: lprofiler, 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: lstation, tstations_time @@ -1837,7 +1837,7 @@ if ( tpfile%lmaster ) then !Coordinates for the number of profiler times if ( lprofiler ) & - call Write_time_coord( tpfile%tncdims%tdims(NMNHDIM_PROFILER_TIME), 'time axis for profilers', tprofiler%tpdates ) + 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 ( lstation ) & diff --git a/src/MNH/goto_model_wrapper.f90 b/src/MNH/goto_model_wrapper.f90 index c0e7e24dd..33dbefdf2 100644 --- a/src/MNH/goto_model_wrapper.f90 +++ b/src/MNH/goto_model_wrapper.f90 @@ -109,7 +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_TIMEZ USE MODD_TURB_n ! @@ -205,7 +204,6 @@ 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_PASPOL_GOTO_MODEL(KFROM, KTO) CALL SUB_ELEC_GOTO_MODEL(KFROM, KTO) !CALL TIME_GOTO_MODEL(KFROM, KTO) diff --git a/src/MNH/ini_modeln.f90 b/src/MNH/ini_modeln.f90 index 6ee23d80a..27d610835 100644 --- a/src/MNH/ini_modeln.f90 +++ b/src/MNH/ini_modeln.f90 @@ -2572,9 +2572,7 @@ 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_posprofilern.f90 b/src/MNH/ini_posprofilern.f90 index 00279c8a8..ad6340211 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,144 @@ 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_GRID_n, ONLY: XXHAT, XYHAT +USE MODD_PARAMETERS, ONLY: JPHEXT, JPVEXT +USE MODD_PROFILER_n, ONLY: LPROFILER, NUMBPROFILER_LOC, TPROFILERS, TPROFILERS_TIME +USE MODD_TYPE_STATPROF, ONLY: TPROFILERDATA + +USE MODE_ALLOCBUFFER_ll, ONLY: ALLOCBUFFER_ll +USE MODE_GATHER_ll, ONLY: GATHERALL_FIELD_ll 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 ! +INTEGER :: IERR +INTEGER :: IIU +INTEGER :: IJU +INTEGER :: INUMBPROF ! Total number of profilers (inside physical domain of model) +INTEGER :: ISTORE ! number of storage instants +INTEGER :: JI +LOGICAL :: GALLOCX, GALLOCY +LOGICAL :: GINSIDE ! True if profiler is inside physical domain of model +LOGICAL :: GPRESENT ! True if profiler is present on the current process +REAL :: ZXHATM_PHYS_MIN, ZYHATM_PHYS_MIN ! Minimum X coordinate of mass points in the physical domain +REAL :: ZXHATM_PHYS_MAX, ZYHATM_PHYS_MAX ! Minimum X coordinate of mass points in the physical domain +REAL, DIMENSION(SIZE(XXHAT)) :: ZXHATM ! mass point coordinates +REAL, DIMENSION(SIZE(XYHAT)) :: ZYHATM ! mass point coordinates +REAL, DIMENSION(:), POINTER :: ZXHAT_GLOB +REAL, DIMENSION(:), POINTER :: ZYHAT_GLOB +TYPE(TPROFILERDATA) :: TZPROFILER ! !---------------------------------------------------------------------------- -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) + +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) ) +! +! Prepare positioning data +! +IF ( CFILE_PROF /= "NO_INPUT_CSV" .OR. NNUMB_PROF > 0 ) THEN + IIU = SIZE( XXHAT ) + IJU = SIZE( XYHAT ) + + ! Get global XHAT and YHAT (needed by PROFILER_POSITION) + CALL ALLOCBUFFER_ll( ZXHAT_GLOB, XXHAT, 'XX', GALLOCX ) + CALL ALLOCBUFFER_ll( ZYHAT_GLOB, XYHAT, 'YY', GALLOCY ) + CALL GATHERALL_FIELD_ll( 'XX', XXHAT, ZXHAT_GLOB, IERR ) + CALL GATHERALL_FIELD_ll( 'YY', XYHAT, ZYHAT_GLOB, IERR ) + + ! Interpolations of model variables to mass points + ZXHATM(1:IIU-1) = 0.5 * XXHAT(1:IIU-1) + 0.5 * XXHAT(2:IIU ) + ZXHATM( IIU ) = 1.5 * XXHAT( IIU ) - 0.5 * XXHAT( IIU-1) + + ZYHATM(1:IJU-1) = 0.5 * XYHAT(1:IJU-1) + 0.5 * XYHAT(2:IJU ) + ZYHATM( IJU ) = 1.5 * XYHAT( IJU ) - 0.5 * XYHAT( IJU-1) + + ZXHATM_PHYS_MIN = 0.5 * ( ZXHAT_GLOB(1+JPHEXT) + ZXHAT_GLOB(2+JPHEXT) ) + ZXHATM_PHYS_MAX = 0.5 * ( ZXHAT_GLOB(UBOUND(ZXHAT_GLOB,1)-JPHEXT) + ZXHAT_GLOB(UBOUND(ZXHAT_GLOB,1)-JPHEXT+1) ) + ZYHATM_PHYS_MIN = 0.5 * ( ZYHAT_GLOB(1+JPHEXT) + ZYHAT_GLOB(2+JPHEXT) ) + ZYHATM_PHYS_MAX = 0.5 * ( ZYHAT_GLOB(UBOUND(ZYHAT_GLOB,1)-JPHEXT) + ZYHAT_GLOB(UBOUND(ZYHAT_GLOB,1)-JPHEXT+1) ) 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 -! -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)) +! 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, ZXHAT_GLOB, ZYHAT_GLOB, ZXHATM, ZYHATM, & + ZXHATM_PHYS_MIN, ZXHATM_PHYS_MAX, ZYHATM_PHYS_MIN, ZYHATM_PHYS_MAX, & + 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)) + !Treat CSV datafile + CALL STATPROF_CSV_READ( TZPROFILER, CFILE_PROF, ZXHAT_GLOB, ZYHAT_GLOB, ZXHATM, ZYHATM, & + ZXHATM_PHYS_MIN, ZXHATM_PHYS_MAX,ZYHATM_PHYS_MIN, ZYHATM_PHYS_MAX, & + INUMBPROF ) 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','') + +LPROFILER = ( INUMBPROF > 0 ) + +DO JI = 1, NUMBPROFILER_LOC + CALL PROFILER_ALLOCATE( TPROFILERS(JI), ISTORE ) +END DO +! +! Clean positioning data +! +IF ( CFILE_PROF /= "NO_INPUT_CSV" .OR. NNUMB_PROF > 0 ) THEN + IF ( GALLOCX ) DEALLOCATE( ZXHAT_GLOB ) + IF ( GALLOCY ) DEALLOCATE( ZYHAT_GLOB ) END IF -! -TPROFILER%STEP = MAX ( PTSTEP, TPROFILER%STEP ) -! -! -END SUBROUTINE INI_INTERP_PROFILER_n -!---------------------------------------------------------------------------- !---------------------------------------------------------------------------- ! END SUBROUTINE INI_POSPROFILER_n diff --git a/src/MNH/ini_profilern.f90 b/src/MNH/ini_profilern.f90 deleted file mode 100644 index 598980099..000000000 --- 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_surfstationn.f90 b/src/MNH/ini_surfstationn.f90 index 8811fa566..5452a5f0e 100644 --- a/src/MNH/ini_surfstationn.f90 +++ b/src/MNH/ini_surfstationn.f90 @@ -68,11 +68,11 @@ USE MODD_PARAMETERS, ONLY: JPHEXT, JPVEXT USE MODD_STATION_n USE MODD_TYPE_STATPROF ! -USE MODE_MSG -USE MODE_STATPROF_READER -USE MODE_STATPROF_TOOLS, ONLY: STATION_ADD, STATION_ALLOCATE, STATION_INI_INTERP, STATION_POSITION USE MODE_ALLOCBUFFER_ll, ONLY: ALLOCBUFFER_ll USE MODE_GATHER_ll, ONLY: GATHERALL_FIELD_ll +USE MODE_MSG +USE MODE_STATPROF_READER, ONLY: STATPROF_CSV_READ +USE MODE_STATPROF_TOOLS, ONLY: STATION_ADD, STATION_ALLOCATE, STATPROF_INI_INTERP, STATPROF_POSITION ! IMPLICIT NONE ! @@ -88,6 +88,7 @@ IMPLICIT NONE INTEGER :: IERR INTEGER :: IIU INTEGER :: IJU +INTEGER :: INUMBSTAT ! Total number of stations (inside physical domain of model) INTEGER :: ISTORE ! number of storage instants INTEGER :: JI LOGICAL :: GALLOCX, GALLOCY @@ -120,7 +121,7 @@ IF ( CFILE_STAT /= "NO_INPUT_CSV" .OR. NNUMB_STAT > 0 ) THEN IIU = SIZE( XXHAT ) IJU = SIZE( XYHAT ) - ! Get global XHAT and YHAT (needed by STATION_POSITION) + ! Get global XHAT and YHAT (needed by STATPROF_POSITION) CALL ALLOCBUFFER_ll( ZXHAT_GLOB, XXHAT, 'XX', GALLOCX ) CALL ALLOCBUFFER_ll( ZYHAT_GLOB, XYHAT, 'YY', GALLOCY ) CALL GATHERALL_FIELD_ll( 'XX', XXHAT, ZXHAT_GLOB, IERR ) @@ -145,7 +146,7 @@ NUMBSTAT_LOC = 0 IF (CFILE_STAT=="NO_INPUT_CSV") THEN ! Treat namelist - NUMBSTAT = 0 + INUMBSTAT = 0 IF ( NNUMB_STAT > 0 ) THEN DO JI = 1, NNUMB_STAT IF ( LCARTESIAN ) THEN @@ -154,18 +155,18 @@ IF (CFILE_STAT=="NO_INPUT_CSV") THEN ELSE TZSTATION%XLAT = XLAT_STAT(JI) TZSTATION%XLON = XLON_STAT(JI) - CALL STATION_INI_INTERP( TZSTATION ) + CALL STATPROF_INI_INTERP( TZSTATION ) END IF TZSTATION%XZ = XZ_STAT(JI) TZSTATION%CNAME = CNAME_STAT(JI) - CALL STATION_POSITION( TZSTATION, ZXHAT_GLOB, ZYHAT_GLOB, ZXHATM, ZYHATM, & + CALL STATPROF_POSITION( TZSTATION, ZXHAT_GLOB, ZYHAT_GLOB, ZXHATM, ZYHATM, & ZXHATM_PHYS_MIN, ZXHATM_PHYS_MAX, ZYHATM_PHYS_MIN, ZYHATM_PHYS_MAX, & GINSIDE, GPRESENT ) IF ( GINSIDE ) THEN - NUMBSTAT = NUMBSTAT + 1 - TZSTATION%NID = NUMBSTAT + INUMBSTAT = INUMBSTAT + 1 + TZSTATION%NID = INUMBSTAT END IF IF ( GPRESENT ) CALL STATION_ADD( TZSTATION ) @@ -173,11 +174,12 @@ IF (CFILE_STAT=="NO_INPUT_CSV") THEN END IF ELSE !Treat CSV datafile - CALL READ_CSV_STATION( CFILE_STAT, ZXHAT_GLOB, ZYHAT_GLOB, ZXHATM, ZYHATM, & - ZXHATM_PHYS_MIN, ZXHATM_PHYS_MAX,ZYHATM_PHYS_MIN, ZYHATM_PHYS_MAX ) + CALL STATPROF_CSV_READ( TZSTATION, CFILE_STAT, ZXHAT_GLOB, ZYHAT_GLOB, ZXHATM, ZYHATM, & + ZXHATM_PHYS_MIN, ZXHATM_PHYS_MAX,ZYHATM_PHYS_MIN, ZYHATM_PHYS_MAX, & + INUMBSTAT ) END IF -LSTATION = ( NUMBSTAT > 0 ) +LSTATION = ( INUMBSTAT > 0 ) DO JI = 1, NUMBSTAT_LOC CALL STATION_ALLOCATE( TSTATIONS(JI), ISTORE ) diff --git a/src/MNH/modd_profilern.f90 b/src/MNH/modd_profilern.f90 index d8fb2469f..3abfe6611 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_stationn.f90 b/src/MNH/modd_stationn.f90 index bd86a1595..406d14909 100644 --- a/src/MNH/modd_stationn.f90 +++ b/src/MNH/modd_stationn.f90 @@ -43,7 +43,7 @@ IMPLICIT NONE PRIVATE -PUBLIC :: LSTATION, NUMBSTAT, NUMBSTAT_LOC, TSTATIONS_TIME, TSTATIONS +PUBLIC :: LSTATION, NUMBSTAT_LOC, TSTATIONS_TIME, TSTATIONS PUBLIC :: STATION_GOTO_MODEL @@ -52,7 +52,6 @@ TYPE STATION_t !------------------------------------------------------------------------------------------- ! LOGICAL :: LSTATION ! flag to use stations - INTEGER :: NUMBSTAT ! number of stations INTEGER :: NUMBSTAT_LOC = 0 ! number of stations on this process ! TYPE(TSTATPROFTIME) :: TSTATIONS_TIME @@ -63,7 +62,6 @@ END TYPE STATION_t TYPE(STATION_t), DIMENSION(JPMODELMAX), TARGET, SAVE :: STATION_MODEL LOGICAL, POINTER :: LSTATION=>NULL() -INTEGER, POINTER :: NUMBSTAT=>NULL() INTEGER, POINTER :: NUMBSTAT_LOC=>NULL() TYPE(TSTATPROFTIME), POINTER :: TSTATIONS_TIME => NULL() TYPE(TSTATIONDATA), DIMENSION(:), POINTER :: TSTATIONS => NULL() @@ -78,7 +76,6 @@ STATION_MODEL(KFROM)%TSTATIONS => TSTATIONS ! ! Current model is set to model KTO LSTATION => STATION_MODEL(KTO)%LSTATION -NUMBSTAT => STATION_MODEL(KTO)%NUMBSTAT NUMBSTAT_LOC => STATION_MODEL(KTO)%NUMBSTAT_LOC TSTATIONS_TIME => STATION_MODEL(KTO)%TSTATIONS_TIME TSTATIONS => STATION_MODEL(KTO)%TSTATIONS diff --git a/src/MNH/modd_sub_profilern.f90 b/src/MNH/modd_sub_profilern.f90 deleted file mode 100644 index 14582b74b..000000000 --- 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_type_profiler.f90 b/src/MNH/modd_type_profiler.f90 deleted file mode 100644 index b5fedbf60..000000000 --- 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_statprof.f90 b/src/MNH/modd_type_statprof.f90 index 12150549a..c456ae947 100644 --- a/src/MNH/modd_type_statprof.f90 +++ b/src/MNH/modd_type_statprof.f90 @@ -30,7 +30,7 @@ !! ------------- !! Original 15/01/02 ! P. Wautelet 13/09/2019: budget: simplify and modernize date/time management -! P. Wautelet 04/2022: restructure stations for better performance, reduce memory usage and correct some problems/bugs +! P. Wautelet 04/2022: restructure stations/profilers for better performance, reduce memory usage and correct some problems/bugs !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -43,7 +43,8 @@ implicit none private -public :: TSTATPROFTIME, TSTATIONDATA +public :: TSTATPROFTIME +public :: TPROFILERDATA, TSTATIONDATA, TSTATPROFDATA TYPE :: TSTATPROFTIME REAL :: XTIME_CUR = XUNDEF ! current time since last storage @@ -52,63 +53,105 @@ TYPE :: TSTATPROFTIME type(date_time), dimension(:), ALLOCATABLE :: tpdates ! dates(n) (n: recording instants) END TYPE TSTATPROFTIME -TYPE TSTATIONDATA -! Type to store all the data of 1 station -CHARACTER(LEN=NSTATPROFNAMELGTMAX) :: CNAME = '' ! station name - - -INTEGER :: NID = 0 ! Global identification number of the station (from 1 to total number of stations of the model) - -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) -REAL :: XZS = XUNDEF ! zs(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) - -INTEGER :: NK = NNEGUNDEF ! Model level for altitude comparisons - -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 :: XT2M -REAL, DIMENSION(:), ALLOCATABLE :: XQ2M -REAL, DIMENSION(:), ALLOCATABLE :: XHU2M -REAL, DIMENSION(:), ALLOCATABLE :: XZON10M -REAL, DIMENSION(:), ALLOCATABLE :: XMER10M -REAL, DIMENSION(:), ALLOCATABLE :: XRN -REAL, DIMENSION(:), ALLOCATABLE :: XH -REAL, DIMENSION(:), ALLOCATABLE :: XLE -REAL, DIMENSION(:), ALLOCATABLE :: XLEI -REAL, DIMENSION(:), ALLOCATABLE :: XGFLUX -REAL, DIMENSION(:), ALLOCATABLE :: XSWD -REAL, DIMENSION(:), ALLOCATABLE :: XSWU -REAL, DIMENSION(:), ALLOCATABLE :: XLWD -REAL, DIMENSION(:), ALLOCATABLE :: XLWU -REAL, DIMENSION(:), ALLOCATABLE :: XSWDIR -REAL, DIMENSION(:), ALLOCATABLE :: XSWDIFF -REAL, DIMENSION(:), ALLOCATABLE :: XDSTAOD ! Dust Aerosol Optical Depth -REAL, DIMENSION(:), ALLOCATABLE :: XSFCO2 ! CO2 surface flux +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 :: XVISI ! VISI(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/modeln.f90 b/src/MNH/modeln.f90 index 61c50c483..c778b2e1e 100644 --- a/src/MNH/modeln.f90 +++ b/src/MNH/modeln.f90 @@ -2116,21 +2116,20 @@ IF (LFLYER) & !* 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(XTSTEP, XZZ, & + XUT, XVT, XWT, XTHT, XRT, XSVT, XTKET, XTSRAD, XPABST ) ! !--------------------------------------------------------- ! !* 24.3 PROFILER (observation diagnostic) ! --------------------------------- ! -IF (LPROFILER) & +IF ( LPROFILER ) & CALL PROFILER_n(XTSTEP, & - XXHAT, XYHAT, XZZ,XRHODREF, & + XZZ, XRHODREF, & XUT, XVT, XWT, XTHT, XRT, XSVT, XTKET, XTSRAD, XPABST, & - XAER, XCLDFR, XCIT,PSEA=ZSEA(:,:)) + XAER, XCIT, PSEA=ZSEA(:,:)) ! ! CALL SECOND_MNH2(ZTIME2) diff --git a/src/MNH/modn_stationn.f90 b/src/MNH/modn_stationn.f90 index 9b8737c03..094b3dbb1 100644 --- a/src/MNH/modn_stationn.f90 +++ b/src/MNH/modn_stationn.f90 @@ -37,7 +37,6 @@ USE MODD_ALLSTATION_n, ONLY:& CFILE_STAT_n =>CFILE_STAT ,& LDIAG_SURFRAD_n =>LDIAG_SURFRAD USE MODD_PARAMETERS, ONLY: NFILENAMELGTMAX, NSTATPROFNAMELGTMAX -USE MODD_STATION_n ! !----------------------------------------------------------------------------- ! diff --git a/src/MNH/profilern.f90 b/src/MNH/profilern.f90 index 4424b816f..ccd26a860 100644 --- a/src/MNH/profilern.f90 +++ b/src/MNH/profilern.f90 @@ -9,27 +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( PTSTEP, & + 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(:,:), INTENT(IN) :: PSEA ! for radar ! @@ -41,11 +38,11 @@ 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( PTSTEP, & + PZ, PRHODREF, & + PU, PV, PW, PTH, PR, PSV, PTKE, & + PTS, PP, PAER, PCIT, PSEA ) ! ######################################################## ! ! @@ -88,54 +85,50 @@ 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, 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 +USE MODD_GRID, ONLY: XBETA, XLON0, XRPK +USE MODD_NSV, ONLY: NSV_C2R2BEG, NSV_C2R2END, NSV_LIMA_NC, NSV_LIMA_NI, NSV_LIMA_NR +USE MODD_PARAMETERS, ONLY: JPVEXT, XUNDEF +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 +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 +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 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, & + XRTMIN_I => XRTMIN, XCONC_LAND, XCONC_SEA +USE MODD_TIME_n, only: tdtcur +! +USE MODE_FGAU, ONLY: GAULAG +USE MODE_FSCATTER, ONLY: BHMIE, QEPSI, QEPSW, MG, MOMG USE MODE_MSG +USE MODE_STATPROF_TOOLS, ONLY: 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 -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 -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_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,& - XRTMIN_I=>XRTMIN,XCONC_LAND,XCONC_SEA ! ! IMPLICIT NONE @@ -145,51 +138,40 @@ 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) :: 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(:,:), INTENT(IN) :: PSEA ! for radar +REAL, DIMENSION(:,:), 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) @@ -219,34 +201,25 @@ 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)) :: ZTEMP,ZTHV,ZTEMPV REAL,DIMENSION(SIZE(PTH,1),SIZE(PTH,2),SIZE(PTH,3)) :: ZVISI,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 ! 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 :: ZFRAC_ICE ! ice water fraction REAL :: ZDELTA_EQUIV ! mass-equivalent Gauss-Laguerre point REAL :: ZFW ! liquid fraction REAL :: ZFPW ! weight for mixed-phase reflectivity @@ -270,150 +243,31 @@ 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 + +IF ( TPROFILERS_TIME%XTIME_CUR == XUNDEF ) TPROFILERS_TIME%XTIME_CUR = TPROFILERS_TIME%XTSTEP - PTSTEP ! -TPROFILER%T_CUR = TPROFILER%T_CUR + PTSTEP +TPROFILERS_TIME%XTIME_CUR = TPROFILERS_TIME%XTIME_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 +IF ( TPROFILERS_TIME%XTIME_CUR >= TPROFILERS_TIME%XTSTEP - 1.E-10 ) THEN + TPROFILERS_TIME%XTIME_CUR = TPROFILERS_TIME%XTIME_CUR - TPROFILERS_TIME%XTSTEP + TPROFILERS_TIME%N_CUR = TPROFILERS_TIME%N_CUR + 1 + IN = TPROFILERS_TIME%N_CUR + tprofilers_time%tpdates(in) = tdtcur 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 + !No profiler storage at this time step + RETURN END IF ! -! -!---------------------------------------------------------------------------- -! -!* 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 @@ -439,610 +293,406 @@ IF ((SIZE(PR,4) >= 2) .AND. NSV_C2R2END /= 0 ) THEN 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' ) + 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 ) + TPROFILERS(JP)%XVISI(IN,:) = STATPROF_INTERP_3D( TPROFILERS(JP), ZVISI ) + 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 - 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 - 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 - 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 - 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 + ! 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 + 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 + 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 + 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 + 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 + ZLBDA=ZLB*(ZRHODREFZ(JK)*ZRZ(JK,JLOOP))**ZLBEX + 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 - ZLBDA=ZLB*(ZRHODREFZ(JK)*ZRZ(JK,JLOOP))**ZLBEX - 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*ZCC*ZLBDA**ZCX/(4.*GAMMA(ZNU)*.93) - ZAETMP=ZAETMP * XPI *ZCC*ZLBDA**ZCX/(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(:,:,:)) + 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*ZCC*ZLBDA**ZCX/(4.*GAMMA(ZNU)*.93) + ZAETMP=ZAETMP * XPI *ZCC*ZLBDA**ZCX/(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/stationn.f90 b/src/MNH/stationn.f90 index 41e95dc53..b10c060a5 100644 --- a/src/MNH/stationn.f90 +++ b/src/MNH/stationn.f90 @@ -9,14 +9,11 @@ MODULE MODI_STATION_n ! INTERFACE ! - SUBROUTINE STATION_n(PTSTEP, & - PXHAT, PYHAT, PZ, & - PU, PV, PW, PTH, PR, PSV, PTKE, & - PTS,PP ) + SUBROUTINE STATION_n( PTSTEP, 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 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 +33,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( PTSTEP, PZ, & + PU, PV, PW, PTH, PR, PSV, PTKE, & + PTS, PP ) +! ####################################################### ! ! !!**** *STATION_n* - (advects and) stores @@ -97,7 +93,7 @@ USE MODD_STATION_n USE MODD_ALLSTATION_n, ONLY: LDIAG_SURFRAD USE MODD_TIME_n, ONLY: tdtcur ! -USE MODE_STATPROF_TOOLS, ONLY: STATION_INTERP_2D, STATION_INTERP_2D_U, STATION_INTERP_2D_V +USE MODE_STATPROF_TOOLS, ONLY: STATPROF_INTERP_2D, STATPROF_INTERP_2D_U, STATPROF_INTERP_2D_V ! ! IMPLICIT NONE @@ -107,8 +103,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) :: PU ! horizontal wind X component REAL, DIMENSION(:,:,:), INTENT(IN) :: PV ! horizontal wind Y component @@ -163,52 +157,52 @@ STATION: DO JS = 1,NUMBSTAT_LOC JK = TSTATIONS(JS)%NK IF (LCARTESIAN) THEN - TSTATIONS(JS)%XZON(IN) = STATION_INTERP_2D_U( TSTATIONS(JS), PU(:,:,JK) ) - TSTATIONS(JS)%XMER(IN) = STATION_INTERP_2D_V( TSTATIONS(JS), PV(:,:,JK) ) + 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 = STATION_INTERP_2D_U( TSTATIONS(JS), PU(:,:,JK) ) - ZV_STAT = STATION_INTERP_2D_V( TSTATIONS(JS), PV(:,:,JK) ) + 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) = STATION_INTERP_2D( TSTATIONS(JS), PW(:,:,JK) ) - TSTATIONS(JS)%XTH(IN) = STATION_INTERP_2D( TSTATIONS(JS), PTH(:,:,JK) ) - TSTATIONS(JS)%XP (IN) = STATION_INTERP_2D( TSTATIONS(JS), PP(:,:,JK) ) + 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 JSV=1,SIZE(PR,4) - TSTATIONS(JS)%XR(IN,JSV) = STATION_INTERP_2D( TSTATIONS(JS), PR(:,:,JK,JSV) ) + TSTATIONS(JS)%XR(IN,JSV) = STATPROF_INTERP_2D( TSTATIONS(JS), PR(:,:,JK,JSV) ) END DO DO JSV=1,SIZE(PSV,4) - TSTATIONS(JS)%XSV(IN,JSV) = STATION_INTERP_2D( TSTATIONS(JS), PSV(:,:,JK,JSV) ) + TSTATIONS(JS)%XSV(IN,JSV) = STATPROF_INTERP_2D( TSTATIONS(JS), PSV(:,:,JK,JSV) ) END DO - IF (SIZE(PTKE)>0) TSTATIONS(JS)%XTKE(IN) = STATION_INTERP_2D( TSTATIONS(JS), PTKE(:,:,JK) ) - IF ( CRAD /= 'NONE' ) TSTATIONS(JS)%XTSRAD(IN) = STATION_INTERP_2D( TSTATIONS(JS), PTS ) - TSTATIONS(JS)%XZS = STATION_INTERP_2D( TSTATIONS(JS), PZ(:,:,1+JPVEXT)) + 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) = STATION_INTERP_2D( TSTATIONS(JS), XCURRENT_ZON10M ) - TSTATIONS(JS)%XMER10M(IN) = STATION_INTERP_2D( TSTATIONS(JS), XCURRENT_MER10M ) - TSTATIONS(JS)%XT2M (IN) = STATION_INTERP_2D( TSTATIONS(JS), XCURRENT_T2M ) - TSTATIONS(JS)%XQ2M (IN) = STATION_INTERP_2D( TSTATIONS(JS), XCURRENT_Q2M ) - TSTATIONS(JS)%XHU2M (IN) = STATION_INTERP_2D( TSTATIONS(JS), XCURRENT_HU2M ) - TSTATIONS(JS)%XRN (IN) = STATION_INTERP_2D( TSTATIONS(JS), XCURRENT_RN ) - TSTATIONS(JS)%XH (IN) = STATION_INTERP_2D( TSTATIONS(JS), XCURRENT_H ) - TSTATIONS(JS)%XLE (IN) = STATION_INTERP_2D( TSTATIONS(JS), XCURRENT_LE ) - TSTATIONS(JS)%XLEI (IN) = STATION_INTERP_2D( TSTATIONS(JS), XCURRENT_LEI ) - TSTATIONS(JS)%XGFLUX (IN) = STATION_INTERP_2D( TSTATIONS(JS), XCURRENT_GFLUX ) + 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) = STATION_INTERP_2D( TSTATIONS(JS), XCURRENT_SWD ) - TSTATIONS(JS)%XSWU (IN) = STATION_INTERP_2D( TSTATIONS(JS), XCURRENT_SWU ) - TSTATIONS(JS)%XLWD (IN) = STATION_INTERP_2D( TSTATIONS(JS), XCURRENT_LWD ) - TSTATIONS(JS)%XLWU (IN) = STATION_INTERP_2D( TSTATIONS(JS), XCURRENT_LWU ) - TSTATIONS(JS)%XSWDIR (IN) = STATION_INTERP_2D( TSTATIONS(JS), XCURRENT_SWDIR ) - TSTATIONS(JS)%XSWDIFF(IN) = STATION_INTERP_2D( TSTATIONS(JS), XCURRENT_SWDIFF ) - TSTATIONS(JS)%XDSTAOD(IN) = STATION_INTERP_2D( TSTATIONS(JS), XCURRENT_DSTAOD ) + 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) = STATION_INTERP_2D( TSTATIONS(JS), XCURRENT_SFCO2 ) + TSTATIONS(JS)%XSFCO2(IN) = STATPROF_INTERP_2D( TSTATIONS(JS), XCURRENT_SFCO2 ) END IF END DO STATION ! diff --git a/src/MNH/statprof_reader.f90 b/src/MNH/statprof_reader.f90 index ed645d7ab..888cfeac3 100644 --- a/src/MNH/statprof_reader.f90 +++ b/src/MNH/statprof_reader.f90 @@ -11,14 +11,14 @@ IMPLICIT NONE PRIVATE -PUBLIC :: READ_CSV_STATION +PUBLIC :: STATPROF_CSV_READ INTEGER, PARAMETER :: NMAXLINELGT = 400 CONTAINS !------------------------------------------------------------------- ! -!!**** *READ_CSV_STATION* - +!!**** *STATPROF_CSV_READ* - !! !! PURPOSE !! ------- @@ -31,39 +31,55 @@ CONTAINS !! MODIFICATIONS !! ------------- !! 03/2020 Original -! P. Wautelet 04/2022: restructure stations for better performance, reduce memory usage and correct some problems/bugs +! P. Wautelet 04/2022: restructure stations/profilers for better performance, reduce memory usage and correct some problems/bugs !--------------------------------------------------------------- ! -!############################################################################################### -SUBROUTINE READ_CSV_STATION( HFILE, PXHAT_GLOB, PYHAT_GLOB, PXHATM, PYHATM, & - PXHATM_PHYS_MIN, PXHATM_PHYS_MAX,PYHATM_PHYS_MIN, PYHATM_PHYS_MAX ) -!############################################################################################### +!################################################################################################# +SUBROUTINE STATPROF_CSV_READ( TPSTATPROF, HFILE, PXHAT_GLOB, PYHAT_GLOB, PXHATM, PYHATM, & + PXHATM_PHYS_MIN, PXHATM_PHYS_MAX,PYHATM_PHYS_MIN, PYHATM_PHYS_MAX, & + KNUMBSTATPROF ) +!################################################################################################# USE MODD_CONF, ONLY: LCARTESIAN -USE MODD_STATION_n, ONLY: NUMBSTAT -USE MODD_TYPE_STATPROF, ONLY: TSTATIONDATA +USE MODD_TYPE_STATPROF, ONLY: TPROFILERDATA, TSTATIONDATA, TSTATPROFDATA USE MODE_MSG -USE MODE_STATPROF_TOOLS, ONLY: STATION_ADD, STATION_INI_INTERP, STATION_POSITION - -CHARACTER(LEN=*), INTENT(IN) :: HFILE ! file to read -REAL, DIMENSION(:), INTENT(IN) :: PXHAT_GLOB -REAL, DIMENSION(:), INTENT(IN) :: PYHAT_GLOB -REAL, DIMENSION(:), INTENT(IN) :: PXHATM ! mass point coordinates -REAL, DIMENSION(:), INTENT(IN) :: PYHATM ! mass point coordinates -REAL, INTENT(IN) :: PXHATM_PHYS_MIN, PYHATM_PHYS_MIN ! Minimum X coordinate of mass points in the physical domain -REAL, INTENT(IN) :: PXHATM_PHYS_MAX, PYHATM_PHYS_MAX ! Minimum X coordinate of mass points in the physical domain +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 +REAL, DIMENSION(:), INTENT(IN) :: PXHAT_GLOB +REAL, DIMENSION(:), INTENT(IN) :: PYHAT_GLOB +REAL, DIMENSION(:), INTENT(IN) :: PXHATM ! mass point coordinates +REAL, DIMENSION(:), INTENT(IN) :: PYHATM ! mass point coordinates +REAL, INTENT(IN) :: PXHATM_PHYS_MIN, PYHATM_PHYS_MIN ! Minimum X coordinate of mass points in the physical domain +REAL, INTENT(IN) :: PXHATM_PHYS_MAX, PYHATM_PHYS_MAX ! Minimum X coordinate of mass points in the physical domain +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 -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 +INTEGER :: ILU ! logical unit of the file +INTEGER :: INBLINE ! Nb of lines in csv file +INTEGER :: JI +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 -INBLINE = 0 !Number of stations found in the file -NUMBSTAT = 0 !Number of stations found in the file AND inside the model domain +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' ) @@ -71,29 +87,40 @@ OPEN( NEWUNIT = ILU, FILE = HFILE, FORM = 'formatted' ) READ( ILU, END = 101, FMT = '(A)' ) YSTRING ! Reading of header (skip it) DO - ! Read station coordinates + ! 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, * ) TZSTATION%CNAME, TZSTATION%XX, TZSTATION%XY, TZSTATION%XZ + READ( YSTRING, * ) TZSTATPROF%CNAME, TZSTATPROF%XX, TZSTATPROF%XY, TZSTATPROF%XZ ELSE - READ( YSTRING, * ) TZSTATION%CNAME, TZSTATION%XLAT, TZSTATION%XLON, TZSTATION%XZ + READ( YSTRING, * ) TZSTATPROF%CNAME, TZSTATPROF%XLAT, TZSTATPROF%XLON, TZSTATPROF%XZ END IF - IF ( .NOT. LCARTESIAN ) CALL STATION_INI_INTERP( TZSTATION ) - CALL STATION_POSITION( TZSTATION, PXHAT_GLOB, PYHAT_GLOB, PXHATM, PYHATM, & + IF ( .NOT. LCARTESIAN ) CALL STATPROF_INI_INTERP( TZSTATPROF ) + CALL STATPROF_POSITION( TZSTATPROF, PXHAT_GLOB, PYHAT_GLOB, PXHATM, PYHATM, & PXHATM_PHYS_MIN, PXHATM_PHYS_MAX, PYHATM_PHYS_MIN, PYHATM_PHYS_MAX, & GINSIDE, GPRESENT ) IF ( GINSIDE ) THEN - NUMBSTAT = NUMBSTAT + 1 - TZSTATION%NID = NUMBSTAT + KNUMBSTATPROF = KNUMBSTATPROF + 1 + TZSTATPROF%NID = KNUMBSTATPROF END IF - IF ( GPRESENT ) CALL STATION_ADD( TZSTATION ) + 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' ) + END SELECT + END IF INBLINE = INBLINE + 1 END DO @@ -102,9 +129,9 @@ END DO CLOSE( ILU ) -IF ( INBLINE == 0 ) CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'READ_CSV_STATION', 'Data not found in file ' // TRIM( HFILE ) ) +IF ( INBLINE == 0 ) CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'STATPROF_CSV_READ', 'Data not found in file ' // TRIM( HFILE ) ) -END SUBROUTINE READ_CSV_STATION +END SUBROUTINE STATPROF_CSV_READ !######################################################### SUBROUTINE FRENCH_TO_ENGLISH(HSTRING) diff --git a/src/MNH/statprof_tools.f90 b/src/MNH/statprof_tools.f90 index 0a5e466c3..ca8ff988c 100644 --- a/src/MNH/statprof_tools.f90 +++ b/src/MNH/statprof_tools.f90 @@ -13,20 +13,146 @@ MODULE MODE_STATPROF_TOOLS ! ################### -USE MODD_TYPE_STATPROF, ONLY: TSTATIONDATA +USE MODD_TYPE_STATPROF, ONLY: TPROFILERDATA, TSTATIONDATA, TSTATPROFDATA IMPLICIT NONE PRIVATE -PUBLIC :: STATION_ALLOCATE -PUBLIC :: STATION_INI_INTERP -PUBLIC :: STATION_POSITION -PUBLIC :: STATION_ADD -PUBLIC :: STATION_INTERP_2D, STATION_INTERP_2D_U, STATION_INTERP_2D_V +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 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 + + 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) ) + ALLOCATE( TPPROFILER%XVISI (KSTORE, IKU) ) + ALLOCATE( TPPROFILER%XVISIKUN (KSTORE, IKU) ) + 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 + TPPROFILER%XVISI (:,:) = XUNDEF + 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 + TPPROFILER%XQ2M (:) = XUNDEF + TPPROFILER%XHU2M (:) = XUNDEF + TPPROFILER%XZON10M(:) = XUNDEF + TPPROFILER%XMER10M(:) = XUNDEF + TPPROFILER%XRN (:) = XUNDEF + TPPROFILER%XH (:) = XUNDEF + TPPROFILER%XLE (:) = XUNDEF + TPPROFILER%XLEI (:) = XUNDEF + TPPROFILER%XGFLUX (:) = XUNDEF + 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 ) ! ############################################## @@ -116,9 +242,9 @@ SUBROUTINE STATION_ALLOCATE( TPSTATION, KSTORE ) END SUBROUTINE STATION_ALLOCATE -! ######################################## -SUBROUTINE STATION_INI_INTERP( TPSTATION ) -! ######################################## +! ########################################## +SUBROUTINE STATPROF_INI_INTERP( TPSTATPROF ) +! ########################################## USE MODD_GRID, ONLY: XLATORI, XLONORI USE MODD_PARAMETERS, ONLY: XUNDEF @@ -128,28 +254,28 @@ SUBROUTINE STATION_INI_INTERP( TPSTATION ) IMPLICIT NONE - TYPE(TSTATIONDATA), INTENT(INOUT) :: TPSTATION + CLASS(TSTATPROFDATA), INTENT(INOUT) :: TPSTATPROF - IF ( TPSTATION%XLAT == XUNDEF .OR. TPSTATION%XLON == XUNDEF ) THEN - CMNHMSG(1) = 'Error in station position' + 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', 'STATION_INI_INTERP' ) + CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'STATPROF_INI_INTERP' ) END IF - CALL SM_XYHAT( XLATORI, XLONORI, & - TPSTATION%XLAT, TPSTATION%XLON, & - TPSTATION%XX, TPSTATION%XY ) + CALL SM_XYHAT( XLATORI, XLONORI, & + TPSTATPROF%XLAT, TPSTATPROF%XLON, & + TPSTATPROF%XX, TPSTATPROF%XY ) -END SUBROUTINE STATION_INI_INTERP +END SUBROUTINE STATPROF_INI_INTERP ! ############################################################################################### -SUBROUTINE STATION_POSITION( TPSTATION, PXHAT_GLOB, PYHAT_GLOB, PXHATM, PYHATM, & +SUBROUTINE STATPROF_POSITION( TPSTATPROF, PXHAT_GLOB, PYHAT_GLOB, PXHATM, PYHATM, & PXHATM_PHYS_MIN, PXHATM_PHYS_MAX,PYHATM_PHYS_MIN, PYHATM_PHYS_MAX, & OINSIDE, OPRESENT ) ! ############################################################################################### -! Subroutine to determine the position of a station on the model grid +! 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 @@ -162,15 +288,17 @@ SUBROUTINE STATION_POSITION( TPSTATION, PXHAT_GLOB, PYHAT_GLOB, PXHATM, PYHATM, IMPLICIT NONE - TYPE(TSTATIONDATA), INTENT(INOUT) :: TPSTATION - REAL, DIMENSION(:), INTENT(IN) :: PXHAT_GLOB - REAL, DIMENSION(:), INTENT(IN) :: PYHAT_GLOB - REAL, DIMENSION(:), INTENT(IN) :: PXHATM ! mass point coordinates - REAL, DIMENSION(:), INTENT(IN) :: PYHATM ! mass point coordinates - REAL, INTENT(IN) :: PXHATM_PHYS_MIN, PYHATM_PHYS_MIN ! Minimum X coordinate of mass points in the physical domain - REAL, INTENT(IN) :: PXHATM_PHYS_MAX, PYHATM_PHYS_MAX ! Minimum X coordinate of mass points in the physical domain - LOGICAL, INTENT(OUT) :: OINSIDE ! True if station is inside physical domain of model - LOGICAL, INTENT(OUT) :: OPRESENT ! True if station is present on the current process + CLASS(TSTATPROFDATA), INTENT(INOUT) :: TPSTATPROF + REAL, DIMENSION(:), INTENT(IN) :: PXHAT_GLOB + REAL, DIMENSION(:), INTENT(IN) :: PYHAT_GLOB + REAL, DIMENSION(:), INTENT(IN) :: PXHATM ! mass point coordinates + REAL, DIMENSION(:), INTENT(IN) :: PYHATM ! mass point coordinates + REAL, INTENT(IN) :: PXHATM_PHYS_MIN ! Minimum X coordinate of mass points in the physical domain + REAL, INTENT(IN) :: PYHATM_PHYS_MIN ! Minimum Y coordinate of mass points in the physical domain + REAL, INTENT(IN) :: PXHATM_PHYS_MAX ! Maximum X coordinate of mass points in the physical domain + REAL, INTENT(IN) :: PYHATM_PHYS_MAX ! Minimum Y coordinate of mass points in the physical domain + 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 ! @@ -185,39 +313,39 @@ SUBROUTINE STATION_POSITION( TPSTATION, PXHAT_GLOB, PYHAT_GLOB, PXHATM, PYHATM, CALL GET_INDICE_ll( IIB, IJB, IIE, IJE ) - IF ( TPSTATION%XX >= PXHAT_GLOB(JPHEXT+1) .AND. TPSTATION%XX <= PXHAT_GLOB(UBOUND(PXHAT_GLOB,1)-JPHEXT+1) & - .AND. TPSTATION%XY >= PYHAT_GLOB(JPHEXT+1) .AND. TPSTATION%XY <= PYHAT_GLOB(UBOUND(PYHAT_GLOB,1)-JPHEXT+1) ) THEN + IF ( TPSTATPROF%XX >= PXHAT_GLOB(JPHEXT+1) .AND. TPSTATPROF%XX <= PXHAT_GLOB(UBOUND(PXHAT_GLOB,1)-JPHEXT+1) & + .AND. TPSTATPROF%XY >= PYHAT_GLOB(JPHEXT+1) .AND. TPSTATPROF%XY <= PYHAT_GLOB(UBOUND(PYHAT_GLOB,1)-JPHEXT+1) ) THEN OINSIDE = .TRUE. ELSE CALL GET_MODEL_NUMBER_ll(IMI) - WRITE( CMNHMSG(1), "( 'station ', A, ' is outside of physical domain of model', I3 )" ) TRIM(TPSTATION%CNAME), IMI - CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'STATION_POSITION' ) + 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 - TPSTATION%NI_U = COUNT( XXHAT (:) <= TPSTATION%XX ) - TPSTATION%NI_M = COUNT( PXHATM(:) <= TPSTATION%XX ) + TPSTATPROF%NI_U = COUNT( XXHAT (:) <= TPSTATPROF%XX ) + TPSTATPROF%NI_M = COUNT( PXHATM(:) <= TPSTATPROF%XX ) ! Y position - TPSTATION%NJ_V = COUNT( XYHAT (:) <= TPSTATION%XY ) - TPSTATION%NJ_M = COUNT( PYHATM(:) <= TPSTATION%XY ) + TPSTATPROF%NJ_V = COUNT( XYHAT (:) <= TPSTATPROF%XY ) + TPSTATPROF%NJ_M = COUNT( PYHATM(:) <= TPSTATPROF%XY ) - ! Position of station according to process - IF ( TPSTATION%NI_U >= IIB .AND. TPSTATION%NI_U <= IIE & - .AND. TPSTATION%NJ_V >= IJB .AND. TPSTATION%NJ_V <= IJE ) OPRESENT = .TRUE. + ! 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 is too near of physical domain border (outside of physical domain for mass points) + ! 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 ( TPSTATION%XX < PXHATM_PHYS_MIN .OR. TPSTATION%XX > PXHATM_PHYS_MAX & - .OR. TPSTATION%XY < PYHATM_PHYS_MIN .OR. TPSTATION%XY > PYHATM_PHYS_MAX ) THEN + IF ( TPSTATPROF%XX < PXHATM_PHYS_MIN .OR. TPSTATPROF%XX > PXHATM_PHYS_MAX & + .OR. TPSTATPROF%XY < PYHATM_PHYS_MIN .OR. TPSTATPROF%XY > PYHATM_PHYS_MAX ) THEN CALL GET_MODEL_NUMBER_ll(IMI) - WRITE( CMNHMSG(1), "( 'station ', A, ' is outside of mass-points physical domain of model', I3 )" ) & - TRIM(TPSTATION%CNAME), 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 is too close to the boundaries of physical domain.' - CMNHMSG(4) = '=> station disabled (not computed)' - CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'STATION_POSITION' ) + 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 @@ -226,29 +354,83 @@ SUBROUTINE STATION_POSITION( TPSTATION, PXHAT_GLOB, PYHAT_GLOB, PXHATM, PYHATM, ! Computations only on correct process IF ( OPRESENT .AND. .NOT. L1D ) THEN ! Interpolation coefficient for X (mass-point) - TPSTATION%XXMCOEF = ( TPSTATION%XX - PXHATM(TPSTATION%NI_M) ) / ( PXHATM(TPSTATION%NI_M+1) - PXHATM(TPSTATION%NI_M) ) + TPSTATPROF%XXMCOEF = ( TPSTATPROF%XX - PXHATM(TPSTATPROF%NI_M) ) / ( PXHATM(TPSTATPROF%NI_M+1) - PXHATM(TPSTATPROF%NI_M) ) ! Interpolation coefficient for Y (mass-point) - TPSTATION%XYMCOEF = ( TPSTATION%XY - PYHATM(TPSTATION%NJ_M) ) / ( PYHATM(TPSTATION%NJ_M+1) - PYHATM(TPSTATION%NJ_M) ) + TPSTATPROF%XYMCOEF = ( TPSTATPROF%XY - PYHATM(TPSTATPROF%NJ_M) ) / ( PYHATM(TPSTATPROF%NJ_M+1) - PYHATM(TPSTATPROF%NJ_M) ) ! Interpolation coefficient for X (U-point) - TPSTATION%XXUCOEF = ( TPSTATION%XX - XXHAT(TPSTATION%NI_U) ) / ( XXHAT(TPSTATION%NI_U+1) - XXHAT(TPSTATION%NI_U) ) + TPSTATPROF%XXUCOEF = ( TPSTATPROF%XX - XXHAT(TPSTATPROF%NI_U) ) / ( XXHAT(TPSTATPROF%NI_U+1) - XXHAT(TPSTATPROF%NI_U) ) ! Interpolation coefficient for Y (V-point) - TPSTATION%XYVCOEF = ( TPSTATION%XY - XYHAT(TPSTATION%NJ_V) ) / ( XYHAT(TPSTATION%NJ_V+1) - XYHAT(TPSTATION%NJ_V) ) + TPSTATPROF%XYVCOEF = ( TPSTATPROF%XY - XYHAT(TPSTATPROF%NJ_V) ) / ( XYHAT(TPSTATPROF%NJ_V+1) - XYHAT(TPSTATPROF%NJ_V) ) END IF IF ( OPRESENT ) THEN - ! The closest K-level to the station altitude is chosen - JK = JPVEXT + 1 - DO WHILE ( ( STATION_INTERP_2D( TPSTATION, XZZ(:,:,JK) ) - STATION_INTERP_2D( TPSTATION, XZZ(:,:,JPVEXT+1) ) ) < TPSTATION%XZ) - JK = JK + 1 - END DO - ZLOW = STATION_INTERP_2D( TPSTATION, XZZ(:,:,JK-1) ) - STATION_INTERP_2D( TPSTATION, XZZ(:,:,JPVEXT+1) ) - ZHIGH = STATION_INTERP_2D( TPSTATION, XZZ(:,:,JK ) ) - STATION_INTERP_2D( TPSTATION, XZZ(:,:,JPVEXT+1) ) - !If the station is nearer from the lower level, select it - IF ( ( ZHIGH - TPSTATION%XZ ) > ( TPSTATION%XZ - ZLOW ) ) JK = JK - 1 - TPSTATION%NK = JK + 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' ) + END SELECT END IF -END SUBROUTINE STATION_POSITION +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 ) @@ -258,7 +440,7 @@ SUBROUTINE STATION_ADD( TPSTATION ) IMPLICIT NONE - TYPE(TSTATIONDATA), INTENT(IN) :: TPSTATION + CLASS(TSTATPROFDATA), INTENT(IN) :: TPSTATION INTEGER :: JS TYPE(TSTATIONDATA), DIMENSION(:), POINTER :: TZSTATIONS @@ -269,23 +451,42 @@ SUBROUTINE STATION_ADD( TPSTATION ) DO JS = 1, NUMBSTAT_LOC - 1 TZSTATIONS(JS) = TSTATIONS(JS) END DO - TZSTATIONS(NUMBSTAT_LOC) = TPSTATION + + !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 STATION_INTERP_2D( TPSTATION, PA ) RESULT( PB ) -! ###################################################### - USE MODD_CONF, ONLY: L1D + +! ######################################################## +FUNCTION STATPROF_INTERP_2D( TPSTATPROF, PA ) RESULT( PB ) +! ######################################################## + USE MODD_CONF, ONLY: L1D + USE MODD_PARAMETERS, ONLY: XUNDEF USE MODE_MSG IMPLICIT NONE - TYPE(TSTATIONDATA), INTENT(IN) :: TPSTATION + CLASS(TSTATPROFDATA), INTENT(IN) :: TPSTATPROF REAL, DIMENSION(:,:), INTENT(IN) :: PA REAL :: PB @@ -298,32 +499,34 @@ FUNCTION STATION_INTERP_2D( TPSTATION, PA ) RESULT( PB ) JI = 2 JJ = 2 ELSE - JI = TPSTATION%NI_M - JJ = TPSTATION%NJ_M + 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.-TPSTATION%XXMCOEF) * (1.-TPSTATION%XYMCOEF) * PA(JI,JJ) + & - ( TPSTATION%XXMCOEF) * (1.-TPSTATION%XYMCOEF) * PA(JI+1,JJ) + & - (1.-TPSTATION%XXMCOEF) * ( TPSTATION%XYMCOEF) * PA(JI,JJ+1) + & - ( TPSTATION%XXMCOEF) * ( TPSTATION%XYMCOEF) * PA(JI+1,JJ+1) + 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', 'STATION_INTERP_2D', 'value can not be interpolated' ) + CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'STATPROF_INTERP_2D', 'value can not be interpolated' ) + PB = XUNDEF END IF -END FUNCTION STATION_INTERP_2D +END FUNCTION STATPROF_INTERP_2D -! ######################################################## -FUNCTION STATION_INTERP_2D_U( TPSTATION, PA ) RESULT( PB ) -! ######################################################## - USE MODD_CONF, ONLY: L1D +! ########################################################## +FUNCTION STATPROF_INTERP_2D_U( TPSTATPROF, PA ) RESULT( PB ) +! ########################################################## + USE MODD_CONF, ONLY: L1D + USE MODD_PARAMETERS, ONLY: XUNDEF USE MODE_MSG IMPLICIT NONE - TYPE(TSTATIONDATA), INTENT(IN) :: TPSTATION + CLASS(TSTATPROFDATA), INTENT(IN) :: TPSTATPROF REAL, DIMENSION(:,:), INTENT(IN) :: PA REAL :: PB @@ -336,32 +539,34 @@ FUNCTION STATION_INTERP_2D_U( TPSTATION, PA ) RESULT( PB ) JI = 2 JJ = 2 ELSE - JI = TPSTATION%NI_U - JJ = TPSTATION%NJ_M + 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.-TPSTATION%XXUCOEF) * (1.-TPSTATION%XYMCOEF) * PA(JI,JJ) + & - ( TPSTATION%XXUCOEF) * (1.-TPSTATION%XYMCOEF) * PA(JI+1,JJ) + & - (1.-TPSTATION%XXUCOEF) * ( TPSTATION%XYMCOEF) * PA(JI,JJ+1) + & - ( TPSTATION%XXUCOEF) * ( TPSTATION%XYMCOEF) * PA(JI+1,JJ+1) + 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', 'STATION_INTERP_2D_U', 'value can not be interpolated' ) + CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'STATPROF_INTERP_2D_U', 'value can not be interpolated' ) + PB = XUNDEF END IF -END FUNCTION STATION_INTERP_2D_U +END FUNCTION STATPROF_INTERP_2D_U -! ######################################################## -FUNCTION STATION_INTERP_2D_V( TPSTATION, PA ) RESULT( PB ) -! ######################################################## - USE MODD_CONF, ONLY: L1D +! ########################################################## +FUNCTION STATPROF_INTERP_2D_V( TPSTATPROF, PA ) RESULT( PB ) +! ########################################################## + USE MODD_CONF, ONLY: L1D + USE MODD_PARAMETERS, ONLY: XUNDEF USE MODE_MSG IMPLICIT NONE - TYPE(TSTATIONDATA), INTENT(IN) :: TPSTATION + CLASS(TSTATPROFDATA), INTENT(IN) :: TPSTATPROF REAL, DIMENSION(:,:), INTENT(IN) :: PA REAL :: PB @@ -374,20 +579,149 @@ FUNCTION STATION_INTERP_2D_V( TPSTATION, PA ) RESULT( PB ) JI = 2 JJ = 2 ELSE - JI = TPSTATION%NI_M - JJ = TPSTATION%NJ_V + 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.-TPSTATION%XXMCOEF) * (1.-TPSTATION%XYVCOEF) * PA(JI,JJ) + & - ( TPSTATION%XXMCOEF) * (1.-TPSTATION%XYVCOEF) * PA(JI+1,JJ) + & - (1.-TPSTATION%XXMCOEF) * ( TPSTATION%XYVCOEF) * PA(JI,JJ+1) + & - ( TPSTATION%XXMCOEF) * ( TPSTATION%XYVCOEF) * PA(JI+1,JJ+1) + 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', 'STATION_INTERP_2D_V', 'value can not be interpolated' ) + CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'STATPROF_INTERP_2D_V', 'value can not be interpolated' ) + PB = XUNDEF END IF -END FUNCTION STATION_INTERP_2D_V +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' ) + 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' ) + 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' ) + PB = XUNDEF + END IF + +END FUNCTION STATPROF_INTERP_3D_V + END MODULE MODE_STATPROF_TOOLS diff --git a/src/MNH/write_profilern.f90 b/src/MNH/write_profilern.f90 index cb9dc945a..e6b744fb9 100644 --- a/src/MNH/write_profilern.f90 +++ b/src/MNH/write_profilern.f90 @@ -19,6 +19,7 @@ ! 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 @@ -40,19 +41,31 @@ 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 ! @@ -65,50 +78,280 @@ 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 * ( 16 + NRR + NSV + NAER ) + 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 + ZPACK(IPOS:IPOS+ISTORE*IKU-1) = RESHAPE( TPROFILERS(IDX)%XVISI(:,:), [ISTORE*IKU] ) ; IPOS = IPOS + ISTORE * IKU + ZPACK(IPOS:IPOS+ISTORE*IKU-1) = RESHAPE( TPROFILERS(IDX)%XVISIKUN(:,:), [ISTORE*IKU] ) ; IPOS = IPOS + ISTORE * IKU + 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 /= IPACKSIZE (sender side)' ) + + 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 + TZPROFILER%XVISI(:,:) = RESHAPE( ZPACK(IPOS:IPOS+ISTORE*IKU-1), [ ISTORE, IKU ] ) ; IPOS = IPOS + ISTORE * IKU + TZPROFILER%XVISIKUN(:,:) = RESHAPE( ZPACK(IPOS:IPOS+ISTORE*IKU-1), [ ISTORE, IKU ] ) ; IPOS = IPOS + ISTORE * IKU + 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 /= IPACKSIZE (receiver side)' ) + 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: LDUST, NMODE_DST USE MODD_CH_AEROSOL, ONLY: LORILAM, JPMODE +USE MODD_CONF_n, ONLY: NRR USE MODD_CST, ONLY: XRV +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, & 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 -USE MODD_PARAMETERS, ONLY: XUNDEF -USE MODD_PARAM_n, ONLY: CRAD -USE MODD_PROFILER_n, ONLY: tprofiler +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_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=NMNHNAMELGTMAX) :: yname character(len=NUNITLGTMAX) :: yunits -CHARACTER(LEN=:), allocatable :: YGROUP ! group title INTEGER :: IKU INTEGER :: IPROC ! number of variables records INTEGER :: JPROC @@ -116,122 +359,119 @@ integer :: jproc_alt, jproc_w INTEGER :: JRR ! loop counter INTEGER :: JSV ! loop counter integer :: ji -integer :: irr !Number of moist variables +INTEGER :: ISTORE REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRHO -REAL, DIMENSION(:,:,:), TARGET, ALLOCATABLE :: ZWORK -REAL, DIMENSION(:,:,:), POINTER :: ZDATA +REAL, DIMENSION(:,:), TARGET, ALLOCATABLE :: ZWORK +REAL, DIMENSION(:,:), POINTER :: ZDATA 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 ZDATA => Null() -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 ) +call Add_profile( 'VISI', 'Visibility', 'km', tpprofiler%xvisi ) +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 ) + call Add_profile( 'TKE_DISS', 'TKE dissipation rate', 'm2 s-2', tpprofiler%xtke_diss ) -if ( Size( tprofiler%ciz, 1 ) > 0 ) & - call Add_profile( 'CIT', 'Ice concentration', 'kg-3', tprofiler%ciz ) +if ( ccloud == 'ICE3' .or. ccloud == 'ICE4' ) & + call Add_profile( 'CIT', 'Ice concentration', 'kg-3', tpprofiler%xciz ) -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) ) +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', tprofiler%rhod ) -if ( Size( tprofiler%tke, 1 ) > 0 ) & - call Add_profile( 'Tke', 'Turbulent kinetic energy', 'm2 s-2', tprofiler%tke ) +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 ( Size( tprofiler%sv, 4 ) > 0 ) then +if ( nsv > 0 ) then ! Scalar variables - Allocate( zwork, mold = tprofiler%sv(:,:,:,1) ) + Allocate( zwork, mold = tpprofiler%xsv(:,:,1) ) do jsv = 1, nsv if ( Trim( tsvlist(jsv)%cunits ) == 'ppv' ) then yunits = 'ppb' - zwork = tprofiler%sv(:,:,:,jsv) * 1.e9 !*1e9 for conversion ppv->ppb + zwork = tpprofiler%xsv(:,:,jsv) * 1.e9 !*1e9 for conversion ppv->ppb zdata => zwork else yunits = Trim( tsvlist(jsv)%cunits ) - zdata => tprofiler%sv(:,:,:,jsv) + zwork = tpprofiler%xsv(:,:,jsv) + zdata => zwork end if call Add_profile( tsvlist(jsv)%cmnhname, '', yunits, zdata ) zdata => Null() end do Deallocate( zwork ) - 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)) + 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 @@ -263,32 +503,32 @@ if ( Size( tprofiler%sv, 4 ) > 0 ) then DEALLOCATE (ZSV,ZRHO) DEALLOCATE (ZN0,ZRG,ZSIG) END IF - 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 @@ -323,7 +563,7 @@ if ( Size( tprofiler%sv, 4 ) > 0 ) then 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 @@ -356,12 +596,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' @@ -397,7 +637,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 ) @@ -405,33 +645,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 ) ) @@ -459,12 +699,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' @@ -496,7 +736,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 ) @@ -510,13 +750,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 ) ) @@ -535,7 +775,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) @@ -544,7 +784,6 @@ Deallocate (ccomment) Deallocate (ctitle ) Deallocate (cunit ) - contains @@ -552,23 +791,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 ) 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 @@ -578,22 +817,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_stationn.f90 b/src/MNH/write_stationn.f90 index 7b35ea4c8..4697b0e87 100644 --- a/src/MNH/write_stationn.f90 +++ b/src/MNH/write_stationn.f90 @@ -3,6 +3,17 @@ !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. Tulet 15/02/2002 +! +! 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 ! ########################### @@ -28,43 +39,7 @@ SUBROUTINE WRITE_STATION_n( TPDIAFILE ) ! ##################################### ! ! -!!**** *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 -! 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 -! -------------------------------------------------------------------------- +!**** *WRITE_STATION* - write the stations records in the diachronic file ! !* 0. DECLARATIONS ! ------------ @@ -79,6 +54,7 @@ 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 @@ -100,7 +76,7 @@ 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 :: 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 @@ -222,6 +198,8 @@ STATION: DO JS = 1, INUMSTAT ZPACK(IPOS:IPOS+ISTORE-1) = TSTATIONS(IDX)%XSFCO2; IPOS = IPOS + ISTORE END IF + IF ( IPOS /= IPACKSIZE ) call Print_msg( NVERB_WARNING, 'IO', 'WRITE_STATION_n', 'IPOS /= IPACKSIZE (sender side)' ) + 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 ) @@ -279,6 +257,8 @@ STATION: DO JS = 1, INUMSTAT END IF TZSTATION%XSFCO2 = ZPACK(IPOS:IPOS+ISTORE-1); IPOS = IPOS + ISTORE END IF + + IF ( IPOS /= IPACKSIZE ) call Print_msg( NVERB_WARNING, 'IO', 'WRITE_STATION_n', 'IPOS /= IPACKSIZE (receiver side)' ) END IF END IF -- GitLab From f6894f6a6787fc37e8c099e680492cf3d0ca686a Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Thu, 12 May 2022 10:46:20 +0200 Subject: [PATCH 066/157] Philippe 12/05/2022: stations + profilers: add STATPROF_INSTANT subroutine --- src/MNH/modeln.f90 | 14 ++++++-------- src/MNH/profilern.f90 | 30 +++++++----------------------- src/MNH/stationn.f90 | 26 ++++++-------------------- src/MNH/statprof_tools.f90 | 38 +++++++++++++++++++++++++++++++++++++- 4 files changed, 56 insertions(+), 52 deletions(-) diff --git a/src/MNH/modeln.f90 b/src/MNH/modeln.f90 index c778b2e1e..2582fea44 100644 --- a/src/MNH/modeln.f90 +++ b/src/MNH/modeln.f90 @@ -2116,20 +2116,18 @@ IF (LFLYER) & !* 24.2 STATION (observation diagnostic) ! -------------------------------- ! -IF ( LSTATION ) & - CALL STATION_n(XTSTEP, 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 ) ! !--------------------------------------------------------- ! !* 24.3 PROFILER (observation diagnostic) ! --------------------------------- ! -IF ( LPROFILER ) & - CALL PROFILER_n(XTSTEP, & - XZZ, XRHODREF, & - XUT, XVT, XWT, XTHT, XRT, XSVT, XTKET, XTSRAD, XPABST, & - XAER, XCIT, PSEA=ZSEA(:,:)) +IF ( LPROFILER ) & + CALL PROFILER_n( XZZ, XRHODREF, & + XUT, XVT, XWT, XTHT, XRT, XSVT, XTKET, XTSRAD, XPABST, & + XAER, XCIT, PSEA=ZSEA(:,:) ) ! ! CALL SECOND_MNH2(ZTIME2) diff --git a/src/MNH/profilern.f90 b/src/MNH/profilern.f90 index ccd26a860..a9215eb8e 100644 --- a/src/MNH/profilern.f90 +++ b/src/MNH/profilern.f90 @@ -9,12 +9,10 @@ MODULE MODI_PROFILER_n ! INTERFACE ! - SUBROUTINE PROFILER_n( PTSTEP, & - PZ, PRHODREF, & + 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) :: PZ ! z array REAL, DIMENSION(:,:,:), INTENT(IN) :: PU ! horizontal wind X component REAL, DIMENSION(:,:,:), INTENT(IN) :: PV ! horizontal wind Y component @@ -39,8 +37,7 @@ END INTERFACE END MODULE MODI_PROFILER_n ! ! ######################################################## - SUBROUTINE PROFILER_n( PTSTEP, & - PZ, PRHODREF, & + SUBROUTINE PROFILER_n( PZ, PRHODREF, & PU, PV, PW, PTH, PR, PSV, PTKE, & PTS, PP, PAER, PCIT, PSEA ) ! ######################################################## @@ -120,12 +117,12 @@ USE MODD_RAIN_ICE_DESCR, ONLY: XALPHAR_I => XALPHAR, XNUR_I => XNUR, XLBEXR_I 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_TIME_n, only: tdtcur ! USE MODE_FGAU, ONLY: GAULAG USE MODE_FSCATTER, ONLY: BHMIE, QEPSI, QEPSW, MG, MOMG USE MODE_MSG -USE MODE_STATPROF_TOOLS, ONLY: STATPROF_INTERP_2D, STATPROF_INTERP_3D, STATPROF_INTERP_3D_U, STATPROF_INTERP_3D_V +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_WATER_SUM @@ -137,7 +134,6 @@ IMPLICIT NONE !* 0.1 declarations of arguments ! ! -REAL, INTENT(IN) :: PTSTEP ! time step 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 @@ -249,30 +245,18 @@ IKE = IKU-JPVEXT ! !---------------------------------------------------------------------------- ! -! !* 3.4 instant of storage ! ------------------ ! - -IF ( TPROFILERS_TIME%XTIME_CUR == XUNDEF ) TPROFILERS_TIME%XTIME_CUR = TPROFILERS_TIME%XTSTEP - PTSTEP -! -TPROFILERS_TIME%XTIME_CUR = TPROFILERS_TIME%XTIME_CUR + PTSTEP -! -IF ( TPROFILERS_TIME%XTIME_CUR >= TPROFILERS_TIME%XTSTEP - 1.E-10 ) THEN - TPROFILERS_TIME%XTIME_CUR = TPROFILERS_TIME%XTIME_CUR - TPROFILERS_TIME%XTSTEP - TPROFILERS_TIME%N_CUR = TPROFILERS_TIME%N_CUR + 1 - IN = TPROFILERS_TIME%N_CUR - tprofilers_time%tpdates(in) = tdtcur -ELSE - !No profiler storage at this time step - RETURN -END IF +CALL STATPROF_INSTANT( TPROFILERS_TIME, IN ) +IF ( IN < 1 ) RETURN !No profiler storage at this time step ! !---------------------------------------------------------------------------- ! !* 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) diff --git a/src/MNH/stationn.f90 b/src/MNH/stationn.f90 index b10c060a5..172521e8a 100644 --- a/src/MNH/stationn.f90 +++ b/src/MNH/stationn.f90 @@ -9,11 +9,10 @@ MODULE MODI_STATION_n ! INTERFACE ! - SUBROUTINE STATION_n( PTSTEP, PZ, & + SUBROUTINE STATION_n( PZ, & PU, PV, PW, PTH, PR, PSV, PTKE, & PTS, PP ) ! -REAL, INTENT(IN) :: PTSTEP ! time step 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 @@ -34,7 +33,7 @@ END INTERFACE END MODULE MODI_STATION_n ! ! ####################################################### - SUBROUTINE STATION_n( PTSTEP, PZ, & + SUBROUTINE STATION_n( PZ, & PU, PV, PW, PTH, PR, PSV, PTKE, & PTS, PP ) ! ####################################################### @@ -87,13 +86,12 @@ USE MODD_CONF, ONLY: LCARTESIAN USE MODD_CST, ONLY: XPI USE MODD_DIAG_IN_RUN USE MODD_GRID, ONLY: XBETA, XLON0, XRPK -USE MODD_PARAMETERS, ONLY: JPVEXT, XUNDEF +USE MODD_PARAMETERS, ONLY: JPVEXT USE MODD_PARAM_n, ONLY: CRAD USE MODD_STATION_n USE MODD_ALLSTATION_n, ONLY: LDIAG_SURFRAD -USE MODD_TIME_n, ONLY: tdtcur ! -USE MODE_STATPROF_TOOLS, ONLY: STATPROF_INTERP_2D, STATPROF_INTERP_2D_U, STATPROF_INTERP_2D_V +USE MODE_STATPROF_TOOLS, ONLY: STATPROF_INSTANT, STATPROF_INTERP_2D, STATPROF_INTERP_2D_U, STATPROF_INTERP_2D_V ! ! IMPLICIT NONE @@ -102,7 +100,6 @@ IMPLICIT NONE !* 0.1 declarations of arguments ! ! -REAL, INTENT(IN) :: PTSTEP ! time step 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 @@ -134,19 +131,8 @@ INTEGER :: JK ! loop for levels !* 3.4 instant of storage ! ------------------ ! -IF ( TSTATIONS_TIME%XTIME_CUR == XUNDEF ) TSTATIONS_TIME%XTIME_CUR = TSTATIONS_TIME%XTSTEP - PTSTEP -! -TSTATIONS_TIME%XTIME_CUR = TSTATIONS_TIME%XTIME_CUR + PTSTEP -! -IF ( TSTATIONS_TIME%XTIME_CUR >= TSTATIONS_TIME%XTSTEP - 1.E-10 ) THEN - TSTATIONS_TIME%XTIME_CUR = TSTATIONS_TIME%XTIME_CUR - TSTATIONS_TIME%XTSTEP - TSTATIONS_TIME%N_CUR = TSTATIONS_TIME%N_CUR + 1 - IN = TSTATIONS_TIME%N_CUR - tstations_time%tpdates(in) = tdtcur -ELSE - !No station storage at this time step - RETURN -END IF +CALL STATPROF_INSTANT( TSTATIONS_TIME, IN ) +IF ( IN < 1 ) RETURN !No profiler storage at this time step ! !---------------------------------------------------------------------------- ! diff --git a/src/MNH/statprof_tools.f90 b/src/MNH/statprof_tools.f90 index ca8ff988c..3c19593bb 100644 --- a/src/MNH/statprof_tools.f90 +++ b/src/MNH/statprof_tools.f90 @@ -13,7 +13,7 @@ MODULE MODE_STATPROF_TOOLS ! ################### -USE MODD_TYPE_STATPROF, ONLY: TPROFILERDATA, TSTATIONDATA, TSTATPROFDATA +USE MODD_TYPE_STATPROF, ONLY: TPROFILERDATA, TSTATIONDATA, TSTATPROFDATA, TSTATPROFTIME IMPLICIT NONE @@ -25,6 +25,7 @@ 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 @@ -723,5 +724,40 @@ FUNCTION STATPROF_INTERP_3D_V( TPSTATPROF, PA ) RESULT( PB ) END FUNCTION STATPROF_INTERP_3D_V +! ################################################# +SUBROUTINE STATPROF_INSTANT( TPSTATPROF_TIME, KIN ) +! ################################################# + USE MODD_DYN_n, ONLY: XTSTEP + USE MODD_PARAMETERS, ONLY: XUNDEF + USE MODD_TIME_n, ONLY: TDTCUR + + USE MODE_MSG + + IMPLICIT NONE + + TYPE(TSTATPROFTIME), INTENT(INOUT) :: TPSTATPROF_TIME + INTEGER, INTENT(OUT) :: KIN ! Current step of storage + + IF ( TPSTATPROF_TIME%XTIME_CUR == XUNDEF ) TPSTATPROF_TIME%XTIME_CUR = TPSTATPROF_TIME%XTSTEP - XTSTEP + + TPSTATPROF_TIME%XTIME_CUR = TPSTATPROF_TIME%XTIME_CUR + XTSTEP + + IF ( TPSTATPROF_TIME%XTIME_CUR >= TPSTATPROF_TIME%XTSTEP - 1.E-10 ) THEN + TPSTATPROF_TIME%XTIME_CUR = TPSTATPROF_TIME%XTIME_CUR - TPSTATPROF_TIME%XTSTEP + 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 SUBROUTINE STATPROF_INSTANT END MODULE MODE_STATPROF_TOOLS -- GitLab From b9ffcc237db822608eb47095b94380d758c5d92e Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Thu, 12 May 2022 10:47:41 +0200 Subject: [PATCH 067/157] Philippe 12/05/2022: write_profilern: remove ZDATA array (not useful anymore) --- src/MNH/write_profilern.f90 | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/src/MNH/write_profilern.f90 b/src/MNH/write_profilern.f90 index e6b744fb9..ccb4fdcd2 100644 --- a/src/MNH/write_profilern.f90 +++ b/src/MNH/write_profilern.f90 @@ -361,16 +361,13 @@ INTEGER :: JSV ! loop counter integer :: ji INTEGER :: ISTORE REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRHO -REAL, DIMENSION(:,:), TARGET, ALLOCATABLE :: ZWORK -REAL, DIMENSION(:,:), POINTER :: ZDATA +REAL, DIMENSION(:,:), ALLOCATABLE :: ZWORK REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZSV, ZN0, ZSIG, ZRG type(tbudiachrometadata) :: tzbudiachro type(tfieldmetadata_base), dimension(:), allocatable :: tzfields ! !---------------------------------------------------------------------------- -ZDATA => Null() - 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 @@ -435,14 +432,11 @@ if ( nsv > 0 ) then if ( Trim( tsvlist(jsv)%cunits ) == 'ppv' ) then yunits = 'ppb' zwork = tpprofiler%xsv(:,:,jsv) * 1.e9 !*1e9 for conversion ppv->ppb - zdata => zwork else yunits = Trim( tsvlist(jsv)%cunits ) zwork = tpprofiler%xsv(:,:,jsv) - zdata => zwork end if - call Add_profile( tsvlist(jsv)%cmnhname, '', yunits, zdata ) - zdata => Null() + call Add_profile( tsvlist(jsv)%cmnhname, '', yunits, zwork ) end do Deallocate( zwork ) -- GitLab From 40cf41ee41a81b9ab7e2897a178af97bcdd62f10 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Fri, 13 May 2022 15:38:46 +0200 Subject: [PATCH 068/157] Philippe 13/05/2022: flyers: use same data structure for time management as for stations and profilers --- src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 | 2 +- src/MNH/aircraft_balloon_evol.f90 | 26 ++---------- src/MNH/ini_aircraft.f90 | 20 ++++----- src/MNH/ini_aircraft_balloon.f90 | 16 +++---- src/MNH/ini_balloon.f90 | 16 +++---- src/MNH/modd_aircraft_balloon.f90 | 10 ++--- src/MNH/modd_type_statprof.f90 | 2 +- src/MNH/write_aircraft_balloon.f90 | 47 +++++++++++---------- 8 files changed, 60 insertions(+), 79 deletions(-) diff --git a/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 b/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 index c554d7da1..1cb861234 100644 --- a/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 +++ b/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 @@ -2339,7 +2339,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 ) diff --git a/src/MNH/aircraft_balloon_evol.f90 b/src/MNH/aircraft_balloon_evol.f90 index 9642bcc4e..bc55a8fa8 100644 --- a/src/MNH/aircraft_balloon_evol.f90 +++ b/src/MNH/aircraft_balloon_evol.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. @@ -176,6 +176,7 @@ USE MODE_FSCATTER, ONLY: QEPSW,QEPSI,BHMIE,MOMG,MG USE MODE_GRIDPROJ USE MODE_ll USE MODE_MSG +USE MODE_STATPROF_TOOLS, ONLY: STATPROF_INSTANT ! USE MODI_GAMMA, ONLY: GAMMA USE MODI_WATER_SUM @@ -485,27 +486,8 @@ 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 +CALL STATPROF_INSTANT( TPFLYER%TFLYER_TIME, IN ) +IF ( IN > 0 ) GSTORE = .TRUE. ! else no profiler storage at this time step ! IF ( TPFLYER%FLY) THEN ! diff --git a/src/MNH/ini_aircraft.f90 b/src/MNH/ini_aircraft.f90 index 2df936301..254889818 100644 --- a/src/MNH/ini_aircraft.f90 +++ b/src/MNH/ini_aircraft.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2000-2020 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. @@ -127,7 +127,7 @@ TAIRCRAFT1%TITLE = 'DIMO19A' ! !* time step for storage ! -TAIRCRAFT1%STEP = 60. +TAIRCRAFT1%TFLYER_TIME%XTSTEP = 60. ! !* take-off date and time ! @@ -357,7 +357,7 @@ TAIRCRAFT2%TITLE = 'DIMO19B' ! !* time step for storage ! -TAIRCRAFT2%STEP = 60. +TAIRCRAFT2%TFLYER_TIME%XTSTEP = 60. ! !* take-off date and time ! @@ -616,7 +616,7 @@ TAIRCRAFT3%TITLE = 'SAAL19A' ! !* time step for storage ! -TAIRCRAFT3%STEP = 30. +TAIRCRAFT3%TFLYER_TIME%XTSTEP = 30. ! !* take-off date and time ! @@ -723,7 +723,7 @@ TAIRCRAFT4%TITLE = 'SAAL19B' ! !* time step for storage ! -TAIRCRAFT4%STEP = 30. +TAIRCRAFT4%TFLYER_TIME%XTSTEP = 30. ! !* take-off date and time ! @@ -829,7 +829,7 @@ TAIRCRAFT5%TITLE = 'SAIB19A' ! !* time step for storage ! -TAIRCRAFT5%STEP = 30. +TAIRCRAFT5%TFLYER_TIME%XTSTEP = 30. ! !* take-off date and time ! @@ -1073,7 +1073,7 @@ TAIRCRAFT6%TITLE = 'SAIB19B' ! !* time step for storage ! -TAIRCRAFT6%STEP = 30. +TAIRCRAFT6%TFLYER_TIME%XTSTEP = 30. ! !* take-off date and time ! @@ -1314,7 +1314,7 @@ TAIRCRAFT7%TITLE = 'TEST_19' ! !* time step for storage ! -TAIRCRAFT7%STEP = 60. +TAIRCRAFT7%TFLYER_TIME%XTSTEP = 60. ! !* take-off date and time ! @@ -1585,7 +1585,7 @@ TAIRCRAFT8%TITLE = 'DIMO22B' ! !* time step for storage ! -TAIRCRAFT8%STEP = 60. +TAIRCRAFT8%TFLYER_TIME%XTSTEP = 60. ! !* take-off date and time ! @@ -1859,7 +1859,7 @@ TAIRCRAFT9%TITLE = 'DIMO23A' ! !* time step for storage ! -TAIRCRAFT9%STEP = 60. +TAIRCRAFT9%TFLYER_TIME%XTSTEP = 60. ! !* take-off date and time ! diff --git a/src/MNH/ini_aircraft_balloon.f90 b/src/MNH/ini_aircraft_balloon.f90 index 72f52303a..58803387b 100644 --- a/src/MNH/ini_aircraft_balloon.f90 +++ b/src/MNH/ini_aircraft_balloon.f90 @@ -317,9 +317,7 @@ TPFLYER%LAUNCH = TPDTSEG TPFLYER%CRASH = .FALSE. TPFLYER%FLY = .FALSE. ! -TPFLYER%T_CUR = XUNDEF -TPFLYER%N_CUR = 0 -TPFLYER%STEP = 60. ! s +TPFLYER%TFLYER_TIME%XTSTEP = 60. ! s ! TPFLYER%LAT = XUNDEF TPFLYER%LON = XUNDEF @@ -358,9 +356,9 @@ 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 + ISTORE = INT ( NTIME_AIRCRAFT_BALLOON / TPFLYER%TFLYER_TIME%XTSTEP ) + 1 ELSE - ISTORE = NINT ( ( PSEGLEN - DYN_MODEL(1)%XTSTEP ) / TPFLYER%STEP ) + 1 + ISTORE = NINT ( ( PSEGLEN - DYN_MODEL(1)%XTSTEP ) / TPFLYER%TFLYER_TIME%XTSTEP ) + 1 ENDIF ! IF (TPFLYER%NMODEL == 0) ISTORE=0 @@ -369,7 +367,7 @@ IF (TPFLYER%NMODEL > 0) THEN ENDIF ! ! -allocate( tpflyer%tpdates(istore) ) +allocate( tpflyer%tflyer_time%tpdates(istore) ) ALLOCATE(TPFLYER%X (ISTORE)) ALLOCATE(TPFLYER%Y (ISTORE)) ALLOCATE(TPFLYER%Z (ISTORE)) @@ -558,7 +556,7 @@ IF ( CPROGRAM == 'MESONH' .OR. CPROGRAM == 'SPAWN ' .OR. CPROGRAM == 'REAL ' ) " Lat=",ZLAT," Lon=",ZLON," Rho=",TPFLYER%RHO END IF ! - TPFLYER%STEP = MAX ( PTSTEP, TPFLYER%STEP ) + TPFLYER%TFLYER_TIME%XTSTEP = MAX ( PTSTEP, TPFLYER%TFLYER_TIME%XTSTEP ) END IF ! ELSE IF (CPROGRAM == 'DIAG ' ) THEN @@ -579,7 +577,7 @@ ELSE IF (CPROGRAM == 'DIAG ' ) THEN " Lat=",ZLAT," Lon=",ZLON," Alt=",TPFLYER%Z_CUR END IF ! - TPFLYER%STEP = MAX (XSTEP_AIRCRAFT_BALLOON , TPFLYER%STEP ) + TPFLYER%TFLYER_TIME%XTSTEP = MAX (XSTEP_AIRCRAFT_BALLOON , TPFLYER%TFLYER_TIME%XTSTEP ) END IF END IF ! @@ -611,7 +609,7 @@ IF ( IMI /= TPFLYER%NMODEL ) RETURN ! LFLYER=.TRUE. ! -TPFLYER%STEP = MAX ( PTSTEP, TPFLYER%STEP ) +TPFLYER%TFLYER_TIME%XTSTEP = MAX ( PTSTEP, TPFLYER%TFLYER_TIME%XTSTEP ) ! IF (TPFLYER%SEG==0) THEN WRITE(ILUOUT,*) 'Error in aircraft flight path (aircraft number ',KNBR,' )' diff --git a/src/MNH/ini_balloon.f90 b/src/MNH/ini_balloon.f90 index 71e935021..5c0095d21 100644 --- a/src/MNH/ini_balloon.f90 +++ b/src/MNH/ini_balloon.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2000-2020 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. @@ -152,7 +152,7 @@ TBALLOON1%PRES = 98450. ! !* time step for data storage (s) ! -TBALLOON1%STEP = 20. +TBALLOON1%TFLYER_TIME%XTSTEP = 20. ! !* ascentional vertical speed of the ballon (in calm air) (for 'RADIOS') ! @@ -207,7 +207,7 @@ TBALLOON2%PRES = 98490. ! !* time step for data storage (s) ! -TBALLOON2%STEP = 20. +TBALLOON2%TFLYER_TIME%XTSTEP = 20. ! !* ascentional vertical speed of the ballon (in calm air) (for 'RADIOS') ! @@ -263,7 +263,7 @@ TBALLOON3%ALT = 865. ! !* time step for data storage (s) ! -TBALLOON3%STEP = 20. +TBALLOON3%TFLYER_TIME%XTSTEP = 20. ! !* ascentional vertical speed of the ballon (in calm air) (for 'RADIOS') ! @@ -319,7 +319,7 @@ TBALLOON4%ALT = 3959. ! !* time step for data storage (s) ! -TBALLOON4%STEP = 20. +TBALLOON4%TFLYER_TIME%XTSTEP = 20. ! !* ascentional vertical speed of the ballon (in calm air) (for 'RADIOS') ! @@ -374,7 +374,7 @@ TBALLOON5%ALT = 340. ! !* time step for data storage (s) ! -TBALLOON5%STEP = 20. +TBALLOON5%TFLYER_TIME%XTSTEP = 20. ! !* ascentional vertical speed of the ballon (in calm air) (for 'RADIOS') ! @@ -429,7 +429,7 @@ TBALLOON6%LON = 8.646 ! !* time step for data storage (s) ! -TBALLOON6%STEP = 20. +TBALLOON6%TFLYER_TIME%XTSTEP = 20. ! !* ascentional vertical speed of the ballon (in calm air) (for 'RADIOS') ! @@ -484,7 +484,7 @@ TBALLOON7%PRES = 62360. ! !* time step for data storage (s) ! -TBALLOON7%STEP = 20. +TBALLOON7%TFLYER_TIME%XTSTEP = 20. ! !* ascentional vertical speed of the ballon (in calm air) (for 'RADIOS') ! diff --git a/src/MNH/modd_aircraft_balloon.f90 b/src/MNH/modd_aircraft_balloon.f90 index 33d6f973f..e3c30efca 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-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. @@ -40,7 +40,8 @@ ! ------------ ! ! -use modd_type_date, only: date_time +USE MODD_TYPE_STATPROF, ONLY: TSTATPROFTIME +use modd_type_date, only: date_time implicit none @@ -66,9 +67,7 @@ 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 +TYPE(TSTATPROFTIME) :: TFLYER_TIME ! Time management for flyer ! !* balloon dynamical characteristics ! @@ -112,7 +111,6 @@ REAL :: P_CUR ! current p (if 'AIRCRA' and 'ALTDEF' ! !* 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) diff --git a/src/MNH/modd_type_statprof.f90 b/src/MNH/modd_type_statprof.f90 index c456ae947..a95c1e11c 100644 --- a/src/MNH/modd_type_statprof.f90 +++ b/src/MNH/modd_type_statprof.f90 @@ -48,7 +48,7 @@ public :: TPROFILERDATA, TSTATIONDATA, TSTATPROFDATA TYPE :: TSTATPROFTIME REAL :: XTIME_CUR = XUNDEF ! current time since last storage - INTEGER :: N_CUR = 0 ! current step of storage + 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 diff --git a/src/MNH/write_aircraft_balloon.f90 b/src/MNH/write_aircraft_balloon.f90 index f957e9f77..e9a4ab409 100644 --- a/src/MNH/write_aircraft_balloon.f90 +++ b/src/MNH/write_aircraft_balloon.f90 @@ -192,6 +192,7 @@ 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 :: JRR ! loop counter @@ -225,12 +226,14 @@ 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)) +ISTORE = SIZE( TPFLYER%TFLYER_TIME%TPDATES ) + +ALLOCATE (ZWORK6(1,1,1,ISTORE,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 (ZWORKZ6(1,1,IKU,ISTORE,1,IPROCZ)) ALLOCATE (YCOMMENTZ(IPROCZ)) ALLOCATE (YTITLEZ (IPROCZ)) ALLOCATE (YUNITZ (IPROCZ)) @@ -330,7 +333,7 @@ END DO ! !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))) +ALLOCATE (ZRHO(1,1,ISTORE)) IF (SIZE(TPFLYER%R,2) >1) THEN !cloud water is present ZRHO(1,1,:) = 0. DO JRR=1,SIZE(TPFLYER%R,2) @@ -338,7 +341,7 @@ IF (SIZE(TPFLYER%R,2) >1) THEN !cloud water is present ENDDO ZRHO(1,1,:) = TPFLYER%TH(:) * ( 1. + XRV/XRD*TPFLYER%R(:,1) ) & / ( 1. + ZRHO(1,1,:) ) - DO JPT=1,size(tpflyer%tpdates) + DO JPT=1,ISTORE IF (TPFLYER%P(JPT) == 0.) THEN ZRHO(1,1,JPT) = 0. ELSE @@ -408,12 +411,12 @@ IF (SIZE(TPFLYER%SV,2)>=1) THEN 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)) + 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%SV(:,NSV_AERBEG:NSV_AEREND) IF (SIZE(TPFLYER%R,2) >0) THEN ZRHO(1,1,:) = 0. @@ -431,7 +434,7 @@ IF (SIZE(TPFLYER%SV,2)>=1) THEN 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 @@ -566,11 +569,11 @@ IF (SIZE(TPFLYER%SV,2)>=1) THEN END IF 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)) + 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%SV(:,NSV_DSTBEG:NSV_DSTEND) IF (SIZE(TPFLYER%R,2) >0) THEN ZRHO(1,1,:) = 0. @@ -723,10 +726,10 @@ DO IK=1, IKU END DO !---------------------------------------------------------------------------- ! -ALLOCATE (ZW6(1,1,1,size(tpflyer%tpdates),1,JPROC)) +ALLOCATE (ZW6(1,1,1,ISTORE,1,JPROC)) ZW6 = ZWORK6(:,:,:,:,:,:JPROC) DEALLOCATE(ZWORK6) -ALLOCATE (ZWZ6(1,1,IKU,size(tpflyer%tpdates),1,JPROCZ)) +ALLOCATE (ZWZ6(1,1,IKU,ISTORE,1,JPROCZ)) ZWZ6 = ZWORKZ6(:,:,:,:,:,:JPROCZ) DEALLOCATE(ZWORKZ6) ! @@ -792,8 +795,8 @@ 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, zw6, & + tpflyer = tpflyer ) deallocate( tzfields ) @@ -864,8 +867,8 @@ 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, zwz6, & + tpflyer = tpflyer ) deallocate( tzfields ) -- GitLab From 4c907030ce65862d734fa6a181c536196a3b6914 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Fri, 20 May 2022 16:21:28 +0200 Subject: [PATCH 069/157] Philippe 20/05/2022: move XLAM_CRAD to modd_cst --- src/MNH/ini_aircraft_balloon.f90 | 1 - src/MNH/modd_aircraft_balloon.f90 | 1 - src/MNH/modd_cst.f90 | 11 +++++++---- src/MNH/profilern.f90 | 3 +-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/MNH/ini_aircraft_balloon.f90 b/src/MNH/ini_aircraft_balloon.f90 index 58803387b..367f70535 100644 --- a/src/MNH/ini_aircraft_balloon.f90 +++ b/src/MNH/ini_aircraft_balloon.f90 @@ -429,7 +429,6 @@ IF (CCLOUD=='LIMA') THEN 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 diff --git a/src/MNH/modd_aircraft_balloon.f90 b/src/MNH/modd_aircraft_balloon.f90 index e3c30efca..cc6b45b24 100644 --- a/src/MNH/modd_aircraft_balloon.f90 +++ b/src/MNH/modd_aircraft_balloon.f90 @@ -146,7 +146,6 @@ 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) ! !------------------------------------------------------------------------------------------- ! diff --git a/src/MNH/modd_cst.f90 b/src/MNH/modd_cst.f90 index 73607888c..e720256f3 100644 --- a/src/MNH/modd_cst.f90 +++ b/src/MNH/modd_cst.f90 @@ -1,10 +1,10 @@ -!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 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 @@ -37,7 +37,8 @@ !! C. Mari 31/10/00 add NDAYSEC !! V. Masson 01/03/03 add conductivity of ice !! J.Escobar : 10/2017 : for real*4 , add XMNH_HUGE_12_LOG -!! J.L. Redelsperger 03/2021 add constants for ocean penetrating solar +! J.L. Redelsperger 03/2021: add constants for ocean penetrating solar +! P. Wautelet 20/05/2022: add RASTA cloud radar wavelength !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -97,6 +98,8 @@ REAL,SAVE :: XD2=23. REAL,SAVE :: XRHOLI ! Volumic mass of liquid water ! INTEGER, SAVE :: NDAYSEC ! Number of seconds in a day + +REAL, PARAMETER :: XLAM_CRAD = 3.154E-3 ! RASTA cloud radar wavelength (m) <=> 95.04 GHz ! ! ! Some machine precision value depending of real4/8 use diff --git a/src/MNH/profilern.f90 b/src/MNH/profilern.f90 index a9215eb8e..5554c6cd2 100644 --- a/src/MNH/profilern.f90 +++ b/src/MNH/profilern.f90 @@ -88,7 +88,7 @@ END MODULE MODI_PROFILER_n !* 0. DECLARATIONS ! ------------ ! -USE MODD_CST, ONLY: XCPD, XG, XLIGHTSPEED, XP00, XPI, XRD, XRHOLW, XRV, XTT +USE MODD_CST, ONLY: XCPD, XG, XLAM_CRAD, XLIGHTSPEED, XP00, XPI, XRD, XRHOLW, XRV, XTT USE MODD_DIAG_IN_RUN USE MODD_GRID, ONLY: XBETA, XLON0, XRPK USE MODD_NSV, ONLY: NSV_C2R2BEG, NSV_C2R2END, NSV_LIMA_NC, NSV_LIMA_NI, NSV_LIMA_NR @@ -235,7 +235,6 @@ 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 ! ------- ! -- GitLab From bcfc3ac960c3af272c7f7765dc41b81c8bc3a922 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Thu, 2 Jun 2022 10:34:15 +0200 Subject: [PATCH 070/157] Philippe 01/06/2022: flyers: replace FLYER type by TAIRCRAFDATA and TBALLOONDATA types --- src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 | 2 +- src/MNH/aircraft_balloon.f90 | 48 +- src/MNH/aircraft_balloon_evol.f90 | 664 ++++++++++---------- src/MNH/ini_aircraft_balloon.f90 | 55 +- src/MNH/modd_aircraft_balloon.f90 | 292 ++++----- src/MNH/write_aircraft_balloon.f90 | 40 +- src/MNH/write_balloonn.f90 | 7 +- src/MNH/write_diachro.f90 | 14 +- 8 files changed, 593 insertions(+), 529 deletions(-) diff --git a/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 b/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 index 1cb861234..8344bffc6 100644 --- a/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 +++ b/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 @@ -2294,7 +2294,7 @@ subroutine Write_flyer_time_coord( tpflyer ) 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 diff --git a/src/MNH/aircraft_balloon.f90 b/src/MNH/aircraft_balloon.f90 index 153d76fe6..7538a4068 100644 --- a/src/MNH/aircraft_balloon.f90 +++ b/src/MNH/aircraft_balloon.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. @@ -42,10 +42,10 @@ REAL, DIMENSION(:,:),INTENT(IN) :: PSEA END SUBROUTINE AIRCRAFT_BALLOON ! SUBROUTINE AIRCRAFT_BALLOON_LONGTYPE_GET( TPFLYER, HLONGTYPE ) - USE MODD_AIRCRAFT_BALLOON, ONLY: FLYER + USE MODD_AIRCRAFT_BALLOON, ONLY: TFLYERDATA - TYPE(FLYER), INTENT(IN) :: TPFLYER - CHARACTER(LEN=*), INTENT(OUT) :: HLONGTYPE + CLASS(TFLYERDATA), INTENT(IN) :: TPFLYER + CHARACTER(LEN=*), INTENT(OUT) :: HLONGTYPE END SUBROUTINE AIRCRAFT_BALLOON_LONGTYPE_GET END INTERFACE @@ -92,6 +92,7 @@ END MODULE MODI_AIRCRAFT_BALLOON !! 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 +! P. Wautelet 06/2022: reorganize flyers ! -------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -347,27 +348,36 @@ 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 -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%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 + + class default + call Print_msg( NVERB_ERROR, 'GEN', 'AIRCRAFT_BALLOON_LONGTYPE_GET', 'unknown class for flyer ' // Trim( tpflyer%title ) ) + ytype = 'Unknown' + +end select if ( Len_trim( ytype ) > Len( HLONGTYPE ) ) & call Print_msg( NVERB_WARNING, 'GEN', 'AIRCRAFT_BALLOON_LONGTYPE_GET', & diff --git a/src/MNH/aircraft_balloon_evol.f90 b/src/MNH/aircraft_balloon_evol.f90 index bc55a8fa8..719d5de2f 100644 --- a/src/MNH/aircraft_balloon_evol.f90 +++ b/src/MNH/aircraft_balloon_evol.f90 @@ -36,7 +36,7 @@ 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 +CLASS(TFLYERDATA), INTENT(INOUT) :: TPFLYER! balloon/aircraft REAL, DIMENSION(:,:), INTENT(IN) :: PSEA ! !------------------------------------------------------------------------------- @@ -127,7 +127,7 @@ END MODULE MODI_AIRCRAFT_BALLOON_EVOL ! -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 !! -------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -206,7 +206,7 @@ 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 +CLASS(TFLYERDATA), INTENT(INOUT) :: TPFLYER! balloon/aircraft REAL, DIMENSION(:,:), INTENT(IN) :: PSEA ! !------------------------------------------------------------------------------- @@ -414,72 +414,82 @@ IF (.NOT. TPFLYER%FLY) THEN ! --------------------------- ! IF (ZTDIST >= - PTSTEP ) THEN - IF (TPFLYER%TYPE=='AIRCRA') THEN + SELECT TYPE ( TPFLYER ) + CLASS IS ( TAIRCRAFTDATA) ! !* 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 + 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. + ! + 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 + + CLASS IS ( TBALLOONDATA) IF (ZTDIST <= PTSTEP ) THEN + TPFLYER%FLY = .TRUE. + GLAUNCH = .TRUE. WRITE(ILUOUT,*) '-------------------------------------------------------------------' - WRITE(ILUOUT,*) 'Aircraft ',TPFLYER%TITLE,' takes off the ', & - TDTCUR%nday,'/',TDTCUR%nmonth,'/', & - TDTCUR%nyear,' at ',NINT(TDTCUR%xtime),' sec.' + WRITE(ILUOUT,*) 'Balloon ',TPFLYER%TITLE,' is launched 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 + END IF + + CLASS DEFAULT + CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'AIRCRAFT_BALLOON_EVOL', 'unknown type for TPFLYER' ) + + END SELECT ! !* 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 - END IF - IF (TPFLYER%TYPE=='AIRCRA') THEN + SELECT TYPE ( TPFLYER ) + CLASS IS ( TBALLOONDATA) + IF (TPFLYER%TYPE=='RADIOS' .OR. TPFLYER%TYPE=='ISODEN' .OR. TPFLYER%TYPE=='CVBALL') THEN + TPFLYER%X_CUR = TPFLYER%XLAUNCH + TPFLYER%Y_CUR = TPFLYER%YLAUNCH + END IF + + CLASS IS ( TAIRCRAFTDATA) ! ! !* 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) - END IF -! - END IF + 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) + END IF + END SELECT END IF END IF ! @@ -622,131 +632,131 @@ IF ( TPFLYER%FLY) THEN ! -------------------------- ! IF (GLAUNCH) THEN + SELECT TYPE ( TPFLYER ) + CLASS IS ( TBALLOONDATA) + SELECT CASE ( TPFLYER%TYPE ) ! !* 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 + CASE ( 'ISODEN' ) + 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 + CMNHMSG(1) = 'Error in balloon initial position (balloon ' // TRIM(TPFLYER%TITLE) // ' )' + 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' ) + 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 - -!* 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 + CASE ( 'RADIOS' ) + 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) ) ! !* 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) ) + CASE ( 'CVBALL' ) + 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 SELECT +! +!* 5.2.3 Aircraft +! + CLASS IS ( TAIRCRAFTDATA) + IF (TPFLYER%ALTDEF) THEN + TPFLYER%P_CUR = (1.-ZSEG_FRAC) * TPFLYER%SEGP(IL ) & + + ZSEG_FRAC * TPFLYER%SEGP(IL+1) 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) + TPFLYER%Z_CUR = (1.-ZSEG_FRAC) * TPFLYER%SEGZ(IL ) & + + ZSEG_FRAC * TPFLYER%SEGZ(IL +1 ) END IF - END IF - END IF + END SELECT END IF ! ! @@ -754,30 +764,35 @@ IF ( TPFLYER%FLY) THEN !* 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 - END IF + SELECT TYPE ( TPFLYER ) + CLASS IS ( TBALLOONDATA) + 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) + END IF + + CLASS IS ( TAIRCRAFTDATA) + 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 + END SELECT + IK00 = MAX ( IK00, IKB ) IK01 = MAX ( IK01, IKB ) IK10 = MAX ( IK10, IKB ) @@ -808,13 +823,16 @@ IF ( TPFLYER%FLY) THEN TDTCUR%nyear,' at ',TDTCUR%xtime,' sec.' 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 + SELECT TYPE ( TPFLYER ) + CLASS IS ( TAIRCRAFTDATA) + IF ( .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 ! !---------------------------------------------------------------------------- IF (ZTHIS_PROC>0.) THEN @@ -840,32 +858,36 @@ IF ( TPFLYER%FLY) THEN !* 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 + SELECT TYPE ( TPFLYER ) + CLASS IS ( TBALLOONDATA) + 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) ) + END IF + + CLASS IS ( TAIRCRAFTDATA) + 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 SELECT ! !---------------------------------------------------------------------------- ! @@ -1273,49 +1295,52 @@ IF ( TPFLYER%FLY) THEN !* 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)) - END IF - END IF + SELECT TYPE ( TPFLYER ) + CLASS IS ( TBALLOONDATA) + 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)) + END IF + END IF + END SELECT ! !---------------------------------------------------------------------------- END IF @@ -1324,53 +1349,53 @@ IF ( TPFLYER%FLY) THEN !* 10. AIRCRAFT MOVE (computations done on all processors, to limit exchanges) ! ------------- ! - IF (TPFLYER%TYPE=='AIRCRA') THEN + SELECT TYPE ( TPFLYER ) + CLASS IS ( TAIRCRAFTDATA ) ! ! !* 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. + 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 IF - ! - END IF + 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 IF + END SELECT ! END IF ! @@ -1388,20 +1413,25 @@ 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 + +SELECT TYPE ( TPFLYER ) + CLASS IS ( TBALLOONDATA ) + IF (TPFLYER%TYPE=='CVBALL') THEN + CALL DISTRIBUTE_FLYER(TPFLYER%Z_CUR) + CALL DISTRIBUTE_FLYER(TPFLYER%WASCENT) + ELSE IF (TPFLYER%TYPE=='RADIOS') THEN + CALL DISTRIBUTE_FLYER(TPFLYER%Z_CUR) + ELSE IF (TPFLYER%TYPE=='ISODEN' ) THEN + CALL DISTRIBUTE_FLYER(TPFLYER%RHO) + END IF + + CLASS IS ( TAIRCRAFTDATA ) + IF (TPFLYER%ALTDEF) THEN + CALL DISTRIBUTE_FLYER(TPFLYER%P_CUR) + ELSE + CALL DISTRIBUTE_FLYER(TPFLYER%Z_CUR) + ENDIF +END SELECT ! !* 11.2 data stored ! ----------- diff --git a/src/MNH/ini_aircraft_balloon.f90 b/src/MNH/ini_aircraft_balloon.f90 index 367f70535..ba176c69a 100644 --- a/src/MNH/ini_aircraft_balloon.f90 +++ b/src/MNH/ini_aircraft_balloon.f90 @@ -5,6 +5,7 @@ !----------------------------------------------------------------- ! Modifications: ! P. Wautelet 01/10/2020: bugfix: DEFAULT_FLYER: add missing default values +! P. Wautelet 06/2022: reorganize flyers !----------------------------------------------------------------- ! ######################### @@ -306,7 +307,7 @@ CONTAINS !---------------------------------------------------------------------------- SUBROUTINE DEFAULT_FLYER(TPFLYER) ! -TYPE(FLYER), INTENT(OUT) :: TPFLYER +CLASS(TFLYERDATA), INTENT(OUT) :: TPFLYER ! ! TPFLYER%NMODEL = 0 @@ -319,25 +320,29 @@ TPFLYER%FLY = .FALSE. ! TPFLYER%TFLYER_TIME%XTSTEP = 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. +SELECT TYPE ( TPFLYER ) + CLASS IS ( TAIRCRAFTDATA ) + TPFLYER%SEG = 0 + TPFLYER%SEGCURN = 1 + TPFLYER%SEGCURT = 0. + TPFLYER%ALTDEF = .FALSE. + + CLASS IS ( TBALLOONDATA ) + 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 + +END SELECT ! TPFLYER%X_CUR = XUNDEF TPFLYER%Y_CUR = XUNDEF @@ -350,7 +355,7 @@ END SUBROUTINE DEFAULT_FLYER SUBROUTINE ALLOCATE_FLYER(TPFLYER) ! ! -TYPE(FLYER), INTENT(INOUT) :: TPFLYER +CLASS(TFLYERDATA), INTENT(INOUT) :: TPFLYER ! IF (TPFLYER%NMODEL > NMODEL) TPFLYER%NMODEL=0 IF (IMI /= TPFLYER%NMODEL .AND. .NOT. (IMI==1 .AND. TPFLYER%NMODEL==0) ) RETURN @@ -448,8 +453,8 @@ SUBROUTINE INI_LAUNCH(KNBR,TPFLYER) ! use MODE_IO_FIELD_READ, only: IO_Field_read ! -INTEGER, INTENT(IN) :: KNBR -TYPE(FLYER), INTENT(INOUT) :: TPFLYER +INTEGER, INTENT(IN) :: KNBR +CLASS(TBALLOONDATA), INTENT(INOUT) :: TPFLYER ! ! ! @@ -599,8 +604,8 @@ END SUBROUTINE INI_LAUNCH !---------------------------------------------------------------------------- SUBROUTINE INI_FLIGHT(KNBR,TPFLYER) ! -INTEGER, INTENT(IN) :: KNBR -TYPE(FLYER), INTENT(INOUT) :: TPFLYER +INTEGER, INTENT(IN) :: KNBR +CLASS(TAIRCRAFTDATA), INTENT(INOUT) :: TPFLYER ! IF (TPFLYER%MODEL == 'MOB' .AND. TPFLYER%NMODEL /= 0) TPFLYER%NMODEL=1 IF (TPFLYER%NMODEL > NMODEL) TPFLYER%NMODEL=0 diff --git a/src/MNH/modd_aircraft_balloon.f90 b/src/MNH/modd_aircraft_balloon.f90 index cc6b45b24..eb35a5c24 100644 --- a/src/MNH/modd_aircraft_balloon.f90 +++ b/src/MNH/modd_aircraft_balloon.f90 @@ -34,6 +34,7 @@ !! 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 @@ -45,151 +46,156 @@ use modd_type_date, only: date_time 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 -! -TYPE(TSTATPROFTIME) :: TFLYER_TIME ! Time management for flyer -! -!* 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 -! -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 -! !------------------------------------------------------------------------------------------- ! 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 -! +TYPE :: TFLYERDATA + ! + !* 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 + ! + TYPE(TSTATPROFTIME) :: TFLYER_TIME ! Time management for flyer + ! + !* 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 + ! + 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 TFLYERDATA + +TYPE, EXTENDS( TFLYERDATA ) :: TAIRCRAFTDATA + ! + !* 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 +END TYPE TAIRCRAFTDATA + +TYPE, EXTENDS( TFLYERDATA ) :: TBALLOONDATA + ! + !* 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') +END TYPE TBALLOONDATA + +TYPE(TBALLOONDATA) :: TBALLOON1 ! characteristics and records of a balloon +TYPE(TBALLOONDATA) :: TBALLOON2 ! characteristics and records of a balloon +TYPE(TBALLOONDATA) :: TBALLOON3 ! characteristics and records of a balloon +TYPE(TBALLOONDATA) :: TBALLOON4 ! characteristics and records of a balloon +TYPE(TBALLOONDATA) :: TBALLOON5 ! characteristics and records of a balloon +TYPE(TBALLOONDATA) :: TBALLOON6 ! characteristics and records of a balloon +TYPE(TBALLOONDATA) :: TBALLOON7 ! characteristics and records of a balloon +TYPE(TBALLOONDATA) :: TBALLOON8 ! characteristics and records of a balloon +TYPE(TBALLOONDATA) :: TBALLOON9 ! characteristics and records of a balloon + +TYPE(TAIRCRAFTDATA) :: TAIRCRAFT1 ! characteristics and records of an aircraft +TYPE(TAIRCRAFTDATA) :: TAIRCRAFT2 ! characteristics and records of an aircraft +TYPE(TAIRCRAFTDATA) :: TAIRCRAFT3 ! characteristics and records of an aircraft +TYPE(TAIRCRAFTDATA) :: TAIRCRAFT4 ! characteristics and records of an aircraft +TYPE(TAIRCRAFTDATA) :: TAIRCRAFT5 ! characteristics and records of an aircraft +TYPE(TAIRCRAFTDATA) :: TAIRCRAFT6 ! characteristics and records of an aircraft +TYPE(TAIRCRAFTDATA) :: TAIRCRAFT7 ! characteristics and records of an aircraft +TYPE(TAIRCRAFTDATA) :: TAIRCRAFT8 ! characteristics and records of an aircraft +TYPE(TAIRCRAFTDATA) :: TAIRCRAFT9 ! characteristics and records of an aircraft +TYPE(TAIRCRAFTDATA) :: TAIRCRAFT10! characteristics and records of an aircraft +TYPE(TAIRCRAFTDATA) :: TAIRCRAFT11! characteristics and records of an aircraft +TYPE(TAIRCRAFTDATA) :: TAIRCRAFT12! characteristics and records of an aircraft +TYPE(TAIRCRAFTDATA) :: TAIRCRAFT13! characteristics and records of an aircraft +TYPE(TAIRCRAFTDATA) :: TAIRCRAFT14! characteristics and records of an aircraft +TYPE(TAIRCRAFTDATA) :: TAIRCRAFT15! characteristics and records of an aircraft +TYPE(TAIRCRAFTDATA) :: TAIRCRAFT16! characteristics and records of an aircraft +TYPE(TAIRCRAFTDATA) :: TAIRCRAFT17! characteristics and records of an aircraft +TYPE(TAIRCRAFTDATA) :: TAIRCRAFT18! characteristics and records of an aircraft +TYPE(TAIRCRAFTDATA) :: TAIRCRAFT19! characteristics and records of an aircraft +TYPE(TAIRCRAFTDATA) :: TAIRCRAFT20! characteristics and records of an aircraft +TYPE(TAIRCRAFTDATA) :: TAIRCRAFT21! characteristics and records of an aircraft +TYPE(TAIRCRAFTDATA) :: TAIRCRAFT22! characteristics and records of an aircraft +TYPE(TAIRCRAFTDATA) :: TAIRCRAFT23! characteristics and records of an aircraft +TYPE(TAIRCRAFTDATA) :: TAIRCRAFT24! characteristics and records of an aircraft +TYPE(TAIRCRAFTDATA) :: TAIRCRAFT25! characteristics and records of an aircraft +TYPE(TAIRCRAFTDATA) :: TAIRCRAFT26! characteristics and records of an aircraft +TYPE(TAIRCRAFTDATA) :: TAIRCRAFT27! characteristics and records of an aircraft +TYPE(TAIRCRAFTDATA) :: TAIRCRAFT28! characteristics and records of an aircraft +TYPE(TAIRCRAFTDATA) :: TAIRCRAFT29! characteristics and records of an aircraft +TYPE(TAIRCRAFTDATA) :: TAIRCRAFT30! characteristics and records of an aircraft + END MODULE MODD_AIRCRAFT_BALLOON diff --git a/src/MNH/write_aircraft_balloon.f90 b/src/MNH/write_aircraft_balloon.f90 index e9a4ab409..4bf6970fa 100644 --- a/src/MNH/write_aircraft_balloon.f90 +++ b/src/MNH/write_aircraft_balloon.f90 @@ -72,6 +72,7 @@ END MODULE MODI_WRITE_AIRCRAFT_BALLOON ! 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 @@ -167,7 +168,7 @@ use modd_field, only: NMNHDIM_LEVEL, NMNHDIM_FLYER_PROC, NMNHDIM_FLYER_TIME, NM use modi_aircraft_balloon, only: Aircraft_balloon_longtype_get -TYPE(FLYER), INTENT(IN) :: TPFLYER +CLASS(TFLYERDATA), INTENT(IN) :: TPFLYER ! !* 0.2 declaration of local variables for diachro ! @@ -253,19 +254,30 @@ 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 +SELECT TYPE ( TPFLYER ) + CLASS IS ( TAIRCRAFTDATA ) + 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 + + CLASS IS ( TBALLOONDATA ) + JPROC = JPROC + 1 + YTITLE (JPROC) = 'Z' + YUNIT (JPROC) = 'm' + YCOMMENT (JPROC) = 'altitude' + ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%Z(:) + +END SELECT ! JPROC = JPROC + 1 YTITLE (JPROC) = 'LON' diff --git a/src/MNH/write_balloonn.f90 b/src/MNH/write_balloonn.f90 index 8d20985f5..8332daba1 100644 --- a/src/MNH/write_balloonn.f90 +++ b/src/MNH/write_balloonn.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. @@ -57,7 +57,8 @@ END MODULE MODI_WRITE_BALLOON_n !! 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 !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -99,7 +100,7 @@ SUBROUTINE WRITE_LFI_BALLOON(TPFLYER) use modd_field, only: tfieldmetadata, TYPEREAL USE MODE_IO_FIELD_WRITE, only: IO_Field_write ! -TYPE(FLYER), INTENT(IN) :: TPFLYER +TYPE(TBALLOONDATA), INTENT(IN) :: TPFLYER ! ! !* 0.2 Declarations of local variables diff --git a/src/MNH/write_diachro.f90 b/src/MNH/write_diachro.f90 index 6172e8a6a..f2d57806c 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-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. @@ -95,7 +95,7 @@ subroutine Write_diachro( tpdiafile, tpbudiachro, tpfields, & !* 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: tfieldmetadata_base @@ -112,7 +112,7 @@ class(tfieldmetadata_base), dimension(:), intent(in) :: tpfi 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 +class(tflyerdata), intent(in), optional :: tpflyer ! !* 0.1 Local variables ! --------------- @@ -142,7 +142,7 @@ end subroutine Write_diachro !----------------------------------------------------------------------------- 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, & @@ -167,7 +167,7 @@ type(tbudiachrometadata), intent(in) :: tpbu class(tfieldmetadata_base), dimension(:), intent(in) :: tpfields type(date_time), dimension(:), intent(in) :: tpdates real, dimension(:,:,:,:,:,:), intent(in) :: pvar -type(flyer), intent(in), optional :: tpflyer +class(tflyerdata), intent(in), optional :: tpflyer integer, parameter :: LFITITLELGT = 100 integer, parameter :: LFIUNITLGT = 100 @@ -792,7 +792,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, & @@ -813,7 +813,7 @@ type(tbudiachrometadata), intent(in) :: tpbu class(tfieldmetadata_base), dimension(:), intent(in) :: tpfields real, dimension(:,:,:,:,:,:), intent(in) :: pvar logical, intent(in), optional :: osplit -type(flyer), intent(in), optional :: tpflyer +class(tflyerdata), intent(in), optional :: tpflyer character(len=:), allocatable :: ycategory character(len=:), allocatable :: ylevelname -- GitLab From 2b47da0f82b3515ee9b3aec69c2cd13ba830b6b7 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Thu, 2 Jun 2022 10:36:17 +0200 Subject: [PATCH 071/157] Philippe 02/06/2022: fix: remove XLAM_CRAD declaration --- src/MNH/profilern.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/MNH/profilern.f90 b/src/MNH/profilern.f90 index 5554c6cd2..71d4514af 100644 --- a/src/MNH/profilern.f90 +++ b/src/MNH/profilern.f90 @@ -210,7 +210,7 @@ REAL, DIMENSION(SIZE(PR,3)) :: ZRHODREFZ ! vertical profile of dry air densit 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,3),SIZE(PR,4)+1) :: ZRZ ! vertical profile of hydrometeor mixing ratios -REAL :: ZA,ZB,ZCC,ZCX,ZALPHA,ZNU,ZLB,ZLBEX,ZRHOHYD,XLAM_CRAD ! generic microphysical parameters +REAL :: ZA,ZB,ZCC,ZCX,ZALPHA,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 -- GitLab From 97c47427ae6dce1d972a1aef5a890b864203b3b9 Mon Sep 17 00:00:00 2001 From: Quentin Rodier <quentin.rodier@meteo.fr> Date: Mon, 16 May 2022 18:14:51 +0200 Subject: [PATCH 072/157] Quentin 16/05/2022: PSEA allocation not done with aircraft_balloon with CSURF=EXTE (cherry picked from commit 9e835a3e815e34dabe989994ed01e1c972d13c12) --- src/MNH/aircraft_balloon.f90 | 2 +- src/MNH/aircraft_balloon_evol.f90 | 2 +- src/MNH/modeln.f90 | 17 ++++++++++++++--- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/src/MNH/aircraft_balloon.f90 b/src/MNH/aircraft_balloon.f90 index 7538a4068..4dd66cdde 100644 --- a/src/MNH/aircraft_balloon.f90 +++ b/src/MNH/aircraft_balloon.f90 @@ -34,7 +34,7 @@ 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(:,:),INTENT(IN) :: PSEA +REAL, DIMENSION(:,:),OPTIONAL,INTENT(IN) :: PSEA ! -- OC ! !------------------------------------------------------------------------------- diff --git a/src/MNH/aircraft_balloon_evol.f90 b/src/MNH/aircraft_balloon_evol.f90 index 719d5de2f..0ac512afb 100644 --- a/src/MNH/aircraft_balloon_evol.f90 +++ b/src/MNH/aircraft_balloon_evol.f90 @@ -37,7 +37,7 @@ REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! dry air density of the re REAL, DIMENSION(:,:,:), INTENT(IN) :: PCIT ! pristine ice concentration ! CLASS(TFLYERDATA), INTENT(INOUT) :: TPFLYER! balloon/aircraft -REAL, DIMENSION(:,:), INTENT(IN) :: PSEA +REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PSEA ! !------------------------------------------------------------------------------- ! diff --git a/src/MNH/modeln.f90 b/src/MNH/modeln.f90 index 2582fea44..01be40645 100644 --- a/src/MNH/modeln.f90 +++ b/src/MNH/modeln.f90 @@ -2104,12 +2104,23 @@ XT_STEP_SWA = XT_STEP_SWA + ZTIME2 - ZTIME1 - XTIME_BU_PROCESS ! ZTIME1 = ZTIME2 ! -IF (LFLYER) & - CALL AIRCRAFT_BALLOON(XTSTEP, & +IF (LFLYER) THEN + IF (CSURF=='EXTE') 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(:,:)) - + DEALLOCATE(ZSEA) + ELSE + CALL AIRCRAFT_BALLOON(XTSTEP, & + XXHAT, XYHAT, XZZ, XMAP, XLONORI, XLATORI, & + XUT, XVT, XWT, XPABST, XTHT, XRT, XSVT, XTKET, XTSRAD, & + XRHODREF,XCIT) + END IF +END IF !------------------------------------------------------------------------------- ! -- GitLab From c3a8d3ec02eebcd29dd58ce229401cc2b0c919a9 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Thu, 2 Jun 2022 14:22:18 +0200 Subject: [PATCH 073/157] Philippe 02/06/2022: flyers: set default values directly in type declarations --- src/MNH/ini_aircraft_balloon.f90 | 88 ------------------------------- src/MNH/modd_aircraft_balloon.f90 | 75 +++++++++++++------------- 2 files changed, 38 insertions(+), 125 deletions(-) diff --git a/src/MNH/ini_aircraft_balloon.f90 b/src/MNH/ini_aircraft_balloon.f90 index ba176c69a..996ff864d 100644 --- a/src/MNH/ini_aircraft_balloon.f90 +++ b/src/MNH/ini_aircraft_balloon.f90 @@ -153,47 +153,6 @@ 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 ! !---------------------------------------------------------------------------- @@ -305,53 +264,6 @@ CONTAINS ! !---------------------------------------------------------------------------- !---------------------------------------------------------------------------- -SUBROUTINE DEFAULT_FLYER(TPFLYER) -! -CLASS(TFLYERDATA), INTENT(OUT) :: TPFLYER -! -! -TPFLYER%NMODEL = 0 -TPFLYER%MODEL = 'FIX' -TPFLYER%TYPE = ' ' -TPFLYER%TITLE = ' ' -TPFLYER%LAUNCH = TPDTSEG -TPFLYER%CRASH = .FALSE. -TPFLYER%FLY = .FALSE. -! -TPFLYER%TFLYER_TIME%XTSTEP = 60. ! s -! -SELECT TYPE ( TPFLYER ) - CLASS IS ( TAIRCRAFTDATA ) - TPFLYER%SEG = 0 - TPFLYER%SEGCURN = 1 - TPFLYER%SEGCURT = 0. - TPFLYER%ALTDEF = .FALSE. - - CLASS IS ( TBALLOONDATA ) - 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 - -END SELECT -! -TPFLYER%X_CUR = XUNDEF -TPFLYER%Y_CUR = XUNDEF -TPFLYER%Z_CUR = XUNDEF -TPFLYER%P_CUR = XUNDEF -! -END SUBROUTINE DEFAULT_FLYER -!---------------------------------------------------------------------------- -!---------------------------------------------------------------------------- SUBROUTINE ALLOCATE_FLYER(TPFLYER) ! ! diff --git a/src/MNH/modd_aircraft_balloon.f90 b/src/MNH/modd_aircraft_balloon.f90 index eb35a5c24..ea5b7e418 100644 --- a/src/MNH/modd_aircraft_balloon.f90 +++ b/src/MNH/modd_aircraft_balloon.f90 @@ -41,6 +41,7 @@ ! ------------ ! ! +use modd_parameters, only: XUNDEF USE MODD_TYPE_STATPROF, ONLY: TSTATPROFTIME use modd_type_date, only: date_time @@ -48,37 +49,37 @@ implicit none !------------------------------------------------------------------------------------------- ! -LOGICAL :: LFLYER ! flag to use aircraft/balloons +LOGICAL :: LFLYER ! flag to use aircraft/balloons ! TYPE :: TFLYERDATA ! !* 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 + CHARACTER(LEN=3) :: MODEL = '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 + 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 = .FALSE. ! occurence of crash + LOGICAL :: FLY = .FALSE. ! occurence of flying ! !* storage monitoring ! - TYPE(TSTATPROFTIME) :: TFLYER_TIME ! Time management for flyer + TYPE(TSTATPROFTIME) :: TFLYER_TIME ! Time management for flyer ! !* 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) + REAL :: X_CUR = XUNDEF ! current x + REAL :: Y_CUR = XUNDEF ! current y + REAL :: Z_CUR = XUNDEF ! current z (if 'RADIOS' or 'AIRCRA' and 'ALTDEF' = T) + REAL :: P_CUR = XUNDEF ! current p (if 'AIRCRA' and 'ALTDEF' = F) ! !* data records ! @@ -122,9 +123,9 @@ TYPE, EXTENDS( TFLYERDATA ) :: TAIRCRAFTDATA ! !* aircraft flight definition ! - INTEGER :: SEG ! number of aircraft flight segments - INTEGER :: SEGCURN ! current flight segment number - REAL :: SEGCURT ! current flight segment time spent + INTEGER :: SEG = 0 ! number of aircraft flight segments + INTEGER :: SEGCURN = 1 ! current flight segment number + REAL :: SEGCURT = 0. ! 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) @@ -135,26 +136,26 @@ TYPE, EXTENDS( TFLYERDATA ) :: TAIRCRAFTDATA ! !* aircraft altitude type definition ! - LOGICAL :: ALTDEF ! TRUE == altitude given in pressure + LOGICAL :: ALTDEF = .FALSE. ! TRUE == altitude given in pressure END TYPE TAIRCRAFTDATA TYPE, EXTENDS( TFLYERDATA ) :: TBALLOONDATA ! !* 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') + REAL :: LAT = XUNDEF ! latitude of launch + REAL :: LON = XUNDEF ! lontitude of launch + REAL :: XLAUNCH = XUNDEF ! X coordinate of launch + REAL :: YLAUNCH = XUNDEF ! Y coordinate of launch + REAL :: ALT = XUNDEF ! altitude of launch (if 'RADIOS' or 'ISODEN' or 'CVBALL') + REAL :: WASCENT = 5. ! ascent vertical speed, m/s (if 'RADIOS') + REAL :: RHO = XUNDEF ! density of launch (if 'ISODEN') + REAL :: PRES = XUNDEF ! pressure of launch (if 'ISODEN') + REAL :: DIAMETER = XUNDEF ! apparent diameter of the balloon (m) (if 'CVBALL') + REAL :: AERODRAG = XUNDEF ! aerodynamic drag coefficient of the balloon (if 'CVBALL') + REAL :: INDDRAG = XUNDEF ! induced drag coefficient (i.e. air shifted by the balloon) (if 'CVBALL') + REAL :: VOLUME = XUNDEF ! volume of the balloon (m3) (if 'CVBALL') + REAL :: MASS = XUNDEF ! mass of the balloon (kg) (if 'CVBALL') END TYPE TBALLOONDATA TYPE(TBALLOONDATA) :: TBALLOON1 ! characteristics and records of a balloon -- GitLab From 45120a8259cfebcf7879c8b1e3e84c07a9153dee Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Thu, 2 Jun 2022 14:36:11 +0200 Subject: [PATCH 074/157] Philippe 02/06/2022: flyers: put all aircrafts in TAIRCRAFTS and balloons in TBALLOONS (array instead of separated variables) --- src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 | 47 +- src/MNH/aircraft_balloon.f90 | 211 +-------- src/MNH/ini_aircraft.f90 | 464 +++++++++++--------- src/MNH/ini_aircraft_balloon.f90 | 99 +---- src/MNH/ini_balloon.f90 | 316 +++++++------ src/MNH/modd_aircraft_balloon.f90 | 46 +- src/MNH/write_aircraft_balloon.f90 | 48 +- src/MNH/write_balloonn.f90 | 14 +- 8 files changed, 488 insertions(+), 757 deletions(-) diff --git a/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 b/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 index 8344bffc6..26d8ab705 100644 --- a/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 +++ b/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 @@ -1855,46 +1855,13 @@ 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 ) + do ji = 1, nballoons + call Write_flyer_time_coord( tballoons(ji) ) + end do + + do ji = 1, naircrafts + call Write_flyer_time_coord( taircrafts(ji) ) + end do end if end if !MNHDIACHRONIC diff --git a/src/MNH/aircraft_balloon.f90 b/src/MNH/aircraft_balloon.f90 index 4dd66cdde..0c46dd014 100644 --- a/src/MNH/aircraft_balloon.f90 +++ b/src/MNH/aircraft_balloon.f90 @@ -130,13 +130,13 @@ 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(:,:), INTENT(IN) :: PSEA ! !------------------------------------------------------------------------------- ! ! 0.2 declaration of local variables ! -! +INTEGER :: JI !---------------------------------------------------------------------------- IF(.NOT. ALLOCATED(XTHW_FLUX)) & ALLOCATE(XTHW_FLUX(SIZE(PTH,1),SIZE(PTH,2),SIZE(PTH,3))) @@ -145,202 +145,17 @@ 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 +DO JI = 1, NBALLOONS + CALL AIRCRAFT_BALLOON_EVOL( PTSTEP, PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & + PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT, & + TBALLOONS(JI), PSEA ) +END DO +! +DO JI = 1, NBALLOONS + CALL AIRCRAFT_BALLOON_EVOL( PTSTEP, PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & + PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT, & + TAIRCRAFTS(JI), PSEA ) +END DO ! !---------------------------------------------------------------------------- ! diff --git a/src/MNH/ini_aircraft.f90 b/src/MNH/ini_aircraft.f90 index 254889818..08d1a5e06 100644 --- a/src/MNH/ini_aircraft.f90 +++ b/src/MNH/ini_aircraft.f90 @@ -83,16 +83,16 @@ !! ------------- !! Original 15/05/2000 !! Sept2009, A. Boilley add initialisation of aircraft altitude by Z -!! -!! -!! -------------------------------------------------------------------------- +! P. Wautelet 06/2022: reorganize flyers +! -------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ ! USE MODD_AIRCRAFT_BALLOON -! -! + +USE MODE_MSG + IMPLICIT NONE ! ! @@ -105,54 +105,60 @@ IMPLICIT NONE ! ! !---------------------------------------------------------------------------- +NAIRCRAFTS = 0 + +ALLOCATE( TAIRCRAFTS(NAIRCRAFTS) ) + +IF ( NAIRCRAFTS < 1 ) RETURN ! !* 1. Aircraft number 1 ! ----------------- +#if 0 ! !* model number ! -TAIRCRAFT1%NMODEL = 0 +TAIRCRAFTS(1)%NMODEL = 0 ! !* model switch ! -TAIRCRAFT1%MODEL = 'FIX' +TAIRCRAFTS(1)%MODEL = 'FIX' ! !* aircraft type ! -TAIRCRAFT1%TYPE = 'AIRCRA' +TAIRCRAFTS(1)%TYPE = 'AIRCRA' ! !* aircraft flight name ! -TAIRCRAFT1%TITLE = 'DIMO19A' +TAIRCRAFTS(1)%TITLE = 'DIMO19A' ! !* time step for storage ! -TAIRCRAFT1%TFLYER_TIME%XTSTEP = 60. +TAIRCRAFTS(1)%TFLYER_TIME%XTSTEP = 60. ! !* take-off date and time ! -TAIRCRAFT1%LAUNCH%nyear = 2007 -TAIRCRAFT1%LAUNCH%nmonth = 04 -TAIRCRAFT1%LAUNCH%nday = 19 -TAIRCRAFT1%LAUNCH%xtime = 32280. +TAIRCRAFTS(1)%LAUNCH%nyear = 2007 +TAIRCRAFTS(1)%LAUNCH%nmonth = 04 +TAIRCRAFTS(1)%LAUNCH%nday = 19 +TAIRCRAFTS(1)%LAUNCH%xtime = 32280. ! !* number of flight segments ! -TAIRCRAFT1%SEG = 168 +TAIRCRAFTS(1)%SEG = 168 ! !* initalisation of flag for pressure (T) or Z(F) for aicraft altitude ! -TAIRCRAFT1%ALTDEF = .TRUE. +TAIRCRAFTS(1)%ALTDEF = .TRUE. ! !* allocation of the arrays ! -ALLOCATE(TAIRCRAFT1%SEGTIME(TAIRCRAFT1%SEG )) -ALLOCATE(TAIRCRAFT1%SEGLAT (TAIRCRAFT1%SEG+1)) -ALLOCATE(TAIRCRAFT1%SEGLON (TAIRCRAFT1%SEG+1)) +ALLOCATE(TAIRCRAFTS(1)%SEGTIME(TAIRCRAFTS(1)%SEG )) +ALLOCATE(TAIRCRAFTS(1)%SEGLAT (TAIRCRAFTS(1)%SEG+1)) +ALLOCATE(TAIRCRAFTS(1)%SEGLON (TAIRCRAFTS(1)%SEG+1)) ! !* duration of the segments (seconds) ! -TAIRCRAFT1%SEGTIME = (/ 60, 60, 60, 60, 60, 60,& +TAIRCRAFTS(1)%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,& @@ -184,7 +190,7 @@ TAIRCRAFT1%SEGTIME = (/ 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,& +TAIRCRAFTS(1)%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,& @@ -222,7 +228,7 @@ TAIRCRAFT1%SEGLAT = (/ 44.39971, 44.40095, 44.40040, 44.39919, 44.39657,& !* 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,& +TAIRCRAFTS(1)%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,& @@ -255,14 +261,14 @@ TAIRCRAFT1%SEGLON = (/0.75561, 0.73090, 0.70157, 0.66896, 0.63468,& 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 /) + 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,& +IF (TAIRCRAFTS(1)%ALTDEF) THEN + ALLOCATE(TAIRCRAFTS(1)%SEGP (TAIRCRAFTS(1)%SEG+1)) + TAIRCRAFTS(1)%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,& @@ -297,8 +303,8 @@ IF (TAIRCRAFT1%ALTDEF) THEN 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,& + ALLOCATE(TAIRCRAFTS(1)%SEGZ (TAIRCRAFTS(1)%SEG+1)) +TAIRCRAFTS(1)%SEGZ = (/8000,8000,8000,8000,8000,& 8000,8000,8000,8000,8000,& 8000,8000,8000,8000,8000,& 8000,8000,8000,8000,8000,& @@ -331,58 +337,63 @@ 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 /) ENDIF ! +IF ( NAIRCRAFTS < 2 ) RETURN +#else +CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_AIRCRAFT', 'aircraft characteristics are commented' ) +#endif !---------------------------------------------------------------------------- ! !* 1. Aircraft number 2 ! ----------------- +#if 0 ! !* model number ! -TAIRCRAFT2%NMODEL = 0 +TAIRCRAFTS(2)%NMODEL = 0 ! !* model switch ! -TAIRCRAFT2%MODEL = 'FIX' +TAIRCRAFTS(2)%MODEL = 'FIX' ! !* aircraft type ! -TAIRCRAFT2%TYPE = 'AIRCRA' +TAIRCRAFTS(2)%TYPE = 'AIRCRA' !* aircraft flight name ! -TAIRCRAFT2%TITLE = 'DIMO19B' +TAIRCRAFTS(2)%TITLE = 'DIMO19B' ! !* time step for storage ! -TAIRCRAFT2%TFLYER_TIME%XTSTEP = 60. +TAIRCRAFTS(2)%TFLYER_TIME%XTSTEP = 60. ! !* take-off date and time ! -TAIRCRAFT2%LAUNCH%nyear = 2007 -TAIRCRAFT2%LAUNCH%nmonth = 04 -TAIRCRAFT2%LAUNCH%nday = 19 -TAIRCRAFT2%LAUNCH%xtime = 48060. +TAIRCRAFTS(2)%LAUNCH%nyear = 2007 +TAIRCRAFTS(2)%LAUNCH%nmonth = 04 +TAIRCRAFTS(2)%LAUNCH%nday = 19 +TAIRCRAFTS(2)%LAUNCH%xtime = 48060. ! !* number of flight segments ! -TAIRCRAFT2%SEG = 198 +TAIRCRAFTS(2)%SEG = 198 ! !* initalisation of flag for pressure (T) or Z(F) for aicraft altitude ! -TAIRCRAFT2%ALTDEF = .TRUE. +TAIRCRAFTS(2)%ALTDEF = .TRUE. ! !* allocation of the arrays ! -ALLOCATE(TAIRCRAFT2%SEGTIME(TAIRCRAFT2%SEG )) -ALLOCATE(TAIRCRAFT2%SEGLAT (TAIRCRAFT2%SEG+1)) -ALLOCATE(TAIRCRAFT2%SEGLON (TAIRCRAFT2%SEG+1)) +ALLOCATE(TAIRCRAFTS(2)%SEGTIME(TAIRCRAFTS(2)%SEG )) +ALLOCATE(TAIRCRAFTS(2)%SEGLAT (TAIRCRAFTS(2)%SEG+1)) +ALLOCATE(TAIRCRAFTS(2)%SEGLON (TAIRCRAFTS(2)%SEG+1)) ! !* duration of the segments (seconds) ! -TAIRCRAFT2%SEGTIME = (/60, 60, 60, 60, 60, 60,& +TAIRCRAFTS(2)%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,& @@ -419,7 +430,7 @@ TAIRCRAFT2%SEGTIME = (/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,& +TAIRCRAFTS(2)%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,& @@ -463,7 +474,7 @@ TAIRCRAFT2%SEGLAT = (/ 44.39819, 44.39967, 44.40104, 44.40074, 44.40085,& !* 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,& +TAIRCRAFTS(2)%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,& @@ -507,9 +518,9 @@ TAIRCRAFT2%SEGLON = (/0.76323, 0.75549, 0.73212, 0.70405, 0.67289,& !* 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,& +IF (TAIRCRAFTS(2)%ALTDEF) THEN + ALLOCATE(TAIRCRAFTS(2)%SEGP (TAIRCRAFTS(2)%SEG+1)) +TAIRCRAFTS(2)%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,& @@ -550,8 +561,8 @@ TAIRCRAFT2%SEGP = 100. * (/1001.,1001.0, 989.2, 987.5, 987.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,& + ALLOCATE(TAIRCRAFTS(2)%SEGZ (TAIRCRAFTS(2)%SEG+1)) + TAIRCRAFTS(2)%SEGZ = (/8000,8000,8000,8000,8000,& 8000,8000,8000,8000,8000,& 8000,8000,8000,8000,8000,& 8000,8000,8000,8000,8000,& @@ -593,55 +604,60 @@ ELSE 8000,8000,8000,8000 /) ENDIF ! +IF ( NAIRCRAFTS < 3 ) RETURN +#else +CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_AIRCRAFT', 'aircraft characteristics are commented' ) +#endif !---------------------------------------------------------------------------- ! !* 1. Aircraft number 3 ! ----------------- +#if 0 ! !* model number ! -TAIRCRAFT3%NMODEL = 0 +TAIRCRAFTS(3)%NMODEL = 0 ! !* model switch ! -TAIRCRAFT3%MODEL = 'FIX' +TAIRCRAFTS(3)%MODEL = 'FIX' ! !* aircraft type ! -TAIRCRAFT3%TYPE = 'AIRCRA' +TAIRCRAFTS(3)%TYPE = 'AIRCRA' !* aircraft flight name ! -TAIRCRAFT3%TITLE = 'SAAL19A' +TAIRCRAFTS(3)%TITLE = 'SAAL19A' ! !* time step for storage ! -TAIRCRAFT3%TFLYER_TIME%XTSTEP = 30. +TAIRCRAFTS(3)%TFLYER_TIME%XTSTEP = 30. ! !* take-off date and time ! -TAIRCRAFT3%LAUNCH%nyear = 2007 -TAIRCRAFT3%LAUNCH%nmonth = 04 -TAIRCRAFT3%LAUNCH%nday = 19 -TAIRCRAFT3%LAUNCH%xtime = 45369 +TAIRCRAFTS(3)%LAUNCH%nyear = 2007 +TAIRCRAFTS(3)%LAUNCH%nmonth = 04 +TAIRCRAFTS(3)%LAUNCH%nday = 19 +TAIRCRAFTS(3)%LAUNCH%xtime = 45369 ! !* number of flight segments ! -TAIRCRAFT3%SEG = 39 +TAIRCRAFTS(3)%SEG = 39 ! !* initalisation of flag for pressure (T) or Z(F) for aicraft altitude ! -TAIRCRAFT3%ALTDEF = .TRUE. +TAIRCRAFTS(3)%ALTDEF = .TRUE. ! !* allocation of the arrays ! -ALLOCATE(TAIRCRAFT3%SEGTIME(TAIRCRAFT3%SEG )) -ALLOCATE(TAIRCRAFT3%SEGLAT (TAIRCRAFT3%SEG+1)) -ALLOCATE(TAIRCRAFT3%SEGLON (TAIRCRAFT3%SEG+1)) +ALLOCATE(TAIRCRAFTS(3)%SEGTIME(TAIRCRAFTS(3)%SEG )) +ALLOCATE(TAIRCRAFTS(3)%SEGLAT (TAIRCRAFTS(3)%SEG+1)) +ALLOCATE(TAIRCRAFTS(3)%SEGLON (TAIRCRAFTS(3)%SEG+1)) ! !* duration of the segments (seconds) ! -TAIRCRAFT3%SEGTIME = (/ 15, 16, 16, 18, 17, 17,& +TAIRCRAFTS(3)%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,& @@ -653,7 +669,7 @@ TAIRCRAFT3%SEGTIME = (/ 15, 16, 16, 18, 17, 17,& !* 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,& +TAIRCRAFTS(3)%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,& @@ -665,7 +681,7 @@ TAIRCRAFT3%SEGLAT = (/ 44.14451, 44.14084, 44.14068, 44.14479, 44.14884,& !* 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,& +TAIRCRAFTS(3)%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,& @@ -677,9 +693,9 @@ TAIRCRAFT3%SEGLON = (/0.95322, 0.95562, 0.96155, 0.96490, 0.96186,& !* 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,& +IF (TAIRCRAFTS(3)%ALTDEF) THEN + ALLOCATE(TAIRCRAFTS(3)%SEGP (TAIRCRAFTS(3)%SEG+1)) +TAIRCRAFTS(3)%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,& @@ -688,8 +704,8 @@ TAIRCRAFT3%SEGP = 100. * (/ 992.5, 987.4, 982.1, 976.4, 969.3,& 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,& + ALLOCATE(TAIRCRAFTS(3)%SEGZ (TAIRCRAFTS(3)%SEG+1)) + TAIRCRAFTS(3)%SEGZ = (/8000,8000,8000,8000,8000,& 8000,8000,8000,8000,8000,& 8000,8000,8000,8000,8000,& 8000,8000,8000,8000,8000,& @@ -698,57 +714,61 @@ ELSE 8000,8000,8000,8000,8000,& 8000,8000,8000,8000,8000 /) ENDIF - ! +IF ( NAIRCRAFTS < 4 ) RETURN +#else +CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_AIRCRAFT', 'aircraft characteristics are commented' ) +#endif !---------------------------------------------------------------------------- ! !* 1. Aircraft number 4 ! ----------------- +#if 0 ! !* model number ! -TAIRCRAFT4%NMODEL = 0 +TAIRCRAFTS(4)%NMODEL = 0 ! !* model switch ! -TAIRCRAFT4%MODEL = 'FIX' +TAIRCRAFTS(4)%MODEL = 'FIX' ! !* aircraft type ! -TAIRCRAFT4%TYPE = 'AIRCRA' +TAIRCRAFTS(4)%TYPE = 'AIRCRA' !* aircraft flight name ! -TAIRCRAFT4%TITLE = 'SAAL19B' +TAIRCRAFTS(4)%TITLE = 'SAAL19B' ! !* time step for storage ! -TAIRCRAFT4%TFLYER_TIME%XTSTEP = 30. +TAIRCRAFTS(4)%TFLYER_TIME%XTSTEP = 30. ! !* take-off date and time ! -TAIRCRAFT4%LAUNCH%nyear = 2007 -TAIRCRAFT4%LAUNCH%nmonth = 04 -TAIRCRAFT4%LAUNCH%nday = 19 -TAIRCRAFT4%LAUNCH%xtime = 60392. +TAIRCRAFTS(4)%LAUNCH%nyear = 2007 +TAIRCRAFTS(4)%LAUNCH%nmonth = 04 +TAIRCRAFTS(4)%LAUNCH%nday = 19 +TAIRCRAFTS(4)%LAUNCH%xtime = 60392. ! !* number of flight segments ! -TAIRCRAFT4%SEG = 39 +TAIRCRAFTS(4)%SEG = 39 ! !* initalisation of flag for pressure (T) or Z(F) for aicraft altitude ! -TAIRCRAFT4%ALTDEF = .TRUE. +TAIRCRAFTS(4)%ALTDEF = .TRUE. ! !* allocation of the arrays ! -ALLOCATE(TAIRCRAFT4%SEGTIME(TAIRCRAFT4%SEG )) -ALLOCATE(TAIRCRAFT4%SEGLAT (TAIRCRAFT4%SEG+1)) -ALLOCATE(TAIRCRAFT4%SEGLON (TAIRCRAFT4%SEG+1)) +ALLOCATE(TAIRCRAFTS(4)%SEGTIME(TAIRCRAFTS(4)%SEG )) +ALLOCATE(TAIRCRAFTS(4)%SEGLAT (TAIRCRAFTS(4)%SEG+1)) +ALLOCATE(TAIRCRAFTS(4)%SEGLON (TAIRCRAFTS(4)%SEG+1)) ! !* duration of the segments (seconds) ! -TAIRCRAFT4%SEGTIME = (/ 36, 18, 18, 21, 24, 23,& +TAIRCRAFTS(4)%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,& @@ -759,7 +779,7 @@ TAIRCRAFT4%SEGTIME = (/ 36, 18, 18, 21, 24, 23,& !* 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,& +TAIRCRAFTS(4)%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,& @@ -771,7 +791,7 @@ TAIRCRAFT4%SEGLAT = (/ 44.14025, 44.13824, 44.14291, 44.14575, 44.14321,& !* 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,& +TAIRCRAFTS(4)%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,& @@ -783,9 +803,9 @@ TAIRCRAFT4%SEGLON = (/ 0.94868, 0.95712, 0.95820, 0.95265, 0.94556,& !* 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,& +IF (TAIRCRAFTS(4)%ALTDEF) THEN + ALLOCATE(TAIRCRAFTS(4)%SEGP (TAIRCRAFTS(4)%SEG+1)) +TAIRCRAFTS(4)%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,& @@ -794,8 +814,8 @@ TAIRCRAFT4%SEGP = 100. * (/ 992.3, 985.4, 979.9, 974.2, 969.2,& 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,& + ALLOCATE(TAIRCRAFTS(4)%SEGZ (TAIRCRAFTS(4)%SEG+1)) + TAIRCRAFTS(4)%SEGZ = (/8000,8000,8000,8000,8000,& 8000,8000,8000,8000,8000,& 8000,8000,8000,8000,8000,& 8000,8000,8000,8000,8000,& @@ -804,57 +824,61 @@ TAIRCRAFT4%SEGP = 100. * (/ 992.3, 985.4, 979.9, 974.2, 969.2,& 8000,8000,8000,8000,8000,& 8000,8000,8000,8000,8000/) ENDIF - ! +IF ( NAIRCRAFTS < 5 ) RETURN +#else +CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_AIRCRAFT', 'aircraft characteristics are commented' ) +#endif !---------------------------------------------------------------------------- ! !* 1. Aircraft number 5 ! ----------------- +#if 0 ! !* model number ! -TAIRCRAFT5%NMODEL = 0 +TAIRCRAFTS(5)%NMODEL = 0 ! !* model switch ! -TAIRCRAFT5%MODEL = 'FIX' +TAIRCRAFTS(5)%MODEL = 'FIX' ! !* aircraft type ! -TAIRCRAFT5%TYPE = 'AIRCRA' +TAIRCRAFTS(5)%TYPE = 'AIRCRA' !* aircraft flight name ! -TAIRCRAFT5%TITLE = 'SAIB19A' +TAIRCRAFTS(5)%TITLE = 'SAIB19A' ! !* time step for storage ! -TAIRCRAFT5%TFLYER_TIME%XTSTEP = 30. +TAIRCRAFTS(5)%TFLYER_TIME%XTSTEP = 30. ! !* take-off date and time ! -TAIRCRAFT5%LAUNCH%nyear = 2007 -TAIRCRAFT5%LAUNCH%nmonth = 04 -TAIRCRAFT5%LAUNCH%nday = 19 -TAIRCRAFT5%LAUNCH%xtime = 43380. +TAIRCRAFTS(5)%LAUNCH%nyear = 2007 +TAIRCRAFTS(5)%LAUNCH%nmonth = 04 +TAIRCRAFTS(5)%LAUNCH%nday = 19 +TAIRCRAFTS(5)%LAUNCH%xtime = 43380. ! !* number of flight segments ! -TAIRCRAFT5%SEG = 176 +TAIRCRAFTS(5)%SEG = 176 ! !* initalisation of flag for pressure (T) or Z(F) for aicraft altitude ! -TAIRCRAFT5%ALTDEF = .TRUE. +TAIRCRAFTS(5)%ALTDEF = .TRUE. ! !* allocation of the arrays ! -ALLOCATE(TAIRCRAFT5%SEGTIME(TAIRCRAFT5%SEG )) -ALLOCATE(TAIRCRAFT5%SEGLAT (TAIRCRAFT5%SEG+1)) -ALLOCATE(TAIRCRAFT5%SEGLON (TAIRCRAFT5%SEG+1)) +ALLOCATE(TAIRCRAFTS(5)%SEGTIME(TAIRCRAFTS(5)%SEG )) +ALLOCATE(TAIRCRAFTS(5)%SEGLAT (TAIRCRAFTS(5)%SEG+1)) +ALLOCATE(TAIRCRAFTS(5)%SEGLON (TAIRCRAFTS(5)%SEG+1)) ! !* duration of the segments (seconds) ! -TAIRCRAFT5%SEGTIME = (/ 28, 28, 29, 29, 29, 28,& +TAIRCRAFTS(5)%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,& @@ -889,7 +913,7 @@ TAIRCRAFT5%SEGTIME = (/ 28, 28, 29, 29, 29, 28,& !* 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,& +TAIRCRAFTS(5)%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,& @@ -930,7 +954,7 @@ TAIRCRAFT5%SEGLAT = (/44.38992, 44.38830, 44.38713, 44.38609, 44.38512,& !* 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,& +TAIRCRAFTS(5)%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,& @@ -971,9 +995,9 @@ TAIRCRAFT5%SEGLON = (/ 0.60996, 0.59790, 0.58554, 0.57296, 0.56046,& !* 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,& +IF (TAIRCRAFTS(5)%ALTDEF) THEN + ALLOCATE(TAIRCRAFTS(5)%SEGP (TAIRCRAFTS(5)%SEG+1)) +TAIRCRAFTS(5)%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,& @@ -1010,8 +1034,8 @@ TAIRCRAFT5%SEGP = 100. * (/ 995.7, 998.1, 998.7, 998.8, 999.1,& 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,& + ALLOCATE(TAIRCRAFTS(5)%SEGZ (TAIRCRAFTS(5)%SEG+1)) + TAIRCRAFTS(5)%SEGZ = (/8000,8000,8000,8000,8000,& 8000,8000,8000,8000,8000,& 8000,8000,8000,8000,8000,& 8000,8000,8000,8000,8000,& @@ -1049,56 +1073,60 @@ TAIRCRAFT5%SEGP = 100. * (/ 995.7, 998.1, 998.7, 998.8, 999.1,& 8000,8000/) ENDIF ! -! +IF ( NAIRCRAFTS < 6 ) RETURN +#else +CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_AIRCRAFT', 'aircraft characteristics are commented' ) +#endif !---------------------------------------------------------------------------- ! !* 1. Aircraft number 6 ! ----------------- ! +#if 0 !* model number ! -TAIRCRAFT6%NMODEL = 0 +TAIRCRAFTS(6)%NMODEL = 0 ! !* model switch ! -TAIRCRAFT6%MODEL = 'FIX' +TAIRCRAFTS(6)%MODEL = 'FIX' ! !* aircraft type ! -TAIRCRAFT6%TYPE = 'AIRCRA' +TAIRCRAFTS(6)%TYPE = 'AIRCRA' !* aircraft flight name ! -TAIRCRAFT6%TITLE = 'SAIB19B' +TAIRCRAFTS(6)%TITLE = 'SAIB19B' ! !* time step for storage ! -TAIRCRAFT6%TFLYER_TIME%XTSTEP = 30. +TAIRCRAFTS(6)%TFLYER_TIME%XTSTEP = 30. ! !* take-off date and time ! -TAIRCRAFT6%LAUNCH%nyear = 2007 -TAIRCRAFT6%LAUNCH%nmonth = 04 -TAIRCRAFT6%LAUNCH%nday = 19 -TAIRCRAFT6%LAUNCH%xtime = 55992. +TAIRCRAFTS(6)%LAUNCH%nyear = 2007 +TAIRCRAFTS(6)%LAUNCH%nmonth = 04 +TAIRCRAFTS(6)%LAUNCH%nday = 19 +TAIRCRAFTS(6)%LAUNCH%xtime = 55992. ! !* number of flight segments ! -TAIRCRAFT6%SEG = 179 +TAIRCRAFTS(6)%SEG = 179 ! !* initalisation of flag for pressure (T) or Z(F) for aicraft altitude ! -TAIRCRAFT6%ALTDEF = .TRUE. +TAIRCRAFTS(6)%ALTDEF = .TRUE. ! !* allocation of the arrays ! -ALLOCATE(TAIRCRAFT6%SEGTIME(TAIRCRAFT6%SEG )) -ALLOCATE(TAIRCRAFT6%SEGLAT (TAIRCRAFT6%SEG+1)) -ALLOCATE(TAIRCRAFT6%SEGLON (TAIRCRAFT6%SEG+1)) +ALLOCATE(TAIRCRAFTS(6)%SEGTIME(TAIRCRAFTS(6)%SEG )) +ALLOCATE(TAIRCRAFTS(6)%SEGLAT (TAIRCRAFTS(6)%SEG+1)) +ALLOCATE(TAIRCRAFTS(6)%SEGLON (TAIRCRAFTS(6)%SEG+1)) ! !* duration of the segments (seconds) ! -TAIRCRAFT6%SEGTIME = (/ 27, 25, 26, 25, 25, 25,& +TAIRCRAFTS(6)%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,& @@ -1132,7 +1160,7 @@ TAIRCRAFT6%SEGTIME = (/ 27, 25, 26, 25, 25, 25,& !* 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,& +TAIRCRAFTS(6)%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,& @@ -1172,7 +1200,7 @@ TAIRCRAFT6%SEGLAT = (/ 44.14614, 44.14841, 44.15199, 44.15888, 44.16587,& !* 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,& +TAIRCRAFTS(6)%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,& @@ -1212,9 +1240,9 @@ TAIRCRAFT6%SEGLON = (/-0.91544,-0.91300,-0.91007,-0.90375,-0.89495,& !* 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,& +IF (TAIRCRAFTS(6)%ALTDEF) THEN + ALLOCATE(TAIRCRAFTS(6)%SEGP (TAIRCRAFTS(6)%SEG+1)) +TAIRCRAFTS(6)%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,& @@ -1251,8 +1279,8 @@ TAIRCRAFT6%SEGP = 100. * (/ 990.1, 990.5, 991.1, 992.6, 993.7,& 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,& + ALLOCATE(TAIRCRAFTS(6)%SEGZ (TAIRCRAFTS(6)%SEG+1)) + TAIRCRAFTS(6)%SEGZ = (/8000,8000,8000,8000,8000,& 8000,8000,8000,8000,8000,& 8000,8000,8000,8000,8000,& 8000,8000,8000,8000,8000,& @@ -1290,56 +1318,61 @@ TAIRCRAFT6%SEGP = 100. * (/ 990.1, 990.5, 991.1, 992.6, 993.7,& 8000,8000,8000,8000,8000/) ENDIF ! +IF ( NAIRCRAFTS < 7 ) RETURN +#else +CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_AIRCRAFT', 'aircraft characteristics are commented' ) +#endif !---------------------------------------------------------------------------- ! ! !* 1. Aircraft number 7 ! ----------------- ! +#if 0 !* model number ! -TAIRCRAFT7%NMODEL = 0 +TAIRCRAFTS(7)%NMODEL = 0 ! !* model switch ! -TAIRCRAFT7%MODEL = 'FIX' +TAIRCRAFTS(7)%MODEL = 'FIX' ! !* aircraft type ! -TAIRCRAFT7%TYPE = 'AIRCRA' +TAIRCRAFTS(7)%TYPE = 'AIRCRA' !* aircraft flight name ! -TAIRCRAFT7%TITLE = 'TEST_19' +TAIRCRAFTS(7)%TITLE = 'TEST_19' ! !* time step for storage ! -TAIRCRAFT7%TFLYER_TIME%XTSTEP = 60. +TAIRCRAFTS(7)%TFLYER_TIME%XTSTEP = 60. ! !* take-off date and time ! -TAIRCRAFT7%LAUNCH%nyear = 2007 -TAIRCRAFT7%LAUNCH%nmonth = 04 -TAIRCRAFT7%LAUNCH%nday = 19 -TAIRCRAFT7%LAUNCH%xtime = 43500. +TAIRCRAFTS(7)%LAUNCH%nyear = 2007 +TAIRCRAFTS(7)%LAUNCH%nmonth = 04 +TAIRCRAFTS(7)%LAUNCH%nday = 19 +TAIRCRAFTS(7)%LAUNCH%xtime = 43500. ! !* number of flight segments ! -TAIRCRAFT7%SEG = 207 +TAIRCRAFTS(7)%SEG = 207 ! !* initalisation of flag for pressure (T) or Z(F) for aicraft altitude ! -TAIRCRAFT7%ALTDEF = .TRUE. +TAIRCRAFTS(7)%ALTDEF = .TRUE. ! !* allocation of the arrays ! -ALLOCATE(TAIRCRAFT7%SEGTIME(TAIRCRAFT7%SEG )) -ALLOCATE(TAIRCRAFT7%SEGLAT (TAIRCRAFT7%SEG+1)) -ALLOCATE(TAIRCRAFT7%SEGLON (TAIRCRAFT7%SEG+1)) +ALLOCATE(TAIRCRAFTS(7)%SEGTIME(TAIRCRAFTS(7)%SEG )) +ALLOCATE(TAIRCRAFTS(7)%SEGLAT (TAIRCRAFTS(7)%SEG+1)) +ALLOCATE(TAIRCRAFTS(7)%SEGLON (TAIRCRAFTS(7)%SEG+1)) ! !* duration of the segments (seconds) ! -TAIRCRAFT7%SEGTIME = (/ 60, 60, 60, 60, 60, 60,& +TAIRCRAFTS(7)%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,& @@ -1378,7 +1411,7 @@ TAIRCRAFT7%SEGTIME = (/ 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,& +TAIRCRAFTS(7)%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,& @@ -1424,7 +1457,7 @@ TAIRCRAFT7%SEGLAT = (/44.39766, 44.39865, 44.40084, 44.39968, 44.40132,& !* 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,& +TAIRCRAFTS(7)%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,& @@ -1470,9 +1503,9 @@ TAIRCRAFT7%SEGLON = (/0.76309, 0.76243, 0.74626, 0.71975, 0.69001,& !* 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,& +IF (TAIRCRAFTS(7)%ALTDEF) THEN + ALLOCATE(TAIRCRAFTS(7)%SEGP (TAIRCRAFTS(7)%SEG+1)) +TAIRCRAFTS(7)%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,& @@ -1515,8 +1548,8 @@ TAIRCRAFT7%SEGP = 100. * (/1013.5,1012.2, 999.9, 993.1, 992.3,& 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,& + ALLOCATE(TAIRCRAFTS(7)%SEGZ (TAIRCRAFTS(7)%SEG+1)) + TAIRCRAFTS(7)%SEGZ = (/8000,8000,8000,8000,8000,& 8000,8000,8000,8000,8000,& 8000,8000,8000,8000,8000,& 8000,8000,8000,8000,8000,& @@ -1560,57 +1593,60 @@ TAIRCRAFT7%SEGP = 100. * (/1013.5,1012.2, 999.9, 993.1, 992.3,& 8000,8000,8000/) ENDIF ! +IF ( NAIRCRAFTS < 8 ) RETURN +#else +CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_AIRCRAFT', 'aircraft characteristics are commented' ) +#endif !---------------------------------------------------------------------------- ! -! -! !* 1. Aircraft number 8 ! ----------------- ! +#if 0 !* model number ! -TAIRCRAFT8%NMODEL = 0 +TAIRCRAFTS(8)%NMODEL = 0 ! !* model switch ! -TAIRCRAFT8%MODEL = 'FIX' +TAIRCRAFTS(8)%MODEL = 'FIX' ! !* aircraft type ! -TAIRCRAFT8%TYPE = 'AIRCRA' +TAIRCRAFTS(8)%TYPE = 'AIRCRA' !* aircraft flight name ! -TAIRCRAFT8%TITLE = 'DIMO22B' +TAIRCRAFTS(8)%TITLE = 'DIMO22B' ! !* time step for storage ! -TAIRCRAFT8%TFLYER_TIME%XTSTEP = 60. +TAIRCRAFTS(8)%TFLYER_TIME%XTSTEP = 60. ! !* take-off date and time ! -TAIRCRAFT8%LAUNCH%nyear = 2007 -TAIRCRAFT8%LAUNCH%nmonth = 04 -TAIRCRAFT8%LAUNCH%nday = 22 -TAIRCRAFT8%LAUNCH%xtime = 45720. +TAIRCRAFTS(8)%LAUNCH%nyear = 2007 +TAIRCRAFTS(8)%LAUNCH%nmonth = 04 +TAIRCRAFTS(8)%LAUNCH%nday = 22 +TAIRCRAFTS(8)%LAUNCH%xtime = 45720. ! !* number of flight segments ! -TAIRCRAFT8%SEG = 210 +TAIRCRAFTS(8)%SEG = 210 ! !* initalisation of flag for pressure (T) or Z(F) for aicraft altitude ! -TAIRCRAFT8%ALTDEF = .TRUE. +TAIRCRAFTS(8)%ALTDEF = .TRUE. ! !* allocation of the arrays ! -ALLOCATE(TAIRCRAFT8%SEGTIME(TAIRCRAFT8%SEG )) -ALLOCATE(TAIRCRAFT8%SEGLAT (TAIRCRAFT8%SEG+1)) -ALLOCATE(TAIRCRAFT8%SEGLON (TAIRCRAFT8%SEG+1)) +ALLOCATE(TAIRCRAFTS(8)%SEGTIME(TAIRCRAFTS(8)%SEG )) +ALLOCATE(TAIRCRAFTS(8)%SEGLAT (TAIRCRAFTS(8)%SEG+1)) +ALLOCATE(TAIRCRAFTS(8)%SEGLON (TAIRCRAFTS(8)%SEG+1)) ! !* duration of the segments (seconds) ! -TAIRCRAFT8%SEGTIME = (/ 60, 60, 60, 60, 60, 60,& +TAIRCRAFTS(8)%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,& @@ -1649,7 +1685,7 @@ TAIRCRAFT8%SEGTIME = (/ 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,& +TAIRCRAFTS(8)%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,& @@ -1697,7 +1733,7 @@ TAIRCRAFT8%SEGLAT = (/ 44.40018, 44.39977, 44.39868, 44.39992, 44.39773,& !* 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,& +TAIRCRAFTS(8)%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,& @@ -1745,9 +1781,9 @@ TAIRCRAFT8%SEGLON = (/ 0.75057, 0.72578, 0.69760, 0.66704, 0.63457,& !* 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,& +IF (TAIRCRAFTS(8)%ALTDEF) THEN + ALLOCATE(TAIRCRAFTS(8)%SEGP (TAIRCRAFTS(8)%SEG+1)) +TAIRCRAFTS(8)%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,& @@ -1791,8 +1827,8 @@ TAIRCRAFT8%SEGP = 100. * (/1002.7, 994.1, 993.0, 994.6, 994.2,& 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,& + ALLOCATE(TAIRCRAFTS(8)%SEGZ (TAIRCRAFTS(8)%SEG+1)) + TAIRCRAFTS(8)%SEGZ = (/8000,8000,8000,8000,8000,& 8000,8000,8000,8000,8000,& 8000,8000,8000,8000,8000,& 8000,8000,8000,8000,8000,& @@ -1837,54 +1873,59 @@ TAIRCRAFT8%SEGP = 100. * (/1002.7, 994.1, 993.0, 994.6, 994.2,& 8000/) ENDIF ! +IF ( NAIRCRAFTS < 9 ) RETURN +#else +CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_AIRCRAFT', 'aircraft characteristics are commented' ) +#endif ! !* 1. Aircraft number 9 ! ----------------- ! +#if 0 !* model number ! -TAIRCRAFT9%NMODEL = 0 +TAIRCRAFTS(9)%NMODEL = 0 ! !* model switch ! -TAIRCRAFT9%MODEL = 'FIX' +TAIRCRAFTS(9)%MODEL = 'FIX' ! !* aircraft type ! -TAIRCRAFT9%TYPE = 'AIRCRA' +TAIRCRAFTS(9)%TYPE = 'AIRCRA' !* aircraft flight name ! -TAIRCRAFT9%TITLE = 'DIMO23A' +TAIRCRAFTS(9)%TITLE = 'DIMO23A' ! !* time step for storage ! -TAIRCRAFT9%TFLYER_TIME%XTSTEP = 60. +TAIRCRAFTS(9)%TFLYER_TIME%XTSTEP = 60. ! !* take-off date and time ! -TAIRCRAFT9%LAUNCH%nyear = 2007 -TAIRCRAFT9%LAUNCH%nmonth = 04 -TAIRCRAFT9%LAUNCH%nday = 23 -TAIRCRAFT9%LAUNCH%xtime = 28080. +TAIRCRAFTS(9)%LAUNCH%nyear = 2007 +TAIRCRAFTS(9)%LAUNCH%nmonth = 04 +TAIRCRAFTS(9)%LAUNCH%nday = 23 +TAIRCRAFTS(9)%LAUNCH%xtime = 28080. ! !* number of flight segments ! -TAIRCRAFT9%SEG = 217 +TAIRCRAFTS(9)%SEG = 217 ! !* initalisation of flag for pressure (T) or Z(F) for aicraft altitude ! -TAIRCRAFT9%ALTDEF = .TRUE. +TAIRCRAFTS(9)%ALTDEF = .TRUE. ! !* allocation of the arrays ! -ALLOCATE(TAIRCRAFT9%SEGTIME(TAIRCRAFT9%SEG )) -ALLOCATE(TAIRCRAFT9%SEGLAT (TAIRCRAFT9%SEG+1)) -ALLOCATE(TAIRCRAFT9%SEGLON (TAIRCRAFT9%SEG+1)) +ALLOCATE(TAIRCRAFTS(9)%SEGTIME(TAIRCRAFTS(9)%SEG )) +ALLOCATE(TAIRCRAFTS(9)%SEGLAT (TAIRCRAFTS(9)%SEG+1)) +ALLOCATE(TAIRCRAFTS(9)%SEGLON (TAIRCRAFTS(9)%SEG+1)) ! !* duration of the segments (seconds) ! -TAIRCRAFT9%SEGTIME = (/ 60, 60, 60, 60, 60, 60,& +TAIRCRAFTS(9)%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,& @@ -1926,7 +1967,7 @@ TAIRCRAFT9%SEGTIME = (/ 60, 60, 60, 60, 60, 60,& !* 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,& +TAIRCRAFTS(9)%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,& @@ -1976,7 +2017,7 @@ TAIRCRAFT9%SEGLAT = (/ 44.39751, 44.39753, 44.39752, 44.39853, 44.40034,& !* 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,& +TAIRCRAFTS(9)%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,& @@ -2026,9 +2067,9 @@ TAIRCRAFT9%SEGLON = (/ 0.76306, 0.76307, 0.76305, 0.76269, 0.74580,& ! (pascals) ! -IF (TAIRCRAFT9%ALTDEF) THEN - ALLOCATE(TAIRCRAFT9%SEGP (TAIRCRAFT9%SEG+1)) -TAIRCRAFT9%SEGP = 100. * (/ 1014.8,1014.8,1014.8,1014.8,1005.5,& +IF (TAIRCRAFTS(9)%ALTDEF) THEN + ALLOCATE(TAIRCRAFTS(9)%SEGP (TAIRCRAFTS(9)%SEG+1)) +TAIRCRAFTS(9)%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,& @@ -2073,8 +2114,8 @@ TAIRCRAFT9%SEGP = 100. * (/ 1014.8,1014.8,1014.8,1014.8,1005.5,& 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,& + ALLOCATE(TAIRCRAFTS(9)%SEGZ (TAIRCRAFTS(9)%SEG+1)) + TAIRCRAFTS(9)%SEGZ = (/8000,8000,8000,8000,8000,& 8000,8000,8000,8000,8000,& 8000,8000,8000,8000,8000,& 8000,8000,8000,8000,8000,& @@ -2119,6 +2160,9 @@ TAIRCRAFT9%SEGP = 100. * (/ 1014.8,1014.8,1014.8,1014.8,1005.5,& 8000,8000,8000,8000,8000,& 8000,8000,8000/) ENDIF +#else +CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_AIRCRAFT', 'aircraft characteristics are commented' ) +#endif ! !---------------------------------------------------------------------------- ! diff --git a/src/MNH/ini_aircraft_balloon.f90 b/src/MNH/ini_aircraft_balloon.f90 index 996ff864d..5a9c1b141 100644 --- a/src/MNH/ini_aircraft_balloon.f90 +++ b/src/MNH/ini_aircraft_balloon.f90 @@ -128,6 +128,7 @@ INTEGER :: IMI ! current model index INTEGER :: ISTORE ! number of storage instants INTEGER :: ILUOUT ! logical unit INTEGER :: IRESP ! return code +INTEGER :: JI INTEGER :: JSEG ! loop counter TYPE(TFIELDMETADATA) :: TZFIELD ! @@ -161,15 +162,9 @@ END IF ! ---------------------- 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) +DO JI = 1, NBALLOONS + CALL INI_LAUNCH( JI, TBALLOONS(JI) ) +END DO ! !---------------------------------------------------------------------------- ! @@ -178,36 +173,9 @@ CALL INI_LAUNCH(9,TBALLOON9) ! 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) +DO JI = 1, NAIRCRAFTS + CALL INI_FLIGHT( JI, TAIRCRAFTS(JI) ) +END DO ! !---------------------------------------------------------------------------- ! @@ -216,46 +184,13 @@ CALL INI_FLIGHT(30,TAIRCRAFT30) ! 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) +DO JI = 1, NBALLOONS + CALL ALLOCATE_FLYER( TBALLOONS(JI) ) +END DO +! +DO JI = 1, NAIRCRAFTS + CALL ALLOCATE_FLYER( TAIRCRAFTS(JI) ) +END DO ! !---------------------------------------------------------------------------- !---------------------------------------------------------------------------- @@ -402,7 +337,7 @@ IF ( CPROGRAM == 'MESONH' .OR. CPROGRAM == 'SPAWN ' .OR. CPROGRAM == 'REAL ' ) CALL IO_Field_read(TPINIFILE,TZFIELD,ZLAT,IRESP) ! IF ( IRESP /= 0 ) THEN - WRITE(ILUOUT,*) "INI_LAUCH: Initial location take for ",TPFLYER%TITLE + WRITE(ILUOUT,*) "INI_LAUNCH: Initial location take for ",TPFLYER%TITLE ELSE TZFIELD = TFIELDMETADATA( & CMNHNAME = TRIM(TPFLYER%TITLE)//'LON', & @@ -463,7 +398,7 @@ IF ( CPROGRAM == 'MESONH' .OR. CPROGRAM == 'SPAWN ' .OR. CPROGRAM == 'REAL ' ) TPFLYER%X_CUR, TPFLYER%Y_CUR ) TPFLYER%FLY = .TRUE. WRITE(ILUOUT,*) & - "INI_LAUCH: Current location read in FM file for ",TPFLYER%TITLE + "INI_LAUNCH: 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 @@ -488,7 +423,7 @@ ELSE IF (CPROGRAM == 'DIAG ' ) THEN TPFLYER%X_CUR, TPFLYER%Y_CUR ) TPFLYER%FLY = .TRUE. WRITE(ILUOUT,*) & - "INI_LAUCH: Current location read in MODD_DIAG_FLAG for ",TPFLYER%TITLE + "INI_LAUNCH: Current location read in MODD_DIAG_FLAG for ",TPFLYER%TITLE WRITE(ILUOUT,*) & " Lat=",ZLAT," Lon=",ZLON," Alt=",TPFLYER%Z_CUR END IF diff --git a/src/MNH/ini_balloon.f90 b/src/MNH/ini_balloon.f90 index 5c0095d21..68da88553 100644 --- a/src/MNH/ini_balloon.f90 +++ b/src/MNH/ini_balloon.f90 @@ -93,7 +93,7 @@ !! ------------- !! Original 15/05/2000 !! Apr,19, 2001 (G.Jaubert) add CVBALL type and switch in models -!! +! P. Wautelet 06/2022: reorganize flyers !! -------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -101,8 +101,9 @@ ! USE MODD_AIRCRAFT_BALLOON USE MODD_CST -! -! + +USE MODE_MSG + IMPLICIT NONE ! ! @@ -113,393 +114,430 @@ IMPLICIT NONE ! ! 0.2 declaration of local variables ! -! +INTEGER :: JI !---------------------------------------------------------------------------- +NBALLOONS = 0 + +ALLOCATE( TBALLOONS(NBALLOONS) ) + +IF ( NBALLOONS < 1 ) RETURN ! !* 1. Balloon number 1 ! ---------------- +#if 0 ! !* model number ! -TBALLOON1%NMODEL = 0 -TBALLOON1%MODEL = 'MOB' +TBALLOONS(1)%NMODEL = 0 +TBALLOONS(1)%MODEL = 'MOB' ! !* balloon type ! -TBALLOON1%TYPE = 'CVBALL' +TBALLOONS(1)%TYPE = 'CVBALL' ! !* balloon name ! -TBALLOON1%TITLE = 'CVB1MOBI' +TBALLOONS(1)%TITLE = 'CVB1MOBI' ! !* launching date and time ! -TBALLOON1%LAUNCH%nyear = 1999 -TBALLOON1%LAUNCH%nmonth = 09 -TBALLOON1%LAUNCH%nday = 19 -TBALLOON1%LAUNCH%xtime = 32460. +TBALLOONS(1)%LAUNCH%nyear = 1999 +TBALLOONS(1)%LAUNCH%nmonth = 09 +TBALLOONS(1)%LAUNCH%nday = 19 +TBALLOONS(1)%LAUNCH%xtime = 32460. ! !* latitude and longitude of launching site (decimal degree) ! -TBALLOON1%LAT = 45.800 -TBALLOON1%LON = 8.629 +TBALLOONS(1)%LAT = 45.800 +TBALLOONS(1)%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. +!TBALLOONS(1)%ALT = 3959. +TBALLOONS(1)%PRES = 98450. ! !* time step for data storage (s) ! -TBALLOON1%TFLYER_TIME%XTSTEP = 20. +TBALLOONS(1)%TFLYER_TIME%XTSTEP = 20. ! !* ascentional vertical speed of the ballon (in calm air) (for 'RADIOS') ! -TBALLOON1%WASCENT = 0. +TBALLOONS(1)%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.) +TBALLOONS(1)%AERODRAG = 0.44 +TBALLOONS(1)%INDDRAG = 0.014 +TBALLOONS(1)%VOLUME = 3.040 +TBALLOONS(1)%MASS = 2.4516 +TBALLOONS(1)%DIAMETER = ((3.*TBALLOONS(1)%VOLUME)/(4.*XPI))**(1./3.) ! +IF ( NBALLOONS < 2 ) RETURN +#else +CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_BALLOON', 'balloon characteristics are commented' ) +#endif !---------------------------------------------------------------------------- ! !* 2. Balloon number 2 ! ---------------- +#if 0 ! !* model number ! -TBALLOON2%NMODEL = 0 -TBALLOON2%MODEL = 'MOB' +TBALLOONS(2)%NMODEL = 0 +TBALLOONS(2)%MODEL = 'MOB' ! !* balloon type ! -TBALLOON2%TYPE = 'CVBALL' +TBALLOONS(2)%TYPE = 'CVBALL' ! !* balloon name ! -TBALLOON2%TITLE = 'CVB2MOBI' +TBALLOONS(2)%TITLE = 'CVB2MOBI' ! !* launching date and time ! -TBALLOON2%LAUNCH%nyear = 1999 -TBALLOON2%LAUNCH%nmonth = 09 -TBALLOON2%LAUNCH%nday = 19 -TBALLOON2%LAUNCH%xtime = 39660. +TBALLOONS(2)%LAUNCH%nyear = 1999 +TBALLOONS(2)%LAUNCH%nmonth = 09 +TBALLOONS(2)%LAUNCH%nday = 19 +TBALLOONS(2)%LAUNCH%xtime = 39660. ! !* latitude and longitude of launching site (decimal degree) ! -TBALLOON2%LAT = 45.800 -TBALLOON2%LON = 8.630 +TBALLOONS(2)%LAT = 45.800 +TBALLOONS(2)%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. +!TBALLOONS(2)%ALT = 3959. +TBALLOONS(2)%PRES = 98490. ! !* time step for data storage (s) ! -TBALLOON2%TFLYER_TIME%XTSTEP = 20. +TBALLOONS(2)%TFLYER_TIME%XTSTEP = 20. ! !* ascentional vertical speed of the ballon (in calm air) (for 'RADIOS') ! -TBALLOON2%WASCENT = 0. +TBALLOONS(2)%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.) +TBALLOONS(2)%AERODRAG = 0.44 +TBALLOONS(2)%INDDRAG = 0.014 +TBALLOONS(2)%VOLUME = 3.040 +TBALLOONS(2)%MASS = 2.58087 +TBALLOONS(2)%DIAMETER = ((3.*TBALLOONS(2)%VOLUME)/(4.*XPI))**(1./3.) ! -!------------------------------------------------------------------------------- +IF ( NBALLOONS < 3 ) RETURN +#else +CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_BALLOON', 'balloon characteristics are commented' ) +#endif !---------------------------------------------------------------------------- ! !* 3. Balloon number 3 ! ---------------- +#if 0 ! !* model number ! -TBALLOON3%NMODEL = 0 -TBALLOON3%MODEL = 'MOB' +TBALLOONS(3)%NMODEL = 0 +TBALLOONS(3)%MODEL = 'MOB' ! !* balloon type ! -TBALLOON3%TYPE = 'RADIOS' +TBALLOONS(3)%TYPE = 'RADIOS' ! !* balloon name ! -TBALLOON3%TITLE = 'RSMASE19' +TBALLOONS(3)%TITLE = 'RSMASE19' ! !* launching date and time ! -TBALLOON3%LAUNCH%nyear = 1999 -TBALLOON3%LAUNCH%nmonth = 09 -TBALLOON3%LAUNCH%nday = 19 -TBALLOON3%LAUNCH%xtime = 68400. +TBALLOONS(3)%LAUNCH%nyear = 1999 +TBALLOONS(3)%LAUNCH%nmonth = 09 +TBALLOONS(3)%LAUNCH%nday = 19 +TBALLOONS(3)%LAUNCH%xtime = 68400. ! !* latitude and longitude of launching site (decimal degree) ! -TBALLOON3%LAT = 46.810 -TBALLOON3%LON = 9.39 +TBALLOONS(3)%LAT = 46.810 +TBALLOONS(3)%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. +TBALLOONS(3)%ALT = 865. +!TBALLOONS(3)%PRES = 62360. ! !* time step for data storage (s) ! -TBALLOON3%TFLYER_TIME%XTSTEP = 20. +TBALLOONS(3)%TFLYER_TIME%XTSTEP = 20. ! !* ascentional vertical speed of the ballon (in calm air) (for 'RADIOS') ! -TBALLOON3%WASCENT = 4.85 +TBALLOONS(3)%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.) -! +TBALLOONS(3)%AERODRAG = 0.44 +TBALLOONS(3)%INDDRAG = 0.014 +TBALLOONS(3)%VOLUME = 3.040 +TBALLOONS(3)%MASS = 2.4516 +TBALLOONS(3)%DIAMETER = ((3.*TBALLOONS(3)%VOLUME)/(4.*XPI))**(1./3.) ! +IF ( NBALLOONS < 4 ) RETURN +#else +CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_BALLOON', 'balloon characteristics are commented' ) +#endif !---------------------------------------------------------------------------- ! !* 4. Balloon number 4 ! ---------------- +#if 0 ! !* model number ! -TBALLOON4%NMODEL = 0 -TBALLOON4%MODEL = 'FIX' +TBALLOONS(4)%NMODEL = 0 +TBALLOONS(4)%MODEL = 'FIX' ! !* balloon type ! -TBALLOON4%TYPE = 'CVBALL' +TBALLOONS(4)%TYPE = 'CVBALL' ! !* balloon name ! -TBALLOON4%TITLE = 'CVB1ACVB' +TBALLOONS(4)%TITLE = 'CVB1ACVB' ! !* launching date and time ! -TBALLOON4%LAUNCH%nyear = 1999 -TBALLOON4%LAUNCH%nmonth = 09 -TBALLOON4%LAUNCH%nday = 19 -TBALLOON4%LAUNCH%xtime = 32460. +TBALLOONS(4)%LAUNCH%nyear = 1999 +TBALLOONS(4)%LAUNCH%nmonth = 09 +TBALLOONS(4)%LAUNCH%nday = 19 +TBALLOONS(4)%LAUNCH%xtime = 32460. ! !* latitude and longitude of launching site (decimal degree) ! -TBALLOON4%LAT = 45.922 -TBALLOON4%LON = 8.646 +TBALLOONS(4)%LAT = 45.922 +TBALLOONS(4)%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. +TBALLOONS(4)%ALT = 3959. +!TBALLOONS(4)%PRES = 62360. ! !* time step for data storage (s) ! -TBALLOON4%TFLYER_TIME%XTSTEP = 20. +TBALLOONS(4)%TFLYER_TIME%XTSTEP = 20. ! !* ascentional vertical speed of the ballon (in calm air) (for 'RADIOS') ! -!TBALLOON4%WASCENT = 2.55 +!TBALLOONS(4)%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.) +TBALLOONS(4)%AERODRAG = 0.44 +TBALLOONS(4)%INDDRAG = 0.014 +TBALLOONS(4)%VOLUME = 3.040 +TBALLOONS(4)%MASS = 2.4516 +TBALLOONS(4)%DIAMETER = ((3.*TBALLOONS(4)%VOLUME)/(4.*XPI))**(1./3.) ! +IF ( NBALLOONS < 5 ) RETURN +#else +CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_BALLOON', 'balloon characteristics are commented' ) +#endif !---------------------------------------------------------------------------- ! !* 5. Balloon number 5 ! ---------------- +#if 0 ! !* model number ! -TBALLOON5%NMODEL = 0 -TBALLOON5%MODEL = 'FIX' +TBALLOONS(5)%NMODEL = 0 +TBALLOONS(5)%MODEL = 'FIX' ! !* balloon type ! -TBALLOON5%TYPE = 'CVBALL' +TBALLOONS(5)%TYPE = 'CVBALL' ! !* balloon name ! -TBALLOON5%TITLE = 'CVB1DEPA' +TBALLOONS(5)%TITLE = 'CVB1DEPA' ! !* launching date and time ! -TBALLOON5%LAUNCH%nyear = 1999 -TBALLOON5%LAUNCH%nmonth = 09 -TBALLOON5%LAUNCH%nday = 19 -TBALLOON5%LAUNCH%xtime = 32435. +TBALLOONS(5)%LAUNCH%nyear = 1999 +TBALLOONS(5)%LAUNCH%nmonth = 09 +TBALLOONS(5)%LAUNCH%nday = 19 +TBALLOONS(5)%LAUNCH%xtime = 32435. ! !* latitude and longitude of launching site (decimal degree) ! -TBALLOON5%LAT = 45.800 -TBALLOON5%LON = 8.630 +TBALLOONS(5)%LAT = 45.800 +TBALLOONS(5)%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. +TBALLOONS(5)%ALT = 340. +!TBALLOONS(5)%PRES = 62360. ! !* time step for data storage (s) ! -TBALLOON5%TFLYER_TIME%XTSTEP = 20. +TBALLOONS(5)%TFLYER_TIME%XTSTEP = 20. ! !* ascentional vertical speed of the ballon (in calm air) (for 'RADIOS') ! -!TBALLOON5%WASCENT = 2.55 +!TBALLOONS(5)%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.) +TBALLOONS(5)%AERODRAG = 0.44 +TBALLOONS(5)%INDDRAG = 0.014 +TBALLOONS(5)%VOLUME = 3.040 +TBALLOONS(5)%MASS = 2.4516 +TBALLOONS(5)%DIAMETER = ((3.*TBALLOONS(5)%VOLUME)/(4.*XPI))**(1./3.) ! +IF ( NBALLOONS < 6 ) RETURN +#else +CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_BALLOON', 'balloon characteristics are commented' ) +#endif !---------------------------------------------------------------------------- ! !* 6. Balloon number 6 ! ---------------- +#if 0 ! !* model number ! -TBALLOON6%NMODEL = 0 -TBALLOON6%MODEL = 'FIX' +TBALLOONS(6)%NMODEL = 0 +TBALLOONS(6)%MODEL = 'FIX' ! !* balloon type ! -TBALLOON6%TYPE = 'CVBALL' +TBALLOONS(6)%TYPE = 'CVBALL' ! !* balloon name ! -TBALLOON6%TITLE = 'CVB1RCVB' +TBALLOONS(6)%TITLE = 'CVB1RCVB' ! !* launching date and time ! -TBALLOON6%LAUNCH%nyear = 1999 -TBALLOON6%LAUNCH%nmonth = 09 -TBALLOON6%LAUNCH%nday = 19 -TBALLOON6%LAUNCH%xtime = 32460. +TBALLOONS(6)%LAUNCH%nyear = 1999 +TBALLOONS(6)%LAUNCH%nmonth = 09 +TBALLOONS(6)%LAUNCH%nday = 19 +TBALLOONS(6)%LAUNCH%xtime = 32460. ! !* latitude and longitude of launching site (decimal degree) ! -TBALLOON6%LAT = 45.922 -TBALLOON6%LON = 8.646 +TBALLOONS(6)%LAT = 45.922 +TBALLOONS(6)%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. +!TBALLOONS(6)%ALT = 3959. +!TBALLOONS(6)%PRES = 62360. ! !* time step for data storage (s) ! -TBALLOON6%TFLYER_TIME%XTSTEP = 20. +TBALLOONS(6)%TFLYER_TIME%XTSTEP = 20. ! !* ascentional vertical speed of the ballon (in calm air) (for 'RADIOS') ! -!TBALLOON6%WASCENT = 2.55 +!TBALLOONS(6)%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.) +TBALLOONS(6)%AERODRAG = 0.44 +TBALLOONS(6)%INDDRAG = 0.014 +TBALLOONS(6)%VOLUME = 3.040 +TBALLOONS(6)%MASS = 2.4516 +TBALLOONS(6)%DIAMETER = ((3.*TBALLOONS(6)%VOLUME)/(4.*XPI))**(1./3.) ! +IF ( NBALLOONS < 7 ) RETURN +#else +CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_BALLOON', 'balloon characteristics are commented' ) +#endif !---------------------------------------------------------------------------- ! !* 7. Balloon number 7 ! ---------------- +#if 0 ! !* model number ! -TBALLOON7%NMODEL = 0 -TBALLOON7%MODEL = 'FIX' +TBALLOONS(7)%NMODEL = 0 +TBALLOONS(7)%MODEL = 'FIX' ! !* balloon type ! -TBALLOON7%TYPE = 'CVBALL' +TBALLOONS(7)%TYPE = 'CVBALL' ! !* balloon name ! -TBALLOON7%TITLE = 'CVB1PISO' +TBALLOONS(7)%TITLE = 'CVB1PISO' ! !* launching date and time ! -TBALLOON7%LAUNCH%nyear = 1999 -TBALLOON7%LAUNCH%nmonth = 09 -TBALLOON7%LAUNCH%nday = 19 -TBALLOON7%LAUNCH%xtime = 32460. +TBALLOONS(7)%LAUNCH%nyear = 1999 +TBALLOONS(7)%LAUNCH%nmonth = 09 +TBALLOONS(7)%LAUNCH%nday = 19 +TBALLOONS(7)%LAUNCH%xtime = 32460. ! !* latitude and longitude of launching site (decimal degree) ! -TBALLOON7%LAT = 45.922 -TBALLOON7%LON = 8.646 +TBALLOONS(7)%LAT = 45.922 +TBALLOONS(7)%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. +!TBALLOONS(7)%ALT = 3959. +TBALLOONS(7)%PRES = 62360. ! !* time step for data storage (s) ! -TBALLOON7%TFLYER_TIME%XTSTEP = 20. +TBALLOONS(7)%TFLYER_TIME%XTSTEP = 20. ! !* ascentional vertical speed of the ballon (in calm air) (for 'RADIOS') ! -!TBALLOON7%WASCENT = 2.55 +!TBALLOONS(7)%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.) +TBALLOONS(7)%AERODRAG = 0.44 +TBALLOONS(7)%INDDRAG = 0.014 +TBALLOONS(7)%VOLUME = 3.040 +TBALLOONS(7)%MASS = 2.4516 +TBALLOONS(7)%DIAMETER = ((3.*TBALLOONS(7)%VOLUME)/(4.*XPI))**(1./3.) +#else +CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_BALLOON', 'balloon characteristics are commented' ) +#endif ! !---------------------------------------------------------------------------- ! diff --git a/src/MNH/modd_aircraft_balloon.f90 b/src/MNH/modd_aircraft_balloon.f90 index ea5b7e418..54d38ad12 100644 --- a/src/MNH/modd_aircraft_balloon.f90 +++ b/src/MNH/modd_aircraft_balloon.f90 @@ -47,6 +47,8 @@ use modd_type_date, only: date_time implicit none +save + !------------------------------------------------------------------------------------------- ! LOGICAL :: LFLYER ! flag to use aircraft/balloons @@ -158,45 +160,11 @@ TYPE, EXTENDS( TFLYERDATA ) :: TBALLOONDATA REAL :: MASS = XUNDEF ! mass of the balloon (kg) (if 'CVBALL') END TYPE TBALLOONDATA -TYPE(TBALLOONDATA) :: TBALLOON1 ! characteristics and records of a balloon -TYPE(TBALLOONDATA) :: TBALLOON2 ! characteristics and records of a balloon -TYPE(TBALLOONDATA) :: TBALLOON3 ! characteristics and records of a balloon -TYPE(TBALLOONDATA) :: TBALLOON4 ! characteristics and records of a balloon -TYPE(TBALLOONDATA) :: TBALLOON5 ! characteristics and records of a balloon -TYPE(TBALLOONDATA) :: TBALLOON6 ! characteristics and records of a balloon -TYPE(TBALLOONDATA) :: TBALLOON7 ! characteristics and records of a balloon -TYPE(TBALLOONDATA) :: TBALLOON8 ! characteristics and records of a balloon -TYPE(TBALLOONDATA) :: TBALLOON9 ! characteristics and records of a balloon +INTEGER :: NAIRCRAFTS = 0 ! Total number of aircrafts +INTEGER :: NBALLOONS = 0 ! Total number of balloons + +TYPE(TAIRCRAFTDATA), DIMENSION(:), ALLOCATABLE :: TAIRCRAFTS ! characteristics and records of the aircrafts -TYPE(TAIRCRAFTDATA) :: TAIRCRAFT1 ! characteristics and records of an aircraft -TYPE(TAIRCRAFTDATA) :: TAIRCRAFT2 ! characteristics and records of an aircraft -TYPE(TAIRCRAFTDATA) :: TAIRCRAFT3 ! characteristics and records of an aircraft -TYPE(TAIRCRAFTDATA) :: TAIRCRAFT4 ! characteristics and records of an aircraft -TYPE(TAIRCRAFTDATA) :: TAIRCRAFT5 ! characteristics and records of an aircraft -TYPE(TAIRCRAFTDATA) :: TAIRCRAFT6 ! characteristics and records of an aircraft -TYPE(TAIRCRAFTDATA) :: TAIRCRAFT7 ! characteristics and records of an aircraft -TYPE(TAIRCRAFTDATA) :: TAIRCRAFT8 ! characteristics and records of an aircraft -TYPE(TAIRCRAFTDATA) :: TAIRCRAFT9 ! characteristics and records of an aircraft -TYPE(TAIRCRAFTDATA) :: TAIRCRAFT10! characteristics and records of an aircraft -TYPE(TAIRCRAFTDATA) :: TAIRCRAFT11! characteristics and records of an aircraft -TYPE(TAIRCRAFTDATA) :: TAIRCRAFT12! characteristics and records of an aircraft -TYPE(TAIRCRAFTDATA) :: TAIRCRAFT13! characteristics and records of an aircraft -TYPE(TAIRCRAFTDATA) :: TAIRCRAFT14! characteristics and records of an aircraft -TYPE(TAIRCRAFTDATA) :: TAIRCRAFT15! characteristics and records of an aircraft -TYPE(TAIRCRAFTDATA) :: TAIRCRAFT16! characteristics and records of an aircraft -TYPE(TAIRCRAFTDATA) :: TAIRCRAFT17! characteristics and records of an aircraft -TYPE(TAIRCRAFTDATA) :: TAIRCRAFT18! characteristics and records of an aircraft -TYPE(TAIRCRAFTDATA) :: TAIRCRAFT19! characteristics and records of an aircraft -TYPE(TAIRCRAFTDATA) :: TAIRCRAFT20! characteristics and records of an aircraft -TYPE(TAIRCRAFTDATA) :: TAIRCRAFT21! characteristics and records of an aircraft -TYPE(TAIRCRAFTDATA) :: TAIRCRAFT22! characteristics and records of an aircraft -TYPE(TAIRCRAFTDATA) :: TAIRCRAFT23! characteristics and records of an aircraft -TYPE(TAIRCRAFTDATA) :: TAIRCRAFT24! characteristics and records of an aircraft -TYPE(TAIRCRAFTDATA) :: TAIRCRAFT25! characteristics and records of an aircraft -TYPE(TAIRCRAFTDATA) :: TAIRCRAFT26! characteristics and records of an aircraft -TYPE(TAIRCRAFTDATA) :: TAIRCRAFT27! characteristics and records of an aircraft -TYPE(TAIRCRAFTDATA) :: TAIRCRAFT28! characteristics and records of an aircraft -TYPE(TAIRCRAFTDATA) :: TAIRCRAFT29! characteristics and records of an aircraft -TYPE(TAIRCRAFTDATA) :: TAIRCRAFT30! characteristics and records of an aircraft +TYPE(TBALLOONDATA), DIMENSION(:), ALLOCATABLE :: TBALLOONS ! characteristics and records of the balloons END MODULE MODD_AIRCRAFT_BALLOON diff --git a/src/MNH/write_aircraft_balloon.f90 b/src/MNH/write_aircraft_balloon.f90 index 4bf6970fa..82040c7ea 100644 --- a/src/MNH/write_aircraft_balloon.f90 +++ b/src/MNH/write_aircraft_balloon.f90 @@ -105,51 +105,19 @@ TYPE(TFILEDATA), INTENT(IN) :: TPDIAFILE ! file to write ! 0.2 declaration of local variables ! INTEGER :: IMI ! current model index +INTEGER :: JI ! !---------------------------------------------------------------------------- ! 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) +DO JI = 1, NBALLOONS + CALL FLYER_DIACHRO( TBALLOONS(JI) ) +END DO + +DO JI = 1, NAIRCRAFTS + CALL FLYER_DIACHRO( TAIRCRAFTS(JI) ) +END DO ! !---------------------------------------------------------------------------- !---------------------------------------------------------------------------- diff --git a/src/MNH/write_balloonn.f90 b/src/MNH/write_balloonn.f90 index 8332daba1..54a7bbcb6 100644 --- a/src/MNH/write_balloonn.f90 +++ b/src/MNH/write_balloonn.f90 @@ -80,15 +80,11 @@ 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) +INTEGER :: JI + +DO JI = 1, NBALLOONS + IF ( TBALLOONS(JI)%FLY ) CALL WRITE_LFI_BALLOON( TBALLOONS(JI) ) +END DO ! ! CONTAINS -- GitLab From 98647623d902cbab5b9b53b60877e8d7a6669313 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Fri, 3 Jun 2022 13:38:32 +0200 Subject: [PATCH 075/157] Philippe 03/06/2022: flyers: respect DOCTOR norm for data structures --- src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 | 9 +- src/MNH/aircraft_balloon.f90 | 12 +- src/MNH/aircraft_balloon_evol.f90 | 693 ++++++++++---------- src/MNH/ini_aircraft.f90 | 368 +++++------ src/MNH/ini_aircraft_balloon.f90 | 372 +++++------ src/MNH/ini_balloon.f90 | 236 +++---- src/MNH/modd_aircraft_balloon.f90 | 150 ++--- src/MNH/write_aircraft_balloon.f90 | 167 ++--- src/MNH/write_balloonn.f90 | 30 +- src/MNH/write_diachro.f90 | 29 +- 10 files changed, 1022 insertions(+), 1044 deletions(-) diff --git a/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 b/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 index 26d8ab705..bc3633ddd 100644 --- a/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 +++ b/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 @@ -29,6 +29,7 @@ ! 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 !----------------------------------------------------------------- #ifdef MNH_IOCDF4 module mode_io_write_nc4 @@ -2272,7 +2273,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 ) @@ -2289,16 +2290,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' diff --git a/src/MNH/aircraft_balloon.f90 b/src/MNH/aircraft_balloon.f90 index 0c46dd014..eb5b0d777 100644 --- a/src/MNH/aircraft_balloon.f90 +++ b/src/MNH/aircraft_balloon.f90 @@ -177,26 +177,26 @@ select type ( tpflyer ) ytype = 'Aircrafts' class is ( tballoondata ) - if ( Trim( TPFLYER%TYPE ) == 'RADIOS' ) then + if ( Trim( TPFLYER%CTYPE ) == 'RADIOS' ) then ytype = 'Radiosonde_balloons' - else if ( Trim( TPFLYER%TYPE ) == 'ISODEN' ) then + else if ( Trim( TPFLYER%CTYPE ) == 'ISODEN' ) then ytype = 'Isodensity_balloons' - else if ( Trim( TPFLYER%TYPE ) == 'CVBALL' ) then + 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%title ) ) + 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%title ) ) + 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 diff --git a/src/MNH/aircraft_balloon_evol.f90 b/src/MNH/aircraft_balloon_evol.f90 index 0ac512afb..d7de3a7c1 100644 --- a/src/MNH/aircraft_balloon_evol.f90 +++ b/src/MNH/aircraft_balloon_evol.f90 @@ -354,12 +354,12 @@ ZTHIS_PROC=0. 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) +IF ( TPFLYER%CMODEL /= 'FIX' .AND. COUNT( NDAD(:) == IMI ) /= 0 & + .AND. ( TPFLYER%NMODEL == IMI .OR. NDAD(TPFLYER%NMODEL) == IMI ) & + .AND. TPFLYER%XX_CUR /= XUNDEF .AND. TPFLYER%XY_CUR /= XUNDEF & + .AND. TPFLYER%LFLY .AND. .NOT. TPFLYER%LCRASH & + .AND. CPROGRAM == 'MESONH' ) THEN + CALL FLYER_CHANGE_MODEL( IMI ) ENDIF ! IF ( TPFLYER%NMODEL /= IMI ) RETURN @@ -394,7 +394,7 @@ 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) +CALL DATETIME_DISTANCE( TPFLYER%TLAUNCH, TDTCUR, ZTDIST ) ! !* 3. LAUNCH ! ------ @@ -402,13 +402,7 @@ CALL DATETIME_DISTANCE(TPFLYER%LAUNCH,TDTCUR,ZTDIST) GLAUNCH = .FALSE. ! ! -IF (.NOT. TPFLYER%FLY) THEN -! -! -!* 3.1 comparison of dates and times -! ----------------------------- -! -! CALL DATETIME_DISTANCE(TPFLYER%LAUNCH,TDTCUR,ZTDIST) +IF ( .NOT. TPFLYER%LFLY ) THEN ! !* 3.2 launch/takeoff is effective ! --------------------------- @@ -420,43 +414,43 @@ IF (.NOT. TPFLYER%FLY) THEN !* 3.2.1 Determination of flight segment ! ------------------------------- ! - TPFLYER%SEGCURN = 1 - IL = TPFLYER%SEGCURN + TPFLYER%NSEGCURN = 1 + IL = TPFLYER%NSEGCURN ! - TPFLYER%SEGCURT = ZTDIST + TPFLYER%XSEGCURT = 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 + DO WHILE (TPFLYER%XSEGCURT>TPFLYER%XSEGTIME(IL) .AND. IL <= TPFLYER%NSEG) + TPFLYER%NSEGCURN = TPFLYER%NSEGCURN + 1 + IL = TPFLYER%NSEGCURN + TPFLYER%XSEGCURT = TPFLYER%XSEGCURT - TPFLYER%XSEGTIME(IL-1) + IF (IL>TPFLYER%NSEG) EXIT END DO ! !* end of flight ! - IF (IL > TPFLYER%SEG) THEN - TPFLYER%FLY=.FALSE. + IF (IL > TPFLYER%NSEG) THEN + TPFLYER%LFLY = .FALSE. ELSE - TPFLYER%FLY = .TRUE. - GLAUNCH = .TRUE. - TPFLYER%CRASH=.FALSE. + TPFLYER%LFLY = .TRUE. + GLAUNCH = .TRUE. + TPFLYER%LCRASH =.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,*) 'Aircraft ',TPFLYER%CTITLE,' takes off the ', & + TDTCUR%nday,'/',TDTCUR%nmonth,'/', & + TDTCUR%nyear,' at ',NINT(TDTCUR%xtime),' sec.' WRITE(ILUOUT,*) '-------------------------------------------------------------------' ENDIF ENDIF CLASS IS ( TBALLOONDATA) IF (ZTDIST <= PTSTEP ) THEN - TPFLYER%FLY = .TRUE. - GLAUNCH = .TRUE. + TPFLYER%LFLY = .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,*) 'Balloon ',TPFLYER%CTITLE,' is launched the ', & + TDTCUR%nday,'/',TDTCUR%nmonth,'/', & + TDTCUR%nyear,' at ',NINT(TDTCUR%xtime),' sec.' WRITE(ILUOUT,*) '-------------------------------------------------------------------' END IF @@ -470,9 +464,9 @@ IF (.NOT. TPFLYER%FLY) THEN ! SELECT TYPE ( TPFLYER ) CLASS IS ( TBALLOONDATA) - IF (TPFLYER%TYPE=='RADIOS' .OR. TPFLYER%TYPE=='ISODEN' .OR. TPFLYER%TYPE=='CVBALL') THEN - TPFLYER%X_CUR = TPFLYER%XLAUNCH - TPFLYER%Y_CUR = TPFLYER%YLAUNCH + IF ( TPFLYER%CTYPE == 'RADIOS' .OR. TPFLYER%CTYPE == 'ISODEN' .OR. TPFLYER%CTYPE == 'CVBALL' ) THEN + TPFLYER%XX_CUR = TPFLYER%XXLAUNCH + TPFLYER%XY_CUR = TPFLYER%XYLAUNCH END IF CLASS IS ( TAIRCRAFTDATA) @@ -481,13 +475,13 @@ IF (.NOT. TPFLYER%FLY) THEN !* 3.3.2 Determination of initial position ! ----------------------------- ! - IF (TPFLYER%FLY) THEN - ZSEG_FRAC = TPFLYER%SEGCURT / TPFLYER%SEGTIME(IL) + IF (TPFLYER%LFLY) THEN + ZSEG_FRAC = TPFLYER%XSEGCURT / TPFLYER%XSEGTIME(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) + TPFLYER%XX_CUR = (1.-ZSEG_FRAC) * TPFLYER%XSEGX(IL ) & + + ZSEG_FRAC * TPFLYER%XSEGX(IL+1) + TPFLYER%XY_CUR = (1.-ZSEG_FRAC) * TPFLYER%XSEGY(IL ) & + + ZSEG_FRAC * TPFLYER%XSEGY(IL+1) END IF END SELECT END IF @@ -499,7 +493,7 @@ END IF CALL STATPROF_INSTANT( TPFLYER%TFLYER_TIME, IN ) IF ( IN > 0 ) GSTORE = .TRUE. ! else no profiler storage at this time step ! -IF ( TPFLYER%FLY) THEN +IF ( TPFLYER%LFLY ) THEN ! !---------------------------------------------------------------------------- ! @@ -509,23 +503,23 @@ IF ( TPFLYER%FLY) THEN !* 4.1 X position ! ---------- ! - IU=COUNT( PXHAT (:)<=TPFLYER%X_CUR ) - II=COUNT( ZXHATM(:)<=TPFLYER%X_CUR ) + IU=COUNT( PXHAT (:)<=TPFLYER%XX_CUR ) + II=COUNT( ZXHATM(:)<=TPFLYER%XX_CUR ) ! - IF (IU<IIB .AND. LWEST_ll()) THEN - IF (TPFLYER%MODEL == 'FIX' .OR. TPFLYER%NMODEL == 1 ) THEN - TPFLYER%CRASH=.TRUE. + IF ( IU < IIB .AND. LWEST_ll() ) THEN + IF ( TPFLYER%CMODEL == 'FIX' .OR. TPFLYER%NMODEL == 1 ) THEN + TPFLYER%LCRASH = .TRUE. ELSE - II=IIB - IU=IIB + II = IIB + IU = IIB END IF END IF - IF (IU>IIE .AND. LEAST_ll()) THEN - IF (TPFLYER%MODEL == 'FIX' .OR. TPFLYER%NMODEL == 1) THEN - TPFLYER%CRASH=.TRUE. + IF ( IU > IIE .AND. LEAST_ll() ) THEN + IF ( TPFLYER%CMODEL == 'FIX' .OR. TPFLYER%NMODEL == 1 ) THEN + TPFLYER%LCRASH = .TRUE. ELSE - II=IIE - IU=IIE + II = IIE + IU = IIE END IF END IF ! @@ -533,23 +527,23 @@ IF ( TPFLYER%FLY) THEN !* 4.2 Y position ! ---------- ! - IV=COUNT( PYHAT (:)<=TPFLYER%Y_CUR ) - IJ=COUNT( ZYHATM(:)<=TPFLYER%Y_CUR ) + IV=COUNT( PYHAT (:)<=TPFLYER%XY_CUR ) + IJ=COUNT( ZYHATM(:)<=TPFLYER%XY_CUR ) ! - IF (IV<IJB .AND. LSOUTH_ll()) THEN - IF (TPFLYER%MODEL == 'FIX' .OR. TPFLYER%NMODEL == 1) THEN - TPFLYER%CRASH=.TRUE. + IF ( IV < IJB .AND. LSOUTH_ll() ) THEN + IF ( TPFLYER%CMODEL == 'FIX' .OR. TPFLYER%NMODEL == 1 ) THEN + TPFLYER%LCRASH = .TRUE. ELSE - IJ=IJB - IV=IJB + IJ = IJB + IV = IJB END IF END IF - IF (IV>IJE .AND. LNORTH_ll()) THEN - IF (TPFLYER%MODEL == 'FIX' .OR. TPFLYER%NMODEL == 1) THEN - TPFLYER%CRASH=.TRUE. + IF (IV > IJE .AND. LNORTH_ll() ) THEN + IF ( TPFLYER%CMODEL == 'FIX' .OR. TPFLYER%NMODEL == 1 ) THEN + TPFLYER%LCRASH = .TRUE. ELSE - IJ=IJE - IV=IJE + IJ = IJE + IV = IJE END IF END IF ! @@ -564,7 +558,7 @@ IF ( TPFLYER%FLY) THEN ! -------------------------------------- ! !---------------------------------------------------------------------------- - IF (ZTHIS_PROC>0. .AND. .NOT. TPFLYER%CRASH) THEN + IF ( ZTHIS_PROC > 0. .AND. .NOT. TPFLYER%LCRASH ) THEN !---------------------------------------------------------------------------- ! !* 4.5 Interpolations of model variables to mass points @@ -607,8 +601,7 @@ IF ( TPFLYER%FLY) THEN ZEXN(:,:,JK) = 1.5 * ZEXN(:,:,JK-1) - 0.5 * ZEXN(:,:,JK-2) END DO ! - IF (TPFLYER%TYPE=='ISODEN' .OR. TPFLYER%TYPE=='CVBALL' & - .OR. TPFLYER%TYPE=='AIRCRA' ) THEN + IF ( TPFLYER%CTYPE == 'ISODEN' .OR. TPFLYER%CTYPE == 'CVBALL' .OR. TPFLYER%CTYPE == '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) ) & @@ -634,27 +627,27 @@ IF ( TPFLYER%FLY) THEN IF (GLAUNCH) THEN SELECT TYPE ( TPFLYER ) CLASS IS ( TBALLOONDATA) - SELECT CASE ( TPFLYER%TYPE ) + SELECT CASE ( TPFLYER%CTYPE ) ! !* 5.2.1 Iso-density balloon ! CASE ( 'ISODEN' ) - ZXCOEF = (TPFLYER%X_CUR - ZXHATM(II)) / (ZXHATM(II+1) - ZXHATM(II)) + ZXCOEF = (TPFLYER%XX_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 = (TPFLYER%XY_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) + IF ( TPFLYER%XALTLAUNCH /= XUNDEF ) THEN + IK00 = MAX ( COUNT (TPFLYER%XALTLAUNCH >= ZZM(1,1,:)), 1) + IK01 = MAX ( COUNT (TPFLYER%XALTLAUNCH >= ZZM(1,2,:)), 1) + IK10 = MAX ( COUNT (TPFLYER%XALTLAUNCH >= ZZM(2,1,:)), 1) + IK11 = MAX ( COUNT (TPFLYER%XALTLAUNCH >= ZZM(2,2,:)), 1) + ZZCOEF00 = (TPFLYER%XALTLAUNCH - ZZM(1,1,IK00)) / ( ZZM(1,1,IK00+1) - ZZM(1,1,IK00)) + ZZCOEF01 = (TPFLYER%XALTLAUNCH - ZZM(1,2,IK01)) / ( ZZM(1,2,IK01+1) - ZZM(1,2,IK01)) + ZZCOEF10 = (TPFLYER%XALTLAUNCH - ZZM(2,1,IK10)) / ( ZZM(2,1,IK10+1) - ZZM(2,1,IK10)) + ZZCOEF11 = (TPFLYER%XALTLAUNCH - ZZM(2,2,IK11)) / ( ZZM(2,2,IK11+1) - ZZM(2,2,IK11)) + TPFLYER%XRHO = FLYER_INTERP(ZRHO) + ELSE IF ( TPFLYER%XPRES /= XUNDEF ) THEN + ZFLYER_EXN = (TPFLYER%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) @@ -663,9 +656,9 @@ IF ( TPFLYER%FLY) THEN 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%XRHO = FLYER_INTERP(ZRHO) ELSE - CMNHMSG(1) = 'Error in balloon initial position (balloon ' // TRIM(TPFLYER%TITLE) // ' )' + CMNHMSG(1) = 'Error in balloon initial position (balloon ' // TRIM(TPFLYER%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' ) @@ -674,74 +667,74 @@ IF ( TPFLYER%FLY) THEN !* 5.2.2 Radiosounding balloon ! CASE ( 'RADIOS' ) - 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) ) + TPFLYER%XZ_CUR = TPFLYER%XALTLAUNCH + TPFLYER%XZ_CUR = MAX ( TPFLYER%XZ_CUR , ZZM(1,1,IKB) ) + TPFLYER%XZ_CUR = MAX ( TPFLYER%XZ_CUR , ZZM(2,1,IKB) ) + TPFLYER%XZ_CUR = MAX ( TPFLYER%XZ_CUR , ZZM(1,2,IKB) ) + TPFLYER%XZ_CUR = MAX ( TPFLYER%XZ_CUR , ZZM(2,2,IKB) ) ! !* 5.2.4 Constant Volume Balloon ! CASE ( 'CVBALL' ) - ZXCOEF = (TPFLYER%X_CUR - ZXHATM(II)) / (ZXHATM(II+1) - ZXHATM(II)) + ZXCOEF = (TPFLYER%XX_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 = (TPFLYER%XY_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 ( TPFLYER%XALTLAUNCH /= XUNDEF ) THEN + IK00 = MAX ( COUNT (TPFLYER%XALTLAUNCH >= ZZM(1,1,:)), 1) + IK01 = MAX ( COUNT (TPFLYER%XALTLAUNCH >= ZZM(1,2,:)), 1) + IK10 = MAX ( COUNT (TPFLYER%XALTLAUNCH >= ZZM(2,1,:)), 1) + IK11 = MAX ( COUNT (TPFLYER%XALTLAUNCH >= 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) ) + TPFLYER%XZ_CUR = TPFLYER%XALTLAUNCH + TPFLYER%XZ_CUR = MAX ( TPFLYER%XZ_CUR , ZZM(1,1,IKB) ) + TPFLYER%XZ_CUR = MAX ( TPFLYER%XZ_CUR , ZZM(2,1,IKB) ) + TPFLYER%XZ_CUR = MAX ( TPFLYER%XZ_CUR , ZZM(1,2,IKB) ) + TPFLYER%XZ_CUR = MAX ( TPFLYER%XZ_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) + ZZCOEF00 = (TPFLYER%XALTLAUNCH - ZZM(1,1,IK00)) / ( ZZM(1,1,IK00+1) - ZZM(1,1,IK00)) + ZZCOEF01 = (TPFLYER%XALTLAUNCH - ZZM(1,2,IK01)) / ( ZZM(1,2,IK01+1) - ZZM(1,2,IK01)) + ZZCOEF10 = (TPFLYER%XALTLAUNCH - ZZM(2,1,IK10)) / ( ZZM(2,1,IK10+1) - ZZM(2,1,IK10)) + ZZCOEF11 = (TPFLYER%XALTLAUNCH - ZZM(2,2,IK11)) / ( ZZM(2,2,IK11+1) - ZZM(2,2,IK11)) + TPFLYER%XRHO = FLYER_INTERP(ZRHO) + TPFLYER%XZ_CUR = FLYER_INTERP(ZZM) END IF - ELSE IF ( TPFLYER%PRES /= XUNDEF ) THEN - ZFLYER_EXN = (TPFLYER%PRES/XP00)**(XRD/XCPD) + ELSE IF ( TPFLYER%XPRES /= XUNDEF ) THEN + ZFLYER_EXN = (TPFLYER%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 - 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) ) + TPFLYER%XZ_CUR = ZZM(1,1,IKB) + TPFLYER%XZ_CUR = MAX ( TPFLYER%XZ_CUR , ZZM(2,1,IKB) ) + TPFLYER%XZ_CUR = MAX ( TPFLYER%XZ_CUR , ZZM(1,2,IKB) ) + TPFLYER%XZ_CUR = MAX ( TPFLYER%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)) - TPFLYER%RHO = FLYER_INTERP(ZRHO) - TPFLYER%Z_CUR = FLYER_INTERP(ZZM) + TPFLYER%XRHO = FLYER_INTERP(ZRHO) + TPFLYER%XZ_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) + TPFLYER%XRHO = TPFLYER%XMASS / TPFLYER%XVOLUME + 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) 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) ) + TPFLYER%XZ_CUR = ZZM(1,1,IKB) + TPFLYER%XZ_CUR = MAX ( TPFLYER%XZ_CUR , ZZM(2,1,IKB) ) + TPFLYER%XZ_CUR = MAX ( TPFLYER%XZ_CUR , ZZM(1,2,IKB) ) + TPFLYER%XZ_CUR = MAX ( TPFLYER%XZ_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) + 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) END IF END IF END SELECT @@ -749,12 +742,12 @@ IF ( TPFLYER%FLY) THEN !* 5.2.3 Aircraft ! CLASS IS ( TAIRCRAFTDATA) - IF (TPFLYER%ALTDEF) THEN - TPFLYER%P_CUR = (1.-ZSEG_FRAC) * TPFLYER%SEGP(IL ) & - + ZSEG_FRAC * TPFLYER%SEGP(IL+1) + IF (TPFLYER%LALTDEF) THEN + TPFLYER%XP_CUR = (1.-ZSEG_FRAC) * TPFLYER%XSEGP(IL ) & + + ZSEG_FRAC * TPFLYER%XSEGP(IL+1) ELSE - TPFLYER%Z_CUR = (1.-ZSEG_FRAC) * TPFLYER%SEGZ(IL ) & - + ZSEG_FRAC * TPFLYER%SEGZ(IL +1 ) + TPFLYER%XZ_CUR = (1.-ZSEG_FRAC) * TPFLYER%XSEGZ(IL ) & + + ZSEG_FRAC * TPFLYER%XSEGZ(IL +1 ) END IF END SELECT END IF @@ -766,30 +759,30 @@ IF ( TPFLYER%FLY) THEN ! SELECT TYPE ( TPFLYER ) CLASS IS ( TBALLOONDATA) - 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) + 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 CLASS IS ( TAIRCRAFTDATA) - IF (TPFLYER%ALTDEF) THEN - ZFLYER_EXN = (TPFLYER%P_CUR/XP00)**(XRD/XCPD) + 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%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) + 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 END SELECT @@ -805,31 +798,31 @@ IF ( TPFLYER%FLY) THEN ! 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. + TPFLYER%LCRASH = .TRUE. 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.' + IF ( TPFLYER%LCRASH ) THEN + TPFLYER%LFLY = .FALSE. + IF ( TPFLYER%CTYPE == 'AIRCRA' .AND. .NOT. GLAUNCH ) THEN + WRITE(ILUOUT,*) 'Aircraft ',TPFLYER%CTITLE,' flew out of the domain the ', & + TDTCUR%nday,'/',TDTCUR%nmonth,'/', & + TDTCUR%nyear,' at ',TDTCUR%xtime,' sec.' + ELSE IF (TPFLYER%CTYPE /= 'AIRCRA') THEN + WRITE(ILUOUT,*) 'Balloon ',TPFLYER%CTITLE,' crashed the ', & + TDTCUR%nday,'/',TDTCUR%nmonth,'/', & + TDTCUR%nyear,' at ',TDTCUR%xtime,' sec.' END IF ELSE SELECT TYPE ( TPFLYER ) CLASS IS ( TAIRCRAFTDATA) IF ( .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,*) 'Aircraft ',TPFLYER%CTITLE,' flies in leg',TPFLYER%NSEGCURN ,' the ', & + TDTCUR%nday,'/',TDTCUR%nmonth,'/', & + TDTCUR%nyear,' at ',NINT(TDTCUR%xtime),' sec.' WRITE(ILUOUT,*) '-------------------------------------------------------------------' ENDIF END SELECT @@ -844,14 +837,14 @@ IF ( TPFLYER%FLY) THEN !* 6.1 Interpolation coefficient for X ! ------------------------------- ! - ZXCOEF = (TPFLYER%X_CUR - ZXHATM(II)) / (ZXHATM(II+1) - ZXHATM(II)) + ZXCOEF = (TPFLYER%XX_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 = (TPFLYER%XY_CUR - ZYHATM(IJ)) / (ZYHATM(IJ+1) - ZYHATM(IJ)) ZYCOEF = MAX (0.,MIN(ZYCOEF,1.)) ! ! @@ -860,32 +853,32 @@ IF ( TPFLYER%FLY) THEN ! SELECT TYPE ( TPFLYER ) CLASS IS ( TBALLOONDATA) - 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) ) + 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 CLASS IS ( TAIRCRAFTDATA) - IF (TPFLYER%ALTDEF) THEN + 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%Z_CUR = FLYER_INTERP(ZZM) + TPFLYER%XZ_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) + 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 SELECT ! @@ -897,42 +890,42 @@ IF ( TPFLYER%FLY) THEN !* 7.1 Interpolation coefficient for X (for U) ! ------------------------------- ! - ZUCOEF = (TPFLYER%X_CUR - PXHAT(IU)) / (PXHAT(IU+1) - PXHAT(IU)) + ZUCOEF = (TPFLYER%XX_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 = (TPFLYER%XY_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) ) + 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) ) ! ! !* 7.4 Interpolation coefficients for the 4 suroundings verticals (for V) ! ---------------------------------------------------------- ! - 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) ) + 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) ) ! !---------------------------------------------------------------------------- ! @@ -940,54 +933,54 @@ IF ( TPFLYER%FLY) THEN ! -------------- ! IF ( GSTORE ) THEN - TPFLYER%X (IN) = TPFLYER%X_CUR - TPFLYER%Y (IN) = TPFLYER%Y_CUR - TPFLYER%Z (IN) = TPFLYER%Z_CUR + TPFLYER%XX (IN) = TPFLYER%XX_CUR + TPFLYER%XY (IN) = TPFLYER%XY_CUR + TPFLYER%XZ (IN) = TPFLYER%XZ_CUR ! CALL SM_LATLON(PLATOR,PLONOR, & - TPFLYER%X_CUR, TPFLYER%Y_CUR, & - TPFLYER%YLAT(IN), TPFLYER%XLON(IN) ) + TPFLYER%XX_CUR, TPFLYER%XY_CUR, & + TPFLYER%XLAT(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%XZON (IN) = ZU_BAL * COS(ZGAM) + ZV_BAL * SIN(ZGAM) + TPFLYER%XMER (IN) = - ZU_BAL * SIN(ZGAM) + ZV_BAL * COS(ZGAM) ! - TPFLYER%W (IN) = FLYER_INTERP(ZWM) - TPFLYER%TH (IN) = FLYER_INTERP(PTH) + TPFLYER%XW (IN) = FLYER_INTERP(ZWM) + TPFLYER%XTH (IN) = FLYER_INTERP(PTH) ! ZFLYER_EXN = FLYER_INTERP(ZEXN) - TPFLYER%P (IN) = XP00 * ZFLYER_EXN**(XCPD/XRD) + TPFLYER%XP (IN) = XP00 * ZFLYER_EXN**(XCPD/XRD) ! DO JLOOP=1,SIZE(PR,4) - TPFLYER%R (IN,JLOOP) = FLYER_INTERP(PR(:,:,:,JLOOP)) + TPFLYER%XR (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)) + TPFLYER%XSV (IN,JLOOP) = FLYER_INTERP(PSV(:,:,:,JLOOP)) END DO - TPFLYER%RTZ (IN,:) = FLYER_INTERPZ(ZR(:,:,:)) + TPFLYER%XRTZ (IN,:) = FLYER_INTERPZ(ZR(:,:,:)) DO JLOOP=1,SIZE(PR,4) - TPFLYER%RZ (IN,:,JLOOP) = FLYER_INTERPZ(PR(:,:,:,JLOOP)) + TPFLYER%XRZ (IN,:,JLOOP) = FLYER_INTERPZ(PR(:,:,:,JLOOP)) END DO ! Fin Modifs ON - TPFLYER%FFZ (IN,:) = FLYER_INTERPZ(SQRT(PU**2+PV**2)) + TPFLYER%XFFZ (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)) + TPFLYER%XCIZ (IN,:) = FLYER_INTERPZ(PSV(:,:,:,NSV_LIMA_NI)) + TPFLYER%XCCZ (IN,:) = FLYER_INTERPZ(PSV(:,:,:,NSV_LIMA_NC)) + TPFLYER%XCRZ (IN,:) = FLYER_INTERPZ(PSV(:,:,:,NSV_LIMA_NR)) ELSE IF ( CCLOUD=="ICE3" .OR. CCLOUD=="ICE4" ) THEN - TPFLYER%CIZ (IN,:) = FLYER_INTERPZ(PCIT(:,:,:)) + TPFLYER%XCIZ (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. + TPFLYER%XCRARE(IN,:) = 0. + TPFLYER%XCRARE_ATT(IN,:) = 0. + TPFLYER%XLWCZ (IN,:) = 0. + TPFLYER%XIWCZ (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(:,:,:)) + TPFLYER%XLWCZ (IN,:) = FLYER_INTERPZ((PR(:,:,:,2)+PR(:,:,:,3))*PRHODREF(:,:,:)) + TPFLYER%XIWCZ (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 @@ -1215,7 +1208,7 @@ IF ( TPFLYER%FLY) THEN END DO ZREFLOC=ZREFLOC*(XLAM_CRAD/XPI)**4*ZCC*ZLBDA**ZCX/(4.*GAMMA(ZNU)*.93) ZAETMP=ZAETMP * XPI *ZCC*ZLBDA**ZCX/(4.*GAMMA(ZNU)) - TPFLYER%CRARE(IN,JK)=TPFLYER%CRARE(IN,JK)+ZREFLOC + TPFLYER%XCRARE(IN,JK)=TPFLYER%XCRARE(IN,JK)+ZREFLOC ZAELOC(JK)=ZAELOC(JK)+ZAETMP END IF @@ -1228,65 +1221,65 @@ IF ( TPFLYER%FLY) THEN 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 + 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%Z_CUR-ZZMZ(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%Z_CUR-.5*(ZZMZ(JK+1)+ZZMZ(JK))) & + 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 - TPFLYER%CRARE_ATT(IN,JK)=TPFLYER%CRARE(IN,JK)*ZAETOT + TPFLYER%XCRARE_ATT(IN,JK)=TPFLYER%XCRARE(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 + 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%Z_CUR))) + 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%Z_CUR) & + 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%CRARE_ATT(IN,JK)=TPFLYER%CRARE(IN,JK)*ZAETOT + TPFLYER%XCRARE_ATT(IN,JK)=TPFLYER%XCRARE(IN,JK)*ZAETOT END DO - TPFLYER%ZZ (IN,:) = ZZMZ(:) + TPFLYER%XZZ (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,:)) + WHERE(TPFLYER%XCRARE(IN,:)>0) + TPFLYER%XCRARE(IN,:)=10.*LOG10(1.E18*TPFLYER%XCRARE(IN,:)) ELSEWHERE - TPFLYER%CRARE(IN,:)=XUNDEF + TPFLYER%XCRARE(IN,:)=XUNDEF END WHERE - WHERE(TPFLYER%CRARE_ATT(IN,:)>0) - TPFLYER%CRARE_ATT(IN,:)=10.*LOG10(1.E18*TPFLYER%CRARE_ATT(IN,:)) + WHERE(TPFLYER%XCRARE_ATT(IN,:)>0) + TPFLYER%XCRARE_ATT(IN,:)=10.*LOG10(1.E18*TPFLYER%XCRARE_ATT(IN,:)) ELSEWHERE - TPFLYER%CRARE_ATT(IN,:)=XUNDEF + TPFLYER%XCRARE_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) + TPFLYER%XWZ (IN,:) = FLYER_INTERPZ(ZWM(:,:,:)) + IF (SIZE(PTKE)>0) TPFLYER%XTKE (IN) = FLYER_INTERP(PTKE) + IF (SIZE(PTS) >0) TPFLYER%XTSRAD(IN) = FLYER_INTERP_2D(PTS) + IF (LDIAG_IN_RUN) TPFLYER%XTKE_DISS(IN) = FLYER_INTERP(XCURRENT_TKE_DISS) + TPFLYER%XZS(IN) = FLYER_INTERP_2D(PZ(:,:,1+JPVEXT)) + TPFLYER%XTHW_FLUX(IN) = FLYER_INTERP(ZTHW_FLUX) + TPFLYER%XRCW_FLUX(IN) = FLYER_INTERP(ZRCW_FLUX) DO JLOOP=1,SIZE(PSV,4) - TPFLYER%SVW_FLUX(IN,JLOOP) = FLYER_INTERP(ZSVW_FLUX(:,:,:,JLOOP)) + TPFLYER%XSVW_FLUX(IN,JLOOP) = FLYER_INTERP(ZSVW_FLUX(:,:,:,JLOOP)) END DO END IF ! @@ -1297,7 +1290,7 @@ IF ( TPFLYER%FLY) THEN ! SELECT TYPE ( TPFLYER ) CLASS IS ( TBALLOONDATA) - IF (TPFLYER%TYPE=='RADIOS' .OR. TPFLYER%TYPE=='ISODEN' .OR. TPFLYER%TYPE=='CVBALL') THEN + IF ( TPFLYER%CTYPE == 'RADIOS' .OR. TPFLYER%CTYPE == 'ISODEN' .OR. TPFLYER%CTYPE == 'CVBALL' ) THEN ZU_BAL = FLYER_INTERP_U(PU) ZV_BAL = FLYER_INTERP_V(PV) if ( .not. lcartesian ) then @@ -1306,38 +1299,38 @@ IF ( TPFLYER%FLY) THEN ZMAP = 1. end if ! - TPFLYER%X_CUR = TPFLYER%X_CUR + ZU_BAL * PTSTEP * ZMAP - TPFLYER%Y_CUR = TPFLYER%Y_CUR + ZV_BAL * PTSTEP * ZMAP + TPFLYER%XX_CUR = TPFLYER%XX_CUR + ZU_BAL * PTSTEP * ZMAP + TPFLYER%XY_CUR = TPFLYER%XY_CUR + ZV_BAL * PTSTEP * ZMAP END IF ! - IF (TPFLYER%TYPE=='RADIOS') THEN + IF ( TPFLYER%CTYPE == 'RADIOS' ) THEN ZW_BAL = FLYER_INTERP(ZWM) - TPFLYER%Z_CUR = TPFLYER%Z_CUR + ( ZW_BAL + TPFLYER%WASCENT ) * PTSTEP + TPFLYER%XZ_CUR = TPFLYER%XZ_CUR + ( ZW_BAL + TPFLYER%XWASCENT ) * PTSTEP END IF ! - IF (TPFLYER%TYPE=='CVBALL') THEN + IF ( TPFLYER%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(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%XWASCENT = TPFLYER%XWASCENT & + - ( 1. / (1. + TPFLYER%XINDDRAG ) ) * 1. * & + ( XG * ( ( TPFLYER%XMASS / TPFLYER%XVOLUME ) - ZRO_BAL ) / ( TPFLYER%XMASS / TPFLYER%XVOLUME ) & + + TPFLYER%XWASCENT * ABS ( TPFLYER%XWASCENT ) * & + TPFLYER%XDIAMETER * TPFLYER%XAERODRAG / ( 2. * TPFLYER%XVOLUME ) & ) - TPFLYER%Z_CUR = TPFLYER%Z_CUR + ( ZW_BAL + TPFLYER%WASCENT ) * 1. + TPFLYER%XZ_CUR = TPFLYER%XZ_CUR + ( ZW_BAL + TPFLYER%XWASCENT ) * 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%XWASCENT = TPFLYER%XWASCENT & + - ( 1. / (1. + TPFLYER%XINDDRAG ) ) * (PTSTEP-INT(PTSTEP)) * & + ( XG * ( ( TPFLYER%XMASS / TPFLYER%XVOLUME ) - ZRO_BAL ) / ( TPFLYER%XMASS / TPFLYER%XVOLUME ) & + + TPFLYER%XWASCENT * ABS ( TPFLYER%XWASCENT ) * & + TPFLYER%XDIAMETER * TPFLYER%XAERODRAG / ( 2. * TPFLYER%XVOLUME ) & ) - TPFLYER%Z_CUR = TPFLYER%Z_CUR + ( ZW_BAL + TPFLYER%WASCENT ) * (PTSTEP-INT(PTSTEP)) + TPFLYER%XZ_CUR = TPFLYER%XZ_CUR + ( ZW_BAL + TPFLYER%XWASCENT ) * (PTSTEP-INT(PTSTEP)) END IF END IF END SELECT @@ -1356,43 +1349,43 @@ IF ( TPFLYER%FLY) THEN !* 10.1 Determination of flight segment ! ------------------------------- ! - IL = TPFLYER%SEGCURN + IL = TPFLYER%NSEGCURN ! - TPFLYER%SEGCURT = TPFLYER%SEGCURT + PTSTEP + TPFLYER%XSEGCURT = TPFLYER%XSEGCURT + 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 + DO WHILE (TPFLYER%XSEGCURT>TPFLYER%XSEGTIME(IL)) + TPFLYER%NSEGCURN = TPFLYER%NSEGCURN + 1 + IL = TPFLYER%NSEGCURN + TPFLYER%XSEGCURT = TPFLYER%XSEGCURT - TPFLYER%XSEGTIME(IL-1) + IF (IL>TPFLYER%NSEG) 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) +! DO WHILE (TPFLYER%XSEGCURT>TPFLYER%XSEGTIME(IL) .AND. IL <= TPFLYER%NSEG) +! TPFLYER%NSEGCURN = TPFLYER%NSEGCURN + 1 +! IL = TPFLYER%NSEGCURN +! TPFLYER%XSEGCURT = TPFLYER%XSEGCURT - TPFLYER%XSEGTIME(IL-1) ! END DO ! !* end of flight ! - IF (IL > TPFLYER%SEG) TPFLYER%FLY=.FALSE. + IF (IL > TPFLYER%NSEG) TPFLYER%LFLY = .FALSE. ! ! !* 10.2 Determination of new position ! ----------------------------- ! - IF (TPFLYER%FLY) THEN - ZSEG_FRAC = TPFLYER%SEGCURT / TPFLYER%SEGTIME(IL) + IF (TPFLYER%LFLY) THEN + ZSEG_FRAC = TPFLYER%XSEGCURT / TPFLYER%XSEGTIME(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) + TPFLYER%XX_CUR = (1.-ZSEG_FRAC) * TPFLYER%XSEGX(IL ) & + + ZSEG_FRAC * TPFLYER%XSEGX(IL+1) + TPFLYER%XY_CUR = (1.-ZSEG_FRAC) * TPFLYER%XSEGY(IL ) & + + ZSEG_FRAC * TPFLYER%XSEGY(IL+1) + IF (TPFLYER%LALTDEF) THEN + TPFLYER%XP_CUR = (1.-ZSEG_FRAC) * TPFLYER%XSEGP(IL ) & + + ZSEG_FRAC * TPFLYER%XSEGP(IL+1) ELSE - TPFLYER%Z_CUR = (1.-ZSEG_FRAC) * TPFLYER%SEGZ(IL ) & - + ZSEG_FRAC * TPFLYER%SEGZ(IL+1) + TPFLYER%XZ_CUR = (1.-ZSEG_FRAC) * TPFLYER%XSEGZ(IL ) & + + ZSEG_FRAC * TPFLYER%XSEGZ(IL+1) END IF END IF END SELECT @@ -1409,27 +1402,27 @@ END IF !* 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) +CALL DISTRIBUTE_FLYER_L(TPFLYER%LFLY) +CALL DISTRIBUTE_FLYER_L(TPFLYER%LCRASH) +CALL DISTRIBUTE_FLYER(TPFLYER%XX_CUR) +CALL DISTRIBUTE_FLYER(TPFLYER%XY_CUR) SELECT TYPE ( TPFLYER ) CLASS IS ( TBALLOONDATA ) - IF (TPFLYER%TYPE=='CVBALL') THEN - CALL DISTRIBUTE_FLYER(TPFLYER%Z_CUR) - CALL DISTRIBUTE_FLYER(TPFLYER%WASCENT) - ELSE IF (TPFLYER%TYPE=='RADIOS') THEN - CALL DISTRIBUTE_FLYER(TPFLYER%Z_CUR) - ELSE IF (TPFLYER%TYPE=='ISODEN' ) THEN - CALL DISTRIBUTE_FLYER(TPFLYER%RHO) + IF ( TPFLYER%CTYPE == 'CVBALL' ) THEN + CALL DISTRIBUTE_FLYER(TPFLYER%XZ_CUR) + CALL DISTRIBUTE_FLYER(TPFLYER%XWASCENT) + ELSE IF ( TPFLYER%CTYPE == 'RADIOS' ) THEN + CALL DISTRIBUTE_FLYER(TPFLYER%XZ_CUR) + ELSE IF ( TPFLYER%CTYPE == 'ISODEN' ) THEN + CALL DISTRIBUTE_FLYER(TPFLYER%XRHO) END IF CLASS IS ( TAIRCRAFTDATA ) - IF (TPFLYER%ALTDEF) THEN - CALL DISTRIBUTE_FLYER(TPFLYER%P_CUR) + IF (TPFLYER%LALTDEF) THEN + CALL DISTRIBUTE_FLYER(TPFLYER%XP_CUR) ELSE - CALL DISTRIBUTE_FLYER(TPFLYER%Z_CUR) + CALL DISTRIBUTE_FLYER(TPFLYER%XZ_CUR) ENDIF END SELECT ! @@ -1437,47 +1430,47 @@ END SELECT ! ----------- ! 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%XX (IN)) + CALL DISTRIBUTE_FLYER(TPFLYER%XY (IN)) + CALL DISTRIBUTE_FLYER(TPFLYER%XZ (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)) + CALL DISTRIBUTE_FLYER(TPFLYER%XLAT(IN)) + CALL DISTRIBUTE_FLYER(TPFLYER%XZON(IN)) + CALL DISTRIBUTE_FLYER(TPFLYER%XMER(IN)) + CALL DISTRIBUTE_FLYER(TPFLYER%XW (IN)) + CALL DISTRIBUTE_FLYER(TPFLYER%XP (IN)) + CALL DISTRIBUTE_FLYER(TPFLYER%XTH (IN)) DO JLOOP=1,SIZE(PR,4) - CALL DISTRIBUTE_FLYER(TPFLYER%R (IN,JLOOP)) + CALL DISTRIBUTE_FLYER(TPFLYER%XR (IN,JLOOP)) END DO DO JLOOP=1,SIZE(PSV,4) - CALL DISTRIBUTE_FLYER(TPFLYER%SV (IN,JLOOP)) + CALL DISTRIBUTE_FLYER(TPFLYER%XSV (IN,JLOOP)) END DO DO JLOOP=1,IKU - CALL DISTRIBUTE_FLYER(TPFLYER%RTZ (IN,JLOOP)) + CALL DISTRIBUTE_FLYER(TPFLYER%XRTZ (IN,JLOOP)) DO JLOOP2=1,SIZE(PR,4) - CALL DISTRIBUTE_FLYER(TPFLYER%RZ (IN,JLOOP,JLOOP2)) + CALL DISTRIBUTE_FLYER(TPFLYER%XRZ (IN,JLOOP,JLOOP2)) ENDDO - CALL DISTRIBUTE_FLYER(TPFLYER%FFZ (IN,JLOOP)) - CALL DISTRIBUTE_FLYER(TPFLYER%CIZ (IN,JLOOP)) + CALL DISTRIBUTE_FLYER(TPFLYER%XFFZ (IN,JLOOP)) + CALL DISTRIBUTE_FLYER(TPFLYER%XCIZ (IN,JLOOP)) IF (CCLOUD== 'LIMA' ) THEN - CALL DISTRIBUTE_FLYER(TPFLYER%CRZ (IN,JLOOP)) - CALL DISTRIBUTE_FLYER(TPFLYER%CCZ (IN,JLOOP)) + CALL DISTRIBUTE_FLYER(TPFLYER%XCRZ (IN,JLOOP)) + CALL DISTRIBUTE_FLYER(TPFLYER%XCCZ (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)) + CALL DISTRIBUTE_FLYER(TPFLYER%XIWCZ (IN,JLOOP)) + CALL DISTRIBUTE_FLYER(TPFLYER%XLWCZ (IN,JLOOP)) + CALL DISTRIBUTE_FLYER(TPFLYER%XCRARE (IN,JLOOP)) + CALL DISTRIBUTE_FLYER(TPFLYER%XCRARE_ATT (IN,JLOOP)) + CALL DISTRIBUTE_FLYER(TPFLYER%XWZ (IN,JLOOP)) + CALL DISTRIBUTE_FLYER(TPFLYER%XZZ (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)) + IF (SIZE(PTKE)>0) CALL DISTRIBUTE_FLYER(TPFLYER%XTKE (IN)) + IF (SIZE(PTS) >0) CALL DISTRIBUTE_FLYER(TPFLYER%XTSRAD(IN)) + CALL DISTRIBUTE_FLYER(TPFLYER%XZS (IN)) + CALL DISTRIBUTE_FLYER(TPFLYER%XTHW_FLUX(IN)) + CALL DISTRIBUTE_FLYER(TPFLYER%XRCW_FLUX(IN)) DO JLOOP=1,SIZE(PSV,4) - CALL DISTRIBUTE_FLYER(TPFLYER%SVW_FLUX(IN,JLOOP)) + CALL DISTRIBUTE_FLYER(TPFLYER%XSVW_FLUX(IN,JLOOP)) END DO END IF ! @@ -1673,8 +1666,8 @@ 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 ) +IU=COUNT( PXHAT (:)<=TPFLYER%XX_CUR ) +IV=COUNT( PYHAT (:)<=TPFLYER%XY_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 @@ -1721,13 +1714,13 @@ ZTHIS_PROC=0. 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,*) TPFLYER%CTITLE,' 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,*) TPFLYER%CTITLE,' goes from model ',IMODEL,' to model ', & + TPFLYER%NMODEL,' at ',NINT(TDTCUR%xtime),' sec.' WRITE(ILUOUT,*) '-------------------------------------------------------------------' ENDIF ENDIF diff --git a/src/MNH/ini_aircraft.f90 b/src/MNH/ini_aircraft.f90 index 08d1a5e06..af8ecdaaf 100644 --- a/src/MNH/ini_aircraft.f90 +++ b/src/MNH/ini_aircraft.f90 @@ -41,9 +41,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 +51,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 !! !! !! @@ -121,15 +121,15 @@ TAIRCRAFTS(1)%NMODEL = 0 ! !* model switch ! -TAIRCRAFTS(1)%MODEL = 'FIX' +TAIRCRAFTS(1)%CMODEL = 'FIX' ! !* aircraft type ! -TAIRCRAFTS(1)%TYPE = 'AIRCRA' +TAIRCRAFTS(1)%CTYPE = 'AIRCRA' ! !* aircraft flight name ! -TAIRCRAFTS(1)%TITLE = 'DIMO19A' +TAIRCRAFTS(1)%CTITLE = 'DIMO19A' ! !* time step for storage ! @@ -137,28 +137,28 @@ TAIRCRAFTS(1)%TFLYER_TIME%XTSTEP = 60. ! !* take-off date and time ! -TAIRCRAFTS(1)%LAUNCH%nyear = 2007 -TAIRCRAFTS(1)%LAUNCH%nmonth = 04 -TAIRCRAFTS(1)%LAUNCH%nday = 19 -TAIRCRAFTS(1)%LAUNCH%xtime = 32280. +TAIRCRAFTS(1)%TLAUNCH%nyear = 2007 +TAIRCRAFTS(1)%TLAUNCH%nmonth = 04 +TAIRCRAFTS(1)%TLAUNCH%nday = 19 +TAIRCRAFTS(1)%TLAUNCH%xtime = 32280. ! !* number of flight segments ! -TAIRCRAFTS(1)%SEG = 168 +TAIRCRAFTS(1)%NSEG = 168 ! !* initalisation of flag for pressure (T) or Z(F) for aicraft altitude ! -TAIRCRAFTS(1)%ALTDEF = .TRUE. +TAIRCRAFTS(1)%LALTDEF = .TRUE. ! !* allocation of the arrays ! -ALLOCATE(TAIRCRAFTS(1)%SEGTIME(TAIRCRAFTS(1)%SEG )) -ALLOCATE(TAIRCRAFTS(1)%SEGLAT (TAIRCRAFTS(1)%SEG+1)) -ALLOCATE(TAIRCRAFTS(1)%SEGLON (TAIRCRAFTS(1)%SEG+1)) +ALLOCATE(TAIRCRAFTS(1)%XSEGTIME(TAIRCRAFTS(1)%NSEG )) +ALLOCATE(TAIRCRAFTS(1)%XSEGLAT (TAIRCRAFTS(1)%NSEG+1)) +ALLOCATE(TAIRCRAFTS(1)%XSEGLON (TAIRCRAFTS(1)%NSEG+1)) ! !* duration of the segments (seconds) ! -TAIRCRAFTS(1)%SEGTIME = (/ 60, 60, 60, 60, 60, 60,& +TAIRCRAFTS(1)%XSEGTIME = (/ 60, 60, 60, 60, 60, 60,& 60, 60, 60, 60, 60, 60,& 60, 60, 60, 60, 60, 60,& 60, 60, 60, 60, 60, 60,& @@ -190,7 +190,7 @@ TAIRCRAFTS(1)%SEGTIME = (/ 60, 60, 60, 60, 60, 60,& !* latitudes of the segments ends (1st point is takeoff, last point is landing) ! (decimal degrees) ! -TAIRCRAFTS(1)%SEGLAT = (/ 44.39971, 44.40095, 44.40040, 44.39919, 44.39657,& +TAIRCRAFTS(1)%XSEGLAT = (/ 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,& @@ -228,7 +228,7 @@ TAIRCRAFTS(1)%SEGLAT = (/ 44.39971, 44.40095, 44.40040, 44.39919, 44.39657,& !* longitudes of the segments ends (1st point is takeoff, last point is landing) ! (decimal degrees) ! -TAIRCRAFTS(1)%SEGLON = (/0.75561, 0.73090, 0.70157, 0.66896, 0.63468,& +TAIRCRAFTS(1)%XSEGLON = (/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,& @@ -266,9 +266,9 @@ TAIRCRAFTS(1)%SEGLON = (/0.75561, 0.73090, 0.70157, 0.66896, 0.63468,& !* pressure of the segments ends (1st point is takeoff, last point is landing) ! (pascals) ! -IF (TAIRCRAFTS(1)%ALTDEF) THEN - ALLOCATE(TAIRCRAFTS(1)%SEGP (TAIRCRAFTS(1)%SEG+1)) - TAIRCRAFTS(1)%SEGP = 100. * (/1003.6, 990.8, 988.1, 988.5, 989.3,& +IF (TAIRCRAFTS(1)%LALTDEF) THEN + ALLOCATE(TAIRCRAFTS(1)%XSEGP (TAIRCRAFTS(1)%NSEG+1)) + TAIRCRAFTS(1)%XSEGP = 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,& @@ -303,8 +303,8 @@ IF (TAIRCRAFTS(1)%ALTDEF) THEN 989.5, 981.8, 977.8, 983.3,1001.9,& 1007.0,1006.8,1006.8, 1006.8 /) ELSE - ALLOCATE(TAIRCRAFTS(1)%SEGZ (TAIRCRAFTS(1)%SEG+1)) -TAIRCRAFTS(1)%SEGZ = (/8000,8000,8000,8000,8000,& + ALLOCATE(TAIRCRAFTS(1)%XSEGZ (TAIRCRAFTS(1)%NSEG+1)) +TAIRCRAFTS(1)%XSEGZ = (/8000,8000,8000,8000,8000,& 8000,8000,8000,8000,8000,& 8000,8000,8000,8000,8000,& 8000,8000,8000,8000,8000,& @@ -356,15 +356,15 @@ TAIRCRAFTS(2)%NMODEL = 0 ! !* model switch ! -TAIRCRAFTS(2)%MODEL = 'FIX' +TAIRCRAFTS(2)%CMODEL = 'FIX' ! !* aircraft type ! -TAIRCRAFTS(2)%TYPE = 'AIRCRA' +TAIRCRAFTS(2)%CTYPE = 'AIRCRA' !* aircraft flight name ! -TAIRCRAFTS(2)%TITLE = 'DIMO19B' +TAIRCRAFTS(2)%CTITLE = 'DIMO19B' ! !* time step for storage ! @@ -372,28 +372,28 @@ TAIRCRAFTS(2)%TFLYER_TIME%XTSTEP = 60. ! !* take-off date and time ! -TAIRCRAFTS(2)%LAUNCH%nyear = 2007 -TAIRCRAFTS(2)%LAUNCH%nmonth = 04 -TAIRCRAFTS(2)%LAUNCH%nday = 19 -TAIRCRAFTS(2)%LAUNCH%xtime = 48060. +TAIRCRAFTS(2)%TLAUNCH%nyear = 2007 +TAIRCRAFTS(2)%TLAUNCH%nmonth = 04 +TAIRCRAFTS(2)%TLAUNCH%nday = 19 +TAIRCRAFTS(2)%TLAUNCH%xtime = 48060. ! !* number of flight segments ! -TAIRCRAFTS(2)%SEG = 198 +TAIRCRAFTS(2)%NSEG = 198 ! !* initalisation of flag for pressure (T) or Z(F) for aicraft altitude ! -TAIRCRAFTS(2)%ALTDEF = .TRUE. +TAIRCRAFTS(2)%LALTDEF = .TRUE. ! !* allocation of the arrays ! -ALLOCATE(TAIRCRAFTS(2)%SEGTIME(TAIRCRAFTS(2)%SEG )) -ALLOCATE(TAIRCRAFTS(2)%SEGLAT (TAIRCRAFTS(2)%SEG+1)) -ALLOCATE(TAIRCRAFTS(2)%SEGLON (TAIRCRAFTS(2)%SEG+1)) +ALLOCATE(TAIRCRAFTS(2)%XSEGTIME(TAIRCRAFTS(2)%NSEG )) +ALLOCATE(TAIRCRAFTS(2)%XSEGLAT (TAIRCRAFTS(2)%NSEG+1)) +ALLOCATE(TAIRCRAFTS(2)%XSEGLON (TAIRCRAFTS(2)%NSEG+1)) ! !* duration of the segments (seconds) ! -TAIRCRAFTS(2)%SEGTIME = (/60, 60, 60, 60, 60, 60,& +TAIRCRAFTS(2)%XSEGTIME = (/60, 60, 60, 60, 60, 60,& 60, 60, 60, 60, 60, 60,& 60, 60, 60, 60, 60, 60,& 60, 60, 60, 60, 60, 60,& @@ -430,7 +430,7 @@ TAIRCRAFTS(2)%SEGTIME = (/60, 60, 60, 60, 60, 60,& !* latitudes of the segments ends (1st point is takeoff, last point is landing) ! (decimal degrees) ! -TAIRCRAFTS(2)%SEGLAT = (/ 44.39819, 44.39967, 44.40104, 44.40074, 44.40085,& +TAIRCRAFTS(2)%XSEGLAT = (/ 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,& @@ -474,7 +474,7 @@ TAIRCRAFTS(2)%SEGLAT = (/ 44.39819, 44.39967, 44.40104, 44.40074, 44.40085, !* longitudes of the segments ends (1st point is takeoff, last point is landing) ! (decimal degrees) ! -TAIRCRAFTS(2)%SEGLON = (/0.76323, 0.75549, 0.73212, 0.70405, 0.67289,& +TAIRCRAFTS(2)%XSEGLON = (/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,& @@ -518,9 +518,9 @@ TAIRCRAFTS(2)%SEGLON = (/0.76323, 0.75549, 0.73212, 0.70405, 0.67289,& !* pressure of the segments ends (1st point is takeoff, last point is landing) ! (pascals) ! -IF (TAIRCRAFTS(2)%ALTDEF) THEN - ALLOCATE(TAIRCRAFTS(2)%SEGP (TAIRCRAFTS(2)%SEG+1)) -TAIRCRAFTS(2)%SEGP = 100. * (/1001.,1001.0, 989.2, 987.5, 987.5,& +IF (TAIRCRAFTS(2)%LALTDEF) THEN + ALLOCATE(TAIRCRAFTS(2)%XSEGP (TAIRCRAFTS(2)%NSEG+1)) +TAIRCRAFTS(2)%XSEGP = 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,& @@ -561,8 +561,8 @@ TAIRCRAFTS(2)%SEGP = 100. * (/1001.,1001.0, 989.2, 987.5, 987.5,& 975.8, 993.9,1004.1,1004.1,1004.1,& 1004.1,1004.1,1004.1,1004.1 /) ELSE - ALLOCATE(TAIRCRAFTS(2)%SEGZ (TAIRCRAFTS(2)%SEG+1)) - TAIRCRAFTS(2)%SEGZ = (/8000,8000,8000,8000,8000,& + ALLOCATE(TAIRCRAFTS(2)%XSEGZ (TAIRCRAFTS(2)%NSEG+1)) + TAIRCRAFTS(2)%XSEGZ = (/8000,8000,8000,8000,8000,& 8000,8000,8000,8000,8000,& 8000,8000,8000,8000,8000,& 8000,8000,8000,8000,8000,& @@ -620,15 +620,15 @@ TAIRCRAFTS(3)%NMODEL = 0 ! !* model switch ! -TAIRCRAFTS(3)%MODEL = 'FIX' +TAIRCRAFTS(3)%CMODEL = 'FIX' ! !* aircraft type ! -TAIRCRAFTS(3)%TYPE = 'AIRCRA' +TAIRCRAFTS(3)%CTYPE = 'AIRCRA' !* aircraft flight name ! -TAIRCRAFTS(3)%TITLE = 'SAAL19A' +TAIRCRAFTS(3)%CTITLE = 'SAAL19A' ! !* time step for storage ! @@ -636,28 +636,28 @@ TAIRCRAFTS(3)%TFLYER_TIME%XTSTEP = 30. ! !* take-off date and time ! -TAIRCRAFTS(3)%LAUNCH%nyear = 2007 -TAIRCRAFTS(3)%LAUNCH%nmonth = 04 -TAIRCRAFTS(3)%LAUNCH%nday = 19 -TAIRCRAFTS(3)%LAUNCH%xtime = 45369 +TAIRCRAFTS(3)%TLAUNCH%nyear = 2007 +TAIRCRAFTS(3)%TLAUNCH%nmonth = 04 +TAIRCRAFTS(3)%TLAUNCH%nday = 19 +TAIRCRAFTS(3)%TLAUNCH%xtime = 45369 ! !* number of flight segments ! -TAIRCRAFTS(3)%SEG = 39 +TAIRCRAFTS(3)%NSEG = 39 ! !* initalisation of flag for pressure (T) or Z(F) for aicraft altitude ! -TAIRCRAFTS(3)%ALTDEF = .TRUE. +TAIRCRAFTS(3)%LALTDEF = .TRUE. ! !* allocation of the arrays ! -ALLOCATE(TAIRCRAFTS(3)%SEGTIME(TAIRCRAFTS(3)%SEG )) -ALLOCATE(TAIRCRAFTS(3)%SEGLAT (TAIRCRAFTS(3)%SEG+1)) -ALLOCATE(TAIRCRAFTS(3)%SEGLON (TAIRCRAFTS(3)%SEG+1)) +ALLOCATE(TAIRCRAFTS(3)%XSEGTIME(TAIRCRAFTS(3)%NSEG )) +ALLOCATE(TAIRCRAFTS(3)%XSEGLAT (TAIRCRAFTS(3)%NSEG+1)) +ALLOCATE(TAIRCRAFTS(3)%XSEGLON (TAIRCRAFTS(3)%NSEG+1)) ! !* duration of the segments (seconds) ! -TAIRCRAFTS(3)%SEGTIME = (/ 15, 16, 16, 18, 17, 17,& +TAIRCRAFTS(3)%XSEGTIME = (/ 15, 16, 16, 18, 17, 17,& 22, 25, 19, 19, 22, 27,& 28, 27, 29, 32, 30, 24,& 169, 18, 15, 18, 17, 16,& @@ -669,7 +669,7 @@ TAIRCRAFTS(3)%SEGTIME = (/ 15, 16, 16, 18, 17, 17,& !* latitudes of the segments ends (1st point is takeoff, last point is landing) ! (decimal degrees) ! -TAIRCRAFTS(3)%SEGLAT = (/ 44.14451, 44.14084, 44.14068, 44.14479, 44.14884,& +TAIRCRAFTS(3)%XSEGLAT = (/ 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,& @@ -681,7 +681,7 @@ TAIRCRAFTS(3)%SEGLAT = (/ 44.14451, 44.14084, 44.14068, 44.14479, 44.14884,& !* longitudes of the segments ends (1st point is takeoff, last point is landing) ! (decimal degrees) ! -TAIRCRAFTS(3)%SEGLON = (/0.95322, 0.95562, 0.96155, 0.96490, 0.96186,& +TAIRCRAFTS(3)%XSEGLON = (/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,& @@ -693,9 +693,9 @@ TAIRCRAFTS(3)%SEGLON = (/0.95322, 0.95562, 0.96155, 0.96490, 0.96186,& !* pressure of the segments ends (1st point is takeoff, last point is landing) ! (pascals) ! -IF (TAIRCRAFTS(3)%ALTDEF) THEN - ALLOCATE(TAIRCRAFTS(3)%SEGP (TAIRCRAFTS(3)%SEG+1)) -TAIRCRAFTS(3)%SEGP = 100. * (/ 992.5, 987.4, 982.1, 976.4, 969.3,& +IF (TAIRCRAFTS(3)%LALTDEF) THEN + ALLOCATE(TAIRCRAFTS(3)%XSEGP (TAIRCRAFTS(3)%NSEG+1)) +TAIRCRAFTS(3)%XSEGP = 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,& @@ -704,8 +704,8 @@ TAIRCRAFTS(3)%SEGP = 100. * (/ 992.5, 987.4, 982.1, 976.4, 969.3,& 940.4, 946.6, 951.8, 957.8, 963.1,& 969.1, 974.1, 980.0, 986.0, 993.0 /) ELSE - ALLOCATE(TAIRCRAFTS(3)%SEGZ (TAIRCRAFTS(3)%SEG+1)) - TAIRCRAFTS(3)%SEGZ = (/8000,8000,8000,8000,8000,& + ALLOCATE(TAIRCRAFTS(3)%XSEGZ (TAIRCRAFTS(3)%NSEG+1)) + TAIRCRAFTS(3)%XSEGZ = (/8000,8000,8000,8000,8000,& 8000,8000,8000,8000,8000,& 8000,8000,8000,8000,8000,& 8000,8000,8000,8000,8000,& @@ -731,15 +731,15 @@ TAIRCRAFTS(4)%NMODEL = 0 ! !* model switch ! -TAIRCRAFTS(4)%MODEL = 'FIX' +TAIRCRAFTS(4)%CMODEL = 'FIX' ! !* aircraft type ! -TAIRCRAFTS(4)%TYPE = 'AIRCRA' +TAIRCRAFTS(4)%CTYPE = 'AIRCRA' !* aircraft flight name ! -TAIRCRAFTS(4)%TITLE = 'SAAL19B' +TAIRCRAFTS(4)%CTITLE = 'SAAL19B' ! !* time step for storage ! @@ -747,28 +747,28 @@ TAIRCRAFTS(4)%TFLYER_TIME%XTSTEP = 30. ! !* take-off date and time ! -TAIRCRAFTS(4)%LAUNCH%nyear = 2007 -TAIRCRAFTS(4)%LAUNCH%nmonth = 04 -TAIRCRAFTS(4)%LAUNCH%nday = 19 -TAIRCRAFTS(4)%LAUNCH%xtime = 60392. +TAIRCRAFTS(4)%TLAUNCH%nyear = 2007 +TAIRCRAFTS(4)%TLAUNCH%nmonth = 04 +TAIRCRAFTS(4)%TLAUNCH%nday = 19 +TAIRCRAFTS(4)%TLAUNCH%xtime = 60392. ! !* number of flight segments ! -TAIRCRAFTS(4)%SEG = 39 +TAIRCRAFTS(4)%NSEG = 39 ! !* initalisation of flag for pressure (T) or Z(F) for aicraft altitude ! -TAIRCRAFTS(4)%ALTDEF = .TRUE. +TAIRCRAFTS(4)%LALTDEF = .TRUE. ! !* allocation of the arrays ! -ALLOCATE(TAIRCRAFTS(4)%SEGTIME(TAIRCRAFTS(4)%SEG )) -ALLOCATE(TAIRCRAFTS(4)%SEGLAT (TAIRCRAFTS(4)%SEG+1)) -ALLOCATE(TAIRCRAFTS(4)%SEGLON (TAIRCRAFTS(4)%SEG+1)) +ALLOCATE(TAIRCRAFTS(4)%XSEGTIME(TAIRCRAFTS(4)%NSEG )) +ALLOCATE(TAIRCRAFTS(4)%XSEGLAT (TAIRCRAFTS(4)%NSEG+1)) +ALLOCATE(TAIRCRAFTS(4)%XSEGLON (TAIRCRAFTS(4)%NSEG+1)) ! !* duration of the segments (seconds) ! -TAIRCRAFTS(4)%SEGTIME = (/ 36, 18, 18, 21, 24, 23,& +TAIRCRAFTS(4)%XSEGTIME = (/ 36, 18, 18, 21, 24, 23,& 20, 20, 25, 27, 21, 25,& 27, 23, 21, 23, 25, 21,& 27, 190, 17, 17, 18, 17,& @@ -779,7 +779,7 @@ TAIRCRAFTS(4)%SEGTIME = (/ 36, 18, 18, 21, 24, 23,& !* latitudes of the segments ends (1st point is takeoff, last point is landing) ! (decimal degrees) ! -TAIRCRAFTS(4)%SEGLAT = (/ 44.14025, 44.13824, 44.14291, 44.14575, 44.14321,& +TAIRCRAFTS(4)%XSEGLAT = (/ 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,& @@ -791,7 +791,7 @@ TAIRCRAFTS(4)%SEGLAT = (/ 44.14025, 44.13824, 44.14291, 44.14575, 44.14321,& !* longitudes of the segments ends (1st point is takeoff, last point is landing) ! (decimal degrees) ! -TAIRCRAFTS(4)%SEGLON = (/ 0.94868, 0.95712, 0.95820, 0.95265, 0.94556,& +TAIRCRAFTS(4)%XSEGLON = (/ 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,& @@ -803,9 +803,9 @@ TAIRCRAFTS(4)%SEGLON = (/ 0.94868, 0.95712, 0.95820, 0.95265, 0.94556,& !* pressure of the segments ends (1st point is takeoff, last point is landing) ! (pascals) ! -IF (TAIRCRAFTS(4)%ALTDEF) THEN - ALLOCATE(TAIRCRAFTS(4)%SEGP (TAIRCRAFTS(4)%SEG+1)) -TAIRCRAFTS(4)%SEGP = 100. * (/ 992.3, 985.4, 979.9, 974.2, 969.2,& +IF (TAIRCRAFTS(4)%LALTDEF) THEN + ALLOCATE(TAIRCRAFTS(4)%XSEGP (TAIRCRAFTS(4)%NSEG+1)) +TAIRCRAFTS(4)%XSEGP = 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,& @@ -814,8 +814,8 @@ TAIRCRAFTS(4)%SEGP = 100. * (/ 992.3, 985.4, 979.9, 974.2, 969.2,& 934.6, 940.3, 946.0, 951.4, 956.5,& 962.8, 968.1, 973.7, 979.3, 984.9 /) ELSE - ALLOCATE(TAIRCRAFTS(4)%SEGZ (TAIRCRAFTS(4)%SEG+1)) - TAIRCRAFTS(4)%SEGZ = (/8000,8000,8000,8000,8000,& + ALLOCATE(TAIRCRAFTS(4)%XSEGZ (TAIRCRAFTS(4)%NSEG+1)) + TAIRCRAFTS(4)%XSEGZ = (/8000,8000,8000,8000,8000,& 8000,8000,8000,8000,8000,& 8000,8000,8000,8000,8000,& 8000,8000,8000,8000,8000,& @@ -841,15 +841,15 @@ TAIRCRAFTS(5)%NMODEL = 0 ! !* model switch ! -TAIRCRAFTS(5)%MODEL = 'FIX' +TAIRCRAFTS(5)%CMODEL = 'FIX' ! !* aircraft type ! -TAIRCRAFTS(5)%TYPE = 'AIRCRA' +TAIRCRAFTS(5)%CTYPE = 'AIRCRA' !* aircraft flight name ! -TAIRCRAFTS(5)%TITLE = 'SAIB19A' +TAIRCRAFTS(5)%CTITLE = 'SAIB19A' ! !* time step for storage ! @@ -857,28 +857,28 @@ TAIRCRAFTS(5)%TFLYER_TIME%XTSTEP = 30. ! !* take-off date and time ! -TAIRCRAFTS(5)%LAUNCH%nyear = 2007 -TAIRCRAFTS(5)%LAUNCH%nmonth = 04 -TAIRCRAFTS(5)%LAUNCH%nday = 19 -TAIRCRAFTS(5)%LAUNCH%xtime = 43380. +TAIRCRAFTS(5)%TLAUNCH%nyear = 2007 +TAIRCRAFTS(5)%TLAUNCH%nmonth = 04 +TAIRCRAFTS(5)%TLAUNCH%nday = 19 +TAIRCRAFTS(5)%TLAUNCH%xtime = 43380. ! !* number of flight segments ! -TAIRCRAFTS(5)%SEG = 176 +TAIRCRAFTS(5)%NSEG = 176 ! !* initalisation of flag for pressure (T) or Z(F) for aicraft altitude ! -TAIRCRAFTS(5)%ALTDEF = .TRUE. +TAIRCRAFTS(5)%LALTDEF = .TRUE. ! !* allocation of the arrays ! -ALLOCATE(TAIRCRAFTS(5)%SEGTIME(TAIRCRAFTS(5)%SEG )) -ALLOCATE(TAIRCRAFTS(5)%SEGLAT (TAIRCRAFTS(5)%SEG+1)) -ALLOCATE(TAIRCRAFTS(5)%SEGLON (TAIRCRAFTS(5)%SEG+1)) +ALLOCATE(TAIRCRAFTS(5)%XSEGTIME(TAIRCRAFTS(5)%NSEG )) +ALLOCATE(TAIRCRAFTS(5)%XSEGLAT (TAIRCRAFTS(5)%NSEG+1)) +ALLOCATE(TAIRCRAFTS(5)%XSEGLON (TAIRCRAFTS(5)%NSEG+1)) ! !* duration of the segments (seconds) ! -TAIRCRAFTS(5)%SEGTIME = (/ 28, 28, 29, 29, 29, 28,& +TAIRCRAFTS(5)%XSEGTIME = (/ 28, 28, 29, 29, 29, 28,& 28, 28, 29, 26, 28, 27,& 28, 27, 28, 27, 25, 27,& 27, 26, 24, 25, 26, 26,& @@ -913,7 +913,7 @@ TAIRCRAFTS(5)%SEGTIME = (/ 28, 28, 29, 29, 29, 28,& !* latitudes of the segments ends (1st point is takeoff, last point is landing) ! (decimal degrees) ! -TAIRCRAFTS(5)%SEGLAT = (/44.38992, 44.38830, 44.38713, 44.38609, 44.38512,& +TAIRCRAFTS(5)%XSEGLAT = (/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,& @@ -954,7 +954,7 @@ TAIRCRAFTS(5)%SEGLAT = (/44.38992, 44.38830, 44.38713, 44.38609, 44.38512,& !* longitudes of the segments ends (1st point is takeoff, last point is landing) ! (decimal degrees) ! -TAIRCRAFTS(5)%SEGLON = (/ 0.60996, 0.59790, 0.58554, 0.57296, 0.56046,& +TAIRCRAFTS(5)%XSEGLON = (/ 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,& @@ -995,9 +995,9 @@ TAIRCRAFTS(5)%SEGLON = (/ 0.60996, 0.59790, 0.58554, 0.57296, 0.56046,& !* pressure of the segments ends (1st point is takeoff, last point is landing) ! (pascals) ! -IF (TAIRCRAFTS(5)%ALTDEF) THEN - ALLOCATE(TAIRCRAFTS(5)%SEGP (TAIRCRAFTS(5)%SEG+1)) -TAIRCRAFTS(5)%SEGP = 100. * (/ 995.7, 998.1, 998.7, 998.8, 999.1,& +IF (TAIRCRAFTS(5)%LALTDEF) THEN + ALLOCATE(TAIRCRAFTS(5)%XSEGP (TAIRCRAFTS(5)%NSEG+1)) +TAIRCRAFTS(5)%XSEGP = 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,& @@ -1034,8 +1034,8 @@ TAIRCRAFTS(5)%SEGP = 100. * (/ 995.7, 998.1, 998.7, 998.8, 999.1,& 995.4, 995.4, 995.3, 994.8, 994.5,& 994.1, 994.4 /) ELSE - ALLOCATE(TAIRCRAFTS(5)%SEGZ (TAIRCRAFTS(5)%SEG+1)) - TAIRCRAFTS(5)%SEGZ = (/8000,8000,8000,8000,8000,& + ALLOCATE(TAIRCRAFTS(5)%XSEGZ (TAIRCRAFTS(5)%NSEG+1)) + TAIRCRAFTS(5)%XSEGZ = (/8000,8000,8000,8000,8000,& 8000,8000,8000,8000,8000,& 8000,8000,8000,8000,8000,& 8000,8000,8000,8000,8000,& @@ -1089,15 +1089,15 @@ TAIRCRAFTS(6)%NMODEL = 0 ! !* model switch ! -TAIRCRAFTS(6)%MODEL = 'FIX' +TAIRCRAFTS(6)%CMODEL = 'FIX' ! !* aircraft type ! -TAIRCRAFTS(6)%TYPE = 'AIRCRA' +TAIRCRAFTS(6)%CTYPE = 'AIRCRA' !* aircraft flight name ! -TAIRCRAFTS(6)%TITLE = 'SAIB19B' +TAIRCRAFTS(6)%CTITLE = 'SAIB19B' ! !* time step for storage ! @@ -1105,28 +1105,28 @@ TAIRCRAFTS(6)%TFLYER_TIME%XTSTEP = 30. ! !* take-off date and time ! -TAIRCRAFTS(6)%LAUNCH%nyear = 2007 -TAIRCRAFTS(6)%LAUNCH%nmonth = 04 -TAIRCRAFTS(6)%LAUNCH%nday = 19 -TAIRCRAFTS(6)%LAUNCH%xtime = 55992. +TAIRCRAFTS(6)%TLAUNCH%nyear = 2007 +TAIRCRAFTS(6)%TLAUNCH%nmonth = 04 +TAIRCRAFTS(6)%TLAUNCH%nday = 19 +TAIRCRAFTS(6)%TLAUNCH%xtime = 55992. ! !* number of flight segments ! -TAIRCRAFTS(6)%SEG = 179 +TAIRCRAFTS(6)%NSEG = 179 ! !* initalisation of flag for pressure (T) or Z(F) for aicraft altitude ! -TAIRCRAFTS(6)%ALTDEF = .TRUE. +TAIRCRAFTS(6)%LALTDEF = .TRUE. ! !* allocation of the arrays ! -ALLOCATE(TAIRCRAFTS(6)%SEGTIME(TAIRCRAFTS(6)%SEG )) -ALLOCATE(TAIRCRAFTS(6)%SEGLAT (TAIRCRAFTS(6)%SEG+1)) -ALLOCATE(TAIRCRAFTS(6)%SEGLON (TAIRCRAFTS(6)%SEG+1)) +ALLOCATE(TAIRCRAFTS(6)%XSEGTIME(TAIRCRAFTS(6)%NSEG )) +ALLOCATE(TAIRCRAFTS(6)%XSEGLAT (TAIRCRAFTS(6)%NSEG+1)) +ALLOCATE(TAIRCRAFTS(6)%XSEGLON (TAIRCRAFTS(6)%NSEG+1)) ! !* duration of the segments (seconds) ! -TAIRCRAFTS(6)%SEGTIME = (/ 27, 25, 26, 25, 25, 25,& +TAIRCRAFTS(6)%XSEGTIME = (/ 27, 25, 26, 25, 25, 25,& 25, 27, 28, 25, 26, 25,& 26, 26, 26, 26, 25, 27,& 27, 27, 27, 28, 28, 25,& @@ -1160,7 +1160,7 @@ TAIRCRAFTS(6)%SEGTIME = (/ 27, 25, 26, 25, 25, 25,& !* latitudes of the segments ends (1st point is takeoff, last point is landing) ! (decimal degrees) ! -TAIRCRAFTS(6)%SEGLAT = (/ 44.14614, 44.14841, 44.15199, 44.15888, 44.16587,& +TAIRCRAFTS(6)%XSEGLAT = (/ 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,& @@ -1200,7 +1200,7 @@ TAIRCRAFTS(6)%SEGLAT = (/ 44.14614, 44.14841, 44.15199, 44.15888, 44.16587,& !* longitudes of the segments ends (1st point is takeoff, last point is landing) ! (decimal degrees) ! -TAIRCRAFTS(6)%SEGLON = (/-0.91544,-0.91300,-0.91007,-0.90375,-0.89495,& +TAIRCRAFTS(6)%XSEGLON = (/-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,& @@ -1240,9 +1240,9 @@ TAIRCRAFTS(6)%SEGLON = (/-0.91544,-0.91300,-0.91007,-0.90375,-0.89495,& !* pressure of the segments ends (1st point is takeoff, last point is landing) ! (pascals) ! -IF (TAIRCRAFTS(6)%ALTDEF) THEN - ALLOCATE(TAIRCRAFTS(6)%SEGP (TAIRCRAFTS(6)%SEG+1)) -TAIRCRAFTS(6)%SEGP = 100. * (/ 990.1, 990.5, 991.1, 992.6, 993.7,& +IF (TAIRCRAFTS(6)%LALTDEF) THEN + ALLOCATE(TAIRCRAFTS(6)%XSEGP (TAIRCRAFTS(6)%NSEG+1)) +TAIRCRAFTS(6)%XSEGP = 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,& @@ -1279,8 +1279,8 @@ TAIRCRAFTS(6)%SEGP = 100. * (/ 990.1, 990.5, 991.1, 992.6, 993.7,& 999.2, 999.2, 999.2, 998.9, 998.4,& 997.7, 997.1, 996.8, 996.9, 996.9 /) ELSE - ALLOCATE(TAIRCRAFTS(6)%SEGZ (TAIRCRAFTS(6)%SEG+1)) - TAIRCRAFTS(6)%SEGZ = (/8000,8000,8000,8000,8000,& + ALLOCATE(TAIRCRAFTS(6)%XSEGZ (TAIRCRAFTS(6)%NSEG+1)) + TAIRCRAFTS(6)%XSEGZ = (/8000,8000,8000,8000,8000,& 8000,8000,8000,8000,8000,& 8000,8000,8000,8000,8000,& 8000,8000,8000,8000,8000,& @@ -1335,15 +1335,15 @@ TAIRCRAFTS(7)%NMODEL = 0 ! !* model switch ! -TAIRCRAFTS(7)%MODEL = 'FIX' +TAIRCRAFTS(7)%CMODEL = 'FIX' ! !* aircraft type ! -TAIRCRAFTS(7)%TYPE = 'AIRCRA' +TAIRCRAFTS(7)%CTYPE = 'AIRCRA' !* aircraft flight name ! -TAIRCRAFTS(7)%TITLE = 'TEST_19' +TAIRCRAFTS(7)%CTITLE = 'TEST_19' ! !* time step for storage ! @@ -1351,28 +1351,28 @@ TAIRCRAFTS(7)%TFLYER_TIME%XTSTEP = 60. ! !* take-off date and time ! -TAIRCRAFTS(7)%LAUNCH%nyear = 2007 -TAIRCRAFTS(7)%LAUNCH%nmonth = 04 -TAIRCRAFTS(7)%LAUNCH%nday = 19 -TAIRCRAFTS(7)%LAUNCH%xtime = 43500. +TAIRCRAFTS(7)%TLAUNCH%nyear = 2007 +TAIRCRAFTS(7)%TLAUNCH%nmonth = 04 +TAIRCRAFTS(7)%TLAUNCH%nday = 19 +TAIRCRAFTS(7)%TLAUNCH%xtime = 43500. ! !* number of flight segments ! -TAIRCRAFTS(7)%SEG = 207 +TAIRCRAFTS(7)%NSEG = 207 ! !* initalisation of flag for pressure (T) or Z(F) for aicraft altitude ! -TAIRCRAFTS(7)%ALTDEF = .TRUE. +TAIRCRAFTS(7)%LALTDEF = .TRUE. ! !* allocation of the arrays ! -ALLOCATE(TAIRCRAFTS(7)%SEGTIME(TAIRCRAFTS(7)%SEG )) -ALLOCATE(TAIRCRAFTS(7)%SEGLAT (TAIRCRAFTS(7)%SEG+1)) -ALLOCATE(TAIRCRAFTS(7)%SEGLON (TAIRCRAFTS(7)%SEG+1)) +ALLOCATE(TAIRCRAFTS(7)%XSEGTIME(TAIRCRAFTS(7)%NSEG )) +ALLOCATE(TAIRCRAFTS(7)%XSEGLAT (TAIRCRAFTS(7)%NSEG+1)) +ALLOCATE(TAIRCRAFTS(7)%XSEGLON (TAIRCRAFTS(7)%NSEG+1)) ! !* duration of the segments (seconds) ! -TAIRCRAFTS(7)%SEGTIME = (/ 60, 60, 60, 60, 60, 60,& +TAIRCRAFTS(7)%XSEGTIME = (/ 60, 60, 60, 60, 60, 60,& 60, 60, 60, 60, 60, 60,& 60, 60, 60, 60, 60, 60,& 60, 60, 60, 60, 60, 60,& @@ -1411,7 +1411,7 @@ TAIRCRAFTS(7)%SEGTIME = (/ 60, 60, 60, 60, 60, 60,& !* latitudes of the segments ends (1st point is takeoff, last point is landing) ! (decimal degrees) ! -TAIRCRAFTS(7)%SEGLAT = (/44.39766, 44.39865, 44.40084, 44.39968, 44.40132,& +TAIRCRAFTS(7)%XSEGLAT = (/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,& @@ -1457,7 +1457,7 @@ TAIRCRAFTS(7)%SEGLAT = (/44.39766, 44.39865, 44.40084, 44.39968, 44.40132,& !* longitudes of the segments ends (1st point is takeoff, last point is landing) ! (decimal degrees) ! -TAIRCRAFTS(7)%SEGLON = (/0.76309, 0.76243, 0.74626, 0.71975, 0.69001,& +TAIRCRAFTS(7)%XSEGLON = (/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,& @@ -1503,9 +1503,9 @@ TAIRCRAFTS(7)%SEGLON = (/0.76309, 0.76243, 0.74626, 0.71975, 0.69001,& !* pressure of the segments ends (1st point is takeoff, last point is landing) ! (pascals) ! -IF (TAIRCRAFTS(7)%ALTDEF) THEN - ALLOCATE(TAIRCRAFTS(7)%SEGP (TAIRCRAFTS(7)%SEG+1)) -TAIRCRAFTS(7)%SEGP = 100. * (/1013.5,1012.2, 999.9, 993.1, 992.3,& +IF (TAIRCRAFTS(7)%LALTDEF) THEN + ALLOCATE(TAIRCRAFTS(7)%XSEGP (TAIRCRAFTS(7)%NSEG+1)) +TAIRCRAFTS(7)%XSEGP = 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,& @@ -1548,8 +1548,8 @@ TAIRCRAFTS(7)%SEGP = 100. * (/1013.5,1012.2, 999.9, 993.1, 992.3,& 993.5, 994.8, 995.2, 999.8,1012.4,& 1012.4,1012.4,1012.4 /) ELSE - ALLOCATE(TAIRCRAFTS(7)%SEGZ (TAIRCRAFTS(7)%SEG+1)) - TAIRCRAFTS(7)%SEGZ = (/8000,8000,8000,8000,8000,& + ALLOCATE(TAIRCRAFTS(7)%XSEGZ (TAIRCRAFTS(7)%NSEG+1)) + TAIRCRAFTS(7)%XSEGZ = (/8000,8000,8000,8000,8000,& 8000,8000,8000,8000,8000,& 8000,8000,8000,8000,8000,& 8000,8000,8000,8000,8000,& @@ -1609,15 +1609,15 @@ TAIRCRAFTS(8)%NMODEL = 0 ! !* model switch ! -TAIRCRAFTS(8)%MODEL = 'FIX' +TAIRCRAFTS(8)%CMODEL = 'FIX' ! !* aircraft type ! -TAIRCRAFTS(8)%TYPE = 'AIRCRA' +TAIRCRAFTS(8)%CTYPE = 'AIRCRA' !* aircraft flight name ! -TAIRCRAFTS(8)%TITLE = 'DIMO22B' +TAIRCRAFTS(8)%CTITLE = 'DIMO22B' ! !* time step for storage ! @@ -1625,28 +1625,28 @@ TAIRCRAFTS(8)%TFLYER_TIME%XTSTEP = 60. ! !* take-off date and time ! -TAIRCRAFTS(8)%LAUNCH%nyear = 2007 -TAIRCRAFTS(8)%LAUNCH%nmonth = 04 -TAIRCRAFTS(8)%LAUNCH%nday = 22 -TAIRCRAFTS(8)%LAUNCH%xtime = 45720. +TAIRCRAFTS(8)%TLAUNCH%nyear = 2007 +TAIRCRAFTS(8)%TLAUNCH%nmonth = 04 +TAIRCRAFTS(8)%TLAUNCH%nday = 22 +TAIRCRAFTS(8)%TLAUNCH%xtime = 45720. ! !* number of flight segments ! -TAIRCRAFTS(8)%SEG = 210 +TAIRCRAFTS(8)%NSEG = 210 ! !* initalisation of flag for pressure (T) or Z(F) for aicraft altitude ! -TAIRCRAFTS(8)%ALTDEF = .TRUE. +TAIRCRAFTS(8)%LALTDEF = .TRUE. ! !* allocation of the arrays ! -ALLOCATE(TAIRCRAFTS(8)%SEGTIME(TAIRCRAFTS(8)%SEG )) -ALLOCATE(TAIRCRAFTS(8)%SEGLAT (TAIRCRAFTS(8)%SEG+1)) -ALLOCATE(TAIRCRAFTS(8)%SEGLON (TAIRCRAFTS(8)%SEG+1)) +ALLOCATE(TAIRCRAFTS(8)%XSEGTIME(TAIRCRAFTS(8)%NSEG )) +ALLOCATE(TAIRCRAFTS(8)%XSEGLAT (TAIRCRAFTS(8)%NSEG+1)) +ALLOCATE(TAIRCRAFTS(8)%XSEGLON (TAIRCRAFTS(8)%NSEG+1)) ! !* duration of the segments (seconds) ! -TAIRCRAFTS(8)%SEGTIME = (/ 60, 60, 60, 60, 60, 60,& +TAIRCRAFTS(8)%XSEGTIME = (/ 60, 60, 60, 60, 60, 60,& 60, 60, 60, 60, 60, 60,& 60, 60, 60, 60, 60, 60,& 60, 60, 60, 60, 60, 60,& @@ -1685,7 +1685,7 @@ TAIRCRAFTS(8)%SEGTIME = (/ 60, 60, 60, 60, 60, 60,& !* latitudes of the segments ends (1st point is takeoff, last point is landing) ! (decimal degrees) ! -TAIRCRAFTS(8)%SEGLAT = (/ 44.40018, 44.39977, 44.39868, 44.39992, 44.39773,& +TAIRCRAFTS(8)%XSEGLAT = (/ 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,& @@ -1733,7 +1733,7 @@ TAIRCRAFTS(8)%SEGLAT = (/ 44.40018, 44.39977, 44.39868, 44.39992, 44.39773,& !* longitudes of the segments ends (1st point is takeoff, last point is landing) ! (decimal degrees) ! -TAIRCRAFTS(8)%SEGLON = (/ 0.75057, 0.72578, 0.69760, 0.66704, 0.63457,& +TAIRCRAFTS(8)%XSEGLON = (/ 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,& @@ -1781,9 +1781,9 @@ TAIRCRAFTS(8)%SEGLON = (/ 0.75057, 0.72578, 0.69760, 0.66704, 0.63457,& !* pressure of the segments ends (1st point is takeoff, last point is landing) ! (pascals) ! -IF (TAIRCRAFTS(8)%ALTDEF) THEN - ALLOCATE(TAIRCRAFTS(8)%SEGP (TAIRCRAFTS(8)%SEG+1)) -TAIRCRAFTS(8)%SEGP = 100. * (/1002.7, 994.1, 993.0, 994.6, 994.2,& +IF (TAIRCRAFTS(8)%LALTDEF) THEN + ALLOCATE(TAIRCRAFTS(8)%XSEGP (TAIRCRAFTS(8)%NSEG+1)) +TAIRCRAFTS(8)%XSEGP = 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,& @@ -1827,8 +1827,8 @@ TAIRCRAFTS(8)%SEGP = 100. * (/1002.7, 994.1, 993.0, 994.6, 994.2,& 995.1, 995.0, 986.7, 992.4,1009.3,& 1010.1 /) ELSE - ALLOCATE(TAIRCRAFTS(8)%SEGZ (TAIRCRAFTS(8)%SEG+1)) - TAIRCRAFTS(8)%SEGZ = (/8000,8000,8000,8000,8000,& + ALLOCATE(TAIRCRAFTS(8)%XSEGZ (TAIRCRAFTS(8)%NSEG+1)) + TAIRCRAFTS(8)%XSEGZ = (/8000,8000,8000,8000,8000,& 8000,8000,8000,8000,8000,& 8000,8000,8000,8000,8000,& 8000,8000,8000,8000,8000,& @@ -1888,15 +1888,15 @@ TAIRCRAFTS(9)%NMODEL = 0 ! !* model switch ! -TAIRCRAFTS(9)%MODEL = 'FIX' +TAIRCRAFTS(9)%CMODEL = 'FIX' ! !* aircraft type ! -TAIRCRAFTS(9)%TYPE = 'AIRCRA' +TAIRCRAFTS(9)%CTYPE = 'AIRCRA' !* aircraft flight name ! -TAIRCRAFTS(9)%TITLE = 'DIMO23A' +TAIRCRAFTS(9)%CTITLE = 'DIMO23A' ! !* time step for storage ! @@ -1904,28 +1904,28 @@ TAIRCRAFTS(9)%TFLYER_TIME%XTSTEP = 60. ! !* take-off date and time ! -TAIRCRAFTS(9)%LAUNCH%nyear = 2007 -TAIRCRAFTS(9)%LAUNCH%nmonth = 04 -TAIRCRAFTS(9)%LAUNCH%nday = 23 -TAIRCRAFTS(9)%LAUNCH%xtime = 28080. +TAIRCRAFTS(9)%TLAUNCH%nyear = 2007 +TAIRCRAFTS(9)%TLAUNCH%nmonth = 04 +TAIRCRAFTS(9)%TLAUNCH%nday = 23 +TAIRCRAFTS(9)%TLAUNCH%xtime = 28080. ! !* number of flight segments ! -TAIRCRAFTS(9)%SEG = 217 +TAIRCRAFTS(9)%NSEG = 217 ! !* initalisation of flag for pressure (T) or Z(F) for aicraft altitude ! -TAIRCRAFTS(9)%ALTDEF = .TRUE. +TAIRCRAFTS(9)%LALTDEF = .TRUE. ! !* allocation of the arrays ! -ALLOCATE(TAIRCRAFTS(9)%SEGTIME(TAIRCRAFTS(9)%SEG )) -ALLOCATE(TAIRCRAFTS(9)%SEGLAT (TAIRCRAFTS(9)%SEG+1)) -ALLOCATE(TAIRCRAFTS(9)%SEGLON (TAIRCRAFTS(9)%SEG+1)) +ALLOCATE(TAIRCRAFTS(9)%XSEGTIME(TAIRCRAFTS(9)%NSEG )) +ALLOCATE(TAIRCRAFTS(9)%XSEGLAT (TAIRCRAFTS(9)%NSEG+1)) +ALLOCATE(TAIRCRAFTS(9)%XSEGLON (TAIRCRAFTS(9)%NSEG+1)) ! !* duration of the segments (seconds) ! -TAIRCRAFTS(9)%SEGTIME = (/ 60, 60, 60, 60, 60, 60,& +TAIRCRAFTS(9)%XSEGTIME = (/ 60, 60, 60, 60, 60, 60,& 60, 60, 60, 60, 60, 60,& 60, 60, 60, 60, 60, 60,& 60, 60, 60, 60, 60, 60,& @@ -1967,7 +1967,7 @@ TAIRCRAFTS(9)%SEGTIME = (/ 60, 60, 60, 60, 60, 60,& !* latitudes of the segments ends (1st point is takeoff, last point is landing) ! (decimal degrees) ! -TAIRCRAFTS(9)%SEGLAT = (/ 44.39751, 44.39753, 44.39752, 44.39853, 44.40034,& +TAIRCRAFTS(9)%XSEGLAT = (/ 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,& @@ -2017,7 +2017,7 @@ TAIRCRAFTS(9)%SEGLAT = (/ 44.39751, 44.39753, 44.39752, 44.39853, 44.40034,& !* longitudes of the segments ends (1st point is takeoff, last point is landing) ! (decimal degrees) ! -TAIRCRAFTS(9)%SEGLON = (/ 0.76306, 0.76307, 0.76305, 0.76269, 0.74580,& +TAIRCRAFTS(9)%XSEGLON = (/ 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,& @@ -2067,9 +2067,9 @@ TAIRCRAFTS(9)%SEGLON = (/ 0.76306, 0.76307, 0.76305, 0.76269, 0.74580,& ! (pascals) ! -IF (TAIRCRAFTS(9)%ALTDEF) THEN - ALLOCATE(TAIRCRAFTS(9)%SEGP (TAIRCRAFTS(9)%SEG+1)) -TAIRCRAFTS(9)%SEGP = 100. * (/ 1014.8,1014.8,1014.8,1014.8,1005.5,& +IF (TAIRCRAFTS(9)%LALTDEF) THEN + ALLOCATE(TAIRCRAFTS(9)%XSEGP (TAIRCRAFTS(9)%NSEG+1)) +TAIRCRAFTS(9)%XSEGP = 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,& @@ -2114,8 +2114,8 @@ TAIRCRAFTS(9)%SEGP = 100. * (/ 1014.8,1014.8,1014.8,1014.8,1005.5,& 965.9, 985.1,1003.1,1013.9,1013.9,& 1013.9,1013.9,1013.9 /) ELSE - ALLOCATE(TAIRCRAFTS(9)%SEGZ (TAIRCRAFTS(9)%SEG+1)) - TAIRCRAFTS(9)%SEGZ = (/8000,8000,8000,8000,8000,& + ALLOCATE(TAIRCRAFTS(9)%XSEGZ (TAIRCRAFTS(9)%NSEG+1)) + TAIRCRAFTS(9)%XSEGZ = (/8000,8000,8000,8000,8000,& 8000,8000,8000,8000,8000,& 8000,8000,8000,8000,8000,& 8000,8000,8000,8000,8000,& diff --git a/src/MNH/ini_aircraft_balloon.f90 b/src/MNH/ini_aircraft_balloon.f90 index 5a9c1b141..1352e6577 100644 --- a/src/MNH/ini_aircraft_balloon.f90 +++ b/src/MNH/ini_aircraft_balloon.f90 @@ -215,84 +215,85 @@ ENDIF ! IF (TPFLYER%NMODEL == 0) ISTORE=0 IF (TPFLYER%NMODEL > 0) THEN - WRITE(ILUOUT,*) 'Aircraft or Balloon:',TPFLYER%TITLE,' nmodel=',TPFLYER%NMODEL + WRITE(ILUOUT,*) 'Aircraft or Balloon:',TPFLYER%CTITLE,' nmodel=',TPFLYER%NMODEL ENDIF ! ! allocate( tpflyer%tflyer_time%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)) +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,KRR)) +ALLOCATE(TPFLYER%XSV (ISTORE,KSV)) +ALLOCATE(TPFLYER%XRTZ (ISTORE,KKU)) +ALLOCATE(TPFLYER%XRZ (ISTORE,KKU,KRR)) +ALLOCATE(TPFLYER%XFFZ (ISTORE,KKU)) +ALLOCATE(TPFLYER%XIWCZ(ISTORE,KKU)) +ALLOCATE(TPFLYER%XLWCZ(ISTORE,KKU)) +ALLOCATE(TPFLYER%XCIZ (ISTORE,KKU)) IF (CCLOUD=='LIMA') THEN - ALLOCATE(TPFLYER%CCZ (ISTORE,KKU)) - ALLOCATE(TPFLYER%CRZ (ISTORE,KKU)) + ALLOCATE(TPFLYER%XCCZ(ISTORE,KKU)) + ALLOCATE(TPFLYER%XCRZ(ISTORE,KKU)) ENDIF -ALLOCATE(TPFLYER%CRARE(ISTORE,KKU)) -ALLOCATE(TPFLYER%CRARE_ATT(ISTORE,KKU)) -ALLOCATE(TPFLYER%WZ(ISTORE,KKU)) -ALLOCATE(TPFLYER%ZZ(ISTORE,KKU)) +ALLOCATE(TPFLYER%XCRARE (ISTORE,KKU)) +ALLOCATE(TPFLYER%XCRARE_ATT(ISTORE,KKU)) +ALLOCATE(TPFLYER%XWZ (ISTORE,KKU)) +ALLOCATE(TPFLYER%XZZ (ISTORE,KKU)) IF (OUSETKE) THEN - ALLOCATE(TPFLYER%TKE (ISTORE)) + ALLOCATE(TPFLYER%XTKE(ISTORE)) ELSE - ALLOCATE(TPFLYER%TKE (0)) + ALLOCATE(TPFLYER%XTKE(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 +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,KSV)) +! +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%XCIZ = XUNDEF IF (CCLOUD=='LIMA') THEN - TPFLYER%CRZ = XUNDEF - TPFLYER%CCZ = XUNDEF + TPFLYER%XCRZ = XUNDEF + TPFLYER%XCCZ = XUNDEF ENDIF -TPFLYER%IWCZ = XUNDEF -TPFLYER%LWCZ = XUNDEF -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 +TPFLYER%XIWCZ = XUNDEF +TPFLYER%XLWCZ = XUNDEF +TPFLYER%XCRARE = XUNDEF +TPFLYER%XCRARE_ATT = XUNDEF +TPFLYER%XWZ = XUNDEF +TPFLYER%XZZ = XUNDEF +TPFLYER%XTKE = XUNDEF +TPFLYER%XTSRAD = XUNDEF +TPFLYER%XZS = XUNDEF +TPFLYER%XTKE_DISS = XUNDEF +! +TPFLYER%XTHW_FLUX = XUNDEF +TPFLYER%XRCW_FLUX = XUNDEF +TPFLYER%XSVW_FLUX = XUNDEF + END SUBROUTINE ALLOCATE_FLYER !---------------------------------------------------------------------------- !---------------------------------------------------------------------------- @@ -310,101 +311,99 @@ CLASS(TBALLOONDATA), INTENT(INOUT) :: TPFLYER 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%CMODEL == 'MOB' .AND. TPFLYER%NMODEL /= 0) TPFLYER%NMODEL=1 IF (TPFLYER%NMODEL > NMODEL) TPFLYER%NMODEL=0 IF ( IMI /= TPFLYER%NMODEL ) RETURN ! LFLYER=.TRUE. ! -IF (TPFLYER%TITLE==' ') THEN - WRITE(TPFLYER%TITLE,FMT='(A6,I2.2)') TPFLYER%TYPE,KNBR +IF (TPFLYER%CTITLE==' ') THEN + WRITE(TPFLYER%CTITLE,FMT='(A6,I2.2)') TPFLYER%CTYPE,KNBR END IF ! IF ( CPROGRAM == 'MESONH' .OR. CPROGRAM == 'SPAWN ' .OR. CPROGRAM == 'REAL ' ) THEN ! read the current location in the FM_FILE ! - TZFIELD = TFIELDMETADATA( & - CMNHNAME = TRIM(TPFLYER%TITLE)//'LAT', & - CSTDNAME = '', & - CLONGNAME = TRIM(TPFLYER%TITLE)//'LAT', & - CUNITS = 'degree', & - CDIR = '--', & - CCOMMENT = '', & - NGRID = 0, & - NTYPE = TYPEREAL, & - NDIMS = 0, & - LTIMEDEP = .TRUE. ) + 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 - WRITE(ILUOUT,*) "INI_LAUNCH: Initial location take for ",TPFLYER%TITLE + WRITE(ILUOUT,*) "INI_LAUNCH: Initial location take for ",TPFLYER%CTITLE ELSE - TZFIELD = TFIELDMETADATA( & - CMNHNAME = TRIM(TPFLYER%TITLE)//'LON', & - CSTDNAME = '', & - CLONGNAME = TRIM(TPFLYER%TITLE)//'LON', & - CUNITS = 'degree', & - CDIR = '--', & - CCOMMENT = '', & - NGRID = 0, & - NTYPE = TYPEREAL, & - NDIMS = 0, & - LTIMEDEP = .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%TITLE)//'ALT', & - CSTDNAME = '', & - CLONGNAME = TRIM(TPFLYER%TITLE)//'ALT', & - CUNITS = 'm', & - CDIR = '--', & - CCOMMENT = '', & - NGRID = 0, & - NTYPE = TYPEREAL, & - NDIMS = 0, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_read(TPINIFILE,TZFIELD,TPFLYER%Z_CUR) + 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) ! - TPFLYER%P_CUR = XUNDEF + TPFLYER%XP_CUR = XUNDEF ! - TZFIELD = TFIELDMETADATA( & - CMNHNAME = TRIM(TPFLYER%TITLE)//'WASCENT', & - CSTDNAME = '', & - CLONGNAME = TRIM(TPFLYER%TITLE)//'WASCENT', & - CUNITS = 'm s-1', & - CDIR = '--', & - CCOMMENT = '', & - NGRID = 0, & - NTYPE = TYPEREAL, & - NDIMS = 0, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_read(TPINIFILE,TZFIELD,TPFLYER%WASCENT) + 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%TITLE)//'RHO', & - CSTDNAME = '', & - CLONGNAME = TRIM(TPFLYER%TITLE)//'RHO', & - CUNITS = 'kg m-3', & - CDIR = '--', & - CCOMMENT = '', & - NGRID = 0, & - NTYPE = TYPEREAL, & - NDIMS = 0, & - LTIMEDEP = .TRUE. ) - CALL IO_Field_read(TPINIFILE,TZFIELD,TPFLYER%RHO) + 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) ! - CALL SM_XYHAT(PLATOR,PLONOR,& - ZLAT,ZLON, & - TPFLYER%X_CUR, TPFLYER%Y_CUR ) - TPFLYER%FLY = .TRUE. + CALL SM_XYHAT( PLATOR, PLONOR, ZLAT, ZLON, TPFLYER%XX_CUR, TPFLYER%XY_CUR ) + TPFLYER%LFLY = .TRUE. WRITE(ILUOUT,*) & - "INI_LAUNCH: Current location read in FM file for ",TPFLYER%TITLE - IF (TPFLYER%TYPE== 'CVBALL') THEN + "INI_LAUNCH: Current location read in FM file for ",TPFLYER%CTITLE + IF (TPFLYER%CTYPE== 'CVBALL') THEN WRITE(ILUOUT,*) & - " Lat=",ZLAT," Lon=",ZLON," Alt=",TPFLYER%Z_CUR," Wasc=",TPFLYER%WASCENT - ELSE IF (TPFLYER%TYPE== 'ISODEN') THEN + " Lat=",ZLAT," Lon=",ZLON," Alt=",TPFLYER%XZ_CUR," Wasc=",TPFLYER%XWASCENT + ELSE IF (TPFLYER%CTYPE== 'ISODEN') THEN WRITE(ILUOUT,*) & - " Lat=",ZLAT," Lon=",ZLON," Rho=",TPFLYER%RHO + " Lat=",ZLAT," Lon=",ZLON," Rho=",TPFLYER%XRHO END IF ! TPFLYER%TFLYER_TIME%XTSTEP = MAX ( PTSTEP, TPFLYER%TFLYER_TIME%XTSTEP ) @@ -416,35 +415,28 @@ ELSE IF (CPROGRAM == 'DIAG ' ) THEN ! 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. + 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. WRITE(ILUOUT,*) & - "INI_LAUNCH: Current location read in MODD_DIAG_FLAG for ",TPFLYER%TITLE + "INI_LAUNCH: Current location read in MODD_DIAG_FLAG for ",TPFLYER%CTITLE WRITE(ILUOUT,*) & - " Lat=",ZLAT," Lon=",ZLON," Alt=",TPFLYER%Z_CUR + " Lat=",ZLAT," Lon=",ZLON," Alt=",TPFLYER%XZ_CUR END IF ! TPFLYER%TFLYER_TIME%XTSTEP = MAX (XSTEP_AIRCRAFT_BALLOON , TPFLYER%TFLYER_TIME%XTSTEP ) 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','') +IF ( TPFLYER%XLATLAUNCH == XUNDEF .OR. TPFLYER%XLONLAUNCH == XUNDEF ) THEN + CMNHMSG(1) = 'Error in balloon initial position (balloon ' // TRIM( TPFLYER%CTITLE ) // ' )' + CMNHMSG(2) = 'either LATitude or LONgitude is not given' + CMNHMSG(3) = 'Check your INI_BALLOON routine' + CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_AIRCRAFT_BALLOON' ) END IF ! -CALL SM_XYHAT(PLATOR,PLONOR, & - TPFLYER%LAT, TPFLYER%LON, & - TPFLYER%XLAUNCH, TPFLYER%YLAUNCH ) +CALL SM_XYHAT( PLATOR, PLONOR, TPFLYER%XLATLAUNCH, TPFLYER%XLONLAUNCH, TPFLYER%XXLAUNCH, TPFLYER%XYLAUNCH ) ! END SUBROUTINE INI_LAUNCH !---------------------------------------------------------------------------- @@ -454,57 +446,47 @@ SUBROUTINE INI_FLIGHT(KNBR,TPFLYER) INTEGER, INTENT(IN) :: KNBR CLASS(TAIRCRAFTDATA), INTENT(INOUT) :: TPFLYER ! -IF (TPFLYER%MODEL == 'MOB' .AND. TPFLYER%NMODEL /= 0) TPFLYER%NMODEL=1 +IF (TPFLYER%CMODEL == 'MOB' .AND. TPFLYER%NMODEL /= 0) TPFLYER%NMODEL=1 IF (TPFLYER%NMODEL > NMODEL) TPFLYER%NMODEL=0 IF ( IMI /= TPFLYER%NMODEL ) RETURN ! LFLYER=.TRUE. ! TPFLYER%TFLYER_TIME%XTSTEP = MAX ( PTSTEP, TPFLYER%TFLYER_TIME%XTSTEP ) -! -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','') + +IF (TPFLYER%CTITLE==' ') THEN + WRITE(TPFLYER%CTITLE,FMT='(A6,I2.2)') TPFLYER%CTYPE,KNBR +END IF + +IF ( TPFLYER%NSEG == 0 ) THEN + CMNHMSG(1) = 'Error in aircraft flight path (aircraft ' // TRIM( TPFLYER%CTITLE ) // ' )' + CMNHMSG(2) = 'There is ZERO flight segment defined.' + CMNHMSG(3) = 'Check your INI_AIRCRAFT routine' + 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','') +IF ( ANY(TPFLYER%XSEGLAT(:)==XUNDEF) .OR. ANY(TPFLYER%XSEGLON(:)==XUNDEF) ) THEN + CMNHMSG(1) = 'Error in aircraft flight path (aircraft ' // TRIM( TPFLYER%CTITLE ) // ' )' + CMNHMSG(2) = 'either LATitude or LONgitude segment' + CMNHMSG(3) = 'definiton is not complete.' + CMNHMSG(4) = 'Check your INI_AIRCRAFT routine' + CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_FLIGHT' ) END IF ! -ALLOCATE(TPFLYER%SEGX(TPFLYER%SEG+1)) -ALLOCATE(TPFLYER%SEGY(TPFLYER%SEG+1)) +ALLOCATE(TPFLYER%XSEGX(TPFLYER%NSEG+1)) +ALLOCATE(TPFLYER%XSEGY(TPFLYER%NSEG+1)) ! -DO JSEG=1,TPFLYER%SEG+1 - CALL SM_XYHAT(PLATOR,PLONOR, & - TPFLYER%SEGLAT(JSEG), TPFLYER%SEGLON(JSEG), & - TPFLYER%SEGX(JSEG), TPFLYER%SEGY(JSEG) ) +DO JSEG=1,TPFLYER%NSEG+1 + CALL SM_XYHAT( PLATOR, PLONOR, TPFLYER%XSEGLAT(JSEG), TPFLYER%XSEGLON(JSEG), TPFLYER%XSEGX(JSEG), TPFLYER%XSEGY(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','') +IF ( ANY(TPFLYER%XSEGTIME(:)==XUNDEF) ) THEN + CMNHMSG(1) = 'Error in aircraft flight path (aircraft ' // TRIM( TPFLYER%CTITLE ) // ' )' + CMNHMSG(2) = 'definiton of segment duration is not complete.' + CMNHMSG(3) = 'Check your INI_AIRCRAFT routine' + CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_AIRCRAFT_BALLOON' ) END IF -! -! -IF (TPFLYER%TITLE==' ') THEN - WRITE(TPFLYER%TITLE,FMT='(A6,I2.2)') TPFLYER%TYPE,KNBR -END IF -! + END SUBROUTINE INI_FLIGHT !---------------------------------------------------------------------------- !---------------------------------------------------------------------------- diff --git a/src/MNH/ini_balloon.f90 b/src/MNH/ini_balloon.f90 index 68da88553..f9f2d1cd0 100644 --- a/src/MNH/ini_balloon.f90 +++ b/src/MNH/ini_balloon.f90 @@ -129,33 +129,33 @@ IF ( NBALLOONS < 1 ) RETURN !* model number ! TBALLOONS(1)%NMODEL = 0 -TBALLOONS(1)%MODEL = 'MOB' +TBALLOONS(1)%CMODEL = 'MOB' ! !* balloon type ! -TBALLOONS(1)%TYPE = 'CVBALL' +TBALLOONS(1)%CTYPE = 'CVBALL' ! !* balloon name ! -TBALLOONS(1)%TITLE = 'CVB1MOBI' +TBALLOONS(1)%CTITLE = 'CVB1MOBI' ! !* launching date and time ! -TBALLOONS(1)%LAUNCH%nyear = 1999 -TBALLOONS(1)%LAUNCH%nmonth = 09 -TBALLOONS(1)%LAUNCH%nday = 19 -TBALLOONS(1)%LAUNCH%xtime = 32460. +TBALLOONS(1)%TLAUNCH%nyear = 1999 +TBALLOONS(1)%TLAUNCH%nmonth = 09 +TBALLOONS(1)%TLAUNCH%nday = 19 +TBALLOONS(1)%TLAUNCH%xtime = 32460. ! !* latitude and longitude of launching site (decimal degree) ! -TBALLOONS(1)%LAT = 45.800 -TBALLOONS(1)%LON = 8.629 +TBALLOONS(1)%XLATLAUNCH = 45.800 +TBALLOONS(1)%XLONLAUNCH = 8.629 ! !* altitude of the launching site for 'RADIOS' !* altitude or pressure of the flight level for 'ISODEN' ! -!TBALLOONS(1)%ALT = 3959. -TBALLOONS(1)%PRES = 98450. +!TBALLOONS(1)%XALTLAUNCH = 3959. +TBALLOONS(1)%XPRES = 98450. ! !* time step for data storage (s) ! @@ -163,18 +163,18 @@ TBALLOONS(1)%TFLYER_TIME%XTSTEP = 20. ! !* ascentional vertical speed of the ballon (in calm air) (for 'RADIOS') ! -TBALLOONS(1)%WASCENT = 0. +TBALLOONS(1)%XWASCENT = 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') ! -TBALLOONS(1)%AERODRAG = 0.44 -TBALLOONS(1)%INDDRAG = 0.014 -TBALLOONS(1)%VOLUME = 3.040 -TBALLOONS(1)%MASS = 2.4516 -TBALLOONS(1)%DIAMETER = ((3.*TBALLOONS(1)%VOLUME)/(4.*XPI))**(1./3.) +TBALLOONS(1)%XAERODRAG = 0.44 +TBALLOONS(1)%XINDDRAG = 0.014 +TBALLOONS(1)%XVOLUME = 3.040 +TBALLOONS(1)%XMASS = 2.4516 +TBALLOONS(1)%XDIAMETER = ((3.*TBALLOONS(1)%XVOLUME)/(4.*XPI))**(1./3.) ! IF ( NBALLOONS < 2 ) RETURN #else @@ -193,29 +193,29 @@ TBALLOONS(2)%MODEL = 'MOB' ! !* balloon type ! -TBALLOONS(2)%TYPE = 'CVBALL' +TBALLOONS(2)%CTYPE = 'CVBALL' ! !* balloon name ! -TBALLOONS(2)%TITLE = 'CVB2MOBI' +TBALLOONS(2)%CTITLE = 'CVB2MOBI' ! !* launching date and time ! -TBALLOONS(2)%LAUNCH%nyear = 1999 -TBALLOONS(2)%LAUNCH%nmonth = 09 -TBALLOONS(2)%LAUNCH%nday = 19 -TBALLOONS(2)%LAUNCH%xtime = 39660. +TBALLOONS(2)%TLAUNCH%nyear = 1999 +TBALLOONS(2)%TLAUNCH%nmonth = 09 +TBALLOONS(2)%TLAUNCH%nday = 19 +TBALLOONS(2)%TLAUNCH%xtime = 39660. ! !* latitude and longitude of launching site (decimal degree) ! -TBALLOONS(2)%LAT = 45.800 -TBALLOONS(2)%LON = 8.630 +TBALLOONS(2)%XLATLAUNCH = 45.800 +TBALLOONS(2)%XLONLAUNCH = 8.630 ! !* altitude of the launching site for 'RADIOS' !* altitude or pressure of the flight level for 'ISODEN' ! -!TBALLOONS(2)%ALT = 3959. -TBALLOONS(2)%PRES = 98490. +!TBALLOONS(2)%XALTLAUNCH = 3959. +TBALLOONS(2)%XPRES = 98490. ! !* time step for data storage (s) ! @@ -223,18 +223,18 @@ TBALLOONS(2)%TFLYER_TIME%XTSTEP = 20. ! !* ascentional vertical speed of the ballon (in calm air) (for 'RADIOS') ! -TBALLOONS(2)%WASCENT = 0. +TBALLOONS(2)%XWASCENT = 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') ! -TBALLOONS(2)%AERODRAG = 0.44 -TBALLOONS(2)%INDDRAG = 0.014 -TBALLOONS(2)%VOLUME = 3.040 -TBALLOONS(2)%MASS = 2.58087 -TBALLOONS(2)%DIAMETER = ((3.*TBALLOONS(2)%VOLUME)/(4.*XPI))**(1./3.) +TBALLOONS(2)%XAERODRAG = 0.44 +TBALLOONS(2)%XINDDRAG = 0.014 +TBALLOONS(2)%XVOLUME = 3.040 +TBALLOONS(2)%XMASS = 2.58087 +TBALLOONS(2)%XDIAMETER = ((3.*TBALLOONS(2)%XVOLUME)/(4.*XPI))**(1./3.) ! IF ( NBALLOONS < 3 ) RETURN #else @@ -249,33 +249,33 @@ CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_BALLOON', 'balloon characteristics are !* model number ! TBALLOONS(3)%NMODEL = 0 -TBALLOONS(3)%MODEL = 'MOB' +TBALLOONS(3)%CMODEL = 'MOB' ! !* balloon type ! -TBALLOONS(3)%TYPE = 'RADIOS' +TBALLOONS(3)%CTYPE = 'RADIOS' ! !* balloon name ! -TBALLOONS(3)%TITLE = 'RSMASE19' +TBALLOONS(3)%CTITLE = 'RSMASE19' ! !* launching date and time ! -TBALLOONS(3)%LAUNCH%nyear = 1999 -TBALLOONS(3)%LAUNCH%nmonth = 09 -TBALLOONS(3)%LAUNCH%nday = 19 -TBALLOONS(3)%LAUNCH%xtime = 68400. +TBALLOONS(3)%TLAUNCH%nyear = 1999 +TBALLOONS(3)%TLAUNCH%nmonth = 09 +TBALLOONS(3)%TLAUNCH%nday = 19 +TBALLOONS(3)%TLAUNCH%xtime = 68400. ! !* latitude and longitude of launching site (decimal degree) ! -TBALLOONS(3)%LAT = 46.810 -TBALLOONS(3)%LON = 9.39 +TBALLOONS(3)%XLATLAUNCH = 46.810 +TBALLOONS(3)%XLONLAUNCH = 9.39 ! !* altitude of the launching site for 'RADIOS' !* altitude or pressure of the flight level for 'ISODEN' ! -TBALLOONS(3)%ALT = 865. -!TBALLOONS(3)%PRES = 62360. +TBALLOONS(3)%XALTLAUNCH = 865. +!TBALLOONS(3)%XPRES = 62360. ! !* time step for data storage (s) ! @@ -283,18 +283,18 @@ TBALLOONS(3)%TFLYER_TIME%XTSTEP = 20. ! !* ascentional vertical speed of the ballon (in calm air) (for 'RADIOS') ! -TBALLOONS(3)%WASCENT = 4.85 +TBALLOONS(3)%XWASCENT = 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') ! -TBALLOONS(3)%AERODRAG = 0.44 -TBALLOONS(3)%INDDRAG = 0.014 -TBALLOONS(3)%VOLUME = 3.040 -TBALLOONS(3)%MASS = 2.4516 -TBALLOONS(3)%DIAMETER = ((3.*TBALLOONS(3)%VOLUME)/(4.*XPI))**(1./3.) +TBALLOONS(3)%XAERODRAG = 0.44 +TBALLOONS(3)%XINDDRAG = 0.014 +TBALLOONS(3)%XVOLUME = 3.040 +TBALLOONS(3)%XMASS = 2.4516 +TBALLOONS(3)%XDIAMETER = ((3.*TBALLOONS(3)%XVOLUME)/(4.*XPI))**(1./3.) ! IF ( NBALLOONS < 4 ) RETURN #else @@ -309,33 +309,33 @@ CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_BALLOON', 'balloon characteristics are !* model number ! TBALLOONS(4)%NMODEL = 0 -TBALLOONS(4)%MODEL = 'FIX' +TBALLOONS(4)%CMODEL = 'FIX' ! !* balloon type ! -TBALLOONS(4)%TYPE = 'CVBALL' +TBALLOONS(4)%CTYPE = 'CVBALL' ! !* balloon name ! -TBALLOONS(4)%TITLE = 'CVB1ACVB' +TBALLOONS(4)%CTITLE = 'CVB1ACVB' ! !* launching date and time ! -TBALLOONS(4)%LAUNCH%nyear = 1999 -TBALLOONS(4)%LAUNCH%nmonth = 09 -TBALLOONS(4)%LAUNCH%nday = 19 -TBALLOONS(4)%LAUNCH%xtime = 32460. +TBALLOONS(4)%TLAUNCH%nyear = 1999 +TBALLOONS(4)%TLAUNCH%nmonth = 09 +TBALLOONS(4)%TLAUNCH%nday = 19 +TBALLOONS(4)%TLAUNCH%xtime = 32460. ! !* latitude and longitude of launching site (decimal degree) ! -TBALLOONS(4)%LAT = 45.922 -TBALLOONS(4)%LON = 8.646 +TBALLOONS(4)%XLATLAUNCH = 45.922 +TBALLOONS(4)%XLONLAUNCH = 8.646 ! !* altitude of the launching site for 'RADIOS' !* altitude or pressure of the flight level for 'ISODEN' ! -TBALLOONS(4)%ALT = 3959. -!TBALLOONS(4)%PRES = 62360. +TBALLOONS(4)%XALTLAUNCH = 3959. +!TBALLOONS(4)%XPRES = 62360. ! !* time step for data storage (s) ! @@ -343,18 +343,18 @@ TBALLOONS(4)%TFLYER_TIME%XTSTEP = 20. ! !* ascentional vertical speed of the ballon (in calm air) (for 'RADIOS') ! -!TBALLOONS(4)%WASCENT = 2.55 +!TBALLOONS(4)%XWASCENT = 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') ! -TBALLOONS(4)%AERODRAG = 0.44 -TBALLOONS(4)%INDDRAG = 0.014 -TBALLOONS(4)%VOLUME = 3.040 -TBALLOONS(4)%MASS = 2.4516 -TBALLOONS(4)%DIAMETER = ((3.*TBALLOONS(4)%VOLUME)/(4.*XPI))**(1./3.) +TBALLOONS(4)%XAERODRAG = 0.44 +TBALLOONS(4)%XINDDRAG = 0.014 +TBALLOONS(4)%XVOLUME = 3.040 +TBALLOONS(4)%XMASS = 2.4516 +TBALLOONS(4)%XDIAMETER = ((3.*TBALLOONS(4)%XVOLUME)/(4.*XPI))**(1./3.) ! IF ( NBALLOONS < 5 ) RETURN #else @@ -369,33 +369,33 @@ CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_BALLOON', 'balloon characteristics are !* model number ! TBALLOONS(5)%NMODEL = 0 -TBALLOONS(5)%MODEL = 'FIX' +TBALLOONS(5)%CMODEL = 'FIX' ! !* balloon type ! -TBALLOONS(5)%TYPE = 'CVBALL' +TBALLOONS(5)%CTYPE = 'CVBALL' ! !* balloon name ! -TBALLOONS(5)%TITLE = 'CVB1DEPA' +TBALLOONS(5)%CTITLE = 'CVB1DEPA' ! !* launching date and time ! -TBALLOONS(5)%LAUNCH%nyear = 1999 -TBALLOONS(5)%LAUNCH%nmonth = 09 -TBALLOONS(5)%LAUNCH%nday = 19 -TBALLOONS(5)%LAUNCH%xtime = 32435. +TBALLOONS(5)%TLAUNCH%nyear = 1999 +TBALLOONS(5)%TLAUNCH%nmonth = 09 +TBALLOONS(5)%TLAUNCH%nday = 19 +TBALLOONS(5)%TLAUNCH%xtime = 32435. ! !* latitude and longitude of launching site (decimal degree) ! -TBALLOONS(5)%LAT = 45.800 -TBALLOONS(5)%LON = 8.630 +TBALLOONS(5)%XLATLAUNCH = 45.800 +TBALLOONS(5)%XLONLAUNCH = 8.630 ! !* altitude of the launching site for 'RADIOS' !* altitude or pressure of the flight level for 'ISODEN' ! -TBALLOONS(5)%ALT = 340. -!TBALLOONS(5)%PRES = 62360. +TBALLOONS(5)%XALTLAUNCH = 340. +!TBALLOONS(5)%XPRES = 62360. ! !* time step for data storage (s) ! @@ -403,18 +403,18 @@ TBALLOONS(5)%TFLYER_TIME%XTSTEP = 20. ! !* ascentional vertical speed of the ballon (in calm air) (for 'RADIOS') ! -!TBALLOONS(5)%WASCENT = 2.55 +!TBALLOONS(5)%XWASCENT = 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') ! -TBALLOONS(5)%AERODRAG = 0.44 -TBALLOONS(5)%INDDRAG = 0.014 -TBALLOONS(5)%VOLUME = 3.040 -TBALLOONS(5)%MASS = 2.4516 -TBALLOONS(5)%DIAMETER = ((3.*TBALLOONS(5)%VOLUME)/(4.*XPI))**(1./3.) +TBALLOONS(5)%XAERODRAG = 0.44 +TBALLOONS(5)%XINDDRAG = 0.014 +TBALLOONS(5)%XVOLUME = 3.040 +TBALLOONS(5)%XMASS = 2.4516 +TBALLOONS(5)%XDIAMETER = ((3.*TBALLOONS(5)%XVOLUME)/(4.*XPI))**(1./3.) ! IF ( NBALLOONS < 6 ) RETURN #else @@ -429,33 +429,33 @@ CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_BALLOON', 'balloon characteristics are !* model number ! TBALLOONS(6)%NMODEL = 0 -TBALLOONS(6)%MODEL = 'FIX' +TBALLOONS(6)%CMODEL = 'FIX' ! !* balloon type ! -TBALLOONS(6)%TYPE = 'CVBALL' +TBALLOONS(6)%CTYPE = 'CVBALL' ! !* balloon name ! -TBALLOONS(6)%TITLE = 'CVB1RCVB' +TBALLOONS(6)%CTITLE = 'CVB1RCVB' ! !* launching date and time ! -TBALLOONS(6)%LAUNCH%nyear = 1999 -TBALLOONS(6)%LAUNCH%nmonth = 09 -TBALLOONS(6)%LAUNCH%nday = 19 -TBALLOONS(6)%LAUNCH%xtime = 32460. +TBALLOONS(6)%TLAUNCH%nyear = 1999 +TBALLOONS(6)%TLAUNCH%nmonth = 09 +TBALLOONS(6)%TLAUNCH%nday = 19 +TBALLOONS(6)%TLAUNCH%xtime = 32460. ! !* latitude and longitude of launching site (decimal degree) ! -TBALLOONS(6)%LAT = 45.922 -TBALLOONS(6)%LON = 8.646 +TBALLOONS(6)%XLATLAUNCH = 45.922 +TBALLOONS(6)%XLONLAUNCH = 8.646 ! !* altitude of the launching site for 'RADIOS' !* altitude or pressure of the flight level for 'ISODEN' ! -!TBALLOONS(6)%ALT = 3959. -!TBALLOONS(6)%PRES = 62360. +!TBALLOONS(6)%XALTLAUNCH = 3959. +!TBALLOONS(6)%XPRES = 62360. ! !* time step for data storage (s) ! @@ -463,18 +463,18 @@ TBALLOONS(6)%TFLYER_TIME%XTSTEP = 20. ! !* ascentional vertical speed of the ballon (in calm air) (for 'RADIOS') ! -!TBALLOONS(6)%WASCENT = 2.55 +!TBALLOONS(6)%XWASCENT = 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') ! -TBALLOONS(6)%AERODRAG = 0.44 -TBALLOONS(6)%INDDRAG = 0.014 -TBALLOONS(6)%VOLUME = 3.040 -TBALLOONS(6)%MASS = 2.4516 -TBALLOONS(6)%DIAMETER = ((3.*TBALLOONS(6)%VOLUME)/(4.*XPI))**(1./3.) +TBALLOONS(6)%XAERODRAG = 0.44 +TBALLOONS(6)%XINDDRAG = 0.014 +TBALLOONS(6)%XVOLUME = 3.040 +TBALLOONS(6)%XMASS = 2.4516 +TBALLOONS(6)%XDIAMETER = ((3.*TBALLOONS(6)%XVOLUME)/(4.*XPI))**(1./3.) ! IF ( NBALLOONS < 7 ) RETURN #else @@ -489,33 +489,33 @@ CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_BALLOON', 'balloon characteristics are !* model number ! TBALLOONS(7)%NMODEL = 0 -TBALLOONS(7)%MODEL = 'FIX' +TBALLOONS(7)%CMODEL = 'FIX' ! !* balloon type ! -TBALLOONS(7)%TYPE = 'CVBALL' +TBALLOONS(7)%CTYPE = 'CVBALL' ! !* balloon name ! -TBALLOONS(7)%TITLE = 'CVB1PISO' +TBALLOONS(7)%CTITLE = 'CVB1PISO' ! !* launching date and time ! -TBALLOONS(7)%LAUNCH%nyear = 1999 -TBALLOONS(7)%LAUNCH%nmonth = 09 -TBALLOONS(7)%LAUNCH%nday = 19 -TBALLOONS(7)%LAUNCH%xtime = 32460. +TBALLOONS(7)%TLAUNCH%nyear = 1999 +TBALLOONS(7)%TLAUNCH%nmonth = 09 +TBALLOONS(7)%TLAUNCH%nday = 19 +TBALLOONS(7)%TLAUNCH%xtime = 32460. ! !* latitude and longitude of launching site (decimal degree) ! -TBALLOONS(7)%LAT = 45.922 -TBALLOONS(7)%LON = 8.646 +TBALLOONS(7)%XLATLAUNCH = 45.922 +TBALLOONS(7)%XLONLAUNCH = 8.646 ! !* altitude of the launching site for 'RADIOS' !* altitude or pressure of the flight level for 'ISODEN' ! -!TBALLOONS(7)%ALT = 3959. -TBALLOONS(7)%PRES = 62360. +!TBALLOONS(7)%XALTLAUNCH = 3959. +TBALLOONS(7)%XPRES = 62360. ! !* time step for data storage (s) ! @@ -523,18 +523,18 @@ TBALLOONS(7)%TFLYER_TIME%XTSTEP = 20. ! !* ascentional vertical speed of the ballon (in calm air) (for 'RADIOS') ! -!TBALLOONS(7)%WASCENT = 2.55 +!TBALLOONS(7)%XWASCENT = 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') ! -TBALLOONS(7)%AERODRAG = 0.44 -TBALLOONS(7)%INDDRAG = 0.014 -TBALLOONS(7)%VOLUME = 3.040 -TBALLOONS(7)%MASS = 2.4516 -TBALLOONS(7)%DIAMETER = ((3.*TBALLOONS(7)%VOLUME)/(4.*XPI))**(1./3.) +TBALLOONS(7)%XAERODRAG = 0.44 +TBALLOONS(7)%XINDDRAG = 0.014 +TBALLOONS(7)%XVOLUME = 3.040 +TBALLOONS(7)%XMASS = 2.4516 +TBALLOONS(7)%XDIAMETER = ((3.*TBALLOONS(7)%XVOLUME)/(4.*XPI))**(1./3.) #else CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_BALLOON', 'balloon characteristics are commented' ) #endif diff --git a/src/MNH/modd_aircraft_balloon.f90 b/src/MNH/modd_aircraft_balloon.f90 index 54d38ad12..1a50954a0 100644 --- a/src/MNH/modd_aircraft_balloon.f90 +++ b/src/MNH/modd_aircraft_balloon.f90 @@ -57,20 +57,20 @@ TYPE :: TFLYERDATA ! !* general information ! - CHARACTER(LEN=3) :: MODEL = '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 - 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 = .FALSE. ! occurence of crash - LOGICAL :: FLY = .FALSE. ! occurence of flying + 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 + 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 ! launch/takeoff date and time + LOGICAL :: LCRASH = .FALSE. ! occurence of crash + LOGICAL :: LFLY = .FALSE. ! occurence of flying ! !* storage monitoring ! @@ -78,86 +78,86 @@ TYPE :: TFLYERDATA ! !* current position of the balloon/aircraft ! - REAL :: X_CUR = XUNDEF ! current x - REAL :: Y_CUR = XUNDEF ! current y - REAL :: Z_CUR = XUNDEF ! current z (if 'RADIOS' or 'AIRCRA' and 'ALTDEF' = T) - REAL :: P_CUR = XUNDEF ! current p (if 'AIRCRA' and 'ALTDEF' = F) + REAL :: XX_CUR = XUNDEF ! current x + REAL :: XY_CUR = XUNDEF ! current y + REAL :: XZ_CUR = XUNDEF ! current z (if 'RADIOS' or 'AIRCRA' and 'ALTDEF' = T) + REAL :: XP_CUR = XUNDEF ! current p (if 'AIRCRA' and 'ALTDEF' = F) ! !* data records ! - 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 :: XX => NULL() ! X(n) + REAL, DIMENSION(:), POINTER :: XY => NULL() ! Y(n) + REAL, DIMENSION(:), POINTER :: XZ => NULL() ! Z(n) + REAL, DIMENSION(:), POINTER :: XLAT => NULL() ! latitude (n) + REAL, DIMENSION(:), POINTER :: XLON => NULL() ! longitude(n) + REAL, DIMENSION(:), POINTER :: XZON => NULL() ! zonal wind(n) + REAL, DIMENSION(:), POINTER :: XMER => NULL() ! meridian wind(n) + REAL, DIMENSION(:), POINTER :: XW => NULL() ! w(n) (air vertical speed) + REAL, DIMENSION(:), POINTER :: XP => NULL() ! p(n) + REAL, DIMENSION(:), POINTER :: XTKE => NULL() ! tke(n) + REAL, DIMENSION(:), POINTER :: XTKE_DISS => NULL() ! tke dissipation rate + REAL, DIMENSION(:), POINTER :: XTH => NULL() ! th(n) + REAL, DIMENSION(:,:), POINTER :: XR => NULL() ! r*(n) + REAL, DIMENSION(:,:), POINTER :: XSV => NULL() ! Sv*(n) + REAL, DIMENSION(:,:), POINTER :: XRTZ => NULL() ! tot hydrometeor mixing ratio + REAL, DIMENSION(:,:,:), POINTER :: XRZ => NULL() ! water vapour mixing ratio + REAL, DIMENSION(:,:), POINTER :: XFFZ => NULL() ! horizontal wind + REAL, DIMENSION(:,:), POINTER :: XIWCZ => NULL() ! ice water content + REAL, DIMENSION(:,:), POINTER :: XLWCZ => NULL() ! liquid water content + REAL, DIMENSION(:,:), POINTER :: XCIZ => NULL() ! Ice concentration + REAL, DIMENSION(:,:), POINTER :: XCCZ => NULL() ! Cloud concentration (LIMA) + REAL, DIMENSION(:,:), POINTER :: XCRZ => NULL() ! Rain concentration (LIMA) + REAL, DIMENSION(:,:), POINTER :: XCRARE => NULL() ! cloud radar reflectivity + REAL, DIMENSION(:,:), POINTER :: XCRARE_ATT => NULL() ! attenuated (= more realistic) cloud radar reflectivity + REAL, DIMENSION(:,:), POINTER :: XWZ => NULL() ! vertical profile of vertical velocity + REAL, DIMENSION(:,:), POINTER :: XZZ => NULL() ! vertical profile of mass point altitude (above sea) + REAL, DIMENSION(:,:), POINTER :: XAER => NULL() ! Extinction at 550 nm + REAL, DIMENSION(:,:), POINTER :: XDST_WL => NULL() ! Extinction by wavelength + REAL, DIMENSION(:), POINTER :: XZS => NULL() ! zs(n) + REAL, DIMENSION(:), POINTER :: XTSRAD => 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) + REAL, DIMENSION(:), POINTER :: XTHW_FLUX => NULL() ! thw_flux(n) + REAL, DIMENSION(:), POINTER :: XRCW_FLUX => NULL() ! rcw_flux(n) + REAL, DIMENSION(:,:), POINTER :: XSVW_FLUX => NULL() ! psw_flux(n) END TYPE TFLYERDATA TYPE, EXTENDS( TFLYERDATA ) :: TAIRCRAFTDATA ! !* aircraft flight definition ! - INTEGER :: SEG = 0 ! number of aircraft flight segments - INTEGER :: SEGCURN = 1 ! current flight segment number - REAL :: SEGCURT = 0. ! 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 ) + INTEGER :: NSEG = 0 ! number of aircraft flight segments + INTEGER :: NSEGCURN = 1 ! current flight segment number + REAL :: XSEGCURT = 0. ! current flight segment time spent + REAL, DIMENSION(:), POINTER :: XSEGLAT => NULL() ! latitude of flight segment extremities (LEG+1) + REAL, DIMENSION(:), POINTER :: XSEGLON => NULL() ! longitude of flight segment extremities (LEG+1) + REAL, DIMENSION(:), POINTER :: XSEGX => NULL() ! X of flight segment extremities (LEG+1) + REAL, DIMENSION(:), POINTER :: XSEGY => NULL() ! Y of flight segment extremities (LEG+1) + REAL, DIMENSION(:), POINTER :: XSEGP => NULL() ! pressure of flight segment extremities (LEG+1) + REAL, DIMENSION(:), POINTER :: XSEGZ => NULL() ! altitude of flight segment extremities (LEG+1) + REAL, DIMENSION(:), POINTER :: XSEGTIME => NULL() ! duration of flight segments (LEG ) ! !* aircraft altitude type definition ! - LOGICAL :: ALTDEF = .FALSE. ! TRUE == altitude given in pressure + LOGICAL :: LALTDEF = .FALSE. ! TRUE == altitude given in pressure END TYPE TAIRCRAFTDATA TYPE, EXTENDS( TFLYERDATA ) :: TBALLOONDATA ! !* balloon dynamical characteristics ! - REAL :: LAT = XUNDEF ! latitude of launch - REAL :: LON = XUNDEF ! lontitude of launch - REAL :: XLAUNCH = XUNDEF ! X coordinate of launch - REAL :: YLAUNCH = XUNDEF ! Y coordinate of launch - REAL :: ALT = XUNDEF ! altitude of launch (if 'RADIOS' or 'ISODEN' or 'CVBALL') - REAL :: WASCENT = 5. ! ascent vertical speed, m/s (if 'RADIOS') - REAL :: RHO = XUNDEF ! density of launch (if 'ISODEN') - REAL :: PRES = XUNDEF ! pressure of launch (if 'ISODEN') - REAL :: DIAMETER = XUNDEF ! apparent diameter of the balloon (m) (if 'CVBALL') - REAL :: AERODRAG = XUNDEF ! aerodynamic drag coefficient of the balloon (if 'CVBALL') - REAL :: INDDRAG = XUNDEF ! induced drag coefficient (i.e. air shifted by the balloon) (if 'CVBALL') - REAL :: VOLUME = XUNDEF ! volume of the balloon (m3) (if 'CVBALL') - REAL :: MASS = XUNDEF ! mass of the balloon (kg) (if 'CVBALL') + 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 = XUNDEF ! altitude of launch (if 'RADIOS' or 'ISODEN' or 'CVBALL') + REAL :: XWASCENT = 5. ! ascent vertical speed, m/s (if 'RADIOS') + REAL :: XRHO = XUNDEF ! density of launch (if 'ISODEN') + REAL :: XPRES = XUNDEF ! pressure of launch (if 'ISODEN') + REAL :: XDIAMETER = XUNDEF ! apparent diameter of the balloon (m) (if 'CVBALL') + REAL :: XAERODRAG = XUNDEF ! aerodynamic drag coefficient of the balloon (if 'CVBALL') + REAL :: XINDDRAG = XUNDEF ! induced drag coefficient (i.e. air shifted by the balloon) (if 'CVBALL') + REAL :: XVOLUME = XUNDEF ! volume of the balloon (m3) (if 'CVBALL') + REAL :: XMASS = XUNDEF ! mass of the balloon (kg) (if 'CVBALL') END TYPE TBALLOONDATA INTEGER :: NAIRCRAFTS = 0 ! Total number of aircrafts diff --git a/src/MNH/write_aircraft_balloon.f90 b/src/MNH/write_aircraft_balloon.f90 index 82040c7ea..d1e239263 100644 --- a/src/MNH/write_aircraft_balloon.f90 +++ b/src/MNH/write_aircraft_balloon.f90 @@ -175,25 +175,25 @@ type(tfieldmetadata_base), dimension(:), allocatable :: tzfields !---------------------------------------------------------------------------- ! 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 = 20 + SIZE(TPFLYER%XR,2) + 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 +IF (SIZE(TPFLYER%XTSRAD)>0) IPROC = IPROC + 1 ! ISTORE = SIZE( TPFLYER%TFLYER_TIME%TPDATES ) @@ -209,9 +209,9 @@ ALLOCATE (YUNITZ (IPROCZ)) ALLOCATE (IGRIDZ (IPROCZ)) ! IGRID = 1 -YGROUP = TPFLYER%TITLE +YGROUP = TPFLYER%CTITLE IGRIDZ = 1 -YGROUPZ = TPFLYER%TITLE +YGROUPZ = TPFLYER%CTITLE ! !---------------------------------------------------------------------------- JPROC = 0 @@ -220,22 +220,22 @@ JPROC = JPROC + 1 YTITLE (JPROC) = 'ZS' YUNIT (JPROC) = 'm' YCOMMENT (JPROC) = 'orography' -ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%ZS(:) +ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%XZS(:) ! SELECT TYPE ( TPFLYER ) CLASS IS ( TAIRCRAFTDATA ) - IF (TPFLYER%ALTDEF) THEN + IF (TPFLYER%LALTDEF) THEN JPROC = JPROC + 1 YTITLE (JPROC) = 'P' YUNIT (JPROC) = 'Pascal' YCOMMENT (JPROC) = 'pressure' - ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%P(:) + ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%XP(:) ELSE JPROC = JPROC + 1 YTITLE (JPROC) = 'Z' YUNIT (JPROC) = 'm' YCOMMENT (JPROC) = 'altitude' - ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%Z(:) + ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%XZ(:) ENDIF CLASS IS ( TBALLOONDATA ) @@ -243,7 +243,7 @@ SELECT TYPE ( TPFLYER ) YTITLE (JPROC) = 'Z' YUNIT (JPROC) = 'm' YCOMMENT (JPROC) = 'altitude' - ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%Z(:) + ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%XZ(:) END SELECT ! @@ -257,36 +257,36 @@ JPROC = JPROC + 1 YTITLE (JPROC) = 'LAT' YUNIT (JPROC) = 'degree' YCOMMENT (JPROC) = 'latitude' -ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%YLAT(:) +ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%XLAT(:) ! JPROC = JPROC + 1 YTITLE (JPROC) = 'ZON_WIND' YUNIT (JPROC) = 'm s-1' YCOMMENT (JPROC) = 'zonal wind' -ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%ZON(:) +ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%XZON(:) ! JPROC = JPROC + 1 YTITLE (JPROC) = 'MER_WIND' YUNIT (JPROC) = 'm s-1' YCOMMENT (JPROC) = 'meridian wind' -ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%MER(:) +ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%XMER(:) ! JPROC = JPROC + 1 YTITLE (JPROC) = 'W' YUNIT (JPROC) = 'm s-1' YCOMMENT (JPROC) = 'air vertical speed' -ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%W(:) +ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%XW(:) ! JPROC = JPROC + 1 YTITLE (JPROC) = 'Th' YUNIT (JPROC) = 'K' YCOMMENT (JPROC) = 'potential temperature' -ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%TH(:) +ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%XTH(:) ! -DO JRR=1,SIZE(TPFLYER%R,2) +DO JRR=1,SIZE(TPFLYER%XR,2) JPROC = JPROC+1 YUNIT (JPROC) = 'kg kg-1' - ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%R(:,JRR) + ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%XR(:,JRR) IF (JRR==1) THEN YTITLE (JPROC) = 'Rv' YCOMMENT (JPROC) = 'water vapor mixing ratio' @@ -312,68 +312,69 @@ DO JRR=1,SIZE(TPFLYER%R,2) END DO ! !add cloud liquid water content in g/m3 to compare to measurements from FSSP -!IF (.NOT.(ANY(TPFLYER%P(:) == 0.))) THEN +!IF (.NOT.(ANY(TPFLYER%XP(:) == 0.))) THEN ALLOCATE (ZRHO(1,1,ISTORE)) -IF (SIZE(TPFLYER%R,2) >1) THEN !cloud water is present +IF (SIZE(TPFLYER%XR,2) >1) THEN !cloud water is present ZRHO(1,1,:) = 0. - DO JRR=1,SIZE(TPFLYER%R,2) - ZRHO(1,1,:) = ZRHO(1,1,:) + TPFLYER%R(:,JRR) + DO JRR=1,SIZE(TPFLYER%XR,2) + 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,ISTORE - IF (TPFLYER%P(JPT) == 0.) THEN + IF (TPFLYER%XP(JPT) == 0.) THEN ZRHO(1,1,JPT) = 0. ELSE - ZRHO(1,1,JPT) = TPFLYER%P(JPT) / & - (XRD *ZRHO(1,1,JPT) *((TPFLYER%P(JPT)/XP00)**(XRD/XCPD)) ) + ZRHO(1,1,JPT) = TPFLYER%XP(JPT) / & + (XRD *ZRHO(1,1,JPT) *((TPFLYER%XP(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 + ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%XR(:,2)*ZRHO(1,1,:)*1.E3 DEALLOCATE (ZRHO) ENDIF !ENDIF ! -IF (SIZE(TPFLYER%TKE)>0) THEN +IF (SIZE(TPFLYER%XTKE)>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(:) + ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%XTKE(:) 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(:) +ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%XTHW_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(:) +ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%XRCW_FLUX(:) ! -DO JSV=1,SIZE(TPFLYER%SVW_FLUX,2) +DO JSV=1,SIZE(TPFLYER%XSVW_FLUX,2) JPROC = JPROC + 1 +!PW: titre a modifier pour recuperer nom variables scalaires depuis TSVLIST? 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) + ZWORK6 (1,1,1,:,1,JPROC) = 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(:) + ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%XTKE_DISS(:) ENDIF ! -IF (SIZE(TPFLYER%SV,2)>=1) THEN +IF (SIZE(TPFLYER%XSV,2)>=1) THEN ! Scalar variables DO JSV = 1, NSV JPROC = JPROC + 1 @@ -382,14 +383,14 @@ IF (SIZE(TPFLYER%SV,2)>=1) THEN YCOMMENT(JPROC) = '' IF ( TRIM( TSVLIST(JSV)%CUNITS ) == 'ppv' ) THEN YUNIT(JPROC) = 'ppb' - ZWORK6(1,1,1,:,1,JPROC) = TPFLYER%SV(:,JSV) * 1.e9 !*1e9 for conversion ppv->ppb + ZWORK6(1,1,1,:,1,JPROC) = TPFLYER%XSV(:,JSV) * 1.e9 !*1e9 for conversion ppv->ppb ELSE YUNIT(JPROC) = TRIM( TSVLIST(JSV)%CUNITS ) - ZWORK6(1,1,1,:,1,JPROC) = TPFLYER%SV(:,JSV) + ZWORK6(1,1,1,:,1,JPROC) = TPFLYER%XSV(:,JSV) END IF END DO - IF ((LORILAM).AND. .NOT.(ANY(TPFLYER%P(:) == 0.))) THEN + IF ((LORILAM).AND. .NOT.(ANY(TPFLYER%XP(:) == 0.))) THEN ALLOCATE (ZSV(1,1,ISTORE,NSV_AER)) ALLOCATE (ZRHO(1,1,ISTORE)) @@ -397,19 +398,19 @@ IF (SIZE(TPFLYER%SV,2)>=1) THEN 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%SV(:,NSV_AERBEG:NSV_AEREND) - IF (SIZE(TPFLYER%R,2) >0) THEN + ZSV(1,1,:,1:NSV_AER) = TPFLYER%XSV(:,NSV_AERBEG:NSV_AEREND) + IF (SIZE(TPFLYER%XR,2) >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,SIZE(TPFLYER%XR,2) + 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,:) ) 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. @@ -548,25 +549,25 @@ IF (SIZE(TPFLYER%SV,2)>=1) THEN DEALLOCATE (ZN0,ZRG,ZSIG,ZPTOTA) END IF - IF ((LDUST).AND. .NOT.(ANY(TPFLYER%P(:) == 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%SV(:,NSV_DSTBEG:NSV_DSTEND) - IF (SIZE(TPFLYER%R,2) >0) THEN + ZSV(1,1,:,1:NSV_DST) = TPFLYER%XSV(:,NSV_DSTBEG:NSV_DSTEND) + IF (SIZE(TPFLYER%XR,2) >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,SIZE(TPFLYER%XR,2) + 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,:) ) 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 @@ -593,12 +594,12 @@ IF (SIZE(TPFLYER%SV,2)>=1) THEN END IF 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(:) + ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%XTSRAD(:) END IF ! DO IK=1, IKU @@ -609,12 +610,12 @@ DO IK=1, IKU YTITLEZ (JPROCZ) = 'Rt' YUNITZ (JPROCZ) = 'kg kg-1' YCOMMENTZ(JPROCZ) = '1D Total hydrometeor mixing ratio' - ZWORKZ6 (1,1,IK,:,1,JPROCZ) = TPFLYER%RTZ(:,IK) + ZWORKZ6 (1,1,IK,:,1,JPROCZ) = TPFLYER%XRTZ(:,IK) ! - DO JRR=1,SIZE(TPFLYER%RZ,3) + DO JRR=1,SIZE(TPFLYER%XRZ,3) JPROCZ = JPROCZ+1 YUNITZ (JPROCZ) = 'kg kg-1' - ZWORKZ6 (1,1,IK,:,1,JPROCZ) = TPFLYER%RZ(:,IK,JRR) + ZWORKZ6 (1,1,IK,:,1,JPROCZ) = TPFLYER%XRZ(:,IK,JRR) IF (JRR==1) THEN YTITLEZ (JPROCZ) = 'Rv' YCOMMENTZ (JPROCZ) = '1D water vapor mixing ratio' @@ -643,66 +644,66 @@ DO IK=1, IKU YTITLEZ (JPROCZ) = 'FF' YUNITZ (JPROCZ) = 'm s-1' YCOMMENTZ(JPROCZ) = 'Horizontal wind' - ZWORKZ6 (1,1,IK,:,1,JPROCZ) = TPFLYER%FFZ(:,IK) + ZWORKZ6 (1,1,IK,:,1,JPROCZ) = TPFLYER%XFFZ(:,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) + ZWORKZ6 (1,1,IK,:,1,JPROCZ) = TPFLYER%XIWCZ(:,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) + ZWORKZ6 (1,1,IK,:,1,JPROCZ) = TPFLYER%XLWCZ(:,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) + ZWORKZ6 (1,1,IK,:,1,JPROCZ) = TPFLYER%XCIZ(:,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) + ZWORKZ6 (1,1,IK,:,1,JPROCZ) = TPFLYER%XCCZ(:,IK) ! JPROCZ = JPROCZ + 1 YTITLEZ (JPROCZ) = 'CRAINT' YUNITZ (JPROCZ) = 'kg-1' YCOMMENTZ(JPROCZ) = 'Rain concentration' - ZWORKZ6 (1,1,IK,:,1,JPROCZ) = TPFLYER%CRZ(:,IK) + ZWORKZ6 (1,1,IK,:,1,JPROCZ) = TPFLYER%XCRZ(:,IK) ! JPROCZ = JPROCZ + 1 YTITLEZ (JPROCZ) = 'CICET' YUNITZ (JPROCZ) = 'kg-1' YCOMMENTZ(JPROCZ) = 'Ice concentration' - ZWORKZ6 (1,1,IK,:,1,JPROCZ) = TPFLYER%CIZ(:,IK) + ZWORKZ6 (1,1,IK,:,1,JPROCZ) = TPFLYER%XCIZ(:,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) + ZWORKZ6 (1,1,IK,:,1,JPROCZ) = TPFLYER%XCRARE(:,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) + ZWORKZ6 (1,1,IK,:,1,JPROCZ) = TPFLYER%XCRARE_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) + ZWORKZ6 (1,1,IK,:,1,JPROCZ) = TPFLYER%XWZ(:,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) + ZWORKZ6 (1,1,IK,:,1,JPROCZ) = TPFLYER%XZZ(:,IK) END DO !---------------------------------------------------------------------------- ! @@ -740,11 +741,11 @@ tzbudiachro%ccomments(NLVL_SUBCATEGORY) = 'Level for the flyers of type: ' // Tr tzbudiachro%lleveluse(NLVL_GROUP) = .true. tzbudiachro%clevels (NLVL_GROUP) = Trim( ygroup ) -tzbudiachro%ccomments(NLVL_GROUP) = 'Values for flyer ' // Trim( tpflyer%title ) +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' @@ -807,11 +808,11 @@ tzbudiachro%ccomments(NLVL_SUBCATEGORY) = 'Level for the flyers of type: ' // Tr tzbudiachro%lleveluse(NLVL_GROUP) = .true. tzbudiachro%clevels (NLVL_GROUP) = Trim( ygroupz ) -tzbudiachro%ccomments(NLVL_GROUP) = 'Values for flyer ' // Trim( tpflyer%title ) +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' diff --git a/src/MNH/write_balloonn.f90 b/src/MNH/write_balloonn.f90 index 54a7bbcb6..295de8c3a 100644 --- a/src/MNH/write_balloonn.f90 +++ b/src/MNH/write_balloonn.f90 @@ -83,7 +83,7 @@ TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! File characteristics INTEGER :: JI DO JI = 1, NBALLOONS - IF ( TBALLOONS(JI)%FLY ) CALL WRITE_LFI_BALLOON( TBALLOONS(JI) ) + IF ( TBALLOONS(JI)%LFLY ) CALL WRITE_LFI_BALLOON( TBALLOONS(JI) ) END DO ! ! @@ -107,13 +107,13 @@ TYPE(TFIELDMETADATA) :: TZFIELD ! ! CALL SM_LATLON(XLATORI,XLONORI, & - TPFLYER%X_CUR,TPFLYER%Y_CUR,ZLAT,ZLON) + TPFLYER%XX_CUR,TPFLYER%XY_CUR,ZLAT,ZLON) ! ! TZFIELD = TFIELDMETADATA( & - CMNHNAME = TRIM(TPFLYER%TITLE)//'LAT', & + CMNHNAME = TRIM(TPFLYER%CTITLE)//'LAT', & CSTDNAME = '', & - CLONGNAME = TRIM(TPFLYER%TITLE)//'LAT', & + CLONGNAME = TRIM(TPFLYER%CTITLE)//'LAT', & CUNITS = 'degree', & CDIR = '--', & CCOMMENT = '', & @@ -124,9 +124,9 @@ TZFIELD = TFIELDMETADATA( & CALL IO_Field_write(TPFILE,TZFIELD,ZLAT) ! TZFIELD = TFIELDMETADATA( & - CMNHNAME = TRIM(TPFLYER%TITLE)//'LON', & + CMNHNAME = TRIM(TPFLYER%CTITLE)//'LON', & CSTDNAME = '', & - CLONGNAME = TRIM(TPFLYER%TITLE)//'LON', & + CLONGNAME = TRIM(TPFLYER%CTITLE)//'LON', & CUNITS = 'degree', & CDIR = '--', & CCOMMENT = '', & @@ -137,9 +137,9 @@ TZFIELD = TFIELDMETADATA( & CALL IO_Field_write(TPFILE,TZFIELD,ZLON) ! TZFIELD = TFIELDMETADATA( & - CMNHNAME = TRIM(TPFLYER%TITLE)//'ALT', & + CMNHNAME = TRIM(TPFLYER%CTITLE)//'ALT', & CSTDNAME = '', & - CLONGNAME = TRIM(TPFLYER%TITLE)//'ALT', & + CLONGNAME = TRIM(TPFLYER%CTITLE)//'ALT', & CUNITS = 'm', & CDIR = '--', & CCOMMENT = '', & @@ -147,12 +147,12 @@ TZFIELD = TFIELDMETADATA( & NTYPE = TYPEREAL, & NDIMS = 0, & LTIMEDEP = .TRUE. ) -CALL IO_Field_write(TPFILE,TZFIELD,TPFLYER%Z_CUR) +CALL IO_Field_write(TPFILE,TZFIELD,TPFLYER%XZ_CUR) ! TZFIELD = TFIELDMETADATA( & - CMNHNAME = TRIM(TPFLYER%TITLE)//'WASCENT', & + CMNHNAME = TRIM(TPFLYER%CTITLE)//'WASCENT', & CSTDNAME = '', & - CLONGNAME = TRIM(TPFLYER%TITLE)//'WASCENT', & + CLONGNAME = TRIM(TPFLYER%CTITLE)//'WASCENT', & CUNITS = 'm s-1', & CDIR = '--', & CCOMMENT = '', & @@ -160,12 +160,12 @@ TZFIELD = TFIELDMETADATA( & NTYPE = TYPEREAL, & NDIMS = 0, & LTIMEDEP = .TRUE. ) -CALL IO_Field_write(TPFILE,TZFIELD,TPFLYER%WASCENT) +CALL IO_Field_write(TPFILE,TZFIELD,TPFLYER%XWASCENT) ! TZFIELD = TFIELDMETADATA( & - CMNHNAME = TRIM(TPFLYER%TITLE)//'RHO', & + CMNHNAME = TRIM(TPFLYER%CTITLE)//'RHO', & CSTDNAME = '', & - CLONGNAME = TRIM(TPFLYER%TITLE)//'RHO', & + CLONGNAME = TRIM(TPFLYER%CTITLE)//'RHO', & CUNITS = 'kg m-3', & CDIR = '--', & CCOMMENT = '', & @@ -173,7 +173,7 @@ TZFIELD = TFIELDMETADATA( & NTYPE = TYPEREAL, & NDIMS = 0, & LTIMEDEP = .TRUE. ) -CALL IO_Field_write(TPFILE,TZFIELD,TPFLYER%RHO) +CALL IO_Field_write(TPFILE,TZFIELD,TPFLYER%XRHO) ! ! ! diff --git a/src/MNH/write_diachro.f90 b/src/MNH/write_diachro.f90 index f2d57806c..21be258ef 100644 --- a/src/MNH/write_diachro.f90 +++ b/src/MNH/write_diachro.f90 @@ -90,6 +90,7 @@ 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 @@ -364,7 +365,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 +374,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 +383,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 @@ -655,7 +656,7 @@ IF(PRESENT(tpflyer))THEN NTYPE = TYPEREAL, & NDIMS = 3, & LTIMEDEP = .FALSE. ) - CALL IO_Field_write(tzfile,TZFIELD, Reshape( tpflyer%x, [1, Size( tpflyer%x), 1] ) ) + 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 = TFIELDMETADATA( & CMNHNAME = TRIM(ygroup)//'.TRAJX', & @@ -688,7 +689,7 @@ IF(PRESENT(tpflyer))THEN NTYPE = TYPEREAL, & NDIMS = 3, & LTIMEDEP = .FALSE. ) - CALL IO_Field_write(tzfile,TZFIELD, Reshape( tpflyer%y, [1, Size( tpflyer%y), 1] ) ) + 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 = TFIELDMETADATA( & CMNHNAME = TRIM(ygroup)//'.TRAJY', & @@ -721,7 +722,7 @@ IF(PRESENT(tpflyer))THEN NTYPE = TYPEREAL, & NDIMS = 3, & LTIMEDEP = .FALSE. ) - CALL IO_Field_write(tzfile,TZFIELD, Reshape( tpflyer%z, [1, Size( tpflyer%z), 1] ) ) + 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 = TFIELDMETADATA( & CMNHNAME = TRIM(ygroup)//'.TRAJZ', & @@ -1512,13 +1513,13 @@ if ( Present( tpflyer ) ) then ndimlist = [ NMNHDIM_FLYER_TIME ], & ltimedep = .false. ) - call IO_Field_write( tzfile, tzfield, tpflyer%x ) + 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 @@ -1563,21 +1564,21 @@ 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) ) -- GitLab From 8d2de9e54ca7a7847278867b00cd4e0d38817133 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Fri, 3 Jun 2022 13:54:05 +0200 Subject: [PATCH 076/157] Philippe 03/06/2022: flyers: arrays are allocatable (instead of pointers) --- src/MNH/modd_aircraft_balloon.f90 | 81 ++++++++++++++++--------------- 1 file changed, 41 insertions(+), 40 deletions(-) diff --git a/src/MNH/modd_aircraft_balloon.f90 b/src/MNH/modd_aircraft_balloon.f90 index 1a50954a0..7e3c2f6b4 100644 --- a/src/MNH/modd_aircraft_balloon.f90 +++ b/src/MNH/modd_aircraft_balloon.f90 @@ -85,40 +85,41 @@ TYPE :: TFLYERDATA ! !* data records ! - REAL, DIMENSION(:), POINTER :: XX => NULL() ! X(n) - REAL, DIMENSION(:), POINTER :: XY => NULL() ! Y(n) - REAL, DIMENSION(:), POINTER :: XZ => NULL() ! Z(n) - REAL, DIMENSION(:), POINTER :: XLAT => NULL() ! latitude (n) - REAL, DIMENSION(:), POINTER :: XLON => NULL() ! longitude(n) - REAL, DIMENSION(:), POINTER :: XZON => NULL() ! zonal wind(n) - REAL, DIMENSION(:), POINTER :: XMER => NULL() ! meridian wind(n) - REAL, DIMENSION(:), POINTER :: XW => NULL() ! w(n) (air vertical speed) - REAL, DIMENSION(:), POINTER :: XP => NULL() ! p(n) - REAL, DIMENSION(:), POINTER :: XTKE => NULL() ! tke(n) - REAL, DIMENSION(:), POINTER :: XTKE_DISS => NULL() ! tke dissipation rate - REAL, DIMENSION(:), POINTER :: XTH => NULL() ! th(n) - REAL, DIMENSION(:,:), POINTER :: XR => NULL() ! r*(n) - REAL, DIMENSION(:,:), POINTER :: XSV => NULL() ! Sv*(n) - REAL, DIMENSION(:,:), POINTER :: XRTZ => NULL() ! tot hydrometeor mixing ratio - REAL, DIMENSION(:,:,:), POINTER :: XRZ => NULL() ! water vapour mixing ratio - REAL, DIMENSION(:,:), POINTER :: XFFZ => NULL() ! horizontal wind - REAL, DIMENSION(:,:), POINTER :: XIWCZ => NULL() ! ice water content - REAL, DIMENSION(:,:), POINTER :: XLWCZ => NULL() ! liquid water content - REAL, DIMENSION(:,:), POINTER :: XCIZ => NULL() ! Ice concentration - REAL, DIMENSION(:,:), POINTER :: XCCZ => NULL() ! Cloud concentration (LIMA) - REAL, DIMENSION(:,:), POINTER :: XCRZ => NULL() ! Rain concentration (LIMA) - REAL, DIMENSION(:,:), POINTER :: XCRARE => NULL() ! cloud radar reflectivity - REAL, DIMENSION(:,:), POINTER :: XCRARE_ATT => NULL() ! attenuated (= more realistic) cloud radar reflectivity - REAL, DIMENSION(:,:), POINTER :: XWZ => NULL() ! vertical profile of vertical velocity - REAL, DIMENSION(:,:), POINTER :: XZZ => NULL() ! vertical profile of mass point altitude (above sea) - REAL, DIMENSION(:,:), POINTER :: XAER => NULL() ! Extinction at 550 nm - REAL, DIMENSION(:,:), POINTER :: XDST_WL => NULL() ! Extinction by wavelength - REAL, DIMENSION(:), POINTER :: XZS => NULL() ! zs(n) - REAL, DIMENSION(:), POINTER :: XTSRAD => NULL() ! Ts(n) + + 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 :: XAER ! Extinction at 550 nm + REAL, DIMENSION(:,:), ALLOCATABLE :: XDST_WL ! Extinction by wavelength + REAL, DIMENSION(:), ALLOCATABLE :: XZS ! zs(n) + REAL, DIMENSION(:), ALLOCATABLE :: XTSRAD ! Ts(n) ! - REAL, DIMENSION(:), POINTER :: XTHW_FLUX => NULL() ! thw_flux(n) - REAL, DIMENSION(:), POINTER :: XRCW_FLUX => NULL() ! rcw_flux(n) - REAL, DIMENSION(:,:), POINTER :: XSVW_FLUX => NULL() ! psw_flux(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 @@ -128,13 +129,13 @@ TYPE, EXTENDS( TFLYERDATA ) :: TAIRCRAFTDATA INTEGER :: NSEG = 0 ! number of aircraft flight segments INTEGER :: NSEGCURN = 1 ! current flight segment number REAL :: XSEGCURT = 0. ! current flight segment time spent - REAL, DIMENSION(:), POINTER :: XSEGLAT => NULL() ! latitude of flight segment extremities (LEG+1) - REAL, DIMENSION(:), POINTER :: XSEGLON => NULL() ! longitude of flight segment extremities (LEG+1) - REAL, DIMENSION(:), POINTER :: XSEGX => NULL() ! X of flight segment extremities (LEG+1) - REAL, DIMENSION(:), POINTER :: XSEGY => NULL() ! Y of flight segment extremities (LEG+1) - REAL, DIMENSION(:), POINTER :: XSEGP => NULL() ! pressure of flight segment extremities (LEG+1) - REAL, DIMENSION(:), POINTER :: XSEGZ => NULL() ! altitude of flight segment extremities (LEG+1) - REAL, DIMENSION(:), POINTER :: XSEGTIME => NULL() ! duration of flight segments (LEG ) + REAL, DIMENSION(:), ALLOCATABLE :: XSEGLAT ! latitude of flight segment extremities (LEG+1) + REAL, DIMENSION(:), ALLOCATABLE :: XSEGLON ! longitude of flight segment extremities (LEG+1) + REAL, DIMENSION(:), ALLOCATABLE :: XSEGX ! X of flight segment extremities (LEG+1) + REAL, DIMENSION(:), ALLOCATABLE :: XSEGY ! Y of flight segment extremities (LEG+1) + REAL, DIMENSION(:), ALLOCATABLE :: XSEGP ! pressure of flight segment extremities (LEG+1) + REAL, DIMENSION(:), ALLOCATABLE :: XSEGZ ! altitude of flight segment extremities (LEG+1) + REAL, DIMENSION(:), ALLOCATABLE :: XSEGTIME ! duration of flight segments (LEG ) ! !* aircraft altitude type definition ! -- GitLab From 46766d3d35a54e33fe2315f2efba3e88799879dd Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Fri, 3 Jun 2022 15:04:39 +0200 Subject: [PATCH 077/157] Philippe 03/06/2022: flyers: small improvements --- src/MNH/ini_aircraft_balloon.f90 | 4 --- src/MNH/modd_aircraft_balloon.f90 | 2 +- src/MNH/write_aircraft_balloon.f90 | 41 +++++++----------------------- 3 files changed, 10 insertions(+), 37 deletions(-) diff --git a/src/MNH/ini_aircraft_balloon.f90 b/src/MNH/ini_aircraft_balloon.f90 index 1352e6577..64135ed5c 100644 --- a/src/MNH/ini_aircraft_balloon.f90 +++ b/src/MNH/ini_aircraft_balloon.f90 @@ -152,10 +152,6 @@ IF ( CPROGRAM == 'DIAG ') THEN ENDIF ! ! -IF ( IMI == 1 ) THEN - LFLYER=.FALSE. -END IF -! !---------------------------------------------------------------------------- ! !* 2. Balloon initialization diff --git a/src/MNH/modd_aircraft_balloon.f90 b/src/MNH/modd_aircraft_balloon.f90 index 7e3c2f6b4..a0e6e5070 100644 --- a/src/MNH/modd_aircraft_balloon.f90 +++ b/src/MNH/modd_aircraft_balloon.f90 @@ -51,7 +51,7 @@ save !------------------------------------------------------------------------------------------- ! -LOGICAL :: LFLYER ! flag to use aircraft/balloons +LOGICAL :: LFLYER = .FALSE. ! flag to use aircraft/balloons ! TYPE :: TFLYERDATA ! diff --git a/src/MNH/write_aircraft_balloon.f90 b/src/MNH/write_aircraft_balloon.f90 index d1e239263..8c2132bf7 100644 --- a/src/MNH/write_aircraft_balloon.f90 +++ b/src/MNH/write_aircraft_balloon.f90 @@ -65,7 +65,6 @@ 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) @@ -141,23 +140,17 @@ 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 ! 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 @@ -201,17 +194,10 @@ ALLOCATE (ZWORK6(1,1,1,ISTORE,1,IPROC)) ALLOCATE (YCOMMENT(IPROC)) ALLOCATE (YTITLE (IPROC)) ALLOCATE (YUNIT (IPROC)) -ALLOCATE (IGRID (IPROC)) ALLOCATE (ZWORKZ6(1,1,IKU,ISTORE,1,IPROCZ)) ALLOCATE (YCOMMENTZ(IPROCZ)) ALLOCATE (YTITLEZ (IPROCZ)) ALLOCATE (YUNITZ (IPROCZ)) -ALLOCATE (IGRIDZ (IPROCZ)) -! -IGRID = 1 -YGROUP = TPFLYER%CTITLE -IGRIDZ = 1 -YGROUPZ = TPFLYER%CTITLE ! !---------------------------------------------------------------------------- JPROC = 0 @@ -706,14 +692,7 @@ DO IK=1, IKU ZWORKZ6 (1,1,IK,:,1,JPROCZ) = TPFLYER%XZZ(:,IK) END DO !---------------------------------------------------------------------------- -! -ALLOCATE (ZW6(1,1,1,ISTORE,1,JPROC)) -ZW6 = ZWORK6(:,:,:,:,:,:JPROC) -DEALLOCATE(ZWORK6) -ALLOCATE (ZWZ6(1,1,IKU,ISTORE,1,JPROCZ)) -ZWZ6 = ZWORKZ6(:,:,:,:,:,:JPROCZ) -DEALLOCATE(ZWORKZ6) -! + allocate( tzfields( jproc ) ) tzfields(:)%cmnhname = ytitle(1 : jproc) @@ -740,7 +719,7 @@ 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%clevels (NLVL_GROUP) = Trim( tpflyer%ctitle ) tzbudiachro%ccomments(NLVL_GROUP) = 'Values for flyer ' // Trim( tpflyer%ctitle ) tzbudiachro%lleveluse(NLVL_SHAPE) = .true. @@ -776,8 +755,8 @@ tzbudiachro%lnorm = .false. ! tzbudiachro%nkl = NOT SET (default values) ! tzbudiachro%nkh = NOT SET (default values) -call Write_diachro( tpdiafile, tzbudiachro, tzfields, tpflyer%tflyer_time%tpdates, zw6, & - tpflyer = tpflyer ) +call Write_diachro( tpdiafile, tzbudiachro, tzfields, tpflyer%tflyer_time%tpdates, zwork6(:,:,:,:,:,:jproc), & + tpflyer = tpflyer ) deallocate( tzfields ) @@ -807,7 +786,7 @@ 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%clevels (NLVL_GROUP) = Trim( tpflyer%ctitle ) tzbudiachro%ccomments(NLVL_GROUP) = 'Values for flyer ' // Trim( tpflyer%ctitle ) tzbudiachro%lleveluse(NLVL_SHAPE) = .true. @@ -848,21 +827,19 @@ tzbudiachro%njh = 1 tzbudiachro%nkl = 1 tzbudiachro%nkh = iku -call Write_diachro( tpdiafile, tzbudiachro, tzfields, tpflyer%tflyer_time%tpdates, zwz6, & - tpflyer = tpflyer ) +call Write_diachro( tpdiafile, tzbudiachro, tzfields, tpflyer%tflyer_time%tpdates, zworkz6(:,:,:,:,:,:jprocz), & + tpflyer = tpflyer ) deallocate( tzfields ) -DEALLOCATE (ZW6) +DEALLOCATE (ZWORK6) DEALLOCATE (YCOMMENT) DEALLOCATE (YTITLE ) DEALLOCATE (YUNIT ) -DEALLOCATE (IGRID ) -DEALLOCATE (ZWZ6) +DEALLOCATE (ZWORKZ6) DEALLOCATE (YCOMMENTZ) DEALLOCATE (YTITLEZ ) DEALLOCATE (YUNITZ ) -DEALLOCATE (IGRIDZ ) !---------------------------------------------------------------------------- END SUBROUTINE FLYER_DIACHRO !---------------------------------------------------------------------------- -- GitLab From 2d851baafabbeb43fd66132041aa62c98021316f Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Tue, 21 Jun 2022 11:23:41 +0200 Subject: [PATCH 078/157] Philippe 21/06/2022: bugfix: time_budget was not computed correctly (tdtexp -> tdtseg) --- src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 | 30 ++++++++++----------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 b/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 index bc3633ddd..8ca884014 100644 --- a/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 +++ b/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 @@ -30,6 +30,7 @@ ! 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) !----------------------------------------------------------------- #ifdef MNH_IOCDF4 module mode_io_write_nc4 @@ -1468,7 +1469,6 @@ use modd_type_date, only: date_time use mode_field, only: Find_field_id_from_mnhname use mode_gridproj, only: Sm_latlon use mode_nest_ll, only: Get_model_number_ll, Go_tomodel_ll -use mode_time, only: tdtexp type(tfiledata), intent(in) :: tpfile character(len=*), optional, intent(in) :: hprogram_orig !To emulate a file coming from this program @@ -1720,20 +1720,20 @@ if ( tpfile%lmaster ) then Allocate( tzdates_bound(2, nbutotwrite) ) do jt = 1, nbutotwrite - tzdates(jt)%nyear = tdtexp%nyear - tzdates(jt)%nmonth = tdtexp%nmonth - tzdates(jt)%nday = tdtexp%nday - tzdates(jt)%xtime = tdtexp%xtime + nbustep * ( ( jt - 1 ) + 0.5 ) * xtstep - - tzdates_bound(1, jt)%nyear = tdtexp%nyear - tzdates_bound(1, jt)%nmonth = tdtexp%nmonth - tzdates_bound(1, jt)%nday = tdtexp%nday - tzdates_bound(1, jt)%xtime = tdtexp%xtime + nbustep * ( jt - 1 ) * xtstep - - tzdates_bound(2, jt)%nyear = tdtexp%nyear - tzdates_bound(2, jt)%nmonth = tdtexp%nmonth - tzdates_bound(2, jt)%nday = tdtexp%nday - tzdates_bound(2, jt)%xtime = tdtexp%xtime + nbustep * jt * xtstep + tzdates(jt)%nyear = tdtseg%nyear + tzdates(jt)%nmonth = tdtseg%nmonth + tzdates(jt)%nday = tdtseg%nday + tzdates(jt)%xtime = tdtseg%xtime + nbustep * ( ( jt - 1 ) + 0.5 ) * xtstep + + tzdates_bound(1, jt)%nyear = tdtseg%nyear + tzdates_bound(1, jt)%nmonth = tdtseg%nmonth + tzdates_bound(1, jt)%nday = tdtseg%nday + tzdates_bound(1, jt)%xtime = tdtseg%xtime + nbustep * ( jt - 1 ) * xtstep + + tzdates_bound(2, jt)%nyear = tdtseg%nyear + tzdates_bound(2, jt)%nmonth = tdtseg%nmonth + tzdates_bound(2, jt)%nday = tdtseg%nday + tzdates_bound(2, jt)%xtime = tdtseg%xtime + nbustep * jt * xtstep end do call Write_time_coord( tpfile%tncdims%tdims(NMNHDIM_BUDGET_TIME), 'time axis for budgets', tzdates, tzdates_bound ) -- GitLab From 88a930d91434ea98802ec2c8e2b4b3397bb47243 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Thu, 16 Jun 2022 15:22:51 +0200 Subject: [PATCH 079/157] Philippe 16/06/2022: flyers: add Add_point and Add_profile subroutines and use them --- src/MNH/diag.f90 | 4 +- src/MNH/modeln.f90 | 2 +- src/MNH/write_aircraft_balloon.f90 | 737 +++++++++++------------------ 3 files changed, 290 insertions(+), 453 deletions(-) diff --git a/src/MNH/diag.f90 b/src/MNH/diag.f90 index 4bfd2dc5e..27362f835 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. @@ -156,6 +156,7 @@ 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 @@ -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 diff --git a/src/MNH/modeln.f90 b/src/MNH/modeln.f90 index 01be40645..222333c7c 100644 --- a/src/MNH/modeln.f90 +++ b/src/MNH/modeln.f90 @@ -380,6 +380,7 @@ 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 @@ -446,7 +447,6 @@ 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 diff --git a/src/MNH/write_aircraft_balloon.f90 b/src/MNH/write_aircraft_balloon.f90 index 8c2132bf7..dc7726bcd 100644 --- a/src/MNH/write_aircraft_balloon.f90 +++ b/src/MNH/write_aircraft_balloon.f90 @@ -4,26 +4,28 @@ !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 + +implicit none + +private + +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 @@ -77,20 +79,8 @@ END MODULE MODI_WRITE_AIRCRAFT_BALLOON !* 0. DECLARATIONS ! ------------ ! -USE MODD_CST, ONLY: XRV -USE MODD_IO, ONLY: TFILEDATA -USE MODD_PARAMETERS, ONLY: XUNDEF -! USE MODD_AIRCRAFT_BALLOON -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_DIAG_IN_RUN, ONLY: LDIAG_IN_RUN -! -USE MODE_AERO_PSD -USE MODE_DUST_PSD -USE MODE_MODELN_HANDLER, ONLY: GET_CURRENT_MODEL_INDEX -use mode_msg -use mode_write_diachro, only: Write_diachro +USE MODD_IO, ONLY: TFILEDATA ! IMPLICIT NONE ! @@ -103,70 +93,77 @@ TYPE(TFILEDATA), INTENT(IN) :: TPDIAFILE ! file to write ! ! 0.2 declaration of local variables ! -INTEGER :: IMI ! current model index INTEGER :: JI ! !---------------------------------------------------------------------------- ! -IMI=GET_CURRENT_MODEL_INDEX() -! DO JI = 1, NBALLOONS - CALL FLYER_DIACHRO( TBALLOONS(JI) ) + CALL FLYER_DIACHRO( TPDIAFILE, TBALLOONS(JI) ) END DO DO JI = 1, NAIRCRAFTS - CALL FLYER_DIACHRO( TAIRCRAFTS(JI) ) + CALL FLYER_DIACHRO( TPDIAFILE, TAIRCRAFTS(JI) ) END DO ! -!---------------------------------------------------------------------------- -!---------------------------------------------------------------------------- -! -CONTAINS -! -!---------------------------------------------------------------------------- -!---------------------------------------------------------------------------- +END SUBROUTINE WRITE_AIRCRAFT_BALLOON ! -SUBROUTINE FLYER_DIACHRO(TPFLYER) +! ############################################ +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 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, & - tfieldmetadata_base, TYPEREAL +USE MODE_AERO_PSD +USE MODE_DUST_PSD +USE MODE_MODELN_HANDLER, ONLY: GET_CURRENT_MODEL_INDEX +use mode_msg +use mode_write_diachro, only: Write_diachro use modi_aircraft_balloon, only: Aircraft_balloon_longtype_get -CLASS(TFLYERDATA), INTENT(IN) :: TPFLYER +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 :: ZWORKZ6! contains temporal serie REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZSV, ZN0, ZSIG, ZRG REAL, DIMENSION(:,:,:,:,:), ALLOCATABLE :: ZPTOTA REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRHO ! -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 -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 -INTEGER :: JLOOP +INTEGER :: IKU type(tbudiachrometadata) :: tzbudiachro type(tfieldmetadata_base), dimension(:), allocatable :: tzfields ! !---------------------------------------------------------------------------- ! +IMI = GET_CURRENT_MODEL_INDEX() + +IRR = SIZE( tpflyer%xr, 2 ) + IF (TPFLYER%NMODEL==0) RETURN IF (ALL(TPFLYER%XX==XUNDEF)) RETURN IF (COUNT(TPFLYER%XX/=XUNDEF)<=1) RETURN @@ -174,7 +171,7 @@ IF ( IMI /= TPFLYER%NMODEL ) RETURN ! IKU = SIZE(TPFLYER%XRTZ,2) !number of vertical levels ! -IPROC = 20 + SIZE(TPFLYER%XR,2) + SIZE(TPFLYER%XSV,2) & +IPROC = 20 + 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)+ & @@ -189,120 +186,52 @@ IF (LDUST) IPROC = IPROC + NMODE_DST*3 IF (SIZE(TPFLYER%XTSRAD)>0) IPROC = IPROC + 1 ! ISTORE = SIZE( TPFLYER%TFLYER_TIME%TPDATES ) - -ALLOCATE (ZWORK6(1,1,1,ISTORE,1,IPROC)) -ALLOCATE (YCOMMENT(IPROC)) -ALLOCATE (YTITLE (IPROC)) -ALLOCATE (YUNIT (IPROC)) -ALLOCATE (ZWORKZ6(1,1,IKU,ISTORE,1,IPROCZ)) -ALLOCATE (YCOMMENTZ(IPROCZ)) -ALLOCATE (YTITLEZ (IPROCZ)) -ALLOCATE (YUNITZ (IPROCZ)) ! !---------------------------------------------------------------------------- -JPROC = 0 -! -JPROC = JPROC + 1 -YTITLE (JPROC) = 'ZS' -YUNIT (JPROC) = 'm' -YCOMMENT (JPROC) = 'orography' -ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%XZS(:) +!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(:) ) ! SELECT TYPE ( TPFLYER ) CLASS IS ( TAIRCRAFTDATA ) IF (TPFLYER%LALTDEF) THEN - JPROC = JPROC + 1 - YTITLE (JPROC) = 'P' - YUNIT (JPROC) = 'Pascal' - YCOMMENT (JPROC) = 'pressure' - ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%XP(:) + call Add_point( 'P', 'pressure', 'Pascal', tpflyer%xp(:) ) ELSE - JPROC = JPROC + 1 - YTITLE (JPROC) = 'Z' - YUNIT (JPROC) = 'm' - YCOMMENT (JPROC) = 'altitude' - ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%XZ(:) + call Add_point( 'Z', 'altitude', 'm', tpflyer%xz(:) ) ENDIF CLASS IS ( TBALLOONDATA ) - JPROC = JPROC + 1 - YTITLE (JPROC) = 'Z' - YUNIT (JPROC) = 'm' - YCOMMENT (JPROC) = 'altitude' - ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%XZ(:) + call Add_point( 'Z', 'altitude', 'm', tpflyer%xz(:) ) END SELECT ! -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%XLAT(:) -! -JPROC = JPROC + 1 -YTITLE (JPROC) = 'ZON_WIND' -YUNIT (JPROC) = 'm s-1' -YCOMMENT (JPROC) = 'zonal wind' -ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%XZON(:) -! -JPROC = JPROC + 1 -YTITLE (JPROC) = 'MER_WIND' -YUNIT (JPROC) = 'm s-1' -YCOMMENT (JPROC) = 'meridian wind' -ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%XMER(:) -! -JPROC = JPROC + 1 -YTITLE (JPROC) = 'W' -YUNIT (JPROC) = 'm s-1' -YCOMMENT (JPROC) = 'air vertical speed' -ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%XW(:) -! -JPROC = JPROC + 1 -YTITLE (JPROC) = 'Th' -YUNIT (JPROC) = 'K' -YCOMMENT (JPROC) = 'potential temperature' -ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%XTH(:) -! -DO JRR=1,SIZE(TPFLYER%XR,2) - JPROC = JPROC+1 - YUNIT (JPROC) = 'kg kg-1' - ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%XR(:,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 +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%XP(:) == 0.))) THEN ALLOCATE (ZRHO(1,1,ISTORE)) -IF (SIZE(TPFLYER%XR,2) >1) THEN !cloud water is present +IF ( IRR > 1 ) THEN !cloud water is present ZRHO(1,1,:) = 0. - DO JRR=1,SIZE(TPFLYER%XR,2) + DO JRR = 1, IRR ZRHO(1,1,:) = ZRHO(1,1,:) + TPFLYER%XR(:,JRR) ENDDO ZRHO(1,1,:) = TPFLYER%XTH(:) * ( 1. + XRV/XRD*TPFLYER%XR(:,1) ) & @@ -315,64 +244,31 @@ IF (SIZE(TPFLYER%XR,2) >1) THEN !cloud water is present (XRD *ZRHO(1,1,JPT) *((TPFLYER%XP(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%XR(:,2)*ZRHO(1,1,:)*1.E3 + call Add_point( 'LWC', 'cloud liquid water content', 'g m-3', tpflyer%xr(:,2)*ZRHO(1,1,:)*1.E3 ) DEALLOCATE (ZRHO) ENDIF !ENDIF ! -IF (SIZE(TPFLYER%XTKE)>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%XTKE(:) -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%XTHW_FLUX(:) +IF (SIZE(TPFLYER%XTKE)>0) call Add_point( 'Tke', 'Turbulent kinetic energy', 'm2 s-2', tpflyer%xtke(:) ) ! -JPROC = JPROC + 1 -YTITLE (JPROC) = 'LE_FLUX' -YUNIT (JPROC) = 'W m-2' -YCOMMENT (JPROC) = 'latent flux' -ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%XRCW_FLUX(:) +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) - JPROC = JPROC + 1 -!PW: titre a modifier pour recuperer nom variables scalaires depuis TSVLIST? - 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%XSVW_FLUX(:,JSV) + 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%XTKE_DISS(:) + call Add_point( 'Tke_Diss', 'TKE dissipation rate', 'm2 s-2', tpflyer%xtke_diss(:) ) ENDIF ! IF (SIZE(TPFLYER%XSV,2)>=1) THEN ! Scalar variables DO JSV = 1, NSV - JPROC = JPROC + 1 - - YTITLE(JPROC) = TRIM( TSVLIST(JSV)%CMNHNAME ) - YCOMMENT(JPROC) = '' IF ( TRIM( TSVLIST(JSV)%CUNITS ) == 'ppv' ) THEN - YUNIT(JPROC) = 'ppb' - ZWORK6(1,1,1,:,1,JPROC) = TPFLYER%XSV(:,JSV) * 1.e9 !*1e9 for conversion ppv->ppb + call Add_point( Trim( tsvlist(jsv)%cmnhname ), '', 'ppb', tpflyer%xsv(:,jsv) * 1.e9 ) !*1e9 for conversion ppv->ppb ELSE - YUNIT(JPROC) = TRIM( TSVLIST(JSV)%CUNITS ) - ZWORK6(1,1,1,:,1,JPROC) = TPFLYER%XSV(:,JSV) + call Add_point( Trim( tsvlist(jsv)%cmnhname ), '', Trim( tsvlist(jsv)%cunits ), tpflyer%xsv(:,jsv) ) END IF END DO @@ -385,9 +281,9 @@ IF (SIZE(TPFLYER%XSV,2)>=1) THEN 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 (SIZE(TPFLYER%XR,2) >0) THEN + IF (IRR >0) THEN ZRHO(1,1,:) = 0. - DO JRR=1,SIZE(TPFLYER%XR,2) + DO JRR=1,IRR ZRHO(1,1,:) = ZRHO(1,1,:) + TPFLYER%XR(:,JRR) ENDDO ZRHO(1,1,:) = TPFLYER%XTH(:) * ( 1. + XRV/XRD*TPFLYER%XR(:,1) ) & @@ -408,128 +304,88 @@ IF (SIZE(TPFLYER%XSV,2)>=1) THEN 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) @@ -542,9 +398,9 @@ IF (SIZE(TPFLYER%XSV,2)>=1) THEN 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 (SIZE(TPFLYER%XR,2) >0) THEN + IF (IRR >0) THEN ZRHO(1,1,:) = 0. - DO JRR=1,SIZE(TPFLYER%XR,2) + DO JRR=1,IRR ZRHO(1,1,:) = ZRHO(1,1,:) + TPFLYER%XR(:,JRR) ENDDO ZRHO(1,1,:) = TPFLYER%XTH(:) * ( 1. + XRV/XRD*TPFLYER%XR(:,1) ) & @@ -557,23 +413,17 @@ IF (SIZE(TPFLYER%XSV,2)>=1) THEN 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) @@ -582,124 +432,19 @@ ENDIF ! 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%XTSRAD(:) + 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%XRTZ(:,IK) -! - DO JRR=1,SIZE(TPFLYER%XRZ,3) - JPROCZ = JPROCZ+1 - YUNITZ (JPROCZ) = 'kg kg-1' - ZWORKZ6 (1,1,IK,:,1,JPROCZ) = TPFLYER%XRZ(:,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%XFFZ(:,IK) -! - JPROCZ = JPROCZ + 1 - YTITLEZ (JPROCZ) = 'IWC' - YUNITZ (JPROCZ) = 'kg m-3' - YCOMMENTZ(JPROCZ) = 'Ice water content' - ZWORKZ6 (1,1,IK,:,1,JPROCZ) = TPFLYER%XIWCZ(:,IK) -! - JPROCZ = JPROCZ + 1 - YTITLEZ (JPROCZ) = 'LWC' - YUNITZ (JPROCZ) = 'kg m-3' - YCOMMENTZ(JPROCZ) = 'Liquid water content' - ZWORKZ6 (1,1,IK,:,1,JPROCZ) = TPFLYER%XLWCZ(:,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%XCIZ(:,IK) - ELSE - JPROCZ = JPROCZ + 1 - YTITLEZ (JPROCZ) = 'CCLOUDT' - YUNITZ (JPROCZ) = 'kg-1' - YCOMMENTZ(JPROCZ) = 'liquid cloud concentration' - ZWORKZ6 (1,1,IK,:,1,JPROCZ) = TPFLYER%XCCZ(:,IK) -! - JPROCZ = JPROCZ + 1 - YTITLEZ (JPROCZ) = 'CRAINT' - YUNITZ (JPROCZ) = 'kg-1' - YCOMMENTZ(JPROCZ) = 'Rain concentration' - ZWORKZ6 (1,1,IK,:,1,JPROCZ) = TPFLYER%XCRZ(:,IK) -! - JPROCZ = JPROCZ + 1 - YTITLEZ (JPROCZ) = 'CICET' - YUNITZ (JPROCZ) = 'kg-1' - YCOMMENTZ(JPROCZ) = 'Ice concentration' - ZWORKZ6 (1,1,IK,:,1,JPROCZ) = TPFLYER%XCIZ(:,IK) - ENDIF -! - JPROCZ = JPROCZ + 1 - YTITLEZ (JPROCZ) = 'RARE' - YUNITZ (JPROCZ) = 'dBZ' - YCOMMENTZ(JPROCZ) = '1D cloud radar reflectivity' - ZWORKZ6 (1,1,IK,:,1,JPROCZ) = TPFLYER%XCRARE(:,IK) - JPROCZ = JPROCZ + 1 - YTITLEZ (JPROCZ) = 'RAREatt' - YUNITZ (JPROCZ) = 'dBZ' - YCOMMENTZ(JPROCZ) = '1D cloud radar attenuated reflectivity' - ZWORKZ6 (1,1,IK,:,1,JPROCZ) = TPFLYER%XCRARE_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%XWZ(:,IK) - JPROCZ = JPROCZ + 1 - YTITLEZ (JPROCZ) = 'Z' - YUNITZ (JPROCZ) = 'm' - YCOMMENTZ(JPROCZ) = '1D altitude above sea' - ZWORKZ6 (1,1,IK,:,1,JPROCZ) = TPFLYER%XZZ(:,IK) -END DO -!---------------------------------------------------------------------------- - 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 @@ -755,18 +500,61 @@ tzbudiachro%lnorm = .false. ! tzbudiachro%nkl = NOT SET (default values) ! tzbudiachro%nkh = NOT SET (default values) -call Write_diachro( tpdiafile, tzbudiachro, tzfields, tpflyer%tflyer_time%tpdates, zwork6(:,:,:,:,:,:jproc), & +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 ) -allocate( tzfields( jprocz ) ) +!---------------------------------------------------------------------------- +!Treat vertical profiles + +ALLOCATE (XWORK6(1,1,IKU,ISTORE,1,IPROCZ)) +ALLOCATE (CCOMMENT(IPROCZ)) +ALLOCATE (CTITLE (IPROCZ)) +ALLOCATE (CUNIT (IPROCZ)) -tzfields(:)%cmnhname = ytitlez(1 : jprocz) +JPROC = 0 + +call Add_profile( 'Rt', '1D Total hydrometeor mixing ratio', 'kg kg-1', tpflyer%xrtz(:,:) ) + +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) ) + +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 @@ -827,22 +615,71 @@ tzbudiachro%njh = 1 tzbudiachro%nkl = 1 tzbudiachro%nkh = iku -call Write_diachro( tpdiafile, tzbudiachro, tzfields, tpflyer%tflyer_time%tpdates, zworkz6(:,:,:,:,:,:jprocz), & - tpflyer = tpflyer ) +call Write_diachro( tpdiafile, tzbudiachro, tzfields, tpflyer%tflyer_time%tpdates, xwork6(:,:,:,:,:,:jproc), & + tpflyer = tpflyer ) deallocate( tzfields ) -DEALLOCATE (ZWORK6) -DEALLOCATE (YCOMMENT) -DEALLOCATE (YTITLE ) -DEALLOCATE (YUNIT ) -DEALLOCATE (ZWORKZ6) -DEALLOCATE (YCOMMENTZ) -DEALLOCATE (YTITLEZ ) -DEALLOCATE (YUNITZ ) +DEALLOCATE (XWORK6) +DEALLOCATE (CCOMMENT) +DEALLOCATE (CTITLE ) +DEALLOCATE (CUNIT ) + +contains + +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 + +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 ) + +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 FLYER_DIACHRO !---------------------------------------------------------------------------- !---------------------------------------------------------------------------- ! -END SUBROUTINE WRITE_AIRCRAFT_BALLOON + +END MODULE MODE_WRITE_AIRCRAFT_BALLOON -- GitLab From df8087ff6e09af710baa554b7d15cf9d49526cfb Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Fri, 24 Jun 2022 09:58:10 +0200 Subject: [PATCH 080/157] Philippe 24/06/2022: remove check on CSTORAGE_TYPE for restart of ForeFire variables --- src/MNH/ini_segn.f90 | 4 ++-- src/MNH/read_exsegn.f90 | 14 ++++---------- 2 files changed, 6 insertions(+), 12 deletions(-) diff --git a/src/MNH/ini_segn.f90 b/src/MNH/ini_segn.f90 index 7cd8620da..f5fc4e5ee 100644 --- a/src/MNH/ini_segn.f90 +++ b/src/MNH/ini_segn.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. @@ -453,7 +453,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,CSTORAGE_TYPE,CINIFILEPGD_n ) + PTSTEP_ALL,CINIFILEPGD_n ) ! IF (CPROGRAM=='SPAWN ' .OR. CPROGRAM=='DIAG ' .OR. CPROGRAM=='SPEC ' & .OR. CPROGRAM=='REAL ') THEN diff --git a/src/MNH/read_exsegn.f90 b/src/MNH/read_exsegn.f90 index f77b127fe..243ed7665 100644 --- a/src/MNH/read_exsegn.f90 +++ b/src/MNH/read_exsegn.f90 @@ -21,7 +21,7 @@ INTERFACE OCONDSAMP,OBLOWSNOW, & KRIMX,KRIMY, KSV_USER, & HTURB,HTOM,ORMC01,HRAD,HDCONV,HSCONV,HCLOUD,HELEC, & - HEQNSYS,PTSTEP_ALL,HSTORAGE_TYPE,HINIFILEPGD ) + HEQNSYS,PTSTEP_ALL,HINIFILEPGD ) ! USE MODD_IO, ONLY: TFILEDATA ! @@ -71,7 +71,6 @@ CHARACTER (LEN=4), INTENT(IN) :: HCLOUD ! Kind of microphysical scheme CHARACTER (LEN=4), INTENT(IN) :: HELEC ! Kind of electrical scheme CHARACTER (LEN=*), INTENT(IN) :: HEQNSYS! type of equations' system REAL,DIMENSION(:), INTENT(INOUT):: PTSTEP_ALL ! Time STEP of ALL models -CHARACTER (LEN=*), INTENT(IN) :: HSTORAGE_TYPE ! type of initial file CHARACTER (LEN=*), INTENT(IN) :: HINIFILEPGD ! name of PGD file ! END SUBROUTINE READ_EXSEG_n @@ -94,7 +93,7 @@ END MODULE MODI_READ_EXSEG_n OCONDSAMP, OBLOWSNOW, & KRIMX,KRIMY, KSV_USER, & HTURB,HTOM,ORMC01,HRAD,HDCONV,HSCONV,HCLOUD,HELEC, & - HEQNSYS,PTSTEP_ALL,HSTORAGE_TYPE,HINIFILEPGD ) + HEQNSYS,PTSTEP_ALL,HINIFILEPGD ) ! ######################################################################### ! !!**** *READ_EXSEG_n * - routine to read the descriptor file EXSEG @@ -302,8 +301,9 @@ END MODULE MODI_READ_EXSEG_n ! 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 ! R. Honnert 23/04/2021: add ADAP mixing length and delete HRIO and BOUT from CMF_UPDRAFT -! S. Riette 11/05/2021 HighLow cloud +! S. Riette 11/05/2021: HighLow cloud ! P. Wautelet 27/04/2022: add namelist for profilers +! P. Wautelet 24/06/2022: remove check on CSTORAGE_TYPE for restart of ForeFire variables !------------------------------------------------------------------------------ ! !* 0. DECLARATIONS @@ -314,7 +314,6 @@ USE MODD_CH_AEROSOL USE MODD_CH_M9_n, ONLY : NEQ USE MODD_CONDSAMP USE MODD_CONF -USE MODD_CONF_n, ONLY: CSTORAGE_TYPE USE MODD_CONFZ ! USE MODD_DRAG_n USE MODD_DUST @@ -455,7 +454,6 @@ CHARACTER (LEN=4), INTENT(IN) :: HCLOUD ! Kind of microphysical scheme CHARACTER (LEN=4), INTENT(IN) :: HELEC ! Kind of electrical scheme CHARACTER (LEN=*), INTENT(IN) :: HEQNSYS! type of equations' system REAL,DIMENSION(:), INTENT(INOUT):: PTSTEP_ALL ! Time STEP of ALL models -CHARACTER (LEN=*), INTENT(IN) :: HSTORAGE_TYPE ! type of initial file CHARACTER (LEN=*), INTENT(IN) :: HINIFILEPGD ! name of PGD file ! !* 0.2 declarations of local variables @@ -1750,7 +1748,6 @@ END IF IF (CCLOUD == 'LIMA') THEN IF (HCLOUD == 'LIMA') THEN CGETSVT(NSV_LIMA_BEG:NSV_LIMA_END)='READ' -!!JPP IF(HSTORAGE_TYPE=='TT') CGETSVT(NSV_LIMA_BEG:NSV_LIMA_END)='INIT' ELSE WRITE(UNIT=ILUOUT,FMT=9001) KMI WRITE(UNIT=ILUOUT,FMT='("THERE IS NO SCALAR VARIABLES FOR LIMA & @@ -2037,9 +2034,6 @@ END IF IF (LFOREFIRE) THEN IF (OFOREFIRE) THEN CGETSVT(NSV_FFBEG:NSV_FFEND)='READ' - IF(HSTORAGE_TYPE=='TT') THEN - CGETSVT(NSV_FFBEG:NSV_FFEND)='INIT' - END IF ELSE WRITE(UNIT=ILUOUT,FMT=9001) KMI WRITE(UNIT=ILUOUT,FMT='("THERE IS NO FOREFIRE SCALAR VARIABLES IN INITIAL FMFILE",/,& -- GitLab From 0cc413430ddab86b616fe6cd18e0f7f6a12d94ea Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Fri, 1 Jul 2022 12:02:22 +0200 Subject: [PATCH 081/157] Philippe 01/07/2022: add olocal optional argument to force Print_msg on current process --- src/LIB/SURCOUCHE/src/mode_msg.f90 | 49 ++++++++++++++++++------------ 1 file changed, 30 insertions(+), 19 deletions(-) diff --git a/src/LIB/SURCOUCHE/src/mode_msg.f90 b/src/LIB/SURCOUCHE/src/mode_msg.f90 index 80d2f6677..ac78920fa 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 -- GitLab From e65a2f06e5ab25321e2a962342732c8bc22f502a Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Fri, 1 Jul 2022 15:25:19 +0200 Subject: [PATCH 082/157] Philippe 01/07/2022: add use of optional OLOCAL argument of Print_msg when useful for stations and profilers --- src/MNH/profilern.f90 | 2 +- src/MNH/statprof_reader.f90 | 2 +- src/MNH/statprof_tools.f90 | 14 +++++++------- src/MNH/write_profilern.f90 | 6 ++++-- src/MNH/write_stationn.f90 | 6 ++++-- 5 files changed, 17 insertions(+), 13 deletions(-) diff --git a/src/MNH/profilern.f90 b/src/MNH/profilern.f90 index d915a9336..7226a452d 100644 --- a/src/MNH/profilern.f90 +++ b/src/MNH/profilern.f90 @@ -356,7 +356,7 @@ PROFILER: DO JP = 1, NUMBPROFILER_LOC 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' ) + 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 diff --git a/src/MNH/statprof_reader.f90 b/src/MNH/statprof_reader.f90 index 888cfeac3..92eb1917f 100644 --- a/src/MNH/statprof_reader.f90 +++ b/src/MNH/statprof_reader.f90 @@ -118,7 +118,7 @@ DO CALL STATION_ADD( TZSTATPROF ) CLASS DEFAULT - CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'STATPROF_CSV_READ', 'unknown type for TPSTATPROF' ) + CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'STATPROF_CSV_READ', 'unknown type for TPSTATPROF', OLOCAL = .TRUE. ) END SELECT END IF diff --git a/src/MNH/statprof_tools.f90 b/src/MNH/statprof_tools.f90 index 3c19593bb..e48358ed2 100644 --- a/src/MNH/statprof_tools.f90 +++ b/src/MNH/statprof_tools.f90 @@ -383,7 +383,7 @@ SUBROUTINE STATPROF_POSITION( TPSTATPROF, PXHAT_GLOB, PYHAT_GLOB, PXHATM, PYHATM TPSTATPROF%NK = JK CLASS DEFAULT - CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'STATPROF_POSITION', 'unknown type for TPSTATPROF' ) + CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'STATPROF_POSITION', 'unknown type for TPSTATPROF', OLOCAL = .TRUE. ) END SELECT END IF @@ -511,7 +511,7 @@ FUNCTION STATPROF_INTERP_2D( TPSTATPROF, PA ) RESULT( PB ) (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' ) + CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'STATPROF_INTERP_2D', 'value can not be interpolated', OLOCAL = .TRUE. ) PB = XUNDEF END IF @@ -551,7 +551,7 @@ FUNCTION STATPROF_INTERP_2D_U( TPSTATPROF, PA ) RESULT( PB ) (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' ) + CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'STATPROF_INTERP_2D_U', 'value can not be interpolated', OLOCAL = .TRUE. ) PB = XUNDEF END IF @@ -591,7 +591,7 @@ FUNCTION STATPROF_INTERP_2D_V( TPSTATPROF, PA ) RESULT( PB ) (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' ) + CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'STATPROF_INTERP_2D_V', 'value can not be interpolated', OLOCAL = .TRUE. ) PB = XUNDEF END IF @@ -638,7 +638,7 @@ FUNCTION STATPROF_INTERP_3D( TPSTATPROF, PA ) RESULT( PB ) END IF END DO ELSE - CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'STATPROF_INTERP_3D', 'value can not be interpolated' ) + CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'STATPROF_INTERP_3D', 'value can not be interpolated', OLOCAL = .TRUE. ) PB(:) = XUNDEF END IF @@ -678,7 +678,7 @@ FUNCTION STATPROF_INTERP_3D_U( TPSTATPROF, PA ) RESULT( PB ) (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' ) + CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'STATPROF_INTERP_3D_U', 'value can not be interpolated', OLOCAL = .TRUE. ) PB = XUNDEF END IF @@ -718,7 +718,7 @@ FUNCTION STATPROF_INTERP_3D_V( TPSTATPROF, PA ) RESULT( PB ) (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' ) + CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'STATPROF_INTERP_3D_V', 'value can not be interpolated', OLOCAL = .TRUE. ) PB = XUNDEF END IF diff --git a/src/MNH/write_profilern.f90 b/src/MNH/write_profilern.f90 index ccb4fdcd2..e4e1263cb 100644 --- a/src/MNH/write_profilern.f90 +++ b/src/MNH/write_profilern.f90 @@ -229,7 +229,8 @@ PROFILER: DO JS = 1, INUMPROF 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 /= IPACKSIZE (sender side)' ) + IF ( IPOS-1 /= IPACKSIZE ) & + call Print_msg( NVERB_WARNING, 'IO', 'WRITE_PROFILER_n', 'IPOS /= 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 ) @@ -306,7 +307,8 @@ PROFILER: DO JS = 1, INUMPROF 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 /= IPACKSIZE (receiver side)' ) + IF ( IPOS-1 /= IPACKSIZE ) & + call Print_msg( NVERB_WARNING, 'IO', 'WRITE_PROFILER_n', 'IPOS /= IPACKSIZE (receiver side)', OLOCAL = .TRUE. ) END IF END IF diff --git a/src/MNH/write_stationn.f90 b/src/MNH/write_stationn.f90 index 4697b0e87..98c18dc67 100644 --- a/src/MNH/write_stationn.f90 +++ b/src/MNH/write_stationn.f90 @@ -198,7 +198,8 @@ STATION: DO JS = 1, INUMSTAT ZPACK(IPOS:IPOS+ISTORE-1) = TSTATIONS(IDX)%XSFCO2; IPOS = IPOS + ISTORE END IF - IF ( IPOS /= IPACKSIZE ) call Print_msg( NVERB_WARNING, 'IO', 'WRITE_STATION_n', 'IPOS /= IPACKSIZE (sender side)' ) + IF ( IPOS /= IPACKSIZE ) & + call Print_msg( NVERB_WARNING, 'IO', 'WRITE_STATION_n', 'IPOS /= 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 ) @@ -258,7 +259,8 @@ STATION: DO JS = 1, INUMSTAT TZSTATION%XSFCO2 = ZPACK(IPOS:IPOS+ISTORE-1); IPOS = IPOS + ISTORE END IF - IF ( IPOS /= IPACKSIZE ) call Print_msg( NVERB_WARNING, 'IO', 'WRITE_STATION_n', 'IPOS /= IPACKSIZE (receiver side)' ) + IF ( IPOS /= IPACKSIZE ) & + call Print_msg( NVERB_WARNING, 'IO', 'WRITE_STATION_n', 'IPOS /= IPACKSIZE (receiver side)', OLOCAL = .TRUE. ) END IF END IF -- GitLab From 4c16efba5fca6e81d6782cf9c20ed56a5d1470e3 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Fri, 1 Jul 2022 15:26:59 +0200 Subject: [PATCH 083/157] Philippe 01/07/2022: stations: minor bugfix: correct warning when buffer size is not as expected --- src/MNH/write_profilern.f90 | 4 ++-- src/MNH/write_stationn.f90 | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/MNH/write_profilern.f90 b/src/MNH/write_profilern.f90 index e4e1263cb..acda0bf50 100644 --- a/src/MNH/write_profilern.f90 +++ b/src/MNH/write_profilern.f90 @@ -230,7 +230,7 @@ PROFILER: DO JS = 1, INUMPROF END IF IF ( IPOS-1 /= IPACKSIZE ) & - call Print_msg( NVERB_WARNING, 'IO', 'WRITE_PROFILER_n', 'IPOS /= IPACKSIZE (sender side)', OLOCAL = .TRUE. ) + 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 ) @@ -308,7 +308,7 @@ PROFILER: DO JS = 1, INUMPROF END IF IF ( IPOS-1 /= IPACKSIZE ) & - call Print_msg( NVERB_WARNING, 'IO', 'WRITE_PROFILER_n', 'IPOS /= IPACKSIZE (receiver side)', OLOCAL = .TRUE. ) + call Print_msg( NVERB_WARNING, 'IO', 'WRITE_PROFILER_n', 'IPOS-1 /= IPACKSIZE (receiver side)', OLOCAL = .TRUE. ) END IF END IF diff --git a/src/MNH/write_stationn.f90 b/src/MNH/write_stationn.f90 index 98c18dc67..309b4eb21 100644 --- a/src/MNH/write_stationn.f90 +++ b/src/MNH/write_stationn.f90 @@ -198,8 +198,8 @@ STATION: DO JS = 1, INUMSTAT ZPACK(IPOS:IPOS+ISTORE-1) = TSTATIONS(IDX)%XSFCO2; IPOS = IPOS + ISTORE END IF - IF ( IPOS /= IPACKSIZE ) & - call Print_msg( NVERB_WARNING, 'IO', 'WRITE_STATION_n', 'IPOS /= IPACKSIZE (sender side)', OLOCAL = .TRUE. ) + 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 ) @@ -259,8 +259,8 @@ STATION: DO JS = 1, INUMSTAT TZSTATION%XSFCO2 = ZPACK(IPOS:IPOS+ISTORE-1); IPOS = IPOS + ISTORE END IF - IF ( IPOS /= IPACKSIZE ) & - call Print_msg( NVERB_WARNING, 'IO', 'WRITE_STATION_n', 'IPOS /= IPACKSIZE (receiver side)', OLOCAL = .TRUE. ) + IF ( IPOS-1 /= IPACKSIZE ) & + call Print_msg( NVERB_WARNING, 'IO', 'WRITE_STATION_n', 'IPOS-1 /= IPACKSIZE (receiver side)', OLOCAL = .TRUE. ) END IF END IF -- GitLab From 46e214d03a76143e34b7116b0e64d3cf616a3672 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Mon, 4 Jul 2022 11:01:25 +0200 Subject: [PATCH 084/157] Philippe 04/07/2022: workaroung GCC bug: date_time is not defined as an extended type of date (to prevent failure when reading arrays of date_type in namelists) --- src/MNH/modd_type_date.f90 | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/MNH/modd_type_date.f90 b/src/MNH/modd_type_date.f90 index e9717d321..d1b3078e8 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. @@ -47,8 +47,19 @@ type date 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 +end type date_time +#endif ! end module modd_type_date -- GitLab From 431626cb65555feb74d454541ea4ea725c0cfafb Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Mon, 11 Jul 2022 11:42:39 +0200 Subject: [PATCH 085/157] Philippe 11/07/2022: add Datetime_initialized_check function --- src/MNH/modd_type_date.f90 | 83 +++++++++++++++++++++++++++++++++++++- 1 file changed, 81 insertions(+), 2 deletions(-) diff --git a/src/MNH/modd_type_date.f90 b/src/MNH/modd_type_date.f90 index d1b3078e8..31b67ef89 100644 --- a/src/MNH/modd_type_date.f90 +++ b/src/MNH/modd_type_date.f90 @@ -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,7 +47,7 @@ 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) @@ -59,7 +60,85 @@ type :: date_time 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 -- GitLab From 2bc237431658021f75f48b9fcf2008be3be623b6 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Wed, 13 Jul 2022 09:52:46 +0200 Subject: [PATCH 086/157] Philippe 13/07/2022: date_time: correct problem with use of default constructor --- src/MNH/prep_ideal_case.f90 | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/MNH/prep_ideal_case.f90 b/src/MNH/prep_ideal_case.f90 index 0a4aa09b9..5169942d6 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. @@ -1480,7 +1480,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 @@ -1499,7 +1499,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 -- GitLab From 122d2ddfe3fa25a6b8489496652735b770594be0 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Wed, 13 Jul 2022 09:50:04 +0200 Subject: [PATCH 087/157] Philippe 13/07/2022: balloons: give balloons characteristics in namelist instead of hardcoded --- src/MNH/aircraft_balloon_evol.f90 | 12 +- src/MNH/ini_balloon.f90 | 683 +++++++++++------------------- src/MNH/modd_aircraft_balloon.f90 | 28 +- src/MNH/modn_balloons.f90 | 93 ++++ src/MNH/modn_flyers.f90 | 21 + src/MNH/read_exsegn.f90 | 12 + src/MNH/write_desfmn.f90 | 5 + 7 files changed, 396 insertions(+), 458 deletions(-) create mode 100644 src/MNH/modn_balloons.f90 create mode 100644 src/MNH/modn_flyers.f90 diff --git a/src/MNH/aircraft_balloon_evol.f90 b/src/MNH/aircraft_balloon_evol.f90 index d7de3a7c1..c79631fa0 100644 --- a/src/MNH/aircraft_balloon_evol.f90 +++ b/src/MNH/aircraft_balloon_evol.f90 @@ -455,7 +455,7 @@ IF ( .NOT. TPFLYER%LFLY ) THEN END IF CLASS DEFAULT - CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'AIRCRAFT_BALLOON_EVOL', 'unknown type for TPFLYER' ) + CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'AIRCRAFT_BALLOON_EVOL', 'unknown type for TPFLYER', OLOCAL = .TRUE. ) END SELECT ! @@ -636,7 +636,7 @@ IF ( TPFLYER%LFLY ) THEN ZXCOEF = MAX (0.,MIN(ZXCOEF,1.)) ZYCOEF = (TPFLYER%XY_CUR - ZYHATM(IJ)) / (ZYHATM(IJ+1) - ZYHATM(IJ)) ZYCOEF = MAX (0.,MIN(ZYCOEF,1.)) - IF ( TPFLYER%XALTLAUNCH /= XUNDEF ) THEN + IF ( TPFLYER%XALTLAUNCH /= XNEGUNDEF ) THEN IK00 = MAX ( COUNT (TPFLYER%XALTLAUNCH >= ZZM(1,1,:)), 1) IK01 = MAX ( COUNT (TPFLYER%XALTLAUNCH >= ZZM(1,2,:)), 1) IK10 = MAX ( COUNT (TPFLYER%XALTLAUNCH >= ZZM(2,1,:)), 1) @@ -646,7 +646,7 @@ IF ( TPFLYER%LFLY ) THEN ZZCOEF10 = (TPFLYER%XALTLAUNCH - ZZM(2,1,IK10)) / ( ZZM(2,1,IK10+1) - ZZM(2,1,IK10)) ZZCOEF11 = (TPFLYER%XALTLAUNCH - ZZM(2,2,IK11)) / ( ZZM(2,2,IK11+1) - ZZM(2,2,IK11)) TPFLYER%XRHO = FLYER_INTERP(ZRHO) - ELSE IF ( TPFLYER%XPRES /= XUNDEF ) THEN + ELSE IF ( TPFLYER%XPRES /= XNEGUNDEF ) THEN ZFLYER_EXN = (TPFLYER%XPRES/XP00)**(XRD/XCPD) IK00 = MAX ( COUNT (ZFLYER_EXN <= ZEXN(1,1,:)), 1) IK01 = MAX ( COUNT (ZFLYER_EXN <= ZEXN(1,2,:)), 1) @@ -661,7 +661,7 @@ IF ( TPFLYER%LFLY ) THEN CMNHMSG(1) = 'Error in balloon initial position (balloon ' // TRIM(TPFLYER%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' ) + CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'AIRCRAFT_BALLOON_EVOL', OLOCAL = .TRUE. ) END IF ! !* 5.2.2 Radiosounding balloon @@ -680,7 +680,7 @@ IF ( TPFLYER%LFLY ) THEN ZXCOEF = MAX (0.,MIN(ZXCOEF,1.)) ZYCOEF = (TPFLYER%XY_CUR - ZYHATM(IJ)) / (ZYHATM(IJ+1) - ZYHATM(IJ)) ZYCOEF = MAX (0.,MIN(ZYCOEF,1.)) - IF ( TPFLYER%XALTLAUNCH /= XUNDEF ) THEN + IF ( TPFLYER%XALTLAUNCH /= XNEGUNDEF ) THEN IK00 = MAX ( COUNT (TPFLYER%XALTLAUNCH >= ZZM(1,1,:)), 1) IK01 = MAX ( COUNT (TPFLYER%XALTLAUNCH >= ZZM(1,2,:)), 1) IK10 = MAX ( COUNT (TPFLYER%XALTLAUNCH >= ZZM(2,1,:)), 1) @@ -699,7 +699,7 @@ IF ( TPFLYER%LFLY ) THEN TPFLYER%XRHO = FLYER_INTERP(ZRHO) TPFLYER%XZ_CUR = FLYER_INTERP(ZZM) END IF - ELSE IF ( TPFLYER%XPRES /= XUNDEF ) THEN + ELSE IF ( TPFLYER%XPRES /= XNEGUNDEF ) THEN ZFLYER_EXN = (TPFLYER%XPRES/XP00)**(XRD/XCPD) IK00 = MAX ( COUNT (ZFLYER_EXN <= ZEXN(1,1,:)), 1) IK01 = MAX ( COUNT (ZFLYER_EXN <= ZEXN(1,2,:)), 1) diff --git a/src/MNH/ini_balloon.f90 b/src/MNH/ini_balloon.f90 index f9f2d1cd0..886f3f83e 100644 --- a/src/MNH/ini_balloon.f90 +++ b/src/MNH/ini_balloon.f90 @@ -18,7 +18,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,452 +93,259 @@ !! ------------- !! Original 15/05/2000 !! Apr,19, 2001 (G.Jaubert) add CVBALL type and switch in models -! P. Wautelet 06/2022: reorganize flyers +! 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: XUNDEF USE MODE_MSG +USE MODN_BALLOONS + IMPLICIT NONE -! -! -!* 0.1 declarations of arguments -! -! -!------------------------------------------------------------------------------- -! -! 0.2 declaration of local variables -! + INTEGER :: JI -!---------------------------------------------------------------------------- -NBALLOONS = 0 -ALLOCATE( TBALLOONS(NBALLOONS) ) +ALLOCATE( TBALLOONS (NBALLOONS) ) + +!Treat balloon data read in namelist +DO JI = 1, NBALLOONS + 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' ) + END IF + TBALLOONS(JI)%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' ) + 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) ) // ')' ) + END IF + 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' ) + CMODEL(JI) = 'FIX' + NMODEL(JI) = 1 + END IF + TBALLOONS(JI)%CMODEL = CMODEL(JI) + TBALLOONS(JI)%NMODEL = NMODEL(JI) + + TBALLOONS(JI)%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) ) ) + TBALLOONS(JI)%TLAUNCH = TLAUNCH(JI) + + IF ( XLATLAUNCH(JI) == XUNDEF ) & + CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'INI_BALLOON', 'XLATLAUNCH not provided for balloon ' // TRIM( CTITLE(JI) ) ) + TBALLOONS(JI)%XLATLAUNCH = XLATLAUNCH(JI) + + IF ( XLONLAUNCH(JI) == XUNDEF ) & + CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'INI_BALLOON', 'XLONLAUNCH not provided for balloon ' // TRIM( CTITLE(JI) ) ) + TBALLOONS(JI)%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' ) + 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) ) ) + XTSTEP(JI) = 60. + END IF + TBALLOONS(JI)%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' ) + 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) ) ) + TBALLOONS(JI)%XALTLAUNCH = XALTLAUNCH(JI) + TBALLOONS(JI)%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.' ) + XWASCENT(JI) = 0. + END IF + TBALLOONS(JI)%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' ) + XAERODRAG(JI) = 0.44 + END IF + TBALLOONS(JI)%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' ) + XINDDRAG(JI) = 0.014 + END IF + TBALLOONS(JI)%XINDDRAG = XINDDRAG(JI) + + IF ( XMASS(JI) == XNEGUNDEF ) & + CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_BALLOON', 'mass not provided for CVBALL balloon ' // TRIM( CTITLE(JI) ) ) + TBALLOONS(JI)%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) ) ) + + IF ( XDIAMETER(JI) <= 0. ) THEN + TBALLOONS(JI)%XVOLUME = XVOLUME(JI) + TBALLOONS(JI)%XDIAMETER = ( (3. * XVOLUME(JI) ) / ( 4. * XPI ) ) ** ( 1. / 3. ) + ELSE IF ( XVOLUME(JI) <= 0 ) THEN + TBALLOONS(JI)%XDIAMETER = XDIAMETER(JI) + TBALLOONS(JI)%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) ) ) + 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) ) ) + 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) ) ) + TBALLOONS(JI)%XALTLAUNCH = XALTLAUNCH(JI) + TBALLOONS(JI)%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' ) + XWASCENT(JI) = XNEGUNDEF + END IF + TBALLOONS(JI)%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' ) + XAERODRAG(JI) = XNEGUNDEF + END IF + TBALLOONS(JI)%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' ) + XINDDRAG(JI) = XNEGUNDEF + END IF + TBALLOONS(JI)%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' ) + XMASS(JI) = XNEGUNDEF + END IF + TBALLOONS(JI)%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' ) + XDIAMETER(JI) = XNEGUNDEF + END IF + TBALLOONS(JI)%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' ) + XVOLUME(JI) = XNEGUNDEF + END IF + TBALLOONS(JI)%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) ) ) + TBALLOONS(JI)%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.' ) + XWASCENT(JI) = 5. + END IF + TBALLOONS(JI)%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' ) + XPRES(JI) = XNEGUNDEF + END IF + TBALLOONS(JI)%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' ) + XAERODRAG(JI) = XNEGUNDEF + END IF + TBALLOONS(JI)%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' ) + XINDDRAG(JI) = XNEGUNDEF + END IF + TBALLOONS(JI)%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' ) + XMASS(JI) = XNEGUNDEF + END IF + TBALLOONS(JI)%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' ) + XDIAMETER(JI) = XNEGUNDEF + END IF + TBALLOONS(JI)%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' ) + XVOLUME(JI) = XNEGUNDEF + END IF + TBALLOONS(JI)%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) ) ) + + END SELECT +END DO + +CALL BALLOONS_NML_DEALLOCATE() -IF ( NBALLOONS < 1 ) RETURN -! -!* 1. Balloon number 1 -! ---------------- -#if 0 -! -!* model number -! -TBALLOONS(1)%NMODEL = 0 -TBALLOONS(1)%CMODEL = 'MOB' -! -!* balloon type -! -TBALLOONS(1)%CTYPE = 'CVBALL' -! -!* balloon name -! -TBALLOONS(1)%CTITLE = 'CVB1MOBI' -! -!* launching date and time -! -TBALLOONS(1)%TLAUNCH%nyear = 1999 -TBALLOONS(1)%TLAUNCH%nmonth = 09 -TBALLOONS(1)%TLAUNCH%nday = 19 -TBALLOONS(1)%TLAUNCH%xtime = 32460. -! -!* latitude and longitude of launching site (decimal degree) -! -TBALLOONS(1)%XLATLAUNCH = 45.800 -TBALLOONS(1)%XLONLAUNCH = 8.629 -! -!* altitude of the launching site for 'RADIOS' -!* altitude or pressure of the flight level for 'ISODEN' -! -!TBALLOONS(1)%XALTLAUNCH = 3959. -TBALLOONS(1)%XPRES = 98450. -! -!* time step for data storage (s) -! -TBALLOONS(1)%TFLYER_TIME%XTSTEP = 20. -! -!* ascentional vertical speed of the ballon (in calm air) (for 'RADIOS') -! -TBALLOONS(1)%XWASCENT = 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') -! -TBALLOONS(1)%XAERODRAG = 0.44 -TBALLOONS(1)%XINDDRAG = 0.014 -TBALLOONS(1)%XVOLUME = 3.040 -TBALLOONS(1)%XMASS = 2.4516 -TBALLOONS(1)%XDIAMETER = ((3.*TBALLOONS(1)%XVOLUME)/(4.*XPI))**(1./3.) -! -IF ( NBALLOONS < 2 ) RETURN -#else -CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_BALLOON', 'balloon characteristics are commented' ) -#endif -!---------------------------------------------------------------------------- -! -!* 2. Balloon number 2 -! ---------------- -#if 0 -! -!* model number -! -TBALLOONS(2)%NMODEL = 0 -TBALLOONS(2)%MODEL = 'MOB' -! -!* balloon type -! -TBALLOONS(2)%CTYPE = 'CVBALL' -! -!* balloon name -! -TBALLOONS(2)%CTITLE = 'CVB2MOBI' -! -!* launching date and time -! -TBALLOONS(2)%TLAUNCH%nyear = 1999 -TBALLOONS(2)%TLAUNCH%nmonth = 09 -TBALLOONS(2)%TLAUNCH%nday = 19 -TBALLOONS(2)%TLAUNCH%xtime = 39660. -! -!* latitude and longitude of launching site (decimal degree) -! -TBALLOONS(2)%XLATLAUNCH = 45.800 -TBALLOONS(2)%XLONLAUNCH = 8.630 -! -!* altitude of the launching site for 'RADIOS' -!* altitude or pressure of the flight level for 'ISODEN' -! -!TBALLOONS(2)%XALTLAUNCH = 3959. -TBALLOONS(2)%XPRES = 98490. -! -!* time step for data storage (s) -! -TBALLOONS(2)%TFLYER_TIME%XTSTEP = 20. -! -!* ascentional vertical speed of the ballon (in calm air) (for 'RADIOS') -! -TBALLOONS(2)%XWASCENT = 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') -! -TBALLOONS(2)%XAERODRAG = 0.44 -TBALLOONS(2)%XINDDRAG = 0.014 -TBALLOONS(2)%XVOLUME = 3.040 -TBALLOONS(2)%XMASS = 2.58087 -TBALLOONS(2)%XDIAMETER = ((3.*TBALLOONS(2)%XVOLUME)/(4.*XPI))**(1./3.) -! -IF ( NBALLOONS < 3 ) RETURN -#else -CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_BALLOON', 'balloon characteristics are commented' ) -#endif -!---------------------------------------------------------------------------- -! -!* 3. Balloon number 3 -! ---------------- -#if 0 -! -!* model number -! -TBALLOONS(3)%NMODEL = 0 -TBALLOONS(3)%CMODEL = 'MOB' -! -!* balloon type -! -TBALLOONS(3)%CTYPE = 'RADIOS' -! -!* balloon name -! -TBALLOONS(3)%CTITLE = 'RSMASE19' -! -!* launching date and time -! -TBALLOONS(3)%TLAUNCH%nyear = 1999 -TBALLOONS(3)%TLAUNCH%nmonth = 09 -TBALLOONS(3)%TLAUNCH%nday = 19 -TBALLOONS(3)%TLAUNCH%xtime = 68400. -! -!* latitude and longitude of launching site (decimal degree) -! -TBALLOONS(3)%XLATLAUNCH = 46.810 -TBALLOONS(3)%XLONLAUNCH = 9.39 -! -!* altitude of the launching site for 'RADIOS' -!* altitude or pressure of the flight level for 'ISODEN' -! -TBALLOONS(3)%XALTLAUNCH = 865. -!TBALLOONS(3)%XPRES = 62360. -! -!* time step for data storage (s) -! -TBALLOONS(3)%TFLYER_TIME%XTSTEP = 20. -! -!* ascentional vertical speed of the ballon (in calm air) (for 'RADIOS') -! -TBALLOONS(3)%XWASCENT = 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') -! -TBALLOONS(3)%XAERODRAG = 0.44 -TBALLOONS(3)%XINDDRAG = 0.014 -TBALLOONS(3)%XVOLUME = 3.040 -TBALLOONS(3)%XMASS = 2.4516 -TBALLOONS(3)%XDIAMETER = ((3.*TBALLOONS(3)%XVOLUME)/(4.*XPI))**(1./3.) -! -IF ( NBALLOONS < 4 ) RETURN -#else -CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_BALLOON', 'balloon characteristics are commented' ) -#endif -!---------------------------------------------------------------------------- -! -!* 4. Balloon number 4 -! ---------------- -#if 0 -! -!* model number -! -TBALLOONS(4)%NMODEL = 0 -TBALLOONS(4)%CMODEL = 'FIX' -! -!* balloon type -! -TBALLOONS(4)%CTYPE = 'CVBALL' -! -!* balloon name -! -TBALLOONS(4)%CTITLE = 'CVB1ACVB' -! -!* launching date and time -! -TBALLOONS(4)%TLAUNCH%nyear = 1999 -TBALLOONS(4)%TLAUNCH%nmonth = 09 -TBALLOONS(4)%TLAUNCH%nday = 19 -TBALLOONS(4)%TLAUNCH%xtime = 32460. -! -!* latitude and longitude of launching site (decimal degree) -! -TBALLOONS(4)%XLATLAUNCH = 45.922 -TBALLOONS(4)%XLONLAUNCH = 8.646 -! -!* altitude of the launching site for 'RADIOS' -!* altitude or pressure of the flight level for 'ISODEN' -! -TBALLOONS(4)%XALTLAUNCH = 3959. -!TBALLOONS(4)%XPRES = 62360. -! -!* time step for data storage (s) -! -TBALLOONS(4)%TFLYER_TIME%XTSTEP = 20. -! -!* ascentional vertical speed of the ballon (in calm air) (for 'RADIOS') -! -!TBALLOONS(4)%XWASCENT = 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') -! -TBALLOONS(4)%XAERODRAG = 0.44 -TBALLOONS(4)%XINDDRAG = 0.014 -TBALLOONS(4)%XVOLUME = 3.040 -TBALLOONS(4)%XMASS = 2.4516 -TBALLOONS(4)%XDIAMETER = ((3.*TBALLOONS(4)%XVOLUME)/(4.*XPI))**(1./3.) -! -IF ( NBALLOONS < 5 ) RETURN -#else -CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_BALLOON', 'balloon characteristics are commented' ) -#endif -!---------------------------------------------------------------------------- -! -!* 5. Balloon number 5 -! ---------------- -#if 0 -! -!* model number -! -TBALLOONS(5)%NMODEL = 0 -TBALLOONS(5)%CMODEL = 'FIX' -! -!* balloon type -! -TBALLOONS(5)%CTYPE = 'CVBALL' -! -!* balloon name -! -TBALLOONS(5)%CTITLE = 'CVB1DEPA' -! -!* launching date and time -! -TBALLOONS(5)%TLAUNCH%nyear = 1999 -TBALLOONS(5)%TLAUNCH%nmonth = 09 -TBALLOONS(5)%TLAUNCH%nday = 19 -TBALLOONS(5)%TLAUNCH%xtime = 32435. -! -!* latitude and longitude of launching site (decimal degree) -! -TBALLOONS(5)%XLATLAUNCH = 45.800 -TBALLOONS(5)%XLONLAUNCH = 8.630 -! -!* altitude of the launching site for 'RADIOS' -!* altitude or pressure of the flight level for 'ISODEN' -! -TBALLOONS(5)%XALTLAUNCH = 340. -!TBALLOONS(5)%XPRES = 62360. -! -!* time step for data storage (s) -! -TBALLOONS(5)%TFLYER_TIME%XTSTEP = 20. -! -!* ascentional vertical speed of the ballon (in calm air) (for 'RADIOS') -! -!TBALLOONS(5)%XWASCENT = 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') -! -TBALLOONS(5)%XAERODRAG = 0.44 -TBALLOONS(5)%XINDDRAG = 0.014 -TBALLOONS(5)%XVOLUME = 3.040 -TBALLOONS(5)%XMASS = 2.4516 -TBALLOONS(5)%XDIAMETER = ((3.*TBALLOONS(5)%XVOLUME)/(4.*XPI))**(1./3.) -! -IF ( NBALLOONS < 6 ) RETURN -#else -CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_BALLOON', 'balloon characteristics are commented' ) -#endif -!---------------------------------------------------------------------------- -! -!* 6. Balloon number 6 -! ---------------- -#if 0 -! -!* model number -! -TBALLOONS(6)%NMODEL = 0 -TBALLOONS(6)%CMODEL = 'FIX' -! -!* balloon type -! -TBALLOONS(6)%CTYPE = 'CVBALL' -! -!* balloon name -! -TBALLOONS(6)%CTITLE = 'CVB1RCVB' -! -!* launching date and time -! -TBALLOONS(6)%TLAUNCH%nyear = 1999 -TBALLOONS(6)%TLAUNCH%nmonth = 09 -TBALLOONS(6)%TLAUNCH%nday = 19 -TBALLOONS(6)%TLAUNCH%xtime = 32460. -! -!* latitude and longitude of launching site (decimal degree) -! -TBALLOONS(6)%XLATLAUNCH = 45.922 -TBALLOONS(6)%XLONLAUNCH = 8.646 -! -!* altitude of the launching site for 'RADIOS' -!* altitude or pressure of the flight level for 'ISODEN' -! -!TBALLOONS(6)%XALTLAUNCH = 3959. -!TBALLOONS(6)%XPRES = 62360. -! -!* time step for data storage (s) -! -TBALLOONS(6)%TFLYER_TIME%XTSTEP = 20. -! -!* ascentional vertical speed of the ballon (in calm air) (for 'RADIOS') -! -!TBALLOONS(6)%XWASCENT = 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') -! -TBALLOONS(6)%XAERODRAG = 0.44 -TBALLOONS(6)%XINDDRAG = 0.014 -TBALLOONS(6)%XVOLUME = 3.040 -TBALLOONS(6)%XMASS = 2.4516 -TBALLOONS(6)%XDIAMETER = ((3.*TBALLOONS(6)%XVOLUME)/(4.*XPI))**(1./3.) -! -IF ( NBALLOONS < 7 ) RETURN -#else -CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_BALLOON', 'balloon characteristics are commented' ) -#endif -!---------------------------------------------------------------------------- -! -!* 7. Balloon number 7 -! ---------------- -#if 0 -! -!* model number -! -TBALLOONS(7)%NMODEL = 0 -TBALLOONS(7)%CMODEL = 'FIX' -! -!* balloon type -! -TBALLOONS(7)%CTYPE = 'CVBALL' -! -!* balloon name -! -TBALLOONS(7)%CTITLE = 'CVB1PISO' -! -!* launching date and time -! -TBALLOONS(7)%TLAUNCH%nyear = 1999 -TBALLOONS(7)%TLAUNCH%nmonth = 09 -TBALLOONS(7)%TLAUNCH%nday = 19 -TBALLOONS(7)%TLAUNCH%xtime = 32460. -! -!* latitude and longitude of launching site (decimal degree) -! -TBALLOONS(7)%XLATLAUNCH = 45.922 -TBALLOONS(7)%XLONLAUNCH = 8.646 -! -!* altitude of the launching site for 'RADIOS' -!* altitude or pressure of the flight level for 'ISODEN' -! -!TBALLOONS(7)%XALTLAUNCH = 3959. -TBALLOONS(7)%XPRES = 62360. -! -!* time step for data storage (s) -! -TBALLOONS(7)%TFLYER_TIME%XTSTEP = 20. -! -!* ascentional vertical speed of the ballon (in calm air) (for 'RADIOS') -! -!TBALLOONS(7)%XWASCENT = 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') -! -TBALLOONS(7)%XAERODRAG = 0.44 -TBALLOONS(7)%XINDDRAG = 0.014 -TBALLOONS(7)%XVOLUME = 3.040 -TBALLOONS(7)%XMASS = 2.4516 -TBALLOONS(7)%XDIAMETER = ((3.*TBALLOONS(7)%XVOLUME)/(4.*XPI))**(1./3.) -#else -CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_BALLOON', 'balloon characteristics are commented' ) -#endif -! !---------------------------------------------------------------------------- ! END SUBROUTINE INI_BALLOON diff --git a/src/MNH/modd_aircraft_balloon.f90 b/src/MNH/modd_aircraft_balloon.f90 index a0e6e5070..4e71d254d 100644 --- a/src/MNH/modd_aircraft_balloon.f90 +++ b/src/MNH/modd_aircraft_balloon.f90 @@ -41,7 +41,7 @@ ! ------------ ! ! -use modd_parameters, only: XUNDEF +use modd_parameters, only: XNEGUNDEF, XUNDEF USE MODD_TYPE_STATPROF, ONLY: TSTATPROFTIME use modd_type_date, only: date_time @@ -78,10 +78,10 @@ TYPE :: TFLYERDATA ! !* current position of the balloon/aircraft ! - REAL :: XX_CUR = XUNDEF ! current x - REAL :: XY_CUR = XUNDEF ! current y - REAL :: XZ_CUR = XUNDEF ! current z (if 'RADIOS' or 'AIRCRA' and 'ALTDEF' = T) - REAL :: XP_CUR = XUNDEF ! current p (if 'AIRCRA' and 'ALTDEF' = F) + 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) + REAL :: XP_CUR = XNEGUNDEF ! current p (if 'AIRCRA' and 'ALTDEF' = F) ! !* data records ! @@ -150,15 +150,15 @@ TYPE, EXTENDS( TFLYERDATA ) :: TBALLOONDATA REAL :: XLONLAUNCH = XUNDEF ! lontitude of launch REAL :: XXLAUNCH = XUNDEF ! X coordinate of launch REAL :: XYLAUNCH = XUNDEF ! Y coordinate of launch - REAL :: XALTLAUNCH = XUNDEF ! altitude of launch (if 'RADIOS' or 'ISODEN' or 'CVBALL') - REAL :: XWASCENT = 5. ! ascent vertical speed, m/s (if 'RADIOS') - REAL :: XRHO = XUNDEF ! density of launch (if 'ISODEN') - REAL :: XPRES = XUNDEF ! pressure of launch (if 'ISODEN') - REAL :: XDIAMETER = XUNDEF ! apparent diameter of the balloon (m) (if 'CVBALL') - REAL :: XAERODRAG = XUNDEF ! aerodynamic drag coefficient of the balloon (if 'CVBALL') - REAL :: XINDDRAG = XUNDEF ! induced drag coefficient (i.e. air shifted by the balloon) (if 'CVBALL') - REAL :: XVOLUME = XUNDEF ! volume of the balloon (m3) (if 'CVBALL') - REAL :: XMASS = XUNDEF ! mass of the balloon (kg) (if 'CVBALL') + 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') END TYPE TBALLOONDATA INTEGER :: NAIRCRAFTS = 0 ! Total number of aircrafts diff --git a/src/MNH/modn_balloons.f90 b/src/MNH/modn_balloons.f90 new file mode 100644 index 000000000..f77356c88 --- /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 000000000..0c8b6e3e2 --- /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/read_exsegn.f90 b/src/MNH/read_exsegn.f90 index 243ed7665..a3303a5fe 100644 --- a/src/MNH/read_exsegn.f90 +++ b/src/MNH/read_exsegn.f90 @@ -304,10 +304,12 @@ END MODULE MODI_READ_EXSEG_n ! S. Riette 11/05/2021: HighLow cloud ! 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 !------------------------------------------------------------------------------ ! !* 0. DECLARATIONS ! ------------ +USE MODD_AIRCRAFT_BALLOON, ONLY: NAIRCRAFTS, NBALLOONS USE MODD_BLOWSNOW USE MODD_BUDGET USE MODD_CH_AEROSOL @@ -342,6 +344,7 @@ USE MODI_TEST_NAM_VAR USE MODN_2D_FRC USE MODN_ADV_n ! The final filling of these modules for the model n is USE MODN_BACKUP +USE MODN_BALLOONS, ONLY: BALLOONS_NML_ALLOCATE, NAM_BALLOONS USE MODN_BLANK_n USE MODN_BLOWSNOW USE MODN_BLOWSNOW_n @@ -363,6 +366,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 @@ -844,6 +848,14 @@ 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 ( 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 ! !------------------------------------------------------------------------------- diff --git a/src/MNH/write_desfmn.f90 b/src/MNH/write_desfmn.f90 index c88c912d4..046b0bd1e 100644 --- a/src/MNH/write_desfmn.f90 +++ b/src/MNH/write_desfmn.f90 @@ -147,6 +147,7 @@ END MODULE MODI_WRITE_DESFM_n !! Modification F.Auguste 02/2021 add IBM !! E.Jezequel 02/2021 add stations read from CSV file ! P. Wautelet 27/04/2022: add namelist for profilers +! P. Wautelet 13/07/2022: add namelist for flyers and balloons !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -163,6 +164,7 @@ USE MODD_STATION_n, ONLY: LSTATION USE MODE_MSG ! USE MODN_BACKUP +USE MODN_BALLOONS USE MODN_CONF USE MODN_DYN USE MODN_NESTING @@ -211,6 +213,7 @@ USE MODN_IBM_PARAM_n USE MODN_RECYCL_PARAM_n USE MODN_PROFILER_n USE MODN_STATION_n +USE MODN_FLYERS ! IMPLICIT NONE ! @@ -451,6 +454,8 @@ 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_balloon: WRITE(UNIT=ILUSEG,NML=NAM_BALLOONS) ! ! ! -- GitLab From 1e3ba6d94784a81f32bad482e9a6016289c21f1a Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Fri, 19 Aug 2022 09:53:28 +0200 Subject: [PATCH 088/157] Philippe 19/08/2022: bugfix: IO_File_check_format_exist: broadcast cformat if changed (cherry picked from commit ca0712732dc623b16d1f89ad6a3962b117039c6b) --- src/LIB/SURCOUCHE/src/mode_io_file.f90 | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/LIB/SURCOUCHE/src/mode_io_file.f90 b/src/LIB/SURCOUCHE/src/mode_io_file.f90 index e269accf0..6ed3a03c2 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-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. @@ -38,6 +38,7 @@ ! P. Wautelet 12/03/2019: simplify opening of IO split files ! 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 !----------------------------------------------------------------- module mode_io_file @@ -666,9 +667,11 @@ end subroutine IO_Transfer_list_addto subroutine IO_File_check_format_exist( tpfile ) +use modd_mpif type(tfiledata), intent(inout) :: tpfile ! File structure +integer :: ierr logical :: gexist_lfi, gexist_nc4 @@ -720,6 +723,9 @@ IF (TPFILE%LMASTER) THEN end if MODE END IF +if ( tpfile%cmode == 'READ' ) & + call MPI_BCAST( tpfile%cformat, Len( tpfile%cformat ), MPI_CHARACTER, tpfile%nmaster_rank - 1, tpfile%nmpicomm, ierr ) + end subroutine IO_File_check_format_exist -- GitLab From f45d087e690dbdaa1f7fb11f711209c3eed4735d Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Fri, 19 Aug 2022 10:48:32 +0200 Subject: [PATCH 089/157] Philippe 19/08/2022: bugfix: deallocate ballon namelist data only if allocated --- src/MNH/ini_balloon.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/MNH/ini_balloon.f90 b/src/MNH/ini_balloon.f90 index 886f3f83e..f52a2f994 100644 --- a/src/MNH/ini_balloon.f90 +++ b/src/MNH/ini_balloon.f90 @@ -344,7 +344,7 @@ DO JI = 1, NBALLOONS END SELECT END DO -CALL BALLOONS_NML_DEALLOCATE() +IF ( NBALLOONS > 0 ) CALL BALLOONS_NML_DEALLOCATE() !---------------------------------------------------------------------------- ! -- GitLab From 881fea18e72ef9814353c16cfd61f6759f0fea56 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Fri, 19 Aug 2022 16:09:53 +0200 Subject: [PATCH 090/157] Philippe 19/08/2022: provide aircraft characteristics in namelist and CSV file instead of hardcoded --- src/MNH/ini_aircraft.f90 | 2191 ++---------------------------- src/MNH/ini_aircraft_balloon.f90 | 4 +- src/MNH/ini_balloon.f90 | 14 +- src/MNH/modn_aircrafts.f90 | 69 + src/MNH/read_exsegn.f90 | 11 +- src/MNH/write_desfmn.f90 | 6 +- 6 files changed, 236 insertions(+), 2059 deletions(-) create mode 100644 src/MNH/modn_aircrafts.f90 diff --git a/src/MNH/ini_aircraft.f90 b/src/MNH/ini_aircraft.f90 index af8ecdaaf..f6355579a 100644 --- a/src/MNH/ini_aircraft.f90 +++ b/src/MNH/ini_aircraft.f90 @@ -3,6 +3,18 @@ !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 ! ####################### @@ -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 @@ -84,2087 +96,160 @@ !! 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 +USE MODD_CONF, ONLY: NMODEL_NEST => NMODEL +USE MODD_PARAMETERS, ONLY: XNEGUNDEF USE MODE_MSG +USE MODN_AIRCRAFTS + IMPLICIT NONE -! -! -!* 0.1 declarations of arguments -! -! -!------------------------------------------------------------------------------- -! -! 0.2 declaration of local variables -! -! -!---------------------------------------------------------------------------- -NAIRCRAFTS = 0 + +INTEGER :: JI ALLOCATE( TAIRCRAFTS(NAIRCRAFTS) ) -IF ( NAIRCRAFTS < 1 ) RETURN -! -!* 1. Aircraft number 1 -! ----------------- -#if 0 -! -!* model number -! -TAIRCRAFTS(1)%NMODEL = 0 -! -!* model switch -! -TAIRCRAFTS(1)%CMODEL = 'FIX' -! -!* aircraft type -! -TAIRCRAFTS(1)%CTYPE = 'AIRCRA' -! -!* aircraft flight name -! -TAIRCRAFTS(1)%CTITLE = 'DIMO19A' -! -!* time step for storage -! -TAIRCRAFTS(1)%TFLYER_TIME%XTSTEP = 60. -! -!* take-off date and time -! -TAIRCRAFTS(1)%TLAUNCH%nyear = 2007 -TAIRCRAFTS(1)%TLAUNCH%nmonth = 04 -TAIRCRAFTS(1)%TLAUNCH%nday = 19 -TAIRCRAFTS(1)%TLAUNCH%xtime = 32280. -! -!* number of flight segments -! -TAIRCRAFTS(1)%NSEG = 168 -! -!* initalisation of flag for pressure (T) or Z(F) for aicraft altitude -! -TAIRCRAFTS(1)%LALTDEF = .TRUE. +!Treat aircraft data read in namelist +DO JI = 1, NAIRCRAFTS + 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 aircraft number ', JI + CMNHMSG(2) = 'title set to ' // TRIM( CTITLE(JI) ) + CALL PRINT_MSG( NVERB_INFO, 'GEN', 'INI_AIRCRAFT' ) + END IF + TAIRCRAFTS(JI)%CTITLE = CTITLE(JI) + + 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' ) + 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) ) // ')' ) + END IF + 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' ) + CMODEL(JI) = 'FIX' + NMODEL(JI) = 1 + END IF + TAIRCRAFTS(JI)%CMODEL = CMODEL(JI) + TAIRCRAFTS(JI)%NMODEL = NMODEL(JI) + + TAIRCRAFTS(JI)%CTYPE = CTYPE(JI) + + 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) ) ) + TAIRCRAFTS(JI)%TLAUNCH = TLAUNCH(JI) + + 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' ) + 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) ) ) + XTSTEP(JI) = 60. + END IF + TAIRCRAFTS(JI)%TFLYER_TIME%XTSTEP = XTSTEP(JI) + + IF ( NPOS(JI) < 1 ) THEN + CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'INI_AIRCRAFT', 'NPOS should be at least 1 for aircraft ' // TRIM( CTITLE(JI) ) ) + END IF + TAIRCRAFTS(JI)%NSEG = NPOS(JI)-1 + + TAIRCRAFTS(JI)%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) ) ) + + ! Allocate trajectory data + ALLOCATE( TAIRCRAFTS(JI)%XSEGTIME(TAIRCRAFTS(JI)%NSEG ) ); TAIRCRAFTS(JI)%XSEGTIME(:) = XNEGUNDEF + ALLOCATE( TAIRCRAFTS(JI)%XSEGLAT (TAIRCRAFTS(JI)%NSEG+1) ); TAIRCRAFTS(JI)%XSEGLAT(:) = XNEGUNDEF + ALLOCATE( TAIRCRAFTS(JI)%XSEGLON (TAIRCRAFTS(JI)%NSEG+1) ); TAIRCRAFTS(JI)%XSEGLON(:) = XNEGUNDEF + IF ( TAIRCRAFTS(JI)%LALTDEF ) THEN + ALLOCATE( TAIRCRAFTS(JI)%XSEGP (TAIRCRAFTS(JI)%NSEG+1) ); TAIRCRAFTS(JI)%XSEGP(:) = XNEGUNDEF + ELSE + ALLOCATE( TAIRCRAFTS(JI)%XSEGZ (TAIRCRAFTS(JI)%NSEG+1) ); TAIRCRAFTS(JI)%XSEGZ(:) = XNEGUNDEF + END IF + + ! Read CSV data (trajectory) + CALL AIRCRAFT_CSV_READ( TAIRCRAFTS(JI), CFILE(JI) ) + +END DO + +IF ( NAIRCRAFTS > 0 ) CALL AIRCRAFTS_NML_DEALLOCATE() ! -!* allocation of the arrays -! -ALLOCATE(TAIRCRAFTS(1)%XSEGTIME(TAIRCRAFTS(1)%NSEG )) -ALLOCATE(TAIRCRAFTS(1)%XSEGLAT (TAIRCRAFTS(1)%NSEG+1)) -ALLOCATE(TAIRCRAFTS(1)%XSEGLON (TAIRCRAFTS(1)%NSEG+1)) -! -!* duration of the segments (seconds) -! -TAIRCRAFTS(1)%XSEGTIME = (/ 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 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) -! -TAIRCRAFTS(1)%XSEGLAT = (/ 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) -! -TAIRCRAFTS(1)%XSEGLON = (/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 (TAIRCRAFTS(1)%LALTDEF) THEN - ALLOCATE(TAIRCRAFTS(1)%XSEGP (TAIRCRAFTS(1)%NSEG+1)) - TAIRCRAFTS(1)%XSEGP = 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(TAIRCRAFTS(1)%XSEGZ (TAIRCRAFTS(1)%NSEG+1)) -TAIRCRAFTS(1)%XSEGZ = (/8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -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 -! -IF ( NAIRCRAFTS < 2 ) RETURN -#else -CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_AIRCRAFT', 'aircraft characteristics are commented' ) -#endif !---------------------------------------------------------------------------- ! -!* 1. Aircraft number 2 -! ----------------- -#if 0 -! -!* model number -! -TAIRCRAFTS(2)%NMODEL = 0 -! -!* model switch ! -TAIRCRAFTS(2)%CMODEL = 'FIX' -! -!* aircraft type -! -TAIRCRAFTS(2)%CTYPE = 'AIRCRA' +END SUBROUTINE INI_AIRCRAFT -!* aircraft flight name -! -TAIRCRAFTS(2)%CTITLE = 'DIMO19B' -! -!* time step for storage -! -TAIRCRAFTS(2)%TFLYER_TIME%XTSTEP = 60. -! -!* take-off date and time -! -TAIRCRAFTS(2)%TLAUNCH%nyear = 2007 -TAIRCRAFTS(2)%TLAUNCH%nmonth = 04 -TAIRCRAFTS(2)%TLAUNCH%nday = 19 -TAIRCRAFTS(2)%TLAUNCH%xtime = 48060. -! -!* number of flight segments -! -TAIRCRAFTS(2)%NSEG = 198 -! -!* initalisation of flag for pressure (T) or Z(F) for aicraft altitude -! -TAIRCRAFTS(2)%LALTDEF = .TRUE. -! -!* allocation of the arrays -! -ALLOCATE(TAIRCRAFTS(2)%XSEGTIME(TAIRCRAFTS(2)%NSEG )) -ALLOCATE(TAIRCRAFTS(2)%XSEGLAT (TAIRCRAFTS(2)%NSEG+1)) -ALLOCATE(TAIRCRAFTS(2)%XSEGLON (TAIRCRAFTS(2)%NSEG+1)) -! -!* duration of the segments (seconds) -! -TAIRCRAFTS(2)%XSEGTIME = (/60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 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) -! -TAIRCRAFTS(2)%XSEGLAT = (/ 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) -! -TAIRCRAFTS(2)%XSEGLON = (/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 (TAIRCRAFTS(2)%LALTDEF) THEN - ALLOCATE(TAIRCRAFTS(2)%XSEGP (TAIRCRAFTS(2)%NSEG+1)) -TAIRCRAFTS(2)%XSEGP = 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(TAIRCRAFTS(2)%XSEGZ (TAIRCRAFTS(2)%NSEG+1)) - TAIRCRAFTS(2)%XSEGZ = (/8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -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 -! -IF ( NAIRCRAFTS < 3 ) RETURN -#else -CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_AIRCRAFT', 'aircraft characteristics are commented' ) -#endif -!---------------------------------------------------------------------------- -! -!* 1. Aircraft number 3 -! ----------------- -#if 0 -! -!* model number -! -TAIRCRAFTS(3)%NMODEL = 0 -! -!* model switch -! -TAIRCRAFTS(3)%CMODEL = 'FIX' -! -!* aircraft type -! -TAIRCRAFTS(3)%CTYPE = 'AIRCRA' -!* aircraft flight name -! -TAIRCRAFTS(3)%CTITLE = 'SAAL19A' -! -!* time step for storage -! -TAIRCRAFTS(3)%TFLYER_TIME%XTSTEP = 30. -! -!* take-off date and time -! -TAIRCRAFTS(3)%TLAUNCH%nyear = 2007 -TAIRCRAFTS(3)%TLAUNCH%nmonth = 04 -TAIRCRAFTS(3)%TLAUNCH%nday = 19 -TAIRCRAFTS(3)%TLAUNCH%xtime = 45369 -! -!* number of flight segments -! -TAIRCRAFTS(3)%NSEG = 39 -! -!* initalisation of flag for pressure (T) or Z(F) for aicraft altitude -! -TAIRCRAFTS(3)%LALTDEF = .TRUE. -! -!* allocation of the arrays -! -ALLOCATE(TAIRCRAFTS(3)%XSEGTIME(TAIRCRAFTS(3)%NSEG )) -ALLOCATE(TAIRCRAFTS(3)%XSEGLAT (TAIRCRAFTS(3)%NSEG+1)) -ALLOCATE(TAIRCRAFTS(3)%XSEGLON (TAIRCRAFTS(3)%NSEG+1)) -! -!* duration of the segments (seconds) -! -TAIRCRAFTS(3)%XSEGTIME = (/ 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) -! -TAIRCRAFTS(3)%XSEGLAT = (/ 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) -! -TAIRCRAFTS(3)%XSEGLON = (/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 (TAIRCRAFTS(3)%LALTDEF) THEN - ALLOCATE(TAIRCRAFTS(3)%XSEGP (TAIRCRAFTS(3)%NSEG+1)) -TAIRCRAFTS(3)%XSEGP = 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(TAIRCRAFTS(3)%XSEGZ (TAIRCRAFTS(3)%NSEG+1)) - TAIRCRAFTS(3)%XSEGZ = (/8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,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 -! -IF ( NAIRCRAFTS < 4 ) RETURN -#else -CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_AIRCRAFT', 'aircraft characteristics are commented' ) -#endif -!---------------------------------------------------------------------------- -! -!* 1. Aircraft number 4 -! ----------------- -#if 0 -! -!* model number -! -TAIRCRAFTS(4)%NMODEL = 0 -! -!* model switch -! -TAIRCRAFTS(4)%CMODEL = 'FIX' -! -!* aircraft type -! -TAIRCRAFTS(4)%CTYPE = 'AIRCRA' +SUBROUTINE AIRCRAFT_CSV_READ( TPAIRCRAFT, HFILE ) -!* aircraft flight name -! -TAIRCRAFTS(4)%CTITLE = 'SAAL19B' -! -!* time step for storage -! -TAIRCRAFTS(4)%TFLYER_TIME%XTSTEP = 30. -! -!* take-off date and time -! -TAIRCRAFTS(4)%TLAUNCH%nyear = 2007 -TAIRCRAFTS(4)%TLAUNCH%nmonth = 04 -TAIRCRAFTS(4)%TLAUNCH%nday = 19 -TAIRCRAFTS(4)%TLAUNCH%xtime = 60392. -! -!* number of flight segments -! -TAIRCRAFTS(4)%NSEG = 39 -! -!* initalisation of flag for pressure (T) or Z(F) for aicraft altitude -! -TAIRCRAFTS(4)%LALTDEF = .TRUE. -! -!* allocation of the arrays -! -ALLOCATE(TAIRCRAFTS(4)%XSEGTIME(TAIRCRAFTS(4)%NSEG )) -ALLOCATE(TAIRCRAFTS(4)%XSEGLAT (TAIRCRAFTS(4)%NSEG+1)) -ALLOCATE(TAIRCRAFTS(4)%XSEGLON (TAIRCRAFTS(4)%NSEG+1)) -! -!* duration of the segments (seconds) -! -TAIRCRAFTS(4)%XSEGTIME = (/ 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) -! -TAIRCRAFTS(4)%XSEGLAT = (/ 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) -! -TAIRCRAFTS(4)%XSEGLON = (/ 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 (TAIRCRAFTS(4)%LALTDEF) THEN - ALLOCATE(TAIRCRAFTS(4)%XSEGP (TAIRCRAFTS(4)%NSEG+1)) -TAIRCRAFTS(4)%XSEGP = 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(TAIRCRAFTS(4)%XSEGZ (TAIRCRAFTS(4)%NSEG+1)) - TAIRCRAFTS(4)%XSEGZ = (/8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,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 -! -IF ( NAIRCRAFTS < 5 ) RETURN -#else -CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_AIRCRAFT', 'aircraft characteristics are commented' ) -#endif -!---------------------------------------------------------------------------- -! -!* 1. Aircraft number 5 -! ----------------- -#if 0 -! -!* model number -! -TAIRCRAFTS(5)%NMODEL = 0 -! -!* model switch -! -TAIRCRAFTS(5)%CMODEL = 'FIX' -! -!* aircraft type -! -TAIRCRAFTS(5)%CTYPE = 'AIRCRA' +USE MODD_AIRCRAFT_BALLOON, ONLY: TAIRCRAFTDATA -!* aircraft flight name -! -TAIRCRAFTS(5)%CTITLE = 'SAIB19A' -! -!* time step for storage -! -TAIRCRAFTS(5)%TFLYER_TIME%XTSTEP = 30. -! -!* take-off date and time -! -TAIRCRAFTS(5)%TLAUNCH%nyear = 2007 -TAIRCRAFTS(5)%TLAUNCH%nmonth = 04 -TAIRCRAFTS(5)%TLAUNCH%nday = 19 -TAIRCRAFTS(5)%TLAUNCH%xtime = 43380. -! -!* number of flight segments -! -TAIRCRAFTS(5)%NSEG = 176 -! -!* initalisation of flag for pressure (T) or Z(F) for aicraft altitude -! -TAIRCRAFTS(5)%LALTDEF = .TRUE. -! -!* allocation of the arrays -! -ALLOCATE(TAIRCRAFTS(5)%XSEGTIME(TAIRCRAFTS(5)%NSEG )) -ALLOCATE(TAIRCRAFTS(5)%XSEGLAT (TAIRCRAFTS(5)%NSEG+1)) -ALLOCATE(TAIRCRAFTS(5)%XSEGLON (TAIRCRAFTS(5)%NSEG+1)) -! -!* duration of the segments (seconds) -! -TAIRCRAFTS(5)%XSEGTIME = (/ 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 /) +USE MODE_MSG -! -!* latitudes of the segments ends (1st point is takeoff, last point is landing) -! (decimal degrees) -! -TAIRCRAFTS(5)%XSEGLAT = (/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 /) +IMPLICIT NONE -! -!* longitudes of the segments ends (1st point is takeoff, last point is landing) -! (decimal degrees) -! -TAIRCRAFTS(5)%XSEGLON = (/ 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 (TAIRCRAFTS(5)%LALTDEF) THEN - ALLOCATE(TAIRCRAFTS(5)%XSEGP (TAIRCRAFTS(5)%NSEG+1)) -TAIRCRAFTS(5)%XSEGP = 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(TAIRCRAFTS(5)%XSEGZ (TAIRCRAFTS(5)%NSEG+1)) - TAIRCRAFTS(5)%XSEGZ = (/8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,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 -! -IF ( NAIRCRAFTS < 6 ) RETURN -#else -CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_AIRCRAFT', 'aircraft characteristics are commented' ) -#endif -!---------------------------------------------------------------------------- -! -!* 1. Aircraft number 6 -! ----------------- -! -#if 0 -!* model number -! -TAIRCRAFTS(6)%NMODEL = 0 -! -!* model switch -! -TAIRCRAFTS(6)%CMODEL = 'FIX' -! -!* aircraft type -! -TAIRCRAFTS(6)%CTYPE = 'AIRCRA' +TYPE(TAIRCRAFTDATA), INTENT(INOUT) :: TPAIRCRAFT +CHARACTER(LEN=*), INTENT(IN) :: HFILE !Name of the CSV file with the aircraft trajectory -!* aircraft flight name -! -TAIRCRAFTS(6)%CTITLE = 'SAIB19B' -! -!* time step for storage -! -TAIRCRAFTS(6)%TFLYER_TIME%XTSTEP = 30. -! -!* take-off date and time -! -TAIRCRAFTS(6)%TLAUNCH%nyear = 2007 -TAIRCRAFTS(6)%TLAUNCH%nmonth = 04 -TAIRCRAFTS(6)%TLAUNCH%nday = 19 -TAIRCRAFTS(6)%TLAUNCH%xtime = 55992. -! -!* number of flight segments -! -TAIRCRAFTS(6)%NSEG = 179 -! -!* initalisation of flag for pressure (T) or Z(F) for aicraft altitude -! -TAIRCRAFTS(6)%LALTDEF = .TRUE. -! -!* allocation of the arrays -! -ALLOCATE(TAIRCRAFTS(6)%XSEGTIME(TAIRCRAFTS(6)%NSEG )) -ALLOCATE(TAIRCRAFTS(6)%XSEGLAT (TAIRCRAFTS(6)%NSEG+1)) -ALLOCATE(TAIRCRAFTS(6)%XSEGLON (TAIRCRAFTS(6)%NSEG+1)) -! -!* duration of the segments (seconds) -! -TAIRCRAFTS(6)%XSEGTIME = (/ 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) -! -TAIRCRAFTS(6)%XSEGLAT = (/ 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) -! -TAIRCRAFTS(6)%XSEGLON = (/-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 (TAIRCRAFTS(6)%LALTDEF) THEN - ALLOCATE(TAIRCRAFTS(6)%XSEGP (TAIRCRAFTS(6)%NSEG+1)) -TAIRCRAFTS(6)%XSEGP = 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(TAIRCRAFTS(6)%XSEGZ (TAIRCRAFTS(6)%NSEG+1)) - TAIRCRAFTS(6)%XSEGZ = (/8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,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 -! -IF ( NAIRCRAFTS < 7 ) RETURN -#else -CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_AIRCRAFT', 'aircraft characteristics are commented' ) -#endif -!---------------------------------------------------------------------------- -! -! -!* 1. Aircraft number 7 -! ----------------- -! -#if 0 -!* model number -! -TAIRCRAFTS(7)%NMODEL = 0 -! -!* model switch -! -TAIRCRAFTS(7)%CMODEL = 'FIX' -! -!* aircraft type -! -TAIRCRAFTS(7)%CTYPE = 'AIRCRA' +CHARACTER(LEN=NMAXLINELGT) :: YSTRING +INTEGER :: ILU ! logical unit of the file +INTEGER :: JI +REAL :: ZTIME, ZLAT, ZLON, ZALT +REAL :: ZTIME_OLD -!* aircraft flight name -! -TAIRCRAFTS(7)%CTITLE = 'TEST_19' -! -!* time step for storage -! -TAIRCRAFTS(7)%TFLYER_TIME%XTSTEP = 60. -! -!* take-off date and time -! -TAIRCRAFTS(7)%TLAUNCH%nyear = 2007 -TAIRCRAFTS(7)%TLAUNCH%nmonth = 04 -TAIRCRAFTS(7)%TLAUNCH%nday = 19 -TAIRCRAFTS(7)%TLAUNCH%xtime = 43500. -! -!* number of flight segments -! -TAIRCRAFTS(7)%NSEG = 207 -! -!* initalisation of flag for pressure (T) or Z(F) for aicraft altitude -! -TAIRCRAFTS(7)%LALTDEF = .TRUE. -! -!* allocation of the arrays -! -ALLOCATE(TAIRCRAFTS(7)%XSEGTIME(TAIRCRAFTS(7)%NSEG )) -ALLOCATE(TAIRCRAFTS(7)%XSEGLAT (TAIRCRAFTS(7)%NSEG+1)) -ALLOCATE(TAIRCRAFTS(7)%XSEGLON (TAIRCRAFTS(7)%NSEG+1)) -! -!* duration of the segments (seconds) -! -TAIRCRAFTS(7)%XSEGTIME = (/ 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 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) -! -TAIRCRAFTS(7)%XSEGLAT = (/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) -! -TAIRCRAFTS(7)%XSEGLON = (/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 (TAIRCRAFTS(7)%LALTDEF) THEN - ALLOCATE(TAIRCRAFTS(7)%XSEGP (TAIRCRAFTS(7)%NSEG+1)) -TAIRCRAFTS(7)%XSEGP = 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(TAIRCRAFTS(7)%XSEGZ (TAIRCRAFTS(7)%NSEG+1)) - TAIRCRAFTS(7)%XSEGZ = (/8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,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 -! -IF ( NAIRCRAFTS < 8 ) RETURN -#else -CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_AIRCRAFT', 'aircraft characteristics are commented' ) -#endif -!---------------------------------------------------------------------------- -! -!* 1. Aircraft number 8 -! ----------------- -! -#if 0 -!* model number -! -TAIRCRAFTS(8)%NMODEL = 0 -! -!* model switch -! -TAIRCRAFTS(8)%CMODEL = 'FIX' -! -!* aircraft type -! -TAIRCRAFTS(8)%CTYPE = 'AIRCRA' +ZTIME_OLD = 0. -!* aircraft flight name -! -TAIRCRAFTS(8)%CTITLE = 'DIMO22B' -! -!* time step for storage -! -TAIRCRAFTS(8)%TFLYER_TIME%XTSTEP = 60. -! -!* take-off date and time -! -TAIRCRAFTS(8)%TLAUNCH%nyear = 2007 -TAIRCRAFTS(8)%TLAUNCH%nmonth = 04 -TAIRCRAFTS(8)%TLAUNCH%nday = 22 -TAIRCRAFTS(8)%TLAUNCH%xtime = 45720. -! -!* number of flight segments -! -TAIRCRAFTS(8)%NSEG = 210 -! -!* initalisation of flag for pressure (T) or Z(F) for aicraft altitude -! -TAIRCRAFTS(8)%LALTDEF = .TRUE. -! -!* allocation of the arrays -! -ALLOCATE(TAIRCRAFTS(8)%XSEGTIME(TAIRCRAFTS(8)%NSEG )) -ALLOCATE(TAIRCRAFTS(8)%XSEGLAT (TAIRCRAFTS(8)%NSEG+1)) -ALLOCATE(TAIRCRAFTS(8)%XSEGLON (TAIRCRAFTS(8)%NSEG+1)) -! -!* duration of the segments (seconds) -! -TAIRCRAFTS(8)%XSEGTIME = (/ 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 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) -! -TAIRCRAFTS(8)%XSEGLAT = (/ 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 /) +! Open file +OPEN( NEWUNIT = ILU, FILE = HFILE, FORM = 'formatted' ) -! -!* longitudes of the segments ends (1st point is takeoff, last point is landing) -! (decimal degrees) -! -TAIRCRAFTS(8)%XSEGLON = (/ 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 /) +READ( ILU, END = 101, FMT = '(A)' ) YSTRING ! Reading of header (skip it) -! -!* pressure of the segments ends (1st point is takeoff, last point is landing) -! (pascals) -! -IF (TAIRCRAFTS(8)%LALTDEF) THEN - ALLOCATE(TAIRCRAFTS(8)%XSEGP (TAIRCRAFTS(8)%NSEG+1)) -TAIRCRAFTS(8)%XSEGP = 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(TAIRCRAFTS(8)%XSEGZ (TAIRCRAFTS(8)%NSEG+1)) - TAIRCRAFTS(8)%XSEGZ = (/8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,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 -! -IF ( NAIRCRAFTS < 9 ) RETURN -#else -CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_AIRCRAFT', 'aircraft characteristics are commented' ) -#endif -! -!* 1. Aircraft number 9 -! ----------------- -! -#if 0 -!* model number -! -TAIRCRAFTS(9)%NMODEL = 0 -! -!* model switch -! -TAIRCRAFTS(9)%CMODEL = 'FIX' -! -!* aircraft type -! -TAIRCRAFTS(9)%CTYPE = 'AIRCRA' +DO JI = 1, TPAIRCRAFT%NSEG + 1 + ! Read aircraft position + READ( ILU, END = 101, FMT = '(A)' ) YSTRING -!* aircraft flight name -! -TAIRCRAFTS(9)%CTITLE = 'DIMO23A' -! -!* time step for storage -! -TAIRCRAFTS(9)%TFLYER_TIME%XTSTEP = 60. -! -!* take-off date and time -! -TAIRCRAFTS(9)%TLAUNCH%nyear = 2007 -TAIRCRAFTS(9)%TLAUNCH%nmonth = 04 -TAIRCRAFTS(9)%TLAUNCH%nday = 23 -TAIRCRAFTS(9)%TLAUNCH%xtime = 28080. -! -!* number of flight segments -! -TAIRCRAFTS(9)%NSEG = 217 -! -!* initalisation of flag for pressure (T) or Z(F) for aicraft altitude -! -TAIRCRAFTS(9)%LALTDEF = .TRUE. -! -!* allocation of the arrays -! -ALLOCATE(TAIRCRAFTS(9)%XSEGTIME(TAIRCRAFTS(9)%NSEG )) -ALLOCATE(TAIRCRAFTS(9)%XSEGLAT (TAIRCRAFTS(9)%NSEG+1)) -ALLOCATE(TAIRCRAFTS(9)%XSEGLON (TAIRCRAFTS(9)%NSEG+1)) -! -!* duration of the segments (seconds) -! -TAIRCRAFTS(9)%XSEGTIME = (/ 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60, 60, 60, 60, 60, 60,& - 60 /) + READ( YSTRING, * ) ZTIME, ZLAT, ZLON, ZALT -! -!* latitudes of the segments ends (1st point is takeoff, last point is landing) -! (decimal degrees) -! -TAIRCRAFTS(9)%XSEGLAT = (/ 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 /) + IF ( JI > 1 ) TPAIRCRAFT%XSEGTIME(JI-1) = ZTIME - ZTIME_OLD + TPAIRCRAFT%XSEGLAT(JI) = ZLAT + TPAIRCRAFT%XSEGLON(JI) = ZLON + IF ( TPAIRCRAFT%LALTDEF ) THEN + TPAIRCRAFT%XSEGP(JI) = ZALT * 100. ! *100 to convert from hPa to Pa + ELSE + TPAIRCRAFT%XSEGZ(JI) = ZALT + END IF + ZTIME_OLD = ZTIME +END DO -! -!* longitudes of the segments ends (1st point is takeoff, last point is landing) -! (decimal degrees) -! -TAIRCRAFTS(9)%XSEGLON = (/ 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 /) +101 CONTINUE -! -!* pressure of the segments ends (1st point is takeoff, last point is landing) -! (pascals) -! +CLOSE( ILU ) -IF (TAIRCRAFTS(9)%LALTDEF) THEN - ALLOCATE(TAIRCRAFTS(9)%XSEGP (TAIRCRAFTS(9)%NSEG+1)) -TAIRCRAFTS(9)%XSEGP = 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(TAIRCRAFTS(9)%XSEGZ (TAIRCRAFTS(9)%NSEG+1)) - TAIRCRAFTS(9)%XSEGZ = (/8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,8000,& -8000,8000,8000,8000,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 -#else -CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_AIRCRAFT', 'aircraft characteristics are commented' ) -#endif -! -!---------------------------------------------------------------------------- -! -! -END SUBROUTINE INI_AIRCRAFT +IF ( JI < TPAIRCRAFT%NSEG + 1 ) & + CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'AIRCRAFT_CSV_READ', 'Data not found in file ' // TRIM( HFILE ) ) + +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 64135ed5c..a9fb888da 100644 --- a/src/MNH/ini_aircraft_balloon.f90 +++ b/src/MNH/ini_aircraft_balloon.f90 @@ -98,12 +98,12 @@ USE MODD_PARAM_n, ONLY: CCLOUD USE MODD_PARAMETERS ! USE MODE_GRIDPROJ +USE MODE_INI_AIRCRAFT +USE MODE_INI_BALLOON USE MODE_ll USE MODE_MODELN_HANDLER USE MODE_MSG ! -USE MODI_INI_BALLOON -USE MODI_INI_AIRCRAFT ! IMPLICIT NONE ! diff --git a/src/MNH/ini_balloon.f90 b/src/MNH/ini_balloon.f90 index f52a2f994..cda0db7c2 100644 --- a/src/MNH/ini_balloon.f90 +++ b/src/MNH/ini_balloon.f90 @@ -3,6 +3,16 @@ !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 ! ###################### @@ -98,7 +108,7 @@ USE MODD_AIRCRAFT_BALLOON USE MODD_CONF, ONLY: NMODEL_NEST => NMODEL USE MODD_CST, ONLY: XPI -USE MODD_PARAMETERS, ONLY: XUNDEF +USE MODD_PARAMETERS, ONLY: XNEGUNDEF, XUNDEF USE MODE_MSG @@ -349,3 +359,5 @@ IF ( NBALLOONS > 0 ) CALL BALLOONS_NML_DEALLOCATE() !---------------------------------------------------------------------------- ! END SUBROUTINE INI_BALLOON + +END MODULE MODE_INI_BALLOON diff --git a/src/MNH/modn_aircrafts.f90 b/src/MNH/modn_aircrafts.f90 new file mode 100644 index 000000000..f4309dfc7 --- /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/read_exsegn.f90 b/src/MNH/read_exsegn.f90 index a3303a5fe..ca2f7047a 100644 --- a/src/MNH/read_exsegn.f90 +++ b/src/MNH/read_exsegn.f90 @@ -305,6 +305,7 @@ END MODULE MODI_READ_EXSEG_n ! 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 @@ -343,8 +344,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_BALLOONS, ONLY: BALLOONS_NML_ALLOCATE, NAM_BALLOONS USE MODN_BLANK_n USE MODN_BLOWSNOW USE MODN_BLOWSNOW_n @@ -851,6 +853,13 @@ IF (KMI == 1) THEN CALL POSNAM(ILUSEG,'NAM_FLYERS',GFOUND,ILUOUT) IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_FLYERS) + + IF ( NAIRCRAFTS > 0 ) THEN + CALL AIRCRAFTS_NML_ALLOCATE( NBALLOONS ) + 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) diff --git a/src/MNH/write_desfmn.f90 b/src/MNH/write_desfmn.f90 index 046b0bd1e..e7a777d64 100644 --- a/src/MNH/write_desfmn.f90 +++ b/src/MNH/write_desfmn.f90 @@ -163,8 +163,9 @@ USE MODD_STATION_n, ONLY: LSTATION ! USE MODE_MSG ! +! USE MODN_AIRCRAFTS USE MODN_BACKUP -USE MODN_BALLOONS +! USE MODN_BALLOONS USE MODN_CONF USE MODN_DYN USE MODN_NESTING @@ -455,7 +456,8 @@ 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_balloon: WRITE(UNIT=ILUSEG,NML=NAM_BALLOONS) +!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) ! ! ! -- GitLab From 915a2790b025580ee298eeade8dc30723ff36107 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Wed, 24 Aug 2022 16:10:17 +0200 Subject: [PATCH 091/157] Philippe 24/08/2022: change MNHVERSION to 5.6.0 and adapt conditions when reading older files --- src/MNH/ini_deep_convection.f90 | 9 ++++---- src/MNH/ini_lb.f90 | 39 ++++++++++++++++++--------------- src/MNH/ini_prog_var.f90 | 7 +++--- src/MNH/read_field.f90 | 9 ++++---- src/MNH/spawn_field2.f90 | 9 ++++---- src/MNH/version.f90 | 10 ++++----- 6 files changed, 41 insertions(+), 42 deletions(-) diff --git a/src/MNH/ini_deep_convection.f90 b/src/MNH/ini_deep_convection.f90 index cd57a04d4..187d2e820 100644 --- a/src/MNH/ini_deep_convection.f90 +++ b/src/MNH/ini_deep_convection.f90 @@ -188,10 +188,9 @@ TYPE(TFIELDMETADATA) :: TZFIELD !* 2. INITIALIZE CONVECTIVE TENDENCIES ! -------------------------------- ! -!If TPINIFILE file was written with a MesoNH version < 5.5.1, some variables had different names or were not available -GOLDFILEFORMAT = ( 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 ) ) +!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 @@ -282,7 +281,7 @@ ELSE ( 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.5.1 files + 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 ) diff --git a/src/MNH/ini_lb.f90 b/src/MNH/ini_lb.f90 index c45c50666..a5da9cfcf 100644 --- a/src/MNH/ini_lb.f90 +++ b/src/MNH/ini_lb.f90 @@ -219,6 +219,7 @@ LOGICAL :: GHORELAX_UVWTH ! switch for the horizontal relaxation for U,V,W,TH i 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 @@ -241,10 +242,10 @@ ENDIF !* 1. SOME INITIALIZATIONS ! -------------------- ! -!If TPINIFILE file was written with a MesoNH version < 5.5.1, some variables had different names or were not available -GOLDFILEFORMAT = ( 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 ) ) +!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 ! ! !------------------------------------------------------------------------------- @@ -488,21 +489,22 @@ DO JSV = 1, NSV TZFIELD%CMNHNAME = 'LBX_' // TRIM( YMNHNAME_BASE ) TZFIELD%CLONGNAME = 'LBX_' // TRIM( YLONGNAME_BASE ) - !Some variables were written with an other name in MesoNH < 5.5.1 + !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 - CALL OLD_CMNHNAME_GENERATE_INTERN( TZFIELD%CMNHNAME, TZFIELD%CLONGNAME ) + ! 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.5.1) for LBX_PP scalar variables' + 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' ) @@ -513,7 +515,7 @@ DO JSV = 1, NSV TZFIELD%CSTDNAME = '' TZFIELD%CLONGNAME = 'LBX_FF' IF ( JSV == NSV_FFBEG .AND. NSV_FF > 1 ) THEN - CMNHMSG(1) = 'reading older file (<5.5.1) for LBX_FF scalar variables' + 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' ) @@ -524,7 +526,7 @@ DO JSV = 1, NSV TZFIELD%CSTDNAME = '' TZFIELD%CLONGNAME = 'LBX_CS' IF ( JSV == NSV_CSBEG .AND. NSV_CS > 1 ) THEN - CMNHMSG(1) = 'reading older file (<5.5.1) for LBX_CS scalar variables' + 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' ) @@ -543,7 +545,7 @@ DO JSV = 1, NSV 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.5.1 files, only CCN_FREE and IFN_FREE LIMA scalar variables were available (for LIMA scalar variables) + !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 @@ -557,7 +559,7 @@ DO JSV = 1, NSV ( 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.5.1 + ( 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 @@ -571,21 +573,22 @@ DO JSV = 1, NSV TZFIELD%CMNHNAME = 'LBY_' // TRIM( YMNHNAME_BASE ) TZFIELD%CLONGNAME = 'LBY_' // TRIM( YLONGNAME_BASE ) - !Some variables were written with an other name in MesoNH < 5.5.1 + !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 - CALL OLD_CMNHNAME_GENERATE_INTERN( TZFIELD%CMNHNAME, TZFIELD%CLONGNAME ) + ! 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.5.1) for LBY_PP scalar variables' + 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' ) @@ -596,7 +599,7 @@ DO JSV = 1, NSV TZFIELD%CSTDNAME = '' TZFIELD%CLONGNAME = 'LBY_FF' IF ( JSV == NSV_FFBEG .AND. NSV_FF > 1 ) THEN - CMNHMSG(1) = 'reading older file (<5.5.1) for LBY_FF scalar variables' + 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' ) @@ -607,7 +610,7 @@ DO JSV = 1, NSV TZFIELD%CSTDNAME = '' TZFIELD%CLONGNAME = 'LBY_CS' IF ( JSV == NSV_CSBEG .AND. NSV_CS > 1 ) THEN - CMNHMSG(1) = 'reading older file (<5.5.1) for LBY_CS scalar variables' + 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' ) @@ -625,7 +628,7 @@ DO JSV = 1, NSV 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.5.1 files, only CCN_FREE and IFN_FREE LIMA scalar variables were available (for LIMA scalar variables) + !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 @@ -639,7 +642,7 @@ DO JSV = 1, NSV ( 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.5.1 + ( 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 diff --git a/src/MNH/ini_prog_var.f90 b/src/MNH/ini_prog_var.f90 index 3a60efc9a..d21746e6d 100644 --- a/src/MNH/ini_prog_var.f90 +++ b/src/MNH/ini_prog_var.f90 @@ -215,10 +215,9 @@ IF(PRESENT(HCHEMFILE)) THEN 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.5.1, some variables had different names (or were not available) - GOLDFILEFORMAT = ( TZCHEMFILE%NMNHVERSION(1) < 5 & - .OR. ( TZCHEMFILE%NMNHVERSION(1) == 5 .AND. TZCHEMFILE%NMNHVERSION(2) < 5 ) & - .OR. ( TZCHEMFILE%NMNHVERSION(1) == 5 .AND. TZCHEMFILE%NMNHVERSION(2) == 5 .AND. TZCHEMFILE%NMNHVERSION(3) < 1 ) ) + !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 ! diff --git a/src/MNH/read_field.f90 b/src/MNH/read_field.f90 index 8b72ffd03..1a40d1797 100644 --- a/src/MNH/read_field.f90 +++ b/src/MNH/read_field.f90 @@ -425,10 +425,9 @@ TYPE(TFIELDMETADATA) :: TZFIELD GLSOURCE=.FALSE. ZWORK = 0.0 ! -!If TPINIFILE file was written with a MesoNH version < 5.5.1, some variables had different names or were not available -GOLDFILEFORMAT = ( 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 ) ) +!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 @@ -821,7 +820,7 @@ DO JSV = 1, NSV ! initialize according to the get indicators ( 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.5.1 + !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 = '' diff --git a/src/MNH/spawn_field2.f90 b/src/MNH/spawn_field2.f90 index ccd4ceaea..50047fb02 100644 --- a/src/MNH/spawn_field2.f90 +++ b/src/MNH/spawn_field2.f90 @@ -279,10 +279,9 @@ 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.5.1, some variables had different names or were not available - GOLDFILEFORMAT = ( TPSONFILE%NMNHVERSION(1) < 5 & - .OR. ( TPSONFILE%NMNHVERSION(1) == 5 .AND. TPSONFILE%NMNHVERSION(2) < 5 ) & - .OR. ( TPSONFILE%NMNHVERSION(1) == 5 .AND. TPSONFILE%NMNHVERSION(2) == 5 .AND. TPSONFILE%NMNHVERSION(3) < 1 ) ) + !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 @@ -843,7 +842,7 @@ IF (PRESENT(TPSONFILE)) THEN ( 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.5.1 + !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 = '' diff --git a/src/MNH/version.f90 b/src/MNH/version.f90 index 5c98f1946..c8283e723 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 -- GitLab From 4a714f6e67f72ccdfc7e025ede814c61e181ce55 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Thu, 25 Aug 2022 13:13:00 +0200 Subject: [PATCH 092/157] Philippe 25/08/2022: add CDFINT_MPI parameter --- src/MNH/modd_precision.f90 | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/MNH/modd_precision.f90 b/src/MNH/modd_precision.f90 index a759ddf1f..83db21558 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 -- GitLab From 95910e1f333fc16ecb26243888e827a1573b5fdf Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Thu, 25 Aug 2022 14:43:37 +0200 Subject: [PATCH 093/157] Philippe 25/08/2022: write balloon positions in netCDF4 files inside HDF5 groups --- src/MNH/ini_aircraft_balloon.f90 | 331 ++++++++++++++++++++----------- src/MNH/ini_modeln.f90 | 3 +- src/MNH/write_balloonn.f90 | 321 ++++++++++++++++++++---------- src/MNH/write_lfin.f90 | 2 +- 4 files changed, 428 insertions(+), 229 deletions(-) diff --git a/src/MNH/ini_aircraft_balloon.f90 b/src/MNH/ini_aircraft_balloon.f90 index a9fb888da..6191e60d5 100644 --- a/src/MNH/ini_aircraft_balloon.f90 +++ b/src/MNH/ini_aircraft_balloon.f90 @@ -6,41 +6,21 @@ ! 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 -! +!############################### +MODULE MODE_INI_AIRCRAFT_BALLOON +!############################### + +IMPLICIT NONE + +PRIVATE + +PUBLIC :: INI_AIRCRAFT_BALLOON + +CONTAINS + ! ############################################################### SUBROUTINE INI_AIRCRAFT_BALLOON(TPINIFILE, & PTSTEP, TPDTSEG, PSEGLEN, & @@ -294,9 +274,19 @@ END SUBROUTINE ALLOCATE_FLYER !---------------------------------------------------------------------------- !---------------------------------------------------------------------------- SUBROUTINE INI_LAUNCH(KNBR,TPFLYER) -! + +#ifdef MNH_IOCDF4 +USE NETCDF, ONLY: NF90_INQ_NCID, NF90_NOERR +#endif + +USE MODD_IO, ONLY: ISP, TFILEDATA +#ifdef MNH_IOCDF4 +USE MODD_MPIF +USE MODD_PRECISION, ONLY: CDFINT, CDFINT_MPI +#endif + use MODE_IO_FIELD_READ, only: IO_Field_read -! + INTEGER, INTENT(IN) :: KNBR CLASS(TBALLOONDATA), INTENT(INOUT) :: TPFLYER ! @@ -304,42 +294,36 @@ CLASS(TBALLOONDATA), INTENT(INOUT) :: TPFLYER ! !* 0.2 declaration of local variables ! +#ifdef MNH_IOCDF4 +INTEGER :: IERR +INTEGER(KIND=CDFINT) :: IGROUPID +INTEGER(KIND=CDFINT) :: ISTATUS +INTEGER(KIND=CDFINT), DIMENSION(2) :: IDATA ! Intermediate array to allow merge of 2 MPI broadcasts +#endif +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%CMODEL == 'MOB' .AND. TPFLYER%NMODEL /= 0) TPFLYER%NMODEL=1 -IF (TPFLYER%NMODEL > NMODEL) TPFLYER%NMODEL=0 +#ifdef MNH_IOCDF4 +TYPE(TFILEDATA) :: TZFILE +#endif + IF ( IMI /= TPFLYER%NMODEL ) RETURN -! + +GREAD = .FALSE. LFLYER=.TRUE. -! -IF (TPFLYER%CTITLE==' ') THEN - WRITE(TPFLYER%CTITLE,FMT='(A6,I2.2)') TPFLYER%CTYPE,KNBR -END IF -! + IF ( CPROGRAM == 'MESONH' .OR. CPROGRAM == 'SPAWN ' .OR. CPROGRAM == 'REAL ' ) THEN - ! read the current location in the FM_FILE - ! - 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 - WRITE(ILUOUT,*) "INI_LAUNCH: Initial location take for ",TPFLYER%CTITLE - ELSE + ! 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)//'LON', & + CMNHNAME = TRIM(TPFLYER%CTITLE)//'LAT', & CSTDNAME = '', & - CLONGNAME = TRIM(TPFLYER%CTITLE)//'LON', & + CLONGNAME = TRIM(TPFLYER%CTITLE)//'LAT', & CUNITS = 'degree', & CDIR = '--', & CCOMMENT = '', & @@ -347,65 +331,173 @@ IF ( CPROGRAM == 'MESONH' .OR. CPROGRAM == 'SPAWN ' .OR. CPROGRAM == 'REAL ' ) 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) - ! - TPFLYER%XP_CUR = XUNDEF - ! - 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) - ! + 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) + + TPFLYER%XP_CUR = XUNDEF + + 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 + ! Read in netCDF file (new structure since MesoNH 5.6) + IF ( ISP == TPINIFILE%NMASTER_RANK ) ISTATUS = NF90_INQ_NCID( TPINIFILE%NNCID, TRIM( TPFLYER%CTITLE ), IGROUPID ) + + IDATA(:) = [ ISTATUS, IGROUPID ] ! Merge 2 broadcasts into 1 + CALL MPI_BCAST( IDATA, SIZE( IDATA ), CDFINT_MPI, TPINIFILE%NMASTER_RANK - 1, TPINIFILE%NMPICOMM, IERR ) + ISTATUS = IDATA(1) + IGROUPID = IDATA(2) + + 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) + + TPFLYER%XP_CUR = XUNDEF + + 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 +#endif + END IF + + IF ( GREAD ) THEN CALL SM_XYHAT( PLATOR, PLONOR, ZLAT, ZLON, TPFLYER%XX_CUR, TPFLYER%XY_CUR ) + TPFLYER%LFLY = .TRUE. - WRITE(ILUOUT,*) & - "INI_LAUNCH: Current location read in FM file for ",TPFLYER%CTITLE + + CMNHMSG(1) = 'current location read from synchronous file for ' // TRIM( TPFLYER%CTITLE ) IF (TPFLYER%CTYPE== 'CVBALL') THEN - WRITE(ILUOUT,*) & - " Lat=",ZLAT," Lon=",ZLON," Alt=",TPFLYER%XZ_CUR," Wasc=",TPFLYER%XWASCENT + WRITE( CMNHMSG(2), * ) " Lat=", ZLAT, " Lon=", ZLON + WRITE( CMNHMSG(3), * ) " Alt=", TPFLYER%XZ_CUR, " Wasc=", TPFLYER%XWASCENT ELSE IF (TPFLYER%CTYPE== 'ISODEN') THEN - WRITE(ILUOUT,*) & - " Lat=",ZLAT," Lon=",ZLON," Rho=",TPFLYER%XRHO + WRITE( CMNHMSG(2), * ) " Lat=", ZLAT, " Lon=", ZLON, " Rho=", TPFLYER%XRHO END IF - ! + CALL PRINT_MSG( NVERB_INFO, 'GEN', 'INI_LAUNCH' ) + TPFLYER%TFLYER_TIME%XTSTEP = MAX ( PTSTEP, TPFLYER%TFLYER_TIME%XTSTEP ) + 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 ! -ELSE IF (CPROGRAM == 'DIAG ' ) THEN +ELSE IF ( CPROGRAM == 'DIAG ' ) THEN IF ( LAIRCRAFT_BALLOON ) THEN ! read the current location in MODD_DIAG_FLAG ! @@ -415,10 +507,9 @@ ELSE IF (CPROGRAM == 'DIAG ' ) THEN 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. - WRITE(ILUOUT,*) & - "INI_LAUNCH: Current location read in MODD_DIAG_FLAG for ",TPFLYER%CTITLE - WRITE(ILUOUT,*) & - " Lat=",ZLAT," Lon=",ZLON," Alt=",TPFLYER%XZ_CUR + 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%TFLYER_TIME%XTSTEP = MAX (XSTEP_AIRCRAFT_BALLOON , TPFLYER%TFLYER_TIME%XTSTEP ) @@ -488,3 +579,5 @@ END SUBROUTINE INI_FLIGHT !---------------------------------------------------------------------------- ! END SUBROUTINE INI_AIRCRAFT_BALLOON + +END MODULE MODE_INI_AIRCRAFT_BALLOON diff --git a/src/MNH/ini_modeln.f90 b/src/MNH/ini_modeln.f90 index 5bf5d68bb..11dad29e3 100644 --- a/src/MNH/ini_modeln.f90 +++ b/src/MNH/ini_modeln.f90 @@ -401,6 +401,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 @@ -427,8 +428,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 diff --git a/src/MNH/write_balloonn.f90 b/src/MNH/write_balloonn.f90 index 295de8c3a..974bde880 100644 --- a/src/MNH/write_balloonn.f90 +++ b/src/MNH/write_balloonn.f90 @@ -3,26 +3,18 @@ !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) ! ################################### @@ -59,17 +51,15 @@ END MODULE MODI_WRITE_BALLOON_n !! Original 06/06/01 ! 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, TBALLOONS +USE MODD_IO, ONLY: TFILEDATA ! -USE MODE_GRIDPROJ ! IMPLICIT NONE ! @@ -83,102 +73,219 @@ TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! File characteristics INTEGER :: JI DO JI = 1, NBALLOONS - IF ( TBALLOONS(JI)%LFLY ) CALL WRITE_LFI_BALLOON( TBALLOONS(JI) ) + IF ( TBALLOONS(JI)%LFLY ) CALL WRITE_BALLOON_POSITION( TPFILE, TBALLOONS(JI) ) END DO -! -! -CONTAINS -! + +END SUBROUTINE WRITE_BALLOON_n !------------------------------------------------------------------------------- + !------------------------------------------------------------------------------- -SUBROUTINE WRITE_LFI_BALLOON(TPFLYER) +SUBROUTINE WRITE_BALLOON_POSITION( TPFILE, TPFLYER ) ! +#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 MODE_GRIDPROJ, ONLY: SM_LATLON USE MODE_IO_FIELD_WRITE, only: IO_Field_write -! +#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 ! ! !* 0.2 Declarations of local variables ! +#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 -! -! -CALL SM_LATLON(XLATORI,XLONORI, & - TPFLYER%XX_CUR,TPFLYER%XY_CUR,ZLAT,ZLON) -! -! -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(TPFILE,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(TPFILE,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(TPFILE,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(TPFILE,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(TPFILE,TZFIELD,TPFLYER%XRHO) -! -! -! -END SUBROUTINE WRITE_LFI_BALLOON + +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_lfin.f90 b/src/MNH/write_lfin.f90 index 481840839..c1fdfcd2c 100644 --- a/src/MNH/write_lfin.f90 +++ b/src/MNH/write_lfin.f90 @@ -268,13 +268,13 @@ USE MODE_MODELN_HANDLER USE MODE_MPPDB USE MODE_MSG USE MODE_TOOLS, ONLY: UPCASE +USE MODE_WRITE_BALLOON_n, ONLY: WRITE_BALLOON_n USE MODI_CH_AER_REALLFI_n USE MODI_DUST_FILTER USE MODI_DUSTLFI_n USE MODI_SALT_FILTER USE MODI_SALTLFI_n -USE MODI_WRITE_BALLOON_n USE MODI_WRITE_LB_n IMPLICIT NONE -- GitLab From 592c5d1880dc7e9d8b131ce56b929ba096d7568b Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Fri, 2 Sep 2022 16:18:55 +0200 Subject: [PATCH 094/157] Philippe 02/09/2022: add XXHATM, XYHATM and XZHATM grid variables at mass points + more efficient use of grid variables --- src/LIB/SURCOUCHE/src/mode_field.f90 | 41 ++++++++- src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 | 44 +++++----- src/MNH/aircraft_balloon_evol.f90 | 25 ++---- src/MNH/eddy_fluxn.f90 | 9 +- src/MNH/eol_maths.f90 | 12 +-- src/MNH/extract_vortex.f90 | 14 ++-- src/MNH/flash_geom_elec.f90 | 30 +++---- src/MNH/fun.f90 | 18 ++-- src/MNH/gps_zenith.f90 | 37 ++++----- src/MNH/gps_zenith_grid.f90 | 15 +--- src/MNH/ibm_affectp.f90 | 6 +- src/MNH/ibm_affectv.f90 | 6 +- src/MNH/ibm_balance.f90 | 17 ++-- src/MNH/ibm_detect.f90 | 3 +- src/MNH/ibm_generls.f90 | 3 +- src/MNH/ibm_idealee.f90 | 3 +- src/MNH/ibm_init_ls.f90 | 4 +- src/MNH/ibm_mixinglength.f90 | 2 +- src/MNH/ibm_smooth_ls.f90 | 8 +- src/MNH/ibm_volume.f90 | 3 +- src/MNH/ini_dynamics.f90 | 14 ++-- src/MNH/ini_lg.f90 | 37 ++++----- src/MNH/ini_modeln.f90 | 29 ++++--- src/MNH/ini_posprofilern.f90 | 15 +--- src/MNH/ini_size_spawn.f90 | 4 +- src/MNH/ini_spectren.f90 | 29 ++++--- src/MNH/ini_surfstationn.f90 | 15 +--- src/MNH/modd_gridn.f90 | 8 +- src/MNH/modd_spawn.f90 | 3 +- src/MNH/modd_sub_elecn.f90 | 18 +--- src/MNH/mode_gridproj.f90 | 36 ++++---- src/MNH/modeln.f90 | 7 +- src/MNH/phys_paramn.f90 | 8 +- src/MNH/prep_ideal_case.f90 | 23 ++++-- src/MNH/prep_real_case.f90 | 8 +- src/MNH/radar_simulator.f90 | 20 ++--- src/MNH/read_all_data_grib_case.f90 | 8 +- src/MNH/read_cams_data_netcdf_case.f90 | 10 +-- src/MNH/read_chem_data_netcdf_case.f90 | 8 +- src/MNH/read_hgridn.f90 | 14 +++- src/MNH/read_ver_grid.f90 | 36 ++++---- src/MNH/relaxdef.f90 | 22 +++-- src/MNH/series_cloud_elec.f90 | 3 +- src/MNH/set_advfrc.f90 | 21 ++--- src/MNH/set_frc.f90 | 17 ++-- src/MNH/set_geosbal.f90 | 36 +++----- src/MNH/set_grid.f90 | 69 ++++++++++------ src/MNH/set_perturb.f90 | 11 ++- src/MNH/set_ref.f90 | 26 +++--- src/MNH/set_refz.f90 | 10 +-- src/MNH/set_relfrc.f90 | 26 ++---- src/MNH/setlb_lg.f90 | 92 +++++++-------------- src/MNH/shallow_mf.f90 | 3 +- src/MNH/spawn_grid2.f90 | 69 +++++++++------- src/MNH/spawn_model2.f90 | 28 ++++--- src/MNH/spawning.f90 | 3 +- src/MNH/surf_rad_modif.f90 | 47 ++++++----- src/MNH/surf_solar_shadows.f90 | 37 ++++----- src/MNH/surf_solar_slopes.f90 | 30 +++---- src/MNH/surf_solar_sum.f90 | 29 +++---- src/MNH/turb_ver_thermo_flux.f90 | 11 ++- src/MNH/ver_interp_to_mixed_grid.f90 | 4 +- src/MNH/ver_thermo.f90 | 8 +- src/MNH/write_lfifm1_for_diag.f90 | 16 ++-- src/MNH/write_surf_mnh.f90 | 12 ++- 65 files changed, 605 insertions(+), 675 deletions(-) diff --git a/src/LIB/SURCOUCHE/src/mode_field.f90 b/src/LIB/SURCOUCHE/src/mode_field.f90 index b6f5a6ab7..a0df6d83f 100644 --- a/src/LIB/SURCOUCHE/src/mode_field.f90 +++ b/src/LIB/SURCOUCHE/src/mode_field.f90 @@ -440,7 +440,6 @@ call Add_field2list( TFIELDDATA( & call Add_field2list( TFIELDDATA( & CMNHNAME = 'XHAT', & -!TODO: check stdname CSTDNAME = 'projection_x_coordinate', & CLONGNAME = 'XHAT', & CUNITS = 'm', & @@ -453,7 +452,6 @@ call Add_field2list( TFIELDDATA( & call Add_field2list( TFIELDDATA( & CMNHNAME = 'YHAT', & -!TODO: check stdname CSTDNAME = 'projection_y_coordinate', & CLONGNAME = 'YHAT', & CUNITS = 'm', & @@ -464,6 +462,30 @@ call Add_field2list( TFIELDDATA( & 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 point', & + 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 point', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 1, & + LTIMEDEP = .FALSE. ) ) + call Add_field2list( TFIELDDATA( & CMNHNAME = 'ZHAT', & !TODO: check stdname @@ -477,6 +499,18 @@ call Add_field2list( TFIELDDATA( & NDIMS = 1, & LTIMEDEP = .FALSE. ) ) +call Add_field2list( TFIELDDATA( & + CMNHNAME = 'ZHATM', & + 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 = 'ZTOP', & CSTDNAME = 'altitude_at_top_of_atmosphere_model', & @@ -3594,7 +3628,10 @@ 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( 'ZTOP', kfrom, kto, XZTOP ) call Goto_model_1field( 'DXHAT', kfrom, kto, XDXHAT ) call Goto_model_1field( 'DYHAT', kfrom, kto, XDYHAT ) diff --git a/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 b/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 index 8ca884014..65ffbdc8e 100644 --- a/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 +++ b/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 @@ -1450,7 +1450,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 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 @@ -1475,7 +1475,7 @@ character(len=*), optional, intent(in) :: hprogram_orig !To emulate a file comin character(len=:), allocatable :: ystdnameprefix character(len=:), allocatable :: yprogram -integer :: iiu, iju, iku +integer :: iiu, iju integer :: id, iid, iresp integer :: imi integer :: ji @@ -1486,7 +1486,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 @@ -1505,9 +1505,12 @@ 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() gchangemodel = .false. @@ -1527,8 +1530,14 @@ 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( 'SLEVE', iid, iresp ) gsleve => tfieldlist(iid)%tfield_l0d(tpfile%nmodel)%data @@ -1538,21 +1547,17 @@ 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 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' @@ -1634,17 +1639,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','', & diff --git a/src/MNH/aircraft_balloon_evol.f90 b/src/MNH/aircraft_balloon_evol.f90 index c79631fa0..e6cfc21ba 100644 --- a/src/MNH/aircraft_balloon_evol.f90 +++ b/src/MNH/aircraft_balloon_evol.f90 @@ -138,6 +138,7 @@ USE MODD_CONF USE MODD_CST USE MODD_DIAG_IN_RUN USE MODD_GRID +USE MODD_GRID_n, ONLY: XXHATM, XYHATM USE MODD_LUNIT_n, ONLY: TLUOUT USE MODD_NESTING USE MODD_NSV, ONLY : NSV_LIMA_NI,NSV_LIMA_NR,NSV_LIMA_NC @@ -229,9 +230,6 @@ 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 @@ -384,11 +382,6 @@ IKU = SIZE(PZ,3) 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 @@ -504,7 +497,7 @@ IF ( TPFLYER%LFLY ) THEN ! ---------- ! IU=COUNT( PXHAT (:)<=TPFLYER%XX_CUR ) - II=COUNT( ZXHATM(:)<=TPFLYER%XX_CUR ) + II=COUNT( XXHATM(:)<=TPFLYER%XX_CUR ) ! IF ( IU < IIB .AND. LWEST_ll() ) THEN IF ( TPFLYER%CMODEL == 'FIX' .OR. TPFLYER%NMODEL == 1 ) THEN @@ -528,7 +521,7 @@ IF ( TPFLYER%LFLY ) THEN ! ---------- ! IV=COUNT( PYHAT (:)<=TPFLYER%XY_CUR ) - IJ=COUNT( ZYHATM(:)<=TPFLYER%XY_CUR ) + IJ=COUNT( XYHATM(:)<=TPFLYER%XY_CUR ) ! IF ( IV < IJB .AND. LSOUTH_ll() ) THEN IF ( TPFLYER%CMODEL == 'FIX' .OR. TPFLYER%NMODEL == 1 ) THEN @@ -632,9 +625,9 @@ IF ( TPFLYER%LFLY ) THEN !* 5.2.1 Iso-density balloon ! CASE ( 'ISODEN' ) - ZXCOEF = (TPFLYER%XX_CUR - ZXHATM(II)) / (ZXHATM(II+1) - ZXHATM(II)) + ZXCOEF = (TPFLYER%XX_CUR - XXHATM(II)) / (XXHATM(II+1) - XXHATM(II)) ZXCOEF = MAX (0.,MIN(ZXCOEF,1.)) - ZYCOEF = (TPFLYER%XY_CUR - ZYHATM(IJ)) / (ZYHATM(IJ+1) - ZYHATM(IJ)) + ZYCOEF = (TPFLYER%XY_CUR - XYHATM(IJ)) / (XYHATM(IJ+1) - XYHATM(IJ)) ZYCOEF = MAX (0.,MIN(ZYCOEF,1.)) IF ( TPFLYER%XALTLAUNCH /= XNEGUNDEF ) THEN IK00 = MAX ( COUNT (TPFLYER%XALTLAUNCH >= ZZM(1,1,:)), 1) @@ -676,9 +669,9 @@ IF ( TPFLYER%LFLY ) THEN !* 5.2.4 Constant Volume Balloon ! CASE ( 'CVBALL' ) - ZXCOEF = (TPFLYER%XX_CUR - ZXHATM(II)) / (ZXHATM(II+1) - ZXHATM(II)) + ZXCOEF = (TPFLYER%XX_CUR - XXHATM(II)) / (XXHATM(II+1) - XXHATM(II)) ZXCOEF = MAX (0.,MIN(ZXCOEF,1.)) - ZYCOEF = (TPFLYER%XY_CUR - ZYHATM(IJ)) / (ZYHATM(IJ+1) - ZYHATM(IJ)) + ZYCOEF = (TPFLYER%XY_CUR - XYHATM(IJ)) / (XYHATM(IJ+1) - XYHATM(IJ)) ZYCOEF = MAX (0.,MIN(ZYCOEF,1.)) IF ( TPFLYER%XALTLAUNCH /= XNEGUNDEF ) THEN IK00 = MAX ( COUNT (TPFLYER%XALTLAUNCH >= ZZM(1,1,:)), 1) @@ -837,14 +830,14 @@ IF ( TPFLYER%LFLY ) THEN !* 6.1 Interpolation coefficient for X ! ------------------------------- ! - ZXCOEF = (TPFLYER%XX_CUR - ZXHATM(II)) / (ZXHATM(II+1) - ZXHATM(II)) + ZXCOEF = (TPFLYER%XX_CUR - XXHATM(II)) / (XXHATM(II+1) - XXHATM(II)) ZXCOEF = MAX (0.,MIN(ZXCOEF,1.)) ! ! !* 6.2 Interpolation coefficient for y ! ------------------------------- ! - ZYCOEF = (TPFLYER%XY_CUR - ZYHATM(IJ)) / (ZYHATM(IJ+1) - ZYHATM(IJ)) + ZYCOEF = (TPFLYER%XY_CUR - XYHATM(IJ)) / (XYHATM(IJ+1) - XYHATM(IJ)) ZYCOEF = MAX (0.,MIN(ZYCOEF,1.)) ! ! diff --git a/src/MNH/eddy_fluxn.f90 b/src/MNH/eddy_fluxn.f90 index ed52def26..dc20500dc 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/eol_maths.f90 b/src/MNH/eol_maths.f90 index bda3aa694..81e2a0a88 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 df1bb103b..311fcecd1 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/flash_geom_elec.f90 b/src/MNH/flash_geom_elec.f90 index 8ae281d26..14265cba1 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/fun.f90 b/src/MNH/fun.f90 index 46db8b201..64c54caa6 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. @@ -126,9 +126,9 @@ ZWIDTHY =ZYHAT_ll(IJ0+IJU_ll/5)-ZYHAT_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)-ZYHAT_ll(IJ0))/ZWIDTHY) **2 & + +(( PZHAT(JK) - PZHAT(IK0))/ZWIDTHZ) **2 ) END DO END DO DEALLOCATE(ZYHAT_ll) @@ -217,7 +217,7 @@ 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) 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)-ZYHAT_ll(IJ0))/ZWIDTH) END DO FUNUY(KJU)=2.*FUNUY(KJU-1)-FUNUY(KJU-2) !simple extrapolation for the last point ! @@ -314,9 +314,9 @@ ZWIDTHX=ZXHAT_ll(II0+IIU_ll/5)-ZXHAT_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)-ZXHAT_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 @@ -403,7 +403,7 @@ 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) DO JI = 1,KIU - FUNVX(JI)=1./COSH(((XXHAT(JI)+XXHAT(JI))*0.5-ZXHAT_ll(II0))/ZWIDTH) + FUNVX(JI)=1./COSH((XXHATM(JI)-ZXHAT_ll(II0))/ZWIDTH) END DO DEALLOCATE(ZXHAT_ll) !------------------------------------------------------------------------------- diff --git a/src/MNH/gps_zenith.f90 b/src/MNH/gps_zenith.f90 index a11a074d6..5fe9cd741 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 86b72414f..f3859e62c 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/ibm_affectp.f90 b/src/MNH/ibm_affectp.f90 index b0c998744..4f6bd4451 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 1a5711e10..dddd95e97 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 @@ -291,7 +291,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 2256cd097..e1ed43c51 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 ca4530964..b88a80445 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 a129d2109..1b7683652 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 e08be780d..1c2d6449f 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_init_ls.f90 b/src/MNH/ibm_init_ls.f90 index 2d881e1fd..bdfbff5ad 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_mixinglength.f90 b/src/MNH/ibm_mixinglength.f90 index 14bb0dd89..c4c1a2c10 100644 --- a/src/MNH/ibm_mixinglength.f90 +++ b/src/MNH/ibm_mixinglength.f90 @@ -75,7 +75,7 @@ SUBROUTINE IBM_MIXINGLENGTH(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/MNH/ibm_smooth_ls.f90 b/src/MNH/ibm_smooth_ls.f90 index 961441234..7e06c354d 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 af4012a42..ec734278f 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_dynamics.f90 b/src/MNH/ini_dynamics.f90 index e4d00f5bb..add1cc9e3 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_lg.f90 b/src/MNH/ini_lg.f90 index 0ce0d7b1b..8f5428cae 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 11dad29e3..282936099 100644 --- a/src/MNH/ini_modeln.f90 +++ b/src/MNH/ini_modeln.f90 @@ -1001,10 +1001,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)) @@ -1852,13 +1855,13 @@ 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, 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) ! @@ -1938,10 +1941,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 ) ! !------------------------------------------------------------------------------- ! @@ -2187,7 +2190,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 ) ! !------------------------------------------------------------------------------- @@ -2196,7 +2199,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, & diff --git a/src/MNH/ini_posprofilern.f90 b/src/MNH/ini_posprofilern.f90 index ad6340211..966c343cf 100644 --- a/src/MNH/ini_posprofilern.f90 +++ b/src/MNH/ini_posprofilern.f90 @@ -62,7 +62,7 @@ USE MODD_ALLPROFILER_n USE MODD_CONF, ONLY: LCARTESIAN USE MODD_DYN, ONLY: XSEGLEN USE MODD_DYN_n, ONLY: DYN_MODEL, XTSTEP -USE MODD_GRID_n, ONLY: XXHAT, XYHAT +USE MODD_GRID_n, ONLY: XXHAT, XXHATM, XYHAT, XYHATM USE MODD_PARAMETERS, ONLY: JPHEXT, JPVEXT USE MODD_PROFILER_n, ONLY: LPROFILER, NUMBPROFILER_LOC, TPROFILERS, TPROFILERS_TIME USE MODD_TYPE_STATPROF, ONLY: TPROFILERDATA @@ -95,8 +95,6 @@ LOGICAL :: GINSIDE ! True if profiler is inside physica LOGICAL :: GPRESENT ! True if profiler is present on the current process REAL :: ZXHATM_PHYS_MIN, ZYHATM_PHYS_MIN ! Minimum X coordinate of mass points in the physical domain REAL :: ZXHATM_PHYS_MAX, ZYHATM_PHYS_MAX ! Minimum X coordinate of mass points in the physical domain -REAL, DIMENSION(SIZE(XXHAT)) :: ZXHATM ! mass point coordinates -REAL, DIMENSION(SIZE(XYHAT)) :: ZYHATM ! mass point coordinates REAL, DIMENSION(:), POINTER :: ZXHAT_GLOB REAL, DIMENSION(:), POINTER :: ZYHAT_GLOB TYPE(TPROFILERDATA) :: TZPROFILER @@ -126,13 +124,6 @@ IF ( CFILE_PROF /= "NO_INPUT_CSV" .OR. NNUMB_PROF > 0 ) THEN CALL GATHERALL_FIELD_ll( 'XX', XXHAT, ZXHAT_GLOB, IERR ) CALL GATHERALL_FIELD_ll( 'YY', XYHAT, ZYHAT_GLOB, IERR ) - ! Interpolations of model variables to mass points - ZXHATM(1:IIU-1) = 0.5 * XXHAT(1:IIU-1) + 0.5 * XXHAT(2:IIU ) - ZXHATM( IIU ) = 1.5 * XXHAT( IIU ) - 0.5 * XXHAT( IIU-1) - - ZYHATM(1:IJU-1) = 0.5 * XYHAT(1:IJU-1) + 0.5 * XYHAT(2:IJU ) - ZYHATM( IJU ) = 1.5 * XYHAT( IJU ) - 0.5 * XYHAT( IJU-1) - ZXHATM_PHYS_MIN = 0.5 * ( ZXHAT_GLOB(1+JPHEXT) + ZXHAT_GLOB(2+JPHEXT) ) ZXHATM_PHYS_MAX = 0.5 * ( ZXHAT_GLOB(UBOUND(ZXHAT_GLOB,1)-JPHEXT) + ZXHAT_GLOB(UBOUND(ZXHAT_GLOB,1)-JPHEXT+1) ) ZYHATM_PHYS_MIN = 0.5 * ( ZYHAT_GLOB(1+JPHEXT) + ZYHAT_GLOB(2+JPHEXT) ) @@ -159,7 +150,7 @@ IF (CFILE_PROF=="NO_INPUT_CSV") THEN TZPROFILER%XZ = XZ_PROF(JI) TZPROFILER%CNAME = CNAME_PROF(JI) - CALL STATPROF_POSITION( TZPROFILER, ZXHAT_GLOB, ZYHAT_GLOB, ZXHATM, ZYHATM, & + CALL STATPROF_POSITION( TZPROFILER, ZXHAT_GLOB, ZYHAT_GLOB, XXHATM, XYHATM, & ZXHATM_PHYS_MIN, ZXHATM_PHYS_MAX, ZYHATM_PHYS_MIN, ZYHATM_PHYS_MAX, & GINSIDE, GPRESENT ) @@ -173,7 +164,7 @@ IF (CFILE_PROF=="NO_INPUT_CSV") THEN END IF ELSE !Treat CSV datafile - CALL STATPROF_CSV_READ( TZPROFILER, CFILE_PROF, ZXHAT_GLOB, ZYHAT_GLOB, ZXHATM, ZYHATM, & + CALL STATPROF_CSV_READ( TZPROFILER, CFILE_PROF, ZXHAT_GLOB, ZYHAT_GLOB, XXHATM, XYHATM, & ZXHATM_PHYS_MIN, ZXHATM_PHYS_MAX,ZYHATM_PHYS_MIN, ZYHATM_PHYS_MAX, & INUMBPROF ) END IF diff --git a/src/MNH/ini_size_spawn.f90 b/src/MNH/ini_size_spawn.f90 index abab91578..3695fe140 100644 --- a/src/MNH/ini_size_spawn.f90 +++ b/src/MNH/ini_size_spawn.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. @@ -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 1067f2cef..7f62014dd 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. @@ -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,13 @@ 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, 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 +746,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 +897,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_surfstationn.f90 b/src/MNH/ini_surfstationn.f90 index 5452a5f0e..94332d77c 100644 --- a/src/MNH/ini_surfstationn.f90 +++ b/src/MNH/ini_surfstationn.f90 @@ -63,7 +63,7 @@ USE MODD_ALLSTATION_n USE MODD_CONF, ONLY: LCARTESIAN USE MODD_DYN, ONLY: XSEGLEN USE MODD_DYN_n, ONLY: DYN_MODEL, XTSTEP -USE MODD_GRID_n, ONLY: XXHAT, XYHAT +USE MODD_GRID_n, ONLY: XXHAT, XXHATM, XYHAT, XYHATM USE MODD_PARAMETERS, ONLY: JPHEXT, JPVEXT USE MODD_STATION_n USE MODD_TYPE_STATPROF @@ -96,8 +96,6 @@ LOGICAL :: GINSIDE ! True if station is inside physical LOGICAL :: GPRESENT ! True if station is present on the current process REAL :: ZXHATM_PHYS_MIN, ZYHATM_PHYS_MIN ! Minimum X coordinate of mass points in the physical domain REAL :: ZXHATM_PHYS_MAX, ZYHATM_PHYS_MAX ! Minimum X coordinate of mass points in the physical domain -REAL, DIMENSION(SIZE(XXHAT)) :: ZXHATM ! mass point coordinates -REAL, DIMENSION(SIZE(XYHAT)) :: ZYHATM ! mass point coordinates REAL, DIMENSION(:), POINTER :: ZXHAT_GLOB REAL, DIMENSION(:), POINTER :: ZYHAT_GLOB TYPE(TSTATIONDATA) :: TZSTATION @@ -127,13 +125,6 @@ IF ( CFILE_STAT /= "NO_INPUT_CSV" .OR. NNUMB_STAT > 0 ) THEN CALL GATHERALL_FIELD_ll( 'XX', XXHAT, ZXHAT_GLOB, IERR ) CALL GATHERALL_FIELD_ll( 'YY', XYHAT, ZYHAT_GLOB, IERR ) - ! Interpolations of model variables to mass points - ZXHATM(1:IIU-1) = 0.5 * XXHAT(1:IIU-1) + 0.5 * XXHAT(2:IIU ) - ZXHATM( IIU ) = 1.5 * XXHAT( IIU ) - 0.5 * XXHAT( IIU-1) - - ZYHATM(1:IJU-1) = 0.5 * XYHAT(1:IJU-1) + 0.5 * XYHAT(2:IJU ) - ZYHATM( IJU ) = 1.5 * XYHAT( IJU ) - 0.5 * XYHAT( IJU-1) - ZXHATM_PHYS_MIN = 0.5 * ( ZXHAT_GLOB(1+JPHEXT) + ZXHAT_GLOB(2+JPHEXT) ) ZXHATM_PHYS_MAX = 0.5 * ( ZXHAT_GLOB(UBOUND(ZXHAT_GLOB,1)-JPHEXT) + ZXHAT_GLOB(UBOUND(ZXHAT_GLOB,1)-JPHEXT+1) ) ZYHATM_PHYS_MIN = 0.5 * ( ZYHAT_GLOB(1+JPHEXT) + ZYHAT_GLOB(2+JPHEXT) ) @@ -160,7 +151,7 @@ IF (CFILE_STAT=="NO_INPUT_CSV") THEN TZSTATION%XZ = XZ_STAT(JI) TZSTATION%CNAME = CNAME_STAT(JI) - CALL STATPROF_POSITION( TZSTATION, ZXHAT_GLOB, ZYHAT_GLOB, ZXHATM, ZYHATM, & + CALL STATPROF_POSITION( TZSTATION, ZXHAT_GLOB, ZYHAT_GLOB, XXHATM, XYHATM, & ZXHATM_PHYS_MIN, ZXHATM_PHYS_MAX, ZYHATM_PHYS_MIN, ZYHATM_PHYS_MAX, & GINSIDE, GPRESENT ) @@ -174,7 +165,7 @@ IF (CFILE_STAT=="NO_INPUT_CSV") THEN END IF ELSE !Treat CSV datafile - CALL STATPROF_CSV_READ( TZSTATION, CFILE_STAT, ZXHAT_GLOB, ZYHAT_GLOB, ZXHATM, ZYHATM, & + CALL STATPROF_CSV_READ( TZSTATION, CFILE_STAT, ZXHAT_GLOB, ZYHAT_GLOB, XXHATM, XYHATM, & ZXHATM_PHYS_MIN, ZXHATM_PHYS_MAX,ZYHATM_PHYS_MIN, ZYHATM_PHYS_MAX, & INUMBSTAT ) END IF diff --git a/src/MNH/modd_gridn.f90 b/src/MNH/modd_gridn.f90 index 055d3c88f..6437cfc8b 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. !----------------------------------------------------------------- ! ################## @@ -36,6 +36,7 @@ !! 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 +! P. Wautelet 02/09/2022: add XXHATM, XYHATM and XZHATM !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -47,6 +48,8 @@ IMPLICIT NONE 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 +57,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 diff --git a/src/MNH/modd_spawn.f90 b/src/MNH/modd_spawn.f90 index 8d432e588..6efedc643 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_sub_elecn.f90 b/src/MNH/modd_sub_elecn.f90 index d25df3084..1f5b6b940 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/mode_gridproj.f90 b/src/MNH/mode_gridproj.f90 index d907e6801..c055e7c06 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_CHECK( ZXHATM, "GRIDPROJ:ZXHATM" ) + CALL MPPDB_CHECK( ZYHATM, "GRIDPROJ:ZXHATM" ) +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/modeln.f90 b/src/MNH/modeln.f90 index bf87ea052..8183346f1 100644 --- a/src/MNH/modeln.f90 +++ b/src/MNH/modeln.f90 @@ -989,7 +989,7 @@ 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' @@ -1204,8 +1204,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 diff --git a/src/MNH/phys_paramn.f90 b/src/MNH/phys_paramn.f90 index be5d47e97..bb9291239 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. @@ -781,9 +781,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 diff --git a/src/MNH/prep_ideal_case.f90 b/src/MNH/prep_ideal_case.f90 index 5169942d6..d1604d2f1 100644 --- a/src/MNH/prep_ideal_case.f90 +++ b/src/MNH/prep_ideal_case.f90 @@ -1239,7 +1239,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 @@ -1283,6 +1284,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 + XXHATM(1:NIU-1) = 0.5 * XXHAT(1:NIU-1) + 0.5 * XXHAT(2:NIU) + XXHATM( NIU) = 1.5 * XXHAT( NIU) - 0.5 * XXHAT(NIU-1) + + XYHATM(1:NJU-1) = 0.5 * XYHAT(1:NJU-1) + 0.5 * XYHAT(2:NJU) + XYHATM( NJU) = 1.5 * XYHAT( NJU) - 0.5 * XYHAT(NJU-1) END IF ! !* 5.1.2 Orography and Gal-Chen Sommerville transformation : @@ -1425,8 +1433,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: ! @@ -1550,10 +1559,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_real_case.f90 b/src/MNH/prep_real_case.f90 index 7014fc3b2..f73bb0919 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. @@ -858,9 +858,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/radar_simulator.f90 b/src/MNH/radar_simulator.f90 index b855afc92..d03bfb657 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/read_all_data_grib_case.f90 b/src/MNH/read_all_data_grib_case.f90 index 8a7335846..6682759c5 100644 --- a/src/MNH/read_all_data_grib_case.f90 +++ b/src/MNH/read_all_data_grib_case.f90 @@ -370,12 +370,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_cams_data_netcdf_case.f90 b/src/MNH/read_cams_data_netcdf_case.f90 index a4023d091..ec6421713 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. @@ -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 c1511ef3b..2648709e0 100644 --- a/src/MNH/read_chem_data_netcdf_case.f90 +++ b/src/MNH/read_chem_data_netcdf_case.f90 @@ -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)) diff --git a/src/MNH/read_hgridn.f90 b/src/MNH/read_hgridn.f90 index d75ca9bba..b60277ad2 100644 --- a/src/MNH/read_hgridn.f90 +++ b/src/MNH/read_hgridn.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. @@ -250,7 +250,17 @@ 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 +XXHATM( : UBOUND(XXHATM,1)-1 ) = 0.5 * XXHAT( : UBOUND(XXHAT,1)-1 ) + 0.5 * XXHAT( LBOUND(XXHAT,1)+1 : UBOUND(XXHAT,1) ) +XXHATM( UBOUND(XXHATM,1) ) = 1.5 * XXHAT( UBOUND(XXHAT,1) ) - 0.5 * XXHAT( UBOUND(XXHAT,1)-1 ) + +XYHATM( : UBOUND(XYHATM,1)-1 ) = 0.5 * XYHAT( : UBOUND(XYHAT,1)-1 ) + 0.5 * XYHAT( LBOUND(XYHAT,1)+1 : UBOUND(XYHAT,1) ) +XYHATM( UBOUND(XYHATM,1) ) = 1.5 * XYHAT( UBOUND(XYHAT,1) ) - 0.5 * XYHAT( UBOUND(XYHAT,1)-1 ) + !JUAN REALZ IF ( CPROGRAM .EQ. "REAL " ) THEN IF (.NOT. (ASSOCIATED(XZS))) ALLOCATE(XZS(IIU,IJU)) diff --git a/src/MNH/read_ver_grid.f90 b/src/MNH/read_ver_grid.f90 index 2f8b1fc47..bd1de11a9 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. @@ -121,10 +121,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 +193,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 +215,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 +228,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 +259,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 +300,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 +326,11 @@ END SELECT ! !Set model top XZTOP = XZHAT(IKU) -! + +! Interpolations of positions to mass points +XZHATM(1:IKU-1 ) = 0.5 * XZHAT(1:IKU-1) + 0.5 * XZHAT(2:IKU ) +XZHATM( IKU ) = 1.5 * XZHAT( IKU ) - 0.5 * XZHAT( IKU-1) + !------------------------------------------------------------------------------- ! !* 5. TEST ON STRETCHING : diff --git a/src/MNH/relaxdef.f90 b/src/MNH/relaxdef.f90 index 41665139b..216dc0389 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/series_cloud_elec.f90 b/src/MNH/series_cloud_elec.f90 index cb4d18b42..05ced2f2a 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 395660c88..eac8ea7b8 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 6c49fbbf2..3f82878d9 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 28e528d8b..2f8bd2e68 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 3945848c8..dd7daa678 100644 --- a/src/MNH/set_grid.f90 +++ b/src/MNH/set_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. @@ -9,15 +9,15 @@ ! 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 ) + SUBROUTINE SET_GRID( KMI, TPINIFILE, & + KKU, KIMAX_ll, KJMAX_ll, & + PTSTEP, PSEGLEN, & + PLONORI, PLATORI, PLON, PLAT, & + PXHAT, PYHAT, PDXHAT, PDYHAT, PXHATM, PYHATM, & + PMAP, PZS, PZZ, PZHAT, PZHATM, 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 @@ -47,11 +47,14 @@ 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(:,:), 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 @@ -80,17 +83,17 @@ 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 ) -! ######################################################################### +! ##################################################################### + SUBROUTINE SET_GRID( KMI, TPINIFILE, & + KKU, KIMAX_ll, KJMAX_ll, & + PTSTEP, PSEGLEN, & + PLONORI, PLATORI, PLON, PLAT, & + PXHAT, PYHAT, PDXHAT, PDYHAT, PXHATM, PYHATM, & + 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 +210,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 @@ -260,11 +264,14 @@ 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(:,:), 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 @@ -396,11 +403,23 @@ CALL IO_Field_read(TPINIFILE,'DTSEG',TDTSEG) ! !* 2.1 Spatial grid ! + +! Interpolations of positions to mass points +PXHATM( : UBOUND(PXHATM,1)-1 ) = 0.5 * PXHAT( : UBOUND(PXHAT,1)-1 ) + 0.5 * PXHAT( LBOUND(PXHAT,1)+1 : UBOUND(PXHAT,1) ) +PXHATM( UBOUND(PXHATM,1) ) = 1.5 * PXHAT( UBOUND(PXHAT,1) ) - 0.5 * PXHAT( UBOUND(PXHAT,1)-1 ) + +PYHATM( : UBOUND(PYHATM,1)-1 ) = 0.5 * PYHAT( : UBOUND(PYHAT,1)-1 ) + 0.5 * PYHAT( LBOUND(PYHAT,1)+1 : UBOUND(PYHAT,1) ) +PYHATM( UBOUND(PYHATM,1) ) = 1.5 * PYHAT( UBOUND(PYHAT,1) ) - 0.5 * PYHAT( UBOUND(PYHAT,1)-1 ) + +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 ) + 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 diff --git a/src/MNH/set_perturb.f90 b/src/MNH/set_perturb.f90 index 42e384c2a..7e9e43687 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. @@ -275,11 +275,10 @@ SELECT CASE(CPERT_KIND) 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 diff --git a/src/MNH/set_ref.f90 b/src/MNH/set_ref.f90 index 3fbd530b7..02496e920 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 f6e82cd85..7822c7e60 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 d53c5ae36..857e92ede 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 89bb3d3ec..bbdf91a69 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.f90 b/src/MNH/shallow_mf.f90 index 2ae315ad5..cac05f86a 100644 --- a/src/MNH/shallow_mf.f90 +++ b/src/MNH/shallow_mf.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. @@ -192,7 +192,6 @@ USE MODI_COMPUTE_FRAC_ICE USE MODI_SHUMAN_MF ! USE MODI_COMPUTE_BL89_ML -USE MODD_GRID_n, ONLY : XDXHAT, XDYHAT USE MODD_REF_n, ONLY : XTHVREF USE MODE_MSG ! diff --git a/src/MNH/spawn_grid2.f90 b/src/MNH/spawn_grid2.f90 index 4ba0d58a3..7131b7d5a 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,11 @@ 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, & + PZTOP, OSLEVE, PLEN1, PLEN2, & + PZS, PZSMT, PZS_LS, PZSMT_LS, & + TPDTMOD, TPDTCUR ) ! USE MODD_TIME ! @@ -23,22 +23,23 @@ 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, 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 +48,13 @@ 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, & + PZTOP, OSLEVE, PLEN1, PLEN2, & + PZS, PZSMT, PZS_LS, PZSMT_LS, & + TPDTMOD, TPDTCUR ) +! ###################################################################################### ! !!**** *SPAWN_GRID2 * - subroutine to define spatial and temporal grid. !! @@ -184,10 +185,12 @@ 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, 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 +200,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 +306,8 @@ END IF ! -------------------------------------- ! PZTOP = XZTOP1 -PZHAT(:) = XZHAT1(:) +PZHAT(:) = XZHAT1(:) +PZHATM(:) = XZHATM1(:) OSLEVE = LSLEVE1 PLEN1 = XLEN11 PLEN2 = XLEN21 @@ -391,6 +394,11 @@ PLEN2 = XLEN21 DEALLOCATE(ZXHAT_2D_F) DEALLOCATE(ZXHAT_EXTENDED_C) DEALLOCATE(ZXHAT_2D_C) + + ! Interpolations of positions to mass points + PXHATM(1:IIU_C-1) = 0.5 * PXHAT(1:IIU_C-1) + 0.5 * PXHAT(2:IIU_C) + PXHATM( IIU_C) = 1.5 * PXHAT( IIU_C) - 0.5 * PXHAT(IIU_C-1) + ! ! YHAT ! @@ -449,6 +457,11 @@ PLEN2 = XLEN21 DEALLOCATE(ZYHAT_2D_F) DEALLOCATE(ZYHAT_EXTENDED_C) DEALLOCATE(ZYHAT_2D_C) + + ! Interpolations of positions to mass points + PYHATM(1:IJU_C-1) = 0.5 * PYHAT(1:IJU_C-1) + 0.5 * PYHAT(2:IJU_C) + PYHATM( IJU_C) = 1.5 * PYHAT( IJU_C) - 0.5 * PYHAT(IJU_C-1) + !!$======= !!$ IXSIZE1=SIZE(XXHAT1) !!$ ALLOCATE(ZXHAT_EXTENDED(IXSIZE1+1)) diff --git a/src/MNH/spawn_model2.f90 b/src/MNH/spawn_model2.f90 index 7d286b6ee..8837733b6 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. @@ -735,6 +735,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)) @@ -1058,9 +1059,10 @@ 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, & + 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) @@ -1079,10 +1081,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 @@ -1108,10 +1112,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 15c7d98b7..f0ef28310 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/surf_rad_modif.f90 b/src/MNH/surf_rad_modif.f90 index a21ce0dc1..1cb4f085d 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 b75198959..0a3eaabb7 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 ) ! ######################################################################### @@ -95,8 +90,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 +226,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 e7ea4ef22..0ffcf81e3 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 3742792d5..11295f83a 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_ver_thermo_flux.f90 b/src/MNH/turb_ver_thermo_flux.f90 index aa53f0822..596d78c00 100644 --- a/src/MNH/turb_ver_thermo_flux.f90 +++ b/src/MNH/turb_ver_thermo_flux.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. @@ -339,7 +339,7 @@ END MODULE MODI_TURB_VER_THERMO_FLUX USE MODD_CST USE MODD_CTURB use modd_field, only: tfieldmetadata, TYPEREAL -USE MODD_GRID_n, ONLY: XZS, XXHAT, XYHAT +USE MODD_GRID_n, ONLY: XZS, XXHAT, XXHATM, XYHAT, XYHATM USE MODD_IO, ONLY: TFILEDATA USE MODD_METRICS_n, ONLY: XDXX, XDYY, XDZX, XDZY, XDZZ USE MODD_PARAMETERS @@ -545,10 +545,9 @@ IF (LOCEAN .AND. LDEEPOC) THEN CALL GET_INDICE_ll(IIB,IJB,IIE,IJE) DO JJ = IJB,IJE DO JI = IIB,IIE - ZDIST(JI,JJ) = SQRT( & - (( (XXHAT(JI)+XXHAT(JI+1))*0.5 - XCENTX_OC ) / XRADX_OC)**2 + & - (( (XYHAT(JJ)+XYHAT(JJ+1))*0.5 - XCENTY_OC ) / XRADY_OC)**2 & - ) + ZDIST(JI,JJ) = SQRT( & + ( ( XXHATM(JI) - XCENTX_OC ) / XRADX_OC )**2 + & + ( ( XYHATM(JJ) - XCENTY_OC ) / XRADY_OC )**2 ) END DO END DO DO JJ=IJB,IJE diff --git a/src/MNH/ver_interp_to_mixed_grid.f90 b/src/MNH/ver_interp_to_mixed_grid.f90 index 94b161a5d..1c1580cc9 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 a4e8ee654..186f230a4 100644 --- a/src/MNH/ver_thermo.f90 +++ b/src/MNH/ver_thermo.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. @@ -332,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/write_lfifm1_for_diag.f90 b/src/MNH/write_lfifm1_for_diag.f90 index 0bb1d984b..d452fecaf 100644 --- a/src/MNH/write_lfifm1_for_diag.f90 +++ b/src/MNH/write_lfifm1_for_diag.f90 @@ -178,7 +178,7 @@ use modd_field, only: tfieldmetadata, tfieldlist, TYPEINT, TYPEREAL USE MODD_FIELD_n, ONLY: XCIT, XCLDFR, 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, XLAT, XLEN1, XLEN2, XLON, XZS, XXHAT, XYHAT, XZHAT, XZSMT, XZTOP, XZZ +USE MODD_GRID_n, only: LSLEVE, 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 @@ -1217,10 +1217,7 @@ IF (LTRAJ) THEN ! 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) + ZWORK31(:,JJ,JK) = 1E-3*XXHATM(:) END DO END DO @@ -1236,15 +1233,12 @@ IF (LTRAJ) THEN NDIMS = 3, & LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31*1e-3) + 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) + ZWORK31(JI,:,JK) = 1E-3 * XYHATM(:) END DO END DO @@ -1252,7 +1246,7 @@ IF (LTRAJ) THEN TZFIELD%CLONGNAME = 'Y' TZFIELD%CCOMMENT = 'X_Y_Z_Y coordinate' - CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31*1e-3) + CALL IO_Field_write(TPFILE,TZFIELD,ZWORK31) END IF ! ! Passive polluant scalar variables diff --git a/src/MNH/write_surf_mnh.f90 b/src/MNH/write_surf_mnh.f90 index 216fefe1f..ef001e661 100644 --- a/src/MNH/write_surf_mnh.f90 +++ b/src/MNH/write_surf_mnh.f90 @@ -286,7 +286,7 @@ END SUBROUTINE WRITE_SURFX0_MNH ! USE MODD_CONF_n, ONLY: CSTORAGE_TYPE use modd_field, only: tfieldmetadata, tfieldlist, TYPEREAL -USE MODD_GRID_n, ONLY: XXHAT, XYHAT +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, & @@ -447,7 +447,12 @@ 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 + XXHATM( : UBOUND(XXHATM,1)-1 ) = 0.5 * XXHAT( : UBOUND(XXHAT,1)-1 ) + 0.5 * XXHAT( LBOUND(XXHAT,1)+1 : UBOUND(XXHAT,1) ) + XXHATM( UBOUND(XXHATM,1) ) = 1.5 * XXHAT( UBOUND(XXHAT,1) ) - 0.5 * XXHAT( UBOUND(XXHAT,1)-1 ) END IF END IF DEALLOCATE(ZW1D) @@ -478,7 +483,12 @@ 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 + XYHATM( : UBOUND(XYHATM,1)-1 ) = 0.5 * XYHAT( : UBOUND(XYHAT,1)-1 ) + 0.5 * XYHAT( LBOUND(XYHAT,1)+1 : UBOUND(XYHAT,1) ) + XYHATM( UBOUND(XYHATM,1) ) = 1.5 * XYHAT( UBOUND(XYHAT,1) ) - 0.5 * XYHAT( UBOUND(XYHAT,1)-1 ) END IF END IF DEALLOCATE(ZW1D) -- GitLab From a90e04873986214515c8e4eea672b05fd312e1d1 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Wed, 7 Sep 2022 14:39:23 +0200 Subject: [PATCH 095/157] Philippe 07/09/2022: deduplication of PX/Y/ZHATM interpolations + update_halo for horizontal values --- src/MNH/ini_modeln.f90 | 2 +- src/MNH/ini_spectren.f90 | 2 +- src/MNH/prep_ideal_case.f90 | 7 +- src/MNH/read_hgridn.f90 | 7 +- src/MNH/read_ver_grid.f90 | 4 +- src/MNH/set_grid.f90 | 178 +++++++++++++++++++----------------- src/MNH/spawn_grid2.f90 | 9 +- src/MNH/write_surf_mnh.f90 | 9 +- 8 files changed, 106 insertions(+), 112 deletions(-) diff --git a/src/MNH/ini_modeln.f90 b/src/MNH/ini_modeln.f90 index 282936099..9ef32c017 100644 --- a/src/MNH/ini_modeln.f90 +++ b/src/MNH/ini_modeln.f90 @@ -412,6 +412,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 @@ -460,7 +461,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 diff --git a/src/MNH/ini_spectren.f90 b/src/MNH/ini_spectren.f90 index 7f62014dd..c17715ec6 100644 --- a/src/MNH/ini_spectren.f90 +++ b/src/MNH/ini_spectren.f90 @@ -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 diff --git a/src/MNH/prep_ideal_case.f90 b/src/MNH/prep_ideal_case.f90 index d1604d2f1..6be3241c1 100644 --- a/src/MNH/prep_ideal_case.f90 +++ b/src/MNH/prep_ideal_case.f90 @@ -379,6 +379,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 ! USE MODI_DEFAULT_DESFM_n ! Interface modules USE MODI_DEFAULT_EXPRE @@ -1286,11 +1287,7 @@ ELSE END IF ! Interpolations of positions to mass points - XXHATM(1:NIU-1) = 0.5 * XXHAT(1:NIU-1) + 0.5 * XXHAT(2:NIU) - XXHATM( NIU) = 1.5 * XXHAT( NIU) - 0.5 * XXHAT(NIU-1) - - XYHATM(1:NJU-1) = 0.5 * XYHAT(1:NJU-1) + 0.5 * XYHAT(2:NJU) - XYHATM( NJU) = 1.5 * XYHAT( NJU) - 0.5 * XYHAT(NJU-1) + CALL INTERP_HORGRID_TO_MASSPOINTS( XXHAT, XYHAT, XXHATM, XYHATM ) END IF ! !* 5.1.2 Orography and Gal-Chen Sommerville transformation : diff --git a/src/MNH/read_hgridn.f90 b/src/MNH/read_hgridn.f90 index b60277ad2..39586f979 100644 --- a/src/MNH/read_hgridn.f90 +++ b/src/MNH/read_hgridn.f90 @@ -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 use MODE_TOOLS_ll, only: GET_DIM_EXT_ll, GET_DIM_PHYS_ll, GET_INDICE_ll ! IMPLICIT NONE @@ -255,11 +256,7 @@ IF ( .NOT. ASSOCIATED(XXHATM) ) ALLOCATE( XXHATM(SIZE( XXHAT )) ) IF ( .NOT. ASSOCIATED(XYHATM) ) ALLOCATE( XYHATM(SIZE( XYHAT )) ) ! Interpolations of positions to mass points -XXHATM( : UBOUND(XXHATM,1)-1 ) = 0.5 * XXHAT( : UBOUND(XXHAT,1)-1 ) + 0.5 * XXHAT( LBOUND(XXHAT,1)+1 : UBOUND(XXHAT,1) ) -XXHATM( UBOUND(XXHATM,1) ) = 1.5 * XXHAT( UBOUND(XXHAT,1) ) - 0.5 * XXHAT( UBOUND(XXHAT,1)-1 ) - -XYHATM( : UBOUND(XYHATM,1)-1 ) = 0.5 * XYHAT( : UBOUND(XYHAT,1)-1 ) + 0.5 * XYHAT( LBOUND(XYHAT,1)+1 : UBOUND(XYHAT,1) ) -XYHATM( UBOUND(XYHATM,1) ) = 1.5 * XYHAT( UBOUND(XYHAT,1) ) - 0.5 * XYHAT( UBOUND(XYHAT,1)-1 ) +CALL INTERP_HORGRID_TO_MASSPOINTS( XXHAT, XYHAT, XXHATM, XYHATM ) !JUAN REALZ IF ( CPROGRAM .EQ. "REAL " ) THEN diff --git a/src/MNH/read_ver_grid.f90 b/src/MNH/read_ver_grid.f90 index bd1de11a9..653bbec02 100644 --- a/src/MNH/read_ver_grid.f90 +++ b/src/MNH/read_ver_grid.f90 @@ -111,6 +111,7 @@ USE MODD_PARAMETERS ! USE MODE_MSG USE MODE_POS +USE MODE_SET_GRID, ONLY: INTERP_VERGRID_TO_MASSPOINTS ! USE MODI_DEFAULT_SLEVE ! @@ -328,8 +329,7 @@ END SELECT XZTOP = XZHAT(IKU) ! Interpolations of positions to mass points -XZHATM(1:IKU-1 ) = 0.5 * XZHAT(1:IKU-1) + 0.5 * XZHAT(2:IKU ) -XZHATM( IKU ) = 1.5 * XZHAT( IKU ) - 0.5 * XZHAT( IKU-1) +CALL INTERP_VERGRID_TO_MASSPOINTS( XZHAT, XZHATM ) !------------------------------------------------------------------------------- ! diff --git a/src/MNH/set_grid.f90 b/src/MNH/set_grid.f90 index dd7daa678..1f972fd21 100644 --- a/src/MNH/set_grid.f90 +++ b/src/MNH/set_grid.f90 @@ -3,86 +3,24 @@ !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, PXHATM, PYHATM, & - PMAP, PZS, PZZ, PZHAT, PZHATM, 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) :: 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(:,:), 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) :: 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 -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 -! -! -! -! -! + +IMPLICIT NONE + +PRIVATE + +PUBLIC :: SET_GRID + +PUBLIC :: INTERP_HORGRID_1DIR_TO_MASSPOINTS, INTERP_HORGRID_TO_MASSPOINTS, INTERP_VERGRID_TO_MASSPOINTS + +CONTAINS + ! ##################################################################### SUBROUTINE SET_GRID( KMI, TPINIFILE, & KKU, KIMAX_ll, KJMAX_ll, & @@ -405,14 +343,8 @@ CALL IO_Field_read(TPINIFILE,'DTSEG',TDTSEG) ! ! Interpolations of positions to mass points -PXHATM( : UBOUND(PXHATM,1)-1 ) = 0.5 * PXHAT( : UBOUND(PXHAT,1)-1 ) + 0.5 * PXHAT( LBOUND(PXHAT,1)+1 : UBOUND(PXHAT,1) ) -PXHATM( UBOUND(PXHATM,1) ) = 1.5 * PXHAT( UBOUND(PXHAT,1) ) - 0.5 * PXHAT( UBOUND(PXHAT,1)-1 ) - -PYHATM( : UBOUND(PYHATM,1)-1 ) = 0.5 * PYHAT( : UBOUND(PYHAT,1)-1 ) + 0.5 * PYHAT( LBOUND(PYHAT,1)+1 : UBOUND(PYHAT,1) ) -PYHATM( UBOUND(PYHATM,1) ) = 1.5 * PYHAT( UBOUND(PYHAT,1) ) - 0.5 * PYHAT( UBOUND(PYHAT,1)-1 ) - -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 ) +CALL INTERP_HORGRID_TO_MASSPOINTS( PXHAT, PYHAT, PXHATM, PYHATM ) +CALL INTERP_VERGRID_TO_MASSPOINTS( PZHAT, PZHATM ) IF (LCARTESIAN) THEN CALL SM_GRIDCART(PXHAT,PYHAT,PZHAT,PZS,OSLEVE,PLEN1,PLEN2,PZSMT,PDXHAT,PDYHAT,PZZ,PJ) @@ -496,3 +428,77 @@ 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 + + +END MODULE MODE_SET_GRID diff --git a/src/MNH/spawn_grid2.f90 b/src/MNH/spawn_grid2.f90 index 7131b7d5a..6909c693e 100644 --- a/src/MNH/spawn_grid2.f90 +++ b/src/MNH/spawn_grid2.f90 @@ -167,6 +167,7 @@ USE MODD_BIKHARDT_n USE MODD_VAR_ll use mode_bikhardt USE MODE_ll +USE MODE_SET_GRID, only: INTERP_HORGRID_TO_MASSPOINTS USE MODE_TIME USE MODE_GRIDPROJ ! @@ -394,11 +395,6 @@ PLEN2 = XLEN21 DEALLOCATE(ZXHAT_2D_F) DEALLOCATE(ZXHAT_EXTENDED_C) DEALLOCATE(ZXHAT_2D_C) - - ! Interpolations of positions to mass points - PXHATM(1:IIU_C-1) = 0.5 * PXHAT(1:IIU_C-1) + 0.5 * PXHAT(2:IIU_C) - PXHATM( IIU_C) = 1.5 * PXHAT( IIU_C) - 0.5 * PXHAT(IIU_C-1) - ! ! YHAT ! @@ -459,8 +455,7 @@ PLEN2 = XLEN21 DEALLOCATE(ZYHAT_2D_C) ! Interpolations of positions to mass points - PYHATM(1:IJU_C-1) = 0.5 * PYHAT(1:IJU_C-1) + 0.5 * PYHAT(2:IJU_C) - PYHATM( IJU_C) = 1.5 * PYHAT( IJU_C) - 0.5 * PYHAT(IJU_C-1) + CALL INTERP_HORGRID_TO_MASSPOINTS( PXHAT, PYHAT, PXHATM, PYHATM ) !!$======= !!$ IXSIZE1=SIZE(XXHAT1) diff --git a/src/MNH/write_surf_mnh.f90 b/src/MNH/write_surf_mnh.f90 index ef001e661..ca3d3d124 100644 --- a/src/MNH/write_surf_mnh.f90 +++ b/src/MNH/write_surf_mnh.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1997-2021 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. @@ -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 @@ -451,8 +452,7 @@ IF ( (CSTORAGE_TYPE=='PG' .OR. CSTORAGE_TYPE=='SU') & XXHAT(:) = ZW1D(1+NHALO:IIU-NHALO) ! Interpolations of positions to mass points - XXHATM( : UBOUND(XXHATM,1)-1 ) = 0.5 * XXHAT( : UBOUND(XXHAT,1)-1 ) + 0.5 * XXHAT( LBOUND(XXHAT,1)+1 : UBOUND(XXHAT,1) ) - XXHATM( UBOUND(XXHATM,1) ) = 1.5 * XXHAT( UBOUND(XXHAT,1) ) - 0.5 * XXHAT( UBOUND(XXHAT,1)-1 ) + CALL INTERP_HORGRID_1DIR_TO_MASSPOINTS( 'X', XXHAT, XXHATM ) END IF END IF DEALLOCATE(ZW1D) @@ -487,8 +487,7 @@ ELSE IF ( (CSTORAGE_TYPE=='PG' .OR. CSTORAGE_TYPE=='SU') & XYHAT(:) = ZW1D(1+NHALO:IJU-NHALO) ! Interpolations of positions to mass points - XYHATM( : UBOUND(XYHATM,1)-1 ) = 0.5 * XYHAT( : UBOUND(XYHAT,1)-1 ) + 0.5 * XYHAT( LBOUND(XYHAT,1)+1 : UBOUND(XYHAT,1) ) - XYHATM( UBOUND(XYHATM,1) ) = 1.5 * XYHAT( UBOUND(XYHAT,1) ) - 0.5 * XYHAT( UBOUND(XYHAT,1)-1 ) + CALL INTERP_HORGRID_1DIR_TO_MASSPOINTS( 'Y', XYHAT, XYHATM ) END IF END IF DEALLOCATE(ZW1D) -- GitLab From 58b1614eddde4583253cf4c59adcb3fcf50e895d Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Fri, 9 Sep 2022 14:31:09 +0200 Subject: [PATCH 096/157] Philippe 09/09/2022: add XHAT_BOUND and XHATM_BOUND + set their values --- src/LIB/SURCOUCHE/src/mode_field.f90 | 26 ++++ src/MNH/ini_modeln.f90 | 11 +- src/MNH/ini_spectren.f90 | 9 +- src/MNH/modd_gridn.f90 | 33 ++++- src/MNH/prep_ideal_case.f90 | 12 +- src/MNH/read_hgridn.f90 | 8 +- src/MNH/read_ver_grid.f90 | 6 +- src/MNH/set_grid.f90 | 200 +++++++++++++++++++++------ src/MNH/spawn_grid2.f90 | 12 +- src/MNH/spawn_model2.f90 | 2 + 10 files changed, 258 insertions(+), 61 deletions(-) diff --git a/src/LIB/SURCOUCHE/src/mode_field.f90 b/src/LIB/SURCOUCHE/src/mode_field.f90 index a0df6d83f..71eefd211 100644 --- a/src/LIB/SURCOUCHE/src/mode_field.f90 +++ b/src/LIB/SURCOUCHE/src/mode_field.f90 @@ -511,6 +511,30 @@ call Add_field2list( TFIELDDATA( & 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', & @@ -3632,6 +3656,8 @@ 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 ) diff --git a/src/MNH/ini_modeln.f90 b/src/MNH/ini_modeln.f90 index 9ef32c017..a3de7b35a 100644 --- a/src/MNH/ini_modeln.f90 +++ b/src/MNH/ini_modeln.f90 @@ -292,7 +292,7 @@ END MODULE MODI_INI_MODEL_n ! S. Riette 04/2020: XHL* fields ! F. Auguste 02/2021: add IBM ! T.Nigel 02/2021: add turbulence recycling -! J.L.Redelsperger 06/2011: OCEAN case +! J.L.Redelsperger 06/2021: OCEAN case !--------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -1013,6 +1013,8 @@ ALLOCATE(XDIRCOSXW(IIU,IJU)) ALLOCATE(XDIRCOSYW(IIU,IJU)) ALLOCATE(XCOSSLOPE(IIU,IJU)) ALLOCATE(XSINSLOPE(IIU,IJU)) +ALLOCATE(XHAT_BOUND (NHAT_BOUND_SIZE)) +ALLOCATE(XHATM_BOUND(NHAT_BOUND_SIZE)) ! ALLOCATE(XDXX(IIU,IJU,IKU)) ALLOCATE(XDYY(IIU,IJU,IKU)) @@ -1858,9 +1860,10 @@ END IF CALL SET_GRID( KMI, TPINIFILE, IKU, NIMAX_ll, NJMAX_ll, & XTSTEP, XSEGLEN, & XLONORI, XLATORI, XLON, XLAT, & - XXHAT, XYHAT, XDXHAT, XDYHAT, XXHATM, XYHATM, XMAP, & - XZS, XZZ, XZHAT, XZHATM, XZTOP, LSLEVE, XLEN1, XLEN2, XZSMT, & - ZJ, & + XXHAT, XYHAT, XDXHAT, XDYHAT, XXHATM, XYHATM, & + 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) diff --git a/src/MNH/ini_spectren.f90 b/src/MNH/ini_spectren.f90 index c17715ec6..a98810782 100644 --- a/src/MNH/ini_spectren.f90 +++ b/src/MNH/ini_spectren.f90 @@ -269,6 +269,8 @@ ALLOCATE(XZSMT(IIU,IJU)) ALLOCATE(XZZ(IIU,IJU,IKU)) ALLOCATE(XZHAT(IKU)) ALLOCATE(XZHATM(IKU)) +ALLOCATE(XHAT_BOUND (NHAT_BOUND_SIZE)) +ALLOCATE(XHATM_BOUND(NHAT_BOUND_SIZE)) ! ALLOCATE(XDXX(IIU,IJU,IKU)) ALLOCATE(XDYY(IIU,IJU,IKU)) @@ -688,9 +690,10 @@ CALL INI_BIKHARDT_n (NDXRATIO_ALL(KMI),NDYRATIO_ALL(KMI),KMI) CALL SET_GRID( KMI, TPINIFILE, IKU, NIMAX_ll, NJMAX_ll, & XTSTEP, XSEGLEN, & XLONORI, XLATORI, XLON, XLAT, & - XXHAT, XYHAT, XDXHAT, XDYHAT, XXHATM, XYHATM, XMAP, & - XZS, XZZ, XZHAT, XZHATM, XZTOP, LSLEVE, XLEN1, XLEN2, XZSMT, & - ZJ, & + XXHAT, XYHAT, XDXHAT, XDYHAT, XXHATM, XYHATM, & + 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) diff --git a/src/MNH/modd_gridn.f90 b/src/MNH/modd_gridn.f90 index 6437cfc8b..1f0c5d895 100644 --- a/src/MNH/modd_gridn.f90 +++ b/src/MNH/modd_gridn.f90 @@ -31,20 +31,39 @@ !! !! 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 -! P. Wautelet 02/09/2022: add XXHATM, XYHATM and XZHATM +! 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 and XHATM_BOUND !------------------------------------------------------------------------------- ! !* 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 @@ -67,5 +86,7 @@ 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 END MODULE MODD_GRID_n diff --git a/src/MNH/prep_ideal_case.f90 b/src/MNH/prep_ideal_case.f90 index 6be3241c1..8d4cdc385 100644 --- a/src/MNH/prep_ideal_case.f90 +++ b/src/MNH/prep_ideal_case.f90 @@ -379,7 +379,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 +USE MODE_SET_GRID, only: INTERP_HORGRID_TO_MASSPOINTS, STORE_HORGRID_BOUNDS ! USE MODI_DEFAULT_DESFM_n ! Interface modules USE MODI_DEFAULT_EXPRE @@ -1242,6 +1242,7 @@ ELSE ! ALLOCATE( XXHAT(NIU), XYHAT(NJU) ) ALLOCATE( XXHATM(NIU), XYHATM(NJU) ) + ALLOCATE( XHAT_BOUND (NHAT_BOUND_SIZE), XHATM_BOUND(NHAT_BOUND_SIZE) ) ! ! define the grid localization at the earth surface by the central point ! coordinates @@ -1254,14 +1255,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 @@ -1288,6 +1285,11 @@ ELSE ! Interpolations of positions to mass points CALL INTERP_HORGRID_TO_MASSPOINTS( XXHAT, XYHAT, XXHATM, XYHATM ) + + ! Collect global domain boundaries + CALL STORE_HORGRID_BOUNDS( XXHAT, XYHAT, XHAT_BOUND ) + CALL STORE_HORGRID_BOUNDS( XXHATM, XYHATM, XHATM_BOUND ) + END IF ! !* 5.1.2 Orography and Gal-Chen Sommerville transformation : diff --git a/src/MNH/read_hgridn.f90 b/src/MNH/read_hgridn.f90 index 39586f979..7bdf08ec4 100644 --- a/src/MNH/read_hgridn.f90 +++ b/src/MNH/read_hgridn.f90 @@ -93,7 +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 +USE MODE_SET_GRID, only: INTERP_HORGRID_TO_MASSPOINTS, STORE_HORGRID_BOUNDS use MODE_TOOLS_ll, only: GET_DIM_EXT_ll, GET_DIM_PHYS_ll, GET_INDICE_ll ! IMPLICIT NONE @@ -254,10 +254,16 @@ CALL IO_Field_read(TPFMFILE,'YHAT',XYHAT) IF ( .NOT. ASSOCIATED(XXHATM) ) ALLOCATE( XXHATM(SIZE( XXHAT )) ) IF ( .NOT. ASSOCIATED(XYHATM) ) ALLOCATE( XYHATM(SIZE( XYHAT )) ) +IF ( .NOT. ASSOCIATED(XHAT_BOUND) ) ALLOCATE( XHAT_BOUND (NHAT_BOUND_SIZE) ) +IF ( .NOT. ASSOCIATED(XHATM_BOUND) ) ALLOCATE( XHATM_BOUND(NHAT_BOUND_SIZE) ) ! Interpolations of positions to mass points CALL INTERP_HORGRID_TO_MASSPOINTS( XXHAT, XYHAT, XXHATM, XYHATM ) +! Collect global domain boundaries +CALL STORE_HORGRID_BOUNDS( XXHAT, XYHAT, XHAT_BOUND ) +CALL STORE_HORGRID_BOUNDS( XXHATM, XYHATM, XHATM_BOUND ) + !JUAN REALZ IF ( CPROGRAM .EQ. "REAL " ) THEN IF (.NOT. (ASSOCIATED(XZS))) ALLOCATE(XZS(IIU,IJU)) diff --git a/src/MNH/read_ver_grid.f90 b/src/MNH/read_ver_grid.f90 index 653bbec02..7fd47bf64 100644 --- a/src/MNH/read_ver_grid.f90 +++ b/src/MNH/read_ver_grid.f90 @@ -111,7 +111,7 @@ USE MODD_PARAMETERS ! USE MODE_MSG USE MODE_POS -USE MODE_SET_GRID, ONLY: INTERP_VERGRID_TO_MASSPOINTS +USE MODE_SET_GRID, ONLY: INTERP_VERGRID_TO_MASSPOINTS, STORE_VERGRID_BOUNDS ! USE MODI_DEFAULT_SLEVE ! @@ -331,6 +331,10 @@ XZTOP = XZHAT(IKU) ! Interpolations of positions to mass points CALL INTERP_VERGRID_TO_MASSPOINTS( XZHAT, XZHATM ) +! Collect global domain boundaries +CALL STORE_VERGRID_BOUNDS( XZHAT, XHAT_BOUND ) +CALL STORE_VERGRID_BOUNDS( XZHATM, XHATM_BOUND ) + !------------------------------------------------------------------------------- ! !* 5. TEST ON STRETCHING : diff --git a/src/MNH/set_grid.f90 b/src/MNH/set_grid.f90 index 1f972fd21..25d645e5c 100644 --- a/src/MNH/set_grid.f90 +++ b/src/MNH/set_grid.f90 @@ -19,6 +19,8 @@ PUBLIC :: SET_GRID PUBLIC :: INTERP_HORGRID_1DIR_TO_MASSPOINTS, INTERP_HORGRID_TO_MASSPOINTS, INTERP_VERGRID_TO_MASSPOINTS +PUBLIC :: STORE_GRID_BOUNDS, STORE_HORGRID_BOUNDS, STORE_VERGRID_BOUNDS + CONTAINS ! ##################################################################### @@ -27,6 +29,7 @@ CONTAINS PTSTEP, PSEGLEN, & PLONORI, PLATORI, PLON, PLAT, & PXHAT, PYHAT, PDXHAT, PDYHAT, PXHATM, PYHATM, & + PHAT_BOUND, PHATM_BOUND, & PMAP, PZS, PZZ, PZHAT, PZHATM, PZTOP, OSLEVE, & PLEN1, PLEN2, PZSMT, PJ, & TPDTMOD, TPDTCUR, KSTOP, & @@ -204,6 +207,8 @@ 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(:), INTENT(INOUT) :: PHAT_BOUND ! Boundaries of global domain in the conformal or cartesian plane +REAL, DIMENSION(:), INTENT(INOUT) :: PHATM_BOUND ! Boundaries of global domain in the conformal or cartesian plane at mass pts REAL, DIMENSION(:,:), INTENT(OUT) :: PMAP ! Map factor ! REAL, DIMENSION(:,:), INTENT(OUT) :: PZS ! orography @@ -346,6 +351,10 @@ CALL IO_Field_read(TPINIFILE,'DTSEG',TDTSEG) CALL INTERP_HORGRID_TO_MASSPOINTS( PXHAT, PYHAT, PXHATM, PYHATM ) CALL INTERP_VERGRID_TO_MASSPOINTS( PZHAT, PZHATM ) +! Collect global domain boundaries +CALL STORE_GRID_BOUNDS( PXHAT, PYHAT, PZHAT, PHAT_BOUND ) +CALL STORE_GRID_BOUNDS( PXHATM, PYHATM, PZHATM, PHATM_BOUND ) + IF (LCARTESIAN) THEN CALL SM_GRIDCART(PXHAT,PYHAT,PZHAT,PZS,OSLEVE,PLEN1,PLEN2,PZSMT,PDXHAT,PDYHAT,PZZ,PJ) ELSE @@ -430,75 +439,186 @@ 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 + ! Interpolate 1 direction of horizontal grid to mass points -USE MODD_ARGSLIST_ll, ONLY: LIST1D_ll + 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 + USE MODE_ARGSLIST_ll, ONLY: ADD1DFIELD_ll, CLEANLIST1D_ll + USE MODE_EXCHANGE_ll, ONLY: UPDATE_1DHALO_ll + USE MODE_MSG -IMPLICIT NONE + 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=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 + 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 ) + ! 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 ) + ! 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 + 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 ) + 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 + 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 + 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 ) + 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 + ! Interpolate vertical grid to mass points -IMPLICIT NONE + 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 + 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 ) + 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_BOUNDS( HDIR, PHAT, PHAT_BOUND ) + + USE MODD_GRID_n + USE MODD_PARAMETERS, ONLY: JPHEXT, JPVEXT + + 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(NHAT_BOUND_SIZE), INTENT(INOUT) :: PHAT_BOUND ! Boundaries of global domain in the conformal or cartesian plane + + INTEGER :: IERR + LOGICAL :: GALLOC + REAL, DIMENSION(:), POINTER :: ZHAT_GLOB + + ZHAT_GLOB => NULL() + + SELECT CASE (HDIR) + CASE ( 'X' ) + CALL ALLOCBUFFER_ll( ZHAT_GLOB, PHAT, 'XX', GALLOC ) + CALL GATHERALL_FIELD_ll( 'XX', PHAT, ZHAT_GLOB, IERR ) + PHAT_BOUND(NEXTE_XMIN) = ZHAT_GLOB( 1 ) + PHAT_BOUND(NEXTE_XMAX) = ZHAT_GLOB( UBOUND( ZHAT_GLOB, 1 ) ) + PHAT_BOUND(NPHYS_XMIN) = ZHAT_GLOB( JPHEXT + 1 ) + PHAT_BOUND(NPHYS_XMAX) = ZHAT_GLOB( UBOUND( ZHAT_GLOB, 1 ) - JPHEXT ) + + CASE ( 'Y' ) + CALL ALLOCBUFFER_ll( ZHAT_GLOB, PHAT, 'YY', GALLOC ) + CALL GATHERALL_FIELD_ll( 'YY', PHAT, ZHAT_GLOB, IERR ) + PHAT_BOUND(NEXTE_YMIN) = ZHAT_GLOB( 1 ) + PHAT_BOUND(NEXTE_YMAX) = ZHAT_GLOB( UBOUND( ZHAT_GLOB, 1 ) ) + PHAT_BOUND(NPHYS_YMIN) = ZHAT_GLOB( JPHEXT + 1 ) + PHAT_BOUND(NPHYS_YMAX) = ZHAT_GLOB( UBOUND( ZHAT_GLOB, 1 ) - JPHEXT ) + + CASE ( 'Z' ) + ZHAT_GLOB => PHAT + PHAT_BOUND(NEXTE_ZMIN) = ZHAT_GLOB( 1 ) + PHAT_BOUND(NEXTE_ZMAX) = ZHAT_GLOB( UBOUND( ZHAT_GLOB, 1 ) ) + PHAT_BOUND(NPHYS_ZMIN) = ZHAT_GLOB( JPVEXT + 1 ) + PHAT_BOUND(NPHYS_ZMAX) = ZHAT_GLOB( UBOUND( ZHAT_GLOB, 1 ) - JPVEXT ) + + CASE DEFAULT + CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'STORE_GRID_1DIR_BOUNDS', 'invalid direction (valid: X, Y or Z)' ) + + END SELECT + + IF ( GALLOC ) DEALLOCATE( ZHAT_GLOB ) + +END SUBROUTINE STORE_GRID_1DIR_BOUNDS +!----------------------------------------------------------------- + + +!----------------------------------------------------------------- +SUBROUTINE STORE_GRID_BOUNDS( PXHAT, PYHAT, PZHAT, PHAT_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(INOUT) :: PHAT_BOUND ! Boundaries of global domain in the conformal or cartesian plane + + CALL STORE_GRID_1DIR_BOUNDS( 'X', PXHAT, PHAT_BOUND ) + CALL STORE_GRID_1DIR_BOUNDS( 'Y', PYHAT, PHAT_BOUND ) + CALL STORE_GRID_1DIR_BOUNDS( 'Z', PZHAT, PHAT_BOUND ) + +END SUBROUTINE STORE_GRID_BOUNDS +!----------------------------------------------------------------- + + +!----------------------------------------------------------------- +SUBROUTINE STORE_HORGRID_BOUNDS( PXHAT, PYHAT, PHAT_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(INOUT) :: PHAT_BOUND ! Boundaries of global domain in the conformal or cartesian plane + + CALL STORE_GRID_1DIR_BOUNDS( 'X', PXHAT, PHAT_BOUND ) + CALL STORE_GRID_1DIR_BOUNDS( 'Y', PYHAT, PHAT_BOUND ) + +END SUBROUTINE STORE_HORGRID_BOUNDS +!----------------------------------------------------------------- + + +!----------------------------------------------------------------- +SUBROUTINE STORE_VERGRID_BOUNDS( PZHAT, PHAT_BOUND ) + + IMPLICIT NONE + + REAL, DIMENSION(:), INTENT(IN) :: PZHAT ! Position y in the conformal or cartesian plane + REAL, DIMENSION(:), INTENT(INOUT) :: PHAT_BOUND ! Boundaries of global domain in the conformal or cartesian plane + + CALL STORE_GRID_1DIR_BOUNDS( 'Z', PZHAT, PHAT_BOUND ) + +END SUBROUTINE STORE_VERGRID_BOUNDS +!----------------------------------------------------------------- END MODULE MODE_SET_GRID diff --git a/src/MNH/spawn_grid2.f90 b/src/MNH/spawn_grid2.f90 index 6909c693e..564efb716 100644 --- a/src/MNH/spawn_grid2.f90 +++ b/src/MNH/spawn_grid2.f90 @@ -11,6 +11,7 @@ INTERFACE ! SUBROUTINE SPAWN_GRID2( KXOR, KYOR, KXEND, KYEND, KDXRATIO, KDYRATIO, & PLONOR, PLATOR, PXHAT, PYHAT, PZHAT, PXHATM, PYHATM, PZHATM, & + PHAT_BOUND, PHATM_BOUND, & PZTOP, OSLEVE, PLEN1, PLEN2, & PZS, PZSMT, PZS_LS, PZSMT_LS, & TPDTMOD, TPDTCUR ) @@ -29,6 +30,8 @@ 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(:), INTENT(INOUT) :: PHAT_BOUND ! Boundaries of global domain in the conformal or cartesian plane +REAL, DIMENSION(:), INTENT(INOUT) :: PHATM_BOUND ! Boundaries of global domain in the conformal or cartesian plane 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 @@ -51,6 +54,7 @@ END MODULE MODI_SPAWN_GRID2 ! ###################################################################################### SUBROUTINE SPAWN_GRID2( KXOR, KYOR, KXEND, KYEND, KDXRATIO, KDYRATIO, & PLONOR, PLATOR, PXHAT, PYHAT, PZHAT, PXHATM, PYHATM, PZHATM, & + PHAT_BOUND, PHATM_BOUND, & PZTOP, OSLEVE, PLEN1, PLEN2, & PZS, PZSMT, PZS_LS, PZSMT_LS, & TPDTMOD, TPDTCUR ) @@ -167,7 +171,7 @@ USE MODD_BIKHARDT_n USE MODD_VAR_ll use mode_bikhardt USE MODE_ll -USE MODE_SET_GRID, only: INTERP_HORGRID_TO_MASSPOINTS +USE MODE_SET_GRID, only: INTERP_HORGRID_TO_MASSPOINTS, STORE_GRID_BOUNDS USE MODE_TIME USE MODE_GRIDPROJ ! @@ -192,6 +196,8 @@ 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(:), INTENT(INOUT) :: PHAT_BOUND ! Boundaries of global domain in the conformal or cartesian plane +REAL, DIMENSION(:), INTENT(INOUT) :: PHATM_BOUND ! Boundaries of global domain in the conformal or cartesian plane 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 @@ -457,6 +463,10 @@ PLEN2 = XLEN21 ! Interpolations of positions to mass points CALL INTERP_HORGRID_TO_MASSPOINTS( PXHAT, PYHAT, PXHATM, PYHATM ) + ! Collect global domain boundaries + CALL STORE_GRID_BOUNDS( PXHAT, PYHAT, PZHAT, PHAT_BOUND ) + CALL STORE_GRID_BOUNDS( PXHATM, PYHATM, PZHATM, 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 8837733b6..a824c074b 100644 --- a/src/MNH/spawn_model2.f90 +++ b/src/MNH/spawn_model2.f90 @@ -736,6 +736,7 @@ END IF ! ALLOCATE(XXHAT(IIU),XYHAT(IJU),XZHAT(IKU)) ALLOCATE(XXHATM(IIU),XYHATM(IJU),XZHATM(IKU)) +ALLOCATE( XHAT_BOUND(NHAT_BOUND_SIZE), XHATM_BOUND(NHAT_BOUND_SIZE) ) ALLOCATE(XZTOP) ALLOCATE(XMAP(IIU,IJU)) ALLOCATE(XLAT(IIU,IJU)) @@ -1061,6 +1062,7 @@ ENDIF XZS=0. CALL SPAWN_GRID2( NXOR, NYOR, NXEND, NYEND, NDXRATIO, NDYRATIO, & XLONORI, XLATORI, XXHAT, XYHAT, XZHAT, XXHATM, XYHATM, XZHATM, & + XHAT_BOUND, XHATM_BOUND, & XZTOP, LSLEVE, XLEN1, XLEN2, & XZS, XZSMT, ZZS_LS, ZZSMT_LS, TDTMOD, TDTCUR ) ! -- GitLab From f40612d33e499aaa9244f1136cd0df0d343fac0c Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Wed, 14 Sep 2022 09:27:53 +0200 Subject: [PATCH 097/157] Philippe 14/09/2022: fix: set correct global physical boundaries at non-mass points --- src/MNH/prep_ideal_case.f90 | 3 +- src/MNH/read_hgridn.f90 | 3 +- src/MNH/read_ver_grid.f90 | 3 +- src/MNH/set_grid.f90 | 100 +++++++++++++++++++++++++----------- src/MNH/spawn_grid2.f90 | 3 +- 5 files changed, 75 insertions(+), 37 deletions(-) diff --git a/src/MNH/prep_ideal_case.f90 b/src/MNH/prep_ideal_case.f90 index 8d4cdc385..bf758751f 100644 --- a/src/MNH/prep_ideal_case.f90 +++ b/src/MNH/prep_ideal_case.f90 @@ -1287,8 +1287,7 @@ ELSE CALL INTERP_HORGRID_TO_MASSPOINTS( XXHAT, XYHAT, XXHATM, XYHATM ) ! Collect global domain boundaries - CALL STORE_HORGRID_BOUNDS( XXHAT, XYHAT, XHAT_BOUND ) - CALL STORE_HORGRID_BOUNDS( XXHATM, XYHATM, XHATM_BOUND ) + CALL STORE_HORGRID_BOUNDS( XXHAT, XYHAT, XXHATM, XYHATM, XHAT_BOUND, XHATM_BOUND ) END IF ! diff --git a/src/MNH/read_hgridn.f90 b/src/MNH/read_hgridn.f90 index 7bdf08ec4..4afe7ed32 100644 --- a/src/MNH/read_hgridn.f90 +++ b/src/MNH/read_hgridn.f90 @@ -261,8 +261,7 @@ IF ( .NOT. ASSOCIATED(XHATM_BOUND) ) ALLOCATE( XHATM_BOUND(NHAT_BOUND_SIZE) ) CALL INTERP_HORGRID_TO_MASSPOINTS( XXHAT, XYHAT, XXHATM, XYHATM ) ! Collect global domain boundaries -CALL STORE_HORGRID_BOUNDS( XXHAT, XYHAT, XHAT_BOUND ) -CALL STORE_HORGRID_BOUNDS( XXHATM, XYHATM, XHATM_BOUND ) +CALL STORE_HORGRID_BOUNDS( XXHAT, XYHAT, XXHATM, XYHATM, XHAT_BOUND, XHATM_BOUND ) !JUAN REALZ IF ( CPROGRAM .EQ. "REAL " ) THEN diff --git a/src/MNH/read_ver_grid.f90 b/src/MNH/read_ver_grid.f90 index 7fd47bf64..a00d7a30a 100644 --- a/src/MNH/read_ver_grid.f90 +++ b/src/MNH/read_ver_grid.f90 @@ -332,8 +332,7 @@ XZTOP = XZHAT(IKU) CALL INTERP_VERGRID_TO_MASSPOINTS( XZHAT, XZHATM ) ! Collect global domain boundaries -CALL STORE_VERGRID_BOUNDS( XZHAT, XHAT_BOUND ) -CALL STORE_VERGRID_BOUNDS( XZHATM, XHATM_BOUND ) +CALL STORE_VERGRID_BOUNDS( XZHAT, XZHATM, XHAT_BOUND, XHATM_BOUND ) !------------------------------------------------------------------------------- ! diff --git a/src/MNH/set_grid.f90 b/src/MNH/set_grid.f90 index 25d645e5c..c6acdf6b9 100644 --- a/src/MNH/set_grid.f90 +++ b/src/MNH/set_grid.f90 @@ -352,8 +352,7 @@ CALL INTERP_HORGRID_TO_MASSPOINTS( PXHAT, PYHAT, PXHATM, PYHATM ) CALL INTERP_VERGRID_TO_MASSPOINTS( PZHAT, PZHATM ) ! Collect global domain boundaries -CALL STORE_GRID_BOUNDS( PXHAT, PYHAT, PZHAT, PHAT_BOUND ) -CALL STORE_GRID_BOUNDS( PXHATM, PYHATM, PZHATM, PHATM_BOUND ) +CALL STORE_GRID_BOUNDS( PXHAT, PYHAT, PZHAT, PXHATM, PYHATM, PZHATM, PHAT_BOUND, PHATM_BOUND ) IF (LCARTESIAN) THEN CALL SM_GRIDCART(PXHAT,PYHAT,PZHAT,PZS,OSLEVE,PLEN1,PLEN2,PZSMT,PDXHAT,PDYHAT,PZZ,PJ) @@ -517,7 +516,7 @@ END SUBROUTINE INTERP_VERGRID_TO_MASSPOINTS !----------------------------------------------------------------- -SUBROUTINE STORE_GRID_1DIR_BOUNDS( HDIR, PHAT, PHAT_BOUND ) +SUBROUTINE STORE_GRID_1DIR_BOUNDS( HDIR, PHAT, PHATM, PHAT_BOUND, PHATM_BOUND ) USE MODD_GRID_n USE MODD_PARAMETERS, ONLY: JPHEXT, JPVEXT @@ -528,94 +527,137 @@ SUBROUTINE STORE_GRID_1DIR_BOUNDS( HDIR, PHAT, PHAT_BOUND ) 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(NHAT_BOUND_SIZE), INTENT(INOUT) :: PHAT_BOUND ! Boundaries of global domain in the conformal or cartesian plane + 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(NHAT_BOUND_SIZE), INTENT(INOUT) :: PHAT_BOUND ! Boundaries of global domain in the conformal or cartesian plane + REAL, DIMENSION(NHAT_BOUND_SIZE), INTENT(INOUT) :: PHATM_BOUND ! id at mass points INTEGER :: IERR - LOGICAL :: GALLOC + LOGICAL :: GALLOC, GALLOCM REAL, DIMENSION(:), POINTER :: ZHAT_GLOB + REAL, DIMENSION(:), POINTER :: ZHATM_GLOB - ZHAT_GLOB => NULL() + ZHAT_GLOB => NULL() + ZHATM_GLOB => NULL() SELECT CASE (HDIR) CASE ( 'X' ) - CALL ALLOCBUFFER_ll( ZHAT_GLOB, PHAT, 'XX', GALLOC ) - CALL GATHERALL_FIELD_ll( 'XX', PHAT, ZHAT_GLOB, IERR ) + CALL ALLOCBUFFER_ll( ZHAT_GLOB, PHAT, 'XX', GALLOC ) + CALL ALLOCBUFFER_ll( ZHATM_GLOB, PHATM, 'XX', GALLOCM ) + CALL GATHERALL_FIELD_ll( 'XX', PHAT, ZHAT_GLOB, IERR ) + CALL GATHERALL_FIELD_ll( 'XX', PHATM, ZHATM_GLOB, IERR ) + + ! Global boundaries on u points PHAT_BOUND(NEXTE_XMIN) = ZHAT_GLOB( 1 ) PHAT_BOUND(NEXTE_XMAX) = ZHAT_GLOB( UBOUND( ZHAT_GLOB, 1 ) ) PHAT_BOUND(NPHYS_XMIN) = ZHAT_GLOB( JPHEXT + 1 ) - PHAT_BOUND(NPHYS_XMAX) = ZHAT_GLOB( UBOUND( ZHAT_GLOB, 1 ) - JPHEXT ) + PHAT_BOUND(NPHYS_XMAX) = ZHAT_GLOB( UBOUND( ZHAT_GLOB, 1 ) ) + + ! Global boundaries on m points + PHATM_BOUND(NEXTE_XMIN) = ZHATM_GLOB( 1 ) + PHATM_BOUND(NEXTE_XMAX) = ZHATM_GLOB( UBOUND( ZHATM_GLOB, 1 ) ) + PHATM_BOUND(NPHYS_XMIN) = ZHATM_GLOB( JPHEXT + 1 ) + PHATM_BOUND(NPHYS_XMAX) = ZHATM_GLOB( UBOUND( ZHATM_GLOB, 1 ) - JPHEXT ) CASE ( 'Y' ) - CALL ALLOCBUFFER_ll( ZHAT_GLOB, PHAT, 'YY', GALLOC ) - CALL GATHERALL_FIELD_ll( 'YY', PHAT, ZHAT_GLOB, IERR ) + CALL ALLOCBUFFER_ll( ZHAT_GLOB, PHAT, 'YY', GALLOC ) + CALL ALLOCBUFFER_ll( ZHATM_GLOB, PHATM, 'YY', GALLOCM ) + CALL GATHERALL_FIELD_ll( 'YY', PHAT, ZHAT_GLOB, IERR ) + CALL GATHERALL_FIELD_ll( 'YY', PHATM, ZHATM_GLOB, IERR ) + + ! Global boundaries on v points PHAT_BOUND(NEXTE_YMIN) = ZHAT_GLOB( 1 ) PHAT_BOUND(NEXTE_YMAX) = ZHAT_GLOB( UBOUND( ZHAT_GLOB, 1 ) ) PHAT_BOUND(NPHYS_YMIN) = ZHAT_GLOB( JPHEXT + 1 ) - PHAT_BOUND(NPHYS_YMAX) = ZHAT_GLOB( UBOUND( ZHAT_GLOB, 1 ) - JPHEXT ) + PHAT_BOUND(NPHYS_YMAX) = ZHAT_GLOB( UBOUND( ZHAT_GLOB, 1 ) ) + + ! Global boundaries on m points + PHATM_BOUND(NEXTE_YMIN) = ZHATM_GLOB( 1 ) + PHATM_BOUND(NEXTE_YMAX) = ZHATM_GLOB( UBOUND( ZHATM_GLOB, 1 ) ) + PHATM_BOUND(NPHYS_YMIN) = ZHATM_GLOB( JPHEXT + 1 ) + PHATM_BOUND(NPHYS_YMAX) = ZHATM_GLOB( UBOUND( ZHATM_GLOB, 1 ) - JPHEXT ) CASE ( 'Z' ) - ZHAT_GLOB => PHAT + ZHAT_GLOB => PHAT + ZHATM_GLOB => PHATM + + ! Global boundaries on w points PHAT_BOUND(NEXTE_ZMIN) = ZHAT_GLOB( 1 ) PHAT_BOUND(NEXTE_ZMAX) = ZHAT_GLOB( UBOUND( ZHAT_GLOB, 1 ) ) PHAT_BOUND(NPHYS_ZMIN) = ZHAT_GLOB( JPVEXT + 1 ) - PHAT_BOUND(NPHYS_ZMAX) = ZHAT_GLOB( UBOUND( ZHAT_GLOB, 1 ) - JPVEXT ) + PHAT_BOUND(NPHYS_ZMAX) = ZHAT_GLOB( UBOUND( ZHAT_GLOB, 1 ) ) + + ! Global boundaries on m points + PHATM_BOUND(NEXTE_ZMIN) = ZHATM_GLOB( 1 ) + PHATM_BOUND(NEXTE_ZMAX) = ZHATM_GLOB( UBOUND( ZHATM_GLOB, 1 ) ) + PHATM_BOUND(NPHYS_ZMIN) = ZHATM_GLOB( JPVEXT + 1 ) + PHATM_BOUND(NPHYS_ZMAX) = ZHATM_GLOB( UBOUND( ZHATM_GLOB, 1 ) - JPVEXT ) CASE DEFAULT CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'STORE_GRID_1DIR_BOUNDS', 'invalid direction (valid: X, Y or Z)' ) END SELECT - IF ( GALLOC ) DEALLOCATE( ZHAT_GLOB ) + IF ( GALLOC ) DEALLOCATE( ZHAT_GLOB ) + IF ( GALLOCM ) DEALLOCATE( ZHATM_GLOB ) END SUBROUTINE STORE_GRID_1DIR_BOUNDS !----------------------------------------------------------------- !----------------------------------------------------------------- -SUBROUTINE STORE_GRID_BOUNDS( PXHAT, PYHAT, PZHAT, PHAT_BOUND ) +SUBROUTINE STORE_GRID_BOUNDS( PXHAT, PYHAT, PZHAT, PXHATM, PYHATM, PZHATM, 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(INOUT) :: PHAT_BOUND ! Boundaries of global domain in the conformal or cartesian plane + REAL, DIMENSION(:), INTENT(IN) :: PXHATM ! id at mass points + REAL, DIMENSION(:), INTENT(IN) :: PYHATM ! id at mass points + REAL, DIMENSION(:), INTENT(IN) :: PZHATM ! id at mass points + REAL, DIMENSION(:), INTENT(INOUT) :: PHAT_BOUND ! Boundaries of global domain in the conformal or cartesian plane + REAL, DIMENSION(:), INTENT(INOUT) :: PHATM_BOUND ! id at mass points - CALL STORE_GRID_1DIR_BOUNDS( 'X', PXHAT, PHAT_BOUND ) - CALL STORE_GRID_1DIR_BOUNDS( 'Y', PYHAT, PHAT_BOUND ) - CALL STORE_GRID_1DIR_BOUNDS( 'Z', PZHAT, PHAT_BOUND ) + CALL STORE_GRID_1DIR_BOUNDS( 'X', PXHAT, PXHATM, PHAT_BOUND, PHATM_BOUND ) + CALL STORE_GRID_1DIR_BOUNDS( 'Y', PYHAT, PYHATM, PHAT_BOUND, PHATM_BOUND ) + CALL STORE_GRID_1DIR_BOUNDS( 'Z', PZHAT, PZHATM, PHAT_BOUND, PHATM_BOUND ) END SUBROUTINE STORE_GRID_BOUNDS !----------------------------------------------------------------- !----------------------------------------------------------------- -SUBROUTINE STORE_HORGRID_BOUNDS( PXHAT, PYHAT, PHAT_BOUND ) +SUBROUTINE STORE_HORGRID_BOUNDS( PXHAT, PYHAT, PXHATM, PYHATM, 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(INOUT) :: PHAT_BOUND ! Boundaries of global domain in the conformal or cartesian plane + REAL, DIMENSION(:), INTENT(IN) :: PXHATM ! id at mass points + REAL, DIMENSION(:), INTENT(IN) :: PYHATM ! id at mass points + REAL, DIMENSION(:), INTENT(INOUT) :: PHAT_BOUND ! Boundaries of global domain in the conformal or cartesian plane + REAL, DIMENSION(:), INTENT(INOUT) :: PHATM_BOUND ! id at mass points - CALL STORE_GRID_1DIR_BOUNDS( 'X', PXHAT, PHAT_BOUND ) - CALL STORE_GRID_1DIR_BOUNDS( 'Y', PYHAT, PHAT_BOUND ) + CALL STORE_GRID_1DIR_BOUNDS( 'X', PXHAT, PXHATM, PHAT_BOUND, PHATM_BOUND ) + CALL STORE_GRID_1DIR_BOUNDS( 'Y', PYHAT, PYHATM, PHAT_BOUND, PHATM_BOUND ) END SUBROUTINE STORE_HORGRID_BOUNDS !----------------------------------------------------------------- !----------------------------------------------------------------- -SUBROUTINE STORE_VERGRID_BOUNDS( PZHAT, PHAT_BOUND ) +SUBROUTINE STORE_VERGRID_BOUNDS( PZHAT, PZHATM, PHAT_BOUND, PHATM_BOUND ) IMPLICIT NONE REAL, DIMENSION(:), INTENT(IN) :: PZHAT ! Position y in the conformal or cartesian plane - REAL, DIMENSION(:), INTENT(INOUT) :: PHAT_BOUND ! Boundaries of global domain in the conformal or cartesian plane + REAL, DIMENSION(:), INTENT(IN) :: PZHATM ! id at mass points + REAL, DIMENSION(:), INTENT(INOUT) :: PHAT_BOUND ! Boundaries of global domain in the conformal or cartesian plane + REAL, DIMENSION(:), INTENT(INOUT) :: PHATM_BOUND ! id at mass points - CALL STORE_GRID_1DIR_BOUNDS( 'Z', PZHAT, PHAT_BOUND ) + CALL STORE_GRID_1DIR_BOUNDS( 'Z', PZHAT, PZHATM, PHAT_BOUND, PHATM_BOUND ) END SUBROUTINE STORE_VERGRID_BOUNDS !----------------------------------------------------------------- diff --git a/src/MNH/spawn_grid2.f90 b/src/MNH/spawn_grid2.f90 index 564efb716..2bbc35dd8 100644 --- a/src/MNH/spawn_grid2.f90 +++ b/src/MNH/spawn_grid2.f90 @@ -464,8 +464,7 @@ PLEN2 = XLEN21 CALL INTERP_HORGRID_TO_MASSPOINTS( PXHAT, PYHAT, PXHATM, PYHATM ) ! Collect global domain boundaries - CALL STORE_GRID_BOUNDS( PXHAT, PYHAT, PZHAT, PHAT_BOUND ) - CALL STORE_GRID_BOUNDS( PXHATM, PYHATM, PZHATM, PHATM_BOUND ) + CALL STORE_GRID_BOUNDS( PXHAT, PYHAT, PZHAT, PXHATM, PYHATM, PZHATM, PHAT_BOUND, PHATM_BOUND ) !!$======= !!$ IXSIZE1=SIZE(XXHAT1) -- GitLab From b160942ec1195a08944e4503fb08b47d33f51edf Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Wed, 14 Sep 2022 11:17:33 +0200 Subject: [PATCH 098/157] Philippe 14/09/2022: use XHATM_BOUND --- src/MNH/ini_posprofilern.f90 | 45 ++-------------------------- src/MNH/ini_surfstationn.f90 | 45 ++-------------------------- src/MNH/statprof_reader.f90 | 19 +++--------- src/MNH/statprof_tools.f90 | 35 ++++++++-------------- src/MNH/write_lfifm1_for_diag.f90 | 17 ++--------- src/MNH/write_lfifmn_fordiachron.f90 | 16 ++-------- src/MNH/write_lfin.f90 | 14 +-------- 7 files changed, 27 insertions(+), 164 deletions(-) diff --git a/src/MNH/ini_posprofilern.f90 b/src/MNH/ini_posprofilern.f90 index 966c343cf..674dab0d8 100644 --- a/src/MNH/ini_posprofilern.f90 +++ b/src/MNH/ini_posprofilern.f90 @@ -62,13 +62,9 @@ USE MODD_ALLPROFILER_n USE MODD_CONF, ONLY: LCARTESIAN USE MODD_DYN, ONLY: XSEGLEN USE MODD_DYN_n, ONLY: DYN_MODEL, XTSTEP -USE MODD_GRID_n, ONLY: XXHAT, XXHATM, XYHAT, XYHATM -USE MODD_PARAMETERS, ONLY: JPHEXT, JPVEXT USE MODD_PROFILER_n, ONLY: LPROFILER, NUMBPROFILER_LOC, TPROFILERS, TPROFILERS_TIME USE MODD_TYPE_STATPROF, ONLY: TPROFILERDATA -USE MODE_ALLOCBUFFER_ll, ONLY: ALLOCBUFFER_ll -USE MODE_GATHER_ll, ONLY: GATHERALL_FIELD_ll USE MODE_MSG USE MODE_STATPROF_READER, ONLY: STATPROF_CSV_READ USE MODE_STATPROF_TOOLS, ONLY: PROFILER_ADD, PROFILER_ALLOCATE, STATPROF_INI_INTERP, STATPROF_POSITION @@ -84,19 +80,11 @@ IMPLICIT NONE ! ! 0.2 declaration of local variables ! -INTEGER :: IERR -INTEGER :: IIU -INTEGER :: IJU INTEGER :: INUMBPROF ! Total number of profilers (inside physical domain of model) INTEGER :: ISTORE ! number of storage instants INTEGER :: JI -LOGICAL :: GALLOCX, GALLOCY LOGICAL :: GINSIDE ! True if profiler is inside physical domain of model LOGICAL :: GPRESENT ! True if profiler is present on the current process -REAL :: ZXHATM_PHYS_MIN, ZYHATM_PHYS_MIN ! Minimum X coordinate of mass points in the physical domain -REAL :: ZXHATM_PHYS_MAX, ZYHATM_PHYS_MAX ! Minimum X coordinate of mass points in the physical domain -REAL, DIMENSION(:), POINTER :: ZXHAT_GLOB -REAL, DIMENSION(:), POINTER :: ZYHAT_GLOB TYPE(TPROFILERDATA) :: TZPROFILER ! !---------------------------------------------------------------------------- @@ -112,24 +100,6 @@ ISTORE = NINT ( ( XSEGLEN - DYN_MODEL(1)%XTSTEP ) / TPROFILERS_TIME%XTSTEP ) + 1 allocate( tprofilers_time%tpdates(istore) ) ! -! Prepare positioning data -! -IF ( CFILE_PROF /= "NO_INPUT_CSV" .OR. NNUMB_PROF > 0 ) THEN - IIU = SIZE( XXHAT ) - IJU = SIZE( XYHAT ) - - ! Get global XHAT and YHAT (needed by PROFILER_POSITION) - CALL ALLOCBUFFER_ll( ZXHAT_GLOB, XXHAT, 'XX', GALLOCX ) - CALL ALLOCBUFFER_ll( ZYHAT_GLOB, XYHAT, 'YY', GALLOCY ) - CALL GATHERALL_FIELD_ll( 'XX', XXHAT, ZXHAT_GLOB, IERR ) - CALL GATHERALL_FIELD_ll( 'YY', XYHAT, ZYHAT_GLOB, IERR ) - - ZXHATM_PHYS_MIN = 0.5 * ( ZXHAT_GLOB(1+JPHEXT) + ZXHAT_GLOB(2+JPHEXT) ) - ZXHATM_PHYS_MAX = 0.5 * ( ZXHAT_GLOB(UBOUND(ZXHAT_GLOB,1)-JPHEXT) + ZXHAT_GLOB(UBOUND(ZXHAT_GLOB,1)-JPHEXT+1) ) - ZYHATM_PHYS_MIN = 0.5 * ( ZYHAT_GLOB(1+JPHEXT) + ZYHAT_GLOB(2+JPHEXT) ) - ZYHATM_PHYS_MAX = 0.5 * ( ZYHAT_GLOB(UBOUND(ZYHAT_GLOB,1)-JPHEXT) + ZYHAT_GLOB(UBOUND(ZYHAT_GLOB,1)-JPHEXT+1) ) -END IF -! ! Profilers initialization ! NUMBPROFILER_LOC = 0 @@ -150,9 +120,7 @@ IF (CFILE_PROF=="NO_INPUT_CSV") THEN TZPROFILER%XZ = XZ_PROF(JI) TZPROFILER%CNAME = CNAME_PROF(JI) - CALL STATPROF_POSITION( TZPROFILER, ZXHAT_GLOB, ZYHAT_GLOB, XXHATM, XYHATM, & - ZXHATM_PHYS_MIN, ZXHATM_PHYS_MAX, ZYHATM_PHYS_MIN, ZYHATM_PHYS_MAX, & - GINSIDE, GPRESENT ) + CALL STATPROF_POSITION( TZPROFILER, GINSIDE, GPRESENT ) IF ( GINSIDE ) THEN INUMBPROF = INUMBPROF + 1 @@ -164,9 +132,7 @@ IF (CFILE_PROF=="NO_INPUT_CSV") THEN END IF ELSE !Treat CSV datafile - CALL STATPROF_CSV_READ( TZPROFILER, CFILE_PROF, ZXHAT_GLOB, ZYHAT_GLOB, XXHATM, XYHATM, & - ZXHATM_PHYS_MIN, ZXHATM_PHYS_MAX,ZYHATM_PHYS_MIN, ZYHATM_PHYS_MAX, & - INUMBPROF ) + CALL STATPROF_CSV_READ( TZPROFILER, CFILE_PROF, INUMBPROF ) END IF LPROFILER = ( INUMBPROF > 0 ) @@ -174,13 +140,6 @@ LPROFILER = ( INUMBPROF > 0 ) DO JI = 1, NUMBPROFILER_LOC CALL PROFILER_ALLOCATE( TPROFILERS(JI), ISTORE ) END DO -! -! Clean positioning data -! -IF ( CFILE_PROF /= "NO_INPUT_CSV" .OR. NNUMB_PROF > 0 ) THEN - IF ( GALLOCX ) DEALLOCATE( ZXHAT_GLOB ) - IF ( GALLOCY ) DEALLOCATE( ZYHAT_GLOB ) -END IF !---------------------------------------------------------------------------- ! END SUBROUTINE INI_POSPROFILER_n diff --git a/src/MNH/ini_surfstationn.f90 b/src/MNH/ini_surfstationn.f90 index 94332d77c..c312cf819 100644 --- a/src/MNH/ini_surfstationn.f90 +++ b/src/MNH/ini_surfstationn.f90 @@ -63,13 +63,9 @@ USE MODD_ALLSTATION_n USE MODD_CONF, ONLY: LCARTESIAN USE MODD_DYN, ONLY: XSEGLEN USE MODD_DYN_n, ONLY: DYN_MODEL, XTSTEP -USE MODD_GRID_n, ONLY: XXHAT, XXHATM, XYHAT, XYHATM -USE MODD_PARAMETERS, ONLY: JPHEXT, JPVEXT USE MODD_STATION_n USE MODD_TYPE_STATPROF ! -USE MODE_ALLOCBUFFER_ll, ONLY: ALLOCBUFFER_ll -USE MODE_GATHER_ll, ONLY: GATHERALL_FIELD_ll USE MODE_MSG USE MODE_STATPROF_READER, ONLY: STATPROF_CSV_READ USE MODE_STATPROF_TOOLS, ONLY: STATION_ADD, STATION_ALLOCATE, STATPROF_INI_INTERP, STATPROF_POSITION @@ -85,19 +81,11 @@ IMPLICIT NONE ! ! 0.2 declaration of local variables ! -INTEGER :: IERR -INTEGER :: IIU -INTEGER :: IJU INTEGER :: INUMBSTAT ! Total number of stations (inside physical domain of model) INTEGER :: ISTORE ! number of storage instants INTEGER :: JI -LOGICAL :: GALLOCX, GALLOCY LOGICAL :: GINSIDE ! True if station is inside physical domain of model LOGICAL :: GPRESENT ! True if station is present on the current process -REAL :: ZXHATM_PHYS_MIN, ZYHATM_PHYS_MIN ! Minimum X coordinate of mass points in the physical domain -REAL :: ZXHATM_PHYS_MAX, ZYHATM_PHYS_MAX ! Minimum X coordinate of mass points in the physical domain -REAL, DIMENSION(:), POINTER :: ZXHAT_GLOB -REAL, DIMENSION(:), POINTER :: ZYHAT_GLOB TYPE(TSTATIONDATA) :: TZSTATION ! !---------------------------------------------------------------------------- @@ -113,24 +101,6 @@ ISTORE = NINT ( ( XSEGLEN - DYN_MODEL(1)%XTSTEP ) / TSTATIONS_TIME%XTSTEP ) + 1 allocate( tstations_time%tpdates(istore) ) ! -! Prepare positioning data -! -IF ( CFILE_STAT /= "NO_INPUT_CSV" .OR. NNUMB_STAT > 0 ) THEN - IIU = SIZE( XXHAT ) - IJU = SIZE( XYHAT ) - - ! Get global XHAT and YHAT (needed by STATPROF_POSITION) - CALL ALLOCBUFFER_ll( ZXHAT_GLOB, XXHAT, 'XX', GALLOCX ) - CALL ALLOCBUFFER_ll( ZYHAT_GLOB, XYHAT, 'YY', GALLOCY ) - CALL GATHERALL_FIELD_ll( 'XX', XXHAT, ZXHAT_GLOB, IERR ) - CALL GATHERALL_FIELD_ll( 'YY', XYHAT, ZYHAT_GLOB, IERR ) - - ZXHATM_PHYS_MIN = 0.5 * ( ZXHAT_GLOB(1+JPHEXT) + ZXHAT_GLOB(2+JPHEXT) ) - ZXHATM_PHYS_MAX = 0.5 * ( ZXHAT_GLOB(UBOUND(ZXHAT_GLOB,1)-JPHEXT) + ZXHAT_GLOB(UBOUND(ZXHAT_GLOB,1)-JPHEXT+1) ) - ZYHATM_PHYS_MIN = 0.5 * ( ZYHAT_GLOB(1+JPHEXT) + ZYHAT_GLOB(2+JPHEXT) ) - ZYHATM_PHYS_MAX = 0.5 * ( ZYHAT_GLOB(UBOUND(ZYHAT_GLOB,1)-JPHEXT) + ZYHAT_GLOB(UBOUND(ZYHAT_GLOB,1)-JPHEXT+1) ) -END IF -! ! Stations initialization ! NUMBSTAT_LOC = 0 @@ -151,9 +121,7 @@ IF (CFILE_STAT=="NO_INPUT_CSV") THEN TZSTATION%XZ = XZ_STAT(JI) TZSTATION%CNAME = CNAME_STAT(JI) - CALL STATPROF_POSITION( TZSTATION, ZXHAT_GLOB, ZYHAT_GLOB, XXHATM, XYHATM, & - ZXHATM_PHYS_MIN, ZXHATM_PHYS_MAX, ZYHATM_PHYS_MIN, ZYHATM_PHYS_MAX, & - GINSIDE, GPRESENT ) + CALL STATPROF_POSITION( TZSTATION, GINSIDE, GPRESENT ) IF ( GINSIDE ) THEN INUMBSTAT = INUMBSTAT + 1 @@ -165,9 +133,7 @@ IF (CFILE_STAT=="NO_INPUT_CSV") THEN END IF ELSE !Treat CSV datafile - CALL STATPROF_CSV_READ( TZSTATION, CFILE_STAT, ZXHAT_GLOB, ZYHAT_GLOB, XXHATM, XYHATM, & - ZXHATM_PHYS_MIN, ZXHATM_PHYS_MAX,ZYHATM_PHYS_MIN, ZYHATM_PHYS_MAX, & - INUMBSTAT ) + CALL STATPROF_CSV_READ( TZSTATION, CFILE_STAT, INUMBSTAT ) END IF LSTATION = ( INUMBSTAT > 0 ) @@ -175,13 +141,6 @@ LSTATION = ( INUMBSTAT > 0 ) DO JI = 1, NUMBSTAT_LOC CALL STATION_ALLOCATE( TSTATIONS(JI), ISTORE ) END DO -! -! Clean positioning data -! -IF ( CFILE_STAT /= "NO_INPUT_CSV" .OR. NNUMB_STAT > 0 ) THEN - IF ( GALLOCX ) DEALLOCATE( ZXHAT_GLOB ) - IF ( GALLOCY ) DEALLOCATE( ZYHAT_GLOB ) -END IF !---------------------------------------------------------------------------- diff --git a/src/MNH/statprof_reader.f90 b/src/MNH/statprof_reader.f90 index 92eb1917f..be9c3d2e2 100644 --- a/src/MNH/statprof_reader.f90 +++ b/src/MNH/statprof_reader.f90 @@ -34,11 +34,9 @@ CONTAINS ! P. Wautelet 04/2022: restructure stations/profilers for better performance, reduce memory usage and correct some problems/bugs !--------------------------------------------------------------- ! -!################################################################################################# -SUBROUTINE STATPROF_CSV_READ( TPSTATPROF, HFILE, PXHAT_GLOB, PYHAT_GLOB, PXHATM, PYHATM, & - PXHATM_PHYS_MIN, PXHATM_PHYS_MAX,PYHATM_PHYS_MIN, PYHATM_PHYS_MAX, & - KNUMBSTATPROF ) -!################################################################################################# +!############################################################### +SUBROUTINE STATPROF_CSV_READ( TPSTATPROF, HFILE, KNUMBSTATPROF ) +!############################################################### USE MODD_CONF, ONLY: LCARTESIAN USE MODD_TYPE_STATPROF, ONLY: TPROFILERDATA, TSTATIONDATA, TSTATPROFDATA @@ -48,18 +46,11 @@ USE MODE_STATPROF_TOOLS, ONLY: PROFILER_ADD, STATION_ADD, STATPROF_INI_INTERP, S CLASS(TSTATPROFDATA), INTENT(IN) :: TPSTATPROF ! Used only to identify datatype CHARACTER(LEN=*), INTENT(IN) :: HFILE ! file to read -REAL, DIMENSION(:), INTENT(IN) :: PXHAT_GLOB -REAL, DIMENSION(:), INTENT(IN) :: PYHAT_GLOB -REAL, DIMENSION(:), INTENT(IN) :: PXHATM ! mass point coordinates -REAL, DIMENSION(:), INTENT(IN) :: PYHATM ! mass point coordinates -REAL, INTENT(IN) :: PXHATM_PHYS_MIN, PYHATM_PHYS_MIN ! Minimum X coordinate of mass points in the physical domain -REAL, INTENT(IN) :: PXHATM_PHYS_MAX, PYHATM_PHYS_MAX ! Minimum X coordinate of mass points in the physical domain 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 -INTEGER :: JI 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 @@ -100,9 +91,7 @@ DO END IF IF ( .NOT. LCARTESIAN ) CALL STATPROF_INI_INTERP( TZSTATPROF ) - CALL STATPROF_POSITION( TZSTATPROF, PXHAT_GLOB, PYHAT_GLOB, PXHATM, PYHATM, & - PXHATM_PHYS_MIN, PXHATM_PHYS_MAX, PYHATM_PHYS_MIN, PYHATM_PHYS_MAX, & - GINSIDE, GPRESENT ) + CALL STATPROF_POSITION( TZSTATPROF, GINSIDE, GPRESENT ) IF ( GINSIDE ) THEN KNUMBSTATPROF = KNUMBSTATPROF + 1 diff --git a/src/MNH/statprof_tools.f90 b/src/MNH/statprof_tools.f90 index e48358ed2..4a0ac4239 100644 --- a/src/MNH/statprof_tools.f90 +++ b/src/MNH/statprof_tools.f90 @@ -271,16 +271,15 @@ SUBROUTINE STATPROF_INI_INTERP( TPSTATPROF ) END SUBROUTINE STATPROF_INI_INTERP -! ############################################################################################### -SUBROUTINE STATPROF_POSITION( TPSTATPROF, PXHAT_GLOB, PYHAT_GLOB, PXHATM, PYHATM, & - PXHATM_PHYS_MIN, PXHATM_PHYS_MAX,PYHATM_PHYS_MIN, PYHATM_PHYS_MAX, & - OINSIDE, OPRESENT ) -! ############################################################################################### +! ########################################################### +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: XXHAT, XYHAT, XZZ + 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 @@ -290,14 +289,6 @@ SUBROUTINE STATPROF_POSITION( TPSTATPROF, PXHAT_GLOB, PYHAT_GLOB, PXHATM, PYHATM IMPLICIT NONE CLASS(TSTATPROFDATA), INTENT(INOUT) :: TPSTATPROF - REAL, DIMENSION(:), INTENT(IN) :: PXHAT_GLOB - REAL, DIMENSION(:), INTENT(IN) :: PYHAT_GLOB - REAL, DIMENSION(:), INTENT(IN) :: PXHATM ! mass point coordinates - REAL, DIMENSION(:), INTENT(IN) :: PYHATM ! mass point coordinates - REAL, INTENT(IN) :: PXHATM_PHYS_MIN ! Minimum X coordinate of mass points in the physical domain - REAL, INTENT(IN) :: PYHATM_PHYS_MIN ! Minimum Y coordinate of mass points in the physical domain - REAL, INTENT(IN) :: PXHATM_PHYS_MAX ! Maximum X coordinate of mass points in the physical domain - REAL, INTENT(IN) :: PYHATM_PHYS_MAX ! Minimum Y coordinate of mass points in the physical domain 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 @@ -314,8 +305,8 @@ SUBROUTINE STATPROF_POSITION( TPSTATPROF, PXHAT_GLOB, PYHAT_GLOB, PXHATM, PYHATM CALL GET_INDICE_ll( IIB, IJB, IIE, IJE ) - IF ( TPSTATPROF%XX >= PXHAT_GLOB(JPHEXT+1) .AND. TPSTATPROF%XX <= PXHAT_GLOB(UBOUND(PXHAT_GLOB,1)-JPHEXT+1) & - .AND. TPSTATPROF%XY >= PYHAT_GLOB(JPHEXT+1) .AND. TPSTATPROF%XY <= PYHAT_GLOB(UBOUND(PYHAT_GLOB,1)-JPHEXT+1) ) THEN + 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) @@ -325,11 +316,11 @@ SUBROUTINE STATPROF_POSITION( TPSTATPROF, PXHAT_GLOB, PYHAT_GLOB, PXHATM, PYHATM ! X position TPSTATPROF%NI_U = COUNT( XXHAT (:) <= TPSTATPROF%XX ) - TPSTATPROF%NI_M = COUNT( PXHATM(:) <= TPSTATPROF%XX ) + TPSTATPROF%NI_M = COUNT( XXHATM(:) <= TPSTATPROF%XX ) ! Y position TPSTATPROF%NJ_V = COUNT( XYHAT (:) <= TPSTATPROF%XY ) - TPSTATPROF%NJ_M = COUNT( PYHATM(:) <= 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 & @@ -338,8 +329,8 @@ SUBROUTINE STATPROF_POSITION( TPSTATPROF, PXHAT_GLOB, PYHAT_GLOB, PXHATM, PYHATM ! 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 < PXHATM_PHYS_MIN .OR. TPSTATPROF%XX > PXHATM_PHYS_MAX & - .OR. TPSTATPROF%XY < PYHATM_PHYS_MIN .OR. TPSTATPROF%XY > PYHATM_PHYS_MAX ) 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 @@ -355,9 +346,9 @@ SUBROUTINE STATPROF_POSITION( TPSTATPROF, PXHAT_GLOB, PYHAT_GLOB, PXHATM, PYHATM ! Computations only on correct process IF ( OPRESENT .AND. .NOT. L1D ) THEN ! Interpolation coefficient for X (mass-point) - TPSTATPROF%XXMCOEF = ( TPSTATPROF%XX - PXHATM(TPSTATPROF%NI_M) ) / ( PXHATM(TPSTATPROF%NI_M+1) - PXHATM(TPSTATPROF%NI_M) ) + 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 - PYHATM(TPSTATPROF%NJ_M) ) / ( PYHATM(TPSTATPROF%NJ_M+1) - PYHATM(TPSTATPROF%NJ_M) ) + 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) diff --git a/src/MNH/write_lfifm1_for_diag.f90 b/src/MNH/write_lfifm1_for_diag.f90 index d452fecaf..a83308109 100644 --- a/src/MNH/write_lfifm1_for_diag.f90 +++ b/src/MNH/write_lfifm1_for_diag.f90 @@ -178,7 +178,8 @@ use modd_field, only: tfieldmetadata, tfieldlist, TYPEINT, TYPEREAL USE MODD_FIELD_n, ONLY: XCIT, XCLDFR, 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, XLAT, XLEN1, XLEN2, XLON, XZS, XXHAT, XXHATM, XYHAT, XYHATM, XZHAT, XZSMT, XZTOP, XZZ +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 @@ -211,7 +212,6 @@ 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_GATHER_ll, only: GATHERALL_FIELD_ll 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 @@ -263,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 @@ -398,13 +393,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), XYHATM(NEXTE_XMIN), ZLATOR, ZLONOR ) ! CALL IO_Field_write(TPFILE,'LONOR',ZLONOR) CALL IO_Field_write(TPFILE,'LATOR',ZLATOR) diff --git a/src/MNH/write_lfifmn_fordiachron.f90 b/src/MNH/write_lfifmn_fordiachron.f90 index d6c6ba317..83b6d0a9b 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), XYHATM(NEXTE_XMIN), 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 c1fdfcd2c..8818506c3 100644 --- a/src/MNH/write_lfin.f90 +++ b/src/MNH/write_lfin.f90 @@ -259,7 +259,6 @@ 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_IO_FIELD_WRITE, only: IO_Field_write USE MODE_IO_FILE, only: IO_File_close @@ -299,11 +298,6 @@ 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 :: INFO_ll @@ -366,13 +360,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), XYHATM(NEXTE_XMIN), ZLATOR, ZLONOR ) ! CALL IO_Field_write(TPFILE,'LONOR',ZLONOR) CALL IO_Field_write(TPFILE,'LATOR',ZLATOR) -- GitLab From df3149919de5f14627f33e606b3092e992ea27c8 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Wed, 14 Sep 2022 11:36:30 +0200 Subject: [PATCH 099/157] Philippe 14/09/2022: bugfix: NBALLOONS => NAIRCRAFTS --- src/MNH/aircraft_balloon.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/MNH/aircraft_balloon.f90 b/src/MNH/aircraft_balloon.f90 index eb5b0d777..02b18e25d 100644 --- a/src/MNH/aircraft_balloon.f90 +++ b/src/MNH/aircraft_balloon.f90 @@ -151,7 +151,7 @@ DO JI = 1, NBALLOONS TBALLOONS(JI), PSEA ) END DO ! -DO JI = 1, NBALLOONS +DO JI = 1, NAIRCRAFTS CALL AIRCRAFT_BALLOON_EVOL( PTSTEP, PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT, & TAIRCRAFTS(JI), PSEA ) -- GitLab From 81f4ea921487a16e76e5fb68d90b8edbeb7c4e05 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Wed, 14 Sep 2022 14:38:17 +0200 Subject: [PATCH 100/157] Philippe 14/09/2022: bugfix: GALLOC/GALLOCM were not initialized --- src/MNH/set_grid.f90 | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/MNH/set_grid.f90 b/src/MNH/set_grid.f90 index c6acdf6b9..e2cb21e46 100644 --- a/src/MNH/set_grid.f90 +++ b/src/MNH/set_grid.f90 @@ -538,6 +538,8 @@ SUBROUTINE STORE_GRID_1DIR_BOUNDS( HDIR, PHAT, PHATM, PHAT_BOUND, PHATM_BOUND ) REAL, DIMENSION(:), POINTER :: ZHAT_GLOB REAL, DIMENSION(:), POINTER :: ZHATM_GLOB + GALLOC = .FALSE. + GALLOCM = .FALSE. ZHAT_GLOB => NULL() ZHATM_GLOB => NULL() -- GitLab From 9accacee9316f0ad4cb5863c692f0cf99f83bd25 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Wed, 14 Sep 2022 14:39:04 +0200 Subject: [PATCH 101/157] Philippe 14/09/2022: bugfix: usage of xhatm_bound was incorrect --- src/MNH/write_lfifm1_for_diag.f90 | 2 +- src/MNH/write_lfifmn_fordiachron.f90 | 2 +- src/MNH/write_lfin.f90 | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/MNH/write_lfifm1_for_diag.f90 b/src/MNH/write_lfifm1_for_diag.f90 index a83308109..ceba1cb51 100644 --- a/src/MNH/write_lfifm1_for_diag.f90 +++ b/src/MNH/write_lfifm1_for_diag.f90 @@ -393,7 +393,7 @@ IF (.NOT.LCARTESIAN) THEN ! !* diagnostic of 1st mass point ! - CALL SM_LATLON( XLATORI, XLONORI, XHATM_BOUND(NEXTE_XMIN), XYHATM(NEXTE_XMIN), ZLATOR, ZLONOR ) + 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_lfifmn_fordiachron.f90 b/src/MNH/write_lfifmn_fordiachron.f90 index 83b6d0a9b..a46115d97 100644 --- a/src/MNH/write_lfifmn_fordiachron.f90 +++ b/src/MNH/write_lfifmn_fordiachron.f90 @@ -157,7 +157,7 @@ IF (.NOT.LCARTESIAN) THEN ! !* diagnostic of 1st mass point ! - CALL SM_LATLON( XLATORI, XLONORI, XHATM_BOUND(NEXTE_XMIN), XYHATM(NEXTE_XMIN), ZLATOR, ZLONOR ) + 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 8818506c3..1b48d9b9b 100644 --- a/src/MNH/write_lfin.f90 +++ b/src/MNH/write_lfin.f90 @@ -360,7 +360,7 @@ IF (.NOT.LCARTESIAN) THEN ! !* diagnostic of 1st mass point ! - CALL SM_LATLON( XLATORI, XLONORI, XHATM_BOUND(NEXTE_XMIN), XYHATM(NEXTE_XMIN), ZLATOR, ZLONOR ) + 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) -- GitLab From 62c85f203c6382f666f706ac88a4715f3f0220a6 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Thu, 15 Sep 2022 16:27:53 +0200 Subject: [PATCH 102/157] Philippe 15/09/2022: bugfix: prep_ideal_case: earlier allocate of XHAT_BOUND and XHATM_BOUND --- src/MNH/prep_ideal_case.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/MNH/prep_ideal_case.f90 b/src/MNH/prep_ideal_case.f90 index bf758751f..2a892ab01 100644 --- a/src/MNH/prep_ideal_case.f90 +++ b/src/MNH/prep_ideal_case.f90 @@ -904,6 +904,7 @@ IF(.NOT. L1D) LHORELAX_SV(1:NSV)=.TRUE. ! !* 4.1 Vertical Spatial grid ! +ALLOCATE( XHAT_BOUND(NHAT_BOUND_SIZE), XHATM_BOUND(NHAT_BOUND_SIZE) ) CALL READ_VER_GRID(TZEXPREFILE) ! !* 4.2 Initialize parallel variables and compute array's dimensions @@ -1242,7 +1243,6 @@ ELSE ! ALLOCATE( XXHAT(NIU), XYHAT(NJU) ) ALLOCATE( XXHATM(NIU), XYHATM(NJU) ) - ALLOCATE( XHAT_BOUND (NHAT_BOUND_SIZE), XHATM_BOUND(NHAT_BOUND_SIZE) ) ! ! define the grid localization at the earth surface by the central point ! coordinates -- GitLab From 3719b8c02f0b1ba126837717566405edeeb01b84 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Wed, 21 Sep 2022 15:08:51 +0200 Subject: [PATCH 103/157] Philippe 21/09/2022: move allocations of XHAT_BOUND and XHATM_BOUND to STORE_GRID_1DIR_BOUNDS --- src/MNH/ini_modeln.f90 | 2 -- src/MNH/ini_spectren.f90 | 2 -- src/MNH/prep_ideal_case.f90 | 1 - src/MNH/read_hgridn.f90 | 2 -- src/MNH/set_grid.f90 | 66 ++++++++++++++++++++++--------------- src/MNH/spawn_grid2.f90 | 8 ++--- src/MNH/spawn_model2.f90 | 1 - 7 files changed, 43 insertions(+), 39 deletions(-) diff --git a/src/MNH/ini_modeln.f90 b/src/MNH/ini_modeln.f90 index a3de7b35a..9a4aed5cd 100644 --- a/src/MNH/ini_modeln.f90 +++ b/src/MNH/ini_modeln.f90 @@ -1013,8 +1013,6 @@ ALLOCATE(XDIRCOSXW(IIU,IJU)) ALLOCATE(XDIRCOSYW(IIU,IJU)) ALLOCATE(XCOSSLOPE(IIU,IJU)) ALLOCATE(XSINSLOPE(IIU,IJU)) -ALLOCATE(XHAT_BOUND (NHAT_BOUND_SIZE)) -ALLOCATE(XHATM_BOUND(NHAT_BOUND_SIZE)) ! ALLOCATE(XDXX(IIU,IJU,IKU)) ALLOCATE(XDYY(IIU,IJU,IKU)) diff --git a/src/MNH/ini_spectren.f90 b/src/MNH/ini_spectren.f90 index a98810782..29b2679f0 100644 --- a/src/MNH/ini_spectren.f90 +++ b/src/MNH/ini_spectren.f90 @@ -269,8 +269,6 @@ ALLOCATE(XZSMT(IIU,IJU)) ALLOCATE(XZZ(IIU,IJU,IKU)) ALLOCATE(XZHAT(IKU)) ALLOCATE(XZHATM(IKU)) -ALLOCATE(XHAT_BOUND (NHAT_BOUND_SIZE)) -ALLOCATE(XHATM_BOUND(NHAT_BOUND_SIZE)) ! ALLOCATE(XDXX(IIU,IJU,IKU)) ALLOCATE(XDYY(IIU,IJU,IKU)) diff --git a/src/MNH/prep_ideal_case.f90 b/src/MNH/prep_ideal_case.f90 index 2a892ab01..b4faa5ac1 100644 --- a/src/MNH/prep_ideal_case.f90 +++ b/src/MNH/prep_ideal_case.f90 @@ -904,7 +904,6 @@ IF(.NOT. L1D) LHORELAX_SV(1:NSV)=.TRUE. ! !* 4.1 Vertical Spatial grid ! -ALLOCATE( XHAT_BOUND(NHAT_BOUND_SIZE), XHATM_BOUND(NHAT_BOUND_SIZE) ) CALL READ_VER_GRID(TZEXPREFILE) ! !* 4.2 Initialize parallel variables and compute array's dimensions diff --git a/src/MNH/read_hgridn.f90 b/src/MNH/read_hgridn.f90 index 4afe7ed32..cfccf88ba 100644 --- a/src/MNH/read_hgridn.f90 +++ b/src/MNH/read_hgridn.f90 @@ -254,8 +254,6 @@ CALL IO_Field_read(TPFMFILE,'YHAT',XYHAT) IF ( .NOT. ASSOCIATED(XXHATM) ) ALLOCATE( XXHATM(SIZE( XXHAT )) ) IF ( .NOT. ASSOCIATED(XYHATM) ) ALLOCATE( XYHATM(SIZE( XYHAT )) ) -IF ( .NOT. ASSOCIATED(XHAT_BOUND) ) ALLOCATE( XHAT_BOUND (NHAT_BOUND_SIZE) ) -IF ( .NOT. ASSOCIATED(XHATM_BOUND) ) ALLOCATE( XHATM_BOUND(NHAT_BOUND_SIZE) ) ! Interpolations of positions to mass points CALL INTERP_HORGRID_TO_MASSPOINTS( XXHAT, XYHAT, XXHATM, XYHATM ) diff --git a/src/MNH/set_grid.f90 b/src/MNH/set_grid.f90 index e2cb21e46..e2d28d064 100644 --- a/src/MNH/set_grid.f90 +++ b/src/MNH/set_grid.f90 @@ -207,8 +207,8 @@ 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(:), INTENT(INOUT) :: PHAT_BOUND ! Boundaries of global domain in the conformal or cartesian plane -REAL, DIMENSION(:), INTENT(INOUT) :: PHATM_BOUND ! Boundaries of global domain in the conformal or cartesian plane at mass pts +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 @@ -284,7 +284,8 @@ 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 = TFIELDMETADATA( TFIELDLIST(IID) ) TZFIELD%CMNHNAME = 'LONOR' @@ -519,7 +520,7 @@ END SUBROUTINE INTERP_VERGRID_TO_MASSPOINTS SUBROUTINE STORE_GRID_1DIR_BOUNDS( HDIR, PHAT, PHATM, PHAT_BOUND, PHATM_BOUND ) USE MODD_GRID_n - USE MODD_PARAMETERS, ONLY: JPHEXT, JPVEXT + USE MODD_PARAMETERS, ONLY: JPHEXT, JPVEXT, XNEGUNDEF USE MODE_ALLOCBUFFER_ll, ONLY: ALLOCBUFFER_ll USE MODE_GATHER_ll, ONLY: GATHERALL_FIELD_ll @@ -527,11 +528,11 @@ SUBROUTINE STORE_GRID_1DIR_BOUNDS( HDIR, PHAT, PHATM, PHAT_BOUND, PHATM_BOUND ) 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(NHAT_BOUND_SIZE), INTENT(INOUT) :: PHAT_BOUND ! Boundaries of global domain in the conformal or cartesian plane - REAL, DIMENSION(NHAT_BOUND_SIZE), INTENT(INOUT) :: PHATM_BOUND ! id at mass points + 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_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 @@ -540,9 +541,20 @@ SUBROUTINE STORE_GRID_1DIR_BOUNDS( HDIR, PHAT, PHATM, PHAT_BOUND, PHATM_BOUND ) GALLOC = .FALSE. GALLOCM = .FALSE. + ZHAT_GLOB => NULL() ZHATM_GLOB => NULL() + 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' ) CALL ALLOCBUFFER_ll( ZHAT_GLOB, PHAT, 'XX', GALLOC ) @@ -613,14 +625,14 @@ SUBROUTINE STORE_GRID_BOUNDS( PXHAT, PYHAT, PZHAT, PXHATM, PYHATM, PZHATM, PHAT_ 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 ! id at mass points - REAL, DIMENSION(:), INTENT(IN) :: PYHATM ! id at mass points - REAL, DIMENSION(:), INTENT(IN) :: PZHATM ! id at mass points - REAL, DIMENSION(:), INTENT(INOUT) :: PHAT_BOUND ! Boundaries of global domain in the conformal or cartesian plane - REAL, DIMENSION(:), INTENT(INOUT) :: PHATM_BOUND ! id at mass points + 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) :: 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_BOUNDS( 'X', PXHAT, PXHATM, PHAT_BOUND, PHATM_BOUND ) CALL STORE_GRID_1DIR_BOUNDS( 'Y', PYHAT, PYHATM, PHAT_BOUND, PHATM_BOUND ) @@ -635,12 +647,12 @@ SUBROUTINE STORE_HORGRID_BOUNDS( PXHAT, PYHAT, PXHATM, PYHATM, PHAT_BOUND, PHATM 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 ! id at mass points - REAL, DIMENSION(:), INTENT(IN) :: PYHATM ! id at mass points - REAL, DIMENSION(:), INTENT(INOUT) :: PHAT_BOUND ! Boundaries of global domain in the conformal or cartesian plane - REAL, DIMENSION(:), INTENT(INOUT) :: PHATM_BOUND ! id at mass points + 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) :: 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_BOUNDS( 'X', PXHAT, PXHATM, PHAT_BOUND, PHATM_BOUND ) CALL STORE_GRID_1DIR_BOUNDS( 'Y', PYHAT, PYHATM, PHAT_BOUND, PHATM_BOUND ) @@ -654,10 +666,10 @@ SUBROUTINE STORE_VERGRID_BOUNDS( PZHAT, PZHATM, PHAT_BOUND, PHATM_BOUND ) IMPLICIT NONE - REAL, DIMENSION(:), INTENT(IN) :: PZHAT ! Position y in the conformal or cartesian plane - REAL, DIMENSION(:), INTENT(IN) :: PZHATM ! id at mass points - REAL, DIMENSION(:), INTENT(INOUT) :: PHAT_BOUND ! Boundaries of global domain in the conformal or cartesian plane - REAL, DIMENSION(:), INTENT(INOUT) :: PHATM_BOUND ! id at mass points + 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 CALL STORE_GRID_1DIR_BOUNDS( 'Z', PZHAT, PZHATM, PHAT_BOUND, PHATM_BOUND ) diff --git a/src/MNH/spawn_grid2.f90 b/src/MNH/spawn_grid2.f90 index 2bbc35dd8..332519faa 100644 --- a/src/MNH/spawn_grid2.f90 +++ b/src/MNH/spawn_grid2.f90 @@ -30,8 +30,8 @@ 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(:), INTENT(INOUT) :: PHAT_BOUND ! Boundaries of global domain in the conformal or cartesian plane -REAL, DIMENSION(:), INTENT(INOUT) :: PHATM_BOUND ! Boundaries of global domain in the conformal or cartesian plane 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 @@ -196,8 +196,8 @@ 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(:), INTENT(INOUT) :: PHAT_BOUND ! Boundaries of global domain in the conformal or cartesian plane -REAL, DIMENSION(:), INTENT(INOUT) :: PHATM_BOUND ! Boundaries of global domain in the conformal or cartesian plane 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 diff --git a/src/MNH/spawn_model2.f90 b/src/MNH/spawn_model2.f90 index a824c074b..fe3baed67 100644 --- a/src/MNH/spawn_model2.f90 +++ b/src/MNH/spawn_model2.f90 @@ -736,7 +736,6 @@ END IF ! ALLOCATE(XXHAT(IIU),XYHAT(IJU),XZHAT(IKU)) ALLOCATE(XXHATM(IIU),XYHATM(IJU),XZHATM(IKU)) -ALLOCATE( XHAT_BOUND(NHAT_BOUND_SIZE), XHATM_BOUND(NHAT_BOUND_SIZE) ) ALLOCATE(XZTOP) ALLOCATE(XMAP(IIU,IJU)) ALLOCATE(XLAT(IIU,IJU)) -- GitLab From 1796c1d191556e095364152d2a55aa85e6d10e92 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Thu, 22 Sep 2022 10:43:45 +0200 Subject: [PATCH 104/157] Philippe 22/09/2022: add XXHAT_ll, XYHAT_ll, XHATM_ll and XYHATM_ll and use them --- src/LIB/SURCOUCHE/src/mode_field.f90 | 60 ++++++- src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 | 36 +++-- src/MNH/fun.f90 | 34 +--- src/MNH/ibm_idealrp.f90 | 15 +- src/MNH/ini_les_cart_maskn.f90 | 25 +-- src/MNH/ini_lesn.f90 | 24 +-- src/MNH/ini_modeln.f90 | 5 +- src/MNH/ini_spectren.f90 | 1 + src/MNH/modd_gridn.f90 | 7 +- src/MNH/modd_shadowsn.f90 | 19 +-- src/MNH/prep_ideal_case.f90 | 12 +- src/MNH/read_hgridn.f90 | 4 +- src/MNH/read_ver_grid.f90 | 4 +- src/MNH/set_grid.f90 | 166 ++++++++++++-------- src/MNH/set_perturb.f90 | 21 +-- src/MNH/spawn_grid2.f90 | 15 +- src/MNH/spawn_model2.f90 | 1 + src/MNH/surf_solar_shadows.f90 | 11 +- src/MNH/turb_ver_thermo_flux.f90 | 16 -- 19 files changed, 252 insertions(+), 224 deletions(-) diff --git a/src/LIB/SURCOUCHE/src/mode_field.f90 b/src/LIB/SURCOUCHE/src/mode_field.f90 index 71eefd211..4e444469a 100644 --- a/src/LIB/SURCOUCHE/src/mode_field.f90 +++ b/src/LIB/SURCOUCHE/src/mode_field.f90 @@ -468,7 +468,7 @@ call Add_field2list( TFIELDDATA( & CLONGNAME = 'XHATM', & CUNITS = 'm', & CDIR = 'XX', & - CCOMMENT = 'Position x in the conformal or cartesian plane at mass point', & + CCOMMENT = 'Position x in the conformal or cartesian plane at mass points', & NGRID = 1, & NTYPE = TYPEREAL, & NDIMS = 1, & @@ -480,7 +480,7 @@ call Add_field2list( TFIELDDATA( & CLONGNAME = 'YHATM', & CUNITS = 'm', & CDIR = 'YY', & - CCOMMENT = 'Position y in the conformal or cartesian plane at mass point', & + CCOMMENT = 'Position y in the conformal or cartesian plane at mass points', & NGRID = 1, & NTYPE = TYPEREAL, & NDIMS = 1, & @@ -780,6 +780,58 @@ call Add_field2list( TFIELDDATA( & 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', & + 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', & @@ -3673,6 +3725,10 @@ 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 ! diff --git a/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 b/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 index 65ffbdc8e..43a779e3e 100644 --- a/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 +++ b/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 @@ -1450,7 +1450,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, xxhatm, xyhat, xyhatm, xzhat, xzhatm +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 @@ -1494,9 +1494,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() @@ -1511,6 +1511,10 @@ zzhat => null() zxhatm => null() zyhatm => null() zzhatm => null() +zxhat_glob => null() +zyhat_glob => null() +zxhatm_glob => null() +zyhatm_glob => null() gchangemodel = .false. @@ -1538,6 +1542,14 @@ if ( tpfile%nmodel > 0 ) then 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 @@ -1553,6 +1565,10 @@ else 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 @@ -1581,14 +1597,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', & @@ -1602,7 +1610,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 @@ -1867,13 +1874,14 @@ if ( tpfile%lmaster ) then 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 @@ -1917,7 +1925,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 ) diff --git a/src/MNH/fun.f90 b/src/MNH/fun.f90 index 64c54caa6..85100a77b 100644 --- a/src/MNH/fun.f90 +++ b/src/MNH/fun.f90 @@ -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( & - (( XYHATM(JJ)-ZYHAT_ll(IJ0))/ZWIDTHY) **2 & + (( 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((XYHATM(JJ)-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,14 +297,12 @@ 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( & - (( XXHATM(JI)-ZXHAT_ll(II0))/ZWIDTHX)**2 & + (( XXHATM(JI)-XXHAT_ll(II0))/ZWIDTHX)**2 & +(( PZHAT (JK) - PZHAT (IK0))/ZWIDTHZ)**2 ) END DO END DO @@ -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((XXHATM(JI)-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/ibm_idealrp.f90 b/src/MNH/ibm_idealrp.f90 index a67bb5fd2..3c2a0c77d 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/ini_les_cart_maskn.f90 b/src/MNH/ini_les_cart_maskn.f90 index a3e9c7840..822d41581 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 84f90dba5..0b565244c 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_modeln.f90 b/src/MNH/ini_modeln.f90 index 9a4aed5cd..258172aeb 100644 --- a/src/MNH/ini_modeln.f90 +++ b/src/MNH/ini_modeln.f90 @@ -1859,6 +1859,7 @@ 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, & @@ -2263,15 +2264,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 diff --git a/src/MNH/ini_spectren.f90 b/src/MNH/ini_spectren.f90 index 29b2679f0..b6e605ecc 100644 --- a/src/MNH/ini_spectren.f90 +++ b/src/MNH/ini_spectren.f90 @@ -689,6 +689,7 @@ 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, & diff --git a/src/MNH/modd_gridn.f90 b/src/MNH/modd_gridn.f90 index 1f0c5d895..c5fcc566b 100644 --- a/src/MNH/modd_gridn.f90 +++ b/src/MNH/modd_gridn.f90 @@ -36,7 +36,8 @@ ! 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 and XHATM_BOUND +! P. Wautelet 09/2022: add XXHATM, XYHATM, XZHATM, XHAT_BOUND, XHATM_BOUND, +! XXHAT_ll, XYHAT_ll, XXHATM_ll and XYHATM_ll !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -88,5 +89,9 @@ REAL, POINTER :: XLEN2=>NULL() ! Decay scale for s 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_shadowsn.f90 b/src/MNH/modd_shadowsn.f90 index b2ca81707..ebb1372e4 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/prep_ideal_case.f90 b/src/MNH/prep_ideal_case.f90 index b4faa5ac1..d16492d7a 100644 --- a/src/MNH/prep_ideal_case.f90 +++ b/src/MNH/prep_ideal_case.f90 @@ -379,7 +379,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_HORGRID_BOUNDS +USE MODE_SET_GRID, only: INTERP_HORGRID_TO_MASSPOINTS, STORE_GLOB_HORGRID ! USE MODI_DEFAULT_DESFM_n ! Interface modules USE MODI_DEFAULT_EXPRE @@ -552,7 +552,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, & @@ -1286,7 +1285,7 @@ ELSE CALL INTERP_HORGRID_TO_MASSPOINTS( XXHAT, XYHAT, XXHATM, XYHATM ) ! Collect global domain boundaries - CALL STORE_HORGRID_BOUNDS( XXHAT, XYHAT, XXHATM, XYHATM, XHAT_BOUND, XHATM_BOUND ) + CALL STORE_GLOB_HORGRID( XXHAT, XYHAT, XXHATM, XYHATM, XXHAT_ll, XYHAT_ll, XXHATM_ll, XYHATM_ll, XHAT_BOUND, XHATM_BOUND ) END IF ! @@ -1455,12 +1454,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 diff --git a/src/MNH/read_hgridn.f90 b/src/MNH/read_hgridn.f90 index cfccf88ba..1ac466b48 100644 --- a/src/MNH/read_hgridn.f90 +++ b/src/MNH/read_hgridn.f90 @@ -93,7 +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_HORGRID_BOUNDS +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 @@ -259,7 +259,7 @@ IF ( .NOT. ASSOCIATED(XYHATM) ) ALLOCATE( XYHATM(SIZE( XYHAT )) ) CALL INTERP_HORGRID_TO_MASSPOINTS( XXHAT, XYHAT, XXHATM, XYHATM ) ! Collect global domain boundaries -CALL STORE_HORGRID_BOUNDS( XXHAT, XYHAT, XXHATM, XYHATM, XHAT_BOUND, XHATM_BOUND ) +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 diff --git a/src/MNH/read_ver_grid.f90 b/src/MNH/read_ver_grid.f90 index a00d7a30a..44665594e 100644 --- a/src/MNH/read_ver_grid.f90 +++ b/src/MNH/read_ver_grid.f90 @@ -111,7 +111,7 @@ USE MODD_PARAMETERS ! USE MODE_MSG USE MODE_POS -USE MODE_SET_GRID, ONLY: INTERP_VERGRID_TO_MASSPOINTS, STORE_VERGRID_BOUNDS +USE MODE_SET_GRID, ONLY: INTERP_VERGRID_TO_MASSPOINTS, STORE_GLOB_VERGRID ! USE MODI_DEFAULT_SLEVE ! @@ -332,7 +332,7 @@ XZTOP = XZHAT(IKU) CALL INTERP_VERGRID_TO_MASSPOINTS( XZHAT, XZHATM ) ! Collect global domain boundaries -CALL STORE_VERGRID_BOUNDS( XZHAT, XZHATM, XHAT_BOUND, XHATM_BOUND ) +CALL STORE_GLOB_VERGRID( XZHAT, XZHATM, XHAT_BOUND, XHATM_BOUND ) !------------------------------------------------------------------------------- ! diff --git a/src/MNH/set_grid.f90 b/src/MNH/set_grid.f90 index e2d28d064..4ecfdf897 100644 --- a/src/MNH/set_grid.f90 +++ b/src/MNH/set_grid.f90 @@ -19,7 +19,7 @@ PUBLIC :: SET_GRID PUBLIC :: INTERP_HORGRID_1DIR_TO_MASSPOINTS, INTERP_HORGRID_TO_MASSPOINTS, INTERP_VERGRID_TO_MASSPOINTS -PUBLIC :: STORE_GRID_BOUNDS, STORE_HORGRID_BOUNDS, STORE_VERGRID_BOUNDS +PUBLIC :: STORE_GLOB_GRID, STORE_GLOB_HORGRID, STORE_GLOB_VERGRID CONTAINS @@ -29,6 +29,7 @@ CONTAINS 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, & @@ -207,6 +208,10 @@ 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 @@ -353,7 +358,8 @@ CALL INTERP_HORGRID_TO_MASSPOINTS( PXHAT, PYHAT, PXHATM, PYHATM ) CALL INTERP_VERGRID_TO_MASSPOINTS( PZHAT, PZHATM ) ! Collect global domain boundaries -CALL STORE_GRID_BOUNDS( PXHAT, PYHAT, PZHAT, PXHATM, PYHATM, PZHATM, PHAT_BOUND, PHATM_BOUND ) +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) @@ -517,7 +523,7 @@ END SUBROUTINE INTERP_VERGRID_TO_MASSPOINTS !----------------------------------------------------------------- -SUBROUTINE STORE_GRID_1DIR_BOUNDS( HDIR, PHAT, PHATM, PHAT_BOUND, PHATM_BOUND ) +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 @@ -531,19 +537,17 @@ SUBROUTINE STORE_GRID_1DIR_BOUNDS( HDIR, PHAT, PHATM, PHAT_BOUND, PHATM_BOUND ) 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 - REAL, DIMENSION(:), POINTER :: ZHAT_GLOB - REAL, DIMENSION(:), POINTER :: ZHATM_GLOB + LOGICAL :: GALLOC, GALLOCM !Remark: do not deallocate (PHAT_ll/PHATM_ll may be used outside this subroutine) GALLOC = .FALSE. GALLOCM = .FALSE. - ZHAT_GLOB => NULL() - ZHATM_GLOB => NULL() IF ( .NOT. ASSOCIATED( PHAT_BOUND ) ) THEN ALLOCATE( PHAT_BOUND(NHAT_BOUND_SIZE) ) @@ -557,93 +561,112 @@ SUBROUTINE STORE_GRID_1DIR_BOUNDS( HDIR, PHAT, PHATM, PHAT_BOUND, PHATM_BOUND ) SELECT CASE (HDIR) CASE ( 'X' ) - CALL ALLOCBUFFER_ll( ZHAT_GLOB, PHAT, 'XX', GALLOC ) - CALL ALLOCBUFFER_ll( ZHATM_GLOB, PHATM, 'XX', GALLOCM ) - CALL GATHERALL_FIELD_ll( 'XX', PHAT, ZHAT_GLOB, IERR ) - CALL GATHERALL_FIELD_ll( 'XX', PHATM, ZHATM_GLOB, IERR ) + 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) = ZHAT_GLOB( 1 ) - PHAT_BOUND(NEXTE_XMAX) = ZHAT_GLOB( UBOUND( ZHAT_GLOB, 1 ) ) - PHAT_BOUND(NPHYS_XMIN) = ZHAT_GLOB( JPHEXT + 1 ) - PHAT_BOUND(NPHYS_XMAX) = ZHAT_GLOB( UBOUND( ZHAT_GLOB, 1 ) ) + 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) = ZHATM_GLOB( 1 ) - PHATM_BOUND(NEXTE_XMAX) = ZHATM_GLOB( UBOUND( ZHATM_GLOB, 1 ) ) - PHATM_BOUND(NPHYS_XMIN) = ZHATM_GLOB( JPHEXT + 1 ) - PHATM_BOUND(NPHYS_XMAX) = ZHATM_GLOB( UBOUND( ZHATM_GLOB, 1 ) - JPHEXT ) + 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' ) - CALL ALLOCBUFFER_ll( ZHAT_GLOB, PHAT, 'YY', GALLOC ) - CALL ALLOCBUFFER_ll( ZHATM_GLOB, PHATM, 'YY', GALLOCM ) - CALL GATHERALL_FIELD_ll( 'YY', PHAT, ZHAT_GLOB, IERR ) - CALL GATHERALL_FIELD_ll( 'YY', PHATM, ZHATM_GLOB, IERR ) + 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) = ZHAT_GLOB( 1 ) - PHAT_BOUND(NEXTE_YMAX) = ZHAT_GLOB( UBOUND( ZHAT_GLOB, 1 ) ) - PHAT_BOUND(NPHYS_YMIN) = ZHAT_GLOB( JPHEXT + 1 ) - PHAT_BOUND(NPHYS_YMAX) = ZHAT_GLOB( UBOUND( ZHAT_GLOB, 1 ) ) + 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) = ZHATM_GLOB( 1 ) - PHATM_BOUND(NEXTE_YMAX) = ZHATM_GLOB( UBOUND( ZHATM_GLOB, 1 ) ) - PHATM_BOUND(NPHYS_YMIN) = ZHATM_GLOB( JPHEXT + 1 ) - PHATM_BOUND(NPHYS_YMAX) = ZHATM_GLOB( UBOUND( ZHATM_GLOB, 1 ) - JPHEXT ) + 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' ) - ZHAT_GLOB => PHAT - ZHATM_GLOB => PHATM + PHAT_ll => PHAT + PHATM_ll => PHATM ! Global boundaries on w points - PHAT_BOUND(NEXTE_ZMIN) = ZHAT_GLOB( 1 ) - PHAT_BOUND(NEXTE_ZMAX) = ZHAT_GLOB( UBOUND( ZHAT_GLOB, 1 ) ) - PHAT_BOUND(NPHYS_ZMIN) = ZHAT_GLOB( JPVEXT + 1 ) - PHAT_BOUND(NPHYS_ZMAX) = ZHAT_GLOB( UBOUND( ZHAT_GLOB, 1 ) ) + 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) = ZHATM_GLOB( 1 ) - PHATM_BOUND(NEXTE_ZMAX) = ZHATM_GLOB( UBOUND( ZHATM_GLOB, 1 ) ) - PHATM_BOUND(NPHYS_ZMIN) = ZHATM_GLOB( JPVEXT + 1 ) - PHATM_BOUND(NPHYS_ZMAX) = ZHATM_GLOB( UBOUND( ZHATM_GLOB, 1 ) - JPVEXT ) + 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_BOUNDS', 'invalid direction (valid: X, Y or Z)' ) + CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'STORE_GRID_1DIR', 'invalid direction (valid: X, Y or Z)' ) END SELECT - IF ( GALLOC ) DEALLOCATE( ZHAT_GLOB ) - IF ( GALLOCM ) DEALLOCATE( ZHATM_GLOB ) - -END SUBROUTINE STORE_GRID_1DIR_BOUNDS +END SUBROUTINE STORE_GRID_1DIR !----------------------------------------------------------------- !----------------------------------------------------------------- -SUBROUTINE STORE_GRID_BOUNDS( PXHAT, PYHAT, PZHAT, PXHATM, PYHATM, PZHATM, PHAT_BOUND, PHATM_BOUND ) +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(:), 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 - CALL STORE_GRID_1DIR_BOUNDS( 'X', PXHAT, PXHATM, PHAT_BOUND, PHATM_BOUND ) - CALL STORE_GRID_1DIR_BOUNDS( 'Y', PYHAT, PYHATM, PHAT_BOUND, PHATM_BOUND ) - CALL STORE_GRID_1DIR_BOUNDS( 'Z', PZHAT, PZHATM, PHAT_BOUND, PHATM_BOUND ) + REAL, DIMENSION(:), POINTER :: PZHAT_DUMMY_ll + REAL, DIMENSION(:), POINTER :: PZHATM_DUMMY_ll -END SUBROUTINE STORE_GRID_BOUNDS + 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_HORGRID_BOUNDS( PXHAT, PYHAT, PXHATM, PYHATM, PHAT_BOUND, PHATM_BOUND ) +SUBROUTINE STORE_GLOB_HORGRID( PXHAT, PYHAT, PXHATM, PYHATM, & + PXHAT_ll, PYHAT_ll, PXHATM_ll, PYHATM_ll, PHAT_BOUND, PHATM_BOUND ) IMPLICIT NONE @@ -651,18 +674,22 @@ SUBROUTINE STORE_HORGRID_BOUNDS( PXHAT, PYHAT, PXHATM, PYHATM, PHAT_BOUND, PHATM 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_BOUNDS( 'X', PXHAT, PXHATM, PHAT_BOUND, PHATM_BOUND ) - CALL STORE_GRID_1DIR_BOUNDS( 'Y', PYHAT, PYHATM, PHAT_BOUND, PHATM_BOUND ) + 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_HORGRID_BOUNDS +END SUBROUTINE STORE_GLOB_HORGRID !----------------------------------------------------------------- !----------------------------------------------------------------- -SUBROUTINE STORE_VERGRID_BOUNDS( PZHAT, PZHATM, PHAT_BOUND, PHATM_BOUND ) +SUBROUTINE STORE_GLOB_VERGRID( PZHAT, PZHATM, PHAT_BOUND, PHATM_BOUND ) IMPLICIT NONE @@ -671,9 +698,18 @@ SUBROUTINE STORE_VERGRID_BOUNDS( PZHAT, PZHATM, PHAT_BOUND, PHATM_BOUND ) 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_BOUNDS( 'Z', PZHAT, PZHATM, PHAT_BOUND, PHATM_BOUND ) + 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_VERGRID_BOUNDS +END SUBROUTINE STORE_GLOB_VERGRID !----------------------------------------------------------------- diff --git a/src/MNH/set_perturb.f90 b/src/MNH/set_perturb.f90 index 7e9e43687..7c4ea5e2e 100644 --- a/src/MNH/set_perturb.f90 +++ b/src/MNH/set_perturb.f90 @@ -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,8 +262,8 @@ 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 @@ -339,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 ! @@ -348,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 ! @@ -558,8 +551,6 @@ SELECT CASE(CPERT_KIND) ! END SELECT ! -DEALLOCATE(ZXHAT_ll,ZYHAT_ll) -! !------------------------------------------------------------------------------- ! END SUBROUTINE SET_PERTURB diff --git a/src/MNH/spawn_grid2.f90 b/src/MNH/spawn_grid2.f90 index 332519faa..8521be04d 100644 --- a/src/MNH/spawn_grid2.f90 +++ b/src/MNH/spawn_grid2.f90 @@ -11,6 +11,7 @@ INTERFACE ! 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, & @@ -30,6 +31,10 @@ 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) @@ -54,6 +59,7 @@ END MODULE MODI_SPAWN_GRID2 ! ###################################################################################### 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, & @@ -171,7 +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_GRID_BOUNDS +USE MODE_SET_GRID, only: INTERP_HORGRID_TO_MASSPOINTS, STORE_GLOB_GRID USE MODE_TIME USE MODE_GRIDPROJ ! @@ -196,6 +202,10 @@ 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) @@ -464,7 +474,8 @@ PLEN2 = XLEN21 CALL INTERP_HORGRID_TO_MASSPOINTS( PXHAT, PYHAT, PXHATM, PYHATM ) ! Collect global domain boundaries - CALL STORE_GRID_BOUNDS( PXHAT, PYHAT, PZHAT, PXHATM, PYHATM, PZHATM, PHAT_BOUND, PHATM_BOUND ) + 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) diff --git a/src/MNH/spawn_model2.f90 b/src/MNH/spawn_model2.f90 index fe3baed67..85a2ed746 100644 --- a/src/MNH/spawn_model2.f90 +++ b/src/MNH/spawn_model2.f90 @@ -1061,6 +1061,7 @@ ENDIF XZS=0. 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 ) diff --git a/src/MNH/surf_solar_shadows.f90 b/src/MNH/surf_solar_shadows.f90 index 0a3eaabb7..7d13e34b0 100644 --- a/src/MNH/surf_solar_shadows.f90 +++ b/src/MNH/surf_solar_shadows.f90 @@ -76,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 ! diff --git a/src/MNH/turb_ver_thermo_flux.f90 b/src/MNH/turb_ver_thermo_flux.f90 index 596d78c00..0febd151f 100644 --- a/src/MNH/turb_ver_thermo_flux.f90 +++ b/src/MNH/turb_ver_thermo_flux.f90 @@ -372,7 +372,6 @@ USE MODE_PRANDTL ! USE MODI_SECOND_MNH USE MODE_ll -USE MODE_GATHER_ll ! IMPLICIT NONE ! @@ -494,12 +493,6 @@ INTEGER :: IIB,IJB ! Lower bounds of the physical INTEGER :: IIE,IJE ! Upper bounds of the physical ! sub-domain in x and y directions ! -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) -! -! CHARACTER (LEN=100) :: YCOMMENT ! comment string in LFIFM file CHARACTER (LEN=LEN_HREC) :: YRECFM ! Name of the desired field in LFIFM file ! @@ -535,12 +528,6 @@ IJU=SIZE(PTHLM,2) ! IF (LOCEAN .AND. LDEEPOC) THEN !* COMPUTES THE PHYSICAL SUBDOMAIN BOUNDS - ALLOCATE(ZXHAT_ll(NIMAX_ll+2*JPHEXT),ZYHAT_ll(NJMAX_ll+2*JPHEXT)) - !compute ZXHAT_ll = position in the (0:Lx) domain 1 (Lx=Size of domain1 ) - !compute XXHAT_ll = position in the (L0_subproc,Lx_subproc) domain for the current subproc - ! L0_subproc as referenced in the full domain 1 - CALL GATHERALL_FIELD_ll('XX',XXHAT,ZXHAT_ll,IRESP) - CALL GATHERALL_FIELD_ll('YY',XYHAT,ZYHAT_ll,IRESP) CALL GET_DIM_EXT_ll('B',IIU,IJU) CALL GET_INDICE_ll(IIB,IJB,IIE,IJE) DO JJ = IJB,IJE @@ -1103,9 +1090,6 @@ IF ( ((OTURB_FLX .AND. tpfile%lopened) .OR. LLES_CALL) .AND. (KRRL > 0) ) THEN END IF ! END IF !end of <w Rc> -IF (LOCEAN.AND.LDEEPOC) THEN - DEALLOCATE(ZXHAT_ll,ZYHAT_ll) -END IF ! !---------------------------------------------------------------------------- END SUBROUTINE TURB_VER_THERMO_FLUX -- GitLab From 3fd56d32389b2329e53e0f31176763afddf6c7b0 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Thu, 29 Sep 2022 09:56:32 +0200 Subject: [PATCH 105/157] Philippe 29/09/2022: bugfix: NBALLOONS->NAIRCRAFTS for AIRCRAFTS_NML_ALLOCATE --- src/MNH/read_exsegn.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/MNH/read_exsegn.f90 b/src/MNH/read_exsegn.f90 index ca2f7047a..c469bd5d4 100644 --- a/src/MNH/read_exsegn.f90 +++ b/src/MNH/read_exsegn.f90 @@ -855,7 +855,7 @@ IF (KMI == 1) THEN IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_FLYERS) IF ( NAIRCRAFTS > 0 ) THEN - CALL AIRCRAFTS_NML_ALLOCATE( NBALLOONS ) + CALL AIRCRAFTS_NML_ALLOCATE( NAIRCRAFTS ) CALL POSNAM(ILUSEG,'NAM_AIRCRAFTS',GFOUND,ILUOUT) IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_AIRCRAFTS) END IF -- GitLab From bf07e64ff8749606964af4fff013f9debbbf8b70 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Thu, 29 Sep 2022 10:33:24 +0200 Subject: [PATCH 106/157] Philippe 29/09/2022: bugfix: XTKE_DISS was not communicated --- src/MNH/aircraft_balloon_evol.f90 | 1 + 1 file changed, 1 insertion(+) diff --git a/src/MNH/aircraft_balloon_evol.f90 b/src/MNH/aircraft_balloon_evol.f90 index e6cfc21ba..6a81850ba 100644 --- a/src/MNH/aircraft_balloon_evol.f90 +++ b/src/MNH/aircraft_balloon_evol.f90 @@ -1459,6 +1459,7 @@ IF ( GSTORE ) THEN END DO IF (SIZE(PTKE)>0) CALL DISTRIBUTE_FLYER(TPFLYER%XTKE (IN)) IF (SIZE(PTS) >0) CALL DISTRIBUTE_FLYER(TPFLYER%XTSRAD(IN)) + IF (LDIAG_IN_RUN) CALL DISTRIBUTE_FLYER(TPFLYER%XTKE_DISS(IN)) CALL DISTRIBUTE_FLYER(TPFLYER%XZS (IN)) CALL DISTRIBUTE_FLYER(TPFLYER%XTHW_FLUX(IN)) CALL DISTRIBUTE_FLYER(TPFLYER%XRCW_FLUX(IN)) -- GitLab From f9be1aa728d98a385614ddeb5f9e40658430158d Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Fri, 30 Sep 2022 09:08:11 +0200 Subject: [PATCH 107/157] Philippe 30/09/2022: bugfix: missing communications for SWDIFF, SWDIR and LEI --- src/MNH/ground_paramn.f90 | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/MNH/ground_paramn.f90 b/src/MNH/ground_paramn.f90 index 863574d33..62c2a57f2 100644 --- a/src/MNH/ground_paramn.f90 +++ b/src/MNH/ground_paramn.f90 @@ -112,6 +112,7 @@ END MODULE MODI_GROUND_PARAM_n !! (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 +! P. Wautelet 30/09/2022: bugfix: missing communications for SWDIFF, SWDIR and LEI !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -774,11 +775,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' ) -- GitLab From a62e405f1aa0d860af3073533db247bf90e87d02 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Fri, 30 Sep 2022 09:45:59 +0200 Subject: [PATCH 108/157] Philippe 30/09/2022: bugfix: use XUNDEF from SURFEX for surface variables computed by SURFEX --- src/MNH/ground_paramn.f90 | 40 ++++++++++++++++--------------- src/MNH/ini_diag_in_run.f90 | 48 +++++++++++++++++-------------------- src/MNH/statprof_tools.f90 | 45 ++++++++++++++++++---------------- 3 files changed, 67 insertions(+), 66 deletions(-) diff --git a/src/MNH/ground_paramn.f90 b/src/MNH/ground_paramn.f90 index 62c2a57f2..44ab4453a 100644 --- a/src/MNH/ground_paramn.f90 +++ b/src/MNH/ground_paramn.f90 @@ -113,6 +113,7 @@ END MODULE MODI_GROUND_PARAM_n ! 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 ! 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 !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -130,7 +131,7 @@ USE MODD_DYN_n, ONLY : DYN_MODEL ! USE MODD_LUNIT_n, ONLY: TLUOUT USE MODD_CST, ONLY : XP00, XCPD, XRD, XRV,XRHOLW, XDAY, XPI, XLVTT, XMD, XAVOGADRO -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_FIELD_n, ONLY : XUT, XVT, XWT, XTHT, XRT, XPABST, XSVT, XTKET, XZWS @@ -162,6 +163,7 @@ 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 MODI_ROTATE_WIND @@ -366,16 +368,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 ! ! !------------------------------------------------------------------------------- @@ -660,7 +662,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 @@ -943,12 +945,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) @@ -979,7 +981,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/ini_diag_in_run.f90 b/src/MNH/ini_diag_in_run.f90 index d44800cdc..6f39e805a 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/statprof_tools.f90 b/src/MNH/statprof_tools.f90 index 4a0ac4239..a1daff569 100644 --- a/src/MNH/statprof_tools.f90 +++ b/src/MNH/statprof_tools.f90 @@ -8,6 +8,7 @@ ! P. Wautelet 08/04/2022 !----------------------------------------------------------------- ! Modifications: +! P. Wautelet 30/09/2022: bugfix: use XUNDEF from SURFEX for surface variables computed by SURFEX !----------------------------------------------------------------- ! ################### MODULE MODE_STATPROF_TOOLS @@ -41,6 +42,7 @@ SUBROUTINE PROFILER_ALLOCATE( TPPROFILER, KSTORE ) 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 @@ -133,16 +135,16 @@ SUBROUTINE PROFILER_ALLOCATE( TPPROFILER, KSTORE ) TPPROFILER%XZHD(:) = XUNDEF ! IF ( LDIAG_IN_RUN ) THEN - TPPROFILER%XT2M (:) = XUNDEF - TPPROFILER%XQ2M (:) = XUNDEF - TPPROFILER%XHU2M (:) = XUNDEF - TPPROFILER%XZON10M(:) = XUNDEF - TPPROFILER%XMER10M(:) = XUNDEF - TPPROFILER%XRN (:) = XUNDEF - TPPROFILER%XH (:) = XUNDEF - TPPROFILER%XLE (:) = XUNDEF - TPPROFILER%XLEI (:) = XUNDEF - TPPROFILER%XGFLUX (:) = XUNDEF + 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 @@ -163,6 +165,7 @@ SUBROUTINE STATION_ALLOCATE( TPSTATION, KSTORE ) 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 @@ -219,16 +222,16 @@ SUBROUTINE STATION_ALLOCATE( TPSTATION, KSTORE ) TPSTATION%XSV(:,:) = XUNDEF TPSTATION%XTSRAD(:) = XUNDEF IF ( LDIAG_SURFRAD ) THEN - TPSTATION%XT2M(:) = XUNDEF - TPSTATION%XQ2M(:) = XUNDEF - TPSTATION%XHU2M(:) = XUNDEF - TPSTATION%XZON10M(:) = XUNDEF - TPSTATION%XMER10M(:) = XUNDEF - TPSTATION%XRN(:) = XUNDEF - TPSTATION%XH(:) = XUNDEF - TPSTATION%XLE(:) = XUNDEF - TPSTATION%XLEI(:) = XUNDEF - TPSTATION%XGFLUX(:) = XUNDEF + 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 @@ -238,7 +241,7 @@ SUBROUTINE STATION_ALLOCATE( TPSTATION, KSTORE ) TPSTATION%XSWDIFF(:) = XUNDEF TPSTATION%XDSTAOD(:) = XUNDEF END IF - TPSTATION%XSFCO2(:) = XUNDEF + TPSTATION%XSFCO2(:) = XUNDEF_SFX END IF END SUBROUTINE STATION_ALLOCATE -- GitLab From ec5e940e79a9fc85966a99a665a4d46a41ce5883 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Fri, 30 Sep 2022 13:52:23 +0200 Subject: [PATCH 109/157] Philippe 30/09/2022: bugfix: write XCURRENT_LWU in LWU field (and not XCURRENT_LWD) --- src/MNH/write_lfifm1_for_diag_supp.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/MNH/write_lfifm1_for_diag_supp.f90 b/src/MNH/write_lfifm1_for_diag_supp.f90 index fe258339c..1412e986d 100644 --- a/src/MNH/write_lfifm1_for_diag_supp.f90 +++ b/src/MNH/write_lfifm1_for_diag_supp.f90 @@ -963,7 +963,7 @@ IF (CSURF=='EXTE') THEN NTYPE = TYPEREAL, & NDIMS = 2, & LTIMEDEP = .TRUE. ) - CALL IO_Field_write(TPFILE,TZFIELD,XCURRENT_LWD) + CALL IO_Field_write(TPFILE,TZFIELD,XCURRENT_LWU) END IF END IF -- GitLab From 1d3bf289886b30794f70a78d04d14b735fc73496 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Thu, 6 Oct 2022 09:21:23 +0200 Subject: [PATCH 110/157] Philippe 06/10/2022: small fixes for ForeFire --- src/LIB/FOREFIRE/coupling_forefiren.f90 | 49 +++++++++++++------------ src/MNH/ini_one_wayn.f90 | 6 ++- src/MNH/one_wayn.f90 | 6 ++- 3 files changed, 33 insertions(+), 28 deletions(-) diff --git a/src/LIB/FOREFIRE/coupling_forefiren.f90 b/src/LIB/FOREFIRE/coupling_forefiren.f90 index 8d5dde80b..0791f7f1c 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/MNH/ini_one_wayn.f90 b/src/MNH/ini_one_wayn.f90 index 78e025b2a..c18ff402a 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/one_wayn.f90 b/src/MNH/one_wayn.f90 index eac7238d6..aa78ac781 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 -- GitLab From 1781167e4d5dfb7601bafd18c1831eb204a393de Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Fri, 21 Oct 2022 16:01:35 +0200 Subject: [PATCH 111/157] Philippe 21/10/2022: init XTSRAD to XUNDEF from SURFEX --- src/MNH/ini_aircraft_balloon.f90 | 3 ++- src/MNH/ini_modeln.f90 | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/MNH/ini_aircraft_balloon.f90 b/src/MNH/ini_aircraft_balloon.f90 index 6191e60d5..7509894df 100644 --- a/src/MNH/ini_aircraft_balloon.f90 +++ b/src/MNH/ini_aircraft_balloon.f90 @@ -177,6 +177,7 @@ CONTAINS !---------------------------------------------------------------------------- SUBROUTINE ALLOCATE_FLYER(TPFLYER) ! +USE MODD_SURF_PAR, ONLY: XUNDEF_SFX => XUNDEF ! CLASS(TFLYERDATA), INTENT(INOUT) :: TPFLYER ! @@ -262,7 +263,7 @@ TPFLYER%XCRARE_ATT = XUNDEF TPFLYER%XWZ = XUNDEF TPFLYER%XZZ = XUNDEF TPFLYER%XTKE = XUNDEF -TPFLYER%XTSRAD = XUNDEF +TPFLYER%XTSRAD = XUNDEF_SFX TPFLYER%XZS = XUNDEF TPFLYER%XTKE_DISS = XUNDEF ! diff --git a/src/MNH/ini_modeln.f90 b/src/MNH/ini_modeln.f90 index 258172aeb..81161434a 100644 --- a/src/MNH/ini_modeln.f90 +++ b/src/MNH/ini_modeln.f90 @@ -394,6 +394,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 @@ -1494,7 +1495,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)) -- GitLab From c71972c237c6fff23c1be8c91ef4ddd279411605 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Fri, 21 Oct 2022 16:14:57 +0200 Subject: [PATCH 112/157] Philippe 21/10/2022: bugfix: ground_param_n: communicate halo values between processes for OUT variables --- src/MNH/ground_paramn.f90 | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/MNH/ground_paramn.f90 b/src/MNH/ground_paramn.f90 index 44ab4453a..986441cfd 100644 --- a/src/MNH/ground_paramn.f90 +++ b/src/MNH/ground_paramn.f90 @@ -114,6 +114,7 @@ END MODULE MODI_GROUND_PARAM_n ! 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 @@ -352,6 +353,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 ! @@ -745,6 +747,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 )' ) JSV + 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 )' ) JSV + 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 ! ----------- -- GitLab From 63c8001087ace0d7c32f4bf64f398ac51262b0d2 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Thu, 27 Oct 2022 09:54:53 +0200 Subject: [PATCH 113/157] Philippe 27/10/2022: datetime: add + operator via DATETIME_TIME_ADD subroutine --- src/MNH/mode_datetime.f90 | 34 ++++++++++++++++++++++++++++------ 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/src/MNH/mode_datetime.f90 b/src/MNH/mode_datetime.f90 index fc9f68267..2d999f564 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-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,6 +7,7 @@ ! 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 + operator via DATETIME_TIME_ADD subroutine !----------------------------------------------------------------- MODULE MODE_DATETIME ! @@ -21,6 +22,7 @@ PRIVATE PUBLIC :: DATETIME_DISTANCE, DATETIME_CORRECTDATE 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.) @@ -34,6 +36,10 @@ INTERFACE OPERATOR(>=) MODULE PROCEDURE DATETIME_GE END INTERFACE ! +INTERFACE OPERATOR(+) + MODULE PROCEDURE DATETIME_TIME_ADD +END INTERFACE +! CONTAINS ! SUBROUTINE DATETIME_TIME2REFERENCE( TPDATE, KDAYS, PSEC ) @@ -140,7 +146,7 @@ PDIST = REAL( ( IDAYSEND - IDAYSBEG ) * (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 +238,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 @@ -256,7 +262,7 @@ END SELECT END SUBROUTINE DATETIME_GETMONTHLGT ! ! -FUNCTION DATETIME_LT(TPT1, TPT2) RESULT (OLT) +ELEMENTAL FUNCTION DATETIME_LT(TPT1, TPT2) RESULT (OLT) IMPLICIT NONE LOGICAL :: OLT TYPE(DATE_TIME), INTENT(IN) :: TPT1, TPT2 @@ -281,7 +287,7 @@ ENDIF END FUNCTION DATETIME_LT ! ! -FUNCTION DATETIME_GE(TPT1, TPT2) RESULT (OLT) +ELEMENTAL FUNCTION DATETIME_GE(TPT1, TPT2) RESULT (OLT) IMPLICIT NONE LOGICAL :: OLT TYPE(DATE_TIME), INTENT(IN) :: TPT1, TPT2 @@ -291,5 +297,21 @@ TYPE(DATE_TIME), INTENT(IN) :: TPT1, TPT2 OLT = .NOT.DATETIME_LT(TPT1,TPT2) ! END FUNCTION DATETIME_GE -! + + +ELEMENTAL 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 + END MODULE MODE_DATETIME -- GitLab From ce2bd9405410894bb33870d1976bfbc746ff7cc6 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Thu, 27 Oct 2022 10:56:19 +0200 Subject: [PATCH 114/157] Philippe 27/10/2022: datetime: add <= and > operators and improve older comparison subroutines (more robust but slower) --- src/MNH/mode_datetime.f90 | 117 +++++++++++++++++++++++++++++++++----- 1 file changed, 104 insertions(+), 13 deletions(-) diff --git a/src/MNH/mode_datetime.f90 b/src/MNH/mode_datetime.f90 index 2d999f564..2ccc4700b 100644 --- a/src/MNH/mode_datetime.f90 +++ b/src/MNH/mode_datetime.f90 @@ -7,7 +7,7 @@ ! 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 + operator via DATETIME_TIME_ADD subroutine +! P. Wautelet 27/10/2022: add +, <= and > operators and improve older comparison subroutines (more robust but slower) !----------------------------------------------------------------- MODULE MODE_DATETIME ! @@ -21,6 +21,8 @@ PRIVATE ! PUBLIC :: DATETIME_DISTANCE, DATETIME_CORRECTDATE PUBLIC :: OPERATOR(<) +PUBLIC :: OPERATOR(<=) +PUBLIC :: OPERATOR(>) PUBLIC :: OPERATOR(>=) PUBLIC :: OPERATOR(+) ! @@ -32,6 +34,14 @@ 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 @@ -260,16 +270,23 @@ SELECT CASE(KMONTH) END SELECT ! END SUBROUTINE DATETIME_GETMONTHLGT + + +FUNCTION DATETIME_LT(TPT1, TPT2) RESULT (OLT) ! +! TRUE if TPT1 .LT. TPT2 ! -ELEMENTAL FUNCTION DATETIME_LT(TPT1, TPT2) RESULT (OLT) IMPLICIT NONE -LOGICAL :: OLT + TYPE(DATE_TIME), INTENT(IN) :: TPT1, TPT2 -! -! TRUE if TPT1 .LT. 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 @@ -283,23 +300,97 @@ 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 ! -ELEMENTAL 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 -ELEMENTAL FUNCTION DATETIME_TIME_ADD( TPIN, PTIME ) RESULT ( TPOUT ) +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 -- GitLab From d903a9da22e670e13e45c3dee116d69c79e60d94 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Thu, 27 Oct 2022 17:03:02 +0200 Subject: [PATCH 115/157] Philippe 27/10/2022: datetime: add - operator via DATETIME_TIME_SUBSTRACT subroutine --- src/MNH/mode_datetime.f90 | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/src/MNH/mode_datetime.f90 b/src/MNH/mode_datetime.f90 index 2ccc4700b..07e9c816b 100644 --- a/src/MNH/mode_datetime.f90 +++ b/src/MNH/mode_datetime.f90 @@ -7,7 +7,7 @@ ! 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 27/10/2022: add +, -, <= and > operators and improve older comparison subroutines (more robust but slower) !----------------------------------------------------------------- MODULE MODE_DATETIME ! @@ -25,6 +25,7 @@ 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.) @@ -50,6 +51,10 @@ 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 ) @@ -405,4 +410,20 @@ 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 -- GitLab From d6efb9ad5424e954ae7439431de349733b8988a8 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Fri, 28 Oct 2022 15:40:10 +0200 Subject: [PATCH 116/157] Philippe 28/10/2022: small bugfix: use correct index for YJSV --- src/MNH/ground_paramn.f90 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/MNH/ground_paramn.f90 b/src/MNH/ground_paramn.f90 index 986441cfd..1be86f91f 100644 --- a/src/MNH/ground_paramn.f90 +++ b/src/MNH/ground_paramn.f90 @@ -761,12 +761,12 @@ NULLIFY(TZFIELDSURF_ll) ! 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 )' ) JSV + 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 )' ) JSV + 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' ) -- GitLab From 77c16c01768f2624c578effb5d2340d3b7b53864 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Wed, 16 Nov 2022 11:43:55 +0100 Subject: [PATCH 117/157] Philippe 16/11/2022: profilers: rename VISI -> VISIGUL + compute visibilities only when it has a meaning (there were NaN if not...) --- src/MNH/modd_type_statprof.f90 | 2 +- src/MNH/profilern.f90 | 27 +++++++++++++++------------ src/MNH/statprof_tools.f90 | 16 ++++++++++++---- src/MNH/write_profilern.f90 | 26 +++++++++++++++++++------- 4 files changed, 47 insertions(+), 24 deletions(-) diff --git a/src/MNH/modd_type_statprof.f90 b/src/MNH/modd_type_statprof.f90 index a95c1e11c..8b8a7cffb 100644 --- a/src/MNH/modd_type_statprof.f90 +++ b/src/MNH/modd_type_statprof.f90 @@ -134,7 +134,7 @@ TYPE, EXTENDS( TSTATPROFDATA ) :: TPROFILERDATA REAL, DIMENSION(:,:), ALLOCATABLE :: XTKE ! tke(n) REAL, DIMENSION(:,:), ALLOCATABLE :: XTH ! th(n) REAL, DIMENSION(:,:), ALLOCATABLE :: XTHV ! thv(n) - REAL, DIMENSION(:,:), ALLOCATABLE :: XVISI ! VISI(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) diff --git a/src/MNH/profilern.f90 b/src/MNH/profilern.f90 index 7226a452d..924527d0b 100644 --- a/src/MNH/profilern.f90 +++ b/src/MNH/profilern.f90 @@ -91,7 +91,7 @@ END MODULE MODI_PROFILER_n USE MODD_CST, ONLY: XCPD, XG, XLAM_CRAD, XLIGHTSPEED, XP00, XPI, XRD, XRHOLW, XRV, XTT USE MODD_DIAG_IN_RUN USE MODD_GRID, ONLY: XBETA, XLON0, XRPK -USE MODD_NSV, ONLY: NSV_C2R2BEG, NSV_C2R2END, NSV_LIMA_NC, NSV_LIMA_NI, NSV_LIMA_NR +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_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, & @@ -199,7 +199,7 @@ REAL :: ZZWDR ! ZWD correction at station location ! REAL,DIMENSION(SIZE(PTH,1),SIZE(PTH,2)) :: ZZTD,ZZHD,ZZWD 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)) :: ZVISI,ZVISIKUN +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 ! @@ -262,19 +262,22 @@ 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 ! PROFILER: DO JP = 1, NUMBPROFILER_LOC ZZ(:) = STATPROF_INTERP_3D( TPROFILERS(JP), PZ ) @@ -369,8 +372,8 @@ PROFILER: DO JP = 1, NUMBPROFILER_LOC 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 ) - TPROFILERS(JP)%XVISI(IN,:) = STATPROF_INTERP_3D( TPROFILERS(JP), ZVISI ) - TPROFILERS(JP)%XVISIKUN(IN,:) = STATPROF_INTERP_3D( TPROFILERS(JP), ZVISIKUN ) + 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' ) & diff --git a/src/MNH/statprof_tools.f90 b/src/MNH/statprof_tools.f90 index a1daff569..af3bc1eb8 100644 --- a/src/MNH/statprof_tools.f90 +++ b/src/MNH/statprof_tools.f90 @@ -66,8 +66,16 @@ SUBROUTINE PROFILER_ALLOCATE( TPPROFILER, KSTORE ) END IF ALLOCATE( TPPROFILER%XTH (KSTORE, IKU) ) ALLOCATE( TPPROFILER%XTHV (KSTORE, IKU) ) - ALLOCATE( TPPROFILER%XVISI (KSTORE, IKU) ) - ALLOCATE( TPPROFILER%XVISIKUN (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 @@ -117,8 +125,8 @@ SUBROUTINE PROFILER_ALLOCATE( TPPROFILER, KSTORE ) IF ( CTURB == 'TKEL' ) TPPROFILER%XTKE(:,:) = XUNDEF TPPROFILER%XTH (:,:) = XUNDEF TPPROFILER%XTHV (:,:) = XUNDEF - TPPROFILER%XVISI (:,:) = XUNDEF - TPPROFILER%XVISIKUN (:,:) = 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 diff --git a/src/MNH/write_profilern.f90 b/src/MNH/write_profilern.f90 index acda0bf50..62264efab 100644 --- a/src/MNH/write_profilern.f90 +++ b/src/MNH/write_profilern.f90 @@ -140,7 +140,9 @@ CALL PROFILER_ALLOCATE( TZPROFILER, SIZE( tprofilers_time%tpdates ) ) IF ( ISNPROC > 1 ) THEN ISTORE = SIZE( TPROFILERS_TIME%TPDATES ) IPACKSIZE = 6 - IPACKSIZE = IPACKSIZE + ISTORE * IKU * ( 16 + NRR + NSV + NAER ) + 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 @@ -186,8 +188,12 @@ PROFILER: DO JS = 1, INUMPROF 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 - ZPACK(IPOS:IPOS+ISTORE*IKU-1) = RESHAPE( TPROFILERS(IDX)%XVISI(:,:), [ISTORE*IKU] ) ; IPOS = IPOS + ISTORE * IKU - ZPACK(IPOS:IPOS+ISTORE*IKU-1) = RESHAPE( TPROFILERS(IDX)%XVISIKUN(:,:), [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 @@ -264,8 +270,12 @@ PROFILER: DO JS = 1, INUMPROF 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 - TZPROFILER%XVISI(:,:) = RESHAPE( ZPACK(IPOS:IPOS+ISTORE*IKU-1), [ ISTORE, IKU ] ) ; IPOS = IPOS + ISTORE * IKU - TZPROFILER%XVISIKUN(:,:) = 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 @@ -393,8 +403,10 @@ jproc = 0 call Add_profile( 'Th', 'Potential temperature', 'K', tpprofiler%xth ) call Add_profile( 'Thv', 'Virtual Potential temperature', 'K', tpprofiler%xthv ) -call Add_profile( 'VISI', 'Visibility', 'km', tpprofiler%xvisi ) -call Add_profile( 'VISIKUN', 'Visibility Kunkel', 'km', tpprofiler%xvisikun ) +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 ) -- GitLab From 66bc293eb7b4ee6273dea21b1f38ff3bd32b0a76 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Fri, 18 Nov 2022 14:20:45 +0100 Subject: [PATCH 118/157] Philippe 18/11/2022: TPREFERENCE_DATE is now public --- src/MNH/mode_datetime.f90 | 1 + 1 file changed, 1 insertion(+) diff --git a/src/MNH/mode_datetime.f90 b/src/MNH/mode_datetime.f90 index 07e9c816b..5c73ea3ca 100644 --- a/src/MNH/mode_datetime.f90 +++ b/src/MNH/mode_datetime.f90 @@ -20,6 +20,7 @@ IMPLICIT NONE PRIVATE ! PUBLIC :: DATETIME_DISTANCE, DATETIME_CORRECTDATE +PUBLIC :: TPREFERENCE_DATE PUBLIC :: OPERATOR(<) PUBLIC :: OPERATOR(<=) PUBLIC :: OPERATOR(>) -- GitLab From 6998685ff6b542858656a7e139e68ce316ee2f41 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Fri, 25 Nov 2022 09:08:12 +0100 Subject: [PATCH 119/157] Philippe 25/11/2022: rewrite STATPROF_INSTANT algorithm (does not depends on model timestep anymore => independent of model) --- src/MNH/statprof_tools.f90 | 36 +++++++++++++++++++----------------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/src/MNH/statprof_tools.f90 b/src/MNH/statprof_tools.f90 index af3bc1eb8..0d1de4a16 100644 --- a/src/MNH/statprof_tools.f90 +++ b/src/MNH/statprof_tools.f90 @@ -9,6 +9,7 @@ !----------------------------------------------------------------- ! 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 @@ -729,10 +730,9 @@ END FUNCTION STATPROF_INTERP_3D_V ! ################################################# SUBROUTINE STATPROF_INSTANT( TPSTATPROF_TIME, KIN ) ! ################################################# - USE MODD_DYN_n, ONLY: XTSTEP - USE MODD_PARAMETERS, ONLY: XUNDEF USE MODD_TIME_n, ONLY: TDTCUR + USE MODE_DATETIME USE MODE_MSG IMPLICIT NONE @@ -740,24 +740,26 @@ SUBROUTINE STATPROF_INSTANT( TPSTATPROF_TIME, KIN ) TYPE(TSTATPROFTIME), INTENT(INOUT) :: TPSTATPROF_TIME INTEGER, INTENT(OUT) :: KIN ! Current step of storage - IF ( TPSTATPROF_TIME%XTIME_CUR == XUNDEF ) TPSTATPROF_TIME%XTIME_CUR = TPSTATPROF_TIME%XTSTEP - XTSTEP - - TPSTATPROF_TIME%XTIME_CUR = TPSTATPROF_TIME%XTIME_CUR + XTSTEP - - IF ( TPSTATPROF_TIME%XTIME_CUR >= TPSTATPROF_TIME%XTSTEP - 1.E-10 ) THEN - TPSTATPROF_TIME%XTIME_CUR = TPSTATPROF_TIME%XTIME_CUR - TPSTATPROF_TIME%XTSTEP - TPSTATPROF_TIME%N_CUR = TPSTATPROF_TIME%N_CUR + 1 - KIN = TPSTATPROF_TIME%N_CUR + 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 + 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 - TPSTATPROF_TIME%TPDATES(KIN) = TDTCUR + ! Return an invalid step number + KIN = -1 END IF - ELSE - ! Return an invalid step number - KIN = -1 END IF END SUBROUTINE STATPROF_INSTANT -- GitLab From 1b9d5f05dfa9b1dd11e52e7dbe0d6e7cc2d03efe Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Fri, 25 Nov 2022 09:21:14 +0100 Subject: [PATCH 120/157] Philippe 25/11/2022: remove XTIME_CUR (in TSTATPROFTIME derived type) --- src/MNH/modd_type_statprof.f90 | 1 - 1 file changed, 1 deletion(-) diff --git a/src/MNH/modd_type_statprof.f90 b/src/MNH/modd_type_statprof.f90 index 8b8a7cffb..24d4d7e19 100644 --- a/src/MNH/modd_type_statprof.f90 +++ b/src/MNH/modd_type_statprof.f90 @@ -47,7 +47,6 @@ public :: TSTATPROFTIME public :: TPROFILERDATA, TSTATIONDATA, TSTATPROFDATA TYPE :: TSTATPROFTIME - REAL :: XTIME_CUR = XUNDEF ! current time since last storage 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) -- GitLab From 4dfb0f703247a6056941934f600aa3db5752362e Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Fri, 25 Nov 2022 13:39:01 +0100 Subject: [PATCH 121/157] Philippe 25/11/2022: add tools fo find rank and model number corresponding to a given position --- src/MNH/position_tools.f90 | 230 +++++++++++++++++++++++++++++++++++++ 1 file changed, 230 insertions(+) create mode 100644 src/MNH/position_tools.f90 diff --git a/src/MNH/position_tools.f90 b/src/MNH/position_tools.f90 new file mode 100644 index 000000000..2fb03e7d5 --- /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 -- GitLab From 5d826f73ef7ea07aab50bb9c02ca667a06117165 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Fri, 25 Nov 2022 15:11:32 +0100 Subject: [PATCH 122/157] Philippe 25/11/2022: rewrite of aircraft_balloon_evol First version: some cleaning, deduplication and optimisation not yet done --- src/MNH/aircraft_balloon.f90 | 38 +- src/MNH/aircraft_balloon_evol.f90 | 2816 +++++++++++++++++------------ src/MNH/diag.f90 | 20 +- src/MNH/ini_aircraft.f90 | 44 +- src/MNH/ini_aircraft_balloon.f90 | 121 +- src/MNH/ini_balloon.f90 | 6 +- src/MNH/modd_aircraft_balloon.f90 | 44 +- src/MNH/modeln.f90 | 14 +- 8 files changed, 1807 insertions(+), 1296 deletions(-) diff --git a/src/MNH/aircraft_balloon.f90 b/src/MNH/aircraft_balloon.f90 index 02b18e25d..a43f04c53 100644 --- a/src/MNH/aircraft_balloon.f90 +++ b/src/MNH/aircraft_balloon.f90 @@ -9,15 +9,12 @@ MODULE MODI_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) + SUBROUTINE AIRCRAFT_BALLOON(PTSTEP, 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 @@ -31,11 +28,9 @@ 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 +REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PSEA ! !------------------------------------------------------------------------------- ! @@ -52,13 +47,12 @@ 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) -! ################################################################### +! ################################################################# + 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 @@ -101,8 +95,8 @@ END MODULE MODI_AIRCRAFT_BALLOON USE MODD_AIRCRAFT_BALLOON ! USE MODD_TURB_FLUX_AIRCRAFT_BALLOON -USE MODI_AIRCRAFT_BALLOON_EVOL ! +USE MODE_AIRCRAFT_BALLOON_EVOL, ONLY: AIRCRAFT_BALLOON_EVOL USE MODE_ll ! ! @@ -113,8 +107,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 @@ -130,7 +122,7 @@ 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 ! !------------------------------------------------------------------------------- ! @@ -146,13 +138,13 @@ IF(.NOT. ALLOCATED(XSVW_FLUX)) & ALLOCATE(XSVW_FLUX(SIZE(PSV,1),SIZE(PSV,2),SIZE(PSV,3),SIZE(PSV,4))) ! DO JI = 1, NBALLOONS - CALL AIRCRAFT_BALLOON_EVOL( PTSTEP, PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & + CALL AIRCRAFT_BALLOON_EVOL( PTSTEP, PZ, PMAP, PLONOR, PLATOR, & PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT, & TBALLOONS(JI), PSEA ) END DO ! DO JI = 1, NAIRCRAFTS - CALL AIRCRAFT_BALLOON_EVOL( PTSTEP, PXHAT, PYHAT, PZ, PMAP, PLONOR, PLATOR, & + CALL AIRCRAFT_BALLOON_EVOL( PTSTEP, PZ, PMAP, PLONOR, PLATOR, & PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT, & TAIRCRAFTS(JI), PSEA ) END DO diff --git a/src/MNH/aircraft_balloon_evol.f90 b/src/MNH/aircraft_balloon_evol.f90 index 6a81850ba..5b52ea22f 100644 --- a/src/MNH/aircraft_balloon_evol.f90 +++ b/src/MNH/aircraft_balloon_evol.f90 @@ -4,59 +4,27 @@ !MNH_LIC for details. version 1. !----------------------------------------------------------------- ! ########################## -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 -! -CLASS(TFLYERDATA), 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 + +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 ) ! ######################################################## ! ! -!!**** *AIRCRAFT_BALLOON_EVOL* - (advects and) stores +!!**** *AIRCRAFT_BALLOON_EVOL* - (advects and) stores !! balloons/aircrafts in the model !! !! PURPOSE @@ -65,7 +33,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 +54,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 !! -------- @@ -115,7 +83,7 @@ END MODULE MODI_AIRCRAFT_BALLOON_EVOL !! 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 +!! 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 @@ -129,7 +97,7 @@ END MODULE MODI_AIRCRAFT_BALLOON_EVOL ! -do not use PMAP if cartesian domain ! P. Wautelet 06/2022: reorganize flyers !! -------------------------------------------------------------------------- -! +! !* 0. DECLARATIONS ! ------------ ! @@ -138,7 +106,8 @@ USE MODD_CONF USE MODD_CST USE MODD_DIAG_IN_RUN USE MODD_GRID -USE MODD_GRID_n, ONLY: XXHATM, XYHATM +USE MODD_GRID_n +USE MODD_IO, ONLY: ISP USE MODD_LUNIT_n, ONLY: TLUOUT USE MODD_NESTING USE MODD_NSV, ONLY : NSV_LIMA_NI,NSV_LIMA_NR,NSV_LIMA_NC @@ -167,7 +136,7 @@ USE MODD_RAIN_ICE_DESCR, ONLY: XALPHAR_I=>XALPHAR,XNUR_I=>XNUR,XLBEXR_I=>XLBEX 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, only: TDTSEG USE MODD_TIME_n, only: tdtcur USE MODD_TURB_FLUX_AIRCRAFT_BALLOON ! @@ -176,7 +145,7 @@ USE MODE_FGAU, ONLY: GAULAG USE MODE_FSCATTER, ONLY: QEPSW,QEPSI,BHMIE,MOMG,MG USE MODE_GRIDPROJ USE MODE_ll -USE MODE_MSG +USE MODE_POSITION_TOOLS, ONLY: FIND_PROCESS_AND_MODEL_FROM_XY_POS USE MODE_STATPROF_TOOLS, ONLY: STATPROF_INSTANT ! USE MODI_GAMMA, ONLY: GAMMA @@ -189,8 +158,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 @@ -208,7 +175,7 @@ REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! dry air density of the re REAL, DIMENSION(:,:,:), INTENT(IN) :: PCIT ! pristine ice concentration ! CLASS(TFLYERDATA), INTENT(INOUT) :: TPFLYER! balloon/aircraft -REAL, DIMENSION(:,:), INTENT(IN) :: PSEA +REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PSEA ! !------------------------------------------------------------------------------- ! @@ -218,7 +185,7 @@ 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 :: IIB ! current process domain sizes INTEGER :: IJB INTEGER :: IIE INTEGER :: IJE @@ -241,7 +208,7 @@ 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 ! @@ -249,45 +216,45 @@ 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 +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 :: IDU ! difference between II_U and II_M +INTEGER :: IDV ! difference between IJ_V and IJ_M +! +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 +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 INTEGER :: JLOOP,JLOOP2 ! loop counter ! REAL :: ZU_BAL ! horizontal wind speed at balloon location (along x) @@ -308,7 +275,7 @@ 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,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 ! generic microphysical parameters INTEGER :: JJ ! loop counter for quadrature @@ -324,318 +291,908 @@ 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%CMODEL /= 'FIX' .AND. COUNT( NDAD(:) == IMI ) /= 0 & - .AND. ( TPFLYER%NMODEL == IMI .OR. NDAD(TPFLYER%NMODEL) == IMI ) & - .AND. TPFLYER%XX_CUR /= XUNDEF .AND. TPFLYER%XY_CUR /= XUNDEF & - .AND. TPFLYER%LFLY .AND. .NOT. TPFLYER%LCRASH & - .AND. CPROGRAM == 'MESONH' ) THEN - CALL FLYER_CHANGE_MODEL( IMI ) -ENDIF -! -IF ( TPFLYER%NMODEL /= IMI ) RETURN ! +INTEGER :: IRANK +INTEGER :: IMODEL +INTEGER :: IMODEL_OLD +REAL :: ZX_OLD, ZY_OLD +REAL :: ZDELTATIME +REAL :: ZTSTEP +REAL :: ZDIVTMP + !---------------------------------------------------------------------------- -! -!* 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) -! -!---------------------------------------------------------------------------- -! -!* 2.3 Compute time until launch by comparison of dates and times -! ---------------------------------------------------------- -! -CALL DATETIME_DISTANCE( TPFLYER%TLAUNCH, TDTCUR, ZTDIST ) -! -!* 3. LAUNCH -! ------ -! -GLAUNCH = .FALSE. -! -! -IF ( .NOT. TPFLYER%LFLY ) THEN -! -!* 3.2 launch/takeoff is effective -! --------------------------- -! - IF (ZTDIST >= - PTSTEP ) THEN - SELECT TYPE ( TPFLYER ) - CLASS IS ( TAIRCRAFTDATA) -! -!* 3.2.1 Determination of flight segment -! ------------------------------- -! - TPFLYER%NSEGCURN = 1 - IL = TPFLYER%NSEGCURN - ! - TPFLYER%XSEGCURT = ZTDIST - ! - DO WHILE (TPFLYER%XSEGCURT>TPFLYER%XSEGTIME(IL) .AND. IL <= TPFLYER%NSEG) - TPFLYER%NSEGCURN = TPFLYER%NSEGCURN + 1 - IL = TPFLYER%NSEGCURN - TPFLYER%XSEGCURT = TPFLYER%XSEGCURT - TPFLYER%XSEGTIME(IL-1) - IF (IL>TPFLYER%NSEG) EXIT + +CALL GET_MODEL_NUMBER_ll(IMI) + +SELECT TYPE ( TPFLYER ) + CLASS IS ( TAIRCRAFTDATA) + + !Do the positioning only if model 1 (data will be available to others after) + MODEL1: IF ( IMI == 1 ) THEN + !Do we have to store aircraft data? + CALL STATPROF_INSTANT( TPFLYER%TFLYER_TIME, ISTORE ) + IF ( ISTORE < 1 ) THEN + !No profiler storage at this time step + TPFLYER%LSTORE = .FALSE. + RETURN + ELSE + TPFLYER%LSTORE = .TRUE. + END IF + + ! Is the aircraft in flight ? + IF ( TDTCUR >= TPFLYER%TLAUNCH .AND. TDTCUR <= TPFLYER%TLAND ) THEN + TPFLYER%LFLY = .TRUE. + + ! Find the flight segment + ZTDIST = TDTCUR - TPFLYER%TLAUNCH + IL = TPFLYER%NPOSCUR + DO WHILE ( ZTDIST > TPFLYER%XPOSTIME(IL+1) ) + IL = IL + 1 + IF ( IL > TPFLYER%NPOS-1 ) THEN + !Security (should not happen) + IL = TPFLYER%NPOS-1 + EXIT + END IF END DO - ! - !* end of flight - ! - IF (IL > TPFLYER%NSEG) THEN - TPFLYER%LFLY = .FALSE. + TPFLYER%NPOSCUR = IL + + ! Compute the current position + ZSEG_FRAC = ( ZTDIST - TPFLYER%XPOSTIME(IL) ) / ( TPFLYER%XPOSTIME(IL+1) - TPFLYER%XPOSTIME(IL) ) + + TPFLYER%XX_CUR = (1.-ZSEG_FRAC) * TPFLYER%XPOSX(IL ) & + + ZSEG_FRAC * TPFLYER%XPOSX(IL+1) + TPFLYER%XY_CUR = (1.-ZSEG_FRAC) * TPFLYER%XPOSY(IL ) & + + ZSEG_FRAC * TPFLYER%XPOSY(IL+1) + IF (TPFLYER%LALTDEF) THEN + TPFLYER%XP_CUR = (1.-ZSEG_FRAC) * TPFLYER%XPOSP(IL ) & + + ZSEG_FRAC * TPFLYER%XPOSP(IL+1) ELSE - TPFLYER%LFLY = .TRUE. - GLAUNCH = .TRUE. - TPFLYER%LCRASH =.FALSE. - IF (ZTDIST <= PTSTEP ) THEN - WRITE(ILUOUT,*) '-------------------------------------------------------------------' - WRITE(ILUOUT,*) 'Aircraft ',TPFLYER%CTITLE,' takes off the ', & - TDTCUR%nday,'/',TDTCUR%nmonth,'/', & - TDTCUR%nyear,' at ',NINT(TDTCUR%xtime),' sec.' - WRITE(ILUOUT,*) '-------------------------------------------------------------------' - ENDIF - ENDIF - - CLASS IS ( TBALLOONDATA) - IF (ZTDIST <= PTSTEP ) THEN - TPFLYER%LFLY = .TRUE. - GLAUNCH = .TRUE. - WRITE(ILUOUT,*) '-------------------------------------------------------------------' - WRITE(ILUOUT,*) 'Balloon ',TPFLYER%CTITLE,' is launched the ', & - TDTCUR%nday,'/',TDTCUR%nmonth,'/', & - TDTCUR%nyear,' at ',NINT(TDTCUR%xtime),' sec.' - WRITE(ILUOUT,*) '-------------------------------------------------------------------' + TPFLYER%XZ_CUR = (1.-ZSEG_FRAC) * TPFLYER%XPOSZ(IL ) & + + ZSEG_FRAC * TPFLYER%XPOSZ(IL +1 ) END IF - CLASS DEFAULT - CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'AIRCRAFT_BALLOON_EVOL', 'unknown type for TPFLYER', OLOCAL = .TRUE. ) - - END SELECT -! -!* 3.3 Initial horizontal positions -! ---------------------------- -! - SELECT TYPE ( TPFLYER ) - CLASS IS ( TBALLOONDATA) - IF ( TPFLYER%CTYPE == 'RADIOS' .OR. TPFLYER%CTYPE == 'ISODEN' .OR. TPFLYER%CTYPE == 'CVBALL' ) THEN - TPFLYER%XX_CUR = TPFLYER%XXLAUNCH - TPFLYER%XY_CUR = TPFLYER%XYLAUNCH + ! Get rank of the process where the aircraft is and the model number + IF ( TPFLYER%CMODEL == 'FIX' ) THEN + IMODEL = TPFLYER%NMODEL + ELSE + IMODEL = 0 + END IF + CALL FIND_PROCESS_AND_MODEL_FROM_XY_POS( TPFLYER%XX_CUR, TPFLYER%XY_CUR, IRANK, IMODEL ) + IF ( IRANK < 1 ) THEN + TPFLYER%NMODEL = 1 !Set to 1 because it is always a valid model (to prevent crash if NDAD(TPFLYER%NMODEL) ) + TPFLYER%LCRASH = .TRUE. + TPFLYER%NCRASH = NCRASH_OUT_HORIZ + TPFLYER%LFLY = .FALSE. + ELSE + TPFLYER%NMODEL = IMODEL + TPFLYER%LCRASH = .FALSE. + TPFLYER%NCRASH = NCRASH_NO + TPFLYER%NRANK_CUR = IRANK END IF + ELSE + TPFLYER%LFLY = .FALSE. - CLASS IS ( TAIRCRAFTDATA) -! -! -!* 3.3.2 Determination of initial position -! ----------------------------- -! - IF (TPFLYER%LFLY) THEN - ZSEG_FRAC = TPFLYER%XSEGCURT / TPFLYER%XSEGTIME(IL) + END IF + END IF MODEL1 + + IF ( IMI == TPFLYER%NMODEL .AND. TPFLYER%LFLY ) THEN + ! 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 + + ISOWNER: IF ( TPFLYER%NRANK_CUR == ISP ) THEN + ZTHIS_PROC = 1. + ! + !* 2. PRELIMINARIES-2 + ! ------------- + ! + !* 2.1 Indices + ! ------- + ! + CALL GET_INDICE_ll (IIB,IJB,IIE,IJE) + + IKB = 1 + JPVEXT + IKE = SIZE(PZ,3) - JPVEXT + ! + ! + !* 2.2 Interpolations of model variables to mass points + ! ------------------------------------------------ + ! + IIU=SIZE(XXHAT) + IJU=SIZE(XYHAT) + ! 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 ) + ! + !* 4.5 Interpolations of model variables to mass points + ! ------------------------------------------------ + ! + 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) + ! + !---------------------------------------------------------------------------- + ! + !* 5. BALLOON/AIRCRAFT VERTICAL POSITION + ! ---------------------------------- + ! + ! + !* 5.1 Density + ! ------- + ! + ZEXN(:,:,: ) = (PP(II_M:II_M+1,IJ_M:IJ_M+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) + END DO + ! + ! IF ( TPFLYER%CTYPE == 'ISODEN' .OR. TPFLYER%CTYPE == 'CVBALL' .OR. TPFLYER%CTYPE == 'AIRCRA' ) THEN + 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,:,:)) ) + ! + ZTV (:,:,:) = ZTHV(:,:,:) * ZEXN(:,:,:) + ZRHO(:,:,:) = PP(II_M:II_M+1,IJ_M:IJ_M+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_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,:,:) + ! END IF + + ! Vertical position + 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 + + 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', 'AIRCRAFT_BALLOON_EVOL', OLOCAL = .TRUE. ) + END IF + + IF (IK00 >= IKE .OR. IK01 >= IKE .OR. IK10 >= IKE .OR. IK11 >= IKE ) THEN + TPFLYER%LCRASH = .TRUE. + TPFLYER%NCRASH = NCRASH_OUT_HIGH + END IF + ! + !* 6. INITIALIZATIONS FOR INTERPOLATIONS + ! ---------------------------------- + ! + !* 6.1 Interpolation coefficient for X + ! ------------------------------- + ! + ZXCOEF = (TPFLYER%XX_CUR - XXHATM(II_M)) / (XXHATM(II_M+1) - XXHATM(II_M)) + ZXCOEF = MAX (0.,MIN(ZXCOEF,1.)) + ! + ! + !* 6.2 Interpolation coefficient for y + ! ------------------------------- + ! + ZYCOEF = (TPFLYER%XY_CUR - XYHATM(IJ_M)) / (XYHATM(IJ_M+1) - XYHATM(IJ_M)) + ZYCOEF = MAX (0.,MIN(ZYCOEF,1.)) + ! + ! + !* 6.3 Interpolation coefficients for the 4 suroundings verticals + ! ---------------------------------------------------------- + ! + ! SELECT TYPE ( TPFLYER ) + ! 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 + ! + ! 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 SELECT + ! + !---------------------------------------------------------------------------- + ! + !* 7. INITIALIZATIONS FOR INTERPOLATIONS OF U AND V + ! --------------------------------------------- + ! + !* 7.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.)) + ! + ! + !* 7.2 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.)) + ! + ! + !* 7.3 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) ) + ! + ! + !* 7.4 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) ) + ! + ! + !* 8. DATA RECORDING + ! -------------- + ! + TPFLYER%NMODELHIST(ISTORE) = TPFLYER%NMODEL + TPFLYER%XX (ISTORE) = TPFLYER%XX_CUR + TPFLYER%XY (ISTORE) = TPFLYER%XY_CUR + TPFLYER%XZ (ISTORE) = TPFLYER%XZ_CUR + ! + 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) + ! + 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) + + 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 + ! Fin Modifs ON + 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(:,:,:)) + ENDIF + ! 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 + 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 + 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 + 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 + 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*ZCC*ZLBDA**ZCX/(4.*GAMMA(ZNU)*.93) + ZAETMP=ZAETMP * XPI *ZCC*ZLBDA**ZCX/(4.*GAMMA(ZNU)) + TPFLYER%XCRARE(ISTORE,JK)=TPFLYER%XCRARE(ISTORE,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%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 + TPFLYER%XCRARE_ATT(ISTORE,JK)=TPFLYER%XCRARE(ISTORE,JK)*ZAETOT + END DO + ! 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 + 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 + + ELSE ISOWNER + + ZTHIS_PROC = 0. + + END IF ISOWNER + +!---------------------------------------------------------------------------- + ! + !* 11. EXCHANGE OF INFORMATION BETWEEN PROCESSES + ! ----------------------------------------- + ! + !* 11.1 current position + ! ---------------- + ! ! - TPFLYER%XX_CUR = (1.-ZSEG_FRAC) * TPFLYER%XSEGX(IL ) & - + ZSEG_FRAC * TPFLYER%XSEGX(IL+1) - TPFLYER%XY_CUR = (1.-ZSEG_FRAC) * TPFLYER%XSEGY(IL ) & - + ZSEG_FRAC * TPFLYER%XSEGY(IL+1) + !* 11.2 data stored + ! ----------- + ! + ! IF ( GSTORE ) THEN + CALL DISTRIBUTE_FLYER_N(TPFLYER%NMODELHIST(ISTORE)) + CALL DISTRIBUTE_FLYER(TPFLYER%XX (ISTORE)) + CALL DISTRIBUTE_FLYER(TPFLYER%XY (ISTORE)) + CALL DISTRIBUTE_FLYER(TPFLYER%XZ (ISTORE)) + CALL DISTRIBUTE_FLYER(TPFLYER%XLON(ISTORE)) + CALL DISTRIBUTE_FLYER(TPFLYER%XLAT(ISTORE)) + CALL DISTRIBUTE_FLYER(TPFLYER%XZON(ISTORE)) + CALL DISTRIBUTE_FLYER(TPFLYER%XMER(ISTORE)) + CALL DISTRIBUTE_FLYER(TPFLYER%XW (ISTORE)) + CALL DISTRIBUTE_FLYER(TPFLYER%XP (ISTORE)) + CALL DISTRIBUTE_FLYER(TPFLYER%XTH (ISTORE)) + DO JLOOP=1,SIZE(PR,4) + CALL DISTRIBUTE_FLYER(TPFLYER%XR (ISTORE,JLOOP)) + END DO + DO JLOOP=1,SIZE(PSV,4) + CALL DISTRIBUTE_FLYER(TPFLYER%XSV (ISTORE,JLOOP)) + END DO + DO JLOOP=1,IKU + CALL DISTRIBUTE_FLYER(TPFLYER%XRTZ (ISTORE,JLOOP)) + DO JLOOP2=1,SIZE(PR,4) + CALL DISTRIBUTE_FLYER(TPFLYER%XRZ (ISTORE,JLOOP,JLOOP2)) + ENDDO + CALL DISTRIBUTE_FLYER(TPFLYER%XFFZ (ISTORE,JLOOP)) + CALL DISTRIBUTE_FLYER(TPFLYER%XCIZ (ISTORE,JLOOP)) + IF (CCLOUD== 'LIMA' ) THEN + CALL DISTRIBUTE_FLYER(TPFLYER%XCRZ (ISTORE,JLOOP)) + CALL DISTRIBUTE_FLYER(TPFLYER%XCCZ (ISTORE,JLOOP)) + ENDIF + CALL DISTRIBUTE_FLYER(TPFLYER%XIWCZ (ISTORE,JLOOP)) + CALL DISTRIBUTE_FLYER(TPFLYER%XLWCZ (ISTORE,JLOOP)) + CALL DISTRIBUTE_FLYER(TPFLYER%XCRARE (ISTORE,JLOOP)) + CALL DISTRIBUTE_FLYER(TPFLYER%XCRARE_ATT (ISTORE,JLOOP)) + CALL DISTRIBUTE_FLYER(TPFLYER%XWZ (ISTORE,JLOOP)) + CALL DISTRIBUTE_FLYER(TPFLYER%XZZ (ISTORE,JLOOP)) + END DO + IF (SIZE(PTKE)>0) CALL DISTRIBUTE_FLYER(TPFLYER%XTKE (ISTORE)) + IF (SIZE(PTS) >0) CALL DISTRIBUTE_FLYER(TPFLYER%XTSRAD(ISTORE)) + IF (LDIAG_IN_RUN) CALL DISTRIBUTE_FLYER(TPFLYER%XTKE_DISS(ISTORE)) + CALL DISTRIBUTE_FLYER(TPFLYER%XZS (ISTORE)) + CALL DISTRIBUTE_FLYER(TPFLYER%XTHW_FLUX(ISTORE)) + CALL DISTRIBUTE_FLYER(TPFLYER%XRCW_FLUX(ISTORE)) + DO JLOOP=1,SIZE(PSV,4) + CALL DISTRIBUTE_FLYER(TPFLYER%XSVW_FLUX(ISTORE,JLOOP)) + END DO END IF - END SELECT - END IF -END IF -! -!* 3.4 instant of storage -! ------------------ -! -CALL STATPROF_INSTANT( TPFLYER%TFLYER_TIME, IN ) -IF ( IN > 0 ) GSTORE = .TRUE. ! else no profiler storage at this time step -! -IF ( TPFLYER%LFLY ) THEN -! -!---------------------------------------------------------------------------- -! -!* 4. FLYER POSITION -! -------------- -! -!* 4.1 X position -! ---------- -! - IU=COUNT( PXHAT (:)<=TPFLYER%XX_CUR ) - II=COUNT( XXHATM(:)<=TPFLYER%XX_CUR ) -! - IF ( IU < IIB .AND. LWEST_ll() ) THEN - IF ( TPFLYER%CMODEL == 'FIX' .OR. TPFLYER%NMODEL == 1 ) THEN - TPFLYER%LCRASH = .TRUE. - ELSE - II = IIB - IU = IIB - END IF - END IF - IF ( IU > IIE .AND. LEAST_ll() ) THEN - IF ( TPFLYER%CMODEL == 'FIX' .OR. TPFLYER%NMODEL == 1 ) THEN - TPFLYER%LCRASH = .TRUE. - ELSE - II = IIE - IU = IIE - END IF - END IF -! -! -!* 4.2 Y position -! ---------- -! - IV=COUNT( PYHAT (:)<=TPFLYER%XY_CUR ) - IJ=COUNT( XYHATM(:)<=TPFLYER%XY_CUR ) -! - IF ( IV < IJB .AND. LSOUTH_ll() ) THEN - IF ( TPFLYER%CMODEL == 'FIX' .OR. TPFLYER%NMODEL == 1 ) THEN - TPFLYER%LCRASH = .TRUE. - ELSE - IJ = IJB - IV = IJB - END IF - END IF - IF (IV > IJE .AND. LNORTH_ll() ) THEN - IF ( TPFLYER%CMODEL == 'FIX' .OR. TPFLYER%NMODEL == 1 ) THEN - TPFLYER%LCRASH = .TRUE. - ELSE - IJ = IJE - IV = IJE + END IF END IF - 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 -! -------------------------------------- -! -!---------------------------------------------------------------------------- - IF ( ZTHIS_PROC > 0. .AND. .NOT. TPFLYER%LCRASH ) THEN -!---------------------------------------------------------------------------- -! -!* 4.5 Interpolations of model variables to mass points -! ------------------------------------------------ -! - 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) - END DO - ! - IF ( TPFLYER%CTYPE == 'ISODEN' .OR. TPFLYER%CTYPE == 'CVBALL' .OR. TPFLYER%CTYPE == '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,:,:) + CLASS IS ( TBALLOONDATA) + GLAUNCH = .FALSE. !Set to true only at the launch instant (set to false in flight after launch) + + ! 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. TPFLYER%LFLY .AND. .NOT. TPFLYER%LCRASH .AND. TPFLYER%NRANK_CUR < 0 ) THEN + ! Get rank of the process where the balloon is and the model number + IF ( TPFLYER%CMODEL == 'FIX' ) THEN + IMODEL = TPFLYER%NMODEL + ELSE + IMODEL = 0 + END IF + CALL FIND_PROCESS_AND_MODEL_FROM_XY_POS( TPFLYER%XXLAUNCH, TPFLYER%XYLAUNCH, IRANK, IMODEL ) + + IF ( IRANK < 1 ) THEN + TPFLYER%NMODEL = 1 !Set to 1 because it is always a valid model (to prevent crash if NDAD(TPFLYER%NMODEL) ) + TPFLYER%LCRASH = .TRUE. + TPFLYER%NCRASH = NCRASH_OUT_HORIZ + TPFLYER%LFLY = .FALSE. + CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'AIRCRAFT_BALLOON_EVOL', 'balloon ' // TRIM( TPFLYER%CTITLE ) & + // ': launch coordinates are outside of horizontal physical domain' ) + ELSE + TPFLYER%NMODEL = IMODEL + TPFLYER%LCRASH = .FALSE. + TPFLYER%NCRASH = NCRASH_NO + TPFLYER%NRANK_CUR = IRANK + END IF END IF -! -!* 5.2 Initial vertical positions -! -------------------------- -! - IF (GLAUNCH) THEN - SELECT TYPE ( TPFLYER ) - CLASS IS ( TBALLOONDATA) - SELECT CASE ( TPFLYER%CTYPE ) -! -!* 5.2.1 Iso-density balloon -! - CASE ( 'ISODEN' ) - ZXCOEF = (TPFLYER%XX_CUR - XXHATM(II)) / (XXHATM(II+1) - XXHATM(II)) - ZXCOEF = MAX (0.,MIN(ZXCOEF,1.)) - ZYCOEF = (TPFLYER%XY_CUR - XYHATM(IJ)) / (XYHATM(IJ+1) - XYHATM(IJ)) - ZYCOEF = MAX (0.,MIN(ZYCOEF,1.)) - IF ( TPFLYER%XALTLAUNCH /= XNEGUNDEF ) THEN - IK00 = MAX ( COUNT (TPFLYER%XALTLAUNCH >= ZZM(1,1,:)), 1) - IK01 = MAX ( COUNT (TPFLYER%XALTLAUNCH >= ZZM(1,2,:)), 1) - IK10 = MAX ( COUNT (TPFLYER%XALTLAUNCH >= ZZM(2,1,:)), 1) - IK11 = MAX ( COUNT (TPFLYER%XALTLAUNCH >= ZZM(2,2,:)), 1) - ZZCOEF00 = (TPFLYER%XALTLAUNCH - ZZM(1,1,IK00)) / ( ZZM(1,1,IK00+1) - ZZM(1,1,IK00)) - ZZCOEF01 = (TPFLYER%XALTLAUNCH - ZZM(1,2,IK01)) / ( ZZM(1,2,IK01+1) - ZZM(1,2,IK01)) + ! Launch? + LAUNCH: IF ( .NOT. TPFLYER%LFLY .AND. .NOT. TPFLYER%LCRASH .AND. TPFLYER%NMODEL == IMI ) THEN + 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 + ! Get rank of the process where the balloon is and the model number + IF ( TPFLYER%CMODEL == 'FIX' ) THEN + IMODEL = TPFLYER%NMODEL + ELSE + IMODEL = 0 + END IF + CALL FIND_PROCESS_AND_MODEL_FROM_XY_POS( TPFLYER%XX_CUR, TPFLYER%XY_CUR, IRANK, IMODEL ) + IF ( IRANK < 1 ) THEN + TPFLYER%NMODEL = 1 !Set to 1 because it is always a valid model (to prevent crash if NDAD(TPFLYER%NMODEL) ) + TPFLYER%LCRASH = .TRUE. + TPFLYER%NCRASH = NCRASH_OUT_HORIZ + TPFLYER%LFLY = .FALSE. + WRITE( CMNHMSG(1), "( 'Balloon ', A, ' crashed the ', I2, '/', I2, '/', I4, ' at ', F18.12, & + 's (out of the horizontal boundaries)' )" ) & + TRIM( TPFLYER%CTITLE ), TDTCUR%NDAY, TDTCUR%NMONTH, TDTCUR%NYEAR, TDTCUR%XTIME + CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'AIRCRAFT_BALLOON_EVOL' ) + ELSE + TPFLYER%NMODEL = IMODEL + TPFLYER%LCRASH = .FALSE. + TPFLYER%NCRASH = NCRASH_NO + TPFLYER%NRANK_CUR = IRANK + END IF + END IF LAUNCHTIME + END IF LAUNCH + + MODEL1BAL: IF ( TPFLYER%NMODEL == IMI .AND. & + !Do we have to store balloon data? + 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 IF MODEL1BAL + + ! 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 + ZTHIS_PROC = 1. + ! + !* 2. PRELIMINARIES-2 + ! ------------- + ! + !* 2.1 Indices + ! ------- + ! + CALL GET_INDICE_ll (IIB,IJB,IIE,IJE) + IKB = 1 + JPVEXT + IKE = SIZE(PZ,3) - JPVEXT + ! + ! + !* 2.2 Interpolations of model variables to mass points + ! ------------------------------------------------ + ! + IIU=SIZE(XXHAT) + IJU=SIZE(XYHAT) + ! 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 ) + ! + !* 4.5 Interpolations of model variables to mass points + ! ------------------------------------------------ + ! + 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) + ! + !---------------------------------------------------------------------------- + ! + !* 5. BALLOON/AIRCRAFT VERTICAL POSITION + ! ---------------------------------- + ! + ! + !* 5.1 Density + ! ------- + ! + ZEXN(:,:,: ) = (PP(II_M:II_M+1,IJ_M:IJ_M+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) + END DO + ! + IF ( TPFLYER%CTYPE == 'ISODEN' .OR. TPFLYER%CTYPE == 'CVBALL' .OR. TPFLYER%CTYPE == 'AIRCRA' ) THEN + 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,:,:)) ) + ! + ZTV (:,:,:) = ZTHV(:,:,:) * ZEXN(:,:,:) + ZRHO(:,:,:) = PP(II_M:II_M+1,IJ_M:IJ_M+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_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,:,:) + END IF + SELECT CASE ( TPFLYER%CTYPE ) + ! + !* 5.2.1 Iso-density balloon + ! + CASE ( 'ISODEN' ) + ZXCOEF = (TPFLYER%XX_CUR - XXHATM(II_M)) / (XXHATM(II_M+1) - XXHATM(II_M)) + ZXCOEF = MAX (0.,MIN(ZXCOEF,1.)) + ZYCOEF = (TPFLYER%XY_CUR - XYHATM(IJ_M)) / (XYHATM(IJ_M+1) - XYHATM(IJ_M)) + ZYCOEF = MAX (0.,MIN(ZYCOEF,1.)) + IF ( TPFLYER%XALTLAUNCH /= XNEGUNDEF ) THEN + IK00 = MAX ( COUNT (TPFLYER%XALTLAUNCH >= ZZM(1,1,:)), 1) + IK01 = MAX ( COUNT (TPFLYER%XALTLAUNCH >= ZZM(1,2,:)), 1) + IK10 = MAX ( COUNT (TPFLYER%XALTLAUNCH >= ZZM(2,1,:)), 1) + IK11 = MAX ( COUNT (TPFLYER%XALTLAUNCH >= ZZM(2,2,:)), 1) + ZZCOEF00 = (TPFLYER%XALTLAUNCH - ZZM(1,1,IK00)) / ( ZZM(1,1,IK00+1) - ZZM(1,1,IK00)) + ZZCOEF01 = (TPFLYER%XALTLAUNCH - ZZM(1,2,IK01)) / ( ZZM(1,2,IK01+1) - ZZM(1,2,IK01)) ZZCOEF10 = (TPFLYER%XALTLAUNCH - ZZM(2,1,IK10)) / ( ZZM(2,1,IK10+1) - ZZM(2,1,IK10)) ZZCOEF11 = (TPFLYER%XALTLAUNCH - ZZM(2,2,IK11)) / ( ZZM(2,2,IK11+1) - ZZM(2,2,IK11)) TPFLYER%XRHO = FLYER_INTERP(ZRHO) @@ -656,22 +1213,22 @@ IF ( TPFLYER%LFLY ) THEN CMNHMSG(3) = 'Check your INI_BALLOON routine' CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'AIRCRAFT_BALLOON_EVOL', OLOCAL = .TRUE. ) END IF -! -!* 5.2.2 Radiosounding balloon -! + ! + !* 5.2.2 Radiosounding balloon + ! CASE ( 'RADIOS' ) TPFLYER%XZ_CUR = TPFLYER%XALTLAUNCH TPFLYER%XZ_CUR = MAX ( TPFLYER%XZ_CUR , ZZM(1,1,IKB) ) TPFLYER%XZ_CUR = MAX ( TPFLYER%XZ_CUR , ZZM(2,1,IKB) ) TPFLYER%XZ_CUR = MAX ( TPFLYER%XZ_CUR , ZZM(1,2,IKB) ) TPFLYER%XZ_CUR = MAX ( TPFLYER%XZ_CUR , ZZM(2,2,IKB) ) -! -!* 5.2.4 Constant Volume Balloon -! + ! + !* 5.2.4 Constant Volume Balloon + ! CASE ( 'CVBALL' ) - ZXCOEF = (TPFLYER%XX_CUR - XXHATM(II)) / (XXHATM(II+1) - XXHATM(II)) + ZXCOEF = (TPFLYER%XX_CUR - XXHATM(II_M)) / (XXHATM(II_M+1) - XXHATM(II_M)) ZXCOEF = MAX (0.,MIN(ZXCOEF,1.)) - ZYCOEF = (TPFLYER%XY_CUR - XYHATM(IJ)) / (XYHATM(IJ+1) - XYHATM(IJ)) + ZYCOEF = (TPFLYER%XY_CUR - XYHATM(IJ_M)) / (XYHATM(IJ_M+1) - XYHATM(IJ_M)) ZYCOEF = MAX (0.,MIN(ZYCOEF,1.)) IF ( TPFLYER%XALTLAUNCH /= XNEGUNDEF ) THEN IK00 = MAX ( COUNT (TPFLYER%XALTLAUNCH >= ZZM(1,1,:)), 1) @@ -731,27 +1288,13 @@ IF ( TPFLYER%LFLY ) THEN END IF END IF END SELECT + END IF LAUNCHVERTPOS + ! + ! + ! + !* 5.3 Vertical position + ! ----------------- ! -!* 5.2.3 Aircraft -! - CLASS IS ( TAIRCRAFTDATA) - IF (TPFLYER%LALTDEF) THEN - TPFLYER%XP_CUR = (1.-ZSEG_FRAC) * TPFLYER%XSEGP(IL ) & - + ZSEG_FRAC * TPFLYER%XSEGP(IL+1) - ELSE - TPFLYER%XZ_CUR = (1.-ZSEG_FRAC) * TPFLYER%XSEGZ(IL ) & - + ZSEG_FRAC * TPFLYER%XSEGZ(IL +1 ) - END IF - END SELECT - END IF -! -! -! -!* 5.3 Vertical position -! ----------------- -! - SELECT TYPE ( TPFLYER ) - 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) @@ -764,88 +1307,63 @@ IF ( TPFLYER%LFLY ) THEN IK11 = MAX ( COUNT (TPFLYER%XZ_CUR >= ZZM(2,2,:)), 1) END IF - 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) + 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', 'AIRCRAFT_BALLOON_EVOL' , OLOCAL = .TRUE.) END IF - END SELECT - 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%LCRASH = .TRUE. - END IF -! - END IF -! -! - IF ( TPFLYER%LCRASH ) THEN - TPFLYER%LFLY = .FALSE. - IF ( TPFLYER%CTYPE == 'AIRCRA' .AND. .NOT. GLAUNCH ) THEN - WRITE(ILUOUT,*) 'Aircraft ',TPFLYER%CTITLE,' flew out of the domain the ', & - TDTCUR%nday,'/',TDTCUR%nmonth,'/', & - TDTCUR%nyear,' at ',TDTCUR%xtime,' sec.' - ELSE IF (TPFLYER%CTYPE /= 'AIRCRA') THEN - WRITE(ILUOUT,*) 'Balloon ',TPFLYER%CTITLE,' crashed the ', & - TDTCUR%nday,'/',TDTCUR%nmonth,'/', & - TDTCUR%nyear,' at ',TDTCUR%xtime,' sec.' - END IF - ELSE - SELECT TYPE ( TPFLYER ) - CLASS IS ( TAIRCRAFTDATA) - IF ( .NOT. GLAUNCH .AND. ZTDIST > PTSTEP ) THEN - WRITE(ILUOUT,*) '-------------------------------------------------------------------' - WRITE(ILUOUT,*) 'Aircraft ',TPFLYER%CTITLE,' flies in leg',TPFLYER%NSEGCURN ,' the ', & - TDTCUR%nday,'/',TDTCUR%nmonth,'/', & - TDTCUR%nyear,' at ',NINT(TDTCUR%xtime),' sec.' - WRITE(ILUOUT,*) '-------------------------------------------------------------------' - ENDIF - END SELECT -! -!---------------------------------------------------------------------------- - IF (ZTHIS_PROC>0.) THEN -!---------------------------------------------------------------------------- -! -!* 6. INITIALIZATIONS FOR INTERPOLATIONS -! ---------------------------------- -! -!* 6.1 Interpolation coefficient for X -! ------------------------------- -! - ZXCOEF = (TPFLYER%XX_CUR - XXHATM(II)) / (XXHATM(II+1) - XXHATM(II)) - ZXCOEF = MAX (0.,MIN(ZXCOEF,1.)) -! -! -!* 6.2 Interpolation coefficient for y -! ------------------------------- -! - ZYCOEF = (TPFLYER%XY_CUR - XYHATM(IJ)) / (XYHATM(IJ+1) - XYHATM(IJ)) - ZYCOEF = MAX (0.,MIN(ZYCOEF,1.)) -! -! -!* 6.3 Interpolation coefficients for the 4 suroundings verticals -! ---------------------------------------------------------- -! - SELECT TYPE ( TPFLYER ) - CLASS IS ( TBALLOONDATA) + ! + ! + !* 5.4 Crash of the balloon + ! -------------------- + ! + ! + IF (IK00 < IKB .OR. IK01 < IKB .OR. IK10 < IKB .OR. IK11 < IKB ) THEN + TPFLYER%LCRASH = .TRUE. + TPFLYER%NCRASH = NCRASH_OUT_LOW + END IF + IF (IK00 >= IKE .OR. IK01 >= IKE .OR. IK10 >= IKE .OR. IK11 >= IKE ) THEN + TPFLYER%LCRASH = .TRUE. + TPFLYER%NCRASH = NCRASH_OUT_HIGH + END IF + 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 + ! + !* 6. INITIALIZATIONS FOR INTERPOLATIONS + ! ---------------------------------- + ! + !* 6.1 Interpolation coefficient for X + ! ------------------------------- + ! + ZXCOEF = (TPFLYER%XX_CUR - XXHATM(II_M)) / (XXHATM(II_M+1) - XXHATM(II_M)) + ZXCOEF = MAX (0.,MIN(ZXCOEF,1.)) + ! + ! + !* 6.2 Interpolation coefficient for y + ! ------------------------------- + ! + ZYCOEF = (TPFLYER%XY_CUR - XYHATM(IJ_M)) / (XYHATM(IJ_M+1) - XYHATM(IJ_M)) + ZYCOEF = MAX (0.,MIN(ZYCOEF,1.)) + ! + ! + !* 6.3 Interpolation coefficients for the 4 suroundings verticals + ! ---------------------------------------------------------- + ! + ! SELECT TYPE ( TPFLYER ) + ! 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) ) @@ -858,431 +1376,433 @@ IF ( TPFLYER%LFLY ) THEN 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 + !---------------------------------------------------------------------------- + ! + !* 7. INITIALIZATIONS FOR INTERPOLATIONS OF U AND V + ! --------------------------------------------- + ! + !* 7.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.)) + ! + ! + !* 7.2 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.)) + ! + ! + !* 7.3 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) ) + ! + ! + !* 7.4 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) ) - 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 SELECT -! -!---------------------------------------------------------------------------- -! -!* 7. INITIALIZATIONS FOR INTERPOLATIONS OF U AND V -! --------------------------------------------- -! -!* 7.1 Interpolation coefficient for X (for U) -! ------------------------------- -! - ZUCOEF = (TPFLYER%XX_CUR - PXHAT(IU)) / (PXHAT(IU+1) - PXHAT(IU)) - ZUCOEF = MAX(0.,MIN(ZUCOEF,1.)) -! -! -!* 7.2 Interpolation coefficient for y (for V) -! ------------------------------- -! - ZVCOEF = (TPFLYER%XY_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%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) ) -! -! -!* 7.4 Interpolation coefficients for the 4 suroundings verticals (for V) -! ---------------------------------------------------------- -! + ! 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 + ! + !* 2. PRELIMINARIES-2 + ! ------------- + ! + !* 2.1 Indices + ! ------- + ! + CALL GET_INDICE_ll (IIB,IJB,IIE,IJE) - 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) ) -! -!---------------------------------------------------------------------------- -! -!* 8. DATA RECORDING -! -------------- -! - IF ( GSTORE ) THEN - TPFLYER%XX (IN) = TPFLYER%XX_CUR - TPFLYER%XY (IN) = TPFLYER%XY_CUR - TPFLYER%XZ (IN) = TPFLYER%XZ_CUR - ! - CALL SM_LATLON(PLATOR,PLONOR, & - TPFLYER%XX_CUR, TPFLYER%XY_CUR, & - TPFLYER%XLAT(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%XZON (IN) = ZU_BAL * COS(ZGAM) + ZV_BAL * SIN(ZGAM) - TPFLYER%XMER (IN) = - ZU_BAL * SIN(ZGAM) + ZV_BAL * COS(ZGAM) - ! - TPFLYER%XW (IN) = FLYER_INTERP(ZWM) - TPFLYER%XTH (IN) = FLYER_INTERP(PTH) - ! - ZFLYER_EXN = FLYER_INTERP(ZEXN) - TPFLYER%XP (IN) = XP00 * ZFLYER_EXN**(XCPD/XRD) - ! - DO JLOOP=1,SIZE(PR,4) - TPFLYER%XR (IN,JLOOP) = FLYER_INTERP(PR(:,:,:,JLOOP)) - IF (JLOOP>=2) ZR(:,:,:) = ZR(:,:,:) + PR(:,:,:,JLOOP) - END DO - DO JLOOP=1,SIZE(PSV,4) - TPFLYER%XSV (IN,JLOOP) = FLYER_INTERP(PSV(:,:,:,JLOOP)) - END DO - TPFLYER%XRTZ (IN,:) = FLYER_INTERPZ(ZR(:,:,:)) - DO JLOOP=1,SIZE(PR,4) - TPFLYER%XRZ (IN,:,JLOOP) = FLYER_INTERPZ(PR(:,:,:,JLOOP)) - END DO - ! Fin Modifs ON - TPFLYER%XFFZ (IN,:) = FLYER_INTERPZ(SQRT(PU**2+PV**2)) - IF (CCLOUD=="LIMA") THEN - TPFLYER%XCIZ (IN,:) = FLYER_INTERPZ(PSV(:,:,:,NSV_LIMA_NI)) - TPFLYER%XCCZ (IN,:) = FLYER_INTERPZ(PSV(:,:,:,NSV_LIMA_NC)) - TPFLYER%XCRZ (IN,:) = FLYER_INTERPZ(PSV(:,:,:,NSV_LIMA_NR)) - ELSE IF ( CCLOUD=="ICE3" .OR. CCLOUD=="ICE4" ) THEN - TPFLYER%XCIZ (IN,:) = FLYER_INTERPZ(PCIT(:,:,:)) - ENDIF - ! initialization CRARE and CRARE_ATT + LWC and IWC - TPFLYER%XCRARE(IN,:) = 0. - TPFLYER%XCRARE_ATT(IN,:) = 0. - TPFLYER%XLWCZ (IN,:) = 0. - TPFLYER%XIWCZ (IN,:) = 0. - IF (CCLOUD=="LIMA" .OR. CCLOUD=="ICE3" ) THEN ! only for ICE3 and LIMA - TPFLYER%XLWCZ (IN,:) = FLYER_INTERPZ((PR(:,:,:,2)+PR(:,:,:,3))*PRHODREF(:,:,:)) - TPFLYER%XIWCZ (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 - 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 - 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 - 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 - 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) + IKB = 1 + JPVEXT + IKE = SIZE(PZ,3) - JPVEXT + ! + ! + !* 2.2 Interpolations of model variables to mass points + ! ------------------------------------------------ + ! + IIU=SIZE(XXHAT) + IJU=SIZE(XYHAT) + + TPFLYER%NMODELHIST(ISTORE) = TPFLYER%NMODEL + TPFLYER%XX (ISTORE) = TPFLYER%XX_CUR + TPFLYER%XY (ISTORE) = TPFLYER%XY_CUR + TPFLYER%XZ (ISTORE) = TPFLYER%XZ_CUR + ! + 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) + ! + 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) + ! + 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 - ZREFLOC=ZREFLOC*(XLAM_CRAD/XPI)**4*ZCC*ZLBDA**ZCX/(4.*GAMMA(ZNU)*.93) - ZAETMP=ZAETMP * XPI *ZCC*ZLBDA**ZCX/(4.*GAMMA(ZNU)) - TPFLYER%XCRARE(IN,JK)=TPFLYER%XCRARE(IN,JK)+ZREFLOC - ZAELOC(JK)=ZAELOC(JK)+ZAETMP - END IF + 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 + ! Fin Modifs ON + 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(:,:,:)) + ENDIF + ! 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 + 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 + 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 + 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 + 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)) - END DO + ! 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) - END DO + !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*ZCC*ZLBDA**ZCX/(4.*GAMMA(ZNU)*.93) + ZAETMP=ZAETMP * XPI *ZCC*ZLBDA**ZCX/(4.*GAMMA(ZNU)) + TPFLYER%XCRARE(ISTORE,JK)=TPFLYER%XCRARE(ISTORE,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%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 - TPFLYER%XCRARE_ATT(IN,JK)=TPFLYER%XCRARE(IN,JK)*ZAETOT - END DO - ! 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)))) + ! 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 + TPFLYER%XCRARE_ATT(ISTORE,JK)=TPFLYER%XCRARE(ISTORE,JK)*ZAETOT + END DO + ! 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 + 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 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(IN,JK)=TPFLYER%XCRARE(IN,JK)*ZAETOT - END DO - TPFLYER%XZZ (IN,:) = ZZMZ(:) - DEALLOCATE(ZZMZ,ZAELOC) - ! m^3 → mm^6/m^3 → dBZ - WHERE(TPFLYER%XCRARE(IN,:)>0) - TPFLYER%XCRARE(IN,:)=10.*LOG10(1.E18*TPFLYER%XCRARE(IN,:)) - ELSEWHERE - TPFLYER%XCRARE(IN,:)=XUNDEF - END WHERE - WHERE(TPFLYER%XCRARE_ATT(IN,:)>0) - TPFLYER%XCRARE_ATT(IN,:)=10.*LOG10(1.E18*TPFLYER%XCRARE_ATT(IN,:)) - ELSEWHERE - TPFLYER%XCRARE_ATT(IN,:)=XUNDEF - END WHERE - DEALLOCATE(ZX,ZW,ZRTMIN) - END IF ! end LOOP ICE3 - ! vertical wind - TPFLYER%XWZ (IN,:) = FLYER_INTERPZ(ZWM(:,:,:)) - IF (SIZE(PTKE)>0) TPFLYER%XTKE (IN) = FLYER_INTERP(PTKE) - IF (SIZE(PTS) >0) TPFLYER%XTSRAD(IN) = FLYER_INTERP_2D(PTS) - IF (LDIAG_IN_RUN) TPFLYER%XTKE_DISS(IN) = FLYER_INTERP(XCURRENT_TKE_DISS) - TPFLYER%XZS(IN) = FLYER_INTERP_2D(PZ(:,:,1+JPVEXT)) - TPFLYER%XTHW_FLUX(IN) = FLYER_INTERP(ZTHW_FLUX) - TPFLYER%XRCW_FLUX(IN) = FLYER_INTERP(ZRCW_FLUX) - DO JLOOP=1,SIZE(PSV,4) - TPFLYER%XSVW_FLUX(IN,JLOOP) = FLYER_INTERP(ZSVW_FLUX(:,:,:,JLOOP)) - END DO - END IF -! -!---------------------------------------------------------------------------- -! -!* 9. BALLOON ADVECTION -! ----------------- -! - SELECT TYPE ( TPFLYER ) - CLASS IS ( TBALLOONDATA) + ! + !---------------------------------------------------------------------------- + ! + !* 9. BALLOON ADVECTION + ! ----------------- + ! + ! SELECT TYPE ( TPFLYER ) + ! CLASS IS ( TBALLOONDATA) + ZTSTEP = PTSTEP + IF ( TPFLYER%CTYPE == 'RADIOS' .OR. TPFLYER%CTYPE == 'ISODEN' .OR. TPFLYER%CTYPE == 'CVBALL' ) THEN ZU_BAL = FLYER_INTERP_U(PU) ZV_BAL = FLYER_INTERP_V(PV) @@ -1292,21 +1812,113 @@ IF ( TPFLYER%LFLY ) THEN ZMAP = 1. end if ! - TPFLYER%XX_CUR = TPFLYER%XX_CUR + ZU_BAL * PTSTEP * ZMAP - TPFLYER%XY_CUR = TPFLYER%XY_CUR + ZV_BAL * PTSTEP * ZMAP + ZX_OLD = TPFLYER%XX_CUR + ZY_OLD = TPFLYER%XY_CUR + + TPFLYER%XX_CUR = TPFLYER%XX_CUR + ZU_BAL * ZTSTEP * ZMAP + TPFLYER%XY_CUR = TPFLYER%XY_CUR + ZV_BAL * ZTSTEP * ZMAP END IF ! + !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 = TPFLYER%NMODEL + ! Get rank of the process where the balloon is and the model number + IF ( TPFLYER%CMODEL == 'FIX' ) THEN + IMODEL = TPFLYER%NMODEL + ELSE + IMODEL = 0 + END IF + CALL FIND_PROCESS_AND_MODEL_FROM_XY_POS( TPFLYER%XX_CUR, TPFLYER%XY_CUR, IRANK, IMODEL ) + IF ( IRANK < 1 ) THEN + TPFLYER%NMODEL = 1 !Set to 1 because it is always a valid model (to prevent crash if NDAD(TPFLYER%NMODEL) ) + TPFLYER%LCRASH = .TRUE. + TPFLYER%NCRASH = NCRASH_OUT_HORIZ + TPFLYER%LFLY = .FALSE. + WRITE( CMNHMSG(1), "( 'Balloon ', A, ' crashed the ', I2, '/', I2, '/', I4, ' at ', F18.12, & + 's (out of the horizontal boundaries)' )" ) & + TRIM( TPFLYER%CTITLE ), TDTCUR%NDAY, TDTCUR%NMONTH, TDTCUR%NYEAR, TDTCUR%XTIME + CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'AIRCRAFT_BALLOON_EVOL', OLOCAL = .TRUE. ) + ELSE + TPFLYER%NMODEL = IMODEL + TPFLYER%LCRASH = .FALSE. + TPFLYER%NCRASH = NCRASH_NO + TPFLYER%NRANK_CUR = IRANK + END IF + IF ( TPFLYER%NMODEL /= IMODEL_OLD .AND. .NOT. TPFLYER%LCRASH ) THEN + IF ( NDAD(TPFLYER%NMODEL ) == IMODEL_OLD ) THEN + !Nothing special to do + ELSE IF ( TPFLYER%NMODEL == NDAD(IMODEL_OLD) ) THEN + !Recompute position to be compatible with parent timestep + + !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 + ZTSTEP = ZTSTEP * NDTRATIO(IMODEL_OLD) + ELSE + ZTSTEP = ZTSTEP * ( 1 + 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 > & + TPFLYER%TFLYER_TIME%TPDATES(TPFLYER%TFLYER_TIME%N_CUR) + TPFLYER%TFLYER_TIME%XTSTEP + 1e-6 ) THEN + TPFLYER%TFLYER_TIME%N_CUR = TPFLYER%TFLYER_TIME%N_CUR + 1 + ISTORE = TPFLYER%TFLYER_TIME%N_CUR + !Remark: by construction here, ISTORE is always > 1 => no risk with ISTORE-1 value + TPFLYER%TFLYER_TIME%TPDATES(ISTORE) = TPFLYER%TFLYER_TIME%TPDATES(ISTORE-1) + TPFLYER%TFLYER_TIME%XTSTEP + + !Force a dummy store (nothing is computed, therefore default/initial values will be stored) + TPFLYER%LSTORE = .TRUE. + + WRITE( CMNHMSG(1), "( 'Balloon ', A, ': store skipped at ', I2, '/', I2, '/', I4, ' at ', F18.12, 's' )" ) & + TRIM( TPFLYER%CTITLE ), & + TPFLYER%TFLYER_TIME%TPDATES(ISTORE)%NDAY, TPFLYER%TFLYER_TIME%TPDATES(ISTORE)%NMONTH, & + TPFLYER%TFLYER_TIME%TPDATES(ISTORE)%NYEAR, TPFLYER%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 + + TPFLYER%XX_CUR = TPFLYER%XX_CUR + ZU_BAL * ZTSTEP * ZMAP + TPFLYER%XY_CUR = TPFLYER%XY_CUR + ZV_BAL * ZTSTEP * ZMAP + + ! Model number is now imposed + IMODEL = TPFLYER%NMODEL + CALL FIND_PROCESS_AND_MODEL_FROM_XY_POS( TPFLYER%XX_CUR, TPFLYER%XY_CUR, IRANK, IMODEL ) + IF ( IRANK < 1 ) THEN + TPFLYER%NMODEL = 1 !Set to 1 because it is always a valid model (to prevent crash if NDAD(TPFLYER%NMODEL) ) + TPFLYER%LCRASH = .TRUE. + TPFLYER%NCRASH = NCRASH_OUT_HORIZ + TPFLYER%LFLY = .FALSE. + WRITE( CMNHMSG(1), "( 'Balloon ', A, ' crashed the ', I2, '/', I2, '/', I4, ' at ', F18.12, & + 's (out of the horizontal boundaries)' )" ) & + TRIM( TPFLYER%CTITLE ), TDTCUR%NDAY, TDTCUR%NMONTH, TDTCUR%NYEAR, TDTCUR%XTIME + CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'AIRCRAFT_BALLOON_EVOL', OLOCAL = .TRUE. ) + ELSE + !TPFLYER%NMODEL = IMODEL !Do not change model because we are in transition to parent + TPFLYER%LCRASH = .FALSE. + TPFLYER%NCRASH = NCRASH_NO + TPFLYER%NRANK_CUR = IRANK + END IF + ELSE + !Special case not-managed (different dads, change of several models in 1 step (going to grand parent)...) + CMNHMSG(1) = 'unmanaged change of model for ballon ' // TPFLYER%CTITLE + CMNHMSG(2) = 'its trajectory might be wrong' + CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'AIRCRAFT_BALLOON_EVOL', OLOCAL = .TRUE. ) + END IF + END IF + IF ( TPFLYER%CTYPE == 'RADIOS' ) THEN ZW_BAL = FLYER_INTERP(ZWM) - TPFLYER%XZ_CUR = TPFLYER%XZ_CUR + ( ZW_BAL + TPFLYER%XWASCENT ) * PTSTEP + TPFLYER%XZ_CUR = TPFLYER%XZ_CUR + ( ZW_BAL + TPFLYER%XWASCENT ) * ZTSTEP END IF ! IF ( TPFLYER%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(PTSTEP) .GT. 1 ) THEN - DO JK=1,INT(PTSTEP) + IF (INT(ZTSTEP) .GT. 1 ) THEN + DO JK=1,INT(ZTSTEP) TPFLYER%XWASCENT = TPFLYER%XWASCENT & - ( 1. / (1. + TPFLYER%XINDDRAG ) ) * 1. * & ( XG * ( ( TPFLYER%XMASS / TPFLYER%XVOLUME ) - ZRO_BAL ) / ( TPFLYER%XMASS / TPFLYER%XVOLUME ) & @@ -1316,161 +1928,114 @@ IF ( TPFLYER%LFLY ) THEN TPFLYER%XZ_CUR = TPFLYER%XZ_CUR + ( ZW_BAL + TPFLYER%XWASCENT ) * 1. END DO END IF - IF (PTSTEP .GT. INT(PTSTEP)) THEN - TPFLYER%XWASCENT = TPFLYER%XWASCENT & - - ( 1. / (1. + TPFLYER%XINDDRAG ) ) * (PTSTEP-INT(PTSTEP)) * & - ( XG * ( ( TPFLYER%XMASS / TPFLYER%XVOLUME ) - ZRO_BAL ) / ( TPFLYER%XMASS / TPFLYER%XVOLUME ) & - + TPFLYER%XWASCENT * ABS ( TPFLYER%XWASCENT ) * & - TPFLYER%XDIAMETER * TPFLYER%XAERODRAG / ( 2. * TPFLYER%XVOLUME ) & - ) - TPFLYER%XZ_CUR = TPFLYER%XZ_CUR + ( ZW_BAL + TPFLYER%XWASCENT ) * (PTSTEP-INT(PTSTEP)) + IF (ZTSTEP .GT. INT(ZTSTEP)) THEN + TPFLYER%XWASCENT = TPFLYER%XWASCENT & + - ( 1. / (1. + TPFLYER%XINDDRAG ) ) * (ZTSTEP-INT(ZTSTEP)) * & + ( XG * ( ( TPFLYER%XMASS / TPFLYER%XVOLUME ) - ZRO_BAL ) / ( TPFLYER%XMASS / TPFLYER%XVOLUME ) & + + TPFLYER%XWASCENT * ABS ( TPFLYER%XWASCENT ) * & + TPFLYER%XDIAMETER * TPFLYER%XAERODRAG / ( 2. * TPFLYER%XVOLUME ) & + ) + TPFLYER%XZ_CUR = TPFLYER%XZ_CUR + ( ZW_BAL + TPFLYER%XWASCENT ) * (ZTSTEP-INT(ZTSTEP)) END IF END IF - END SELECT -! -!---------------------------------------------------------------------------- - END IF -!---------------------------------------------------------------------------- -! -!* 10. AIRCRAFT MOVE (computations done on all processors, to limit exchanges) -! ------------- -! - SELECT TYPE ( TPFLYER ) - CLASS IS ( TAIRCRAFTDATA ) -! -! -!* 10.1 Determination of flight segment -! ------------------------------- -! - IL = TPFLYER%NSEGCURN - ! - TPFLYER%XSEGCURT = TPFLYER%XSEGCURT + PTSTEP - ! - DO WHILE (TPFLYER%XSEGCURT>TPFLYER%XSEGTIME(IL)) - TPFLYER%NSEGCURN = TPFLYER%NSEGCURN + 1 - IL = TPFLYER%NSEGCURN - TPFLYER%XSEGCURT = TPFLYER%XSEGCURT - TPFLYER%XSEGTIME(IL-1) - IF (IL>TPFLYER%NSEG) EXIT - END DO -! DO WHILE (TPFLYER%XSEGCURT>TPFLYER%XSEGTIME(IL) .AND. IL <= TPFLYER%NSEG) -! TPFLYER%NSEGCURN = TPFLYER%NSEGCURN + 1 -! IL = TPFLYER%NSEGCURN -! TPFLYER%XSEGCURT = TPFLYER%XSEGCURT - TPFLYER%XSEGTIME(IL-1) -! END DO - ! - !* end of flight - ! - IF (IL > TPFLYER%NSEG) TPFLYER%LFLY = .FALSE. -! -! -!* 10.2 Determination of new position -! ----------------------------- -! - IF (TPFLYER%LFLY) THEN - ZSEG_FRAC = TPFLYER%XSEGCURT / TPFLYER%XSEGTIME(IL) - ! - TPFLYER%XX_CUR = (1.-ZSEG_FRAC) * TPFLYER%XSEGX(IL ) & - + ZSEG_FRAC * TPFLYER%XSEGX(IL+1) - TPFLYER%XY_CUR = (1.-ZSEG_FRAC) * TPFLYER%XSEGY(IL ) & - + ZSEG_FRAC * TPFLYER%XSEGY(IL+1) - IF (TPFLYER%LALTDEF) THEN - TPFLYER%XP_CUR = (1.-ZSEG_FRAC) * TPFLYER%XSEGP(IL ) & - + ZSEG_FRAC * TPFLYER%XSEGP(IL+1) - ELSE - TPFLYER%XZ_CUR = (1.-ZSEG_FRAC) * TPFLYER%XSEGZ(IL ) & - + ZSEG_FRAC * TPFLYER%XSEGZ(IL+1) - END IF - END IF - END SELECT - ! - END IF -! -END IF -! -!---------------------------------------------------------------------------- -! -!* 11. EXCHANGE OF INFORMATION BETWEEN PROCESSORS -! ------------------------------------------ -! -!* 11.1 current position -! ---------------- -! -CALL DISTRIBUTE_FLYER_L(TPFLYER%LFLY) -CALL DISTRIBUTE_FLYER_L(TPFLYER%LCRASH) -CALL DISTRIBUTE_FLYER(TPFLYER%XX_CUR) -CALL DISTRIBUTE_FLYER(TPFLYER%XY_CUR) -SELECT TYPE ( TPFLYER ) - CLASS IS ( TBALLOONDATA ) - IF ( TPFLYER%CTYPE == 'CVBALL' ) THEN - CALL DISTRIBUTE_FLYER(TPFLYER%XZ_CUR) - CALL DISTRIBUTE_FLYER(TPFLYER%XWASCENT) - ELSE IF ( TPFLYER%CTYPE == 'RADIOS' ) THEN - CALL DISTRIBUTE_FLYER(TPFLYER%XZ_CUR) - ELSE IF ( TPFLYER%CTYPE == 'ISODEN' ) THEN - CALL DISTRIBUTE_FLYER(TPFLYER%XRHO) - END IF + TPFLYER%TPOS_CUR = TDTCUR + ZTSTEP + END IF CRASH_VERT !end of no vertical crash branch + ELSE ISOWNERBAL + !The balloon is not present on this MPI process + ZTHIS_PROC = 0. + END IF ISOWNERBAL + !---------------------------------------------------------------------------- + ! + !* 11. EXCHANGE OF INFORMATION BETWEEN PROCESSES + ! ----------------------------------------- + ! + !* 11.1 current position + ! ---------------- + ! + IF ( TPFLYER%CMODEL == 'MOB' ) THEN + CALL DISTRIBUTE_FLYER_N(TPFLYER%NMODEL) + END IF + CALL DISTRIBUTE_FLYER_N(TPFLYER%NRANK_CUR) + CALL DISTRIBUTE_FLYER_L(TPFLYER%LFLY) + CALL DISTRIBUTE_FLYER_L(TPFLYER%LCRASH) + CALL DISTRIBUTE_FLYER_L(TPFLYER%LSTORE) + CALL DISTRIBUTE_FLYER(TPFLYER%XX_CUR) + CALL DISTRIBUTE_FLYER(TPFLYER%XY_CUR) + CALL DISTRIBUTE_FLYER_N(TPFLYER%TPOS_CUR%NYEAR) + CALL DISTRIBUTE_FLYER_N(TPFLYER%TPOS_CUR%NMONTH) + CALL DISTRIBUTE_FLYER_N(TPFLYER%TPOS_CUR%NDAY) + CALL DISTRIBUTE_FLYER (TPFLYER%TPOS_CUR%XTIME) + + CALL DISTRIBUTE_FLYER_N(TPFLYER%TFLYER_TIME%N_CUR) + + ! SELECT TYPE ( TPFLYER ) + ! CLASS IS ( TBALLOONDATA ) + IF ( TPFLYER%CTYPE == 'CVBALL' ) THEN + CALL DISTRIBUTE_FLYER(TPFLYER%XZ_CUR) + CALL DISTRIBUTE_FLYER(TPFLYER%XWASCENT) + ELSE IF ( TPFLYER%CTYPE == 'RADIOS' ) THEN + CALL DISTRIBUTE_FLYER(TPFLYER%XZ_CUR) + ELSE IF ( TPFLYER%CTYPE == 'ISODEN' ) THEN + CALL DISTRIBUTE_FLYER(TPFLYER%XRHO) + END IF + + IF ( TPFLYER%LSTORE ) THEN + CALL DISTRIBUTE_FLYER_N(TPFLYER%TFLYER_TIME%TPDATES(ISTORE)%NYEAR) + CALL DISTRIBUTE_FLYER_N(TPFLYER%TFLYER_TIME%TPDATES(ISTORE)%NMONTH) + CALL DISTRIBUTE_FLYER_N(TPFLYER%TFLYER_TIME%TPDATES(ISTORE)%NDAY) + CALL DISTRIBUTE_FLYER (TPFLYER%TFLYER_TIME%TPDATES(ISTORE)%XTIME) + + CALL DISTRIBUTE_FLYER_N(TPFLYER%NMODELHIST(ISTORE)) + CALL DISTRIBUTE_FLYER(TPFLYER%XX (ISTORE)) + CALL DISTRIBUTE_FLYER(TPFLYER%XY (ISTORE)) + CALL DISTRIBUTE_FLYER(TPFLYER%XZ (ISTORE)) + CALL DISTRIBUTE_FLYER(TPFLYER%XLON(ISTORE)) + CALL DISTRIBUTE_FLYER(TPFLYER%XLAT(ISTORE)) + CALL DISTRIBUTE_FLYER(TPFLYER%XZON(ISTORE)) + CALL DISTRIBUTE_FLYER(TPFLYER%XMER(ISTORE)) + CALL DISTRIBUTE_FLYER(TPFLYER%XW (ISTORE)) + CALL DISTRIBUTE_FLYER(TPFLYER%XP (ISTORE)) + CALL DISTRIBUTE_FLYER(TPFLYER%XTH (ISTORE)) + DO JLOOP=1,SIZE(PR,4) + CALL DISTRIBUTE_FLYER(TPFLYER%XR (ISTORE,JLOOP)) + END DO + DO JLOOP=1,SIZE(PSV,4) + CALL DISTRIBUTE_FLYER(TPFLYER%XSV (ISTORE,JLOOP)) + END DO + DO JLOOP=1,IKU + CALL DISTRIBUTE_FLYER(TPFLYER%XRTZ (ISTORE,JLOOP)) + DO JLOOP2=1,SIZE(PR,4) + CALL DISTRIBUTE_FLYER(TPFLYER%XRZ (ISTORE,JLOOP,JLOOP2)) + ENDDO + CALL DISTRIBUTE_FLYER(TPFLYER%XFFZ (ISTORE,JLOOP)) + CALL DISTRIBUTE_FLYER(TPFLYER%XCIZ (ISTORE,JLOOP)) + IF (CCLOUD== 'LIMA' ) THEN + CALL DISTRIBUTE_FLYER(TPFLYER%XCRZ (ISTORE,JLOOP)) + CALL DISTRIBUTE_FLYER(TPFLYER%XCCZ (ISTORE,JLOOP)) + ENDIF + CALL DISTRIBUTE_FLYER(TPFLYER%XIWCZ (ISTORE,JLOOP)) + CALL DISTRIBUTE_FLYER(TPFLYER%XLWCZ (ISTORE,JLOOP)) + CALL DISTRIBUTE_FLYER(TPFLYER%XCRARE (ISTORE,JLOOP)) + CALL DISTRIBUTE_FLYER(TPFLYER%XCRARE_ATT (ISTORE,JLOOP)) + CALL DISTRIBUTE_FLYER(TPFLYER%XWZ (ISTORE,JLOOP)) + CALL DISTRIBUTE_FLYER(TPFLYER%XZZ (ISTORE,JLOOP)) + END DO + IF (SIZE(PTKE)>0) CALL DISTRIBUTE_FLYER(TPFLYER%XTKE (ISTORE)) + IF (SIZE(PTS) >0) CALL DISTRIBUTE_FLYER(TPFLYER%XTSRAD(ISTORE)) + IF (LDIAG_IN_RUN) CALL DISTRIBUTE_FLYER(TPFLYER%XTKE_DISS(ISTORE)) + CALL DISTRIBUTE_FLYER(TPFLYER%XZS (ISTORE)) + CALL DISTRIBUTE_FLYER(TPFLYER%XTHW_FLUX(ISTORE)) + CALL DISTRIBUTE_FLYER(TPFLYER%XRCW_FLUX(ISTORE)) + DO JLOOP=1,SIZE(PSV,4) + CALL DISTRIBUTE_FLYER(TPFLYER%XSVW_FLUX(ISTORE,JLOOP)) + END DO + END IF + END IF INFLIGHTONMODEL - CLASS IS ( TAIRCRAFTDATA ) - IF (TPFLYER%LALTDEF) THEN - CALL DISTRIBUTE_FLYER(TPFLYER%XP_CUR) - ELSE - CALL DISTRIBUTE_FLYER(TPFLYER%XZ_CUR) - ENDIF END SELECT -! -!* 11.2 data stored -! ----------- -! -IF ( GSTORE ) THEN - CALL DISTRIBUTE_FLYER(TPFLYER%XX (IN)) - CALL DISTRIBUTE_FLYER(TPFLYER%XY (IN)) - CALL DISTRIBUTE_FLYER(TPFLYER%XZ (IN)) - CALL DISTRIBUTE_FLYER(TPFLYER%XLON(IN)) - CALL DISTRIBUTE_FLYER(TPFLYER%XLAT(IN)) - CALL DISTRIBUTE_FLYER(TPFLYER%XZON(IN)) - CALL DISTRIBUTE_FLYER(TPFLYER%XMER(IN)) - CALL DISTRIBUTE_FLYER(TPFLYER%XW (IN)) - CALL DISTRIBUTE_FLYER(TPFLYER%XP (IN)) - CALL DISTRIBUTE_FLYER(TPFLYER%XTH (IN)) - DO JLOOP=1,SIZE(PR,4) - CALL DISTRIBUTE_FLYER(TPFLYER%XR (IN,JLOOP)) - END DO - DO JLOOP=1,SIZE(PSV,4) - CALL DISTRIBUTE_FLYER(TPFLYER%XSV (IN,JLOOP)) - END DO - DO JLOOP=1,IKU - CALL DISTRIBUTE_FLYER(TPFLYER%XRTZ (IN,JLOOP)) - DO JLOOP2=1,SIZE(PR,4) - CALL DISTRIBUTE_FLYER(TPFLYER%XRZ (IN,JLOOP,JLOOP2)) - ENDDO - CALL DISTRIBUTE_FLYER(TPFLYER%XFFZ (IN,JLOOP)) - CALL DISTRIBUTE_FLYER(TPFLYER%XCIZ (IN,JLOOP)) - IF (CCLOUD== 'LIMA' ) THEN - CALL DISTRIBUTE_FLYER(TPFLYER%XCRZ (IN,JLOOP)) - CALL DISTRIBUTE_FLYER(TPFLYER%XCCZ (IN,JLOOP)) - ENDIF - CALL DISTRIBUTE_FLYER(TPFLYER%XIWCZ (IN,JLOOP)) - CALL DISTRIBUTE_FLYER(TPFLYER%XLWCZ (IN,JLOOP)) - CALL DISTRIBUTE_FLYER(TPFLYER%XCRARE (IN,JLOOP)) - CALL DISTRIBUTE_FLYER(TPFLYER%XCRARE_ATT (IN,JLOOP)) - CALL DISTRIBUTE_FLYER(TPFLYER%XWZ (IN,JLOOP)) - CALL DISTRIBUTE_FLYER(TPFLYER%XZZ (IN,JLOOP)) - END DO - IF (SIZE(PTKE)>0) CALL DISTRIBUTE_FLYER(TPFLYER%XTKE (IN)) - IF (SIZE(PTS) >0) CALL DISTRIBUTE_FLYER(TPFLYER%XTSRAD(IN)) - IF (LDIAG_IN_RUN) CALL DISTRIBUTE_FLYER(TPFLYER%XTKE_DISS(IN)) - CALL DISTRIBUTE_FLYER(TPFLYER%XZS (IN)) - CALL DISTRIBUTE_FLYER(TPFLYER%XTHW_FLUX(IN)) - CALL DISTRIBUTE_FLYER(TPFLYER%XRCW_FLUX(IN)) - DO JLOOP=1,SIZE(PSV,4) - CALL DISTRIBUTE_FLYER(TPFLYER%XSVW_FLUX(IN,JLOOP)) - END DO -END IF -! -!---------------------------------------------------------------------------- -!---------------------------------------------------------------------------- -! + + CONTAINS ! !---------------------------------------------------------------------------- @@ -1486,8 +2051,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)) & @@ -1508,8 +2073,8 @@ IF (SIZE(PA,1)==2) THEN JI=1 JJ=1 ELSE - JI=II - JJ=IJ + JI=II_M + JJ=IJ_M END IF ! ! @@ -1519,10 +2084,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 @@ -1538,8 +2103,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)) & @@ -1561,8 +2126,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)) & @@ -1584,8 +2149,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 ) & @@ -1639,88 +2204,9 @@ END IF ! END SUBROUTINE DISTRIBUTE_FLYER_L !---------------------------------------------------------------------------- -!---------------------------------------------------------------------------- -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%XX_CUR ) -IV=COUNT( PYHAT (:)<=TPFLYER%XY_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 - ! - 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 - 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%CTITLE,' comes from model ',IMODEL,' in model ', & - TPFLYER%NMODEL,' at ',NINT(TDTCUR%xtime),' sec.' - WRITE(ILUOUT,*) '-------------------------------------------------------------------' - ELSE - WRITE(ILUOUT,*) '-------------------------------------------------------------------' - WRITE(ILUOUT,*) TPFLYER%CTITLE,' goes from model ',IMODEL,' to model ', & - TPFLYER%NMODEL,' at ',NINT(TDTCUR%xtime),' sec.' - WRITE(ILUOUT,*) '-------------------------------------------------------------------' - ENDIF -ENDIF -! -! -END SUBROUTINE FLYER_CHANGE_MODEL -!---------------------------------------------------------------------------- -!---------------------------------------------------------------------------- + + END SUBROUTINE AIRCRAFT_BALLOON_EVOL +!---------------------------------------------------------------------------- + +END MODULE MODE_AIRCRAFT_BALLOON_EVOL diff --git a/src/MNH/diag.f90 b/src/MNH/diag.f90 index 27362f835..59e39266e 100644 --- a/src/MNH/diag.f90 +++ b/src/MNH/diag.f90 @@ -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 !------------------------------------------------------------------------------- @@ -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/ini_aircraft.f90 b/src/MNH/ini_aircraft.f90 index f6355579a..d0f456f1a 100644 --- a/src/MNH/ini_aircraft.f90 +++ b/src/MNH/ini_aircraft.f90 @@ -118,6 +118,8 @@ ALLOCATE( TAIRCRAFTS(NAIRCRAFTS) ) !Treat aircraft data read in namelist DO JI = 1, NAIRCRAFTS + TAIRCRAFTS(JI)%NID = JI + IF ( CTITLE(JI) == '' ) THEN WRITE( CTITLE(JI), FMT = '( A, I3.3) ') TRIM( CTYPE(JI) ), JI @@ -139,6 +141,7 @@ DO JI = 1, NAIRCRAFTS CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'INI_AIRCRAFT', & 'NMODEL is set to 1 at start for a CMODEL="MOB" aircraft (aircraft ' // TRIM( CTITLE(JI) ) // ')' ) 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) ) @@ -167,10 +170,10 @@ DO JI = 1, NAIRCRAFTS END IF TAIRCRAFTS(JI)%TFLYER_TIME%XTSTEP = XTSTEP(JI) - IF ( NPOS(JI) < 1 ) THEN - CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'INI_AIRCRAFT', 'NPOS should be at least 1 for aircraft ' // TRIM( CTITLE(JI) ) ) + IF ( NPOS(JI) < 2 ) THEN + CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'INI_AIRCRAFT', 'NPOS should be at least 2 for aircraft ' // TRIM( CTITLE(JI) ) ) END IF - TAIRCRAFTS(JI)%NSEG = NPOS(JI)-1 + TAIRCRAFTS(JI)%NPOS = NPOS(JI) TAIRCRAFTS(JI)%LALTDEF = LALTDEF(JI) @@ -179,13 +182,13 @@ DO JI = 1, NAIRCRAFTS // TRIM( CTITLE(JI) ) ) ! Allocate trajectory data - ALLOCATE( TAIRCRAFTS(JI)%XSEGTIME(TAIRCRAFTS(JI)%NSEG ) ); TAIRCRAFTS(JI)%XSEGTIME(:) = XNEGUNDEF - ALLOCATE( TAIRCRAFTS(JI)%XSEGLAT (TAIRCRAFTS(JI)%NSEG+1) ); TAIRCRAFTS(JI)%XSEGLAT(:) = XNEGUNDEF - ALLOCATE( TAIRCRAFTS(JI)%XSEGLON (TAIRCRAFTS(JI)%NSEG+1) ); TAIRCRAFTS(JI)%XSEGLON(:) = XNEGUNDEF + ALLOCATE( TAIRCRAFTS(JI)%XPOSTIME(TAIRCRAFTS(JI)%NPOS) ); TAIRCRAFTS(JI)%XPOSTIME(:) = XNEGUNDEF + ALLOCATE( TAIRCRAFTS(JI)%XPOSLAT (TAIRCRAFTS(JI)%NPOS) ); TAIRCRAFTS(JI)%XPOSLAT(:) = XNEGUNDEF + ALLOCATE( TAIRCRAFTS(JI)%XPOSLON (TAIRCRAFTS(JI)%NPOS) ); TAIRCRAFTS(JI)%XPOSLON(:) = XNEGUNDEF IF ( TAIRCRAFTS(JI)%LALTDEF ) THEN - ALLOCATE( TAIRCRAFTS(JI)%XSEGP (TAIRCRAFTS(JI)%NSEG+1) ); TAIRCRAFTS(JI)%XSEGP(:) = XNEGUNDEF + ALLOCATE( TAIRCRAFTS(JI)%XPOSP (TAIRCRAFTS(JI)%NPOS) ); TAIRCRAFTS(JI)%XPOSP(:) = XNEGUNDEF ELSE - ALLOCATE( TAIRCRAFTS(JI)%XSEGZ (TAIRCRAFTS(JI)%NSEG+1) ); TAIRCRAFTS(JI)%XSEGZ(:) = XNEGUNDEF + ALLOCATE( TAIRCRAFTS(JI)%XPOSZ (TAIRCRAFTS(JI)%NPOS) ); TAIRCRAFTS(JI)%XPOSZ(:) = XNEGUNDEF END IF ! Read CSV data (trajectory) @@ -205,6 +208,7 @@ SUBROUTINE AIRCRAFT_CSV_READ( TPAIRCRAFT, HFILE ) USE MODD_AIRCRAFT_BALLOON, ONLY: TAIRCRAFTDATA +USE MODE_DATETIME USE MODE_MSG IMPLICIT NONE @@ -215,41 +219,39 @@ CHARACTER(LEN=*), INTENT(IN) :: HFILE !Name of the CSV file with the aircr CHARACTER(LEN=NMAXLINELGT) :: YSTRING INTEGER :: ILU ! logical unit of the file INTEGER :: JI -REAL :: ZTIME, ZLAT, ZLON, ZALT -REAL :: ZTIME_OLD - -ZTIME_OLD = 0. +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%NSEG + 1 +DO JI = 1, TPAIRCRAFT%NPOS ! Read aircraft position READ( ILU, END = 101, FMT = '(A)' ) YSTRING READ( YSTRING, * ) ZTIME, ZLAT, ZLON, ZALT - IF ( JI > 1 ) TPAIRCRAFT%XSEGTIME(JI-1) = ZTIME - ZTIME_OLD - TPAIRCRAFT%XSEGLAT(JI) = ZLAT - TPAIRCRAFT%XSEGLON(JI) = ZLON + TPAIRCRAFT%XPOSTIME(JI) = ZTIME + TPAIRCRAFT%XPOSLAT(JI) = ZLAT + TPAIRCRAFT%XPOSLON(JI) = ZLON IF ( TPAIRCRAFT%LALTDEF ) THEN - TPAIRCRAFT%XSEGP(JI) = ZALT * 100. ! *100 to convert from hPa to Pa + TPAIRCRAFT%XPOSP(JI) = ZALT * 100. ! *100 to convert from hPa to Pa ELSE - TPAIRCRAFT%XSEGZ(JI) = ZALT + TPAIRCRAFT%XPOSZ(JI) = ZALT END IF - - ZTIME_OLD = ZTIME END DO 101 CONTINUE CLOSE( ILU ) -IF ( JI < TPAIRCRAFT%NSEG + 1 ) & +IF ( JI < TPAIRCRAFT%NPOS ) & CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'AIRCRAFT_CSV_READ', 'Data not found in file ' // TRIM( HFILE ) ) +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 7509894df..59da978f8 100644 --- a/src/MNH/ini_aircraft_balloon.f90 +++ b/src/MNH/ini_aircraft_balloon.f90 @@ -109,7 +109,6 @@ INTEGER :: ISTORE ! number of storage instants INTEGER :: ILUOUT ! logical unit INTEGER :: IRESP ! return code INTEGER :: JI -INTEGER :: JSEG ! loop counter TYPE(TFIELDMETADATA) :: TZFIELD ! !---------------------------------------------------------------------------- @@ -197,6 +196,7 @@ ENDIF ! ! allocate( tpflyer%tflyer_time%tpdates(istore) ) +ALLOCATE(TPFLYER%NMODELHIST(ISTORE)) ALLOCATE(TPFLYER%XX (ISTORE)) ALLOCATE(TPFLYER%XY (ISTORE)) ALLOCATE(TPFLYER%XZ (ISTORE)) @@ -236,6 +236,7 @@ ALLOCATE(TPFLYER%XTHW_FLUX(ISTORE)) ALLOCATE(TPFLYER%XRCW_FLUX(ISTORE)) ALLOCATE(TPFLYER%XSVW_FLUX(ISTORE,KSV)) ! +TPFLYER%NMODELHIST = NNEGUNDEF TPFLYER%XX = XUNDEF TPFLYER%XY = XUNDEF TPFLYER%XZ = XUNDEF @@ -301,6 +302,7 @@ INTEGER(KIND=CDFINT) :: IGROUPID INTEGER(KIND=CDFINT) :: ISTATUS INTEGER(KIND=CDFINT), DIMENSION(2) :: IDATA ! Intermediate array to allow merge of 2 MPI broadcasts #endif +INTEGER :: IMODEL LOGICAL :: GREAD ! True if balloon position was read in synchronous file REAL :: ZLAT ! latitude of the balloon REAL :: ZLON ! longitude of the balloon @@ -310,8 +312,11 @@ TYPE(TFILEDATA) :: TZFILE IF ( IMI /= TPFLYER%NMODEL ) RETURN +LFLYER = .TRUE. + GREAD = .FALSE. -LFLYER=.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 synchronous file @@ -490,13 +495,27 @@ IF ( CPROGRAM == 'MESONH' .OR. CPROGRAM == 'SPAWN ' .OR. CPROGRAM == 'REAL ' ) WRITE( CMNHMSG(2), * ) " Lat=", ZLAT, " Lon=", ZLON, " Rho=", TPFLYER%XRHO END IF CALL PRINT_MSG( NVERB_INFO, 'GEN', 'INI_LAUNCH' ) - - TPFLYER%TFLYER_TIME%XTSTEP = MAX ( PTSTEP, TPFLYER%TFLYER_TIME%XTSTEP ) 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 IF ( LAIRCRAFT_BALLOON ) THEN @@ -513,19 +532,10 @@ ELSE IF ( CPROGRAM == 'DIAG ' ) THEN CALL PRINT_MSG( NVERB_INFO, 'GEN', 'INI_LAUNCH' ) END IF ! - TPFLYER%TFLYER_TIME%XTSTEP = MAX (XSTEP_AIRCRAFT_BALLOON , TPFLYER%TFLYER_TIME%XTSTEP ) + CALL FLYER_TIMESTEP_CORRECT( XSTEP_AIRCRAFT_BALLOON, TPFLYER ) END IF END IF -! -IF ( TPFLYER%XLATLAUNCH == XUNDEF .OR. TPFLYER%XLONLAUNCH == XUNDEF ) THEN - CMNHMSG(1) = 'Error in balloon initial position (balloon ' // TRIM( TPFLYER%CTITLE ) // ' )' - CMNHMSG(2) = 'either LATitude or LONgitude is not given' - CMNHMSG(3) = 'Check your INI_BALLOON routine' - CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_AIRCRAFT_BALLOON' ) -END IF -! -CALL SM_XYHAT( PLATOR, PLONOR, TPFLYER%XLATLAUNCH, TPFLYER%XLONLAUNCH, TPFLYER%XXLAUNCH, TPFLYER%XYLAUNCH ) -! + END SUBROUTINE INI_LAUNCH !---------------------------------------------------------------------------- !---------------------------------------------------------------------------- @@ -533,50 +543,61 @@ SUBROUTINE INI_FLIGHT(KNBR,TPFLYER) ! INTEGER, INTENT(IN) :: KNBR CLASS(TAIRCRAFTDATA), INTENT(INOUT) :: TPFLYER -! -IF (TPFLYER%CMODEL == 'MOB' .AND. TPFLYER%NMODEL /= 0) TPFLYER%NMODEL=1 -IF (TPFLYER%NMODEL > NMODEL) TPFLYER%NMODEL=0 + +INTEGER :: IMODEL +INTEGER :: JSEG ! loop counter + IF ( IMI /= TPFLYER%NMODEL ) RETURN -! + LFLYER=.TRUE. -! -TPFLYER%TFLYER_TIME%XTSTEP = MAX ( PTSTEP, TPFLYER%TFLYER_TIME%XTSTEP ) -IF (TPFLYER%CTITLE==' ') THEN - WRITE(TPFLYER%CTITLE,FMT='(A6,I2.2)') TPFLYER%CTYPE,KNBR -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 -IF ( TPFLYER%NSEG == 0 ) THEN - CMNHMSG(1) = 'Error in aircraft flight path (aircraft ' // TRIM( TPFLYER%CTITLE ) // ' )' - CMNHMSG(2) = 'There is ZERO flight segment defined.' - CMNHMSG(3) = 'Check your INI_AIRCRAFT routine' - CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_FLIGHT' ) -END IF -! -IF ( ANY(TPFLYER%XSEGLAT(:)==XUNDEF) .OR. ANY(TPFLYER%XSEGLON(:)==XUNDEF) ) THEN - CMNHMSG(1) = 'Error in aircraft flight path (aircraft ' // TRIM( TPFLYER%CTITLE ) // ' )' - CMNHMSG(2) = 'either LATitude or LONgitude segment' - CMNHMSG(3) = 'definiton is not complete.' - CMNHMSG(4) = 'Check your INI_AIRCRAFT routine' - CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_FLIGHT' ) + CALL FLYER_TIMESTEP_CORRECT( DYN_MODEL(IMODEL)%XTSTEP, TPFLYER ) END IF -! -ALLOCATE(TPFLYER%XSEGX(TPFLYER%NSEG+1)) -ALLOCATE(TPFLYER%XSEGY(TPFLYER%NSEG+1)) -! -DO JSEG=1,TPFLYER%NSEG+1 - CALL SM_XYHAT( PLATOR, PLONOR, TPFLYER%XSEGLAT(JSEG), TPFLYER%XSEGLON(JSEG), TPFLYER%XSEGX(JSEG), TPFLYER%XSEGY(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%XSEGTIME(:)==XUNDEF) ) THEN - CMNHMSG(1) = 'Error in aircraft flight path (aircraft ' // TRIM( TPFLYER%CTITLE ) // ' )' - CMNHMSG(2) = 'definiton of segment duration is not complete.' - CMNHMSG(3) = 'Check your INI_AIRCRAFT routine' - CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_AIRCRAFT_BALLOON' ) -END IF 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 +!---------------------------------------------------------------------------- + !---------------------------------------------------------------------------- ! END SUBROUTINE INI_AIRCRAFT_BALLOON diff --git a/src/MNH/ini_balloon.f90 b/src/MNH/ini_balloon.f90 index cda0db7c2..3c3c4d6ae 100644 --- a/src/MNH/ini_balloon.f90 +++ b/src/MNH/ini_balloon.f90 @@ -118,10 +118,12 @@ IMPLICIT NONE INTEGER :: JI -ALLOCATE( TBALLOONS (NBALLOONS) ) +ALLOCATE( TBALLOONS(NBALLOONS) ) !Treat balloon data read in namelist DO JI = 1, NBALLOONS + TBALLOONS(JI)%NID = JI + IF ( CTITLE(JI) == '' ) THEN WRITE( CTITLE(JI), FMT = '( A, I3.3) ') TRIM( CTYPE(JI) ), JI @@ -143,6 +145,8 @@ DO JI = 1, NBALLOONS CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'INI_BALLOON', & 'NMODEL is set to 1 at start for a CMODEL="MOB" balloon (balloon ' // TRIM( CTITLE(JI) ) // ')' ) 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) ) diff --git a/src/MNH/modd_aircraft_balloon.f90 b/src/MNH/modd_aircraft_balloon.f90 index 4e71d254d..0ed8002ec 100644 --- a/src/MNH/modd_aircraft_balloon.f90 +++ b/src/MNH/modd_aircraft_balloon.f90 @@ -41,18 +41,23 @@ ! ------------ ! ! -use modd_parameters, only: XNEGUNDEF, XUNDEF +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 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) + LOGICAL :: LFLYER = .FALSE. ! flag to use aircraft/balloons -! + TYPE :: TFLYERDATA ! !* general information @@ -62,18 +67,21 @@ TYPE :: TFLYERDATA ! 'MOB' : change od model depends of the ! balloon/aircraft location INTEGER :: NMODEL = 0 ! model number for each balloon/aircraft + 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 ! launch/takeoff date and time + 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 @@ -82,10 +90,11 @@ TYPE :: TFLYERDATA REAL :: XY_CUR = XNEGUNDEF ! current y REAL :: XZ_CUR = XNEGUNDEF ! current z (if 'RADIOS' or 'AIRCRA' and 'ALTDEF' = T) REAL :: XP_CUR = XNEGUNDEF ! current p (if 'AIRCRA' and 'ALTDEF' = F) + INTEGER :: NRANK_CUR = NNEGUNDEF ! 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) @@ -126,16 +135,16 @@ TYPE, EXTENDS( TFLYERDATA ) :: TAIRCRAFTDATA ! !* aircraft flight definition ! - INTEGER :: NSEG = 0 ! number of aircraft flight segments - INTEGER :: NSEGCURN = 1 ! current flight segment number - REAL :: XSEGCURT = 0. ! current flight segment time spent - REAL, DIMENSION(:), ALLOCATABLE :: XSEGLAT ! latitude of flight segment extremities (LEG+1) - REAL, DIMENSION(:), ALLOCATABLE :: XSEGLON ! longitude of flight segment extremities (LEG+1) - REAL, DIMENSION(:), ALLOCATABLE :: XSEGX ! X of flight segment extremities (LEG+1) - REAL, DIMENSION(:), ALLOCATABLE :: XSEGY ! Y of flight segment extremities (LEG+1) - REAL, DIMENSION(:), ALLOCATABLE :: XSEGP ! pressure of flight segment extremities (LEG+1) - REAL, DIMENSION(:), ALLOCATABLE :: XSEGZ ! altitude of flight segment extremities (LEG+1) - REAL, DIMENSION(:), ALLOCATABLE :: XSEGTIME ! duration of flight segments (LEG ) + 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 ! @@ -159,6 +168,9 @@ TYPE, EXTENDS( TFLYERDATA ) :: TBALLOONDATA 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 diff --git a/src/MNH/modeln.f90 b/src/MNH/modeln.f90 index 8183346f1..6de3470a4 100644 --- a/src/MNH/modeln.f90 +++ b/src/MNH/modeln.f90 @@ -2112,16 +2112,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 -- GitLab From d21b58385fecc65a3cb776c58acde21180939526 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Fri, 25 Nov 2022 15:28:43 +0100 Subject: [PATCH 123/157] Philippe 25/11/2022: flyer data in files: add NMODELHIST + compute/write LWC only when it makes sense --- src/MNH/write_aircraft_balloon.f90 | 31 ++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/src/MNH/write_aircraft_balloon.f90 b/src/MNH/write_aircraft_balloon.f90 index dc7726bcd..d03d35acc 100644 --- a/src/MNH/write_aircraft_balloon.f90 +++ b/src/MNH/write_aircraft_balloon.f90 @@ -155,6 +155,7 @@ INTEGER :: JRR ! loop counter INTEGER :: JSV ! loop counter INTEGER :: JPT ! loop counter INTEGER :: IKU +REAL, DIMENSION(:), ALLOCATABLE :: ZLWC ! Temporary array to store/compute Liquid Water Content at flyer position type(tbudiachrometadata) :: tzbudiachro type(tfieldmetadata_base), dimension(:), allocatable :: tzfields ! @@ -171,7 +172,7 @@ IF ( IMI /= TPFLYER%NMODEL ) RETURN ! IKU = SIZE(TPFLYER%XRTZ,2) !number of vertical levels ! -IPROC = 20 + IRR + SIZE(TPFLYER%XSV,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)+ & @@ -211,6 +212,7 @@ SELECT TYPE ( TPFLYER ) 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(:) ) @@ -228,8 +230,9 @@ if ( irr >= 7 ) call Add_point( 'Rh', 'Hail mixing ratio', 'kg kg- ! !add cloud liquid water content in g/m3 to compare to measurements from FSSP !IF (.NOT.(ANY(TPFLYER%XP(:) == 0.))) THEN -ALLOCATE (ZRHO(1,1,ISTORE)) IF ( IRR > 1 ) THEN !cloud water is present + ALLOCATE( ZRHO(1, 1, ISTORE) ) + ALLOCATE( ZLWC(ISTORE) ) ZRHO(1,1,:) = 0. DO JRR = 1, IRR ZRHO(1,1,:) = ZRHO(1,1,:) + TPFLYER%XR(:,JRR) @@ -237,17 +240,21 @@ IF ( IRR > 1 ) THEN !cloud water is present ZRHO(1,1,:) = TPFLYER%XTH(:) * ( 1. + XRV/XRD*TPFLYER%XR(:,1) ) & / ( 1. + ZRHO(1,1,:) ) DO JPT=1,ISTORE - IF (TPFLYER%XP(JPT) == 0.) THEN - ZRHO(1,1,JPT) = 0. + 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%XP(JPT) / & - (XRD *ZRHO(1,1,JPT) *((TPFLYER%XP(JPT)/XP00)**(XRD/XCPD)) ) - ENDIF - ENDDO - call Add_point( 'LWC', 'cloud liquid water content', 'g m-3', tpflyer%xr(:,2)*ZRHO(1,1,:)*1.E3 ) - DEALLOCATE (ZRHO) -ENDIF -!ENDIF + ZLWC(JPT) = XUNDEF + END IF + END DO + call Add_point( 'LWC', 'cloud liquid water content', 'g m-3', ZLWC(:) ) + DEALLOCATE( ZLWC, ZRHO ) +END IF ! IF (SIZE(TPFLYER%XTKE)>0) call Add_point( 'Tke', 'Turbulent kinetic energy', 'm2 s-2', tpflyer%xtke(:) ) ! -- GitLab From a999fb49a87fc20b542d335278c402134bb4d2d7 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Wed, 30 Nov 2022 13:36:40 +0100 Subject: [PATCH 124/157] Philippe 30/11/2022: compute XTHW_FLUX, XRCW_FLUX and XSVW_FLUX only when needed --- src/MNH/phys_paramn.f90 | 28 ++++++++++--------- src/MNH/turb_ver_sv_flux.f90 | 17 ++++++++---- src/MNH/turb_ver_thermo_flux.f90 | 47 +++++++++++++++++++------------- 3 files changed, 54 insertions(+), 38 deletions(-) diff --git a/src/MNH/phys_paramn.f90 b/src/MNH/phys_paramn.f90 index bb9291239..2c314509d 100644 --- a/src/MNH/phys_paramn.f90 +++ b/src/MNH/phys_paramn.f90 @@ -237,12 +237,14 @@ 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 !!------------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ ! USE MODD_ADV_n, ONLY : XRTKEMS +USE MODD_AIRCRAFT_BALLOON, ONLY: LFLYER USE MODD_ARGSLIST_ll, ONLY : LIST_ll use modd_budget, only: lbudget_th, lbudget_rv, lbudget_rc, lbudget_ri, lbudget_sv, & NBUDGET_TH, NBUDGET_RV, NBUDGET_RC, NBUDGET_RI, NBUDGET_SV1, & @@ -1460,25 +1462,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 ! CALL TURB( 1, IKU, 1, IMI, NRR, NRRL, NRRI, CLBCX, CLBCY, 1, NMODEL_CLOUD, & diff --git a/src/MNH/turb_ver_sv_flux.f90 b/src/MNH/turb_ver_sv_flux.f90 index 8a742e185..a9dbae3d1 100644 --- a/src/MNH/turb_ver_sv_flux.f90 +++ b/src/MNH/turb_ver_sv_flux.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. @@ -263,11 +263,13 @@ END MODULE MODI_TURB_VER_SV_FLUX !! 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 +! P. Wautelet 30/11/2022: compute PWSV only when needed !!-------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ ! +USE MODD_AIRCRAFT_BALLOON, ONLY: LFLYER USE MODD_CST USE MODD_CTURB use modd_field, only: tfieldmetadata, TYPEREAL @@ -445,11 +447,14 @@ DO JSV=1,ISV ! extrapolates the flux under the ground so that the vertical average with ! the IKB flux gives the ground value ZFLXZ(:,:,KKA) = ZFLXZ(:,:,IKB) - DO JK=IKTB+1,IKTE-1 - PWSV(:,:,JK,JSV)=0.5*(ZFLXZ(:,:,JK)+ZFLXZ(:,:,JK+KKL)) - END DO - PWSV(:,:,IKB,JSV)=0.5*(ZFLXZ(:,:,IKB)+ZFLXZ(:,:,IKB+KKL)) - PWSV(:,:,IKE,JSV)=PWSV(:,:,IKE-KKL,JSV) + + IF ( LFLYER ) THEN + DO JK=IKTB+1,IKTE-1 + PWSV(:,:,JK,JSV)=0.5*(ZFLXZ(:,:,JK)+ZFLXZ(:,:,JK+KKL)) + END DO + PWSV(:,:,IKB,JSV)=0.5*(ZFLXZ(:,:,IKB)+ZFLXZ(:,:,IKB+KKL)) + PWSV(:,:,IKE,JSV)=PWSV(:,:,IKE-KKL,JSV) + END IF END IF ! IF (OTURB_FLX .AND. tpfile%lopened) THEN diff --git a/src/MNH/turb_ver_thermo_flux.f90 b/src/MNH/turb_ver_thermo_flux.f90 index 0febd151f..45f46987e 100644 --- a/src/MNH/turb_ver_thermo_flux.f90 +++ b/src/MNH/turb_ver_thermo_flux.f90 @@ -331,11 +331,13 @@ END MODULE MODI_TURB_VER_THERMO_FLUX !! 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 MODD_AIRCRAFT_BALLOON, ONLY: LFLYER USE MODD_CST USE MODD_CTURB use modd_field, only: tfieldmetadata, TYPEREAL @@ -722,19 +724,24 @@ IF (LOCEAN) THEN ZFLXZ(:,:,KKU) = ZFLXZ(:,:,IKE) END IF ! -DO JK=IKTB+1,IKTE-1 - PWTH(:,:,JK)=0.5*(ZFLXZ(:,:,JK)+ZFLXZ(:,:,JK+KKL)) -END DO -! -PWTH(:,:,IKB)=0.5*(ZFLXZ(:,:,IKB)+ZFLXZ(:,:,IKB+KKL)) -! -IF (LOCEAN) THEN - PWTH(:,:,IKE)=0.5*(ZFLXZ(:,:,IKE)+ZFLXZ(:,:,IKE+KKL)) - PWTH(:,:,KKA)=0. - PWTH(:,:,KKU)=ZFLXZ(:,:,KKU) -ELSE - PWTH(:,:,IKE)=PWTH(:,:,IKE-KKL) - PWTH(:,:,KKA)=0.5*(ZFLXZ(:,:,KKA)+ZFLXZ(:,:,KKA+KKL)) +IF ( LFLYER ) THEN + PWTH(:,:,:IKTB) = XUNDEF + PWTH(:,:,IKTE:) = XUNDEF + ! + DO JK=IKTB+1,IKTE-1 + PWTH(:,:,JK)=0.5*(ZFLXZ(:,:,JK)+ZFLXZ(:,:,JK+KKL)) + END DO + ! + PWTH(:,:,IKB)=0.5*(ZFLXZ(:,:,IKB)+ZFLXZ(:,:,IKB+KKL)) + ! + IF (LOCEAN) THEN + PWTH(:,:,IKE)=0.5*(ZFLXZ(:,:,IKE)+ZFLXZ(:,:,IKE+KKL)) + PWTH(:,:,KKA)=0. + PWTH(:,:,KKU)=ZFLXZ(:,:,KKU) + ELSE + PWTH(:,:,IKE)=PWTH(:,:,IKE-KKL) + PWTH(:,:,KKA)=0.5*(ZFLXZ(:,:,KKA)+ZFLXZ(:,:,KKA+KKL)) + END IF END IF ! IF ( OTURB_FLX .AND. tpfile%lopened ) THEN @@ -966,12 +973,14 @@ IF (KRR /= 0) THEN ! ZFLXZ(:,:,KKA) = ZFLXZ(:,:,IKB) ! - DO JK=IKTB+1,IKTE-1 - PWRC(:,:,JK)=0.5*(ZFLXZ(:,:,JK)+ZFLXZ(:,:,JK+KKL)) - END DO - PWRC(:,:,IKB)=0.5*(ZFLXZ(:,:,IKB)+ZFLXZ(:,:,IKB+KKL)) - PWRC(:,:,KKA)=0.5*(ZFLXZ(:,:,KKA)+ZFLXZ(:,:,KKA+KKL)) - PWRC(:,:,IKE)=PWRC(:,:,IKE-KKL) + IF ( LFLYER ) THEN + DO JK=IKTB+1,IKTE-1 + PWRC(:,:,JK)=0.5*(ZFLXZ(:,:,JK)+ZFLXZ(:,:,JK+KKL)) + END DO + PWRC(:,:,IKB)=0.5*(ZFLXZ(:,:,IKB)+ZFLXZ(:,:,IKB+KKL)) + PWRC(:,:,KKA)=0.5*(ZFLXZ(:,:,KKA)+ZFLXZ(:,:,KKA+KKL)) + PWRC(:,:,IKE)=PWRC(:,:,IKE-KKL) + END IF ! ! IF ( OTURB_FLX .AND. tpfile%lopened ) THEN -- GitLab From 1358525288bde7e22e485496be5d62dc4d54ce47 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Wed, 30 Nov 2022 14:34:52 +0100 Subject: [PATCH 125/157] Philippe 30/11/2022: spl: add support for PURE and ELEMENTAL functions and subroutines --- bin/spl | 85 +++++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 77 insertions(+), 8 deletions(-) diff --git a/bin/spl b/bin/spl index 7d6e4158a..9497c5b36 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 } } -- GitLab From 4b06fb52bb4553436ce6597a6f2a888ce33d707f Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Wed, 30 Nov 2022 14:38:13 +0100 Subject: [PATCH 126/157] Philippe 30/11/2022: WATER_SUM is now a PURE function --- src/MNH/water_sum.f90 | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/src/MNH/water_sum.f90 b/src/MNH/water_sum.f90 index 845b99c48..46a899cda 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) !! -- GitLab From adc7a81a3a742a7c5a7b45011b78b60c1fade5cd Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Wed, 30 Nov 2022 16:27:26 +0100 Subject: [PATCH 127/157] Philippe 30/11/2022: CF conventions 1.10 (support for groups was added in version 1.8) --- src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 b/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 index 43a779e3e..54c01012f 100644 --- a/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 +++ b/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 @@ -2339,7 +2339,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) -- GitLab From bbaf5704ac941da6c56e9dcceb130eadf4e83398 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Fri, 2 Dec 2022 10:39:07 +0100 Subject: [PATCH 128/157] Philippe 02/12/2022: aircraft_balloon_evol: first cleaning + better organisation of the source + correction of several bugs --- src/MNH/aircraft_balloon_evol.f90 | 2928 ++++++++++++----------------- 1 file changed, 1216 insertions(+), 1712 deletions(-) diff --git a/src/MNH/aircraft_balloon_evol.f90 b/src/MNH/aircraft_balloon_evol.f90 index 5b52ea22f..a246e4391 100644 --- a/src/MNH/aircraft_balloon_evol.f90 +++ b/src/MNH/aircraft_balloon_evol.f90 @@ -102,7 +102,7 @@ CONTAINS ! ------------ ! USE MODD_AIRCRAFT_BALLOON -USE MODD_CONF +USE MODD_CONF, ONLY: LCARTESIAN USE MODD_CST USE MODD_DIAG_IN_RUN USE MODD_GRID @@ -110,31 +110,8 @@ USE MODD_GRID_n USE MODD_IO, ONLY: ISP 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 -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 -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_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,& - XRTMIN_I=>XRTMIN,XCONC_LAND,XCONC_SEA USE MODD_REF_n, ONLY: XRHODREF USE MODD_TIME, only: TDTSEG USE MODD_TIME_n, only: tdtcur @@ -145,11 +122,6 @@ USE MODE_FGAU, ONLY: GAULAG USE MODE_FSCATTER, ONLY: QEPSW,QEPSI,BHMIE,MOMG,MG USE MODE_GRIDPROJ USE MODE_ll -USE MODE_POSITION_TOOLS, ONLY: FIND_PROCESS_AND_MODEL_FROM_XY_POS -USE MODE_STATPROF_TOOLS, ONLY: STATPROF_INSTANT -! -USE MODI_GAMMA, ONLY: GAMMA -USE MODI_WATER_SUM ! IMPLICIT NONE ! @@ -185,13 +157,7 @@ REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PSEA INTEGER :: IMI ! model index REAL :: ZTHIS_PROC ! 1 if balloon is currently treated by this proc., else 0 ! -INTEGER :: IIB ! current process domain sizes -INTEGER :: IJB -INTEGER :: IIE -INTEGER :: IJE -INTEGER :: IIU -INTEGER :: IJU -INTEGER :: IKB +INTEGER :: IKB ! vertical domain sizes INTEGER :: IKE INTEGER :: IKU ! @@ -202,8 +168,6 @@ 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 @@ -212,7 +176,6 @@ 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 :: 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 ! @@ -262,43 +225,12 @@ 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,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 :: 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 ! -INTEGER :: IRANK INTEGER :: IMODEL -INTEGER :: IMODEL_OLD -REAL :: ZX_OLD, ZY_OLD -REAL :: ZDELTATIME REAL :: ZTSTEP -REAL :: ZDIVTMP !---------------------------------------------------------------------------- IKU = SIZE(PZ,3) @@ -307,710 +239,56 @@ CALL GET_MODEL_NUMBER_ll(IMI) SELECT TYPE ( TPFLYER ) CLASS IS ( TAIRCRAFTDATA) - !Do the positioning only if model 1 (data will be available to others after) - MODEL1: IF ( IMI == 1 ) THEN + MODEL1AIR: IF ( IMI == 1 ) THEN !Do we have to store aircraft data? - CALL STATPROF_INSTANT( TPFLYER%TFLYER_TIME, ISTORE ) - IF ( ISTORE < 1 ) THEN - !No profiler storage at this time step - TPFLYER%LSTORE = .FALSE. - RETURN - ELSE - TPFLYER%LSTORE = .TRUE. - END IF + CALL FLYER_CHECK_STORESTEP( TPFLYER ) ! Is the aircraft in flight ? IF ( TDTCUR >= TPFLYER%TLAUNCH .AND. TDTCUR <= TPFLYER%TLAND ) THEN TPFLYER%LFLY = .TRUE. - ! Find the flight segment - ZTDIST = TDTCUR - TPFLYER%TLAUNCH - IL = TPFLYER%NPOSCUR - DO WHILE ( ZTDIST > TPFLYER%XPOSTIME(IL+1) ) - IL = IL + 1 - IF ( IL > TPFLYER%NPOS-1 ) THEN - !Security (should not happen) - IL = TPFLYER%NPOS-1 - EXIT - END IF - END DO - TPFLYER%NPOSCUR = IL - - ! Compute the current position - ZSEG_FRAC = ( ZTDIST - TPFLYER%XPOSTIME(IL) ) / ( TPFLYER%XPOSTIME(IL+1) - TPFLYER%XPOSTIME(IL) ) - - TPFLYER%XX_CUR = (1.-ZSEG_FRAC) * TPFLYER%XPOSX(IL ) & - + ZSEG_FRAC * TPFLYER%XPOSX(IL+1) - TPFLYER%XY_CUR = (1.-ZSEG_FRAC) * TPFLYER%XPOSY(IL ) & - + ZSEG_FRAC * TPFLYER%XPOSY(IL+1) - IF (TPFLYER%LALTDEF) THEN - TPFLYER%XP_CUR = (1.-ZSEG_FRAC) * TPFLYER%XPOSP(IL ) & - + ZSEG_FRAC * TPFLYER%XPOSP(IL+1) - ELSE - TPFLYER%XZ_CUR = (1.-ZSEG_FRAC) * TPFLYER%XPOSZ(IL ) & - + ZSEG_FRAC * TPFLYER%XPOSZ(IL +1 ) - END IF + ! Compute current position + CALL AIRCRAFT_COMPUTE_POSITION( TDTCUR, TPFLYER ) ! Get rank of the process where the aircraft is and the model number - IF ( TPFLYER%CMODEL == 'FIX' ) THEN - IMODEL = TPFLYER%NMODEL - ELSE - IMODEL = 0 - END IF - CALL FIND_PROCESS_AND_MODEL_FROM_XY_POS( TPFLYER%XX_CUR, TPFLYER%XY_CUR, IRANK, IMODEL ) - IF ( IRANK < 1 ) THEN - TPFLYER%NMODEL = 1 !Set to 1 because it is always a valid model (to prevent crash if NDAD(TPFLYER%NMODEL) ) - TPFLYER%LCRASH = .TRUE. - TPFLYER%NCRASH = NCRASH_OUT_HORIZ - TPFLYER%LFLY = .FALSE. - ELSE - TPFLYER%NMODEL = IMODEL - TPFLYER%LCRASH = .FALSE. - TPFLYER%NCRASH = NCRASH_NO - TPFLYER%NRANK_CUR = IRANK - END IF + CALL FLYER_GET_RANK_MODEL_ISCRASHED( TPFLYER ) ELSE TPFLYER%LFLY = .FALSE. - END IF - END IF MODEL1 + END IF MODEL1AIR - IF ( IMI == TPFLYER%NMODEL .AND. TPFLYER%LFLY ) THEN + ! For aircrafts, data has only to be computed at store moments + IF ( IMI == TPFLYER%NMODEL .AND. TPFLYER%LFLY .AND. TPFLYER%LSTORE ) THEN + ISTORE = TPFLYER%TFLYER_TIME%N_CUR ! 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 - - ISOWNER: IF ( TPFLYER%NRANK_CUR == ISP ) THEN - ZTHIS_PROC = 1. - ! - !* 2. PRELIMINARIES-2 - ! ------------- - ! - !* 2.1 Indices - ! ------- - ! - CALL GET_INDICE_ll (IIB,IJB,IIE,IJE) - - IKB = 1 + JPVEXT - IKE = SIZE(PZ,3) - JPVEXT - ! - ! - !* 2.2 Interpolations of model variables to mass points - ! ------------------------------------------------ - ! - IIU=SIZE(XXHAT) - IJU=SIZE(XYHAT) - ! 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 ) - ! - !* 4.5 Interpolations of model variables to mass points - ! ------------------------------------------------ - ! - 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) - ! - !---------------------------------------------------------------------------- - ! - !* 5. BALLOON/AIRCRAFT VERTICAL POSITION - ! ---------------------------------- - ! - ! - !* 5.1 Density - ! ------- - ! - ZEXN(:,:,: ) = (PP(II_M:II_M+1,IJ_M:IJ_M+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) - END DO - ! - ! IF ( TPFLYER%CTYPE == 'ISODEN' .OR. TPFLYER%CTYPE == 'CVBALL' .OR. TPFLYER%CTYPE == 'AIRCRA' ) THEN - 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,:,:)) ) - ! - ZTV (:,:,:) = ZTHV(:,:,:) * ZEXN(:,:,:) - ZRHO(:,:,:) = PP(II_M:II_M+1,IJ_M:IJ_M+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_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,:,:) - ! END IF - - ! Vertical position - 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 + IF ( ABS( TDTCUR - TPFLYER%TFLYER_TIME%TPDATES(ISTORE) ) < 1e-10 ) THEN + ISOWNERAIR: IF ( TPFLYER%NRANK_CUR == ISP ) THEN + ZTHIS_PROC = 1. - 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', 'AIRCRAFT_BALLOON_EVOL', OLOCAL = .TRUE. ) - END IF + CALL FLYER_INTERP_TO_MASSPOINTS() - IF (IK00 >= IKE .OR. IK01 >= IKE .OR. IK10 >= IKE .OR. IK11 >= IKE ) THEN - TPFLYER%LCRASH = .TRUE. - TPFLYER%NCRASH = NCRASH_OUT_HIGH - END IF - ! - !* 6. INITIALIZATIONS FOR INTERPOLATIONS - ! ---------------------------------- - ! - !* 6.1 Interpolation coefficient for X - ! ------------------------------- - ! - ZXCOEF = (TPFLYER%XX_CUR - XXHATM(II_M)) / (XXHATM(II_M+1) - XXHATM(II_M)) - ZXCOEF = MAX (0.,MIN(ZXCOEF,1.)) - ! - ! - !* 6.2 Interpolation coefficient for y - ! ------------------------------- - ! - ZYCOEF = (TPFLYER%XY_CUR - XYHATM(IJ_M)) / (XYHATM(IJ_M+1) - XYHATM(IJ_M)) - ZYCOEF = MAX (0.,MIN(ZYCOEF,1.)) - ! - ! - !* 6.3 Interpolation coefficients for the 4 suroundings verticals - ! ---------------------------------------------------------- - ! - ! SELECT TYPE ( TPFLYER ) - ! 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 - ! - ! 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 SELECT - ! - !---------------------------------------------------------------------------- - ! - !* 7. INITIALIZATIONS FOR INTERPOLATIONS OF U AND V - ! --------------------------------------------- - ! - !* 7.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.)) - ! - ! - !* 7.2 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.)) - ! - ! - !* 7.3 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) ) - ! - ! - !* 7.4 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) ) - ! - ! - !* 8. DATA RECORDING - ! -------------- - ! - TPFLYER%NMODELHIST(ISTORE) = TPFLYER%NMODEL - TPFLYER%XX (ISTORE) = TPFLYER%XX_CUR - TPFLYER%XY (ISTORE) = TPFLYER%XY_CUR - TPFLYER%XZ (ISTORE) = TPFLYER%XZ_CUR - ! - 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) - ! - 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) - - 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 - ! Fin Modifs ON - 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(:,:,:)) - ENDIF - ! 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 - 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 - 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 - 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 - 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*ZCC*ZLBDA**ZCX/(4.*GAMMA(ZNU)*.93) - ZAETMP=ZAETMP * XPI *ZCC*ZLBDA**ZCX/(4.*GAMMA(ZNU)) - TPFLYER%XCRARE(ISTORE,JK)=TPFLYER%XCRARE(ISTORE,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%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 - TPFLYER%XCRARE_ATT(ISTORE,JK)=TPFLYER%XCRARE(ISTORE,JK)*ZAETOT - END DO - ! 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 - 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 - - ELSE ISOWNER - - ZTHIS_PROC = 0. - - END IF ISOWNER + ZEXN(:,:,:) = FLYER_COMPUTE_EXNER( ) + ZRHO(:,:,:) = FLYER_COMPUTE_RHO( ) -!---------------------------------------------------------------------------- - ! - !* 11. EXCHANGE OF INFORMATION BETWEEN PROCESSES - ! ----------------------------------------- - ! - !* 11.1 current position - ! ---------------- - ! - ! - !* 11.2 data stored - ! ----------- - ! - ! IF ( GSTORE ) THEN - CALL DISTRIBUTE_FLYER_N(TPFLYER%NMODELHIST(ISTORE)) - CALL DISTRIBUTE_FLYER(TPFLYER%XX (ISTORE)) - CALL DISTRIBUTE_FLYER(TPFLYER%XY (ISTORE)) - CALL DISTRIBUTE_FLYER(TPFLYER%XZ (ISTORE)) - CALL DISTRIBUTE_FLYER(TPFLYER%XLON(ISTORE)) - CALL DISTRIBUTE_FLYER(TPFLYER%XLAT(ISTORE)) - CALL DISTRIBUTE_FLYER(TPFLYER%XZON(ISTORE)) - CALL DISTRIBUTE_FLYER(TPFLYER%XMER(ISTORE)) - CALL DISTRIBUTE_FLYER(TPFLYER%XW (ISTORE)) - CALL DISTRIBUTE_FLYER(TPFLYER%XP (ISTORE)) - CALL DISTRIBUTE_FLYER(TPFLYER%XTH (ISTORE)) - DO JLOOP=1,SIZE(PR,4) - CALL DISTRIBUTE_FLYER(TPFLYER%XR (ISTORE,JLOOP)) - END DO - DO JLOOP=1,SIZE(PSV,4) - CALL DISTRIBUTE_FLYER(TPFLYER%XSV (ISTORE,JLOOP)) - END DO - DO JLOOP=1,IKU - CALL DISTRIBUTE_FLYER(TPFLYER%XRTZ (ISTORE,JLOOP)) - DO JLOOP2=1,SIZE(PR,4) - CALL DISTRIBUTE_FLYER(TPFLYER%XRZ (ISTORE,JLOOP,JLOOP2)) - ENDDO - CALL DISTRIBUTE_FLYER(TPFLYER%XFFZ (ISTORE,JLOOP)) - CALL DISTRIBUTE_FLYER(TPFLYER%XCIZ (ISTORE,JLOOP)) - IF (CCLOUD== 'LIMA' ) THEN - CALL DISTRIBUTE_FLYER(TPFLYER%XCRZ (ISTORE,JLOOP)) - CALL DISTRIBUTE_FLYER(TPFLYER%XCCZ (ISTORE,JLOOP)) - ENDIF - CALL DISTRIBUTE_FLYER(TPFLYER%XIWCZ (ISTORE,JLOOP)) - CALL DISTRIBUTE_FLYER(TPFLYER%XLWCZ (ISTORE,JLOOP)) - CALL DISTRIBUTE_FLYER(TPFLYER%XCRARE (ISTORE,JLOOP)) - CALL DISTRIBUTE_FLYER(TPFLYER%XCRARE_ATT (ISTORE,JLOOP)) - CALL DISTRIBUTE_FLYER(TPFLYER%XWZ (ISTORE,JLOOP)) - CALL DISTRIBUTE_FLYER(TPFLYER%XZZ (ISTORE,JLOOP)) - END DO - IF (SIZE(PTKE)>0) CALL DISTRIBUTE_FLYER(TPFLYER%XTKE (ISTORE)) - IF (SIZE(PTS) >0) CALL DISTRIBUTE_FLYER(TPFLYER%XTSRAD(ISTORE)) - IF (LDIAG_IN_RUN) CALL DISTRIBUTE_FLYER(TPFLYER%XTKE_DISS(ISTORE)) - CALL DISTRIBUTE_FLYER(TPFLYER%XZS (ISTORE)) - CALL DISTRIBUTE_FLYER(TPFLYER%XTHW_FLUX(ISTORE)) - CALL DISTRIBUTE_FLYER(TPFLYER%XRCW_FLUX(ISTORE)) - DO JLOOP=1,SIZE(PSV,4) - CALL DISTRIBUTE_FLYER(TPFLYER%XSVW_FLUX(ISTORE,JLOOP)) - END DO - END IF + 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( ) + ELSE ISOWNERAIR + !Not owner branch + ZTHIS_PROC = 0. + END IF ISOWNERAIR + + CALL FLYER_COMMUNICATE_DATA( ) END IF END IF @@ -1023,30 +301,16 @@ SELECT TYPE ( TPFLYER ) ! (XXHAT_ll of all models are needed by FIND_PROCESS_AND_MODEL_FROM_XY_POS) IF ( .NOT. TPFLYER%LFLY .AND. .NOT. TPFLYER%LCRASH .AND. TPFLYER%NRANK_CUR < 0 ) THEN ! Get rank of the process where the balloon is and the model number - IF ( TPFLYER%CMODEL == 'FIX' ) THEN - IMODEL = TPFLYER%NMODEL - ELSE - IMODEL = 0 - END IF - CALL FIND_PROCESS_AND_MODEL_FROM_XY_POS( TPFLYER%XXLAUNCH, TPFLYER%XYLAUNCH, IRANK, IMODEL ) - - IF ( IRANK < 1 ) THEN - TPFLYER%NMODEL = 1 !Set to 1 because it is always a valid model (to prevent crash if NDAD(TPFLYER%NMODEL) ) - TPFLYER%LCRASH = .TRUE. - TPFLYER%NCRASH = NCRASH_OUT_HORIZ - TPFLYER%LFLY = .FALSE. + CALL FLYER_GET_RANK_MODEL_ISCRASHED( TPFLYER, PX = TPFLYER%XXLAUNCH, PY = TPFLYER%XYLAUNCH ) + IF ( TPFLYER%LCRASH ) THEN CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'AIRCRAFT_BALLOON_EVOL', 'balloon ' // TRIM( TPFLYER%CTITLE ) & // ': launch coordinates are outside of horizontal physical domain' ) - ELSE - TPFLYER%NMODEL = IMODEL - TPFLYER%LCRASH = .FALSE. - TPFLYER%NCRASH = NCRASH_NO - TPFLYER%NRANK_CUR = IRANK END IF END IF ! 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. @@ -1054,890 +318,74 @@ SELECT TYPE ( TPFLYER ) TPFLYER%XX_CUR = TPFLYER%XXLAUNCH TPFLYER%XY_CUR = TPFLYER%XYLAUNCH TPFLYER%TPOS_CUR = TDTCUR + ! Get rank of the process where the balloon is and the model number - IF ( TPFLYER%CMODEL == 'FIX' ) THEN - IMODEL = TPFLYER%NMODEL - ELSE - IMODEL = 0 - END IF - CALL FIND_PROCESS_AND_MODEL_FROM_XY_POS( TPFLYER%XX_CUR, TPFLYER%XY_CUR, IRANK, IMODEL ) - IF ( IRANK < 1 ) THEN - TPFLYER%NMODEL = 1 !Set to 1 because it is always a valid model (to prevent crash if NDAD(TPFLYER%NMODEL) ) - TPFLYER%LCRASH = .TRUE. - TPFLYER%NCRASH = NCRASH_OUT_HORIZ - TPFLYER%LFLY = .FALSE. + CALL FLYER_GET_RANK_MODEL_ISCRASHED( TPFLYER ) + IF ( TPFLYER%LCRASH ) THEN WRITE( CMNHMSG(1), "( 'Balloon ', A, ' crashed the ', I2, '/', I2, '/', I4, ' at ', F18.12, & 's (out of the horizontal boundaries)' )" ) & TRIM( TPFLYER%CTITLE ), TDTCUR%NDAY, TDTCUR%NMONTH, TDTCUR%NYEAR, TDTCUR%XTIME CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'AIRCRAFT_BALLOON_EVOL' ) - ELSE - TPFLYER%NMODEL = IMODEL - TPFLYER%LCRASH = .FALSE. - TPFLYER%NCRASH = NCRASH_NO - TPFLYER%NRANK_CUR = IRANK END IF END IF LAUNCHTIME END IF LAUNCH - MODEL1BAL: IF ( TPFLYER%NMODEL == IMI .AND. & + ! 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 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 IF MODEL1BAL + 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 ZTHIS_PROC = 1. - ! - !* 2. PRELIMINARIES-2 - ! ------------- - ! - !* 2.1 Indices - ! ------- - ! - CALL GET_INDICE_ll (IIB,IJB,IIE,IJE) - IKB = 1 + JPVEXT - IKE = SIZE(PZ,3) - JPVEXT - ! - ! - !* 2.2 Interpolations of model variables to mass points - ! ------------------------------------------------ - ! - IIU=SIZE(XXHAT) - IJU=SIZE(XYHAT) - ! 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 ) - ! - !* 4.5 Interpolations of model variables to mass points - ! ------------------------------------------------ - ! - 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) - ! - !---------------------------------------------------------------------------- - ! - !* 5. BALLOON/AIRCRAFT VERTICAL POSITION - ! ---------------------------------- - ! - ! - !* 5.1 Density - ! ------- - ! - ZEXN(:,:,: ) = (PP(II_M:II_M+1,IJ_M:IJ_M+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) - END DO - ! - IF ( TPFLYER%CTYPE == 'ISODEN' .OR. TPFLYER%CTYPE == 'CVBALL' .OR. TPFLYER%CTYPE == 'AIRCRA' ) THEN - 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,:,:)) ) - ! - ZTV (:,:,:) = ZTHV(:,:,:) * ZEXN(:,:,:) - ZRHO(:,:,:) = PP(II_M:II_M+1,IJ_M:IJ_M+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_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,:,:) - END IF - SELECT CASE ( TPFLYER%CTYPE ) - ! - !* 5.2.1 Iso-density balloon - ! - CASE ( 'ISODEN' ) - ZXCOEF = (TPFLYER%XX_CUR - XXHATM(II_M)) / (XXHATM(II_M+1) - XXHATM(II_M)) - ZXCOEF = MAX (0.,MIN(ZXCOEF,1.)) - ZYCOEF = (TPFLYER%XY_CUR - XYHATM(IJ_M)) / (XYHATM(IJ_M+1) - XYHATM(IJ_M)) - ZYCOEF = MAX (0.,MIN(ZYCOEF,1.)) - IF ( TPFLYER%XALTLAUNCH /= XNEGUNDEF ) THEN - IK00 = MAX ( COUNT (TPFLYER%XALTLAUNCH >= ZZM(1,1,:)), 1) - IK01 = MAX ( COUNT (TPFLYER%XALTLAUNCH >= ZZM(1,2,:)), 1) - IK10 = MAX ( COUNT (TPFLYER%XALTLAUNCH >= ZZM(2,1,:)), 1) - IK11 = MAX ( COUNT (TPFLYER%XALTLAUNCH >= ZZM(2,2,:)), 1) - ZZCOEF00 = (TPFLYER%XALTLAUNCH - ZZM(1,1,IK00)) / ( ZZM(1,1,IK00+1) - ZZM(1,1,IK00)) - ZZCOEF01 = (TPFLYER%XALTLAUNCH - ZZM(1,2,IK01)) / ( ZZM(1,2,IK01+1) - ZZM(1,2,IK01)) - ZZCOEF10 = (TPFLYER%XALTLAUNCH - ZZM(2,1,IK10)) / ( ZZM(2,1,IK10+1) - ZZM(2,1,IK10)) - ZZCOEF11 = (TPFLYER%XALTLAUNCH - ZZM(2,2,IK11)) / ( ZZM(2,2,IK11+1) - ZZM(2,2,IK11)) - TPFLYER%XRHO = FLYER_INTERP(ZRHO) - ELSE IF ( TPFLYER%XPRES /= XNEGUNDEF ) THEN - ZFLYER_EXN = (TPFLYER%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)) - TPFLYER%XRHO = FLYER_INTERP(ZRHO) - ELSE - CMNHMSG(1) = 'Error in balloon initial position (balloon ' // TRIM(TPFLYER%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 - ! - !* 5.2.2 Radiosounding balloon - ! - CASE ( 'RADIOS' ) - TPFLYER%XZ_CUR = TPFLYER%XALTLAUNCH - TPFLYER%XZ_CUR = MAX ( TPFLYER%XZ_CUR , ZZM(1,1,IKB) ) - TPFLYER%XZ_CUR = MAX ( TPFLYER%XZ_CUR , ZZM(2,1,IKB) ) - TPFLYER%XZ_CUR = MAX ( TPFLYER%XZ_CUR , ZZM(1,2,IKB) ) - TPFLYER%XZ_CUR = MAX ( TPFLYER%XZ_CUR , ZZM(2,2,IKB) ) - ! - !* 5.2.4 Constant Volume Balloon - ! - CASE ( 'CVBALL' ) - ZXCOEF = (TPFLYER%XX_CUR - XXHATM(II_M)) / (XXHATM(II_M+1) - XXHATM(II_M)) - ZXCOEF = MAX (0.,MIN(ZXCOEF,1.)) - ZYCOEF = (TPFLYER%XY_CUR - XYHATM(IJ_M)) / (XYHATM(IJ_M+1) - XYHATM(IJ_M)) - ZYCOEF = MAX (0.,MIN(ZYCOEF,1.)) - IF ( TPFLYER%XALTLAUNCH /= XNEGUNDEF ) THEN - IK00 = MAX ( COUNT (TPFLYER%XALTLAUNCH >= ZZM(1,1,:)), 1) - IK01 = MAX ( COUNT (TPFLYER%XALTLAUNCH >= ZZM(1,2,:)), 1) - IK10 = MAX ( COUNT (TPFLYER%XALTLAUNCH >= ZZM(2,1,:)), 1) - IK11 = MAX ( COUNT (TPFLYER%XALTLAUNCH >= ZZM(2,2,:)), 1) - IF (IK00*IK01*IK10*IK11 .EQ. 0) THEN - TPFLYER%XZ_CUR = TPFLYER%XALTLAUNCH - TPFLYER%XZ_CUR = MAX ( TPFLYER%XZ_CUR , ZZM(1,1,IKB) ) - TPFLYER%XZ_CUR = MAX ( TPFLYER%XZ_CUR , ZZM(2,1,IKB) ) - TPFLYER%XZ_CUR = MAX ( TPFLYER%XZ_CUR , ZZM(1,2,IKB) ) - TPFLYER%XZ_CUR = MAX ( TPFLYER%XZ_CUR , ZZM(2,2,IKB) ) - ELSE - ZZCOEF00 = (TPFLYER%XALTLAUNCH - ZZM(1,1,IK00)) / ( ZZM(1,1,IK00+1) - ZZM(1,1,IK00)) - ZZCOEF01 = (TPFLYER%XALTLAUNCH - ZZM(1,2,IK01)) / ( ZZM(1,2,IK01+1) - ZZM(1,2,IK01)) - ZZCOEF10 = (TPFLYER%XALTLAUNCH - ZZM(2,1,IK10)) / ( ZZM(2,1,IK10+1) - ZZM(2,1,IK10)) - ZZCOEF11 = (TPFLYER%XALTLAUNCH - ZZM(2,2,IK11)) / ( ZZM(2,2,IK11+1) - ZZM(2,2,IK11)) - TPFLYER%XRHO = FLYER_INTERP(ZRHO) - TPFLYER%XZ_CUR = FLYER_INTERP(ZZM) - END IF - ELSE IF ( TPFLYER%XPRES /= XNEGUNDEF ) THEN - ZFLYER_EXN = (TPFLYER%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 - TPFLYER%XZ_CUR = ZZM(1,1,IKB) - TPFLYER%XZ_CUR = MAX ( TPFLYER%XZ_CUR , ZZM(2,1,IKB) ) - TPFLYER%XZ_CUR = MAX ( TPFLYER%XZ_CUR , ZZM(1,2,IKB) ) - TPFLYER%XZ_CUR = MAX ( TPFLYER%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)) - TPFLYER%XRHO = FLYER_INTERP(ZRHO) - TPFLYER%XZ_CUR = FLYER_INTERP(ZZM) - END IF - ELSE - TPFLYER%XRHO = TPFLYER%XMASS / TPFLYER%XVOLUME - 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) - IF (IK00*IK01*IK10*IK11 .EQ. 0) THEN - TPFLYER%XZ_CUR = ZZM(1,1,IKB) - TPFLYER%XZ_CUR = MAX ( TPFLYER%XZ_CUR , ZZM(2,1,IKB) ) - TPFLYER%XZ_CUR = MAX ( TPFLYER%XZ_CUR , ZZM(1,2,IKB) ) - TPFLYER%XZ_CUR = MAX ( TPFLYER%XZ_CUR , ZZM(2,2,IKB) ) - ELSE - 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) - END IF - END IF - END SELECT - END IF LAUNCHVERTPOS - ! - ! - ! - !* 5.3 Vertical position - ! ----------------- -! - 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 - 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', 'AIRCRAFT_BALLOON_EVOL' , OLOCAL = .TRUE.) - END IF + 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( ) - ! - ! - !* 5.4 Crash of the balloon - ! -------------------- - ! - ! - IF (IK00 < IKB .OR. IK01 < IKB .OR. IK10 < IKB .OR. IK11 < IKB ) THEN - TPFLYER%LCRASH = .TRUE. - TPFLYER%NCRASH = NCRASH_OUT_LOW - END IF - IF (IK00 >= IKE .OR. IK01 >= IKE .OR. IK10 >= IKE .OR. IK11 >= IKE ) THEN - TPFLYER%LCRASH = .TRUE. - TPFLYER%NCRASH = NCRASH_OUT_HIGH - END IF 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. ) + 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 - ! - !* 6. INITIALIZATIONS FOR INTERPOLATIONS - ! ---------------------------------- - ! - !* 6.1 Interpolation coefficient for X - ! ------------------------------- - ! - ZXCOEF = (TPFLYER%XX_CUR - XXHATM(II_M)) / (XXHATM(II_M+1) - XXHATM(II_M)) - ZXCOEF = MAX (0.,MIN(ZXCOEF,1.)) - ! - ! - !* 6.2 Interpolation coefficient for y - ! ------------------------------- - ! - ZYCOEF = (TPFLYER%XY_CUR - XYHATM(IJ_M)) / (XYHATM(IJ_M+1) - XYHATM(IJ_M)) - ZYCOEF = MAX (0.,MIN(ZYCOEF,1.)) - ! - ! - !* 6.3 Interpolation coefficients for the 4 suroundings verticals - ! ---------------------------------------------------------- - ! - ! SELECT TYPE ( TPFLYER ) - ! 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 - !---------------------------------------------------------------------------- - ! - !* 7. INITIALIZATIONS FOR INTERPOLATIONS OF U AND V - ! --------------------------------------------- - ! - !* 7.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.)) - ! - ! - !* 7.2 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.)) - ! - ! - !* 7.3 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) ) - ! - ! - !* 7.4 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) ) + + ! 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 - ! - !* 2. PRELIMINARIES-2 - ! ------------- - ! - !* 2.1 Indices - ! ------- - ! - CALL GET_INDICE_ll (IIB,IJB,IIE,IJE) - - IKB = 1 + JPVEXT - IKE = SIZE(PZ,3) - JPVEXT - ! - ! - !* 2.2 Interpolations of model variables to mass points - ! ------------------------------------------------ - ! - IIU=SIZE(XXHAT) - IJU=SIZE(XYHAT) - - TPFLYER%NMODELHIST(ISTORE) = TPFLYER%NMODEL - TPFLYER%XX (ISTORE) = TPFLYER%XX_CUR - TPFLYER%XY (ISTORE) = TPFLYER%XY_CUR - TPFLYER%XZ (ISTORE) = TPFLYER%XZ_CUR - ! - 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) - ! - 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) - ! - 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 - ! Fin Modifs ON - 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(:,:,:)) - ENDIF - ! 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 - 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 - 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 - 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 - 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*ZCC*ZLBDA**ZCX/(4.*GAMMA(ZNU)*.93) - ZAETMP=ZAETMP * XPI *ZCC*ZLBDA**ZCX/(4.*GAMMA(ZNU)) - TPFLYER%XCRARE(ISTORE,JK)=TPFLYER%XCRARE(ISTORE,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%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 - TPFLYER%XCRARE_ATT(ISTORE,JK)=TPFLYER%XCRARE(ISTORE,JK)*ZAETOT - END DO - ! 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 - 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 IF - END IF - ! - !---------------------------------------------------------------------------- - ! - !* 9. BALLOON ADVECTION - ! ----------------- - ! - ! SELECT TYPE ( TPFLYER ) - ! CLASS IS ( TBALLOONDATA) - ZTSTEP = PTSTEP - - IF ( TPFLYER%CTYPE == 'RADIOS' .OR. TPFLYER%CTYPE == 'ISODEN' .OR. TPFLYER%CTYPE == '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 - ! - ZX_OLD = TPFLYER%XX_CUR - ZY_OLD = TPFLYER%XY_CUR - - TPFLYER%XX_CUR = TPFLYER%XX_CUR + ZU_BAL * ZTSTEP * ZMAP - TPFLYER%XY_CUR = TPFLYER%XY_CUR + ZV_BAL * ZTSTEP * ZMAP - END IF - ! - !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 = TPFLYER%NMODEL - ! Get rank of the process where the balloon is and the model number - IF ( TPFLYER%CMODEL == 'FIX' ) THEN - IMODEL = TPFLYER%NMODEL - ELSE - IMODEL = 0 - END IF - CALL FIND_PROCESS_AND_MODEL_FROM_XY_POS( TPFLYER%XX_CUR, TPFLYER%XY_CUR, IRANK, IMODEL ) - IF ( IRANK < 1 ) THEN - TPFLYER%NMODEL = 1 !Set to 1 because it is always a valid model (to prevent crash if NDAD(TPFLYER%NMODEL) ) - TPFLYER%LCRASH = .TRUE. - TPFLYER%NCRASH = NCRASH_OUT_HORIZ - TPFLYER%LFLY = .FALSE. - WRITE( CMNHMSG(1), "( 'Balloon ', A, ' crashed the ', I2, '/', I2, '/', I4, ' at ', F18.12, & - 's (out of the horizontal boundaries)' )" ) & - TRIM( TPFLYER%CTITLE ), TDTCUR%NDAY, TDTCUR%NMONTH, TDTCUR%NYEAR, TDTCUR%XTIME - CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'AIRCRAFT_BALLOON_EVOL', OLOCAL = .TRUE. ) - ELSE - TPFLYER%NMODEL = IMODEL - TPFLYER%LCRASH = .FALSE. - TPFLYER%NCRASH = NCRASH_NO - TPFLYER%NRANK_CUR = IRANK - END IF - IF ( TPFLYER%NMODEL /= IMODEL_OLD .AND. .NOT. TPFLYER%LCRASH ) THEN - IF ( NDAD(TPFLYER%NMODEL ) == IMODEL_OLD ) THEN - !Nothing special to do - ELSE IF ( TPFLYER%NMODEL == NDAD(IMODEL_OLD) ) THEN - !Recompute position to be compatible with parent timestep - - !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 - ZTSTEP = ZTSTEP * NDTRATIO(IMODEL_OLD) - ELSE - ZTSTEP = ZTSTEP * ( 1 + 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 > & - TPFLYER%TFLYER_TIME%TPDATES(TPFLYER%TFLYER_TIME%N_CUR) + TPFLYER%TFLYER_TIME%XTSTEP + 1e-6 ) THEN - TPFLYER%TFLYER_TIME%N_CUR = TPFLYER%TFLYER_TIME%N_CUR + 1 - ISTORE = TPFLYER%TFLYER_TIME%N_CUR - !Remark: by construction here, ISTORE is always > 1 => no risk with ISTORE-1 value - TPFLYER%TFLYER_TIME%TPDATES(ISTORE) = TPFLYER%TFLYER_TIME%TPDATES(ISTORE-1) + TPFLYER%TFLYER_TIME%XTSTEP - - !Force a dummy store (nothing is computed, therefore default/initial values will be stored) - TPFLYER%LSTORE = .TRUE. - - WRITE( CMNHMSG(1), "( 'Balloon ', A, ': store skipped at ', I2, '/', I2, '/', I4, ' at ', F18.12, 's' )" ) & - TRIM( TPFLYER%CTITLE ), & - TPFLYER%TFLYER_TIME%TPDATES(ISTORE)%NDAY, TPFLYER%TFLYER_TIME%TPDATES(ISTORE)%NMONTH, & - TPFLYER%TFLYER_TIME%TPDATES(ISTORE)%NYEAR, TPFLYER%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 - - TPFLYER%XX_CUR = TPFLYER%XX_CUR + ZU_BAL * ZTSTEP * ZMAP - TPFLYER%XY_CUR = TPFLYER%XY_CUR + ZV_BAL * ZTSTEP * ZMAP - - ! Model number is now imposed - IMODEL = TPFLYER%NMODEL - CALL FIND_PROCESS_AND_MODEL_FROM_XY_POS( TPFLYER%XX_CUR, TPFLYER%XY_CUR, IRANK, IMODEL ) - IF ( IRANK < 1 ) THEN - TPFLYER%NMODEL = 1 !Set to 1 because it is always a valid model (to prevent crash if NDAD(TPFLYER%NMODEL) ) - TPFLYER%LCRASH = .TRUE. - TPFLYER%NCRASH = NCRASH_OUT_HORIZ - TPFLYER%LFLY = .FALSE. - WRITE( CMNHMSG(1), "( 'Balloon ', A, ' crashed the ', I2, '/', I2, '/', I4, ' at ', F18.12, & - 's (out of the horizontal boundaries)' )" ) & - TRIM( TPFLYER%CTITLE ), TDTCUR%NDAY, TDTCUR%NMONTH, TDTCUR%NYEAR, TDTCUR%XTIME - CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'AIRCRAFT_BALLOON_EVOL', OLOCAL = .TRUE. ) - ELSE - !TPFLYER%NMODEL = IMODEL !Do not change model because we are in transition to parent - TPFLYER%LCRASH = .FALSE. - TPFLYER%NCRASH = NCRASH_NO - TPFLYER%NRANK_CUR = IRANK - END IF - ELSE - !Special case not-managed (different dads, change of several models in 1 step (going to grand parent)...) - CMNHMSG(1) = 'unmanaged change of model for ballon ' // TPFLYER%CTITLE - CMNHMSG(2) = 'its trajectory might be wrong' - CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'AIRCRAFT_BALLOON_EVOL', OLOCAL = .TRUE. ) + CALL FLYER_RECORD_DATA( ) END IF END IF - IF ( TPFLYER%CTYPE == 'RADIOS' ) THEN - ZW_BAL = FLYER_INTERP(ZWM) - TPFLYER%XZ_CUR = TPFLYER%XZ_CUR + ( ZW_BAL + TPFLYER%XWASCENT ) * ZTSTEP - END IF - ! - IF ( TPFLYER%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) - TPFLYER%XWASCENT = TPFLYER%XWASCENT & - - ( 1. / (1. + TPFLYER%XINDDRAG ) ) * 1. * & - ( XG * ( ( TPFLYER%XMASS / TPFLYER%XVOLUME ) - ZRO_BAL ) / ( TPFLYER%XMASS / TPFLYER%XVOLUME ) & - + TPFLYER%XWASCENT * ABS ( TPFLYER%XWASCENT ) * & - TPFLYER%XDIAMETER * TPFLYER%XAERODRAG / ( 2. * TPFLYER%XVOLUME ) & - ) - TPFLYER%XZ_CUR = TPFLYER%XZ_CUR + ( ZW_BAL + TPFLYER%XWASCENT ) * 1. - END DO - END IF - IF (ZTSTEP .GT. INT(ZTSTEP)) THEN - TPFLYER%XWASCENT = TPFLYER%XWASCENT & - - ( 1. / (1. + TPFLYER%XINDDRAG ) ) * (ZTSTEP-INT(ZTSTEP)) * & - ( XG * ( ( TPFLYER%XMASS / TPFLYER%XVOLUME ) - ZRO_BAL ) / ( TPFLYER%XMASS / TPFLYER%XVOLUME ) & - + TPFLYER%XWASCENT * ABS ( TPFLYER%XWASCENT ) * & - TPFLYER%XDIAMETER * TPFLYER%XAERODRAG / ( 2. * TPFLYER%XVOLUME ) & - ) - TPFLYER%XZ_CUR = TPFLYER%XZ_CUR + ( ZW_BAL + TPFLYER%XWASCENT ) * (ZTSTEP-INT(ZTSTEP)) - 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 @@ -1945,99 +393,1022 @@ SELECT TYPE ( TPFLYER ) !The balloon is not present on this MPI process ZTHIS_PROC = 0. END IF ISOWNERBAL - !---------------------------------------------------------------------------- - ! - !* 11. EXCHANGE OF INFORMATION BETWEEN PROCESSES - ! ----------------------------------------- - ! - !* 11.1 current position - ! ---------------- - ! - IF ( TPFLYER%CMODEL == 'MOB' ) THEN - CALL DISTRIBUTE_FLYER_N(TPFLYER%NMODEL) + + CALL FLYER_COMMUNICATE_DATA( ) + END IF INFLIGHTONMODEL + +END SELECT + + +CONTAINS +! +!---------------------------------------------------------------------------- +!---------------------------------------------------------------------------- +SUBROUTINE BALLOON_COMPUTE_INITIAL_VERTICAL_POSITION( TPBALLOON ) + +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 + 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 + ! + ! 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 - CALL DISTRIBUTE_FLYER_N(TPFLYER%NRANK_CUR) - CALL DISTRIBUTE_FLYER_L(TPFLYER%LFLY) - CALL DISTRIBUTE_FLYER_L(TPFLYER%LCRASH) - CALL DISTRIBUTE_FLYER_L(TPFLYER%LSTORE) - CALL DISTRIBUTE_FLYER(TPFLYER%XX_CUR) - CALL DISTRIBUTE_FLYER(TPFLYER%XY_CUR) - CALL DISTRIBUTE_FLYER_N(TPFLYER%TPOS_CUR%NYEAR) - CALL DISTRIBUTE_FLYER_N(TPFLYER%TPOS_CUR%NMONTH) - CALL DISTRIBUTE_FLYER_N(TPFLYER%TPOS_CUR%NDAY) - CALL DISTRIBUTE_FLYER (TPFLYER%TPOS_CUR%XTIME) - - CALL DISTRIBUTE_FLYER_N(TPFLYER%TFLYER_TIME%N_CUR) - - ! SELECT TYPE ( TPFLYER ) - ! CLASS IS ( TBALLOONDATA ) - IF ( TPFLYER%CTYPE == 'CVBALL' ) THEN - CALL DISTRIBUTE_FLYER(TPFLYER%XZ_CUR) - CALL DISTRIBUTE_FLYER(TPFLYER%XWASCENT) - ELSE IF ( TPFLYER%CTYPE == 'RADIOS' ) THEN - CALL DISTRIBUTE_FLYER(TPFLYER%XZ_CUR) - ELSE IF ( TPFLYER%CTYPE == 'ISODEN' ) THEN - CALL DISTRIBUTE_FLYER(TPFLYER%XRHO) + ELSE + 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 SELECT - IF ( TPFLYER%LSTORE ) THEN - CALL DISTRIBUTE_FLYER_N(TPFLYER%TFLYER_TIME%TPDATES(ISTORE)%NYEAR) - CALL DISTRIBUTE_FLYER_N(TPFLYER%TFLYER_TIME%TPDATES(ISTORE)%NMONTH) - CALL DISTRIBUTE_FLYER_N(TPFLYER%TFLYER_TIME%TPDATES(ISTORE)%NDAY) - CALL DISTRIBUTE_FLYER (TPFLYER%TFLYER_TIME%TPDATES(ISTORE)%XTIME) - - CALL DISTRIBUTE_FLYER_N(TPFLYER%NMODELHIST(ISTORE)) - CALL DISTRIBUTE_FLYER(TPFLYER%XX (ISTORE)) - CALL DISTRIBUTE_FLYER(TPFLYER%XY (ISTORE)) - CALL DISTRIBUTE_FLYER(TPFLYER%XZ (ISTORE)) - CALL DISTRIBUTE_FLYER(TPFLYER%XLON(ISTORE)) - CALL DISTRIBUTE_FLYER(TPFLYER%XLAT(ISTORE)) - CALL DISTRIBUTE_FLYER(TPFLYER%XZON(ISTORE)) - CALL DISTRIBUTE_FLYER(TPFLYER%XMER(ISTORE)) - CALL DISTRIBUTE_FLYER(TPFLYER%XW (ISTORE)) - CALL DISTRIBUTE_FLYER(TPFLYER%XP (ISTORE)) - CALL DISTRIBUTE_FLYER(TPFLYER%XTH (ISTORE)) - DO JLOOP=1,SIZE(PR,4) - CALL DISTRIBUTE_FLYER(TPFLYER%XR (ISTORE,JLOOP)) - END DO - DO JLOOP=1,SIZE(PSV,4) - CALL DISTRIBUTE_FLYER(TPFLYER%XSV (ISTORE,JLOOP)) - END DO - DO JLOOP=1,IKU - CALL DISTRIBUTE_FLYER(TPFLYER%XRTZ (ISTORE,JLOOP)) - DO JLOOP2=1,SIZE(PR,4) - CALL DISTRIBUTE_FLYER(TPFLYER%XRZ (ISTORE,JLOOP,JLOOP2)) - ENDDO - CALL DISTRIBUTE_FLYER(TPFLYER%XFFZ (ISTORE,JLOOP)) - CALL DISTRIBUTE_FLYER(TPFLYER%XCIZ (ISTORE,JLOOP)) - IF (CCLOUD== 'LIMA' ) THEN - CALL DISTRIBUTE_FLYER(TPFLYER%XCRZ (ISTORE,JLOOP)) - CALL DISTRIBUTE_FLYER(TPFLYER%XCCZ (ISTORE,JLOOP)) - ENDIF - CALL DISTRIBUTE_FLYER(TPFLYER%XIWCZ (ISTORE,JLOOP)) - CALL DISTRIBUTE_FLYER(TPFLYER%XLWCZ (ISTORE,JLOOP)) - CALL DISTRIBUTE_FLYER(TPFLYER%XCRARE (ISTORE,JLOOP)) - CALL DISTRIBUTE_FLYER(TPFLYER%XCRARE_ATT (ISTORE,JLOOP)) - CALL DISTRIBUTE_FLYER(TPFLYER%XWZ (ISTORE,JLOOP)) - CALL DISTRIBUTE_FLYER(TPFLYER%XZZ (ISTORE,JLOOP)) - END DO - IF (SIZE(PTKE)>0) CALL DISTRIBUTE_FLYER(TPFLYER%XTKE (ISTORE)) - IF (SIZE(PTS) >0) CALL DISTRIBUTE_FLYER(TPFLYER%XTSRAD(ISTORE)) - IF (LDIAG_IN_RUN) CALL DISTRIBUTE_FLYER(TPFLYER%XTKE_DISS(ISTORE)) - CALL DISTRIBUTE_FLYER(TPFLYER%XZS (ISTORE)) - CALL DISTRIBUTE_FLYER(TPFLYER%XTHW_FLUX(ISTORE)) - CALL DISTRIBUTE_FLYER(TPFLYER%XRCW_FLUX(ISTORE)) - DO JLOOP=1,SIZE(PSV,4) - CALL DISTRIBUTE_FLYER(TPFLYER%XSVW_FLUX(ISTORE,JLOOP)) - END DO +END SUBROUTINE BALLOON_COMPUTE_INITIAL_VERTICAL_POSITION +!---------------------------------------------------------------------------- +!---------------------------------------------------------------------------- +SUBROUTINE BALLOON_ADVECTION_HOR( TPBALLOON ) + +USE MODD_AIRCRAFT_BALLOON, ONLY: TBALLOONDATA + +IMPLICIT NONE + +CLASS(TBALLOONDATA), INTENT(INOUT) :: TPBALLOON + +INTEGER :: IMODEL_OLD +REAL :: ZX_OLD, ZY_OLD +REAL :: ZDELTATIME +REAL :: ZDIVTMP + +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 + ! 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 INFLIGHTONMODEL + END IF + + ! 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 +END IF + +END SUBROUTINE BALLOON_ADVECTION_HOR +!---------------------------------------------------------------------------- +!---------------------------------------------------------------------------- +SUBROUTINE BALLOON_ADVECTION_VER( TPBALLOON ) + +USE MODD_AIRCRAFT_BALLOON, ONLY: TBALLOONDATA + +IMPLICIT NONE + +CLASS(TBALLOONDATA), INTENT(INOUT) :: TPBALLOON + +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 + 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 + +END SUBROUTINE BALLOON_ADVECTION_VER +!---------------------------------------------------------------------------- +!---------------------------------------------------------------------------- +SUBROUTINE FLYER_INTERP_TO_MASSPOINTS() + +IMPLICIT NONE + +! 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 ) + +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 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) + +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 + +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 + + 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 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 -CONTAINS +! ! 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 + + 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 + +END SELECT + +END SUBROUTINE FLYER_COMPUTE_INTERP_COEFF_VER +!---------------------------------------------------------------------------- +!---------------------------------------------------------------------------- +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_NSV, ONLY: NSV_LIMA_NC, NSV_LIMA_NR, NSV_LIMA_NI +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 +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 +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_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, & + XRTMIN_I => XRTMIN, XCONC_LAND, XCONC_SEA + +USE MODI_GAMMA, ONLY: GAMMA + +IMPLICIT NONE + +INTEGER, PARAMETER :: JPTS_GAULAG = 7 ! number of points for Gauss-Laguerre quadrature + +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 ! 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,DIMENSION(:),ALLOCATABLE :: ZX,ZW ! Gauss-Laguerre points and weights +REAL,DIMENSION(:),ALLOCATABLE :: ZRTMIN ! local values for XRTMIN +LOGICAL :: GCALC + +TPFLYER%NMODELHIST(ISTORE) = TPFLYER%NMODEL + +TPFLYER%XX(ISTORE) = TPFLYER%XX_CUR +TPFLYER%XY(ISTORE) = TPFLYER%XY_CUR +TPFLYER%XZ(ISTORE) = TPFLYER%XZ_CUR +! +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) +! +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) + +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 + 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 + 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 + 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 + 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*ZCC*ZLBDA**ZCX/(4.*GAMMA(ZNU)*.93) + ZAETMP=ZAETMP * XPI *ZCC*ZLBDA**ZCX/(4.*GAMMA(ZNU)) + TPFLYER%XCRARE(ISTORE,JK)=TPFLYER%XCRARE(ISTORE,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%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 + TPFLYER%XCRARE_ATT(ISTORE,JK)=TPFLYER%XCRARE(ISTORE,JK)*ZAETOT + END DO + ! 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 + + 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 +!---------------------------------------------------------------------------- +!---------------------------------------------------------------------------- +SUBROUTINE FLYER_COMMUNICATE_DATA( ) +! Exchange of information between processes + +IMPLICIT NONE + +SELECT TYPE ( TPFLYER ) + CLASS IS ( TBALLOONDATA) + IF ( TPFLYER%CMODEL == 'MOB' ) THEN + CALL DISTRIBUTE_FLYER_N(TPFLYER%NMODEL) + END IF + CALL DISTRIBUTE_FLYER_N(TPFLYER%NRANK_CUR) + CALL DISTRIBUTE_FLYER_L(TPFLYER%LFLY) + CALL DISTRIBUTE_FLYER_L(TPFLYER%LCRASH) + CALL DISTRIBUTE_FLYER_L(TPFLYER%LSTORE) + CALL DISTRIBUTE_FLYER(TPFLYER%XX_CUR) + CALL DISTRIBUTE_FLYER(TPFLYER%XY_CUR) + CALL DISTRIBUTE_FLYER_N(TPFLYER%TPOS_CUR%NYEAR) + CALL DISTRIBUTE_FLYER_N(TPFLYER%TPOS_CUR%NMONTH) + CALL DISTRIBUTE_FLYER_N(TPFLYER%TPOS_CUR%NDAY) + CALL DISTRIBUTE_FLYER (TPFLYER%TPOS_CUR%XTIME) + + CALL DISTRIBUTE_FLYER_N(TPFLYER%TFLYER_TIME%N_CUR) + + IF ( TPFLYER%CTYPE == 'CVBALL' ) THEN + CALL DISTRIBUTE_FLYER(TPFLYER%XZ_CUR) + CALL DISTRIBUTE_FLYER(TPFLYER%XWASCENT) + ELSE IF ( TPFLYER%CTYPE == 'RADIOS' ) THEN + CALL DISTRIBUTE_FLYER(TPFLYER%XZ_CUR) + ELSE IF ( TPFLYER%CTYPE == 'ISODEN' ) THEN + CALL DISTRIBUTE_FLYER(TPFLYER%XRHO) + END IF + +END SELECT + +IF ( TPFLYER%LSTORE ) THEN + ! Data stored + ISTORE = TPFLYER%TFLYER_TIME%N_CUR + + SELECT TYPE ( TPFLYER ) + CLASS IS ( TBALLOONDATA) + CALL DISTRIBUTE_FLYER_N(TPFLYER%TFLYER_TIME%TPDATES(ISTORE)%NYEAR) + CALL DISTRIBUTE_FLYER_N(TPFLYER%TFLYER_TIME%TPDATES(ISTORE)%NMONTH) + CALL DISTRIBUTE_FLYER_N(TPFLYER%TFLYER_TIME%TPDATES(ISTORE)%NDAY) + CALL DISTRIBUTE_FLYER (TPFLYER%TFLYER_TIME%TPDATES(ISTORE)%XTIME) + END SELECT + + CALL DISTRIBUTE_FLYER_N(TPFLYER%NMODELHIST(ISTORE)) + CALL DISTRIBUTE_FLYER(TPFLYER%XX (ISTORE)) + CALL DISTRIBUTE_FLYER(TPFLYER%XY (ISTORE)) + CALL DISTRIBUTE_FLYER(TPFLYER%XZ (ISTORE)) + CALL DISTRIBUTE_FLYER(TPFLYER%XLON(ISTORE)) + CALL DISTRIBUTE_FLYER(TPFLYER%XLAT(ISTORE)) + CALL DISTRIBUTE_FLYER(TPFLYER%XZON(ISTORE)) + CALL DISTRIBUTE_FLYER(TPFLYER%XMER(ISTORE)) + CALL DISTRIBUTE_FLYER(TPFLYER%XW (ISTORE)) + CALL DISTRIBUTE_FLYER(TPFLYER%XP (ISTORE)) + CALL DISTRIBUTE_FLYER(TPFLYER%XTH (ISTORE)) + DO JLOOP=1,SIZE(PR,4) + CALL DISTRIBUTE_FLYER(TPFLYER%XR (ISTORE,JLOOP)) + END DO + DO JLOOP=1,SIZE(PSV,4) + CALL DISTRIBUTE_FLYER(TPFLYER%XSV (ISTORE,JLOOP)) + END DO + DO JLOOP=1,IKU + CALL DISTRIBUTE_FLYER(TPFLYER%XRTZ (ISTORE,JLOOP)) + DO JLOOP2=1,SIZE(PR,4) + CALL DISTRIBUTE_FLYER(TPFLYER%XRZ (ISTORE,JLOOP,JLOOP2)) + END DO + CALL DISTRIBUTE_FLYER(TPFLYER%XFFZ (ISTORE,JLOOP)) + CALL DISTRIBUTE_FLYER(TPFLYER%XCIZ (ISTORE,JLOOP)) + IF (CCLOUD== 'LIMA' ) THEN + CALL DISTRIBUTE_FLYER(TPFLYER%XCRZ (ISTORE,JLOOP)) + CALL DISTRIBUTE_FLYER(TPFLYER%XCCZ (ISTORE,JLOOP)) + END IF + CALL DISTRIBUTE_FLYER(TPFLYER%XIWCZ (ISTORE,JLOOP)) + CALL DISTRIBUTE_FLYER(TPFLYER%XLWCZ (ISTORE,JLOOP)) + CALL DISTRIBUTE_FLYER(TPFLYER%XCRARE (ISTORE,JLOOP)) + CALL DISTRIBUTE_FLYER(TPFLYER%XCRARE_ATT (ISTORE,JLOOP)) + CALL DISTRIBUTE_FLYER(TPFLYER%XWZ (ISTORE,JLOOP)) + CALL DISTRIBUTE_FLYER(TPFLYER%XZZ (ISTORE,JLOOP)) + END DO + IF (SIZE(PTKE)>0) CALL DISTRIBUTE_FLYER(TPFLYER%XTKE (ISTORE)) + IF (SIZE(PTS) >0) CALL DISTRIBUTE_FLYER(TPFLYER%XTSRAD(ISTORE)) + IF (LDIAG_IN_RUN) CALL DISTRIBUTE_FLYER(TPFLYER%XTKE_DISS(ISTORE)) + CALL DISTRIBUTE_FLYER(TPFLYER%XZS (ISTORE)) + CALL DISTRIBUTE_FLYER(TPFLYER%XTHW_FLUX(ISTORE)) + CALL DISTRIBUTE_FLYER(TPFLYER%XRCW_FLUX(ISTORE)) + DO JLOOP=1,SIZE(PSV,4) + CALL DISTRIBUTE_FLYER(TPFLYER%XSVW_FLUX(ISTORE,JLOOP)) + END DO +END IF + +END SUBROUTINE FLYER_COMMUNICATE_DATA !---------------------------------------------------------------------------- !---------------------------------------------------------------------------- FUNCTION FLYER_INTERP(PA) RESULT(PB) @@ -2062,6 +1433,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 @@ -2208,5 +1580,137 @@ END SUBROUTINE DISTRIBUTE_FLYER_L END SUBROUTINE AIRCRAFT_BALLOON_EVOL !---------------------------------------------------------------------------- +!---------------------------------------------------------------------------- +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 + TPAIRCRAFT%XZ_CUR = (1.-ZSEG_FRAC) * TPAIRCRAFT%XPOSZ(IL ) & + + ZSEG_FRAC * TPAIRCRAFT%XPOSZ(IL +1) +END IF + +END SUBROUTINE AIRCRAFT_COMPUTE_POSITION +!---------------------------------------------------------------------------- +!---------------------------------------------------------------------------- +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 + IMODEL = 0 + END IF +END IF + +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 = 1 !Set to 1 because it is always a valid model (to prevent crash if NDAD(TPFLYER%NMODEL) ) + 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 +!---------------------------------------------------------------------------- +!---------------------------------------------------------------------------- +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 -- GitLab From b53b5c0770e43bca02cc8ead5bc514a7181b5f79 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Thu, 8 Dec 2022 15:17:51 +0100 Subject: [PATCH 129/157] Philippe 08/12/2022: bugfix if no TDADFILE --- src/MNH/modeln.f90 | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/MNH/modeln.f90 b/src/MNH/modeln.f90 index 6de3470a4..e6dfee3dc 100644 --- a/src/MNH/modeln.f90 +++ b/src/MNH/modeln.f90 @@ -272,6 +272,7 @@ END MODULE MODI_MODEL_n ! T. Nagel 01/02/2021: add turbulence recycling ! P. Wautelet 19/02/2021: add NEGA2 term for SV budgets ! J.L. Redelsperger 03/2021: add Call NHOA_COUPLN (coupling O & A LES version) +! P. Wautelet 08/12/2022: bugfix if no TDADFILE !!------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -479,6 +480,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 @@ -973,7 +975,13 @@ IF ( nfile_backup_current < NBAK_NUMB ) THEN ! CALL WRITE_DESFM_n(IMI,TZBAKFILE) 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 ) + 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 => TZBAKFILE CALL MNHWRITE_ZS_DUMMY_n(TZBAKFILE) IF (CSURF=='EXTE') THEN -- GitLab From b946950ca23d308cbd101b81311157d4643cb8bc Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Fri, 9 Dec 2022 11:37:42 +0100 Subject: [PATCH 130/157] Philippe 09/12/2022: flyers: keep previous NMODEL value in case of crash --- src/MNH/aircraft_balloon_evol.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/MNH/aircraft_balloon_evol.f90 b/src/MNH/aircraft_balloon_evol.f90 index a246e4391..8b6383b57 100644 --- a/src/MNH/aircraft_balloon_evol.f90 +++ b/src/MNH/aircraft_balloon_evol.f90 @@ -1673,7 +1673,7 @@ CALL FIND_PROCESS_AND_MODEL_FROM_XY_POS( ZX, ZY, IRANK, IMODEL ) IF ( IRANK < 1 ) THEN ! Flyer is outside of horizontal domain - TPFLYER%NMODEL = 1 !Set to 1 because it is always a valid model (to prevent crash if NDAD(TPFLYER%NMODEL) ) + ! TPFLYER%NMODEL !Do not change to keep a valid value TPFLYER%LCRASH = .TRUE. TPFLYER%NCRASH = NCRASH_OUT_HORIZ TPFLYER%LFLY = .FALSE. -- GitLab From eda8ef3a6dfe23ddd91b8d849973a99ed8726c5e Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Fri, 9 Dec 2022 11:41:30 +0100 Subject: [PATCH 131/157] Philippe 09/12/2022: flyers: correction for 'FIX' aircrafts if store timestep smaller than model 1 timestep --- src/MNH/aircraft_balloon_evol.f90 | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/MNH/aircraft_balloon_evol.f90 b/src/MNH/aircraft_balloon_evol.f90 index 8b6383b57..933c9c319 100644 --- a/src/MNH/aircraft_balloon_evol.f90 +++ b/src/MNH/aircraft_balloon_evol.f90 @@ -239,8 +239,12 @@ CALL GET_MODEL_NUMBER_ll(IMI) SELECT TYPE ( TPFLYER ) CLASS IS ( TAIRCRAFTDATA) - !Do the positioning only if model 1 (data will be available to others after) - MODEL1AIR: IF ( IMI == 1 ) THEN + ! For 'MOB' aircrafts, do the positioning only if model 1 (data will be available to others after) + ! aircraft store timestep is always a multiple of model 1 timestep + ! For 'FIX' aircrafts, do the computation only on the correct model + ! (important especially if store timestep is smaller than model 1 timestep) + IF ( ( TPFLYER%CMODEL == 'MOB' .AND. IMI == 1 ) & + .OR. ( TPFLYER%CMODEL == 'FIX' .AND. IMI == TPFLYER%NMODEL ) ) THEN !Do we have to store aircraft data? CALL FLYER_CHECK_STORESTEP( TPFLYER ) @@ -256,7 +260,8 @@ SELECT TYPE ( TPFLYER ) ELSE TPFLYER%LFLY = .FALSE. END IF - END IF MODEL1AIR + + END IF ! For aircrafts, data has only to be computed at store moments IF ( IMI == TPFLYER%NMODEL .AND. TPFLYER%LFLY .AND. TPFLYER%LSTORE ) THEN -- GitLab From 967f2bbb682fe7cb3f66a1e8650cdb4a2a572ffa Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Fri, 9 Dec 2022 15:55:44 +0100 Subject: [PATCH 132/157] Philippe 09/12/2022: balloons: add LPOSITION_INIT field --- src/MNH/aircraft_balloon_evol.f90 | 3 ++- src/MNH/modd_aircraft_balloon.f90 | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/MNH/aircraft_balloon_evol.f90 b/src/MNH/aircraft_balloon_evol.f90 index 933c9c319..75ea925f4 100644 --- a/src/MNH/aircraft_balloon_evol.f90 +++ b/src/MNH/aircraft_balloon_evol.f90 @@ -304,7 +304,8 @@ SELECT TYPE ( TPFLYER ) ! 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. TPFLYER%LFLY .AND. .NOT. TPFLYER%LCRASH .AND. TPFLYER%NRANK_CUR < 0 ) THEN + IF ( .NOT. TPFLYER%LPOSITION_INIT ) THEN + TPFLYER%LPOSITION_INIT = .TRUE. ! Get rank of the process where the balloon is and the model number CALL FLYER_GET_RANK_MODEL_ISCRASHED( TPFLYER, PX = TPFLYER%XXLAUNCH, PY = TPFLYER%XYLAUNCH ) IF ( TPFLYER%LCRASH ) THEN diff --git a/src/MNH/modd_aircraft_balloon.f90 b/src/MNH/modd_aircraft_balloon.f90 index 0ed8002ec..e59cdcd0e 100644 --- a/src/MNH/modd_aircraft_balloon.f90 +++ b/src/MNH/modd_aircraft_balloon.f90 @@ -152,6 +152,7 @@ TYPE, EXTENDS( TFLYERDATA ) :: TAIRCRAFTDATA END TYPE TAIRCRAFTDATA TYPE, EXTENDS( TFLYERDATA ) :: TBALLOONDATA + LOGICAL :: LPOSITION_INIT = .FALSE. ! True if initial position has been computed ! !* balloon dynamical characteristics ! -- GitLab From 38babc7c73139130736c0174e6d6e300bc2f2088 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Mon, 12 Dec 2022 16:58:26 +0100 Subject: [PATCH 133/157] Philippe 12/12/2022: aircrafts: restructure to compute next position (instead of computing current position) This is necessary to allow transfer of all aircraft data between processes (to be developed) --- src/MNH/aircraft_balloon_evol.f90 | 72 +++++++++++++++++++++---------- src/MNH/modd_aircraft_balloon.f90 | 1 + 2 files changed, 51 insertions(+), 22 deletions(-) diff --git a/src/MNH/aircraft_balloon_evol.f90 b/src/MNH/aircraft_balloon_evol.f90 index 75ea925f4..f38d3953a 100644 --- a/src/MNH/aircraft_balloon_evol.f90 +++ b/src/MNH/aircraft_balloon_evol.f90 @@ -231,7 +231,7 @@ INTEGER :: IINFO_ll ! return code ! INTEGER :: IMODEL REAL :: ZTSTEP - +TYPE(DATE_TIME) :: TZNEXT ! Time for next position !---------------------------------------------------------------------------- IKU = SIZE(PZ,3) @@ -239,33 +239,34 @@ CALL GET_MODEL_NUMBER_ll(IMI) SELECT TYPE ( TPFLYER ) CLASS IS ( TAIRCRAFTDATA) - ! For 'MOB' aircrafts, do the positioning only if model 1 (data will be available to others after) - ! aircraft store timestep is always a multiple of model 1 timestep - ! For 'FIX' aircrafts, do the computation only on the correct model - ! (important especially if store timestep is smaller than model 1 timestep) - IF ( ( TPFLYER%CMODEL == 'MOB' .AND. IMI == 1 ) & - .OR. ( TPFLYER%CMODEL == 'FIX' .AND. IMI == TPFLYER%NMODEL ) ) THEN - !Do we have to store aircraft data? - CALL FLYER_CHECK_STORESTEP( TPFLYER ) - - ! Is the aircraft in flight ? - IF ( TDTCUR >= TPFLYER%TLAUNCH .AND. TDTCUR <= TPFLYER%TLAND ) THEN - TPFLYER%LFLY = .TRUE. - - ! Compute current position - CALL AIRCRAFT_COMPUTE_POSITION( TDTCUR, 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. + ! 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. + + ! Compute current position + CALL AIRCRAFT_COMPUTE_POSITION( TDTCUR, TPFLYER ) + + ! Get rank of the process where the aircraft is and the model number + CALL FLYER_GET_RANK_MODEL_ISCRASHED( TPFLYER ) + END IF END IF + END IF TAKEOFF + IF ( IMI == TPFLYER%NMODEL ) THEN + !Do we have to store aircraft data? + CALL FLYER_CHECK_STORESTEP( TPFLYER ) END IF ! 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 - ISTORE = TPFLYER%TFLYER_TIME%N_CUR ! 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 @@ -294,6 +295,33 @@ SELECT TYPE ( TPFLYER ) END IF ISOWNERAIR CALL FLYER_COMMUNICATE_DATA( ) + + ! Store has been done + TPFLYER%LSTORE = .FALSE. + END IF + END IF + + ! 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 diff --git a/src/MNH/modd_aircraft_balloon.f90 b/src/MNH/modd_aircraft_balloon.f90 index e59cdcd0e..167cf8fef 100644 --- a/src/MNH/modd_aircraft_balloon.f90 +++ b/src/MNH/modd_aircraft_balloon.f90 @@ -132,6 +132,7 @@ TYPE :: TFLYERDATA END TYPE TFLYERDATA TYPE, EXTENDS( TFLYERDATA ) :: TAIRCRAFTDATA + LOGICAL :: LTOOKOFF = .FALSE. ! Set to true once the aircraft takes off ! !* aircraft flight definition ! -- GitLab From 5f2e2a6e28a7e030ca11e486a22a72a2590a59a7 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Mon, 12 Dec 2022 17:09:14 +0100 Subject: [PATCH 134/157] Philippe 12/12/2022: flyers: use arrays of pointers to flyers instead of arrays of flyers Useful to allow transfer of flyers between processses (to be developed) --- src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 | 4 +- src/MNH/aircraft_balloon.f90 | 4 +- src/MNH/ini_aircraft.f90 | 36 +++++----- src/MNH/ini_aircraft_balloon.f90 | 8 +-- src/MNH/ini_balloon.f90 | 74 +++++++++++---------- src/MNH/modd_aircraft_balloon.f90 | 13 +++- src/MNH/write_aircraft_balloon.f90 | 4 +- src/MNH/write_balloonn.f90 | 2 +- 8 files changed, 81 insertions(+), 64 deletions(-) diff --git a/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 b/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 index 54c01012f..b9c92d64b 100644 --- a/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 +++ b/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 @@ -1862,11 +1862,11 @@ if ( tpfile%lmaster ) then if ( lflyer ) then do ji = 1, nballoons - call Write_flyer_time_coord( tballoons(ji) ) + call Write_flyer_time_coord( tballoons(ji)%tballoon ) end do do ji = 1, naircrafts - call Write_flyer_time_coord( taircrafts(ji) ) + call Write_flyer_time_coord( taircrafts(ji)%taircraft ) end do end if diff --git a/src/MNH/aircraft_balloon.f90 b/src/MNH/aircraft_balloon.f90 index a43f04c53..5028e0d9f 100644 --- a/src/MNH/aircraft_balloon.f90 +++ b/src/MNH/aircraft_balloon.f90 @@ -140,13 +140,13 @@ ALLOCATE(XSVW_FLUX(SIZE(PSV,1),SIZE(PSV,2),SIZE(PSV,3),SIZE(PSV,4))) DO JI = 1, NBALLOONS CALL AIRCRAFT_BALLOON_EVOL( PTSTEP, PZ, PMAP, PLONOR, PLATOR, & PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT, & - TBALLOONS(JI), PSEA ) + TBALLOONS(JI)%TBALLOON, PSEA ) END DO ! DO JI = 1, NAIRCRAFTS CALL AIRCRAFT_BALLOON_EVOL( PTSTEP, PZ, PMAP, PLONOR, PLATOR, & PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT, & - TAIRCRAFTS(JI), PSEA ) + TAIRCRAFTS(JI)%TAIRCRAFT, PSEA ) END DO ! !---------------------------------------------------------------------------- diff --git a/src/MNH/ini_aircraft.f90 b/src/MNH/ini_aircraft.f90 index d0f456f1a..b968be84d 100644 --- a/src/MNH/ini_aircraft.f90 +++ b/src/MNH/ini_aircraft.f90 @@ -113,12 +113,16 @@ USE MODN_AIRCRAFTS IMPLICIT NONE INTEGER :: JI +TYPE(TAIRCRAFTDATA), POINTER :: TZAIRCRAFT ALLOCATE( TAIRCRAFTS(NAIRCRAFTS) ) !Treat aircraft data read in namelist DO JI = 1, NAIRCRAFTS - TAIRCRAFTS(JI)%NID = JI + ALLOCATE( TAIRCRAFTS(JI)%TAIRCRAFT ) + TZAIRCRAFT => TAIRCRAFTS(JI)%TAIRCRAFT + + TZAIRCRAFT%NID = JI IF ( CTITLE(JI) == '' ) THEN WRITE( CTITLE(JI), FMT = '( A, I3.3) ') TRIM( CTYPE(JI) ), JI @@ -127,7 +131,7 @@ DO JI = 1, NAIRCRAFTS CMNHMSG(2) = 'title set to ' // TRIM( CTITLE(JI) ) CALL PRINT_MSG( NVERB_INFO, 'GEN', 'INI_AIRCRAFT' ) END IF - TAIRCRAFTS(JI)%CTITLE = CTITLE(JI) + TZAIRCRAFT%CTITLE = CTITLE(JI) IF ( CMODEL(JI) == 'FIX' ) THEN IF ( NMODEL(JI) < 1 .OR. NMODEL(JI) > NMODEL_NEST ) THEN @@ -150,15 +154,15 @@ DO JI = 1, NAIRCRAFTS CMODEL(JI) = 'FIX' NMODEL(JI) = 1 END IF - TAIRCRAFTS(JI)%CMODEL = CMODEL(JI) - TAIRCRAFTS(JI)%NMODEL = NMODEL(JI) + TZAIRCRAFT%CMODEL = CMODEL(JI) + TZAIRCRAFT%NMODEL = NMODEL(JI) - TAIRCRAFTS(JI)%CTYPE = CTYPE(JI) + TZAIRCRAFT%CTYPE = CTYPE(JI) 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) ) ) - TAIRCRAFTS(JI)%TLAUNCH = TLAUNCH(JI) + TZAIRCRAFT%TLAUNCH = TLAUNCH(JI) IF ( XTSTEP(JI) == XNEGUNDEF ) THEN CALL PRINT_MSG( NVERB_INFO, 'GEN', 'INI_AIRCRAFT', & @@ -168,31 +172,31 @@ DO JI = 1, NAIRCRAFTS CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'INI_AIRCRAFT', 'invalid data storage frequency for aircraft ' // TRIM( CTITLE(JI) ) ) XTSTEP(JI) = 60. END IF - TAIRCRAFTS(JI)%TFLYER_TIME%XTSTEP = XTSTEP(JI) + TZAIRCRAFT%TFLYER_TIME%XTSTEP = XTSTEP(JI) IF ( NPOS(JI) < 2 ) THEN CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'INI_AIRCRAFT', 'NPOS should be at least 2 for aircraft ' // TRIM( CTITLE(JI) ) ) END IF - TAIRCRAFTS(JI)%NPOS = NPOS(JI) + TZAIRCRAFT%NPOS = NPOS(JI) - TAIRCRAFTS(JI)%LALTDEF = LALTDEF(JI) + 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) ) ) ! Allocate trajectory data - ALLOCATE( TAIRCRAFTS(JI)%XPOSTIME(TAIRCRAFTS(JI)%NPOS) ); TAIRCRAFTS(JI)%XPOSTIME(:) = XNEGUNDEF - ALLOCATE( TAIRCRAFTS(JI)%XPOSLAT (TAIRCRAFTS(JI)%NPOS) ); TAIRCRAFTS(JI)%XPOSLAT(:) = XNEGUNDEF - ALLOCATE( TAIRCRAFTS(JI)%XPOSLON (TAIRCRAFTS(JI)%NPOS) ); TAIRCRAFTS(JI)%XPOSLON(:) = XNEGUNDEF - IF ( TAIRCRAFTS(JI)%LALTDEF ) THEN - ALLOCATE( TAIRCRAFTS(JI)%XPOSP (TAIRCRAFTS(JI)%NPOS) ); TAIRCRAFTS(JI)%XPOSP(:) = XNEGUNDEF + 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( TAIRCRAFTS(JI)%XPOSZ (TAIRCRAFTS(JI)%NPOS) ); TAIRCRAFTS(JI)%XPOSZ(:) = XNEGUNDEF + ALLOCATE( TZAIRCRAFT%XPOSZ (TZAIRCRAFT%NPOS) ); TZAIRCRAFT%XPOSZ(:) = XNEGUNDEF END IF ! Read CSV data (trajectory) - CALL AIRCRAFT_CSV_READ( TAIRCRAFTS(JI), CFILE(JI) ) + CALL AIRCRAFT_CSV_READ( TZAIRCRAFT, CFILE(JI) ) END DO diff --git a/src/MNH/ini_aircraft_balloon.f90 b/src/MNH/ini_aircraft_balloon.f90 index 59da978f8..2b9ef0f6c 100644 --- a/src/MNH/ini_aircraft_balloon.f90 +++ b/src/MNH/ini_aircraft_balloon.f90 @@ -138,7 +138,7 @@ ENDIF IF (IMI == 1) CALL INI_BALLOON ! DO JI = 1, NBALLOONS - CALL INI_LAUNCH( JI, TBALLOONS(JI) ) + CALL INI_LAUNCH( JI, TBALLOONS(JI)%TBALLOON ) END DO ! !---------------------------------------------------------------------------- @@ -149,7 +149,7 @@ END DO IF (IMI == 1) CALL INI_AIRCRAFT ! DO JI = 1, NAIRCRAFTS - CALL INI_FLIGHT( JI, TAIRCRAFTS(JI) ) + CALL INI_FLIGHT( JI, TAIRCRAFTS(JI)%TAIRCRAFT ) END DO ! !---------------------------------------------------------------------------- @@ -160,11 +160,11 @@ END DO IF (.NOT. LFLYER) RETURN ! DO JI = 1, NBALLOONS - CALL ALLOCATE_FLYER( TBALLOONS(JI) ) + CALL ALLOCATE_FLYER( TBALLOONS(JI)%TBALLOON ) END DO ! DO JI = 1, NAIRCRAFTS - CALL ALLOCATE_FLYER( TAIRCRAFTS(JI) ) + CALL ALLOCATE_FLYER( TAIRCRAFTS(JI)%TAIRCRAFT ) END DO ! !---------------------------------------------------------------------------- diff --git a/src/MNH/ini_balloon.f90 b/src/MNH/ini_balloon.f90 index 3c3c4d6ae..7e268fb43 100644 --- a/src/MNH/ini_balloon.f90 +++ b/src/MNH/ini_balloon.f90 @@ -117,12 +117,16 @@ USE MODN_BALLOONS IMPLICIT NONE INTEGER :: JI +TYPE(TBALLOONDATA), POINTER :: TZBALLOON ALLOCATE( TBALLOONS(NBALLOONS) ) !Treat balloon data read in namelist DO JI = 1, NBALLOONS - TBALLOONS(JI)%NID = JI + 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 @@ -131,7 +135,7 @@ DO JI = 1, NBALLOONS CMNHMSG(2) = 'title set to ' // TRIM( CTITLE(JI) ) CALL PRINT_MSG( NVERB_INFO, 'GEN', 'INI_BALLOON' ) END IF - TBALLOONS(JI)%CTITLE = CTITLE(JI) + TZBALLOON%CTITLE = CTITLE(JI) IF ( CMODEL(JI) == 'FIX' ) THEN IF ( NMODEL(JI) < 1 .OR. NMODEL(JI) > NMODEL_NEST ) THEN @@ -155,23 +159,23 @@ DO JI = 1, NBALLOONS CMODEL(JI) = 'FIX' NMODEL(JI) = 1 END IF - TBALLOONS(JI)%CMODEL = CMODEL(JI) - TBALLOONS(JI)%NMODEL = NMODEL(JI) + TZBALLOON%CMODEL = CMODEL(JI) + TZBALLOON%NMODEL = NMODEL(JI) - TBALLOONS(JI)%CTYPE = CTYPE(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) ) ) - TBALLOONS(JI)%TLAUNCH = TLAUNCH(JI) + TZBALLOON%TLAUNCH = TLAUNCH(JI) IF ( XLATLAUNCH(JI) == XUNDEF ) & CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'INI_BALLOON', 'XLATLAUNCH not provided for balloon ' // TRIM( CTITLE(JI) ) ) - TBALLOONS(JI)%XLATLAUNCH = XLATLAUNCH(JI) + TZBALLOON%XLATLAUNCH = XLATLAUNCH(JI) IF ( XLONLAUNCH(JI) == XUNDEF ) & CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'INI_BALLOON', 'XLONLAUNCH not provided for balloon ' // TRIM( CTITLE(JI) ) ) - TBALLOONS(JI)%XLONLAUNCH = XLONLAUNCH(JI) + TZBALLOON%XLONLAUNCH = XLONLAUNCH(JI) IF ( XTSTEP(JI) == XNEGUNDEF ) THEN CALL PRINT_MSG( NVERB_INFO, 'GEN', 'INI_BALLOON', & @@ -181,7 +185,7 @@ DO JI = 1, NBALLOONS CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'INI_BALLOON', 'invalid data storage frequency for balloon ' // TRIM( CTITLE(JI) ) ) XTSTEP(JI) = 60. END IF - TBALLOONS(JI)%TFLYER_TIME%XTSTEP = XTSTEP(JI) + TZBALLOON%TFLYER_TIME%XTSTEP = XTSTEP(JI) SELECT CASE ( CTYPE(JI) ) CASE ( 'CVBALL' ) @@ -193,15 +197,15 @@ DO JI = 1, NBALLOONS 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) ) ) - TBALLOONS(JI)%XALTLAUNCH = XALTLAUNCH(JI) - TBALLOONS(JI)%XPRES = XPRES(JI) + 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.' ) XWASCENT(JI) = 0. END IF - TBALLOONS(JI)%XWASCENT = XWASCENT(JI) + TZBALLOON%XWASCENT = XWASCENT(JI) IF ( XAERODRAG(JI) == XNEGUNDEF ) THEN @@ -209,29 +213,29 @@ DO JI = 1, NBALLOONS 'aerodynamic drag coefficient not provided for CVBALL balloon ' // TRIM( CTITLE(JI) ) // ' => set to 0.44' ) XAERODRAG(JI) = 0.44 END IF - TBALLOONS(JI)%XAERODRAG = XAERODRAG(JI) + 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' ) XINDDRAG(JI) = 0.014 END IF - TBALLOONS(JI)%XINDDRAG = XINDDRAG(JI) + 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) ) ) - TBALLOONS(JI)%XMASS = XMASS(JI) + 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) ) ) IF ( XDIAMETER(JI) <= 0. ) THEN - TBALLOONS(JI)%XVOLUME = XVOLUME(JI) - TBALLOONS(JI)%XDIAMETER = ( (3. * XVOLUME(JI) ) / ( 4. * XPI ) ) ** ( 1. / 3. ) + TZBALLOON%XVOLUME = XVOLUME(JI) + TZBALLOON%XDIAMETER = ( (3. * XVOLUME(JI) ) / ( 4. * XPI ) ) ** ( 1. / 3. ) ELSE IF ( XVOLUME(JI) <= 0 ) THEN - TBALLOONS(JI)%XDIAMETER = XDIAMETER(JI) - TBALLOONS(JI)%XVOLUME = XPI / 6 * XDIAMETER(JI)**3 + 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) ) ) @@ -245,15 +249,15 @@ DO JI = 1, NBALLOONS 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) ) ) - TBALLOONS(JI)%XALTLAUNCH = XALTLAUNCH(JI) - TBALLOONS(JI)%XPRES = XPRES(JI) + 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' ) XWASCENT(JI) = XNEGUNDEF END IF - TBALLOONS(JI)%XWASCENT = XWASCENT(JI) + TZBALLOON%XWASCENT = XWASCENT(JI) IF ( XAERODRAG(JI) /= XNEGUNDEF ) THEN @@ -261,49 +265,49 @@ DO JI = 1, NBALLOONS 'aerodynamic drag coefficient is not needed for ISODEN balloon ' // TRIM( CTITLE(JI) ) // ' => ignored' ) XAERODRAG(JI) = XNEGUNDEF END IF - TBALLOONS(JI)%XAERODRAG = XAERODRAG(JI) + 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' ) XINDDRAG(JI) = XNEGUNDEF END IF - TBALLOONS(JI)%XINDDRAG = XINDDRAG(JI) + 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' ) XMASS(JI) = XNEGUNDEF END IF - TBALLOONS(JI)%XMASS = XMASS(JI) + 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' ) XDIAMETER(JI) = XNEGUNDEF END IF - TBALLOONS(JI)%XDIAMETER = XDIAMETER(JI) + 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' ) XVOLUME(JI) = XNEGUNDEF END IF - TBALLOONS(JI)%XVOLUME = XVOLUME(JI) + 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) ) ) - TBALLOONS(JI)%XALTLAUNCH = XALTLAUNCH(JI) + 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.' ) XWASCENT(JI) = 5. END IF - TBALLOONS(JI)%XWASCENT = XWASCENT(JI) + TZBALLOON%XWASCENT = XWASCENT(JI) IF ( XPRES(JI) /= XNEGUNDEF ) THEN CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'INI_BALLOON', & @@ -311,7 +315,7 @@ DO JI = 1, NBALLOONS // TRIM( CTITLE(JI) ) // ' => ignored' ) XPRES(JI) = XNEGUNDEF END IF - TBALLOONS(JI)%XAERODRAG = XAERODRAG(JI) + TZBALLOON%XAERODRAG = XAERODRAG(JI) IF ( XAERODRAG(JI) /= XNEGUNDEF ) THEN CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'INI_BALLOON', & @@ -319,7 +323,7 @@ DO JI = 1, NBALLOONS // TRIM( CTITLE(JI) ) // ' => ignored' ) XAERODRAG(JI) = XNEGUNDEF END IF - TBALLOONS(JI)%XAERODRAG = XAERODRAG(JI) + TZBALLOON%XAERODRAG = XAERODRAG(JI) IF ( XINDDRAG(JI) /= XNEGUNDEF ) THEN CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'INI_BALLOON', & @@ -327,28 +331,28 @@ DO JI = 1, NBALLOONS // TRIM( CTITLE(JI) ) // ' => ignored' ) XINDDRAG(JI) = XNEGUNDEF END IF - TBALLOONS(JI)%XINDDRAG = XINDDRAG(JI) + 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' ) XMASS(JI) = XNEGUNDEF END IF - TBALLOONS(JI)%XMASS = XMASS(JI) + 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' ) XDIAMETER(JI) = XNEGUNDEF END IF - TBALLOONS(JI)%XDIAMETER = XDIAMETER(JI) + 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' ) XVOLUME(JI) = XNEGUNDEF END IF - TBALLOONS(JI)%XVOLUME = XVOLUME(JI) + TZBALLOON%XVOLUME = XVOLUME(JI) CASE DEFAULT diff --git a/src/MNH/modd_aircraft_balloon.f90 b/src/MNH/modd_aircraft_balloon.f90 index 167cf8fef..92d1ade55 100644 --- a/src/MNH/modd_aircraft_balloon.f90 +++ b/src/MNH/modd_aircraft_balloon.f90 @@ -178,8 +178,17 @@ END TYPE TBALLOONDATA INTEGER :: NAIRCRAFTS = 0 ! Total number of aircrafts INTEGER :: NBALLOONS = 0 ! Total number of balloons -TYPE(TAIRCRAFTDATA), DIMENSION(:), ALLOCATABLE :: TAIRCRAFTS ! characteristics and records of the aircrafts +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 -TYPE(TBALLOONDATA), DIMENSION(:), ALLOCATABLE :: TBALLOONS ! characteristics and records of the balloons END MODULE MODD_AIRCRAFT_BALLOON diff --git a/src/MNH/write_aircraft_balloon.f90 b/src/MNH/write_aircraft_balloon.f90 index d03d35acc..943c01bd3 100644 --- a/src/MNH/write_aircraft_balloon.f90 +++ b/src/MNH/write_aircraft_balloon.f90 @@ -98,11 +98,11 @@ INTEGER :: JI !---------------------------------------------------------------------------- ! DO JI = 1, NBALLOONS - CALL FLYER_DIACHRO( TPDIAFILE, TBALLOONS(JI) ) + CALL FLYER_DIACHRO( TPDIAFILE, TBALLOONS(JI)%TBALLOON ) END DO DO JI = 1, NAIRCRAFTS - CALL FLYER_DIACHRO( TPDIAFILE, TAIRCRAFTS(JI) ) + CALL FLYER_DIACHRO( TPDIAFILE, TAIRCRAFTS(JI)%TAIRCRAFT ) END DO ! END SUBROUTINE WRITE_AIRCRAFT_BALLOON diff --git a/src/MNH/write_balloonn.f90 b/src/MNH/write_balloonn.f90 index 974bde880..2b1b55417 100644 --- a/src/MNH/write_balloonn.f90 +++ b/src/MNH/write_balloonn.f90 @@ -73,7 +73,7 @@ TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! File characteristics INTEGER :: JI DO JI = 1, NBALLOONS - IF ( TBALLOONS(JI)%LFLY ) CALL WRITE_BALLOON_POSITION( TPFILE, TBALLOONS(JI) ) + IF ( TBALLOONS(JI)%TBALLOON%LFLY ) CALL WRITE_BALLOON_POSITION( TPFILE, TBALLOONS(JI)%TBALLOON ) END DO END SUBROUTINE WRITE_BALLOON_n -- GitLab From fd5a209a86d596eff55b07ced765590cabbfb3ed Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Fri, 16 Dec 2022 11:31:03 +0100 Subject: [PATCH 135/157] Philippe 16/12/2022: aircraft_balloon: modi->mode --- src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 | 2 +- src/MNH/aircraft_balloon.f90 | 50 +++++---------------- src/MNH/diag.f90 | 2 +- src/MNH/modeln.f90 | 2 +- src/MNH/write_aircraft_balloon.f90 | 2 +- 5 files changed, 15 insertions(+), 43 deletions(-) diff --git a/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 b/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 index b9c92d64b..ff1782c84 100644 --- a/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 +++ b/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 @@ -2266,9 +2266,9 @@ 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 class(tflyerdata), intent(in) :: tpflyer diff --git a/src/MNH/aircraft_balloon.f90 b/src/MNH/aircraft_balloon.f90 index 5028e0d9f..068d03cb2 100644 --- a/src/MNH/aircraft_balloon.f90 +++ b/src/MNH/aircraft_balloon.f90 @@ -4,48 +4,18 @@ !MNH_LIC for details. version 1. !----------------------------------------------------------------- ! ##################### -MODULE MODI_AIRCRAFT_BALLOON +MODULE MODE_AIRCRAFT_BALLOON ! ##################### -! -INTERFACE -! - SUBROUTINE AIRCRAFT_BALLOON(PTSTEP, 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) :: 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 -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 -! -!------------------------------------------------------------------------------- -! -END SUBROUTINE AIRCRAFT_BALLOON -! -SUBROUTINE AIRCRAFT_BALLOON_LONGTYPE_GET( TPFLYER, HLONGTYPE ) - USE MODD_AIRCRAFT_BALLOON, ONLY: TFLYERDATA - CLASS(TFLYERDATA), INTENT(IN) :: TPFLYER - CHARACTER(LEN=*), INTENT(OUT) :: HLONGTYPE -END SUBROUTINE AIRCRAFT_BALLOON_LONGTYPE_GET +IMPLICIT NONE -END INTERFACE -! -END MODULE MODI_AIRCRAFT_BALLOON +PRIVATE + +PUBLIC :: AIRCRAFT_BALLOON + +PUBLIC :: AIRCRAFT_BALLOON_LONGTYPE_GET + +CONTAINS ! ! ################################################################# SUBROUTINE AIRCRAFT_BALLOON(PTSTEP, PZ, & @@ -192,3 +162,5 @@ if ( Len_trim( ytype ) > Len( HLONGTYPE ) ) & HLONGTYPE = Trim( ytype ) END SUBROUTINE AIRCRAFT_BALLOON_LONGTYPE_GET + +END MODULE MODE_AIRCRAFT_BALLOON diff --git a/src/MNH/diag.f90 b/src/MNH/diag.f90 index 59e39266e..abc759976 100644 --- a/src/MNH/diag.f90 +++ b/src/MNH/diag.f90 @@ -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 @@ -159,7 +160,6 @@ 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 diff --git a/src/MNH/modeln.f90 b/src/MNH/modeln.f90 index e6dfee3dc..8d9b03f17 100644 --- a/src/MNH/modeln.f90 +++ b/src/MNH/modeln.f90 @@ -364,6 +364,7 @@ USE MODD_TURB_CLOUD, ONLY: NMODEL_CLOUD,CTURBLEN_CLOUD,XCEI USE MODD_TURB_n USE MODD_VISCOSITY ! +USE MODE_AIRCRAFT_BALLOON use mode_budget, only: Budget_store_init, Budget_store_end USE MODE_DATETIME USE MODE_ELEC_ll @@ -393,7 +394,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 diff --git a/src/MNH/write_aircraft_balloon.f90 b/src/MNH/write_aircraft_balloon.f90 index 943c01bd3..decf8c040 100644 --- a/src/MNH/write_aircraft_balloon.f90 +++ b/src/MNH/write_aircraft_balloon.f90 @@ -125,12 +125,12 @@ 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_msg use mode_write_diachro, only: Write_diachro -use modi_aircraft_balloon, only: Aircraft_balloon_longtype_get TYPE(TFILEDATA), INTENT(IN) :: TPDIAFILE ! file to write CLASS(TFLYERDATA), INTENT(IN) :: TPFLYER -- GitLab From cdebdbb9126e50606d94d7e177fdc709bfdbf8d6 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Thu, 5 Jan 2023 17:06:17 +0100 Subject: [PATCH 136/157] Philippe 05/01/2023: fix: DATETIME_DISTANCE: need 64 bits integers computation for very distant dates --- src/MNH/mode_datetime.f90 | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/MNH/mode_datetime.f90 b/src/MNH/mode_datetime.f90 index 5c73ea3ca..fdcde8e7e 100644 --- a/src/MNH/mode_datetime.f90 +++ b/src/MNH/mode_datetime.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2018-2022 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. @@ -8,6 +8,7 @@ ! 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 ! @@ -141,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 @@ -158,7 +161,7 @@ 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 ! -- GitLab From 75f8de94c73ed900c7db0087aa3d507717dd0aef Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Wed, 11 Jan 2023 09:45:01 +0100 Subject: [PATCH 137/157] Juan 11/01/2023: bugfix: wrong message size in mpi_reduce of error values in IO_Field_write_byfield_X3 --- src/LIB/SURCOUCHE/src/mode_io_field_write.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/LIB/SURCOUCHE/src/mode_io_field_write.f90 b/src/LIB/SURCOUCHE/src/mode_io_field_write.f90 index 07bf78a63..a597f1e47 100644 --- a/src/LIB/SURCOUCHE/src/mode_io_field_write.f90 +++ b/src/LIB/SURCOUCHE/src/mode_io_field_write.f90 @@ -1426,7 +1426,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) -- GitLab From 1d9bb4d62a203867529c08e3c2d42aec04ee3347 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Tue, 3 Jan 2023 13:21:56 +0100 Subject: [PATCH 138/157] Philippe 03/01/2023: correct intent of PDZX and PDZY variables (IN->INOUT) (modified by update_halo in contrav) (cherry picked from commit 0b0270cc68158677a1bca971da0f644ee4ad6cac) --- src/MNH/advection_metsv.f90 | 8 +++++--- src/MNH/advection_uvw.f90 | 10 ++++++---- src/MNH/advection_uvw_cen.f90 | 8 +++++--- src/MNH/conjgrad.f90 | 26 +++++++++++++------------- src/MNH/conresol.f90 | 31 +++++++++++++------------------ src/MNH/conresolz.f90 | 32 +++++++++++++------------------- src/MNH/contrav.f90 | 10 +++++----- src/MNH/gdiv.f90 | 26 +++++++++++++------------- src/MNH/ini_elecn.f90 | 26 +++++++++++++------------- src/MNH/ini_field_elec.f90 | 26 +++++++++++++------------- src/MNH/lap_m.f90 | 26 +++++++++++++------------- src/MNH/pressure_in_prep.f90 | 22 +++++++++++----------- src/MNH/pressurez.f90 | 8 +++++--- src/MNH/qlap.f90 | 26 +++++++++++++------------- src/MNH/richardson.f90 | 31 +++++++++++++------------------ src/MNH/viscosity.f90 | 24 ++++++++++++------------ 16 files changed, 166 insertions(+), 174 deletions(-) diff --git a/src/MNH/advection_metsv.f90 b/src/MNH/advection_metsv.f90 index ec9b54f0c..a0ef0da8c 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 @@ -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 diff --git a/src/MNH/advection_uvw.f90 b/src/MNH/advection_uvw.f90 index 64a497958..8b05aa480 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 62787ea59..ac9c7f56d 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/conjgrad.f90 b/src/MNH/conjgrad.f90 index 9adf9ed36..63c3cad9e 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 c0e103e9a..8b33d0dcc 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 3624bb2eb..358b78ea7 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 c890435f5..44e3b3333 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/gdiv.f90 b/src/MNH/gdiv.f90 index b22065908..dc77dde55 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/ini_elecn.f90 b/src/MNH/ini_elecn.f90 index 27ed168cd..1489ba1af 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 c5dcbb79a..49206a1d8 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/lap_m.f90 b/src/MNH/lap_m.f90 index f1936c828..5eceef4f0 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/pressure_in_prep.f90 b/src/MNH/pressure_in_prep.f90 index 6219e352f..e5d004e09 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 1f597f104..320351512 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/qlap.f90 b/src/MNH/qlap.f90 index 24c49ab38..4502200a9 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/richardson.f90 b/src/MNH/richardson.f90 index 492454276..7f80f4a6d 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/viscosity.f90 b/src/MNH/viscosity.f90 index 4a9607c8c..c909bd9b0 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 -- GitLab From 31d55bf3fa1e80d6aed1d2c82ea6907f8846b6ad Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Thu, 12 Jan 2023 09:13:37 +0100 Subject: [PATCH 139/157] Philippe 12/01/2023: flyers: manage them only on the processes where they are physically located --- src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 | 16 +- src/MNH/aircraft_balloon.f90 | 831 ++++++++++++++++++-- src/MNH/aircraft_balloon_evol.f90 | 354 +++------ src/MNH/ini_aircraft.f90 | 27 +- src/MNH/ini_aircraft_balloon.f90 | 430 ++++++---- src/MNH/ini_balloon.f90 | 89 ++- src/MNH/ini_modeln.f90 | 6 +- src/MNH/modd_aircraft_balloon.f90 | 13 +- src/MNH/modeln.f90 | 4 +- src/MNH/read_desfmn.f90 | 15 +- src/MNH/write_aircraft_balloon.f90 | 108 ++- src/MNH/write_balloonn.f90 | 43 +- src/MNH/write_diachro.f90 | 20 +- src/MNH/write_lfin.f90 | 3 +- 14 files changed, 1383 insertions(+), 576 deletions(-) diff --git a/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 b/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 index ff1782c84..1858061ac 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. @@ -1861,12 +1861,22 @@ if ( tpfile%lmaster ) then end if if ( lflyer ) then + ! 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 - call Write_flyer_time_coord( tballoons(ji)%tballoon ) + 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 - call Write_flyer_time_coord( taircrafts(ji)%taircraft ) + 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 diff --git a/src/MNH/aircraft_balloon.f90 b/src/MNH/aircraft_balloon.f90 index 068d03cb2..f8ff487e0 100644 --- a/src/MNH/aircraft_balloon.f90 +++ b/src/MNH/aircraft_balloon.f90 @@ -1,12 +1,22 @@ -!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. !----------------------------------------------------------------- +! 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 MODE_AIRCRAFT_BALLOON ! ##################### +USE MODE_MSG + IMPLICIT NONE PRIVATE @@ -15,6 +25,20 @@ 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 ! ! ################################################################# @@ -23,56 +47,15 @@ CONTAINS 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 -! P. Wautelet 06/2022: reorganize flyers -! -------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! +! *AIRCRAFT_BALLOON* - monitor for balloons and aircrafts + USE MODD_AIRCRAFT_BALLOON -! USE MODD_TURB_FLUX_AIRCRAFT_BALLOON -! + USE MODE_AIRCRAFT_BALLOON_EVOL, ONLY: AIRCRAFT_BALLOON_EVOL -USE MODE_ll -! -! + IMPLICIT NONE ! -! !* 0.1 declarations of arguments ! ! @@ -98,36 +81,216 @@ REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PSEA ! ! 0.2 declaration of local variables ! -INTEGER :: JI +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))) -! -DO JI = 1, NBALLOONS - CALL AIRCRAFT_BALLOON_EVOL( PTSTEP, PZ, PMAP, PLONOR, PLATOR, & - PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT, & - TBALLOONS(JI)%TBALLOON, PSEA ) -END DO + +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 + +!---------------------------------------------------------------------------- +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 - CALL AIRCRAFT_BALLOON_EVOL( PTSTEP, PZ, PMAP, PLONOR, PLATOR, & - PU, PV, PW, PP, PTH, PR, PSV, PTKE, PTS, PRHODREF, PCIT, & - TAIRCRAFTS(JI)%TAIRCRAFT, PSEA ) + 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 !---------------------------------------------------------------------------- -! -END SUBROUTINE AIRCRAFT_BALLOON +!---------------------------------------------------------------------------- +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 + CALL FLYER_GET_RANK_MODEL_ISCRASHED( TZBALLOON, PX = TZBALLOON%XXLAUNCH, PY = TZBALLOON%XYLAUNCH ) + 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: taircraftdata, tballoondata, TFLYERDATA -USE MODE_MSG +IMPLICIT NONE CLASS(TFLYERDATA), INTENT(IN) :: TPFLYER CHARACTER(LEN=*), INTENT(OUT) :: HLONGTYPE @@ -162,5 +325,541 @@ if ( Len_trim( ytype ) > Len( HLONGTYPE ) ) & 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 = 16 + LEN(TPFLYER%CTITLE) + ISTORE_CUR * ( 18 + NSV * 2 + IKU * ( 9 + NRR * 2 ) ) +IF ( CCLOUD == 'LIMA' ) IPACKSIZE = IPACKSIZE + ISTORE_CUR * IKU * 2 + +SELECT TYPE ( TPFLYER ) + CLASS IS ( TAIRCRAFTDATA ) + IPACKSIZE = IPACKSIZE + 5 + 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%XP_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 + + 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%XP_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 + + 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 f38d3953a..26968c75e 100644 --- a/src/MNH/aircraft_balloon_evol.f90 +++ b/src/MNH/aircraft_balloon_evol.f90 @@ -1,8 +1,31 @@ -!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. !----------------------------------------------------------------- +! 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 MODE_AIRCRAFT_BALLOON_EVOL ! ########################## @@ -15,12 +38,17 @@ PRIVATE PUBLIC :: AIRCRAFT_BALLOON_EVOL +PUBLIC :: AIRCRAFT_COMPUTE_POSITION + +PUBLIC :: FLYER_GET_RANK_MODEL_ISCRASHED + CONTAINS ! ######################################################## SUBROUTINE AIRCRAFT_BALLOON_EVOL(PTSTEP, & 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 ) ! ######################################################## ! ! @@ -68,60 +96,19 @@ CONTAINS !! 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 -! P. Wautelet 06/2022: reorganize flyers !! -------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ ! USE MODD_AIRCRAFT_BALLOON -USE MODD_CONF, ONLY: LCARTESIAN -USE MODD_CST -USE MODD_DIAG_IN_RUN -USE MODD_GRID -USE MODD_GRID_n +USE MODD_CST, ONLY: XCPD, XLVTT USE MODD_IO, ONLY: ISP -USE MODD_LUNIT_n, ONLY: TLUOUT -USE MODD_NESTING -USE MODD_PARAMETERS -USE MODD_PARAM_n, ONLY: CCLOUD, CSURF -USE MODD_REF_n, ONLY: XRHODREF -USE MODD_TIME, only: TDTSEG -USE MODD_TIME_n, only: tdtcur -USE MODD_TURB_FLUX_AIRCRAFT_BALLOON +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_NEST_ll, ONLY: GET_MODEL_NUMBER_ll ! IMPLICIT NONE ! @@ -146,7 +133,9 @@ 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 ! -CLASS(TFLYERDATA), INTENT(INOUT) :: TPFLYER! balloon/aircraft +CLASS(TFLYERDATA), INTENT(INOUT) :: TPFLYER ! balloon/aircraft +INTEGER, INTENT(IN) :: KRANK_CUR +INTEGER, INTENT(OUT) :: KRANK_NXT REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PSEA ! !------------------------------------------------------------------------------- @@ -155,36 +144,30 @@ REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PSEA ! ! INTEGER :: IMI ! model index -REAL :: ZTHIS_PROC ! 1 if balloon is currently treated by this proc., else 0 -! INTEGER :: IKB ! vertical domain sizes INTEGER :: IKE INTEGER :: IKU ! -INTEGER :: JK ! loop index -! 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)) :: 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)) :: 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 ! LOGICAL :: GLAUNCH ! launch/takeoff is effective at this time-step (if true) LOGICAL :: GSTORE ! storage occurs at this time step +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 :: IDU ! difference between II_U and II_M -INTEGER :: IDV ! difference between IJ_V and IJ_M ! INTEGER :: IK00 ! balloon position for II_M , IJ_M INTEGER :: IK01 ! balloon position for II_M , IJ_M+1 @@ -218,18 +201,7 @@ 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 -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. -REAL :: ZRO_BAL ! air density at balloon location -! -INTEGER :: IINFO_ll ! return code ! -INTEGER :: IMODEL REAL :: ZTSTEP TYPE(DATE_TIME) :: TZNEXT ! Time for next position !---------------------------------------------------------------------------- @@ -237,6 +209,17 @@ IKU = SIZE(PZ,3) 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? @@ -249,20 +232,12 @@ SELECT TYPE ( TPFLYER ) IF ( TDTCUR >= TPFLYER%TLAUNCH .AND. TDTCUR <= TPFLYER%TLAND ) THEN TPFLYER%LFLY = .TRUE. TPFLYER%LTOOKOFF = .TRUE. - - ! Compute current position - CALL AIRCRAFT_COMPUTE_POSITION( TDTCUR, TPFLYER ) - - ! Get rank of the process where the aircraft is and the model number - CALL FLYER_GET_RANK_MODEL_ISCRASHED( TPFLYER ) END IF END IF END IF TAKEOFF - IF ( IMI == TPFLYER%NMODEL ) THEN - !Do we have to store aircraft data? - CALL FLYER_CHECK_STORESTEP( TPFLYER ) - END IF + !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 @@ -270,8 +245,6 @@ SELECT TYPE ( TPFLYER ) ! 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 - ZTHIS_PROC = 1. - CALL FLYER_INTERP_TO_MASSPOINTS() ZEXN(:,:,:) = FLYER_COMPUTE_EXNER( ) @@ -289,13 +262,8 @@ SELECT TYPE ( TPFLYER ) CALL FLYER_COMPUTE_INTERP_COEFF_HOR_STAGE2( ) CALL FLYER_RECORD_DATA( ) - ELSE ISOWNERAIR - !Not owner branch - ZTHIS_PROC = 0. END IF ISOWNERAIR - CALL FLYER_COMMUNICATE_DATA( ) - ! Store has been done TPFLYER%LSTORE = .FALSE. END IF @@ -325,23 +293,11 @@ SELECT TYPE ( TPFLYER ) END IF END IF + 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) - ! 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. TPFLYER%LPOSITION_INIT ) THEN - TPFLYER%LPOSITION_INIT = .TRUE. - ! Get rank of the process where the balloon is and the model number - CALL FLYER_GET_RANK_MODEL_ISCRASHED( TPFLYER, PX = TPFLYER%XXLAUNCH, PY = TPFLYER%XYLAUNCH ) - IF ( TPFLYER%LCRASH ) THEN - CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'AIRCRAFT_BALLOON_EVOL', 'balloon ' // TRIM( TPFLYER%CTITLE ) & - // ': launch coordinates are outside of horizontal physical domain' ) - END IF - END IF - ! Launch? LAUNCH: IF ( .NOT. TPFLYER%LFLY .AND. .NOT. TPFLYER%LCRASH .AND. TPFLYER%NMODEL == IMI ) THEN ! Check if it is launchtime @@ -352,15 +308,6 @@ SELECT TYPE ( TPFLYER ) TPFLYER%XX_CUR = TPFLYER%XXLAUNCH TPFLYER%XY_CUR = TPFLYER%XYLAUNCH TPFLYER%TPOS_CUR = TDTCUR - - ! Get rank of the process where the balloon is and the model number - CALL FLYER_GET_RANK_MODEL_ISCRASHED( TPFLYER ) - IF ( TPFLYER%LCRASH ) THEN - WRITE( CMNHMSG(1), "( 'Balloon ', A, ' crashed the ', I2, '/', I2, '/', I4, ' at ', F18.12, & - 's (out of the horizontal boundaries)' )" ) & - TRIM( TPFLYER%CTITLE ), TDTCUR%NDAY, TDTCUR%NMONTH, TDTCUR%NYEAR, TDTCUR%XTIME - CALL PRINT_MSG( NVERB_WARNING, 'GEN', 'AIRCRAFT_BALLOON_EVOL' ) - END IF END IF LAUNCHTIME END IF LAUNCH @@ -376,8 +323,6 @@ SELECT TYPE ( TPFLYER ) 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 - ZTHIS_PROC = 1. - CALL FLYER_INTERP_TO_MASSPOINTS() ZEXN(:,:,:) = FLYER_COMPUTE_EXNER( ) @@ -423,23 +368,20 @@ SELECT TYPE ( TPFLYER ) TPFLYER%TPOS_CUR = TDTCUR + ZTSTEP END IF CRASH_VERT !end of no vertical crash branch - ELSE ISOWNERBAL - !The balloon is not present on this MPI process - ZTHIS_PROC = 0. END IF ISOWNERBAL - - CALL FLYER_COMMUNICATE_DATA( ) END IF INFLIGHTONMODEL + IF ( GOWNER_CUR ) KRANK_NXT = TPFLYER%NRANK_CUR END SELECT - CONTAINS -! + !---------------------------------------------------------------------------- !---------------------------------------------------------------------------- SUBROUTINE BALLOON_COMPUTE_INITIAL_VERTICAL_POSITION( TPBALLOON ) +USE MODD_CST, ONLY: XCPD, XP00, XRD + IMPLICIT NONE CLASS(TBALLOONDATA), INTENT(INOUT) :: TPBALLOON @@ -554,15 +496,23 @@ 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 @@ -668,11 +618,16 @@ END SUBROUTINE BALLOON_ADVECTION_HOR SUBROUTINE BALLOON_ADVECTION_VER( TPBALLOON ) 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 @@ -709,8 +664,14 @@ END SUBROUTINE BALLOON_ADVECTION_VER !---------------------------------------------------------------------------- SUBROUTINE FLYER_INTERP_TO_MASSPOINTS() +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 @@ -748,6 +709,8 @@ 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 @@ -767,6 +730,8 @@ END FUNCTION FLYER_COMPUTE_EXNER !---------------------------------------------------------------------------- PURE FUNCTION FLYER_COMPUTE_RHO( ) RESULT( PRHO ) +USE MODD_CST, ONLY: XRD, XRV + USE MODI_WATER_SUM IMPLICIT NONE @@ -795,6 +760,8 @@ 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 @@ -819,6 +786,9 @@ 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 @@ -950,7 +920,11 @@ 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_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 @@ -958,6 +932,7 @@ USE MODD_PARAM_LIMA_COLD, ONLY: XAI_L => XAI, XBI_L => XBI, XLBEXS_L => XLBEXS, XAS_L => XAS, XBS_L => XBS, XCXS_L => XCXS 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, & @@ -970,12 +945,18 @@ USE MODD_RAIN_ICE_DESCR, ONLY: XALPHAR_I => XALPHAR, XNUR_I => XNUR, XLBEXR_I XLBI_I => XLBI, XAI_I => XAI, XBI_I => XBI, & 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 @@ -994,6 +975,9 @@ 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 +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 @@ -1350,101 +1334,6 @@ END DO END SUBROUTINE FLYER_RECORD_DATA !---------------------------------------------------------------------------- !---------------------------------------------------------------------------- -SUBROUTINE FLYER_COMMUNICATE_DATA( ) -! Exchange of information between processes - -IMPLICIT NONE - -SELECT TYPE ( TPFLYER ) - CLASS IS ( TBALLOONDATA) - IF ( TPFLYER%CMODEL == 'MOB' ) THEN - CALL DISTRIBUTE_FLYER_N(TPFLYER%NMODEL) - END IF - CALL DISTRIBUTE_FLYER_N(TPFLYER%NRANK_CUR) - CALL DISTRIBUTE_FLYER_L(TPFLYER%LFLY) - CALL DISTRIBUTE_FLYER_L(TPFLYER%LCRASH) - CALL DISTRIBUTE_FLYER_L(TPFLYER%LSTORE) - CALL DISTRIBUTE_FLYER(TPFLYER%XX_CUR) - CALL DISTRIBUTE_FLYER(TPFLYER%XY_CUR) - CALL DISTRIBUTE_FLYER_N(TPFLYER%TPOS_CUR%NYEAR) - CALL DISTRIBUTE_FLYER_N(TPFLYER%TPOS_CUR%NMONTH) - CALL DISTRIBUTE_FLYER_N(TPFLYER%TPOS_CUR%NDAY) - CALL DISTRIBUTE_FLYER (TPFLYER%TPOS_CUR%XTIME) - - CALL DISTRIBUTE_FLYER_N(TPFLYER%TFLYER_TIME%N_CUR) - - IF ( TPFLYER%CTYPE == 'CVBALL' ) THEN - CALL DISTRIBUTE_FLYER(TPFLYER%XZ_CUR) - CALL DISTRIBUTE_FLYER(TPFLYER%XWASCENT) - ELSE IF ( TPFLYER%CTYPE == 'RADIOS' ) THEN - CALL DISTRIBUTE_FLYER(TPFLYER%XZ_CUR) - ELSE IF ( TPFLYER%CTYPE == 'ISODEN' ) THEN - CALL DISTRIBUTE_FLYER(TPFLYER%XRHO) - END IF - -END SELECT - -IF ( TPFLYER%LSTORE ) THEN - ! Data stored - ISTORE = TPFLYER%TFLYER_TIME%N_CUR - - SELECT TYPE ( TPFLYER ) - CLASS IS ( TBALLOONDATA) - CALL DISTRIBUTE_FLYER_N(TPFLYER%TFLYER_TIME%TPDATES(ISTORE)%NYEAR) - CALL DISTRIBUTE_FLYER_N(TPFLYER%TFLYER_TIME%TPDATES(ISTORE)%NMONTH) - CALL DISTRIBUTE_FLYER_N(TPFLYER%TFLYER_TIME%TPDATES(ISTORE)%NDAY) - CALL DISTRIBUTE_FLYER (TPFLYER%TFLYER_TIME%TPDATES(ISTORE)%XTIME) - END SELECT - - CALL DISTRIBUTE_FLYER_N(TPFLYER%NMODELHIST(ISTORE)) - CALL DISTRIBUTE_FLYER(TPFLYER%XX (ISTORE)) - CALL DISTRIBUTE_FLYER(TPFLYER%XY (ISTORE)) - CALL DISTRIBUTE_FLYER(TPFLYER%XZ (ISTORE)) - CALL DISTRIBUTE_FLYER(TPFLYER%XLON(ISTORE)) - CALL DISTRIBUTE_FLYER(TPFLYER%XLAT(ISTORE)) - CALL DISTRIBUTE_FLYER(TPFLYER%XZON(ISTORE)) - CALL DISTRIBUTE_FLYER(TPFLYER%XMER(ISTORE)) - CALL DISTRIBUTE_FLYER(TPFLYER%XW (ISTORE)) - CALL DISTRIBUTE_FLYER(TPFLYER%XP (ISTORE)) - CALL DISTRIBUTE_FLYER(TPFLYER%XTH (ISTORE)) - DO JLOOP=1,SIZE(PR,4) - CALL DISTRIBUTE_FLYER(TPFLYER%XR (ISTORE,JLOOP)) - END DO - DO JLOOP=1,SIZE(PSV,4) - CALL DISTRIBUTE_FLYER(TPFLYER%XSV (ISTORE,JLOOP)) - END DO - DO JLOOP=1,IKU - CALL DISTRIBUTE_FLYER(TPFLYER%XRTZ (ISTORE,JLOOP)) - DO JLOOP2=1,SIZE(PR,4) - CALL DISTRIBUTE_FLYER(TPFLYER%XRZ (ISTORE,JLOOP,JLOOP2)) - END DO - CALL DISTRIBUTE_FLYER(TPFLYER%XFFZ (ISTORE,JLOOP)) - CALL DISTRIBUTE_FLYER(TPFLYER%XCIZ (ISTORE,JLOOP)) - IF (CCLOUD== 'LIMA' ) THEN - CALL DISTRIBUTE_FLYER(TPFLYER%XCRZ (ISTORE,JLOOP)) - CALL DISTRIBUTE_FLYER(TPFLYER%XCCZ (ISTORE,JLOOP)) - END IF - CALL DISTRIBUTE_FLYER(TPFLYER%XIWCZ (ISTORE,JLOOP)) - CALL DISTRIBUTE_FLYER(TPFLYER%XLWCZ (ISTORE,JLOOP)) - CALL DISTRIBUTE_FLYER(TPFLYER%XCRARE (ISTORE,JLOOP)) - CALL DISTRIBUTE_FLYER(TPFLYER%XCRARE_ATT (ISTORE,JLOOP)) - CALL DISTRIBUTE_FLYER(TPFLYER%XWZ (ISTORE,JLOOP)) - CALL DISTRIBUTE_FLYER(TPFLYER%XZZ (ISTORE,JLOOP)) - END DO - IF (SIZE(PTKE)>0) CALL DISTRIBUTE_FLYER(TPFLYER%XTKE (ISTORE)) - IF (SIZE(PTS) >0) CALL DISTRIBUTE_FLYER(TPFLYER%XTSRAD(ISTORE)) - IF (LDIAG_IN_RUN) CALL DISTRIBUTE_FLYER(TPFLYER%XTKE_DISS(ISTORE)) - CALL DISTRIBUTE_FLYER(TPFLYER%XZS (ISTORE)) - CALL DISTRIBUTE_FLYER(TPFLYER%XTHW_FLUX(ISTORE)) - CALL DISTRIBUTE_FLYER(TPFLYER%XRCW_FLUX(ISTORE)) - DO JLOOP=1,SIZE(PSV,4) - CALL DISTRIBUTE_FLYER(TPFLYER%XSVW_FLUX(ISTORE,JLOOP)) - END DO -END IF - -END SUBROUTINE FLYER_COMMUNICATE_DATA -!---------------------------------------------------------------------------- -!---------------------------------------------------------------------------- FUNCTION FLYER_INTERP(PA) RESULT(PB) ! REAL, DIMENSION(:,:,:), INTENT(IN) :: PA @@ -1566,51 +1455,6 @@ 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 -!---------------------------------------------------------------------------- -!---------------------------------------------------------------------------- -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. -ELSE - OA=.TRUE. -END IF -! -END SUBROUTINE DISTRIBUTE_FLYER_L -!---------------------------------------------------------------------------- - END SUBROUTINE AIRCRAFT_BALLOON_EVOL !---------------------------------------------------------------------------- diff --git a/src/MNH/ini_aircraft.f90 b/src/MNH/ini_aircraft.f90 index b968be84d..331df58cf 100644 --- a/src/MNH/ini_aircraft.f90 +++ b/src/MNH/ini_aircraft.f90 @@ -1,4 +1,4 @@ -!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. @@ -115,8 +115,6 @@ IMPLICIT NONE INTEGER :: JI TYPE(TAIRCRAFTDATA), POINTER :: TZAIRCRAFT -ALLOCATE( TAIRCRAFTS(NAIRCRAFTS) ) - !Treat aircraft data read in namelist DO JI = 1, NAIRCRAFTS ALLOCATE( TAIRCRAFTS(JI)%TAIRCRAFT ) @@ -129,7 +127,7 @@ DO JI = 1, NAIRCRAFTS 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' ) + CALL PRINT_MSG( NVERB_INFO, 'GEN', 'INI_AIRCRAFT', OLOCAL = .TRUE. ) END IF TZAIRCRAFT%CTITLE = CTITLE(JI) @@ -137,20 +135,21 @@ DO JI = 1, NAIRCRAFTS 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' ) + 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) ) // ')' ) + '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' ) + CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'INI_AIRCRAFT', OLOCAL = .TRUE. ) CMODEL(JI) = 'FIX' NMODEL(JI) = 1 END IF @@ -161,21 +160,23 @@ DO JI = 1, NAIRCRAFTS 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) ) ) + 'problem with TLAUNCH (not set or incorrect values) for aircraft ' // TRIM( CTITLE(JI) ), OLOCAL = .TRUE. ) TZAIRCRAFT%TLAUNCH = TLAUNCH(JI) 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' ) + '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) ) ) + 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) IF ( NPOS(JI) < 2 ) THEN - CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'INI_AIRCRAFT', 'NPOS should be at least 2 for aircraft ' // TRIM( CTITLE(JI) ) ) + 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) @@ -183,7 +184,7 @@ DO JI = 1, NAIRCRAFTS IF ( CFILE(JI) == '' ) & CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_AIRCRAFT', 'name of CSV file with trajectory not provided for aircraft ' & - // TRIM( CTITLE(JI) ) ) + // TRIM( CTITLE(JI) ), OLOCAL = .TRUE. ) ! Allocate trajectory data ALLOCATE( TZAIRCRAFT%XPOSTIME(TZAIRCRAFT%NPOS) ); TZAIRCRAFT%XPOSTIME(:) = XNEGUNDEF @@ -252,7 +253,7 @@ END DO CLOSE( ILU ) IF ( JI < TPAIRCRAFT%NPOS ) & - CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'AIRCRAFT_CSV_READ', 'Data not found in file ' // TRIM( HFILE ) ) + 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) diff --git a/src/MNH/ini_aircraft_balloon.f90 b/src/MNH/ini_aircraft_balloon.f90 index 2b9ef0f6c..5fa73b17a 100644 --- a/src/MNH/ini_aircraft_balloon.f90 +++ b/src/MNH/ini_aircraft_balloon.f90 @@ -1,4 +1,4 @@ -!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. @@ -13,20 +13,21 @@ 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, & - PTSTEP, TPDTSEG, PSEGLEN, & - KRR, KSV, KKU, OUSETKE, & - PLATOR, PLONOR ) -! ############################################################### +! ############################################################ + SUBROUTINE INI_AIRCRAFT_BALLOON( TPINIFILE, PLATOR, PLONOR ) +! ############################################################ ! ! !!**** *INI_AIRCRAFT_BALLOON* - @@ -67,22 +68,17 @@ CONTAINS ! ------------ ! USE MODD_AIRCRAFT_BALLOON -USE MODD_CONF -USE MODD_DIAG_FLAG -USE MODD_DYN_n -use modd_field, only: tfieldmetadata, 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_INI_AIRCRAFT -USE MODE_INI_BALLOON -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 ! ! IMPLICIT NONE @@ -90,13 +86,6 @@ 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 ! @@ -105,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 :: JI -TYPE(TFIELDMETADATA) :: TZFIELD ! !---------------------------------------------------------------------------- ! IMI=GET_CURRENT_MODEL_INDEX() -ILUOUT = TLUOUT%NLU !---------------------------------------------------------------------------- ! !* 1. Default values @@ -123,165 +107,86 @@ 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 ( NAIRCRAFTS > 0 .OR. NBALLOONS > 0 ) LFLYER = .TRUE. ! !---------------------------------------------------------------------------- ! !* 2. Balloon initialization ! ---------------------- -IF (IMI == 1) CALL INI_BALLOON -! -DO JI = 1, NBALLOONS - CALL INI_LAUNCH( JI, TBALLOONS(JI)%TBALLOON ) -END DO +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 -! -DO JI = 1, NAIRCRAFTS - CALL INI_FLIGHT( JI, TAIRCRAFTS(JI)%TAIRCRAFT ) -END DO +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 -! -DO JI = 1, NBALLOONS - CALL ALLOCATE_FLYER( TBALLOONS(JI)%TBALLOON ) -END DO -! -DO JI = 1, NAIRCRAFTS - CALL ALLOCATE_FLYER( TAIRCRAFTS(JI)%TAIRCRAFT ) -END DO +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 ALLOCATE_FLYER(TPFLYER) -! -USE MODD_SURF_PAR, ONLY: XUNDEF_SFX => XUNDEF -! -CLASS(TFLYERDATA), 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%TFLYER_TIME%XTSTEP ) + 1 -ELSE - ISTORE = NINT ( ( PSEGLEN - DYN_MODEL(1)%XTSTEP ) / TPFLYER%TFLYER_TIME%XTSTEP ) + 1 -ENDIF -! -IF (TPFLYER%NMODEL == 0) ISTORE=0 -IF (TPFLYER%NMODEL > 0) THEN - WRITE(ILUOUT,*) 'Aircraft or Balloon:',TPFLYER%CTITLE,' nmodel=',TPFLYER%NMODEL -ENDIF -! -! -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,KRR)) -ALLOCATE(TPFLYER%XSV (ISTORE,KSV)) -ALLOCATE(TPFLYER%XRTZ (ISTORE,KKU)) -ALLOCATE(TPFLYER%XRZ (ISTORE,KKU,KRR)) -ALLOCATE(TPFLYER%XFFZ (ISTORE,KKU)) -ALLOCATE(TPFLYER%XIWCZ(ISTORE,KKU)) -ALLOCATE(TPFLYER%XLWCZ(ISTORE,KKU)) -ALLOCATE(TPFLYER%XCIZ (ISTORE,KKU)) -IF (CCLOUD=='LIMA') THEN - ALLOCATE(TPFLYER%XCCZ(ISTORE,KKU)) - ALLOCATE(TPFLYER%XCRZ(ISTORE,KKU)) -ENDIF -ALLOCATE(TPFLYER%XCRARE (ISTORE,KKU)) -ALLOCATE(TPFLYER%XCRARE_ATT(ISTORE,KKU)) -ALLOCATE(TPFLYER%XWZ (ISTORE,KKU)) -ALLOCATE(TPFLYER%XZZ (ISTORE,KKU)) -IF (OUSETKE) 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,KSV)) -! -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%XCIZ = XUNDEF -IF (CCLOUD=='LIMA') THEN - TPFLYER%XCRZ = XUNDEF - TPFLYER%XCCZ = XUNDEF -ENDIF -TPFLYER%XIWCZ = XUNDEF -TPFLYER%XLWCZ = XUNDEF -TPFLYER%XCRARE = XUNDEF -TPFLYER%XCRARE_ATT = XUNDEF -TPFLYER%XWZ = XUNDEF -TPFLYER%XZZ = XUNDEF -TPFLYER%XTKE = XUNDEF -TPFLYER%XTSRAD = XUNDEF_SFX -TPFLYER%XZS = XUNDEF -TPFLYER%XTKE_DISS = XUNDEF -! -TPFLYER%XTHW_FLUX = XUNDEF -TPFLYER%XRCW_FLUX = XUNDEF -TPFLYER%XSVW_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_IO, ONLY: ISP, TFILEDATA +use modd_field, only: tfieldmetadata, TYPEREAL +USE MODD_IO, ONLY: GSMONOPROC, ISP, TFILEDATA #ifdef MNH_IOCDF4 USE MODD_MPIF USE MODD_PRECISION, ONLY: CDFINT, CDFINT_MPI @@ -291,11 +196,7 @@ use MODE_IO_FIELD_READ, only: IO_Field_read INTEGER, INTENT(IN) :: KNBR CLASS(TBALLOONDATA), INTENT(INOUT) :: TPFLYER -! -! -! -!* 0.2 declaration of local variables -! + #ifdef MNH_IOCDF4 INTEGER :: IERR INTEGER(KIND=CDFINT) :: IGROUPID @@ -303,19 +204,25 @@ INTEGER(KIND=CDFINT) :: ISTATUS INTEGER(KIND=CDFINT), DIMENSION(2) :: IDATA ! Intermediate array to allow merge of 2 MPI broadcasts #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 #ifdef MNH_IOCDF4 TYPE(TFILEDATA) :: TZFILE #endif +TYPE(TFIELDMETADATA) :: TZFIELD IF ( IMI /= TPFLYER%NMODEL ) RETURN -LFLYER = .TRUE. - 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 @@ -536,11 +443,14 @@ ELSE IF ( CPROGRAM == 'DIAG ' ) THEN END IF END IF +! Restore correct value of GSMONOPROC +GSMONOPROC = OMONOPROC_SAVE + END SUBROUTINE INI_LAUNCH !---------------------------------------------------------------------------- !---------------------------------------------------------------------------- SUBROUTINE INI_FLIGHT(KNBR,TPFLYER) -! + INTEGER, INTENT(IN) :: KNBR CLASS(TAIRCRAFTDATA), INTENT(INOUT) :: TPFLYER @@ -549,8 +459,6 @@ INTEGER :: JSEG ! loop counter IF ( IMI /= TPFLYER%NMODEL ) RETURN -LFLYER=.TRUE. - ! 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) @@ -602,4 +510,186 @@ END SUBROUTINE FLYER_TIMESTEP_CORRECT ! 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 +! +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 +!---------------------------------------------------------------------------- +!---------------------------------------------------------------------------- +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 7e268fb43..342eb5abf 100644 --- a/src/MNH/ini_balloon.f90 +++ b/src/MNH/ini_balloon.f90 @@ -1,4 +1,4 @@ -!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. @@ -119,8 +119,6 @@ IMPLICIT NONE INTEGER :: JI TYPE(TBALLOONDATA), POINTER :: TZBALLOON -ALLOCATE( TBALLOONS(NBALLOONS) ) - !Treat balloon data read in namelist DO JI = 1, NBALLOONS ALLOCATE( TBALLOONS(JI)%TBALLOON ) @@ -133,7 +131,7 @@ DO JI = 1, NBALLOONS 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' ) + CALL PRINT_MSG( NVERB_INFO, 'GEN', 'INI_BALLOON', OLOCAL = .TRUE. ) END IF TZBALLOON%CTITLE = CTITLE(JI) @@ -141,13 +139,14 @@ DO JI = 1, NBALLOONS 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' ) + 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) ) // ')' ) + '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 @@ -155,7 +154,7 @@ DO JI = 1, NBALLOONS 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' ) + CALL PRINT_MSG( NVERB_ERROR, 'GEN', 'INI_BALLOON', OLOCAL = .TRUE. ) CMODEL(JI) = 'FIX' NMODEL(JI) = 1 END IF @@ -166,23 +165,26 @@ DO JI = 1, NBALLOONS 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) ) ) + '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) ) ) + 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) ) ) + 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' ) + '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) ) ) + 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) @@ -192,17 +194,19 @@ DO JI = 1, NBALLOONS 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' ) + 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) ) ) + '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.' ) + '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) @@ -210,25 +214,28 @@ DO JI = 1, NBALLOONS 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' ) + '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' ) + '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) ) ) + 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) ) ) + 'diameter or volume not provided for CVBALL balloon ' // TRIM( CTITLE(JI) ), OLOCAL = .TRUE. ) IF ( XDIAMETER(JI) <= 0. ) THEN TZBALLOON%XVOLUME = XVOLUME(JI) @@ -238,23 +245,27 @@ DO JI = 1, NBALLOONS 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) ) ) + '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) ) ) + '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) ) ) + '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' ) + 'initial vertical speed is not needed for ISODEN balloon ' // TRIM( CTITLE(JI) ) // ' => ignored', & + OLOCAL = .TRUE. ) XWASCENT(JI) = XNEGUNDEF END IF TZBALLOON%XWASCENT = XWASCENT(JI) @@ -262,35 +273,37 @@ DO JI = 1, NBALLOONS 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' ) + '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' ) + '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' ) + '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' ) + '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' ) + 'volume is not needed for ISODEN balloon ' // TRIM( CTITLE(JI) ) // ' => ignored', OLOCAL = .TRUE. ) XVOLUME(JI) = XNEGUNDEF END IF TZBALLOON%XVOLUME = XVOLUME(JI) @@ -299,12 +312,13 @@ DO JI = 1, NBALLOONS 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) ) ) + '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.' ) + 'initial vertical speed not provided for balloon ' // TRIM( CTITLE(JI) ) // ' => set to 5.', & + OLOCAL = .TRUE. ) XWASCENT(JI) = 5. END IF TZBALLOON%XWASCENT = XWASCENT(JI) @@ -312,7 +326,7 @@ DO JI = 1, NBALLOONS 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' ) + // TRIM( CTITLE(JI) ) // ' => ignored', OLOCAL = .TRUE. ) XPRES(JI) = XNEGUNDEF END IF TZBALLOON%XAERODRAG = XAERODRAG(JI) @@ -320,7 +334,7 @@ DO JI = 1, NBALLOONS 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' ) + // TRIM( CTITLE(JI) ) // ' => ignored', OLOCAL = .TRUE. ) XAERODRAG(JI) = XNEGUNDEF END IF TZBALLOON%XAERODRAG = XAERODRAG(JI) @@ -328,28 +342,29 @@ DO JI = 1, NBALLOONS 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' ) + // 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' ) + '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' ) + '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' ) + 'volume is not needed for radiosounding balloon ' // TRIM( CTITLE(JI) ) // ' => ignored', OLOCAL = .TRUE. ) XVOLUME(JI) = XNEGUNDEF END IF TZBALLOON%XVOLUME = XVOLUME(JI) @@ -357,7 +372,7 @@ DO JI = 1, NBALLOONS CASE DEFAULT CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'INI_BALLOON', 'invalid balloon type (CTYPE=' & - // TRIM( CTYPE(JI ) ) // ') for balloon ' // TRIM( CTITLE(JI) ) ) + // TRIM( CTYPE(JI ) ) // ') for balloon ' // TRIM( CTITLE(JI) ), OLOCAL = .TRUE. ) END SELECT END DO diff --git a/src/MNH/ini_modeln.f90 b/src/MNH/ini_modeln.f90 index 81161434a..902d21e1c 100644 --- a/src/MNH/ini_modeln.f90 +++ b/src/MNH/ini_modeln.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. @@ -2557,9 +2557,7 @@ 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 ) ! !------------------------------------------------------------------------------- ! diff --git a/src/MNH/modd_aircraft_balloon.f90 b/src/MNH/modd_aircraft_balloon.f90 index 92d1ade55..9383f1451 100644 --- a/src/MNH/modd_aircraft_balloon.f90 +++ b/src/MNH/modd_aircraft_balloon.f90 @@ -1,4 +1,4 @@ -!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. @@ -56,6 +56,8 @@ INTEGER, PARAMETER :: NCRASH_OUT_HORIZ = 1 ! Flyer is outside of horizontal doma 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 @@ -90,7 +92,7 @@ TYPE :: TFLYERDATA REAL :: XY_CUR = XNEGUNDEF ! current y REAL :: XZ_CUR = XNEGUNDEF ! current z (if 'RADIOS' or 'AIRCRA' and 'ALTDEF' = T) REAL :: XP_CUR = XNEGUNDEF ! current p (if 'AIRCRA' and 'ALTDEF' = F) - INTEGER :: NRANK_CUR = NNEGUNDEF ! Rank of the process where the flyer is + INTEGER :: NRANK_CUR = NFLYER_DEFAULT_RANK ! Rank of the process where the flyer is ! !* data records ! @@ -121,8 +123,6 @@ TYPE :: TFLYERDATA 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 :: XAER ! Extinction at 550 nm - REAL, DIMENSION(:,:), ALLOCATABLE :: XDST_WL ! Extinction by wavelength REAL, DIMENSION(:), ALLOCATABLE :: XZS ! zs(n) REAL, DIMENSION(:), ALLOCATABLE :: XTSRAD ! Ts(n) ! @@ -190,5 +190,10 @@ TYPE(TAIRCRAFT_PTR), DIMENSION(:), ALLOCATABLE :: TAIRCRAFTS ! characteristics a 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/modeln.f90 b/src/MNH/modeln.f90 index 8d9b03f17..a0d66c654 100644 --- a/src/MNH/modeln.f90 +++ b/src/MNH/modeln.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. @@ -2232,6 +2232,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/read_desfmn.f90 b/src/MNH/read_desfmn.f90 index cc91eec5f..fb645f295 100644 --- a/src/MNH/read_desfmn.f90 +++ b/src/MNH/read_desfmn.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. @@ -268,6 +268,7 @@ USE MODN_PROFILER_n USE MODN_STATION_n ! USE MODN_PARAM_LIMA +! USE MODN_FLYERS ! USE MODE_MSG USE MODE_POS @@ -546,7 +547,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 +623,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 ! !------------------------------------------------------------------------------- ! diff --git a/src/MNH/write_aircraft_balloon.f90 b/src/MNH/write_aircraft_balloon.f90 index decf8c040..2284be8ea 100644 --- a/src/MNH/write_aircraft_balloon.f90 +++ b/src/MNH/write_aircraft_balloon.f90 @@ -1,4 +1,4 @@ -!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. @@ -9,10 +9,13 @@ MODULE MODE_WRITE_AIRCRAFT_BALLOON 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( @@ -80,7 +83,9 @@ SUBROUTINE WRITE_AIRCRAFT_BALLOON(TPDIAFILE) ! ------------ ! USE MODD_AIRCRAFT_BALLOON -USE MODD_IO, ONLY: TFILEDATA +USE MODD_IO, ONLY: ISP, TFILEDATA +! +USE MODE_AIRCRAFT_BALLOON, ONLY: FLYER_RECV_AND_ALLOCATE, FLYER_SEND ! IMPLICIT NONE ! @@ -96,17 +101,100 @@ TYPE(TFILEDATA), INTENT(IN) :: TPDIAFILE ! file to write INTEGER :: JI ! !---------------------------------------------------------------------------- -! + DO JI = 1, NBALLOONS - CALL FLYER_DIACHRO( TPDIAFILE, TBALLOONS(JI)%TBALLOON ) + ! 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 DO JI = 1, NAIRCRAFTS - CALL FLYER_DIACHRO( TPDIAFILE, TAIRCRAFTS(JI)%TAIRCRAFT ) + ! The aircraft 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_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 ) ! ############################################ @@ -128,7 +216,6 @@ 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_msg use mode_write_diachro, only: Write_diachro @@ -634,9 +721,8 @@ DEALLOCATE (CUNIT ) contains -subroutine Add_profile( htitle, hcomment, hunits, pfield ) -use mode_msg +subroutine Add_profile( htitle, hcomment, hunits, pfield ) character(len=*), intent(in) :: htitle character(len=*), intent(in) :: hcomment @@ -662,8 +748,6 @@ end subroutine Add_profile 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 diff --git a/src/MNH/write_balloonn.f90 b/src/MNH/write_balloonn.f90 index 2b1b55417..6855ece50 100644 --- a/src/MNH/write_balloonn.f90 +++ b/src/MNH/write_balloonn.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2001-2022 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. @@ -44,7 +44,7 @@ CONTAINS !! !! AUTHOR !! ------ -!! G.Jaubert *Meteo France* +!! G.Jaubert *Meteo France* !! !! MODIFICATIONS !! ------------- @@ -57,9 +57,11 @@ CONTAINS !* 0. DECLARATIONS ! ------------ ! -USE MODD_AIRCRAFT_BALLOON, only: NBALLOONS, TBALLOONS -USE MODD_IO, ONLY: TFILEDATA +USE MODD_AIRCRAFT_BALLOON, only: NBALLOONS, NRANKCUR_BALLOON, TBALLOONS +USE MODD_IO, ONLY: GSMONOPROC, ISP, TFILEDATA ! +USE MODE_AIRCRAFT_BALLOON, ONLY: FLYER_RECV_AND_ALLOCATE, FLYER_SEND +USE MODE_INI_AIRCRAFT_BALLOON, ONLY: DEALLOCATE_FLYER ! IMPLICIT NONE ! @@ -71,11 +73,42 @@ TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! File characteristics ! ! INTEGER :: JI +LOGICAL :: OMONOPROC_SAVE ! Copy of true value of GSMONOPROC + +! 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 - IF ( TBALLOONS(JI)%TBALLOON%LFLY ) CALL WRITE_BALLOON_POSITION( TPFILE, TBALLOONS(JI)%TBALLOON ) + ! 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 + IF ( TBALLOONS(JI)%TBALLOON%LFLY ) 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 !------------------------------------------------------------------------------- diff --git a/src/MNH/write_diachro.f90 b/src/MNH/write_diachro.f90 index 21be258ef..bde51d154 100644 --- a/src/MNH/write_diachro.f90 +++ b/src/MNH/write_diachro.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1996-2022 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. @@ -100,7 +100,7 @@ use modd_aircraft_balloon, only: tflyerdata use modd_budget, only: tbudiachrometadata use modd_conf, only: lpack use modd_field, only: tfieldmetadata_base -use modd_io, only: tfiledata +use modd_io, only: gsmonoproc, tfiledata use modd_type_date, only: date_time ! IMPLICIT NONE @@ -117,6 +117,7 @@ class(tflyerdata), intent(in), optional :: tpfl ! !* 0.1 Local variables ! --------------- +logical :: omonoproc_save ! Copy of true value of gsmonoproc logical :: gpack !------------------------------------------------------------------------------ @@ -125,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 ) @@ -137,6 +147,12 @@ 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 diff --git a/src/MNH/write_lfin.f90 b/src/MNH/write_lfin.f90 index 1b48d9b9b..9daf40c08 100644 --- a/src/MNH/write_lfin.f90 +++ b/src/MNH/write_lfin.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. @@ -1795,6 +1795,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) ! ! -- GitLab From 08bbeaf468990aea42505ff145ffe97b1cb9accc Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Fri, 13 Jan 2023 14:59:36 +0100 Subject: [PATCH 140/157] Philippe 13/01/2023: fix for LCHECK --- src/MNH/finalize_mnh.f90 | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/src/MNH/finalize_mnh.f90 b/src/MNH/finalize_mnh.f90 index faabb9972..e6000a55b 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() -- GitLab From 383c44f7538c6cfaa4799275e061acd66f42be98 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Fri, 13 Jan 2023 15:01:49 +0100 Subject: [PATCH 141/157] Philippe 13/01/2023: set NMODEL field for backup and output files --- src/LIB/SURCOUCHE/src/mode_io_manage_struct.f90 | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/LIB/SURCOUCHE/src/mode_io_manage_struct.f90 b/src/LIB/SURCOUCHE/src/mode_io_manage_struct.f90 index 60cf44de0..3174a2947 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 -- GitLab From 63c9aa0c3644f3ec6e760ca6cd903387b48b08c8 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Fri, 13 Jan 2023 16:01:12 +0100 Subject: [PATCH 142/157] Philippe 13/01/2023: IO_File_close: add optional dummy argument TPDTMODELN to force written model time --- src/LIB/SURCOUCHE/src/mode_io_file.f90 | 10 ++++++---- src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 | 13 ++++++++++--- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/src/LIB/SURCOUCHE/src/mode_io_file.f90 b/src/LIB/SURCOUCHE/src/mode_io_file.f90 index 6ed3a03c2..663059f07 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_write_nc4.f90 b/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 index 1858061ac..f91733cdd 100644 --- a/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 +++ b/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 @@ -31,6 +31,7 @@ ! 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 @@ -1429,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 @@ -1472,6 +1473,7 @@ 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 @@ -1661,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 -- GitLab From 30b3fe3d12991c901038a0095e05bf5db5c425bd Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Fri, 13 Jan 2023 16:19:33 +0100 Subject: [PATCH 143/157] Philippe 13/01/2023: manage close of backup files outside of MODEL_n Useful to close them in reverse model order (child before parent) This is needed by WRITE_BALLOON_n (future commit) --- src/MNH/kid_model.f90 | 30 +++++++++++-------- src/MNH/mesonh.f90 | 23 ++++++++++++--- src/MNH/modeln.f90 | 69 ++++++++++++++++++++++--------------------- 3 files changed, 71 insertions(+), 51 deletions(-) diff --git a/src/MNH/kid_model.f90 b/src/MNH/kid_model.f90 index 68fdb5dbc..44c18b9eb 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/mesonh.f90 b/src/MNH/mesonh.f90 index dd28504bb..a6053e6e9 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 ! @@ -121,6 +125,8 @@ INTEGER :: ITEMP_MODEL1 ! loop increment 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 ! #ifdef CPLOASIS CHARACTER(LEN=28) :: CNAMELIST @@ -190,7 +196,11 @@ 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, TZBAKFILE, TZDTMODELN, GEXIT ) + IF ( TZBAKFILE%LOPENED ) THEN + CALL IO_FILE_CLOSE( TZBAKFILE, TPDTMODELN = TZDTMODELN ) + NULLIFY( TZBAKFILE ) + END IF END DO ! IF(GEXIT) THEN @@ -205,10 +215,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/modeln.f90 b/src/MNH/modeln.f90 index a0d66c654..e3227e2b5 100644 --- a/src/MNH/modeln.f90 +++ b/src/MNH/modeln.f90 @@ -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 @@ -273,6 +278,8 @@ END MODULE MODI_MODEL_n ! P. Wautelet 19/02/2021: add NEGA2 term for SV budgets ! J.L. Redelsperger 03/2021: add Call NHOA_COUPLN (coupling O & A LES version) ! 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 @@ -362,6 +369,7 @@ 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 @@ -460,8 +468,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 ! @@ -551,16 +561,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) @@ -968,12 +978,12 @@ 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 ) IF ( ASSOCIATED( TBACKUPN(nfile_backup_current)%TFILE%TDADFILE ) ) THEN YDADNAME = TBACKUPN(nfile_backup_current)%TFILE%TDADFILE%CNAME @@ -982,10 +992,10 @@ IF ( nfile_backup_current < NBAK_NUMB ) THEN YDADNAME = 'DUMMY' END IF CALL WRITE_LFIFM_n( TBACKUPN(nfile_backup_current)%TFILE, TRIM( YDADNAME ) ) - TOUTDATAFILE => TZBAKFILE - CALL MNHWRITE_ZS_DUMMY_n(TZBAKFILE) + 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 @@ -1000,7 +1010,7 @@ IF ( nfile_backup_current < NBAK_NUMB ) THEN 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 @@ -1011,11 +1021,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 @@ -1434,7 +1444,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 ) @@ -1609,7 +1619,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, & @@ -1711,7 +1721,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 ) @@ -1898,7 +1908,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, & @@ -1918,7 +1928,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, & @@ -2192,15 +2202,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 ! -------------------- ! -- GitLab From e6ded4d68f6b5a0531e39f86a21479ab31de0e9d Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Wed, 18 Jan 2023 10:40:29 +0100 Subject: [PATCH 144/157] Philippe 18/01/2023: balloons: write position in backup files for current and all ancestry models (at correct instant) --- src/MNH/write_balloonn.f90 | 34 +++++++++++++++++++++++++++------- 1 file changed, 27 insertions(+), 7 deletions(-) diff --git a/src/MNH/write_balloonn.f90 b/src/MNH/write_balloonn.f90 index 6855ece50..e20c046d5 100644 --- a/src/MNH/write_balloonn.f90 +++ b/src/MNH/write_balloonn.f90 @@ -62,6 +62,7 @@ USE MODD_IO, ONLY: GSMONOPROC, ISP, TFILEDATA ! 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 ! @@ -72,9 +73,12 @@ TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! File characteristics !* 0.2 Declarations of local variables ! ! +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) @@ -95,8 +99,9 @@ DO JI = 1, NBALLOONS CALL FLYER_RECV_AND_ALLOCATE( TBALLOONS(JI)%TBALLOON, NRANKCUR_BALLOON(JI) ) END IF - ! Write data - IF ( TBALLOONS(JI)%TBALLOON%LFLY ) CALL WRITE_BALLOON_POSITION( TPFILE, TBALLOONS(JI)%TBALLOON ) + ! 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 @@ -113,7 +118,7 @@ END SUBROUTINE WRITE_BALLOON_n !------------------------------------------------------------------------------- !------------------------------------------------------------------------------- -SUBROUTINE WRITE_BALLOON_POSITION( TPFILE, TPFLYER ) +RECURSIVE SUBROUTINE WRITE_BALLOON_POSITION( TPFILE, TPFLYER ) ! #ifdef MNH_IOCDF4 use NETCDF, only: NF90_DEF_GRP, NF90_GLOBAL, NF90_INQ_NCID, NF90_NOERR, NF90_PUT_ATT @@ -126,7 +131,9 @@ 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 #ifdef MNH_IOCDF4 @@ -136,10 +143,7 @@ use mode_msg TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! File characteristics TYPE(TBALLOONDATA), INTENT(IN) :: TPFLYER -! -! -!* 0.2 Declarations of local variables -! + #ifdef MNH_IOCDF4 integer(kind=CDFINT) :: igroupid integer(kind=CDFINT) :: istatus @@ -149,6 +153,22 @@ 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 -- GitLab From 555f607a579d561092031fd205e6b0b55703230a Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Wed, 18 Jan 2023 13:27:58 +0100 Subject: [PATCH 145/157] Philippe 18/01/2023: bugfix: correct pack size for flyer communications --- src/MNH/aircraft_balloon.f90 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/MNH/aircraft_balloon.f90 b/src/MNH/aircraft_balloon.f90 index f8ff487e0..4311c5406 100644 --- a/src/MNH/aircraft_balloon.f90 +++ b/src/MNH/aircraft_balloon.f90 @@ -256,7 +256,7 @@ END IF CALL BALLOONS_MOVE_TO_NEW_RANKS() -END SUBROUTINE BALLOONS_INIT_POSITIONs +END SUBROUTINE BALLOONS_INIT_POSITIONS !---------------------------------------------------------------------------- !---------------------------------------------------------------------------- SUBROUTINE BALLOONS_MOVE_TO_NEW_RANKS() @@ -372,7 +372,7 @@ ISTORE_CUR = TPFLYER%TFLYER_TIME%N_CUR ! 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 = 16 + LEN(TPFLYER%CTITLE) + ISTORE_CUR * ( 18 + NSV * 2 + IKU * ( 9 + NRR * 2 ) ) +IPACKSIZE = 16 + LEN(TPFLYER%CTITLE) + ISTORE_CUR * ( 18 + NRR + NSV * 2 + IKU * ( 9 + NRR ) ) IF ( CCLOUD == 'LIMA' ) IPACKSIZE = IPACKSIZE + ISTORE_CUR * IKU * 2 SELECT TYPE ( TPFLYER ) -- GitLab From 352773749d32e0a37eaddf99ded21b14595311b5 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Wed, 18 Jan 2023 14:33:49 +0100 Subject: [PATCH 146/157] Philippe 18/01/2023: bugfix: close backup files in the correct order for the first temporal iteration This solves crash in case of model restart with balloons --- src/MNH/mesonh.f90 | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/src/MNH/mesonh.f90 b/src/MNH/mesonh.f90 index a6053e6e9..ad132c941 100644 --- a/src/MNH/mesonh.f90 +++ b/src/MNH/mesonh.f90 @@ -120,13 +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 @@ -192,17 +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, TZBAKFILE, TZDTMODELN, 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 -- GitLab From 3fb6fc48df20fe9344617ff5d3bb6990090758c6 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Wed, 18 Jan 2023 16:11:54 +0100 Subject: [PATCH 147/157] Philippe 18/01/2023: balloons: modify restart for balloons to work correctly --- src/MNH/aircraft_balloon.f90 | 7 ++++++- src/MNH/ini_aircraft_balloon.f90 | 14 +++++--------- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/src/MNH/aircraft_balloon.f90 b/src/MNH/aircraft_balloon.f90 index 4311c5406..5027747f5 100644 --- a/src/MNH/aircraft_balloon.f90 +++ b/src/MNH/aircraft_balloon.f90 @@ -240,7 +240,12 @@ IF ( ISP == NFLYER_DEFAULT_RANK ) THEN IF ( .NOT. TZBALLOON%LPOSITION_INIT ) THEN TZBALLOON%LPOSITION_INIT = .TRUE. ! Get rank of the process where the balloon is and the model number - CALL FLYER_GET_RANK_MODEL_ISCRASHED( TZBALLOON, PX = TZBALLOON%XXLAUNCH, PY = TZBALLOON%XYLAUNCH ) + 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' ) diff --git a/src/MNH/ini_aircraft_balloon.f90 b/src/MNH/ini_aircraft_balloon.f90 index 5fa73b17a..61e634973 100644 --- a/src/MNH/ini_aircraft_balloon.f90 +++ b/src/MNH/ini_aircraft_balloon.f90 @@ -188,9 +188,9 @@ USE NETCDF, ONLY: NF90_INQ_NCID, NF90_NOERR use modd_field, only: tfieldmetadata, TYPEREAL USE MODD_IO, ONLY: GSMONOPROC, ISP, TFILEDATA #ifdef MNH_IOCDF4 -USE MODD_MPIF -USE MODD_PRECISION, ONLY: CDFINT, CDFINT_MPI +USE MODD_PRECISION, ONLY: CDFINT #endif +USE MODD_TIME_n, ONLY: TDTCUR use MODE_IO_FIELD_READ, only: IO_Field_read @@ -198,10 +198,8 @@ INTEGER, INTENT(IN) :: KNBR CLASS(TBALLOONDATA), INTENT(INOUT) :: TPFLYER #ifdef MNH_IOCDF4 -INTEGER :: IERR INTEGER(KIND=CDFINT) :: IGROUPID INTEGER(KIND=CDFINT) :: ISTATUS -INTEGER(KIND=CDFINT), DIMENSION(2) :: IDATA ! Intermediate array to allow merge of 2 MPI broadcasts #endif INTEGER :: IMODEL INTEGER :: IRESP ! return code @@ -306,12 +304,9 @@ IF ( CPROGRAM == 'MESONH' .OR. CPROGRAM == 'SPAWN ' .OR. CPROGRAM == 'REAL ' ) #ifdef MNH_IOCDF4 ELSE ! Read in netCDF file (new structure since MesoNH 5.6) - IF ( ISP == TPINIFILE%NMASTER_RANK ) ISTATUS = NF90_INQ_NCID( TPINIFILE%NNCID, TRIM( TPFLYER%CTITLE ), IGROUPID ) + IF ( ISP /= TPINIFILE%NMASTER_RANK ) CALL PRINT_MSG( NVERB_ERROR, 'IO', 'INI_LAUNCH', 'process is not the file master process') - IDATA(:) = [ ISTATUS, IGROUPID ] ! Merge 2 broadcasts into 1 - CALL MPI_BCAST( IDATA, SIZE( IDATA ), CDFINT_MPI, TPINIFILE%NMASTER_RANK - 1, TPINIFILE%NMPICOMM, IERR ) - ISTATUS = IDATA(1) - IGROUPID = IDATA(2) + ISTATUS = NF90_INQ_NCID( TPINIFILE%NNCID, TRIM( TPFLYER%CTITLE ), IGROUPID ) IF ( ISTATUS == NF90_NOERR ) THEN GREAD = .TRUE. @@ -393,6 +388,7 @@ IF ( CPROGRAM == 'MESONH' .OR. CPROGRAM == 'SPAWN ' .OR. CPROGRAM == 'REAL ' ) 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 -- GitLab From 663e511ce410856548336b80fad714e9f4149fbc Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Thu, 19 Jan 2023 11:09:57 +0100 Subject: [PATCH 148/157] Philippe 19/01/2023: flyers: move XP_CUR from TFLYERDATA to TAIRCRAFTDATA --- src/MNH/aircraft_balloon.f90 | 9 +++++---- src/MNH/ini_aircraft_balloon.f90 | 4 ---- src/MNH/modd_aircraft_balloon.f90 | 4 ++-- 3 files changed, 7 insertions(+), 10 deletions(-) diff --git a/src/MNH/aircraft_balloon.f90 b/src/MNH/aircraft_balloon.f90 index 5027747f5..3f7e8384f 100644 --- a/src/MNH/aircraft_balloon.f90 +++ b/src/MNH/aircraft_balloon.f90 @@ -377,12 +377,12 @@ ISTORE_CUR = TPFLYER%TFLYER_TIME%N_CUR ! 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 = 16 + LEN(TPFLYER%CTITLE) + ISTORE_CUR * ( 18 + NRR + NSV * 2 + IKU * ( 9 + NRR ) ) +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 + 5 + TPFLYER%NPOS * 6 + IPACKSIZE = IPACKSIZE + 6 + TPFLYER%NPOS * 6 CLASS IS ( TBALLOONDATA ) IPACKSIZE = IPACKSIZE + 15 @@ -463,7 +463,6 @@ 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%XP_CUR; IPOS = IPOS + 1 ZPACK(IPOS) = TPFLYER%NRANK_CUR; IPOS = IPOS + 1 @@ -532,6 +531,7 @@ SELECT TYPE ( TPFLYER ) 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 @@ -738,7 +738,6 @@ 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%XP_CUR = ZPACK(IPOS); IPOS = IPOS + 1 TPFLYER%NRANK_CUR = NINT( ZPACK(IPOS) ); IPOS = IPOS + 1 @@ -808,6 +807,8 @@ SELECT TYPE ( TPFLYER ) 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) ) diff --git a/src/MNH/ini_aircraft_balloon.f90 b/src/MNH/ini_aircraft_balloon.f90 index 61e634973..48f7b1e22 100644 --- a/src/MNH/ini_aircraft_balloon.f90 +++ b/src/MNH/ini_aircraft_balloon.f90 @@ -273,8 +273,6 @@ IF ( CPROGRAM == 'MESONH' .OR. CPROGRAM == 'SPAWN ' .OR. CPROGRAM == 'REAL ' ) LTIMEDEP = .TRUE. ) CALL IO_Field_read(TPINIFILE,TZFIELD,TPFLYER%XZ_CUR) - TPFLYER%XP_CUR = XUNDEF - TZFIELD = TFIELDMETADATA( & CMNHNAME = TRIM(TPFLYER%CTITLE)//'WASCENT', & CSTDNAME = '', & @@ -353,8 +351,6 @@ IF ( CPROGRAM == 'MESONH' .OR. CPROGRAM == 'SPAWN ' .OR. CPROGRAM == 'REAL ' ) LTIMEDEP = .TRUE. ) CALL IO_Field_read(TZFILE,TZFIELD,TPFLYER%XZ_CUR) - TPFLYER%XP_CUR = XUNDEF - TZFIELD = TFIELDMETADATA( & CMNHNAME = 'WASCENT', & CSTDNAME = '', & diff --git a/src/MNH/modd_aircraft_balloon.f90 b/src/MNH/modd_aircraft_balloon.f90 index 9383f1451..98bbd34ed 100644 --- a/src/MNH/modd_aircraft_balloon.f90 +++ b/src/MNH/modd_aircraft_balloon.f90 @@ -68,7 +68,7 @@ TYPE :: TFLYERDATA ! '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 + 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 @@ -91,7 +91,6 @@ TYPE :: TFLYERDATA 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) - REAL :: XP_CUR = XNEGUNDEF ! current p (if 'AIRCRA' and 'ALTDEF' = F) INTEGER :: NRANK_CUR = NFLYER_DEFAULT_RANK ! Rank of the process where the flyer is ! !* data records @@ -150,6 +149,7 @@ TYPE, EXTENDS( TFLYERDATA ) :: TAIRCRAFTDATA !* 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 -- GitLab From 93d26ea06930e7483b4220b91200bb4ddd09a42c Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Thu, 19 Jan 2023 14:04:49 +0100 Subject: [PATCH 149/157] Philippe 19/01/2023: flyers: write X and Y (flyer horizontal position) only in shape level 'Point' (and not 'Vertical_profile' anymore) --- src/MNH/write_diachro.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/MNH/write_diachro.f90 b/src/MNH/write_diachro.f90 index bde51d154..3a45d50f9 100644 --- a/src/MNH/write_diachro.f90 +++ b/src/MNH/write_diachro.f90 @@ -1509,7 +1509,7 @@ 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 -- GitLab From a0e4c900b6f60a68b1f8dc9df1b0748d17fcefbb Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Thu, 19 Jan 2023 14:45:56 +0100 Subject: [PATCH 150/157] Philippe 19/01/2023: backward compatibility fix: set DRYMASSS to 0. if not found in restart file (needed to restart with pre 5.5.1 backup files) --- src/MNH/read_field.f90 | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/MNH/read_field.f90 b/src/MNH/read_field.f90 index 1a40d1797..ce75a05f3 100644 --- a/src/MNH/read_field.f90 +++ b/src/MNH/read_field.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. @@ -1007,7 +1007,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 -- GitLab From 1e32775ddc2d4f91516c7da6564701cc68959c25 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Thu, 19 Jan 2023 15:43:50 +0100 Subject: [PATCH 151/157] Philippe 19/01/2023: bugfix for ForeFire: solve ForeFire scalar variables not read in grid nested restarted runs --- src/MNH/write_desfmn.f90 | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/MNH/write_desfmn.f90 b/src/MNH/write_desfmn.f90 index e7a777d64..1613eb4bc 100644 --- a/src/MNH/write_desfmn.f90 +++ b/src/MNH/write_desfmn.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. @@ -148,12 +148,16 @@ END MODULE MODI_WRITE_DESFM_n !! E.Jezequel 02/2021 add stations read from CSV file ! 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 +#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 @@ -206,7 +210,6 @@ 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 @@ -407,7 +410,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(LCONDSAMP) WRITE(UNIT=ILUSEG,NML=NAM_CONDSAMP) IF(LORILAM.AND.LUSECHEM) WRITE(UNIT=ILUSEG,NML=NAM_CH_ORILAM) -- GitLab From 1a59e43164f03d5e2e56077f3ff00b8913b3a141 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Fri, 20 Jan 2023 10:20:12 +0100 Subject: [PATCH 152/157] Philippe 20/01/2023: upgrade libaec to version v1.0.6 --- src/LIB/libaec-v1.0.6.tar.gz | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 src/LIB/libaec-v1.0.6.tar.gz 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 000000000..9a4e3c40c --- /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 -- GitLab From b9f814ed470fb41dbd0d19a116401a8397375e5c Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Fri, 20 Jan 2023 10:20:37 +0100 Subject: [PATCH 153/157] Philippe 20/01/2023: upgrade HDF5 to version 1.14.0 --- src/LIB/hdf5-1.14.0.tar.gz | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 src/LIB/hdf5-1.14.0.tar.gz 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 000000000..14467a663 --- /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 -- GitLab From 2d8bbca474615c74c223a8b212a9660d30d080b4 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Fri, 20 Jan 2023 10:20:59 +0100 Subject: [PATCH 154/157] Philippe 20/01/2023: upgrade netCDF-C to version 4.9.0 --- src/LIB/netcdf-c-4.9.0.tar.gz | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 src/LIB/netcdf-c-4.9.0.tar.gz 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 000000000..6ee47e081 --- /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 -- GitLab From e14a400fd4f97eea6829032820e936eef2288940 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Fri, 20 Jan 2023 10:21:19 +0100 Subject: [PATCH 155/157] Philippe 20/01/2023: upgrade netCDF-Fortran to version 4.6.0 --- src/LIB/netcdf-fortran-4.6.0.tar.gz | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 src/LIB/netcdf-fortran-4.6.0.tar.gz 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 000000000..acc4addf3 --- /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 -- GitLab From d3c148fa8b6441a1589827373634ffa91d357186 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Fri, 20 Jan 2023 10:30:31 +0100 Subject: [PATCH 156/157] Philippe 20/01/2023: compile new versions of libaec, HDF5 and netCDF --- src/Makefile | 4 ++-- src/configure | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/Makefile b/src/Makefile index d996ff973..eeb9a0c77 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" && \ diff --git a/src/configure b/src/configure index 1b807d8b8..ef21a7b0c 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/"} -- GitLab From eff3959274550799e4bfd4ad91bfbfd949688515 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Fri, 20 Jan 2023 10:34:14 +0100 Subject: [PATCH 157/157] Philippe 20/01/2023: remove old libaec, HDF5 and netCDF versions --- src/LIB/hdf5-1.12.0.tar.gz | 3 --- src/LIB/libaec-0.3.4.tar.gz | 3 --- src/LIB/netcdf-c-4.7.4.tar.gz | 3 --- src/LIB/netcdf-fortran-4.5.3.tar.gz | 3 --- 4 files changed, 12 deletions(-) delete mode 100644 src/LIB/hdf5-1.12.0.tar.gz delete mode 100644 src/LIB/libaec-0.3.4.tar.gz delete mode 100644 src/LIB/netcdf-c-4.7.4.tar.gz delete mode 100644 src/LIB/netcdf-fortran-4.5.3.tar.gz 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 b61a243e0..000000000 --- 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/libaec-0.3.4.tar.gz b/src/LIB/libaec-0.3.4.tar.gz deleted file mode 100644 index f35f3df1a..000000000 --- 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/netcdf-c-4.7.4.tar.gz b/src/LIB/netcdf-c-4.7.4.tar.gz deleted file mode 100644 index e0062fbd7..000000000 --- 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-fortran-4.5.3.tar.gz b/src/LIB/netcdf-fortran-4.5.3.tar.gz deleted file mode 100644 index 8533eec91..000000000 --- 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 -- GitLab