diff --git a/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 b/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 index f3a4ffb2b0ff54cd422efc600dd73593912b714f..497aca4aa476ee02d6fb6adbe6e22e01320e3b0c 100644 --- a/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 +++ b/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 @@ -27,6 +27,7 @@ ! P. Wautelet 11/01/2021: add coordinates for dimension variables in diachronic files ! 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 !----------------------------------------------------------------- #ifdef MNH_IOCDF4 module mode_io_write_nc4 @@ -1777,7 +1778,7 @@ if ( tpfile%lmaster ) then if ( cles_level_type == 'K' ) then Allocate( zles_levels(nles_k) ) do ji = 1, nles_k - zles_levels(ji) = zzhatm(nles_levels(ji)) + zles_levels(ji) = zzhatm(nles_levels(ji) + JPVEXT) end do call Write_ver_coord( tpfile%tncdims%tdims(NMNHDIM_BUDGET_LES_LEVEL), & 'position z in the transformed space of the LES budgets', & @@ -1796,10 +1797,12 @@ if ( tpfile%lmaster ) then !Coordinates for the number of horizontal wavelengths for non-local LES budgets (2 points correlations) if ( nspectra_ni > 0 ) & call Write_hor_coord1d( tpfile%tncdims%tdims(NMNHDIM_SPECTRA_2PTS_NI), 'x-dimension of the LES budget cartesian box', & - trim(ystdnameprefix)//'_x_coordinate', 'X', 0., 0, 0, zxhatm_glob(nlesn_iinf(imi) : nlesn_isup(imi)) ) + trim(ystdnameprefix)//'_x_coordinate', 'X', 0., 0, 0, & + zxhatm_glob(nlesn_iinf(imi) + jphext : nlesn_isup(imi) + jphext) ) if ( nspectra_nj > 0 .and. .not. l2d ) & call Write_hor_coord1d( tpfile%tncdims%tdims(NMNHDIM_SPECTRA_2PTS_NJ), 'y-dimension of the LES budget cartesian box', & - trim(ystdnameprefix)//'_y_coordinate', 'Y', 0., 0, 0, zyhatm_glob(nlesn_jinf(imi) : nlesn_jsup(imi)) ) + trim(ystdnameprefix)//'_y_coordinate', 'Y', 0., 0, 0, & + zyhatm_glob(nlesn_jinf(imi) + jphext : nlesn_jsup(imi) + jphext) ) !NMNHDIM_SPECTRA_SPEC_NI, NMNHDIM_SPECTRA_SPEC_NJ: not true dimensions: spectra wavelengths @@ -1809,7 +1812,7 @@ if ( tpfile%lmaster ) then if ( cspectra_level_type == 'K' ) then Allocate( zspectra_levels(nspectra_k) ) do ji = 1, nspectra_k - zspectra_levels(ji) = zzhatm(nspectra_levels(ji)) + zspectra_levels(ji) = zzhatm(nspectra_levels(ji) + JPVEXT) end do call Write_ver_coord( tpfile%tncdims%tdims(NMNHDIM_SPECTRA_LEVEL), & 'position z in the transformed space of the non-local LES budgets', & diff --git a/src/MNH/ini_budget.f90 b/src/MNH/ini_budget.f90 index a7e3208cd565e1e564ca8c7739ddb5c58b227b06..b5bc6f9ec702cf54ee5adec28b2583811af10d57 100644 --- a/src/MNH/ini_budget.f90 +++ b/src/MNH/ini_budget.f90 @@ -219,6 +219,7 @@ use modd_blowsnow_n, only: lsnowsubl use modd_budget use modd_ch_aerosol, only: lorilam use modd_conf, only: l1d, lcartesian, lforcing, lthinshell, nmodel +use modd_dim_n, only: nimax_ll, njmax_ll, nkmax use modd_dragbldg_n, only: ldragbldg use modd_dust, only: ldust use modd_dyn, only: lcorio, xseglen @@ -378,22 +379,34 @@ end if IF (CBUTYPE=='CART') THEN ! cartesian case only ! - IF ( NBUIH < NBUIL ) CALL Print_msg( NVERB_ERROR, 'BUD', 'Ini_budget', 'NBUIH < NBUIL' ) + IF ( NBUIL < 1 ) CALL Print_msg( NVERB_ERROR, 'BUD', 'Ini_budget', 'NBUIL too small (<1)' ) + IF ( NBUIL > NIMAX_ll ) CALL Print_msg( NVERB_ERROR, 'BUD', 'Ini_budget', 'NBUIL too large (>NIMAX)' ) + IF ( NBUIH < 1 ) CALL Print_msg( NVERB_ERROR, 'BUD', 'Ini_budget', 'NBUIH too small (<1)' ) + IF ( NBUIH > NIMAX_ll ) CALL Print_msg( NVERB_ERROR, 'BUD', 'Ini_budget', 'NBUIH too large (>NIMAX)' ) + IF ( NBUIH < NBUIL ) CALL Print_msg( NVERB_ERROR, 'BUD', 'Ini_budget', 'NBUIH < NBUIL' ) IF (LBU_ICP) THEN NBUIMAX_ll = 1 ELSE NBUIMAX_ll = NBUIH - NBUIL +1 END IF - IF ( NBUJH < NBUJL ) CALL Print_msg( NVERB_ERROR, 'BUD', 'Ini_budget', 'NBUJH < NBUJL' ) + IF ( NBUJL < 1 ) CALL Print_msg( NVERB_ERROR, 'BUD', 'Ini_budget', 'NBUJL too small (<1)' ) + IF ( NBUJL > NJMAX_ll ) CALL Print_msg( NVERB_ERROR, 'BUD', 'Ini_budget', 'NBUJL too large (>NJMAX)' ) + IF ( NBUJH < 1 ) CALL Print_msg( NVERB_ERROR, 'BUD', 'Ini_budget', 'NBUJH too small (<1)' ) + IF ( NBUJH > NJMAX_ll ) CALL Print_msg( NVERB_ERROR, 'BUD', 'Ini_budget', 'NBUJH too large (>NJMAX)' ) + IF ( NBUJH < NBUJL ) CALL Print_msg( NVERB_ERROR, 'BUD', 'Ini_budget', 'NBUJH < NBUJL' ) IF (LBU_JCP) THEN NBUJMAX_ll = 1 ELSE NBUJMAX_ll = NBUJH - NBUJL +1 END IF + IF ( NBUKL < 1 ) CALL Print_msg( NVERB_ERROR, 'BUD', 'Ini_budget', 'NBUKL too small (<1)' ) + IF ( NBUKL > NKMAX ) CALL Print_msg( NVERB_ERROR, 'BUD', 'Ini_budget', 'NBUKL too large (>NKMAX)' ) + IF ( NBUKH < 1 ) CALL Print_msg( NVERB_ERROR, 'BUD', 'Ini_budget', 'NBUKH too small (<1)' ) + IF ( NBUKH > NKMAX ) CALL Print_msg( NVERB_ERROR, 'BUD', 'Ini_budget', 'NBUKH too large (>NKMAX)' ) IF ( NBUKH < NBUKL ) CALL Print_msg( NVERB_ERROR, 'BUD', 'Ini_budget', 'NBUKH < NBUKL' ) -! + CALL GET_INTERSECTION_ll(NBUIL+JPHEXT,NBUJL+JPHEXT,NBUIH+JPHEXT,NBUJH+JPHEXT, & NBUSIL,NBUSJL,NBUSIH,NBUSJH,"PHYS",IINFO_ll) IF ( IINFO_ll /= 1 ) THEN ! @@ -4055,6 +4068,19 @@ END IF call Ini_budget_groups( tbudgets, ibudim1, ibudim2, ibudim3 ) +if ( tbudgets(NBUDGET_U) %lenabled ) call Sourcelist_nml_compact( tbudgets(NBUDGET_U), cbulist_ru ) +if ( tbudgets(NBUDGET_V) %lenabled ) call Sourcelist_nml_compact( tbudgets(NBUDGET_V), cbulist_rv ) +if ( tbudgets(NBUDGET_W) %lenabled ) call Sourcelist_nml_compact( tbudgets(NBUDGET_W), cbulist_rw ) +if ( tbudgets(NBUDGET_TH) %lenabled ) call Sourcelist_nml_compact( tbudgets(NBUDGET_TH), cbulist_rth ) +if ( tbudgets(NBUDGET_TKE)%lenabled ) call Sourcelist_nml_compact( tbudgets(NBUDGET_TKE), cbulist_rtke ) +if ( tbudgets(NBUDGET_RV) %lenabled ) call Sourcelist_nml_compact( tbudgets(NBUDGET_RV), cbulist_rrv ) +if ( tbudgets(NBUDGET_RC) %lenabled ) call Sourcelist_nml_compact( tbudgets(NBUDGET_RC), cbulist_rrc ) +if ( tbudgets(NBUDGET_RR) %lenabled ) call Sourcelist_nml_compact( tbudgets(NBUDGET_RR), cbulist_rrr ) +if ( tbudgets(NBUDGET_RI) %lenabled ) call Sourcelist_nml_compact( tbudgets(NBUDGET_RI), cbulist_rri ) +if ( tbudgets(NBUDGET_RS) %lenabled ) call Sourcelist_nml_compact( tbudgets(NBUDGET_RS), cbulist_rrs ) +if ( tbudgets(NBUDGET_RG) %lenabled ) call Sourcelist_nml_compact( tbudgets(NBUDGET_RG), cbulist_rrg ) +if ( tbudgets(NBUDGET_RH) %lenabled ) call Sourcelist_nml_compact( tbudgets(NBUDGET_RH), cbulist_rrh ) +if ( lbu_rsv ) call Sourcelist_sv_nml_compact( cbulist_rsv ) end subroutine Ini_budget @@ -4406,12 +4432,68 @@ subroutine Sourcelist_scan( tpbudget, hbulist ) character(len=:), allocatable :: yline character(len=:), allocatable :: ysrc + character(len=:), dimension(:), allocatable :: ymsg integer :: idx integer :: igroup integer :: igroup_idx integer :: ipos + integer :: istart integer :: ji + istart = 1 + + ! Case 'LIST_AVAIL': list all the available source terms + if ( Size( hbulist ) > 0 ) then + if ( Trim( hbulist(1) ) == 'LIST_AVAIL' ) then + Allocate( character(len=65) :: ymsg(tpbudget%nsources + 1) ) + ymsg(1) = '---------------------------------------------------------------------' + ymsg(2) = 'Available source terms for budget ' // Trim( tpbudget%cname ) + Write( ymsg(3), '( A32, " ", A32 )' ) 'Name', 'Long name' + idx = 3 + do ji = 1, tpbudget%nsources + if ( All( tpbudget%tsources(ji)%cmnhname /= [ 'INIF' , 'ENDF', 'AVEF' ] ) ) then + idx = idx + 1 + Write( ymsg(idx), '( A32, " ", A32 )' ) tpbudget%tsources(ji)%cmnhname, tpbudget%tsources(ji)%clongname + end if + end do + ymsg(tpbudget%nsources + 1 ) = '---------------------------------------------------------------------' + call Print_msg_multi( NVERB_WARNING, 'BUD', 'Sourcelist_scan', ymsg ) + !To not read the 1st line again + istart = 2 + end if + end if + + ! Case 'LIST_ALL': list all the source terms + if ( Size( hbulist ) > 0 ) then + if ( Trim( hbulist(1) ) == 'LIST_ALL' ) then + Allocate( character(len=65) :: ymsg(tpbudget%nsourcesmax + 1) ) + ymsg(1) = '---------------------------------------------------------------------' + ymsg(2) = 'Source terms for budget ' // Trim( tpbudget%cname ) + Write( ymsg(3), '( A32, " ", A32 )' ) 'Name', 'Long name' + idx = 3 + do ji = 1, tpbudget%nsourcesmax + if ( All( tpbudget%tsources(ji)%cmnhname /= [ 'INIF' , 'ENDF', 'AVEF' ] ) ) then + idx = idx + 1 + Write( ymsg(idx), '( A32, " ", A32 )' ) tpbudget%tsources(ji)%cmnhname, tpbudget%tsources(ji)%clongname + end if + end do + ymsg(tpbudget%nsourcesmax + 1 ) = '---------------------------------------------------------------------' + call Print_msg_multi( NVERB_WARNING, 'BUD', 'Sourcelist_scan', ymsg ) + !To not read the 1st line again + istart = 2 + end if + end if + + ! Case 'ALL': enable all available source terms + if ( Size( hbulist ) > 0 ) then + if ( Trim( hbulist(1) ) == 'ALL' ) then + do ji = 1, tpbudget%nsources + tpbudget%tsources(ji)%ngroup = 1 + end do + return + end if + end if + !Always enable INIF, ENDF and AVEF terms ipos = Source_find( tpbudget, 'INIF' ) if ( ipos < 1 ) call Print_msg( NVERB_FATAL, 'BUD', 'Sourcelist_scan', 'source term ' // Trim( tpbudget%cname ) & @@ -4431,7 +4513,7 @@ subroutine Sourcelist_scan( tpbudget, hbulist ) !igroup_idx start at 2 because 1 is reserved for individually stored source terms igroup_idx = 2 - do ji = 1, Size( hbulist ) + do ji = istart, Size( hbulist ) if ( Len_trim( hbulist(ji) ) > 0 ) then ! Scan the line and separate the different sources (separated by + signs) yline = Trim(hbulist(ji)) @@ -4481,6 +4563,87 @@ subroutine Sourcelist_scan( tpbudget, hbulist ) end subroutine Sourcelist_scan +subroutine Sourcelist_nml_compact( tpbudget, hbulist ) + !This subroutine reduce the size of the hbulist to the minimum + !The list is generated from the group list + use modd_budget, only: NBULISTMAXLEN, tbudgetdata + + type(tbudgetdata), intent(in) :: tpbudget + character(len=*), dimension(:), allocatable, intent(inout) :: hbulist + + integer :: idx + integer :: isource + integer :: jg + integer :: js + + if ( Allocated( hbulist ) ) Deallocate( hbulist ) + + if ( tpbudget%ngroups < 3 ) then + call Print_msg( NVERB_ERROR, 'BUD', 'Sourcelist_nml_compact', 'ngroups is too small' ) + return + end if + + Allocate( character(len=NBULISTMAXLEN) :: hbulist(tpbudget%ngroups - 3) ) + hbulist(:) = '' + + idx = 0 + do jg = 1, tpbudget%ngroups + if ( tpbudget%tgroups(jg)%nsources < 1 ) then + call Print_msg( NVERB_ERROR, 'BUD', 'Sourcelist_nml_compact', 'no source for group' ) + cycle + end if + + !Do not put 'INIF', 'ENDF', 'AVEF' in hbulist because their presence is automatic if the corresponding budget is enabled + isource = tpbudget%tgroups(jg)%nsourcelist(1) + if ( Any( tpbudget%tsources(isource)%cmnhname == [ 'INIF', 'ENDF', 'AVEF' ] ) ) cycle + + idx = idx + 1 +#if 0 + !Do not do this way because the group cmnhname may be truncated (NMNHNAMELGTMAX is smaller than NBULISTMAXLEN) + !and the name separator is different ('_') + hbulist(idx) = Trim( tpbudget%tgroups(jg)%cmnhname ) +#else + do js = 1, tpbudget%tgroups(jg)%nsources + isource = tpbudget%tgroups(jg)%nsourcelist(js) + hbulist(idx) = Trim( hbulist(idx) ) // Trim( tpbudget%tsources(isource)%cmnhname ) + if ( js < tpbudget%tgroups(jg)%nsources ) hbulist(idx) = Trim( hbulist(idx) ) // '+' + end do +#endif + end do +end subroutine Sourcelist_nml_compact + + +subroutine Sourcelist_sv_nml_compact( hbulist ) + !This subroutine reduce the size of the hbulist + !For SV variables the reduction is simpler than for other variables + !because it is too complex to do this cleanly (the enabled source terms are different for each scalar variable) + use modd_budget, only: NBULISTMAXLEN, tbudgetdata + + character(len=*), dimension(:), allocatable, intent(inout) :: hbulist + + character(len=NBULISTMAXLEN), dimension(:), allocatable :: ybulist_new + integer :: ilines + integer :: ji + + ilines = 0 + do ji = 1, Size( hbulist ) + if ( Len_trim(hbulist(ji)) > 0 ) ilines = ilines + 1 + end do + + Allocate( ybulist_new(ilines) ) + + ilines = 0 + do ji = 1, Size( hbulist ) + if ( Len_trim(hbulist(ji)) > 0 ) then + ilines = ilines + 1 + ybulist_new(ilines) = Trim( hbulist(ji) ) + end if + end do + + call Move_alloc( from = ybulist_new, to = hbulist ) +end subroutine Sourcelist_sv_nml_compact + + pure function Source_find( tpbudget, hsource ) result( ipos ) use modd_budget, only: tbudgetdata diff --git a/src/MNH/ini_les_cart_maskn.f90 b/src/MNH/ini_les_cart_maskn.f90 index b162a3af54d3fca4d012e8a149ce176b40fb9d5d..a3e9c7840171d597857e56403768981a86b0ff4a 100644 --- a/src/MNH/ini_les_cart_maskn.f90 +++ b/src/MNH/ini_les_cart_maskn.f90 @@ -1,6 +1,6 @@ -!MNH_LIC Copyright 1994-2017 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 version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. !----------------------------------------------------------------- !############################# @@ -20,7 +20,7 @@ REAL, DIMENSION(:), INTENT(IN) :: PXHAT_ll ! son model X coordinate REAL, DIMENSION(:), INTENT(IN) :: PYHAT_ll ! son model X coordinate INTEGER, INTENT(OUT) :: KLES_IINF ! limits of the cartesian INTEGER, INTENT(OUT) :: KLES_JINF ! mask in son model -INTEGER, INTENT(OUT) :: KLES_ISUP ! domain +INTEGER, INTENT(OUT) :: KLES_ISUP ! physical domain INTEGER, INTENT(OUT) :: KLES_JSUP ! ! END SUBROUTINE INI_LES_CART_MASK_n @@ -58,9 +58,9 @@ END MODULE MODI_INI_LES_CART_MASKn !! Original 07/02/00 !! Modification 01/02/01 (D.Gazen) add module MODD_NSV for NSV variable !! J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 -!! P.Wautelet: 19/10/2017 : IO: removed extern_userio.f90 -!! -!! -------------------------------------------------------------------------- +! P. Wautelet 19/10/2017: IO: removed extern_userio.f90 +! P. Wautelet 30/03/2021: budgets: LES cartesian subdomain limits are defined in the physical domain +! -------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ @@ -86,7 +86,7 @@ REAL, DIMENSION(:), INTENT(IN) :: PXHAT_ll ! son model X coordinate REAL, DIMENSION(:), INTENT(IN) :: PYHAT_ll ! son model X coordinate INTEGER, INTENT(OUT) :: KLES_IINF ! limits of the cartesian INTEGER, INTENT(OUT) :: KLES_JINF ! mask in son model -INTEGER, INTENT(OUT) :: KLES_ISUP ! domain +INTEGER, INTENT(OUT) :: KLES_ISUP ! physical domain INTEGER, INTENT(OUT) :: KLES_JSUP ! ! ! @@ -140,32 +140,32 @@ IJE_ll=SIZE(PYHAT_ll)-JPHEXT ! !* left limit ! -ZX = ZXHAT_ll(NLESn_IINF(IMI)) +ZX = ZXHAT_ll(NLESn_IINF(IMI) + JPHEXT) IF (PXHAT_ll(IIB_ll)>ZX) THEN - KLES_IINF=IIB_ll ! father mask starts left of son domain + KLES_IINF=1 ! father mask starts left of son domain ELSE IF (PXHAT_ll(IIE_ll+1)<ZX) THEN CALL MASK_OVER_ALL_DOMAIN RETURN ELSE DO JI=IIB_ll,IIE_ll IF (ABS(PXHAT_ll(JI)-ZX) <= (PXHAT_ll(JI+1)-PXHAT_ll(JI))/2. ) THEN - KLES_IINF=JI + KLES_IINF=JI-JPHEXT END IF END DO END IF ! !* right limit ! -ZX = ZXHAT_ll(NLESn_ISUP(IMI)+1) +ZX = ZXHAT_ll(NLESn_ISUP(IMI) + JPHEXT + 1) IF (PXHAT_ll(IIB_ll)>ZX) THEN CALL MASK_OVER_ALL_DOMAIN RETURN ELSE IF (PXHAT_ll(IIE_ll+1)<ZX) THEN - KLES_ISUP=IIE_ll ! father mask ends right of son domain + KLES_ISUP=IIE_ll-JPHEXT ! father mask ends right of son domain ELSE DO JI=IIB_ll,IIE_ll IF (ABS(PXHAT_ll(JI+1)-ZX) <= (PXHAT_ll(JI+1)-PXHAT_ll(JI))/2. ) THEN - KLES_ISUP=JI + KLES_ISUP=JI-JPHEXT END IF END DO END IF @@ -177,32 +177,32 @@ END IF ! !* bottom limit ! -ZY = ZYHAT_ll(NLESn_JINF(IMI)) +ZY = ZYHAT_ll(NLESn_JINF(IMI) + JPHEXT) IF (PYHAT_ll(IJB_ll)>ZY) THEN - KLES_JINF=IJB_ll ! father mask starts under the son domain + KLES_JINF=1 ! father mask starts under the son domain ELSE IF (PYHAT_ll(IJE_ll+1)<ZY) THEN CALL MASK_OVER_ALL_DOMAIN RETURN ELSE DO JJ=IJB_ll,IJE_ll IF (ABS(PYHAT_ll(JJ)-ZY) <= (PYHAT_ll(JJ+1)-PYHAT_ll(JJ))/2. ) THEN - KLES_JINF=JJ + KLES_JINF=JJ-JPHEXT END IF END DO END IF ! !* top limit ! -ZY = ZYHAT_ll(NLESn_JSUP(IMI)+1) +ZY = ZYHAT_ll(NLESn_JSUP(IMI) + JPHEXT + 1) IF (PYHAT_ll(IJB_ll)>ZY) THEN CALL MASK_OVER_ALL_DOMAIN RETURN ELSE IF (PYHAT_ll(IJE_ll+1)<ZY) THEN - KLES_JSUP=IJE_ll ! father mask ends over the son domain + KLES_JSUP=IJE_ll-JPHEXT ! father mask ends over the son domain ELSE DO JJ=IJB_ll,IJE_ll IF (ABS(PYHAT_ll(JJ+1)-ZY) <= (PYHAT_ll(JJ+1)-PYHAT_ll(JJ))/2. ) THEN - KLES_JSUP=JJ + KLES_JSUP=JJ-JPHEXT END IF END DO END IF @@ -215,10 +215,10 @@ DEALLOCATE(ZYHAT_ll) CONTAINS ! SUBROUTINE MASK_OVER_ALL_DOMAIN - KLES_IINF=IIB_ll ! father mask not in son domain, so all domain is taken - KLES_ISUP=IIE_ll - KLES_JINF=IJB_ll - KLES_JSUP=IJE_ll + KLES_IINF=IIB_ll-JPHEXT ! father mask not in son domain, so all domain is taken + 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 diff --git a/src/MNH/ini_lesn.f90 b/src/MNH/ini_lesn.f90 index 63f05f89df388ec0d2cc72ae07d6bf4130ebda99..a0776d1feb3532f5b459764fa81ec0c13369bdd3 100644 --- a/src/MNH/ini_lesn.f90 +++ b/src/MNH/ini_lesn.f90 @@ -38,7 +38,8 @@ ! P. Wautelet 13/09/2019: budget: simplify and modernize date/time management ! P. Wautelet 12/08/2020: bugfix: use NUNDEF instead of XUNDEF for integer variables ! 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 +! -------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ @@ -160,28 +161,39 @@ NLES_MASKS = 1 ! ----------------------------------------------------------------------------- ! IF (IMI==1) THEN - NLESn_IINF(1)= NUNDEF - NLESn_ISUP(1)= NUNDEF - NLESn_JINF(1)= NUNDEF - NLESn_JSUP(1)= NUNDEF - ! - IF (LLES_CART_MASK) THEN - IF (NLES_IINF==NUNDEF) NLES_IINF=JPHEXT+1 - IF (NLES_JINF==NUNDEF) NLES_JINF=JPHEXT+1 - IF (NLES_ISUP==NUNDEF) NLES_ISUP=IIU_ll-JPHEXT - IF (NLES_JSUP==NUNDEF) NLES_JSUP=IJU_ll-JPHEXT - END IF - ! - IF ( NLES_IINF==JPHEXT+1 .AND. NLES_JINF==JPHEXT+1 & - .AND. NLES_ISUP==IIU_ll-JPHEXT .AND. NLES_ISUP==IJU_ll-JPHEXT ) THEN - LLES_CART_MASK=.FALSE. - END IF - ! - IF (.NOT. LLES_CART_MASK) THEN - NLES_IINF=JPHEXT+1 - NLES_JINF=JPHEXT+1 - NLES_ISUP=IIU_ll-JPHEXT - NLES_JSUP=IJU_ll-JPHEXT + IF ( LLES_CART_MASK ) THEN + !Compute LES diagnostics inside a cartesian mask + + !Set default values to physical domain boundaries + IF ( NLES_IINF == NUNDEF ) NLES_IINF = 1 + IF ( NLES_JINF == NUNDEF ) NLES_JINF = 1 + IF ( NLES_ISUP == NUNDEF ) NLES_ISUP = NIMAX_ll + IF ( NLES_JSUP == NUNDEF ) NLES_JSUP = NJMAX_ll + + !Check that selected indices are in physical domain + IF ( NLES_IINF < 1 ) CALL Print_msg( NVERB_ERROR, 'GEN', 'INI_LES_n', 'NLES_IINF too small (<1)' ) + IF ( NLES_IINF > NIMAX_ll ) CALL Print_msg( NVERB_ERROR, 'GEN', 'INI_LES_n', 'NLES_IINF too large (>NIMAX)' ) + IF ( NLES_ISUP < 1 ) CALL Print_msg( NVERB_ERROR, 'GEN', 'INI_LES_n', 'NLES_ISUP too small (<1)' ) + IF ( NLES_ISUP > NIMAX_ll ) CALL Print_msg( NVERB_ERROR, 'GEN', 'INI_LES_n', 'NLES_ISUP too large (>NIMAX)' ) + IF ( NLES_ISUP < NLES_IINF ) CALL Print_msg( NVERB_ERROR, 'BUD', 'INI_LES_n', 'NLES_ISUP < NLES_IINF' ) + + IF ( NLES_JINF < 1 ) CALL Print_msg( NVERB_ERROR, 'GEN', 'INI_LES_n', 'NLES_JINF too small (<1)' ) + IF ( NLES_JINF > NJMAX_ll ) CALL Print_msg( NVERB_ERROR, 'GEN', 'INI_LES_n', 'NLES_JINF too large (>NJMAX)' ) + IF ( NLES_JSUP < 1 ) CALL Print_msg( NVERB_ERROR, 'GEN', 'INI_LES_n', 'NLES_JSUP too small (<1)' ) + IF ( NLES_JSUP > NJMAX_ll ) CALL Print_msg( NVERB_ERROR, 'GEN', 'INI_LES_n', 'NLES_JSUP too large (>NJMAX)' ) + IF ( NLES_JSUP < NLES_JINF ) CALL Print_msg( NVERB_ERROR, 'BUD', 'INI_LES_n', 'NLES_JSUP < NLES_JINF' ) + + !Set LLES_CART_MASK to false if whole domain is selected + IF ( NLES_IINF == 1 .AND. NLES_JINF == 1 & + .AND. NLES_ISUP == NIMAX_ll .AND. NLES_ISUP == NJMAX_ll ) THEN + LLES_CART_MASK = .FALSE. + END IF + ELSE + !Compute LES diagnostics on whole physical domain + NLES_IINF = 1 + NLES_JINF = 1 + NLES_ISUP = NIMAX_ll + NLES_JSUP = NJMAX_ll END IF ! NLESn_IINF(1)= NLES_IINF @@ -212,17 +224,16 @@ END IF ! ---------------------------------------------------------------------------- ! IF ( (.NOT. L1D) .AND. CLBCX(1)/='CYCL') THEN - NLESn_IINF(IMI) = MAX(NLESn_IINF(IMI),JPHEXT+2) + NLESn_IINF(IMI) = MAX(NLESn_IINF(IMI),2) END IF IF ( (.NOT. L1D) .AND. (.NOT. L2D) .AND. CLBCY(1)/='CYCL') THEN - NLESn_JINF(IMI) = MAX(NLESn_JINF(IMI),JPHEXT+2) + NLESn_JINF(IMI) = MAX(NLESn_JINF(IMI),2) END IF ! !* X boundary conditions for 2points correlations computations ! ----------------------------------------------------------- ! -IF ( NLESn_IINF(IMI)==JPHEXT+1 .AND. NLESn_ISUP(IMI)==IIU_ll-JPHEXT & - .AND. CLBCX(1)=='CYCL' ) THEN +IF ( CLBCX(1) == 'CYCL' .AND. NLESn_IINF(IMI) == 1 .AND. NLESn_ISUP(IMI) == NIMAX_ll ) THEN CLES_LBCX(:,IMI) = 'CYCL' ELSE CLES_LBCX(:,IMI) = 'OPEN' @@ -231,8 +242,7 @@ END IF !* Y boundary conditions for 2points correlations computations ! ----------------------------------------------------------- ! -IF ( NLESn_JINF(IMI)==JPHEXT+1 .AND. NLESn_JSUP(IMI)==IJU_ll-JPHEXT & - .AND. CLBCY(1)=='CYCL' ) THEN +IF ( CLBCY(1) == 'CYCL' .AND. NLESn_JINF(IMI) == 1 .AND. NLESn_JSUP(IMI) == NJMAX_ll ) THEN CLES_LBCY(:,IMI) = 'CYCL' ELSE CLES_LBCY(:,IMI) = 'OPEN' @@ -365,6 +375,13 @@ END IF ! -------------------- ! IF (ANY(NLES_LEVELS(:)/=NUNDEF)) THEN + DO JK = 1, SIZE( NLES_LEVELS ) + IF ( NLES_LEVELS(JK) /= NUNDEF ) THEN + IF ( NLES_LEVELS(JK) < 1 ) CALL Print_msg( NVERB_ERROR, 'GEN', 'INI_LES_n', 'NLES_LEVELS too small (<1)' ) + IF ( NLES_LEVELS(JK) > NKMAX ) CALL Print_msg( NVERB_ERROR, 'GEN', 'INI_LES_n', 'NLES_LEVELS too large (>NKMAX)' ) + END IF + END DO + NLES_K = COUNT (NLES_LEVELS(:)/=NUNDEF) CLES_LEVEL_TYPE='K' ELSE @@ -372,7 +389,7 @@ ELSE NLES_K = MIN(SIZE(NLES_LEVELS),NKMAX) CLES_LEVEL_TYPE='K' DO JK=1,NLES_K - NLES_LEVELS(JK) = JK + JPVEXT + NLES_LEVELS(JK) = JK END DO END IF END IF @@ -414,6 +431,13 @@ END IF ! -------------------- ! IF (ANY(NSPECTRA_LEVELS(:)/=NUNDEF)) THEN + DO JK = 1, SIZE( NSPECTRA_LEVELS ) + IF ( NSPECTRA_LEVELS(JK) /= NUNDEF ) THEN + IF ( NSPECTRA_LEVELS(JK) < 1 ) CALL Print_msg( NVERB_ERROR, 'GEN', 'INI_LES_n', 'NSPECTRA_LEVELS too small (<1)' ) + IF ( NSPECTRA_LEVELS(JK) > NKMAX ) CALL Print_msg( NVERB_ERROR, 'GEN', 'INI_LES_n', 'NSPECTRA_LEVELS too large (>NKMAX)' ) + END IF + END DO + NSPECTRA_K = COUNT (NSPECTRA_LEVELS(:)/=NUNDEF) CSPECTRA_LEVEL_TYPE='K' END IF diff --git a/src/MNH/les_ini_timestepn.f90 b/src/MNH/les_ini_timestepn.f90 index 66a9748b82c53d51f1f1683ee8888afcdc203d33..c93c4c887d19394fa34a5e9ee91e760fddb04503 100644 --- a/src/MNH/les_ini_timestepn.f90 +++ b/src/MNH/les_ini_timestepn.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. @@ -49,8 +49,8 @@ END MODULE MODI_LES_INI_TIMESTEP_n !! ------------- !! Original 06/11/02 ! P. Wautelet 13/09/2019: budget: simplify and modernize date/time management -!! -!! -------------------------------------------------------------------------- +! P. Wautelet 30/03/2021: budgets: LES cartesian subdomain limits are defined in the physical domain +! -------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ @@ -177,10 +177,10 @@ IMI = GET_CURRENT_MODEL_INDEX() ! ALLOCATE(LLES_CURRENT_CART_MASK(IIU,IJU,NLES_K)) ! -IIINF_MASK = MAX(IIB, NLESn_IINF(IMI)-(IIB_ll-1-JPHEXT)) -IJINF_MASK = MAX(IJB, NLESn_JINF(IMI)-(IJB_ll-1-JPHEXT)) -IISUP_MASK = MIN(IIE, NLESn_ISUP(IMI)-(IIB_ll-1-JPHEXT)) -IJSUP_MASK = MIN(IJE, NLESn_JSUP(IMI)-(IJB_ll-1-JPHEXT)) +IIINF_MASK = MAX(IIB, NLESn_IINF(IMI)+JPHEXT-(IIB_ll-1-JPHEXT)) +IJINF_MASK = MAX(IJB, NLESn_JINF(IMI)+JPHEXT-(IJB_ll-1-JPHEXT)) +IISUP_MASK = MIN(IIE, NLESn_ISUP(IMI)+JPHEXT-(IIB_ll-1-JPHEXT)) +IJSUP_MASK = MIN(IJE, NLESn_JSUP(IMI)+JPHEXT-(IJB_ll-1-JPHEXT)) ! ! LLES_CURRENT_CART_MASK(:,:,:) = .FALSE. diff --git a/src/MNH/les_ver_int.f90 b/src/MNH/les_ver_int.f90 index b864e4747ef60897e6e1f2ceb48ee0fe32786bc6..4045cec781e8e2110b78fc27858d1e655d4eb4b0 100644 --- a/src/MNH/les_ver_int.f90 +++ b/src/MNH/les_ver_int.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2000-2019 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. @@ -49,8 +49,8 @@ END MODULE MODI_LES_VER_INT !! ------------- !! Original 07/02/00 ! P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg -!! -!! -------------------------------------------------------------------------- +! P. Wautelet 30/03/2021: budgets: LES cartesian subdomain limits are defined in the physical domain +! -------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ @@ -80,7 +80,7 @@ INTEGER :: JK ! vertical loop counter ! IF (CLES_LEVEL_TYPE=='K') THEN DO JK = 1, NLES_K - PA_LES(:,:,JK) = PA_MNH(:,:,NLES_LEVELS(JK)) + PA_LES(:,:,JK) = PA_MNH(:,:,NLES_LEVELS(JK) + JPVEXT ) END DO ELSE IF (CLES_LEVEL_TYPE=='Z') THEN PA_LES = VER_INTERP_LIN(PA_MNH,NKLIN_CURRENT_LES,XCOEFLIN_CURRENT_LES) diff --git a/src/MNH/modd_budget.f90 b/src/MNH/modd_budget.f90 index 4b0c256f0d10d2d6f2e415b95708faed7b3e00be..44a3cfff0e0cdd4c5a930be3631aadba593c9ef9 100644 --- a/src/MNH/modd_budget.f90 +++ b/src/MNH/modd_budget.f90 @@ -47,6 +47,7 @@ ! P. Wautelet 14/01/2021: change xbusurf type to integer (+ rename it to nbusurf) ! P. Wautelet 03/03/2021: add tbudiachrometadata type (useful to pass more information to Write_diachro) ! P. Wautelet 17/03/2021: choose source terms for budgets with character strings instead of multiple integer variables +! P. Wautelet 30/03/2021: budgets: cartesian subdomain limits are defined in the physical domain !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -59,8 +60,8 @@ implicit none public -integer, parameter :: NBULISTMAXLEN = 512 -integer, parameter :: NBULISTMAXLINES = 40 +integer, parameter :: NBULISTMAXLEN = 256 +integer, parameter :: NBULISTMAXLINES = 50 integer, parameter :: NBUDGET_RHO = 0 ! Reference number for budget of RhoJ integer, parameter :: NBUDGET_U = 1 ! Reference number for budget of RhoJu and/or LES budgets with u @@ -107,10 +108,13 @@ type :: tbudiachrometadata character(len=NBUNAMELGTMAX) :: cname = 'not set' character(len=NCOMMENTLGTMAX) :: ccomment = 'not set' character(len=NBUNAMELGTMAX) :: ctype = 'not set' + character(len=NBUNAMELGTMAX) :: ccategory = 'not set' !budget, LES, aircraft, balloon, series, station, profiler + character(len=NBUNAMELGTMAX) :: cshape = 'not set' !Shape of the domain (mask, cartesian, vertical profile, point) + logical :: lmobile = .false. !Is the domain moving? (ie for aircrafts and balloons) logical :: licompress = .false. logical :: ljcompress = .false. logical :: lkcompress = .false. - integer :: nil = -1 + integer :: nil = -1 !Cartesian box boundaries in physical domain coordinates integer :: nih = -1 integer :: njl = -1 integer :: njh = -1 @@ -167,16 +171,16 @@ integer, save :: nbusubwrite = 0 ! Number of budget time average perio integer, save :: nbutotwrite = 0 ! Total number of budget time average periods ! INTEGER, SAVE :: NBUKL, NBUKH ! lowest and highest K indice values - ! of the budget box + ! of the budget box in the physical domain LOGICAL, SAVE :: LBU_KCP ! switch for compression in K ! direction ! ! Variables used by the cartesian box case ('CART') only ! INTEGER, SAVE :: NBUIL, NBUIH ! lowest and highest I indice values - ! of the cartesian box + ! of the cartesian box in the physical domain INTEGER, SAVE :: NBUJL, NBUJH ! lowest and highest J indice values - ! of the cartesian box + ! of the cartesian box in the physical domain LOGICAL, SAVE :: LBU_ICP ! switch for compression in I ! direction LOGICAL, SAVE :: LBU_JCP ! switch for comppression in J @@ -222,105 +226,105 @@ INTEGER, SAVE :: NBUKMAX ! dimension along K of the budget ! ! Allowed processes for the budget of RU (wind component along x) ! -! Courant namelist: NAM_BURU +! Current namelist: NAM_BU_RU ! LOGICAL, SAVE :: LBU_RU = .FALSE. ! True when the budget of RU is performed ! -CHARACTER(LEN=NBULISTMAXLEN), DIMENSION(NBULISTMAXLINES), SAVE :: CBULIST_RU = '' +CHARACTER(LEN=NBULISTMAXLEN), DIMENSION(:), ALLOCATABLE :: CBULIST_RU ! ! Allowed processes for the budget of RV (wind component along y) ! -! Courant namelist: NAM_BURV +! Current namelist: NAM_BU_RV ! LOGICAL, SAVE :: LBU_RV = .FALSE. ! True when the budget of RV is performed ! -CHARACTER(LEN=NBULISTMAXLEN), DIMENSION(NBULISTMAXLINES), SAVE :: CBULIST_RV = '' +CHARACTER(LEN=NBULISTMAXLEN), DIMENSION(:), ALLOCATABLE :: CBULIST_RV ! ! Allowed processes for the budget of RW (wind vertical component) ! -! Courant namelist: NAM_BURW +! Current namelist: NAM_BU_RW ! LOGICAL, SAVE :: LBU_RW = .FALSE. ! True when the budget of RW is performed ! -CHARACTER(LEN=NBULISTMAXLEN), DIMENSION(NBULISTMAXLINES), SAVE :: CBULIST_RW = '' +CHARACTER(LEN=NBULISTMAXLEN), DIMENSION(:), ALLOCATABLE :: CBULIST_RW ! ! Allowed processes for the budget of RTH (potential temperature) ! -! Courant namelist: NAM_BURTH +! Current namelist: NAM_BU_RTH ! LOGICAL, SAVE :: LBU_RTH = .FALSE. ! True when the budget of RTH is performed ! -CHARACTER(LEN=NBULISTMAXLEN), DIMENSION(NBULISTMAXLINES), SAVE :: CBULIST_RTH = '' +CHARACTER(LEN=NBULISTMAXLEN), DIMENSION(:), ALLOCATABLE :: CBULIST_RTH ! ! Allowed processes for the budget of RTKE (kinetic energy) ! -! Courant namelist: NAM_BURTKE +! Current namelist: NAM_BU_RTKE ! LOGICAL, SAVE :: LBU_RTKE = .FALSE. ! True when the budget of RTKE is performed ! -CHARACTER(LEN=NBULISTMAXLEN), DIMENSION(NBULISTMAXLINES), SAVE :: CBULIST_RTKE = '' +CHARACTER(LEN=NBULISTMAXLEN), DIMENSION(:), ALLOCATABLE :: CBULIST_RTKE ! ! Allowed processes for the budget of moist variable RRV (water vapor) ! -! Courant namelist: NAM_BURRV +! Current namelist: NAM_BU_RRV ! LOGICAL, SAVE :: LBU_RRV = .FALSE. ! true when the budget of RRV is performed ! -CHARACTER(LEN=NBULISTMAXLEN), DIMENSION(NBULISTMAXLINES), SAVE :: CBULIST_RRV = '' +CHARACTER(LEN=NBULISTMAXLEN), DIMENSION(:), ALLOCATABLE :: CBULIST_RRV ! ! Allowed processes for the budget of moist variable RRC (cloud water) ! -! Courant namelist: NAM_BURRC +! Current namelist: NAM_BU_RRC ! LOGICAL, SAVE :: LBU_RRC = .FALSE. ! True when the budget of RRC is performed ! -CHARACTER(LEN=NBULISTMAXLEN), DIMENSION(NBULISTMAXLINES), SAVE :: CBULIST_RRC = '' +CHARACTER(LEN=NBULISTMAXLEN), DIMENSION(:), ALLOCATABLE :: CBULIST_RRC ! ! Allowed processes for the budget of moist variable RRR (rain water) ! -! Courant namelist: NAM_BURRR +! Current namelist: NAM_BU_RRR ! LOGICAL, SAVE :: LBU_RRR = .FALSE. ! True when the budget of RRR is performed ! -CHARACTER(LEN=NBULISTMAXLEN), DIMENSION(NBULISTMAXLINES), SAVE :: CBULIST_RRR = '' +CHARACTER(LEN=NBULISTMAXLEN), DIMENSION(:), ALLOCATABLE :: CBULIST_RRR ! ! Allowed processes for the budget of moist variable RRI (ice) ! -! Courant namelist: NAM_BURRI +! Current namelist: NAM_BU_RRI ! LOGICAL, SAVE :: LBU_RRI = .FALSE. ! True when the budget of RRI is performed ! -CHARACTER(LEN=NBULISTMAXLEN), DIMENSION(NBULISTMAXLINES), SAVE :: CBULIST_RRI = '' +CHARACTER(LEN=NBULISTMAXLEN), DIMENSION(:), ALLOCATABLE :: CBULIST_RRI ! ! Allowed processes for the budget of moist variable RRS (snow) ! -! Courant namelist: NAM_BURRS +! Current namelist: NAM_BU_RRS ! LOGICAL, SAVE :: LBU_RRS = .FALSE. ! True when the budget of RRS is performed ! -CHARACTER(LEN=NBULISTMAXLEN), DIMENSION(NBULISTMAXLINES), SAVE :: CBULIST_RRS = '' +CHARACTER(LEN=NBULISTMAXLEN), DIMENSION(:), ALLOCATABLE :: CBULIST_RRS ! ! Allowed processes for the budget of moist variable RRG (graupel) ! -! Courant namelist: NAM_BURRG +! Current namelist: NAM_BU_RRG ! LOGICAL, SAVE :: LBU_RRG = .FALSE. ! True when the budget of RRG is performed ! -CHARACTER(LEN=NBULISTMAXLEN), DIMENSION(NBULISTMAXLINES), SAVE :: CBULIST_RRG = '' +CHARACTER(LEN=NBULISTMAXLEN), DIMENSION(:), ALLOCATABLE :: CBULIST_RRG ! ! Allowed processes for the budget of moist variable RRH (hail) ! -! Courant namelist: NAM_BURRH +! Current namelist: NAM_BU_RRH ! LOGICAL, SAVE :: LBU_RRH = .FALSE. ! True when the budget of RRH is performed ! -CHARACTER(LEN=NBULISTMAXLEN), DIMENSION(NBULISTMAXLINES), SAVE :: CBULIST_RRH = '' +CHARACTER(LEN=NBULISTMAXLEN), DIMENSION(:), ALLOCATABLE :: CBULIST_RRH ! -! Courant namelist: NAM_BURSV +! Current namelist: NAM_BU_RSV ! LOGICAL, SAVE :: LBU_RSV = .FALSE. ! True when the budget of RSVx is performed ! -CHARACTER(LEN=NBULISTMAXLEN), DIMENSION(NBULISTMAXLINES), SAVE :: CBULIST_RSV = '' +CHARACTER(LEN=NBULISTMAXLEN), DIMENSION(:), ALLOCATABLE :: CBULIST_RSV ! ! REAL :: XTIME_BU ! budget time in this time-step diff --git a/src/MNH/modd_les.f90 b/src/MNH/modd_les.f90 index e830ed1a4331fd3716cda326390bb7b22f0085bd..db71d6f33aa854d4fa66308dece4c9cc7ad7bbcd 100644 --- a/src/MNH/modd_les.f90 +++ b/src/MNH/modd_les.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1995-2019 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. @@ -41,8 +41,9 @@ !! J.Pergaud Oct , 2007 MF LES !! P. Aumond Oct ,2009 User multimaskS + 4th order !! C.Lac Oct ,2014 Correction on user masks -!! 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 30/03/2021: budgets: LES cartesian subdomain limits are defined in the physical domain !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -64,9 +65,9 @@ LOGICAL :: LLES_DOWNDRAFT ! flag to activate the computations in downdrafts LOGICAL :: LLES_SPECTRA ! flag to activate the spectra computations LOGICAL :: LLES_PDF ! flag to activate the pdf computations ! -INTEGER, DIMENSION(900) :: NLES_LEVELS ! model levels for LES comp. +INTEGER, DIMENSION(900) :: NLES_LEVELS ! physical model levels for LES comp. REAL, DIMENSION(900) :: XLES_ALTITUDES ! alt. levels for LES comp. -INTEGER, DIMENSION(900) :: NSPECTRA_LEVELS ! model levels for spectra comp. +INTEGER, DIMENSION(900) :: NSPECTRA_LEVELS ! physical model levels for spectra comp. REAL, DIMENSION(900) :: XSPECTRA_ALTITUDES ! alt. levels for spectra comp. ! INTEGER, DIMENSION( 10) :: NLES_TEMP_SERIE_I ! I, J and Z point @@ -82,7 +83,7 @@ REAL :: XLES_TEMP_MEAN_END ! for start and end of the temporal averaged comp. REAL :: XLES_TEMP_MEAN_STEP ! time step for each averaging LOGICAL :: LLES_CART_MASK ! flag to use a cartesian mask -INTEGER :: NLES_IINF ! definition of the cartesians mask +INTEGER :: NLES_IINF ! definition of the cartesians mask in physical domain INTEGER :: NLES_ISUP ! for NLES_CART_MODNBR model INTEGER :: NLES_JINF ! " INTEGER :: NLES_JSUP ! " @@ -95,7 +96,7 @@ INTEGER :: NPDF ! number of pdf intervals ! !------------------------------------------------------------------------------- ! -INTEGER, DIMENSION(JPMODELMAX) :: NLESn_IINF ! definition of the cartesians mask +INTEGER, DIMENSION(JPMODELMAX) :: NLESn_IINF ! definition of the cartesians mask in physical domain INTEGER, DIMENSION(JPMODELMAX) :: NLESn_ISUP ! for all models INTEGER, DIMENSION(JPMODELMAX) :: NLESn_JINF ! " INTEGER, DIMENSION(JPMODELMAX) :: NLESn_JSUP ! " @@ -138,7 +139,7 @@ INTEGER :: NLES_CURRENT_TIMES ! current model NLES_TIMES (number of LES samplings) ! INTEGER :: NLES_CURRENT_IINF, NLES_CURRENT_ISUP, NLES_CURRENT_JINF, NLES_CURRENT_JSUP -! coordinates for write_diachro, set to NLESn_IINF(current model), etc... +! coordinates (in physical domain) for write_diachro, set to NLESn_IINF(current model), etc... ! REAL :: XLES_CURRENT_DOMEGAX, XLES_CURRENT_DOMEGAY ! minimum wavelength in spectra analysis diff --git a/src/MNH/mode_les_diachro.f90 b/src/MNH/mode_les_diachro.f90 index 6627a8eff08a032e77f4391ecf414a04e710e904..27764a382b7ad500d65dfde90516e50bcbb897df 100644 --- a/src/MNH/mode_les_diachro.f90 +++ b/src/MNH/mode_les_diachro.f90 @@ -1029,6 +1029,9 @@ if ( iresp == 0 .and. any( zfield /= XUNDEF ) ) then !tzbudiachro%ccomment = DONE BEFORE ! tzbudiachro%ctype = 'SSOL' tzbudiachro%ctype = 'TLES' !T for trajectory (used in Write_diachro_lfi to add trajectory terms) + tzbudiachro%ccategory = 'LES' + tzbudiachro%cshape = 'cartesian' + tzbudiachro%lmobile = .false. tzbudiachro%licompress = .false. tzbudiachro%ljcompress = .false. tzbudiachro%lkcompress = .false. @@ -1207,6 +1210,9 @@ else tzbudiachro%ccomment = Trim( tzfield%ccomment ) // ' (time averaged)' end if tzbudiachro%ctype = 'SPXY' +tzbudiachro%ccategory = 'LES' +tzbudiachro%cshape = 'spectrum' +tzbudiachro%lmobile = .false. tzbudiachro%licompress = .false. tzbudiachro%ljcompress = .false. tzbudiachro%lkcompress = .false. @@ -1360,6 +1366,9 @@ tzbudiachro%cgroupname = ygroup tzbudiachro%cname = ygroup tzbudiachro%ccomment = tzfield%ccomment tzbudiachro%ctype = 'SPXY' +tzbudiachro%ccategory = 'LES' +tzbudiachro%cshape = 'spectrum' +tzbudiachro%lmobile = .false. tzbudiachro%licompress = .false. tzbudiachro%ljcompress = .false. tzbudiachro%lkcompress = .false. @@ -1385,6 +1394,9 @@ tzbudiachro%cgroupname = ygroup tzbudiachro%cname = ygroup tzbudiachro%ccomment = Trim( tzfield%ccomment ) // ' (time averaged)' tzbudiachro%ctype = 'SPXY' +tzbudiachro%ccategory = 'LES' +tzbudiachro%cshape = 'spectrum' +tzbudiachro%lmobile = .false. tzbudiachro%licompress = .false. tzbudiachro%ljcompress = .false. tzbudiachro%lkcompress = .false. diff --git a/src/MNH/read_desfmn.f90 b/src/MNH/read_desfmn.f90 index 294bafd4550f4587cd8e8d6d913b82d3aee35b64..b32584f8eb7bfa280d4b4400076f5dcfc1c62149 100644 --- a/src/MNH/read_desfmn.f90 +++ b/src/MNH/read_desfmn.f90 @@ -508,34 +508,36 @@ IF (KMI == 1) THEN END IF READ(UNIT=ILUDES,NML=NAM_OUTPUT) END IF - CALL POSNAM(ILUDES,'NAM_BUDGET',GFOUND) - IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BUDGET) - CALL POSNAM(ILUDES,'NAM_BU_RU',GFOUND) - IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RU) - CALL POSNAM(ILUDES,'NAM_BU_RV',GFOUND) - IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RV) - CALL POSNAM(ILUDES,'NAM_BU_RW',GFOUND) - IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RW) - CALL POSNAM(ILUDES,'NAM_BU_RTH',GFOUND) - IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RTH) - CALL POSNAM(ILUDES,'NAM_BU_RTKE',GFOUND) - IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RTKE) - CALL POSNAM(ILUDES,'NAM_BU_RRV',GFOUND) - IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RRV) - CALL POSNAM(ILUDES,'NAM_BU_RRC',GFOUND) - IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RRC) - CALL POSNAM(ILUDES,'NAM_BU_RRR',GFOUND) - IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RRR) - CALL POSNAM(ILUDES,'NAM_BU_RRI',GFOUND) - IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RRI) - CALL POSNAM(ILUDES,'NAM_BU_RRS',GFOUND) - IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RRS) - CALL POSNAM(ILUDES,'NAM_BU_RRG',GFOUND) - IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RRG) - CALL POSNAM(ILUDES,'NAM_BU_RRH',GFOUND) - IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RRH) - CALL POSNAM(ILUDES,'NAM_BU_RSV',GFOUND) - IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RSV) +! Note: it is not useful to read the budget namelists in the .des files +! The value here (if present in file) don't need to be compared with the ones in the EXSEGn files +! CALL POSNAM(ILUDES,'NAM_BUDGET',GFOUND) +! IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BUDGET) +! CALL POSNAM(ILUDES,'NAM_BU_RU',GFOUND) +! IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RU) +! CALL POSNAM(ILUDES,'NAM_BU_RV',GFOUND) +! IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RV) +! CALL POSNAM(ILUDES,'NAM_BU_RW',GFOUND) +! IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RW) +! CALL POSNAM(ILUDES,'NAM_BU_RTH',GFOUND) +! IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RTH) +! CALL POSNAM(ILUDES,'NAM_BU_RTKE',GFOUND) +! IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RTKE) +! CALL POSNAM(ILUDES,'NAM_BU_RRV',GFOUND) +! IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RRV) +! CALL POSNAM(ILUDES,'NAM_BU_RRC',GFOUND) +! IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RRC) +! CALL POSNAM(ILUDES,'NAM_BU_RRR',GFOUND) +! IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RRR) +! CALL POSNAM(ILUDES,'NAM_BU_RRI',GFOUND) +! IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RRI) +! CALL POSNAM(ILUDES,'NAM_BU_RRS',GFOUND) +! IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RRS) +! CALL POSNAM(ILUDES,'NAM_BU_RRG',GFOUND) +! IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RRG) +! CALL POSNAM(ILUDES,'NAM_BU_RRH',GFOUND) +! IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RRH) +! CALL POSNAM(ILUDES,'NAM_BU_RSV',GFOUND) +! IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RSV) CALL POSNAM(ILUDES,'NAM_LES',GFOUND) IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_LES) CALL POSNAM(ILUDES,'NAM_PDF',GFOUND) @@ -705,47 +707,48 @@ IF (NVERB >= 10) THEN WRITE(UNIT=ILUOUT,FMT="('************ DYNAMIC **************************')") WRITE(UNIT=ILUOUT,NML=NAM_DYN) ! - WRITE(UNIT=ILUOUT,FMT="('************ BUDGET ***************************')") - WRITE(UNIT=ILUOUT,NML=NAM_BUDGET) -! - WRITE(UNIT=ILUOUT,FMT="('************ U BUDGET *************************')") - WRITE(UNIT=ILUOUT,NML=NAM_BU_RU) -! - WRITE(UNIT=ILUOUT,FMT="('************ V BUDGET *************************')") - WRITE(UNIT=ILUOUT,NML=NAM_BU_RV) -! - WRITE(UNIT=ILUOUT,FMT="('************ W BUDGET *************************')") - WRITE(UNIT=ILUOUT,NML=NAM_BU_RW) -! - WRITE(UNIT=ILUOUT,FMT="('************ TH BUDGET ************************')") - WRITE(UNIT=ILUOUT,NML=NAM_BU_RTH) -! - WRITE(UNIT=ILUOUT,FMT="('************ TKE BUDGET ***********************')") - WRITE(UNIT=ILUOUT,NML=NAM_BU_RTKE) -! - WRITE(UNIT=ILUOUT,FMT="('************ RV BUDGET ************************')") - WRITE(UNIT=ILUOUT,NML=NAM_BU_RRV) -! - WRITE(UNIT=ILUOUT,FMT="('************ RC BUDGET ************************')") - WRITE(UNIT=ILUOUT,NML=NAM_BU_RRC) -! - WRITE(UNIT=ILUOUT,FMT="('************ RR BUDGET ************************')") - WRITE(UNIT=ILUOUT,NML=NAM_BU_RRR) -! - WRITE(UNIT=ILUOUT,FMT="('************ RI BUDGET ************************')") - WRITE(UNIT=ILUOUT,NML=NAM_BU_RRI) -! - WRITE(UNIT=ILUOUT,FMT="('************ RS BUDGET ************************')") - WRITE(UNIT=ILUOUT,NML=NAM_BU_RRS) -! - WRITE(UNIT=ILUOUT,FMT="('************ RG BUDGET ************************')") - WRITE(UNIT=ILUOUT,NML=NAM_BU_RRG) -! - WRITE(UNIT=ILUOUT,FMT="('************ RH BUDGET ************************')") - WRITE(UNIT=ILUOUT,NML=NAM_BU_RRH) -! - WRITE(UNIT=ILUOUT,FMT="('************ SVx BUDGET ***********************')") - WRITE(UNIT=ILUOUT,NML=NAM_BU_RSV) +! Budget namelists not read anymore in READ_DESFM_n +! WRITE(UNIT=ILUOUT,FMT="('************ BUDGET ***************************')") +! WRITE(UNIT=ILUOUT,NML=NAM_BUDGET) +! ! +! WRITE(UNIT=ILUOUT,FMT="('************ U BUDGET *************************')") +! WRITE(UNIT=ILUOUT,NML=NAM_BU_RU) +! ! +! WRITE(UNIT=ILUOUT,FMT="('************ V BUDGET *************************')") +! WRITE(UNIT=ILUOUT,NML=NAM_BU_RV) +! ! +! WRITE(UNIT=ILUOUT,FMT="('************ W BUDGET *************************')") +! WRITE(UNIT=ILUOUT,NML=NAM_BU_RW) +! ! +! WRITE(UNIT=ILUOUT,FMT="('************ TH BUDGET ************************')") +! WRITE(UNIT=ILUOUT,NML=NAM_BU_RTH) +! ! +! WRITE(UNIT=ILUOUT,FMT="('************ TKE BUDGET ***********************')") +! WRITE(UNIT=ILUOUT,NML=NAM_BU_RTKE) +! ! +! WRITE(UNIT=ILUOUT,FMT="('************ RV BUDGET ************************')") +! WRITE(UNIT=ILUOUT,NML=NAM_BU_RRV) +! ! +! WRITE(UNIT=ILUOUT,FMT="('************ RC BUDGET ************************')") +! WRITE(UNIT=ILUOUT,NML=NAM_BU_RRC) +! ! +! WRITE(UNIT=ILUOUT,FMT="('************ RR BUDGET ************************')") +! WRITE(UNIT=ILUOUT,NML=NAM_BU_RRR) +! ! +! WRITE(UNIT=ILUOUT,FMT="('************ RI BUDGET ************************')") +! WRITE(UNIT=ILUOUT,NML=NAM_BU_RRI) +! ! +! WRITE(UNIT=ILUOUT,FMT="('************ RS BUDGET ************************')") +! WRITE(UNIT=ILUOUT,NML=NAM_BU_RRS) +! ! +! WRITE(UNIT=ILUOUT,FMT="('************ RG BUDGET ************************')") +! WRITE(UNIT=ILUOUT,NML=NAM_BU_RRG) +! ! +! WRITE(UNIT=ILUOUT,FMT="('************ RH BUDGET ************************')") +! WRITE(UNIT=ILUOUT,NML=NAM_BU_RRH) +! ! +! WRITE(UNIT=ILUOUT,FMT="('************ SVx BUDGET ***********************')") +! WRITE(UNIT=ILUOUT,NML=NAM_BU_RSV) ! WRITE(UNIT=ILUOUT,FMT="('************ LES ******************************')") WRITE(UNIT=ILUOUT,NML=NAM_LES) diff --git a/src/MNH/read_exsegn.f90 b/src/MNH/read_exsegn.f90 index 8ad06729886bb8500521c981941fe4ce30cbb64c..cd9d6ea125770025a819d9386f65d5fb2eba176b 100644 --- a/src/MNH/read_exsegn.f90 +++ b/src/MNH/read_exsegn.f90 @@ -302,91 +302,93 @@ END MODULE MODI_READ_EXSEG_n ! !* 0. DECLARATIONS ! ------------ -USE MODD_PARAMETERS +USE MODD_BLOWSNOW +USE MODD_BUDGET +USE MODD_CH_AEROSOL +USE MODD_CH_M9_n, ONLY : NEQ +USE MODD_CONDSAMP USE MODD_CONF -USE MODD_CONFZ USE MODD_CONF_n, ONLY: CSTORAGE_TYPE +USE MODD_CONFZ +! USE MODD_DRAG_n +USE MODD_DUST +USE MODD_DYN +USE MODD_DYN_n, ONLY : LHORELAX_SVLIMA +#ifdef MNH_FOREFIRE +USE MODD_FOREFIRE +#endif +USE MODD_GET_n +USE MODD_GR_FIELD_n USE MODD_IO, ONLY: TFILEDATA USE MODD_LUNIT_n, ONLY: TLUOUT +USE MODD_NSV,NSV_USER_n=>NSV_USER +USE MODD_PARAMETERS +USE MODD_PASPOL +USE MODD_SALT USE MODD_VAR_ll, ONLY: NPROC -! +USE MODD_VISCOSITY + +USE MODE_MSG +USE MODE_POS + +USE MODI_INI_NSV +USE MODI_TEST_NAM_VAR + +USE MODN_2D_FRC +USE MODN_ADV_n ! The final filling of these modules for the model n is USE MODN_BACKUP +USE MODN_BLANK +USE MODN_BLOWSNOW +USE MODN_BLOWSNOW_n USE MODN_BUDGET -USE MODN_LES +USE MODN_CH_MNHC_n +USE MODN_CH_ORILAM +USE MODN_CH_SOLVER_n +USE MODN_CONDSAMP USE MODN_CONF +USE MODN_CONF_n USE MODN_CONFZ -USE MODN_FRC +USE MODN_DRAGBLDG_n +USE MODN_DRAG_n +USE MODN_DRAGTREE_n +USE MODN_DUST USE MODN_DYN -USE MODN_NESTING -USE MODN_OUTPUT -USE MODN_CONF_n -USE MODN_LBC_n ! routine is used for each nested model. This has been done USE MODN_DYN_n ! to avoid the duplication of this routine for each model. -USE MODN_ADV_n ! The final filling of these modules for the model n is -USE MODN_PARAM_n ! realized in subroutine ini_model n -USE MODN_PARAM_RAD_n -USE MODN_PARAM_ECRAD_n -USE MODN_PARAM_KAFR_n -USE MODN_PARAM_MFSHALL_n -USE MODN_PARAM_ICE +USE MODN_ELEC +#ifdef MNH_FOREFIRE +USE MODN_FOREFIRE +#endif +USE MODN_FRC +USE MODN_LATZ_EDFLX +USE MODN_LBC_n ! routine is used for each nested model. This has been done +USE MODN_LES USE MODN_LUNIT_n +USE MODN_MEAN +USE MODN_NESTING USE MODN_NUDGING_n -USE MODN_TURB_n -USE MODN_DRAG_n -USE MODN_BLANK -USE MODN_CH_MNHC_n -USE MODN_CH_SOLVER_n -USE MODN_PARAM_C2R2, ONLY : EPARAM_CCN=>HPARAM_CCN, EINI_CCN=>HINI_CCN, & - WNUC=>XNUC, WALPHAC=>XALPHAC, NAM_PARAM_C2R2 +USE MODN_OUTPUT USE MODN_PARAM_C1R3, ONLY : NAM_PARAM_C1R3, CPRISTINE_ICE_C1R3, & CHEVRIMED_ICE_C1R3 +USE MODN_PARAM_C2R2, ONLY : EPARAM_CCN=>HPARAM_CCN, EINI_CCN=>HINI_CCN, & + WNUC=>XNUC, WALPHAC=>XALPHAC, NAM_PARAM_C2R2 +USE MODN_PARAM_ECRAD_n +USE MODN_PARAM_ICE +USE MODN_PARAM_KAFR_n USE MODN_PARAM_LIMA, ONLY : FINI_CCN=>HINI_CCN,NAM_PARAM_LIMA,NMOD_CCN,LSCAV, & CPRISTINE_ICE_LIMA, CHEVRIMED_ICE_LIMA, NMOD_IFN, & LCOLD, LACTI, LNUCL, XALPHAC, XNUC, LMEYERS, LHAIL -USE MODN_ELEC +USE MODN_PARAM_MFSHALL_n +USE MODN_PARAM_n ! realized in subroutine ini_model n +USE MODN_PARAM_RAD_n +USE MODN_PASPOL +USE MODN_SALT USE MODN_SERIES -USE MODN_SERIES_n -USE MODN_TURB_CLOUD +USE MODN_SERIES_n USE MODN_TURB -USE MODN_MEAN -USE MODN_DRAGTREE_n -USE MODN_DRAGBLDG_n -USE MODN_LATZ_EDFLX -! -USE MODD_NSV,NSV_USER_n=>NSV_USER -USE MODD_DYN -USE MODD_DYN_n, ONLY : LHORELAX_SVLIMA -USE MODD_GET_n -USE MODD_GR_FIELD_n -! -USE MODE_POS -USE MODE_MSG -! -USE MODI_TEST_NAM_VAR -USE MODI_INI_NSV -USE MODN_CH_ORILAM -USE MODD_CH_AEROSOL -USE MODD_DUST -USE MODD_SALT -USE MODD_PASPOL -#ifdef MNH_FOREFIRE -USE MODD_FOREFIRE -USE MODN_FOREFIRE -#endif -USE MODD_CONDSAMP -USE MODD_BLOWSNOW -USE MODN_DUST -USE MODN_SALT -USE MODD_CH_M9_n, ONLY : NEQ -USE MODN_PASPOL -USE MODN_CONDSAMP -USE MODN_BLOWSNOW -USE MODN_BLOWSNOW_n -USE MODN_2D_FRC +USE MODN_TURB_CLOUD +USE MODN_TURB_n USE MODN_VISCOSITY -USE MODD_VISCOSITY -USE MODD_DRAG_n -! + IMPLICIT NONE ! !* 0.1 declarations of arguments @@ -593,32 +595,176 @@ IF (KMI == 1) THEN END IF CALL POSNAM(ILUSEG,'NAM_BUDGET',GFOUND,ILUOUT) IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_BUDGET) + CALL POSNAM(ILUSEG,'NAM_BU_RU',GFOUND,ILUOUT) - IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_BU_RU) + IF (GFOUND) THEN + IF ( ALLOCATED( CBULIST_RU ) ) THEN + CALL Print_msg( NVERB_WARNING, 'IO', 'READ_EXSEG_n', 'unexpected: CBULIST_RU was already allocated' ) + DEALLOCATE( CBULIST_RU ) + END IF + ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RU(NBULISTMAXLINES) ) + CBULIST_RU(:) = '' + READ(UNIT=ILUSEG,NML=NAM_BU_RU) + ELSE + ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RU(0) ) + END IF + CALL POSNAM(ILUSEG,'NAM_BU_RV',GFOUND,ILUOUT) - IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_BU_RV) + IF (GFOUND) THEN + IF ( ALLOCATED( CBULIST_RV ) ) THEN + CALL Print_msg( NVERB_WARNING, 'IO', 'READ_EXSEG_n', 'unexpected: CBULIST_RV was already allocated' ) + DEALLOCATE( CBULIST_RV ) + END IF + ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RV(NBULISTMAXLINES) ) + CBULIST_RV(:) = '' + READ(UNIT=ILUSEG,NML=NAM_BU_RV) + ELSE + ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RV(0) ) + END IF + CALL POSNAM(ILUSEG,'NAM_BU_RW',GFOUND,ILUOUT) - IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_BU_RW) + IF (GFOUND) THEN + IF ( ALLOCATED( CBULIST_RW ) ) THEN + CALL Print_msg( NVERB_WARNING, 'IO', 'READ_EXSEG_n', 'unexpected: CBULIST_RW was already allocated' ) + DEALLOCATE( CBULIST_RW ) + END IF + ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RW(NBULISTMAXLINES) ) + CBULIST_RW(:) = '' + READ(UNIT=ILUSEG,NML=NAM_BU_RW) + ELSE + ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RW(0) ) + END IF + CALL POSNAM(ILUSEG,'NAM_BU_RTH',GFOUND,ILUOUT) - IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_BU_RTH) + IF (GFOUND) THEN + IF ( ALLOCATED( CBULIST_RTH ) ) THEN + CALL Print_msg( NVERB_WARNING, 'IO', 'READ_EXSEG_n', 'unexpected: CBULIST_RTH was already allocated' ) + DEALLOCATE( CBULIST_RTH ) + END IF + ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RTH(NBULISTMAXLINES) ) + CBULIST_RTH(:) = '' + READ(UNIT=ILUSEG,NML=NAM_BU_RTH) + ELSE + ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RTH(0) ) + END IF + CALL POSNAM(ILUSEG,'NAM_BU_RTKE',GFOUND,ILUOUT) - IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_BU_RTKE) + IF (GFOUND) THEN + IF ( ALLOCATED( CBULIST_RTKE ) ) THEN + CALL Print_msg( NVERB_WARNING, 'IO', 'READ_EXSEG_n', 'unexpected: CBULIST_RTKE was already allocated' ) + DEALLOCATE( CBULIST_RTKE ) + END IF + ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RTKE(NBULISTMAXLINES) ) + CBULIST_RTKE(:) = '' + READ(UNIT=ILUSEG,NML=NAM_BU_RTKE) + ELSE + ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RTKE(0) ) + END IF + CALL POSNAM(ILUSEG,'NAM_BU_RRV',GFOUND,ILUOUT) - IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_BU_RRV) + IF (GFOUND) THEN + IF ( ALLOCATED( CBULIST_RRV ) ) THEN + CALL Print_msg( NVERB_WARNING, 'IO', 'READ_EXSEG_n', 'unexpected: CBULIST_RRV was already allocated' ) + DEALLOCATE( CBULIST_RRV ) + END IF + ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RRV(NBULISTMAXLINES) ) + CBULIST_RRV(:) = '' + READ(UNIT=ILUSEG,NML=NAM_BU_RRV) + ELSE + ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RRV(0) ) + END IF + CALL POSNAM(ILUSEG,'NAM_BU_RRC',GFOUND,ILUOUT) - IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_BU_RRC) + IF (GFOUND) THEN + IF ( ALLOCATED( CBULIST_RRC ) ) THEN + CALL Print_msg( NVERB_WARNING, 'IO', 'READ_EXSEG_n', 'unexpected: CBULIST_RRC was already allocated' ) + DEALLOCATE( CBULIST_RRC ) + END IF + ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RRC(NBULISTMAXLINES) ) + CBULIST_RRC(:) = '' + READ(UNIT=ILUSEG,NML=NAM_BU_RRC) + ELSE + ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RRC(0) ) + END IF + CALL POSNAM(ILUSEG,'NAM_BU_RRR',GFOUND,ILUOUT) - IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_BU_RRR) + IF (GFOUND) THEN + IF ( ALLOCATED( CBULIST_RRR ) ) THEN + CALL Print_msg( NVERB_WARNING, 'IO', 'READ_EXSEG_n', 'unexpected: CBULIST_RRR was already allocated' ) + DEALLOCATE( CBULIST_RRR ) + END IF + ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RRR(NBULISTMAXLINES) ) + CBULIST_RRR(:) = '' + READ(UNIT=ILUSEG,NML=NAM_BU_RRR) + ELSE + ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RRR(0) ) + END IF + CALL POSNAM(ILUSEG,'NAM_BU_RRI',GFOUND,ILUOUT) - IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_BU_RRI) + IF (GFOUND) THEN + IF ( ALLOCATED( CBULIST_RRI ) ) THEN + CALL Print_msg( NVERB_WARNING, 'IO', 'READ_EXSEG_n', 'unexpected: CBULIST_RRI was already allocated' ) + DEALLOCATE( CBULIST_RRI ) + END IF + ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RRI(NBULISTMAXLINES) ) + CBULIST_RRI(:) = '' + READ(UNIT=ILUSEG,NML=NAM_BU_RRI) + ELSE + ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RRI(0) ) + END IF + CALL POSNAM(ILUSEG,'NAM_BU_RRS',GFOUND,ILUOUT) - IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_BU_RRS) + IF (GFOUND) THEN + IF ( ALLOCATED( CBULIST_RRS ) ) THEN + CALL Print_msg( NVERB_WARNING, 'IO', 'READ_EXSEG_n', 'unexpected: CBULIST_RRS was already allocated' ) + DEALLOCATE( CBULIST_RRS ) + END IF + ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RRS(NBULISTMAXLINES) ) + CBULIST_RRS(:) = '' + READ(UNIT=ILUSEG,NML=NAM_BU_RRS) + ELSE + ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RRS(0) ) + END IF + CALL POSNAM(ILUSEG,'NAM_BU_RRG',GFOUND,ILUOUT) - IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_BU_RRG) + IF (GFOUND) THEN + IF ( ALLOCATED( CBULIST_RRG ) ) THEN + CALL Print_msg( NVERB_WARNING, 'IO', 'READ_EXSEG_n', 'unexpected: CBULIST_RRG was already allocated' ) + DEALLOCATE( CBULIST_RRG ) + END IF + ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RRG(NBULISTMAXLINES) ) + CBULIST_RRG(:) = '' + READ(UNIT=ILUSEG,NML=NAM_BU_RRG) + ELSE + ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RRG(0) ) + END IF + CALL POSNAM(ILUSEG,'NAM_BU_RRH',GFOUND,ILUOUT) - IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_BU_RRH) + IF (GFOUND) THEN + IF ( ALLOCATED( CBULIST_RRH ) ) THEN + CALL Print_msg( NVERB_WARNING, 'IO', 'READ_EXSEG_n', 'unexpected: CBULIST_RRH was already allocated' ) + DEALLOCATE( CBULIST_RRH ) + END IF + ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RRH(NBULISTMAXLINES) ) + CBULIST_RRH(:) = '' + READ(UNIT=ILUSEG,NML=NAM_BU_RRH) + ELSE + ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RRH(0) ) + END IF + CALL POSNAM(ILUSEG,'NAM_BU_RSV',GFOUND,ILUOUT) - IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_BU_RSV) + IF (GFOUND) THEN + IF ( ALLOCATED( CBULIST_RSV ) ) THEN + CALL Print_msg( NVERB_WARNING, 'IO', 'READ_EXSEG_n', 'unexpected: CBULIST_RSV was already allocated' ) + DEALLOCATE( CBULIST_RSV ) + END IF + ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RSV(NBULISTMAXLINES) ) + CBULIST_RSV(:) = '' + READ(UNIT=ILUSEG,NML=NAM_BU_RSV) + ELSE + ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RSV(0) ) + END IF + CALL POSNAM(ILUSEG,'NAM_LES',GFOUND,ILUOUT) IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_LES) CALL POSNAM(ILUSEG,'NAM_MEAN',GFOUND,ILUOUT) diff --git a/src/MNH/spawn_model2.f90 b/src/MNH/spawn_model2.f90 index 0f1a298d8116dd355397dc0e6270ad9b5b2e510d..82c8f1ecac1eb09d844ef9c48dd3e30a7b0e3d5e 100644 --- a/src/MNH/spawn_model2.f90 +++ b/src/MNH/spawn_model2.f90 @@ -199,6 +199,7 @@ END MODULE MODI_SPAWN_MODEL2 ! P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg ! P. Wautelet 20/05/2019: add name argument to ADDnFIELD_ll + new ADD4DFIELD_ll subroutine ! P. Wautelet 09/03/2021: move some chemistry initializations to ini_nsv +! P. Wautelet 24/03/2021: bugfix: allocate XLSRVM, XINPAP and XACPAP to zero size when not needed !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -766,6 +767,8 @@ ALLOCATE(XLSWM(IIU,IJU,IKU)) ALLOCATE(XLSTHM(IIU,IJU,IKU)) IF ( NRR >= 1) THEN ALLOCATE(XLSRVM(IIU,IJU,IKU)) +ELSE + ALLOCATE(XLSRVM(0,0,0)) ENDIF ! LB fields for lbc coupling ! @@ -931,6 +934,9 @@ IF ( CCLOUD=='LIMA' .AND. LSCAV ) THEN ALLOCATE(XACPAP(IIU,IJU)) XINPAP(:,:)=0.0 XACPAP(:,:)=0.0 +ELSE + ALLOCATE(XINPAP(0,0)) + ALLOCATE(XACPAP(0,0)) END IF ! ! 4.8bis electric variables diff --git a/src/MNH/spec_ver_int.f90 b/src/MNH/spec_ver_int.f90 index 5c7f1df0134ab9093a94c9ebb931e773bc1b6bdd..c09b57ffdfcc749dba786f4d11c2d47feb42ffe7 100644 --- a/src/MNH/spec_ver_int.f90 +++ b/src/MNH/spec_ver_int.f90 @@ -52,6 +52,7 @@ END MODULE MODI_SPEC_VER_INT !! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O ! P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg ! P. Wautelet 05/01/2021: bugfix: CSPECTRA_LEVEL_TYPE='Z' computation was wrong +! P. Wautelet 30/03/2021: budgets: LES cartesian subdomain limits are defined in the physical domain ! -------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -96,7 +97,7 @@ IF (CSPECTRA_LEVEL_TYPE=='N') THEN RETURN ELSE IF (CSPECTRA_LEVEL_TYPE=='K') THEN DO JK = 1, NSPECTRA_K - ZA(:,:,JK) = PA_MNH(:,:,NSPECTRA_LEVELS(JK)) + ZA(:,:,JK) = PA_MNH(:,:,NSPECTRA_LEVELS(JK) + JPVEXT) END DO ELSE IF (CSPECTRA_LEVEL_TYPE=='Z') THEN ZA(:,:,:) = VER_INTERP_LIN(PA_MNH,NKLIN_CURRENT_SPEC,XCOEFLIN_CURRENT_SPEC) @@ -121,7 +122,7 @@ CALL GATHERALL_FIELD_ll('XY',ZA,ZA_ll,IRESP) ! !------------------------------------------------------------------------------- ! -PA_SPEC(:,:,:) = ZA_ll(NLESn_IINF(KMI):NLESn_ISUP(KMI),NLESn_JINF(KMI):NLESn_JSUP(KMI),:) +PA_SPEC(:,:,:) = ZA_ll(NLESn_IINF(KMI)+JPHEXT:NLESn_ISUP(KMI)+JPHEXT,NLESn_JINF(KMI)+JPHEXT:NLESn_JSUP(KMI)+JPHEXT,:) ! DO JK=1,SIZE(PA_SPEC,3) ZA_MEAN(JK) = SUM(PA_SPEC(:,:,JK)) / SIZE(PA_SPEC(:,:,JK)) diff --git a/src/MNH/write_aircraft_balloon.f90 b/src/MNH/write_aircraft_balloon.f90 index 2ff4254e6919fef020bc6b40a468b17011e74538..993ce2f91077560b34f1509d56bbf6b637145d2b 100644 --- a/src/MNH/write_aircraft_balloon.f90 +++ b/src/MNH/write_aircraft_balloon.f90 @@ -105,6 +105,7 @@ USE MODD_PARAM_LIMA , ONLY: NINDICE_CCN_IMM,NMOD_CCN,NMOD_IFN,NMOD_IMM USE MODE_MODELN_HANDLER USE MODE_DUST_PSD USE MODE_AERO_PSD +use mode_msg use mode_write_diachro, only: Write_diachro ! IMPLICIT NONE @@ -855,6 +856,20 @@ tzbudiachro%cgroupname = ygroup tzbudiachro%cname = ygroup tzbudiachro%ccomment = 'Values at position of flyer ' // Trim( tpflyer%title ) tzbudiachro%ctype = 'RSPL' +if ( Trim( tpflyer%type ) == 'AIRCRA' ) then + tzbudiachro%ccategory = 'aircraft' +else if ( Trim( tpflyer%type ) == 'RADIOS' ) then + tzbudiachro%ccategory = 'radiosonde balloon' +else if ( Trim( tpflyer%type ) == 'ISODEN' ) then + tzbudiachro%ccategory = 'iso-density balloon' +else if ( Trim( tpflyer%type ) == 'CVBALL' ) then + tzbudiachro%ccategory = 'constant volume balloon' +else + call Print_msg( NVERB_ERROR, 'IO', 'WRITE_AIRCRAFT_BALLOON', 'unknown category for flyer ' // Trim( tpflyer%title ) ) + tzbudiachro%ccategory = 'unknown' +end if +tzbudiachro%cshape = 'point' +tzbudiachro%lmobile = .true. ! tzbudiachro%licompress = NOT SET (default values) ! tzbudiachro%ljcompress = NOT SET (default values) ! tzbudiachro%lkcompress = NOT SET (default values) @@ -891,6 +906,9 @@ tzbudiachro%cgroupname = ygroupz tzbudiachro%cname = ygroupz tzbudiachro%ccomment = 'Vertical profiles at position of flyer ' // Trim( tpflyer%title ) tzbudiachro%ctype = 'CART' +! tzbudiachro%ccategory = !unchanged +tzbudiachro%cshape = 'vertical profile' +tzbudiachro%lmobile = .true. tzbudiachro%licompress = .true. tzbudiachro%ljcompress = .true. tzbudiachro%lkcompress = .false. diff --git a/src/MNH/write_budget.f90 b/src/MNH/write_budget.f90 index 72a9ec46ffa25a9c5644d90e1cbf28f9d2d843db..be4f2d5a2d56ce97923cd3cf146b6b3a04ba3816 100644 --- a/src/MNH/write_budget.f90 +++ b/src/MNH/write_budget.f90 @@ -559,6 +559,13 @@ subroutine Store_one_budget_rho( tpdiafile, tpdates, tprhodj, kp, knocompress, p tzbudiachro%cname = tprhodj%cmnhname tzbudiachro%ccomment = tprhodj%ccomment tzbudiachro%ctype = ybutype + tzbudiachro%ccategory = 'budget' + if ( ybutype == 'CART' ) then + tzbudiachro%cshape = 'cartesian' + else + tzbudiachro%cshape = 'mask' + end if + tzbudiachro%lmobile = .false. tzbudiachro%licompress = lbu_icp tzbudiachro%ljcompress = lbu_jcp tzbudiachro%lkcompress = lbu_kcp @@ -805,6 +812,13 @@ subroutine Store_one_budget( tpdiafile, tpdates, tpbudget, prhodjn, knocompress, tzbudiachro%cname = tpbudget%cname tzbudiachro%ccomment = tpbudget%ccomment tzbudiachro%ctype = ybutype + tzbudiachro%ccategory = 'budget' + if ( ybutype == 'CART' ) then + tzbudiachro%cshape = 'cartesian' + else + tzbudiachro%cshape = 'mask' + end if + tzbudiachro%lmobile = .false. tzbudiachro%licompress = lbu_icp tzbudiachro%ljcompress = lbu_jcp tzbudiachro%lkcompress = lbu_kcp diff --git a/src/MNH/write_diachro.f90 b/src/MNH/write_diachro.f90 index 50d7f1e446ea3b83fcec0338853eae7e9281f966..77c2c8eb61d7c7fa4e4f7c24ed161c6582b756c1 100644 --- a/src/MNH/write_diachro.f90 +++ b/src/MNH/write_diachro.f90 @@ -539,8 +539,9 @@ ELSE IF ( tpbudiachro%ctype == 'TLES' ) THEN TZFIELD%NTYPE = TYPEREAL TZFIELD%NDIMS = 3 TZFIELD%LTIMEDEP = .FALSE. + !TRAJX is given in extended domain coordinates (=> +jphext) for backward compatibility CALL IO_Field_write(tzfile,TZFIELD, Reshape( & - Spread( source = ( nles_current_iinf + nles_current_isup) / 2, dim = 1, ncopies = IN ), & + Spread( source = ( nles_current_iinf + nles_current_isup) / 2 + jphext, dim = 1, ncopies = IN ), & [1, 1, IN] ) ) ENDIF ! @@ -569,8 +570,9 @@ ELSE IF ( tpbudiachro%ctype == 'TLES' ) THEN TZFIELD%NTYPE = TYPEREAL TZFIELD%NDIMS = 3 TZFIELD%LTIMEDEP = .FALSE. + !TRAJY is given in extended domain coordinates (=> +jphext) for backward compatibility CALL IO_Field_write(tzfile,TZFIELD, Reshape( & - Spread( source = ( nles_current_jinf + nles_current_jsup) / 2, dim = 1, ncopies = IN ), & + Spread( source = ( nles_current_jinf + nles_current_jsup) / 2 + jphext, dim = 1, ncopies = IN ), & [1, 1, IN] ) ) ENDIF ! @@ -765,27 +767,27 @@ MASTER: if ( isp == tzfile%nmaster_rank) then call IO_Err_handle_nc4( istatus, 'Write_diachro_nc4', 'NF90_PUT_ATT', 'type for '//trim(ygroup)//' group' ) if ( trim ( ytype ) == 'CART' .or. trim ( ytype ) == 'MASK' .or. trim ( ytype ) == 'SPXY') then - istatus = NF90_PUT_ATT( igrpid, NF90_GLOBAL, 'min x index', iil ) + istatus = NF90_PUT_ATT( igrpid, NF90_GLOBAL, 'min x index in physical domain', iil ) if (istatus /= NF90_NOERR ) & call IO_Err_handle_nc4( istatus, 'Write_diachro_nc4', 'NF90_PUT_ATT', 'min x index for '//trim(ygroup)//' group' ) - istatus = NF90_PUT_ATT( igrpid, NF90_GLOBAL, 'max x index', iih ) + istatus = NF90_PUT_ATT( igrpid, NF90_GLOBAL, 'max x index in physical domain', iih ) if (istatus /= NF90_NOERR ) & call IO_Err_handle_nc4( istatus, 'Write_diachro_nc4', 'NF90_PUT_ATT', 'max x index for '//trim(ygroup)//' group' ) - istatus = NF90_PUT_ATT( igrpid, NF90_GLOBAL, 'min y index', ijl ) + istatus = NF90_PUT_ATT( igrpid, NF90_GLOBAL, 'min y index in physical domain', ijl ) if (istatus /= NF90_NOERR ) & call IO_Err_handle_nc4( istatus, 'Write_diachro_nc4', 'NF90_PUT_ATT', 'min y index for '//trim(ygroup)//' group' ) - istatus = NF90_PUT_ATT( igrpid, NF90_GLOBAL, 'max y index', ijh ) + istatus = NF90_PUT_ATT( igrpid, NF90_GLOBAL, 'max y index in physical domain', ijh ) if (istatus /= NF90_NOERR ) & call IO_Err_handle_nc4( istatus, 'Write_diachro_nc4', 'NF90_PUT_ATT', 'max y index for '//trim(ygroup)//' group' ) - istatus = NF90_PUT_ATT( igrpid, NF90_GLOBAL, 'min z index', ikl ) + istatus = NF90_PUT_ATT( igrpid, NF90_GLOBAL, 'min z index in physical domain', ikl ) if (istatus /= NF90_NOERR ) & call IO_Err_handle_nc4( istatus, 'Write_diachro_nc4', 'NF90_PUT_ATT', 'min z index for '//trim(ygroup)//' group' ) - istatus = NF90_PUT_ATT( igrpid, NF90_GLOBAL, 'max z index', ikh ) + istatus = NF90_PUT_ATT( igrpid, NF90_GLOBAL, 'max z index in physical domain', ikh ) if (istatus /= NF90_NOERR ) & call IO_Err_handle_nc4( istatus, 'Write_diachro_nc4', 'NF90_PUT_ATT', 'max z index for '//trim(ygroup)//' group' ) end if diff --git a/src/MNH/write_profilern.f90 b/src/MNH/write_profilern.f90 index eba14d51eefe087361d40342f1074f1888ef3ff0..e0ed5fcfd6b4bb0d8e4117996d9d8a85f67da5e1 100644 --- a/src/MNH/write_profilern.f90 +++ b/src/MNH/write_profilern.f90 @@ -654,6 +654,9 @@ tzbudiachro%cgroupname = ygroup tzbudiachro%cname = ygroup tzbudiachro%ccomment = 'Vertical profiles at position of profiler ' // Trim( ygroup ) tzbudiachro%ctype = 'CART' +tzbudiachro%ccategory = 'profiler' +tzbudiachro%cshape = 'vertical profile' +tzbudiachro%lmobile = .false. tzbudiachro%licompress = .true. tzbudiachro%ljcompress = .true. tzbudiachro%lkcompress = .false. diff --git a/src/MNH/write_seriesn.f90 b/src/MNH/write_seriesn.f90 index 1729e726dc566c4a82eb7e346b6e1328f609de71..e0aa67be2a6e3884202bd00288f5cbff50d3594c 100644 --- a/src/MNH/write_seriesn.f90 +++ b/src/MNH/write_seriesn.f90 @@ -263,15 +263,18 @@ tzbudiachro%cgroupname = 'TSERIES' tzbudiachro%cname = 'TSERIES' tzbudiachro%ccomment = 'Time series of horizontally and vertically averaged fields' tzbudiachro%ctype = 'CART' +tzbudiachro%ccategory = 'time series' +tzbudiachro%cshape = 'cartesian' !It is based on a cartesian domain (with compression in all directions) +tzbudiachro%lmobile = .false. tzbudiachro%licompress = .true. tzbudiachro%ljcompress = .true. tzbudiachro%lkcompress = .true. -tzbudiachro%nil = 1 -tzbudiachro%nih = 1 -tzbudiachro%njl = 1 -tzbudiachro%njh = 1 +tzbudiachro%nil = niboxl +tzbudiachro%nih = niboxh +tzbudiachro%njl = njboxl +tzbudiachro%njh = njboxh tzbudiachro%nkl = 1 -tzbudiachro%nkh = 1 +tzbudiachro%nkh = ikmax call Write_diachro( tpdiafile, tzbudiachro, tzfields, tpsdates(1:nsnbstept), & xsseries1(1:1,1:1,1:1,1:nsnbstept,1:1,:) ) @@ -355,15 +358,18 @@ tzbudiachro%cgroupname = 'ZTSERIES' tzbudiachro%cname = 'ZTSERIES' tzbudiachro%ccomment = 'Time series of horizontally averaged vertical profile' tzbudiachro%ctype = 'CART' +tzbudiachro%ccategory = 'time series' +tzbudiachro%cshape = 'cartesian' !It is based on a cartesian domain (with horizontal compression) +tzbudiachro%lmobile = .false. tzbudiachro%licompress = .true. tzbudiachro%ljcompress = .true. tzbudiachro%lkcompress = .false. -tzbudiachro%nil = 1 -tzbudiachro%nih = 1 -tzbudiachro%njl = 1 -tzbudiachro%njh = 1 -tzbudiachro%nkl = ikb -tzbudiachro%nkh = ike +tzbudiachro%nil = niboxl +tzbudiachro%nih = niboxh +tzbudiachro%njl = njboxl +tzbudiachro%njh = njboxh +tzbudiachro%nkl = 1 +tzbudiachro%nkh = ikmax call Write_diachro( tpdiafile, tzbudiachro, tzfields, tpsdates(1:nsnbstept), & xsseries2(1:1,1:1,1:ikmax,1:nsnbstept,1:1,:) ) @@ -451,6 +457,9 @@ DO JS=1,NBJSLICE tzbudiachro%cname = ygroup tzbudiachro%ccomment = 'Time series of y-horizontally averaged fields at one level or vertically averaged between 2 levels' tzbudiachro%ctype = 'SSOL' + tzbudiachro%ccategory = 'time series' + tzbudiachro%cshape = 'cartesian' !It is based on a cartesian domain (with compression in 1 direction) + tzbudiachro%lmobile = .false. tzbudiachro%licompress = .false. tzbudiachro%ljcompress = .true. tzbudiachro%lkcompress = .true. diff --git a/src/MNH/write_stationn.f90 b/src/MNH/write_stationn.f90 index 2c6f6553ffdf971f184ffba397635e65cdff1032..ecacfb93518111d04e6787461c881bb4f14c4648 100644 --- a/src/MNH/write_stationn.f90 +++ b/src/MNH/write_stationn.f90 @@ -739,6 +739,9 @@ tzbudiachro%cgroupname = ygroup tzbudiachro%cname = ygroup tzbudiachro%ccomment = 'Values at position of station ' // Trim( ygroup ) tzbudiachro%ctype = 'CART' +tzbudiachro%ccategory = 'station' +tzbudiachro%cshape = 'point' +tzbudiachro%lmobile = .false. tzbudiachro%licompress = .true. tzbudiachro%ljcompress = .true. tzbudiachro%lkcompress = .false.