diff --git a/src/LIB/SURCOUCHE/src/modd_field.f90 b/src/LIB/SURCOUCHE/src/modd_field.f90 index bdb77e321979fd6bbb624310f97b52f28510c6ec..b81b59f1f0354c2041f9908b0d3c7fb7230e0f3d 100644 --- a/src/LIB/SURCOUCHE/src/modd_field.f90 +++ b/src/LIB/SURCOUCHE/src/modd_field.f90 @@ -65,25 +65,26 @@ 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_LES_MASK = 100 ! This is not a true dimension -integer, parameter :: NMNHDIM_SPECTRA_2PTS_NI = 28 -integer, parameter :: NMNHDIM_SPECTRA_2PTS_NJ = 29 -integer, parameter :: NMNHDIM_SPECTRA_SPEC_NI = 30 -integer, parameter :: NMNHDIM_SPECTRA_SPEC_NJ = 31 -integer, parameter :: NMNHDIM_SPECTRA_LEVEL = 32 +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_SERIES_LEVEL = 33 -integer, parameter :: NMNHDIM_SERIES_LEVEL_W = 34 -integer, parameter :: NMNHDIM_SERIES_TIME = 35 ! Time dimension for time series +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_FLYER_TIME = 36 ! Time dimension for aircraft/balloon (dimension local to each flyer) -integer, parameter :: NMNHDIM_PROFILER_TIME = 37 ! Time dimension for profilers -integer, parameter :: NMNHDIM_STATION_TIME = 38 ! Time dimension for stations +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_PAIR = 39 ! For values coming by pair (ie boundaries) +integer, parameter :: NMNHDIM_PAIR = 40 ! For values coming by pair (ie boundaries) -integer, parameter :: NMNHDIM_LASTDIM_DIACHRO = 39 ! Index of the last defined dimension for diachronic files +integer, parameter :: NMNHDIM_LASTDIM_DIACHRO = 40 ! 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/modd_io.f90 b/src/LIB/SURCOUCHE/src/modd_io.f90 index 6291995025891bf291c480212bb98f796415d845..c8457cc2d32624a020d122c41cb318faa86a1d4c 100644 --- a/src/LIB/SURCOUCHE/src/modd_io.f90 +++ b/src/LIB/SURCOUCHE/src/modd_io.f90 @@ -46,12 +46,12 @@ LOGICAL, SAVE :: LLFIREAD = .FALSE. ! TRUE will force LFI read (instead of Net LOGICAL, SAVE :: LVERB_OUTLST = .TRUE. ! TRUE will PRINT_MSG in OUTPUT_LISTINGn files LOGICAL, SAVE :: LVERB_STDOUT = .FALSE. ! TRUE will also PRINT_MSG on standard output LOGICAL, SAVE :: LVERB_ALLPRC = .FALSE. ! FALSE: only process 0 do PRINT_MSG, TRUE: all processes -INTEGER, SAVE :: NBUD_VERB = NVERB_WARNING ! Verbosity level for budgets +INTEGER, SAVE :: NBUD_VERB = NVERB_INFO ! Verbosity level for budgets INTEGER, SAVE :: NBUD_ABORT_LEVEL = NVERB_ERROR ! Level of budget error necessary to force stop of application -INTEGER, SAVE :: NIO_VERB = NVERB_WARNING ! Verbosity level for IO +INTEGER, SAVE :: NIO_VERB = NVERB_INFO ! Verbosity level for IO INTEGER, SAVE :: NIO_ABORT_LEVEL = NVERB_ERROR ! Level of IO error necessary to force stop of application -INTEGER, SAVE :: NGEN_VERB = NVERB_WARNING ! Verbosity level for 'GEN' (generic) messages +INTEGER, SAVE :: NGEN_VERB = NVERB_INFO ! Verbosity level for 'GEN' (generic) messages INTEGER, SAVE :: NGEN_ABORT_LEVEL = NVERB_ERROR ! Level of 'GEN' error necessary to force stop of application CHARACTER(LEN=NDIRNAMELGTMAX) :: CIO_DIR = '' ! Directory for IO diff --git a/src/LIB/SURCOUCHE/src/mode_field.f90 b/src/LIB/SURCOUCHE/src/mode_field.f90 index 363f282eb9f96565a7d59f6bfad5c0cb492cae2b..97466a414e1dbb88e5fb8746cb10d3e65706df1c 100644 --- a/src/LIB/SURCOUCHE/src/mode_field.f90 +++ b/src/LIB/SURCOUCHE/src/mode_field.f90 @@ -3046,9 +3046,8 @@ IDX = IDX+1 ! IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() TFIELDLIST(IDX)%CMNHNAME = 'ACPRR' -TFIELDLIST(IDX)%CSTDNAME = 'rainfall_amount' +TFIELDLIST(IDX)%CSTDNAME = 'thickness_of_rainfall_amount' TFIELDLIST(IDX)%CLONGNAME = 'ACPRR' -!PW: TODO: CF-convention prefers 'kg m-2' TFIELDLIST(IDX)%CUNITS = 'm' TFIELDLIST(IDX)%CDIR = 'XY' TFIELDLIST(IDX)%CCOMMENT = 'X_Y_ACcumulated Precipitation Rain Rate' diff --git a/src/LIB/SURCOUCHE/src/mode_io_file.f90 b/src/LIB/SURCOUCHE/src/mode_io_file.f90 index 49dc8ef63e391999e9e479d0ae4ec0f729a747e4..c78973780f94f376e49a7249cbf2d26425da2760 100644 --- a/src/LIB/SURCOUCHE/src/mode_io_file.f90 +++ b/src/LIB/SURCOUCHE/src/mode_io_file.f90 @@ -651,13 +651,13 @@ IF (TPFILE%LMASTER .AND. CPROGRAM/='LFICDF') THEN CASE(1) YCPIO='MESONH' CASE(2) - CALL PRINT_MSG(NVERB_INFO,'IO','IO_Transfer_list_addto','file '//TRIM(YFILEM)//' not transferred') + CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_Transfer_list_addto','file '//TRIM(YFILEM)//' not transferred') END SELECT if (TPFILE%NLFITYPE==0 .or. TPFILE%NLFITYPE==1) then ICPT=ICPT+1 WRITE (YCOMMAND,'(A," ",A," ",A," >> OUTPUT_TRANSFER",I3.3," 2>&1 &")') YTRANS,YCPIO,TRIM(YFILEM),ICPT - CALL PRINT_MSG(NVERB_INFO,'IO','IO_Transfer_list_addto','YCOMMAND='//TRIM(YCOMMAND)) + CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_Transfer_list_addto','YCOMMAND='//TRIM(YCOMMAND)) CALL SYSTEM_MNH(YCOMMAND) end if END IF diff --git a/src/LIB/SURCOUCHE/src/mode_io_tools_nc4.f90 b/src/LIB/SURCOUCHE/src/mode_io_tools_nc4.f90 index 9804348f8da7ba0f62912a75ce4861e77c93b6b6..477c389dbf6ffe6691029ff11a627e431b2e0a84 100644 --- a/src/LIB/SURCOUCHE/src/mode_io_tools_nc4.f90 +++ b/src/LIB/SURCOUCHE/src/mode_io_tools_nc4.f90 @@ -261,7 +261,7 @@ use modd_field, only: NMNHDIM_NI, NMNHDIM_NJ, NMNHDIM_NI_U, NMNHDIM_NJ_U NMNHDIM_BUDGET_MASK_LEVEL, NMNHDIM_BUDGET_MASK_LEVEL_W, & NMNHDIM_BUDGET_MASK_NBUMASK, NMNHDIM_BUDGET_TIME, & NMNHDIM_BUDGET_LES_TIME, NMNHDIM_BUDGET_LES_AVG_TIME, NMNHDIM_BUDGET_LES_LEVEL, & - NMNHDIM_BUDGET_LES_SV, & + NMNHDIM_BUDGET_LES_SV, NMNHDIM_BUDGET_LES_PDF, & NMNHDIM_SPECTRA_2PTS_NI, NMNHDIM_SPECTRA_2PTS_NJ, & NMNHDIM_SPECTRA_SPEC_NI, NMNHDIM_SPECTRA_SPEC_NJ, NMNHDIM_SPECTRA_LEVEL, & NMNHDIM_SERIES_LEVEL, NMNHDIM_SERIES_LEVEL_W, & @@ -270,7 +270,7 @@ use modd_field, only: NMNHDIM_NI, NMNHDIM_NJ, NMNHDIM_NI_U, NMNHDIM_NJ_U NMNHDIM_ARAKAWA, & NMNHDIM_LASTDIM_NODIACHRO, NMNHDIM_LASTDIM_DIACHRO -use modd_les, only: nles_k, nspectra_k, xles_temp_mean_start, xles_temp_mean_step, xles_temp_mean_end +use modd_les, only: lles_pdf, nles_k, npdf, nspectra_k, xles_temp_mean_start, xles_temp_mean_step, xles_temp_mean_end use modd_les_n, only: nles_times, nspectra_ni, nspectra_nj use modd_nsv, only: nsv USE MODD_PARAMETERS_ll, ONLY: JPHEXT, JPVEXT @@ -377,6 +377,9 @@ if ( tpfile%ctype == 'MNHDIACHRONIC' ) then !Dimension for the number of scalar variables if ( nsv > 0 ) call IO_Add_dim_nc4( tpfile, NMNHDIM_BUDGET_LES_SV, 'nsv', nsv ) + !Dimension for the number of PDF + if ( lles_pdf ) call IO_Add_dim_nc4( tpfile, NMNHDIM_BUDGET_LES_PDF, 'npdf', npdf ) + !Dimensions for the number of horizontal wavelengths for non-local LES budgets (2 points correlations) if ( nspectra_ni > 0 ) call IO_Add_dim_nc4( tpfile, NMNHDIM_SPECTRA_2PTS_NI, 'nspectra_2pts_ni', nspectra_ni ) if ( nspectra_nj > 0 .and. .not. l2d ) & diff --git a/src/LIB/SURCOUCHE/src/mode_msg.f90 b/src/LIB/SURCOUCHE/src/mode_msg.f90 index c7164cb52ac4dba69e59d58de7fb3b23feb3574b..80d2f6677cf7209871081707050fbf5b14de918a 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-2020 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2017-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,6 +11,7 @@ ! P. Wautelet 02/07/2019: flush messages also for files opened with newunit (logical unit can be negative) ! 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 !----------------------------------------------------------------- module mode_msg @@ -23,6 +24,12 @@ integer, parameter :: NMSGLLINEMAX = 10 ! Maximum number of lines for a message character(len=NMSGLGTMAX), dimension(NMSGLLINEMAX) :: cmnhmsg = '' +integer, save :: nfatal = 0 +integer, save :: nerror = 0 +integer, save :: nwarning = 0 +integer, save :: ninfo = 0 +integer, save :: ndebug = 0 + interface Print_msg module procedure Print_msg_1line, Print_msg_multi_cmnhmsg, Print_msg_multi end interface Print_msg @@ -141,14 +148,19 @@ ilines = size( hmsg ) SELECT CASE(KVERB) CASE(NVERB_FATAL) YPRE='FATAL: ' + nfatal = nfatal + 1 CASE(NVERB_ERROR) YPRE='ERROR: ' + nerror = nerror + 1 CASE(NVERB_WARNING) YPRE='WARNING: ' + nwarning = nwarning + 1 CASE(NVERB_INFO) YPRE='INFO: ' + ninfo = ninfo + 1 CASE(NVERB_DEBUG) YPRE='DEBUG: ' + ndebug = ndebug + 1 CASE DEFAULT IF (GWRITE_STDOUT) WRITE(UNIT=OUTPUT_UNIT,FMT=*) 'ERROR: PRINT_MSG: wrong verbosity level' IF (GWRITE_OUTLST) WRITE(UNIT=ILU, FMT=*) 'ERROR: PRINT_MSG: wrong verbosity level' @@ -256,4 +268,31 @@ END IF ! end subroutine Print_msg_multi + +subroutine Msg_stats() + +character(len=10) :: ydebug +character(len=10) :: yinfo +character(len=10) :: ywarning +character(len=10) :: yerror +character(len=10) :: yfatal + +Write( ydebug, '( I10 )' ) ndebug +Write( yinfo, '( I10 )' ) ninfo +Write( ywarning, '( I10 )' ) nwarning +Write( yerror, '( I10 )' ) nerror +Write( yfatal, '( I10 )' ) nfatal + +Write( cmnhmsg(1), '( A )' ) 'Number of calls to Print_msg (with actual printing):' +Write( cmnhmsg(2), '( A, A10 )' ) ' Calls with level DEBUG: ', ydebug +Write( cmnhmsg(3), '( A, A10 )' ) ' Calls with level INFO: ', yinfo +Write( cmnhmsg(4), '( A, A10 )' ) ' Calls with level WARNING: ', ywarning +Write( cmnhmsg(5), '( A, A10 )' ) ' Calls with level ERROR: ', yerror +Write( cmnhmsg(6), '( A, A10 )' ) ' Calls with level FATAL: ', yfatal + +call Print_msg( NVERB_INFO, 'GEN', 'Msg_stats' ) + +end subroutine Msg_stats + + end module mode_msg diff --git a/src/MNH/call_rttov11.f90 b/src/MNH/call_rttov11.f90 index 8e69111883567834631b7ccbce85d926a4e8d862..e9eda58c83d726d4d3b27d595189f32abf9aadfd 100644 --- a/src/MNH/call_rttov11.f90 +++ b/src/MNH/call_rttov11.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. diff --git a/src/MNH/call_rttov13.f90 b/src/MNH/call_rttov13.f90 index 1ea5ca251092611145952dec6254defff741af6e..97ccf20af2a1a608ad00478b2f05046572cef425 100644 --- a/src/MNH/call_rttov13.f90 +++ b/src/MNH/call_rttov13.f90 @@ -1,6 +1,6 @@ -!MNH_LIC Copyright 1994-2014 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 version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. !----------------------------------------------------------------- ! ######################## diff --git a/src/MNH/ch_monitorn.f90 b/src/MNH/ch_monitorn.f90 index 6e817aa0f12bc2c3c1aba44cdd08c812eabc000e..eee756dfbcdba0278206e33b4255e2cd1212b6c1 100644 --- a/src/MNH/ch_monitorn.f90 +++ b/src/MNH/ch_monitorn.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. diff --git a/src/MNH/diag.f90 b/src/MNH/diag.f90 index 27d3244abd5f99a5aa06b83c1d033693ec57403b..4bfd2dc5e8e8453068b95e8dc0ae6f41c16faa3e 100644 --- a/src/MNH/diag.f90 +++ b/src/MNH/diag.f90 @@ -93,6 +93,7 @@ ! 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 13/09/2019: budget: simplify and modernize date/time management +! P. Wautelet 06/07/2021: use FINALIZE_MNH !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -141,10 +142,11 @@ USE MODD_TURB_n USE MODD_VAR_ll ! USE MODE_DATETIME +USE MODE_FINALIZE_MNH, only: FINALIZE_MNH USE MODE_IO_FILE, only: IO_File_close, IO_File_open USE MODE_IO_FIELD_WRITE, only: IO_Header_write USE MODE_IO, only: IO_Config_set, IO_Init -USE MODE_IO_MANAGE_STRUCT, only: IO_File_add2list,IO_Filelist_print +USE MODE_IO_MANAGE_STRUCT, only: IO_File_add2list USE MODE_ll #ifdef MNH_IOLFI use mode_menu_diachro, only: MENU_DIACHRO @@ -203,7 +205,6 @@ LOGICAL:: GCLOUD_ONLY ! conditionnal radiation computations for ! the only cloudy columns ! INTEGER :: IIU, IJU, IKU -INTEGER :: IINFO_ll ! return code for _ll routines REAL, DIMENSION(:,:),ALLOCATABLE :: ZSEA,ZTOWN REAL, DIMENSION(:,:,:,:),ALLOCATABLE :: ZWETDEPAER ! @@ -808,8 +809,6 @@ ZTIME2=ZTIME2-ZTIME0 !WRITE(ILUOUT0,*) '|---------------------| -------------------|-------------------|' ! ! -IF(NIO_VERB>=NVERB_DEBUG) CALL IO_Filelist_print() -! WRITE(ILUOUT0,*) ' ' WRITE(ILUOUT0,*) '***************************** **************' WRITE(ILUOUT0,*) '* EXIT DIAG CORRECTLY *' @@ -817,13 +816,12 @@ WRITE(ILUOUT0,*) '**************************** ***************' !WRITE(ILUOUT0,*) ' (see time analysis in ',TRIM(TLUOUT0%CNAME),' )' WRITE(ILUOUT0,*) ' ' ! -CALL IO_File_close(TLUOUT0) !------------------------------------------------------------------------------- ! !* 10. FINALIZE THE PARALLEL SESSION ! ----------------------------- ! -CALL END_PARA_ll(IINFO_ll) +CALL FINALIZE_MNH() ! !------------------------------------------------------------------------------- END PROGRAM DIAG diff --git a/src/MNH/finalize_mnh.f90 b/src/MNH/finalize_mnh.f90 new file mode 100644 index 0000000000000000000000000000000000000000..faabb9972201b09d35d1020b56ef477597ee9150 --- /dev/null +++ b/src/MNH/finalize_mnh.f90 @@ -0,0 +1,73 @@ +!MNH_LIC Copyright 2021-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. +!----------------------------------------------------------------- +! Author: +! P. Wautelet 06/07/2021 +! Modifications: +! +!----------------------------------------------------------------- +MODULE MODE_FINALIZE_MNH + +IMPLICIT NONE + +CONTAINS + +SUBROUTINE FINALIZE_MNH + USE MODD_CONF, only: LCHECK, NMODEL + USE MODD_IO, only: NIO_VERB, NVERB_DEBUG + USE MODD_LUNIT, only: TLUOUT0 + USE MODD_LUNIT_n, only: LUNIT_MODEL + USE MODD_MNH_SURFEX_n, only: SURFEX_DEALLO_LIST +#ifdef CPLOASIS + USE MODD_SFX_OASIS, only: LOASIS +#endif + + USE MODE_INIT_ll, only: END_PARA_ll + USE MODE_IO_FILE, only: IO_File_close + USE MODE_IO_MANAGE_STRUCT, only: IO_Filelist_print + USE MODE_MPPDB, only: MPPDB_BARRIER + USE MODE_MSG, only: MSG_STATS + +#ifdef CPLOASIS + USE MODI_SFX_OASIS_END +#endif + + IMPLICIT NONE + + INTEGER :: IRESP + INTEGER :: JMODEL + + !Print the list of all files and some statistics on them + IF ( NIO_VERB >= NVERB_DEBUG ) CALL IO_Filelist_print() + + !Print the number of printed messages via Print_msg + CALL MSG_STATS() + + !Close all the opened 'output listing' files + IF ( TLUOUT0%LOPENED ) CALL IO_File_close(TLUOUT0) + DO JMODEL = 1, NMODEL + IF ( ASSOCIATED( LUNIT_MODEL(JMODEL)%TLUOUT ) ) THEN + IF ( LUNIT_MODEL(JMODEL)%TLUOUT%LOPENED ) CALL IO_File_close( LUNIT_MODEL(JMODEL)%TLUOUT) + END IF + END DO + + !Finalize the parallel libraries + IF ( LCHECK ) THEN + CALL MPPDB_BARRIER() + ELSE + CALL END_PARA_ll( IRESP ) +#ifdef CPLOASIS + IF ( LOASIS ) THEN + CALL SFX_OASIS_END() + END IF +#endif + END IF + + !Free SURFEX structures if necessary + CALL SURFEX_DEALLO_LIST() + +END SUBROUTINE FINALIZE_MNH + +END MODULE MODE_FINALIZE_MNH diff --git a/src/MNH/forcing.f90 b/src/MNH/forcing.f90 index 04a4a91cd280cb170667db196631e49d3b3d9d88..14a65ad60ebc6668b4a38851dc32ab1b06259041 100644 --- a/src/MNH/forcing.f90 +++ b/src/MNH/forcing.f90 @@ -171,8 +171,8 @@ USE MODD_TIME use mode_budget, only: Budget_store_init, Budget_store_end USE MODE_DATETIME USE MODE_GATHER_ll -USE MODE_MSG USE MODE_ll +USE MODE_MSG USE MODE_REPRO_SUM ! USE MODI_GET_HALO diff --git a/src/MNH/ini_lesn.f90 b/src/MNH/ini_lesn.f90 index a0776d1feb3532f5b459764fa81ec0c13369bdd3..45d7b9f9ac85e947fda34a09e56fe335c79d1d1c 100644 --- a/src/MNH/ini_lesn.f90 +++ b/src/MNH/ini_lesn.f90 @@ -39,6 +39,7 @@ ! 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 +! P. Wautelet 09/07/2021: bugfix: altitude levels are on the correct grid position (mass point) ! -------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -72,6 +73,7 @@ USE MODD_CONDSAMP, ONLY : LCONDSAMP ! USE MODI_INI_LES_CART_MASKn USE MODI_COEF_VER_INTERP_LIN +USE MODI_SHUMAN ! IMPLICIT NONE ! @@ -365,7 +367,7 @@ IF (ANY(XLES_ALTITUDES(:)/=XUNDEF)) THEN END DO END DO END DO - CALL COEF_VER_INTERP_LIN(XZZ,ZZ_LES,NKLIN_LES,XCOEFLIN_LES) + CALL COEF_VER_INTERP_LIN(MZF(XZZ),ZZ_LES,NKLIN_LES,XCOEFLIN_LES) ! DEALLOCATE(ZZ_LES) END IF diff --git a/src/MNH/ini_posprofilern.f90 b/src/MNH/ini_posprofilern.f90 index 7d5a3cd0df45721c88374309b73a19e9a79c2e70..08b25fba13d2dfdc78cdaf669b31ee81a1bdd62f 100644 --- a/src/MNH/ini_posprofilern.f90 +++ b/src/MNH/ini_posprofilern.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1994-2019 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. @@ -65,7 +65,7 @@ END MODULE MODI_INI_POSPROFILER_n !! C.Lac 10/2016 Add visibility diagnostic !! 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 : modify RARE for hydrometeors containing ice and add bright band calculation for RARE +! M. Taufour 05/07/2021: modify RARE for hydrometeors containing ice and add bright band calculation for RARE !! -------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -175,7 +175,7 @@ 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%CRARE_ATT(ISTORE,IKU,NUMBPROFILER)) ALLOCATE(TPROFILER%LWCZ (ISTORE,IKU,NUMBPROFILER)) ALLOCATE(TPROFILER%IWCZ (ISTORE,IKU,NUMBPROFILER)) ALLOCATE(TPROFILER%CIZ (ISTORE,IKU,NUMBPROFILER)) diff --git a/src/MNH/ini_radiations_ecrad.f90 b/src/MNH/ini_radiations_ecrad.f90 index be2571b921452e8dcaea3888d809919b532c62d1..7c9349afeb1656c871411d9b57f8d9c34ffa569d 100644 --- a/src/MNH/ini_radiations_ecrad.f90 +++ b/src/MNH/ini_radiations_ecrad.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2018-2019 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2018-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. diff --git a/src/MNH/mesonh.f90 b/src/MNH/mesonh.f90 index 27bd93e2cc2c8f80ad698f4ae9733821ecd29f9d..84017a6b994ac7be3f3681429bfd3a61771b67ed 100644 --- a/src/MNH/mesonh.f90 +++ b/src/MNH/mesonh.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1994-2019 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. @@ -75,7 +75,8 @@ !! J.Escobar 15/09/2015 WENO5 & JPHEXT <> 1 !! G.Delautier 06/2016 phasage surfex 8 !! J. Pianezze 01/08/2016 add sfxoasis coupling functions -!! 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/07/2021 use FINALIZE_MNH !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -87,16 +88,15 @@ USE MODD_SFX_OASIS, ONLY : LOASIS, LOASIS_GRID #endif ! -USE MODD_CONF +USE MODD_CONF, only: CPROGRAM, NMODEL USE MODD_NESTING USE MODD_CONF_n -USE MODD_IO, ONLY: NIO_VERB,NVERB_DEBUG ! USE MODI_MODEL_n USE MODI_KID_MODEL ! +USE MODE_FINALIZE_MNH, only: FINALIZE_MNH USE MODE_IO, only: IO_Init -USE MODE_IO_MANAGE_STRUCT, only: IO_Filelist_print USE MODE_ll USE MODE_MODELN_HANDLER ! @@ -108,7 +108,6 @@ USE MODD_MNH_SURFEX_n USE MODI_SFX_OASIS_INIT USE MODI_MNH_OASIS_GRID USE MODI_MNH_OASIS_DEFINE - USE MODI_SFX_OASIS_END #endif ! USE MODE_MPPDB @@ -213,26 +212,12 @@ DO ! END DO ! -IF(NIO_VERB>=NVERB_DEBUG) CALL IO_Filelist_print() -! !------------------------------------------------------------------------------- ! !* 3. FINALIZE THE PARALLEL SESSION ! ----------------------------- ! -IF (LCHECK) THEN - CALL MPPDB_BARRIER() -ELSE - CALL END_PARA_ll(IINFO_ll) -#ifdef CPLOASIS -IF (LOASIS) THEN - CALL SFX_OASIS_END -END IF -#endif -END IF -! -! -CALL SURFEX_DEALLO_LIST +CALL FINALIZE_MNH() ! !------------------------------------------------------------------------------- ! diff --git a/src/MNH/modd_mnh_surfexn.f90 b/src/MNH/modd_mnh_surfexn.f90 index 5863841a2e60edefea80eac670e1d60e63ffaaa7..ce56aad27ac4ab9b84403d8bc04933a10245c6f1 100644 --- a/src/MNH/modd_mnh_surfexn.f90 +++ b/src/MNH/modd_mnh_surfexn.f90 @@ -1,3 +1,13 @@ +!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. +!----------------------------------------------------------------- +! Author: +! ??? +! Modifications: +! P. Wautelet 06/07/2021: secure SURFEX_DEALLO_LIST (possibility to call it even if YSURF_LIST not allocated) +!----------------------------------------------------------------- MODULE MODD_MNH_SURFEX_n ! USE YOMHOOK ,ONLY : LHOOK, DR_HOOK @@ -57,12 +67,15 @@ INTEGER :: J REAL(KIND=JPRB) :: ZHOOK_HANDLE IF (LHOOK) CALL DR_HOOK("MODD_MNH_SURFEX_n:SURFEX_DEALLO_LIST",0,ZHOOK_HANDLE) ! -DO J=1,SIZE(YSURF_LIST) - CALL SURFEX_DEALLO(YSURF_LIST(J)) -ENDDO +IF ( ASSOCIATED( YSURF_CUR ) ) NULLIFY(YSURF_CUR) ! -IF (ASSOCIATED(YSURF_CUR)) NULLIFY(YSURF_CUR) -IF (ALLOCATED(YSURF_LIST)) DEALLOCATE(YSURF_LIST) +IF ( ALLOCATED( YSURF_LIST ) ) THEN + DO J = 1, SIZE( YSURF_LIST ) + CALL SURFEX_DEALLO( YSURF_LIST(J) ) + ENDDO + ! + DEALLOCATE(YSURF_LIST) +END IF ! IF (LHOOK) CALL DR_HOOK("MODD_MNH_SURFEX_n:SURFEX_DEALLO_LIST",1,ZHOOK_HANDLE) ! diff --git a/src/MNH/modd_param_ecradn.f90 b/src/MNH/modd_param_ecradn.f90 index a984d405b9456ef1f32580a0f373cd5fcc550783..3be9a339116b1b1db0928a80979b3a923350681c 100644 --- a/src/MNH/modd_param_ecradn.f90 +++ b/src/MNH/modd_param_ecradn.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2017-2019 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2017-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. diff --git a/src/MNH/modd_radiationsn.f90 b/src/MNH/modd_radiationsn.f90 index c0953ce5ebdea59995cd0e4c366681fb23580383..743c3707434493667b8b5eee8765ff3d6d67438c 100644 --- a/src/MNH/modd_radiationsn.f90 +++ b/src/MNH/modd_radiationsn.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. diff --git a/src/MNH/modd_type_profiler.f90 b/src/MNH/modd_type_profiler.f90 index 64cd438eeb9774a852cb89895a4942e7fdea910e..b5fedbf60ab7d849a2d04fc98d3047daa34cad64 100644 --- a/src/MNH/modd_type_profiler.f90 +++ b/src/MNH/modd_type_profiler.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2002-2019 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. @@ -31,7 +31,7 @@ !! 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 07/2021: modify RARE for hydrometeors containing ice and add bright band calculation for RARE +! M. Taufour 05/07/2021: modify RARE for hydrometeors containing ice and add bright band calculation for RARE !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS diff --git a/src/MNH/mode_les_diachro.f90 b/src/MNH/mode_les_diachro.f90 index 1aeec63c152b37e0cd52545de59ca5bbbccd8b5a..f56b2ce0f607015dde207609bd257cbdcf1050da 100644 --- a/src/MNH/mode_les_diachro.f90 +++ b/src/MNH/mode_les_diachro.f90 @@ -654,15 +654,17 @@ end if end function Les_time_avg_1pt -!####################################################################### -subroutine Les_diachro_1D( tpdiafile, tpfield, odoavg, odonorm, pfield ) -!####################################################################### +!############################################################################################## +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_io, only: tfiledata type(tfiledata), intent(in) :: tpdiafile ! File to write type(tfield_metadata_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 @@ -687,7 +689,7 @@ if ( tzfield%ndimlist(1) == NMNHDIM_BUDGET_LES_TIME ) then tzfield%ndimlist(1) = NMNHDIM_UNUSED tzfield%ndimlist(3) = NMNHDIM_UNUSED tzfield%ndimlist(4) = NMNHDIM_UNUSED - call Les_diachro_common( tpdiafile, tzfield, reshape( pfield, [ 1, size( pfield, 1 ), 1, 1 ] ), & + call Les_diachro_common( tpdiafile, tzfield, hgroup, hgroupcomment, reshape( pfield, [ 1, size( pfield, 1 ), 1, 1 ] ), & odoavg, odonorm ) else call Print_msg( NVERB_ERROR, 'IO', 'Les_diachro_1D', & @@ -696,9 +698,9 @@ end if end subroutine Les_diachro_1D -!####################################################################### -subroutine Les_diachro_2D( tpdiafile, tpfield, odoavg, odonorm, pfield ) -!####################################################################### +!############################################################################################## +subroutine Les_diachro_2D( tpdiafile, tpfield, hgroup, hgroupcomment, odoavg, odonorm, pfield ) +!############################################################################################## use modd_field, only: NMNHDIM_BUDGET_LES_LEVEL, NMNHDIM_BUDGET_LES_SV, NMNHDIM_BUDGET_LES_TIME, NMNHDIM_UNUSED, & tfield_metadata_base @@ -706,6 +708,8 @@ use modd_io, only: tfiledata type(tfiledata), intent(in) :: tpdiafile ! File to write type(tfield_metadata_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 @@ -729,7 +733,7 @@ if ( tzfield%ndimlist(1) == NMNHDIM_BUDGET_LES_LEVEL & .and. tzfield%ndimlist(2) == NMNHDIM_BUDGET_LES_TIME ) then tzfield%ndimlist(3) = NMNHDIM_UNUSED tzfield%ndimlist(4) = NMNHDIM_UNUSED - call Les_diachro_common( tpdiafile, tzfield, & + call Les_diachro_common( tpdiafile, tzfield, hgroup, hgroupcomment, & reshape( pfield, [ size( pfield, 1 ), size( pfield, 2 ), 1, 1 ] ), & odoavg, odonorm ) else if ( tzfield%ndimlist(1) == NMNHDIM_BUDGET_LES_TIME & @@ -738,7 +742,7 @@ else if ( tzfield%ndimlist(1) == NMNHDIM_BUDGET_LES_TIME & tzfield%ndimlist(2) = tzfield%ndimlist(1) tzfield%ndimlist(1) = NMNHDIM_UNUSED tzfield%ndimlist(3) = NMNHDIM_UNUSED - call Les_diachro_common( tpdiafile, tzfield, & + call Les_diachro_common( tpdiafile, tzfield, hgroup, hgroupcomment, & reshape( pfield, [ 1, size( pfield, 1 ), 1, size( pfield, 2 ) ] ), & odoavg, odonorm ) else @@ -749,9 +753,10 @@ end if end subroutine Les_diachro_2D -!########################################################################################## -subroutine Les_diachro_3D( tpdiafile, tpfield, odoavg, odonorm, pfield, hsuffixes, hmasks ) -!########################################################################################## +!############################################################################################### +subroutine Les_diachro_3D( tpdiafile, tpfield, hgroup, hgroupcomment, odoavg, odonorm, pfield, & + hfieldnames, hfieldcomments, hmasks ) +!############################################################################################### 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, & @@ -760,10 +765,13 @@ use modd_io, only: tfiledata type(tfiledata), intent(in) :: tpdiafile ! File to write type(tfield_metadata_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 -character(len=*), dimension(:), optional, intent(in) :: hsuffixes +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 @@ -792,29 +800,40 @@ if ( tzfield%ndimlist(1) == NMNHDIM_BUDGET_LES_LEVEL & call Print_msg( NVERB_FATAL, 'IO', 'Les_diachro_3D', 'wrong size for hmasks (' // Trim( tzfield%cmnhname ) // ')' ) tzfield%ndimlist(4) = NMNHDIM_UNUSED - call Les_diachro_common( tpdiafile, tzfield, & + call Les_diachro_common( tpdiafile, tzfield, hgroup, hgroupcomment, & reshape( pfield, [ size( pfield, 1 ), size( pfield, 2 ), size( pfield, 3 ), 1 ] ), & odoavg, odonorm, hmasks = hmasks ) else if ( tzfield%ndimlist(1) == NMNHDIM_BUDGET_LES_LEVEL & .and. tzfield%ndimlist(2) == NMNHDIM_BUDGET_LES_TIME & .and. tzfield%ndimlist(3) == NMNHDIM_BUDGET_TERM ) then - if ( .not. Present( hsuffixes ) ) & + if ( .not. Present( hfieldnames ) ) & + call Print_msg( NVERB_ERROR, 'IO', 'Les_diachro_3D', & + 'optional dummy argument hfieldnames is needed for tpfield (' // Trim( tzfield%cmnhname ) // ')' ) + + if ( .not. Present( hfieldcomments ) ) & call Print_msg( NVERB_ERROR, 'IO', 'Les_diachro_3D', & - 'optional dummy argument hsuffixes is needed for tpfield (' // Trim( tzfield%cmnhname ) // ')' ) + 'optional dummy argument hfieldcomments is needed for tpfield (' // Trim( tzfield%cmnhname ) // ')' ) - if ( Size( hsuffixes ) /= Size( pfield, 3) ) & - call Print_msg( NVERB_FATAL, 'IO', 'Les_diachro_3D', 'wrong size for hsuffixes (' // Trim( tzfield%cmnhname ) // ')' ) + if ( Size( hfieldnames ) /= Size( pfield, 3) ) & + call Print_msg( NVERB_FATAL, 'IO', 'Les_diachro_3D', 'wrong size for hfieldnames (' // Trim( tzfield%cmnhname ) // ')' ) + + if ( Size( hfieldcomments ) /= Size( pfield, 3) ) & + call Print_msg( NVERB_FATAL, 'IO', 'Les_diachro_3D', 'wrong size for hfieldcomments (' // Trim( tzfield%cmnhname ) // ')' ) tzfield%ndimlist(4) = NMNHDIM_UNUSED - call Les_diachro_common( tpdiafile, tzfield, & + call Les_diachro_common( tpdiafile, tzfield, hgroup, hgroupcomment, & reshape( pfield, [ size( pfield, 1 ), size( pfield, 2 ), size( pfield, 3 ), 1 ] ), & - odoavg, odonorm, hsuffixes = hsuffixes ) + odoavg, odonorm, hfieldnames = hfieldnames, hfieldcomments = hfieldcomments ) else if ( tzfield%ndimlist(1) == NMNHDIM_BUDGET_LES_LEVEL & .and. tzfield%ndimlist(2) == NMNHDIM_BUDGET_LES_TIME & .and. tzfield%ndimlist(3) == NMNHDIM_BUDGET_LES_SV ) then - if ( Present( hsuffixes ) ) & + if ( Present( hfieldnames ) ) & + call Print_msg( NVERB_ERROR, 'IO', 'Les_diachro_3D', & + 'optional dummy argument hfieldnames is not needed for tpfield (' // Trim( tzfield%cmnhname ) // ')' ) + + if ( Present( hfieldcomments ) ) & call Print_msg( NVERB_ERROR, 'IO', 'Les_diachro_3D', & - 'optional dummy argument hsuffixes is not needed for tpfield (' // Trim( tzfield%cmnhname ) // ')' ) + 'optional dummy argument hfieldcomments is not needed for tpfield (' // Trim( tzfield%cmnhname ) // ')' ) if ( Present( hmasks ) ) & call Print_msg( NVERB_ERROR, 'IO', 'Les_diachro_3D', & @@ -822,7 +841,7 @@ else if ( tzfield%ndimlist(1) == NMNHDIM_BUDGET_LES_LEVEL & tzfield%ndimlist(4) = tzfield%ndimlist(3) tzfield%ndimlist(3) = NMNHDIM_UNUSED - call Les_diachro_common( tpdiafile, tzfield, & + call Les_diachro_common( tpdiafile, tzfield, hgroup, hgroupcomment, & reshape( pfield, [ size( pfield, 1 ), size( pfield, 2 ), 1, size( pfield, 3 ) ] ), & odoavg, odonorm ) else @@ -832,21 +851,25 @@ end if end subroutine Les_diachro_3D -!########################################################################################## -subroutine Les_diachro_4D( tpdiafile, tpfield, odoavg, odonorm, pfield, hsuffixes, hmasks ) -!########################################################################################## +!############################################################################################### +subroutine Les_diachro_4D( tpdiafile, tpfield, hgroup, hgroupcomment, odoavg, odonorm, pfield, & + hfieldnames, hfieldcomments, hmasks ) +!############################################################################################### -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, & +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 use modd_io, only: tfiledata type(tfiledata), intent(in) :: tpdiafile ! File to write -type(tfield_metadata_base), intent(in) :: tpfield ! Metadata of field +type(tfield_metadata_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 -character(len=*), dimension(:), optional, intent(in) :: hsuffixes +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 @@ -872,32 +895,72 @@ if ( tzfield%ndimlist(1) == NMNHDIM_BUDGET_LES_LEVEL& call Print_msg( NVERB_ERROR, 'IO', 'Les_diachro_4D', & 'optional dummy argument hmasks is needed for tpfield (' // Trim( tzfield%cmnhname ) // ')' ) + if ( Present( hfieldnames ) ) & + call Print_msg( NVERB_ERROR, 'IO', 'Les_diachro_4D', & + 'optional dummy argument hfieldnames is not needed for tpfield (' // Trim( tzfield%cmnhname ) // ')' ) + + if ( Present( hfieldcomments ) ) & + call Print_msg( NVERB_ERROR, 'IO', 'Les_diachro_4D', & + 'optional dummy argument hfieldcomments is not needed for tpfield (' // Trim( tzfield%cmnhname ) // ')' ) + if ( Size( hmasks ) /= Size( pfield, 3) ) & call Print_msg( NVERB_FATAL, 'IO', 'Les_diachro_4D', 'wrong size for hmasks (' // Trim( tzfield%cmnhname ) // ')' ) - call Les_diachro_common( tpdiafile, tzfield, pfield, odoavg, odonorm, hmasks = hmasks ) else if ( tzfield%ndimlist(1) == NMNHDIM_BUDGET_LES_LEVEL & .and. tzfield%ndimlist(2) == NMNHDIM_BUDGET_LES_TIME & .and. tzfield%ndimlist(3) == NMNHDIM_BUDGET_TERM & .and. tzfield%ndimlist(4) == NMNHDIM_BUDGET_LES_SV ) then - if ( .not. Present( hsuffixes ) ) & + if ( .not. Present( hfieldnames ) ) & + call Print_msg( NVERB_ERROR, 'IO', 'Les_diachro_4D', & + 'optional dummy argument hfieldnames is needed for tpfield (' // Trim( tzfield%cmnhname ) // ')' ) + + if ( .not. Present( hfieldcomments ) ) & + call Print_msg( NVERB_ERROR, 'IO', 'Les_diachro_4D', & + 'optional dummy argument hfieldcomments is needed for tpfield (' // Trim( tzfield%cmnhname ) // ')' ) + + if ( Present( hmasks ) ) & + call Print_msg( NVERB_ERROR, 'IO', 'Les_diachro_4D', & + 'optional dummy argument hmasks is not needed for tpfield (' // Trim( tzfield%cmnhname ) // ')' ) + + if ( Size( hfieldnames ) /= Size( pfield, 3) ) & + call Print_msg( NVERB_FATAL, 'IO', 'Les_diachro_4D', 'wrong size for hfieldnames (' // Trim( tzfield%cmnhname ) // ')' ) + + if ( Size( hfieldcomments ) /= Size( pfield, 3) ) & + call Print_msg( NVERB_FATAL, 'IO', 'Les_diachro_4D', 'wrong size for hfieldcomments (' // Trim( tzfield%cmnhname ) // ')' ) + +else if ( tzfield%ndimlist(1) == NMNHDIM_BUDGET_LES_LEVEL & + .and. tzfield%ndimlist(2) == NMNHDIM_BUDGET_LES_TIME & + .and. tzfield%ndimlist(3) == NMNHDIM_BUDGET_LES_MASK & + .and. tzfield%ndimlist(4) == NMNHDIM_BUDGET_LES_PDF ) then + if ( .not. Present( hmasks ) ) & call Print_msg( NVERB_ERROR, 'IO', 'Les_diachro_4D', & - 'optional dummy argument hsuffixes is needed for tpfield (' // Trim( tzfield%cmnhname ) // ')' ) + 'optional dummy argument hmasks is needed for tpfield (' // Trim( tzfield%cmnhname ) // ')' ) - if ( Size( hsuffixes ) /= Size( pfield, 3) ) & - call Print_msg( NVERB_FATAL, 'IO', 'Les_diachro_4D', 'wrong size for hsuffixes (' // Trim( tzfield%cmnhname ) // ')' ) + if ( Present( hfieldnames ) ) & + call Print_msg( NVERB_ERROR, 'IO', 'Les_diachro_4D', & + 'optional dummy argument hfieldnames is not needed for tpfield (' // Trim( tzfield%cmnhname ) // ')' ) + + if ( Present( hfieldcomments ) ) & + call Print_msg( NVERB_ERROR, 'IO', 'Les_diachro_4D', & + 'optional dummy argument hfieldcomments is not needed for tpfield (' // Trim( tzfield%cmnhname ) // ')' ) + + if ( Size( hmasks ) /= Size( pfield, 3) ) & + call Print_msg( NVERB_FATAL, 'IO', 'Les_diachro_4D', 'wrong size for hmasks (' // Trim( tzfield%cmnhname ) // ')' ) - call Les_diachro_common( tpdiafile, tzfield, pfield, odoavg, odonorm, hsuffixes= hsuffixes ) else call Print_msg( NVERB_ERROR, 'IO', 'Les_diachro_4D', & 'ndimlist configuration not yet implemented for ' // Trim( tzfield%cmnhname ) ) end if +call Les_diachro_common( tpdiafile, tzfield, hgroup, hgroupcomment, pfield, odoavg, odonorm, & + hfieldnames = hfieldnames, hfieldcomments = hfieldcomments, hmasks = hmasks ) + end subroutine Les_diachro_4D -!############################################################################################## -subroutine Les_diachro_common( tpdiafile, tpfield, pfield, odoavg, odonorm, hsuffixes, hmasks ) -!############################################################################################## +!################################################################################################### +subroutine Les_diachro_common( tpdiafile, tpfield, hgroup, hgroupcomment, pfield, odoavg, odonorm, & + hfieldnames, hfieldcomments, hmasks ) +!################################################################################################### use modd_field, only: tfield_metadata_base use modd_io, only: tfiledata @@ -910,10 +973,13 @@ 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) :: hsuffixes +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 @@ -941,13 +1007,13 @@ ijh = nles_current_jsup ikl = nles_levels(1) ikh = nles_levels(iles_k) -if ( Present( hsuffixes ) ) then +if ( Present( hfieldcomments ) ) then if ( Present( hmasks ) ) & - call Print_msg( NVERB_FATAL, 'IO', 'Les_diachro_common', 'hsuffixes and hmasks optional arguments may not be present ' // & + call Print_msg( NVERB_FATAL, 'IO', 'Les_diachro_common', 'hfieldcomments and hmasks optional arguments may not be present ' // & 'at the same time (' // Trim( tpfield%cmnhname ) // ')' ) - if ( Size( hsuffixes ) /= Size( pfield, 3) ) & - call Print_msg( NVERB_FATAL, 'IO', 'Les_diachro_common', 'wrong size for hsuffixes (' // Trim( tpfield%cmnhname ) // ')' ) - ycomment(:) = Trim( tpfield%ccomment(:) ) // ' ' // hsuffixes(:) + if ( Size( hfieldcomments ) /= Size( pfield, 3) ) & + call Print_msg( NVERB_FATAL, 'IO', 'Les_diachro_common', 'wrong size for hfieldcomments (' // Trim( tpfield%cmnhname ) // ')' ) + ycomment(:) = Trim( tpfield%ccomment(:) ) // ': ' // hfieldcomments(:) else if ( Present( hmasks ) ) then if ( Size( hmasks ) /= Size( pfield, 3) ) & call Print_msg( NVERB_FATAL, 'IO', 'Les_diachro_common', 'wrong size for hmasks (' // Trim( tpfield%cmnhname ) // ')' ) @@ -965,9 +1031,9 @@ if ( odoavg .and. odonorm ) call Les_diachro_common_intern( .true., .true. ) contains -!####################################################################################### +!################################################## subroutine Les_diachro_common_intern( oavg, onorm ) -!####################################################################################### +!################################################## use modd_field, only: NMNHDIM_BUDGET_LES_TIME, NMNHDIM_BUDGET_LES_AVG_TIME, NMNHDIM_BUDGET_LES_MASK, & NMNHDIM_BUDGET_LES_SV, NMNHDIM_UNUSED @@ -988,6 +1054,7 @@ real, dimension(:,:,:,:), allocatable :: zfield ! Normalized fie real, dimension(:,:,:,:,:,:), allocatable :: zwork6 ! Contains physical field type(tbudiachrometadata) :: tzbudiachro type(date_time), dimension(:), allocatable :: tzdates +type(tfiledata) :: tzfile !Reallocate each time necessary because can be reallocated to an other size in Les_time_avg Allocate( zfield(Size( pfield, 1 ), Size( pfield, 2 ), Size( pfield, 3 ), Size( pfield, 4 )) ) @@ -1017,8 +1084,9 @@ end if iresp = 0 if ( oavg ) call Les_time_avg_4d( zfield, tzdates, iresp ) -if ( Present( hsuffixes ) ) then - ytitle(:) = Trim( tpfield%cmnhname ) // '_' // hsuffixes(:) +if ( Present( hfieldnames ) ) then + !ytitle(:) = Trim( tpfield%cmnhname ) // '_' // hfieldnames(:) + ytitle(:) = hfieldnames(:) else ytitle(:) = tpfield%cmnhname endif @@ -1057,9 +1125,9 @@ if ( iresp == 0 .and. any( zfield /= XUNDEF ) ) then tzbudiachro%clevels (NLVL_SUBCATEGORY) = '' tzbudiachro%ccomments(NLVL_SUBCATEGORY) = '' - tzbudiachro%lleveluse(NLVL_GROUP) = .false. - tzbudiachro%clevels (NLVL_GROUP) = '' - tzbudiachro%ccomments(NLVL_GROUP) = '' + tzbudiachro%lleveluse(NLVL_GROUP) = .true. + tzbudiachro%clevels (NLVL_GROUP) = Trim( hgroup ) + tzbudiachro%ccomments(NLVL_GROUP) = Trim( hgroupcomment ) tzbudiachro%lleveluse(NLVL_SHAPE) = .true. tzbudiachro%clevels (NLVL_SHAPE) = 'Cartesian' @@ -1113,19 +1181,41 @@ if ( iresp == 0 .and. any( zfield /= XUNDEF ) ) then tzbudiachro%nkh = ikh if ( tzfields(1)%ndimlist(6) == NMNHDIM_BUDGET_LES_MASK ) then - tzfields(:)%ndimlist(6) = NMNHDIM_UNUSED + tzfile = tpdiafile - ! Loop on the different masks - ! Do not provide all tzfields once because they can be stored in different HDF groups (based on masks) - do jp = 1, Size( hmasks ) - tzfields(jp)%clongname = Trim( ytitle(jp) ) // ' (' // Trim( hmasks(jp) ) // ')' - tzfields(jp)%ndims = tzfields(jp)%ndims - 1 + if ( Trim( tpdiafile%cformat ) == 'LFI' .or. Trim( tpdiafile%cformat ) == 'LFICDF4' ) then + !For LFI files, it is necessary to write all the 'processes' (source terms) of the different masks in one pass + !to ensure that they are grouped together and not overwritten + tzfile%cformat = 'LFI' - tzbudiachro%clevels(NLVL_MASK) = hmasks(jp) - tzbudiachro%ccomments(NLVL_MASK) = '' + do jp = 1, Size( hmasks ) + tzfields(jp)%cmnhname = Trim( ytitle(jp) ) // ' (' // Trim( hmasks(jp) ) // ')' + tzfields(jp)%clongname = Trim( ytitle(jp) ) // ' (' // Trim( hmasks(jp) ) // ')' + end do - call Write_diachro( tpdiafile, tzbudiachro, [ tzfields(jp) ], tzdates, zwork6(:,:,:,:,:,jp:jp) ) - end do + call Write_diachro( tzfile, tzbudiachro, tzfields, tzdates, zwork6 ) + end if + + if ( Trim( tpdiafile%cformat ) /= 'LFI' ) then + tzfile%cformat = 'NETCDF4' + + tzfields(:)%ndimlist(6) = NMNHDIM_UNUSED + + ! Loop on the different masks + ! Do not provide all tzfields once because they can be stored in different HDF groups (based on masks) + do jp = 1, Size( hmasks ) + !Keep the following line (about cmnhname, necessary especially if LFI files before (cmnhname was modified previously) + tzfields(jp)%cmnhname = Trim( ytitle(jp) ) + tzfields(jp)%clongname = Trim( ytitle(jp) ) // ' (' // Trim( hmasks(jp) ) // ')' + tzfields(jp)%ndims = tzfields(jp)%ndims - 1 + + tzbudiachro%clevels(NLVL_MASK) = hmasks(jp) +!PW:TODO? necessite le transfert d'info depuis les routines appelantes ou via des structures dans les modd + tzbudiachro%ccomments(NLVL_MASK) = '' + + call Write_diachro( tzfile, tzbudiachro, [ tzfields(jp) ], tzdates, zwork6(:,:,:,:,:,jp:jp) ) + end do + end if else !Set to the same value ('cart') than for the fields with no mask in Write_les_n !to put the fields in the same position of the netCDF file @@ -1296,12 +1386,12 @@ tzbudiachro%lleveluse(NLVL_SUBCATEGORY) = .false. tzbudiachro%clevels (NLVL_SUBCATEGORY) = '' tzbudiachro%ccomments(NLVL_SUBCATEGORY) = '' -tzbudiachro%lleveluse(NLVL_GROUP) = .false. -tzbudiachro%clevels (NLVL_GROUP) = '' +tzbudiachro%lleveluse(NLVL_GROUP) = .true. +tzbudiachro%clevels (NLVL_GROUP) = 'Two_point_correlation' tzbudiachro%ccomments(NLVL_GROUP) = '' -tzbudiachro%lleveluse(NLVL_SHAPE) = .true. -tzbudiachro%clevels (NLVL_SHAPE) = 'Two_point_correlation' +tzbudiachro%lleveluse(NLVL_SHAPE) = .false. +tzbudiachro%clevels (NLVL_SHAPE) = '' tzbudiachro%ccomments(NLVL_SHAPE) = '' tzbudiachro%lleveluse(NLVL_TIMEAVG) = .true. @@ -1487,12 +1577,12 @@ tzbudiachro%lleveluse(NLVL_SUBCATEGORY) = .false. tzbudiachro%clevels (NLVL_SUBCATEGORY) = '' tzbudiachro%ccomments(NLVL_SUBCATEGORY) = '' -tzbudiachro%lleveluse(NLVL_GROUP) = .false. -tzbudiachro%clevels (NLVL_GROUP) = '' +tzbudiachro%lleveluse(NLVL_GROUP) = .true. +tzbudiachro%clevels (NLVL_GROUP) = 'Spectrum' tzbudiachro%ccomments(NLVL_GROUP) = '' -tzbudiachro%lleveluse(NLVL_SHAPE) = .true. -tzbudiachro%clevels (NLVL_SHAPE) = 'Spectrum' +tzbudiachro%lleveluse(NLVL_SHAPE) = .false. +tzbudiachro%clevels (NLVL_SHAPE) = '' tzbudiachro%ccomments(NLVL_SHAPE) = '' tzbudiachro%lleveluse(NLVL_TIMEAVG) = .true. @@ -1549,12 +1639,12 @@ tzbudiachro%lleveluse(NLVL_SUBCATEGORY) = .false. tzbudiachro%clevels (NLVL_SUBCATEGORY) = '' tzbudiachro%ccomments(NLVL_SUBCATEGORY) = '' -tzbudiachro%lleveluse(NLVL_GROUP) = .false. -tzbudiachro%clevels (NLVL_GROUP) = '' +tzbudiachro%lleveluse(NLVL_GROUP) = .true. +tzbudiachro%clevels (NLVL_GROUP) = 'Spectrum' tzbudiachro%ccomments(NLVL_GROUP) = '' -tzbudiachro%lleveluse(NLVL_SHAPE) = .true. -tzbudiachro%clevels (NLVL_SHAPE) = 'Spectrum' +tzbudiachro%lleveluse(NLVL_SHAPE) = .false. +tzbudiachro%clevels (NLVL_SHAPE) = '' tzbudiachro%ccomments(NLVL_SHAPE) = '' tzbudiachro%lleveluse(NLVL_TIMEAVG) = .true. diff --git a/src/MNH/modeln.f90 b/src/MNH/modeln.f90 index 238c707f92a83d883cbb2f98e311fb3f3c3fe4da..ea53387a50a48a98c70ba748a3b1315bbc4f2c74 100644 --- a/src/MNH/modeln.f90 +++ b/src/MNH/modeln.f90 @@ -322,7 +322,7 @@ USE MODD_LES USE MODD_LES_BUDGET USE MODD_LIMA_PRECIP_SCAVENGING_n USE MODD_LSFIELD_n -USE MODD_LUNIT, ONLY: TLUOUT0,TOUTDATAFILE +USE MODD_LUNIT, ONLY: TOUTDATAFILE USE MODD_LUNIT_n, ONLY: TDIAFILE,TINIFILE,TINIFILEPGD,TLUOUT USE MODD_MEAN_FIELD USE MODD_MEAN_FIELD_n @@ -382,6 +382,7 @@ USE MODE_MSG 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 MODI_ADDFLUCTUATIONS USE MODI_ADVECTION_METSV @@ -448,7 +449,6 @@ USE MODI_WRITE_AIRCRAFT_BALLOON USE MODI_WRITE_DESFM_n USE MODI_WRITE_DIAG_SURF_ATM_N USE MODI_WRITE_LFIFM_n -USE MODI_WRITE_PROFILER_n USE MODI_WRITE_SERIES_n USE MODI_WRITE_STATION_n USE MODI_WRITE_SURF_ATM_N @@ -2316,10 +2316,6 @@ IF (OEXIT) THEN ! CALL TIMING_SEPARATOR('=') ! - ! - ! - CALL IO_File_close(TLUOUT) - IF (IMI==NMODEL) CALL IO_File_close(TLUOUT0) END IF ! END SUBROUTINE MODEL_n diff --git a/src/MNH/modn_param_ecradn.f90 b/src/MNH/modn_param_ecradn.f90 index 1cf2bfa4704a09d08eec5211e7aaa0e9ab4cb2f7..9d168f330b41adc2e54531345f39fd3320d79f92 100644 --- a/src/MNH/modn_param_ecradn.f90 +++ b/src/MNH/modn_param_ecradn.f90 @@ -1,13 +1,8 @@ -!MNH_LIC Copyright 1994-2014 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 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 modn 2006/11/23 17:22:54 -!----------------------------------------------------------------- ! ######################## MODULE MODN_PARAM_ECRAD_n ! ######################## diff --git a/src/MNH/prep_ideal_case.f90 b/src/MNH/prep_ideal_case.f90 index 3e5ea35b14a4343165833fcc22e6f09c9d624be0..370e214120d671ca8fd809fd3b69ee93a26c2e6b 100644 --- a/src/MNH/prep_ideal_case.f90 +++ b/src/MNH/prep_ideal_case.f90 @@ -320,7 +320,8 @@ ! P. Wautelet 20/05/2019: add name argument to ADDnFIELD_ll + new ADD4DFIELD_ll subroutine ! F. Auguste 02/2021: add IBM ! P. Wautelet 09/03/2021: move some chemistry initializations to ini_nsv -! Jean-Luc Redelsperger 03/2021 : : ocean LES case +! Jean-Luc Redelsperger 03/2021: ocean LES case +! P. Wautelet 06/07/2021: use FINALIZE_MNH !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -356,13 +357,14 @@ USE MODD_SALT, ONLY: LSALT, NMODE_SLT, CRGUNITS, XINISIG_SLT, XINIRADIUS_S USE MODD_VAR_ll, ONLY: NPROC USE MODD_LUNIT, ONLY: TLUOUT0, TOUTDATAFILE USE MODD_LUNIT_n -USE MODD_IO, ONLY: NIO_VERB, NVERB_DEBUG, TFILE_DUMMY, TFILE_OUTPUTLISTING +USE MODD_IO, ONLY: TFILE_DUMMY, TFILE_OUTPUTLISTING USE MODD_CONF_n USE MODD_NSV, ONLY: NSV use modd_precision, only: LFIINT, MNHREAL_MPI, MNHTIME ! USE MODN_BLANK_n ! +USE MODE_FINALIZE_MNH, only: FINALIZE_MNH USE MODE_THERMO USE MODE_POS USE MODE_GRIDCART ! Executive modules @@ -372,7 +374,7 @@ USE MODE_IO, only: IO_Config_set, IO_Init, IO_Pack_set USE MODE_IO_FIELD_READ, only: IO_Field_read USE MODE_IO_FIELD_WRITE, only: IO_Field_write, IO_Header_write USE MODE_IO_FILE, only: IO_File_close, IO_File_open -USE MODE_IO_MANAGE_STRUCT, only: IO_File_add2list,IO_Filelist_print +USE MODE_IO_MANAGE_STRUCT, only: IO_File_add2list USE MODE_ll USE MODE_MODELN_HANDLER use mode_field, only: Alloc_field_scalars, Ini_field_list, Ini_field_scalars @@ -1845,7 +1847,6 @@ IF (CSURF =='EXTE') THEN TFILE_SURFEX => TINIFILE CALL PREP_SURF_MNH(' ',' ') NULLIFY(TFILE_SURFEX) - CALL SURFEX_DEALLO_LIST ELSE CSURF = "NONE" END IF @@ -1927,10 +1928,6 @@ WRITE(NLUOUT,FMT=*) '****************************************************' WRITE(NLUOUT,FMT=*) '* PREP_IDEAL_CASE: PREP_IDEAL_CASE ENDS CORRECTLY. *' WRITE(NLUOUT,FMT=*) '****************************************************' ! -IF(NIO_VERB>=NVERB_DEBUG) CALL IO_Filelist_print() -! -CALL IO_File_close(TLUOUT) -! -CALL END_PARA_ll(IINFO_ll) +CALL FINALIZE_MNH() ! END PROGRAM PREP_IDEAL_CASE diff --git a/src/MNH/prep_nest_pgd.f90 b/src/MNH/prep_nest_pgd.f90 index b32bbce3008fcb1ec2528a24ca520faeebde9219..80b493fbcd6bcd3d097efeb2ccc6380bbe6bef6e 100644 --- a/src/MNH/prep_nest_pgd.f90 +++ b/src/MNH/prep_nest_pgd.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. @@ -92,6 +92,7 @@ !! P.Wautelet : 08/07/2016 : removed MNH_NCWRIT define !! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O ! P. Wautelet 07/02/2019: force TYPE to a known value for IO_File_add2list +! P. Wautelet 06/07/2021: use FINALIZE_MNH !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -101,7 +102,7 @@ USE MODD_CONF USE MODD_CONF_n USE MODD_CST USE MODD_DIM_n -USE MODD_IO, ONLY: NIO_VERB, NVERB_DEBUG, TFILE_SURFEX, TPTR2FILE +USE MODD_IO, ONLY: TFILE_SURFEX, TPTR2FILE USE MODD_GRID_n, ONLY: XZSMT USE MODD_LUNIT, ONLY: TPGDFILE,TLUOUT0,TOUTDATAFILE USE MODD_MNH_SURFEX_n @@ -110,11 +111,12 @@ USE MODD_PARAMETERS USE MODD_VAR_ll, ONLY: NPROC, IP, NMNH_COMM_WORLD ! use mode_field, only: Ini_field_list +USE MODE_FINALIZE_MNH, only: FINALIZE_MNH USE MODE_IO, only: IO_Init, IO_Pack_set USE MODE_IO_FIELD_READ, only: IO_Field_read USE MODE_IO_FIELD_WRITE, only: IO_Field_write, IO_Header_write USE MODE_IO_FILE, only: IO_File_close, IO_File_open -USE MODE_IO_MANAGE_STRUCT, only: IO_File_add2list, IO_Filelist_print +USE MODE_IO_MANAGE_STRUCT, only: IO_File_add2list USE MODE_ll USE MODE_MNH_WORLD, ONLY: INIT_NMNH_COMM_WORLD USE MODE_MODELN_HANDLER @@ -384,23 +386,21 @@ END DO !* 12. EPILOGUE ! -------- ! -IF(NIO_VERB>=NVERB_DEBUG) CALL IO_Filelist_print() -! WRITE(ILUOUT0,FMT=*) WRITE(ILUOUT0,FMT=*) '************************************************' WRITE(ILUOUT0,FMT=*) '* PREP_NEST_PGD: PREP_NEST_PGD ends correctly. *' WRITE(ILUOUT0,FMT=*) '************************************************' ! -CALL IO_File_close(TLUOUT0) -! !------------------------------------------------------------------------------- ! !* 10. FINALIZE THE PARALLEL SESSION ! ----------------------------- ! -CALL END_PARA_ll(IINFO_ll) +CALL FINALIZE_MNH() + +! CALL END_PARA_ll(IINFO_ll) ! -CALL SURFEX_DEALLO_LIST +! CALL SURFEX_DEALLO_LIST ! !------------------------------------------------------------------------------- diff --git a/src/MNH/prep_pgd.f90 b/src/MNH/prep_pgd.f90 index 4beb4dc431da0653b67d5a0655ff033e1a748b34..046ddde7822141fefa4743338cfcb32469bca981 100644 --- a/src/MNH/prep_pgd.f90 +++ b/src/MNH/prep_pgd.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. @@ -78,7 +78,7 @@ ! P. Wautelet 07/02/2019: remove OPARALLELIO argument from open and close files subroutines ! (nsubfiles_ioz is now determined in IO_File_add2list) ! P. Wautelet 14/02/2019: remove CLUOUT/CLUOUT0 and associated variables -! +! P. Wautelet 06/07/2021: use FINALIZE_MNH !---------------------------------------------------------------------------- ! !* 0. DECLARATION @@ -89,16 +89,17 @@ USE MODD_CONF_n,ONLY : CSTORAGE_TYPE USE MODD_LUNIT, ONLY : TLUOUT0 USE MODD_LUNIT_n,ONLY : LUNIT_MODEL USE MODD_PARAMETERS, ONLY : XUNDEF -USE MODD_IO, ONLY : NIO_VERB,NVERB_DEBUG,TFILEDATA,TFILE_OUTPUTLISTING,TFILE_SURFEX +USE MODD_IO, only: TFILEDATA, TFILE_OUTPUTLISTING, TFILE_SURFEX use modd_precision, only: LFIINT USE MODD_IO_SURF_MNH, ONLY : NHALO USE MODD_SPAWN, ONLY : NDXRATIO,NDYRATIO,NXSIZE,NYSIZE,NXOR,NYOR ! use mode_field, only: Ini_field_list +USE MODE_FINALIZE_MNH, only: FINALIZE_MNH USE MODE_IO, only: IO_Config_set, IO_Init USE MODE_IO_FIELD_WRITE, only: IO_Field_write, IO_Header_write USE MODE_IO_FILE, only: IO_File_close, IO_File_open -USE MODE_IO_MANAGE_STRUCT, only: IO_File_add2list, IO_Filelist_print +USE MODE_IO_MANAGE_STRUCT, only: IO_File_add2list use mode_ll USE MODE_MODELN_HANDLER USE MODE_MSG @@ -134,7 +135,6 @@ IMPLICIT NONE INTEGER :: IRESP ! return code for I/O INTEGER :: ILUOUT0 INTEGER :: ILUNAM -INTEGER :: IINFO_LL LOGICAL :: GFOUND CHARACTER(LEN=28) :: YDAD =' ' ! name of dad of input FM file CHARACTER(LEN=28) :: CPGDFILE ='PGDFILE' ! name of the output file @@ -332,13 +332,7 @@ WRITE(ILUOUT0,*) '***************************' ! CALL IO_File_close(TZFILE) ! -CALL SURFEX_DEALLO_LIST -! -IF(NIO_VERB>=NVERB_DEBUG) CALL IO_Filelist_print() -! -CALL IO_File_close(TLUOUT0) -! -CALL END_PARA_ll(IINFO_ll) +CALL FINALIZE_MNH() ! !------------------------------------------------------------------------------- ! diff --git a/src/MNH/prep_real_case.f90 b/src/MNH/prep_real_case.f90 index 3e3167691431dd68287e8573c951d8aa8ea3b985..2796da451deead2db67096d5ba9ddc2c5ffcb954 100644 --- a/src/MNH/prep_real_case.f90 +++ b/src/MNH/prep_real_case.f90 @@ -390,6 +390,7 @@ ! P. Wautelet 20/03/2019: missing use MODI_INIT_SALT ! P. Wautelet 20/05/2019: add name argument to ADDnFIELD_ll + new ADD4DFIELD_ll subroutine ! T.Nagel 02/2021: add IBM +! P. Wautelet 06/07/2021: use FINALIZE_MNH !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -411,7 +412,7 @@ USE MODD_GRID_n USE MODD_HURR_CONF USE MODD_IBM_LSF, ONLY: CIBM_TYPE, LIBM_LSF, NIBM_SMOOTH, XIBM_SMOOTH USE MODD_IBM_PARAM_n, ONLY: XIBM_LS -USE MODD_IO, ONLY: TFILEDATA,NIO_VERB,NVERB_DEBUG,TFILE_SURFEX +USE MODD_IO, ONLY: TFILEDATA, TFILE_SURFEX USE MODD_LBC_n USE MODD_LSFIELD_n USE MODD_LUNIT, ONLY: TPGDFILE,TLUOUT0,TOUTDATAFILE @@ -429,13 +430,14 @@ USE MODD_TURB_n ! USE MODE_EXTRAPOL use mode_field, only: Alloc_field_scalars, Ini_field_list, Ini_field_scalars +USE MODE_FINALIZE_MNH, only: FINALIZE_MNH USE MODE_GRIDCART USE MODE_GRIDPROJ USE MODE_IO, only: IO_Init USE MODE_IO_FIELD_READ, only: IO_Field_read USE MODE_IO_FIELD_WRITE, only: IO_Header_write USE MODE_IO_FILE, only: IO_File_close, IO_File_open -USE MODE_IO_MANAGE_STRUCT, only: IO_File_add2list, IO_File_find_byname,IO_Filelist_print +USE MODE_IO_MANAGE_STRUCT, only: IO_File_add2list, IO_File_find_byname USE MODE_ll USE MODE_MODELN_HANDLER USE MODE_MPPDB @@ -1159,7 +1161,6 @@ IF (.NOT. LCOUPLING ) THEN TFILE_SURFEX => TINIFILE CALL PREP_SURF_MNH(YSURFFILE,YSURFFILETYPE) NULLIFY(TFILE_SURFEX) - CALL SURFEX_DEALLO_LIST ENDIF ! CALL SECOND_MNH(ZTIME2) @@ -1248,12 +1249,8 @@ END IF CALL IO_File_close(TINIFILE) CALL IO_File_close(TPGDFILE) ! -IF(NIO_VERB>=NVERB_DEBUG) CALL IO_Filelist_print() +CALL FINALIZE_MNH() ! -CALL IO_File_close(TLUOUT0) -! -! -CALL END_PARA_ll(IINFO_ll) !------------------------------------------------------------------------------- ! CONTAINS diff --git a/src/MNH/prep_surfex.f90 b/src/MNH/prep_surfex.f90 index 16908f2aed0504c1434651fbb05cf86e40fd0b57..68ec7b3a8779d70d45f174ab868a07192b9dc4c5 100644 --- a/src/MNH/prep_surfex.f90 +++ b/src/MNH/prep_surfex.f90 @@ -36,7 +36,7 @@ USE MODD_CONF, ONLY : CPROGRAM,& L1D, L2D, LPACK USE MODD_CONF_n, ONLY : CSTORAGE_TYPE -USE MODD_IO, ONLY : TFILEDATA, NIO_VERB, NVERB_DEBUG, TFILE_SURFEX +USE MODD_IO, ONLY : TFILEDATA, TFILE_SURFEX USE MODD_LUNIT, ONLY : TPGDFILE, TLUOUT0 USE MODD_LUNIT_n, ONLY : CINIFILE, TINIFILE USE MODD_MNH_SURFEX_n @@ -44,11 +44,12 @@ USE MODD_PARAMETERS, ONLY : JPMODELMAX,JPHEXT,JPVEXT, NUNDEF, XUNDEF USE MODD_TIME_n, ONLY : TDTCUR ! use mode_field, only: Ini_field_list, Ini_field_scalars +USE MODE_FINALIZE_MNH, only: FINALIZE_MNH USE MODE_IO, only: IO_Init USE MODE_IO_FIELD_READ, only: IO_Field_read USE MODE_IO_FIELD_WRITE, only: IO_Field_write, IO_Header_write USE MODE_IO_FILE, only: IO_File_close, IO_File_open -USE MODE_IO_MANAGE_STRUCT, only: IO_File_add2list, IO_Filelist_print +USE MODE_IO_MANAGE_STRUCT, only: IO_File_add2list USE MODE_ll USE MODE_MSG USE MODE_MODELN_HANDLER @@ -200,12 +201,7 @@ WRITE(ILUOUT0,*) '| |' WRITE(ILUOUT0,*) '----------------------------------' CALL IO_File_close(TINIFILE) ! -IF(NIO_VERB>=NVERB_DEBUG) CALL IO_Filelist_print() -! -CALL IO_File_close(TLUOUT0) -! -CALL END_PARA_ll(IINFO_ll) -CALL SURFEX_DEALLO_LIST +CALL FINALIZE_MNH() !------------------------------------------------------------------------------- ! END PROGRAM PREP_SURFEX diff --git a/src/MNH/profilern.f90 b/src/MNH/profilern.f90 index f91695cd03a4bc5a6bfd7fc3e806daed877a3ea7..433a5c6ef02ae8a1630718f497b1f602b536f7a5 100644 --- a/src/MNH/profilern.f90 +++ b/src/MNH/profilern.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. @@ -12,7 +12,7 @@ INTERFACE SUBROUTINE PROFILER_n(PTSTEP, & PXHAT, PYHAT, PZ,PRHODREF, & PU, PV, PW, PTH, PR, PSV, PTKE, & - PTS,PP, PAER, PCLDFR, PCIT,PSEA) + PTS, PP, PAER, PCLDFR, PCIT, PSEA) ! REAL, INTENT(IN) :: PTSTEP ! time step REAL, DIMENSION(:), INTENT(IN) :: PXHAT ! x coordinate @@ -31,7 +31,7 @@ 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 ! !------------------------------------------------------------------------------- ! @@ -84,7 +84,7 @@ END MODULE MODI_PROFILER_n !! 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 -! M.Taufour 07/2021: modify RARE for hydrometeors containing ice and add bright band calculation for RARE +! M. Taufour 05/07/2021: modify RARE for hydrometeors containing ice and add bright band calculation for RARE ! -------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -157,7 +157,7 @@ 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 ! !------------------------------------------------------------------------------- ! diff --git a/src/MNH/set_mass.f90 b/src/MNH/set_mass.f90 index 4563a4c6d85559ec5ec5a334bd5c3efdb7f4c3a0..b3402a0e3cd0ece6682058f04aa386e84f37686a 100644 --- a/src/MNH/set_mass.f90 +++ b/src/MNH/set_mass.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2010-2020 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2010-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. diff --git a/src/MNH/spawning.f90 b/src/MNH/spawning.f90 index 850f27d65fa12a6993d2faededb4cead0288f306..15c7d98b76f599f4f2b5329cc09333df5c484bfb 100644 --- a/src/MNH/spawning.f90 +++ b/src/MNH/spawning.f90 @@ -78,6 +78,7 @@ ! (nsubfiles_ioz is now determined in IO_File_add2list) ! S. Bielli 02/2019: sea salt: significant sea wave height influences salt emission; 5 salt modes ! P. Wautelet 11/02/2020: bugfix: close TINIFILEPGD only if previously opened +! P. Wautelet 06/07/2021: use FINALIZE_MNH !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -105,7 +106,7 @@ USE MODD_CURVCOR_n USE MODD_DIM_n USE MODD_DYN_n, LRES_n=>LRES, XRES_n=>XRES USE MODD_FIELD_n -USE MODD_IO, ONLY: NIO_VERB,NVERB_DEBUG,TFILEDATA +USE MODD_IO, only: TFILEDATA USE MODD_LSFIELD_n USE MODD_LBC_n USE MODD_LUNIT_n @@ -116,9 +117,10 @@ USE MODD_TIME_n USE MODD_CH_MNHC_n USE MODD_GRID_n ! +USE MODE_FINALIZE_MNH, only: FINALIZE_MNH USE MODE_IO, only: IO_Init USE MODE_IO_FILE, only: IO_File_close, IO_File_open -USE MODE_IO_MANAGE_STRUCT, only: IO_File_add2list, IO_File_find_byname, IO_Filelist_print +USE MODE_IO_MANAGE_STRUCT, only: IO_File_add2list, IO_File_find_byname USE MODE_ll USE MODE_POS USE MODE_MODELN_HANDLER @@ -128,7 +130,6 @@ USE MODI_BOUNDARIES ! USE MODI_VERSION USE MODI_INIT_MNH -USE MODD_MNH_SURFEX_n USE MODE_MPPDB ! ! @@ -252,13 +253,8 @@ CALL SPAWN_MODEL2 (NRR,NSV_USER,CTURB,CSURF,CCLOUD, & CCHEM_INPUT_FILE,YSPAFILE,YSPANBR,YSONFILE, & CINIFILE, CINIFILEPGD, LSPAWN_SURF ) ! -CALL SURFEX_DEALLO_LIST -! -IF(NIO_VERB>=NVERB_DEBUG) CALL IO_Filelist_print() -! -CALL IO_File_close(TLUOUT) -! -CALL END_PARA_ll(IINFO_ll) +CALL FINALIZE_MNH() + CONTAINS diff --git a/src/MNH/spectre.f90 b/src/MNH/spectre.f90 index 545c60629410ef29c5a16bfd5289f96038c41e28..a87838c936e9c344c04f5fcc40325dac525eeab5 100644 --- a/src/MNH/spectre.f90 +++ b/src/MNH/spectre.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2011-2019 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2011-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. @@ -17,7 +17,8 @@ !! !! !! Modifications: -!! 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/07/2021: use FINALIZE_MNH !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -25,8 +26,7 @@ ! ! USE MODD_CONF -USE MODD_IO, ONLY: NIO_VERB,NVERB_DEBUG,TFILEDATA -USE MODD_LUNIT +USE MODD_IO, only: TFILEDATA USE MODD_LUNIT_n USE MODD_TIME_n USE MODD_DIM_ll @@ -35,13 +35,13 @@ USE MODD_SPECTRE USE MODI_SPECTRE_MESONH USE MODI_SPECTRE_AROME ! -USE MODE_MSG -USE MODE_POS +USE MODE_FINALIZE_MNH, only: FINALIZE_MNH USE MODE_IO, only: IO_Config_set, IO_Init USE MODE_IO_FILE, only: IO_File_close, IO_File_open -USE MODE_IO_MANAGE_STRUCT, only: IO_File_add2list, IO_Filelist_print -use mode_init_ll, only: END_PARA_ll +USE MODE_IO_MANAGE_STRUCT, only: IO_File_add2list USE MODE_MODELN_HANDLER +USE MODE_MSG +USE MODE_POS !USE MODD_TYPE_DATE USE MODI_VERSION ! @@ -60,8 +60,6 @@ INTEGER :: ILUNAM ! Logical unit numbers for the ! and for output_listing file LOGICAL :: GFOUND ! Return code when searching namelist ! -INTEGER :: IINFO_ll ! return code for _ll routines -! REAL,DIMENSION(:,:,:),ALLOCATABLE:: ZWORK ! work array REAL,DIMENSION(:,:,:),ALLOCATABLE:: ZWORKAROME ! work array INTEGER :: NI,NJ,NK @@ -191,9 +189,6 @@ IF (CTYPEFILE=='MESONH') THEN CALL SPECTRE_MESONH(YOUTFILE) ! CALL IO_File_close(LUNIT_MODEL(1)%TINIFILE) - IF(NIO_VERB>=NVERB_DEBUG) CALL IO_Filelist_print() - CALL IO_File_close(TLUOUT0) - CALL IO_File_close(TLUOUT) ELSEIF (CTYPEFILE=='AROME ')THEN CALL SPECTRE_AROME(CINIFILE,YOUTFILE,XDELTAX,XDELTAY,NI,NJ,NK) ELSE @@ -205,8 +200,8 @@ ENDIF !* 4. FINALIZE THE PARALLEL SESSION ! ----------------------------- ! -CALL END_PARA_ll(IINFO_ll) -! +CALL FINALIZE_MNH() + PRINT*, ' ' PRINT*, '****************************************************' PRINT*, '* EXIT SPECTRE CORRECTLY *' diff --git a/src/MNH/write_diachro.f90 b/src/MNH/write_diachro.f90 index de060fcd60dce31ab3852296d6d139355b05f2ed..a1170be6f3aebdb1700ad5c83a90862597e00e6a 100644 --- a/src/MNH/write_diachro.f90 +++ b/src/MNH/write_diachro.f90 @@ -143,8 +143,9 @@ subroutine Write_diachro_lfi( tpdiafile, tpbudiachro, tpfields, tpdates, pvar, t use modd_aircraft_balloon, only: flyer use modd_budget, only: NLVL_CATEGORY, NLVL_GROUP, NLVL_SHAPE, nbumask, nbutshift, nbusubwrite, tbudiachrometadata -use modd_field, only: NMNHDIM_ONE, NMNHDIM_UNKNOWN, NMNHDIM_FLYER_TIME, NMNHDIM_NOTLISTED, NMNHDIM_UNUSED, & - TYPECHAR, TYPEINT, TYPEREAL, & +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 use modd_io, only: tfiledata use modd_les, only: nles_current_iinf, nles_current_isup, nles_current_jinf, nles_current_jsup, & @@ -182,6 +183,7 @@ character(len=LFIUNITLGT), dimension(:), allocatable :: yunits !Used to re character(len=LFICOMMENTLGT), dimension(:), allocatable :: ycomments !Used to respect LFI fileformat INTEGER :: ILENG, ILENTITRE, ILENUNITE, ILENCOMMENT integer :: iil, iih, ijl, ijh, ikl, ikh +integer :: idx INTEGER :: II, IJ, IK, IT, IN, IP, J, JJ INTEGER :: INTRAJT, IKTRAJX, IKTRAJY, IKTRAJZ INTEGER :: ITTRAJX, ITTRAJY, ITTRAJZ @@ -255,6 +257,18 @@ else if ( tpbudiachro%clevels(NLVL_GROUP) == 'RhodJ' ) then else if ( tpbudiachro%nsv > 0 ) then Allocate( character(len=9) :: ygroup ) Write( ygroup, '( "SV", i3.3, i4.4 )' ) tpbudiachro%nsv, nbutshift +else if ( tpbudiachro%clevels(NLVL_CATEGORY) == 'LES_budgets' .and. tpbudiachro%clevels(NLVL_GROUP)(1:3)/='BU_' ) then + if ( tpfields(1)%ndimlist(6) == NMNHDIM_BUDGET_LES_MASK ) then + !Remove the name of the mask (different for each 'process') to get the common name for the group + idx = Index( tpfields(1)%cmnhname, ' ' ) + if ( idx > 0 ) then + ygroup = tpfields(1)%cmnhname(1:idx- 1) + else + ygroup = Trim( tpfields(1)%cmnhname ) + end if + else + ygroup = Trim( tpfields(1)%cmnhname ) + end if else ygroup = Trim( tpbudiachro%clevels(NLVL_GROUP) ) end if @@ -285,7 +299,7 @@ if ( Trim( tpbudiachro%clevels(NLVL_CATEGORY) ) == 'LES_budgets' & end if if ( Trim( tpbudiachro%clevels(NLVL_CATEGORY) ) == 'LES_budgets' & - .and. Trim( tpbudiachro%clevels(NLVL_SHAPE) ) == 'Spectrum' ) then + .and. Trim( tpbudiachro%clevels(NLVL_GROUP) ) == 'Spectrum' ) then if ( tpbudiachro%ltcompress ) then ygroup = 'T_' // Trim( ygroup ) !Limit to 10 characters (backward compatibility again...) @@ -1085,7 +1099,7 @@ select case ( idims ) if ( Size( tpfields ) /= 1 ) call Print_msg( NVERB_FATAL, 'IO', 'Write_diachro_nc4', & 'wrong size of tpfields (variable '//trim(tpfields(1)%cmnhname)//')' ) call Diachro_one_field_write_nc4( tzfile, tpbudiachro, tpfields(1), pvar, [ 3 ], gsplit, gdistributed ) - else if ( tpfields(1)%ndimlist(6) == NMNHDIM_BUDGET_NGROUPS ) then + else if ( tpfields(1)%ndimlist(6) == NMNHDIM_BUDGET_NGROUPS .or. tpfields(1)%ndimlist(6) == NMNHDIM_PROFILER_PROC ) then do ji = 1, Size( pvar, 6 ) !Remark: [ integer:: ] is a constructor for a zero-size array of integers, [] is not allowed (type can not be determined) call Diachro_one_field_write_nc4( tzfile, tpbudiachro, tpfields(ji), pvar(:,:,:,:,:,ji:ji), [ integer:: ], & @@ -1174,6 +1188,13 @@ select case ( idims ) end if end if + ! Loop on the processes + do ji = 1, Size( pvar, 6 ) + call Diachro_one_field_write_nc4( tzfile, tpbudiachro, tpfields(ji), pvar(:,:,:,:,:,ji:ji), [ 4 ], gsplit, gdistributed ) + end do + else if ( tpfields(1)%ndimlist(4) == NMNHDIM_PROFILER_TIME & + .and. tpfields(1)%ndimlist(6) == NMNHDIM_PROFILER_PROC ) then + !Correspond to WRITE_PROFILER_n ! Loop on the processes do ji = 1, Size( pvar, 6 ) call Diachro_one_field_write_nc4( tzfile, tpbudiachro, tpfields(ji), pvar(:,:,:,:,:,ji:ji), [ 4 ], gsplit, gdistributed ) @@ -1270,6 +1291,13 @@ select case ( idims ) do ji = 1, Size( pvar, 6 ) call Diachro_one_field_write_nc4( tzfile, tpbudiachro, tpfields(ji), pvar(:,:,:,:,:,ji:ji), [ 3, 4 ], gsplit, gdistributed ) end do + else if ( tpfields(1)%ndimlist(3) == NMNHDIM_BUDGET_LES_LEVEL & + .and. ( tpfields(1)%ndimlist(4) == NMNHDIM_BUDGET_LES_TIME & + .or. tpfields(1)%ndimlist(4) == NMNHDIM_BUDGET_LES_AVG_TIME ) & + .and. tpfields(1)%ndimlist(5) == NMNHDIM_BUDGET_LES_PDF ) then + if ( Size( tpfields ) /= 1 ) call Print_msg( NVERB_FATAL, 'IO', 'Write_diachro_nc4', & + 'wrong size of tpfields (variable '//trim(tpfields(1)%cmnhname)//')' ) + call Diachro_one_field_write_nc4( tzfile, tpbudiachro, tpfields(1), pvar, [ 3, 4, 5 ], gsplit, gdistributed ) else if ( tpfields(1)%ndimlist(3) == NMNHDIM_BUDGET_LES_LEVEL & .and. ( tpfields(1)%ndimlist(4) == NMNHDIM_BUDGET_LES_TIME & .or. tpfields(1)%ndimlist(4) == NMNHDIM_BUDGET_LES_AVG_TIME ) & diff --git a/src/MNH/write_les_budgetn.f90 b/src/MNH/write_les_budgetn.f90 index fec25b5ea6ee41a77ebf0b8f659e8b47d5c3154b..7827ba184b18d710839d63155d807c186b67eb01 100644 --- a/src/MNH/write_les_budgetn.f90 +++ b/src/MNH/write_les_budgetn.f90 @@ -98,8 +98,10 @@ INTEGER :: ILES_P1, ILES_P2 INTEGER :: JK ! vertical loop counter INTEGER :: JT ! temporal loop counter ! -CHARACTER(len=9), DIMENSION(NMAX_ILES) :: YSUBTITLE -CHARACTER(len=8) :: YGROUP +CHARACTER(len=9), DIMENSION(NMAX_ILES) :: YFIELDNAMES +CHARACTER(len=100), DIMENSION(NMAX_ILES) :: YFIELDCOMMENTS +character(len=:), allocatable :: ygroup +character(len=:), allocatable :: ygroupcomment ! REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZLES_BUDGET ! @@ -114,7 +116,7 @@ type(tfield_metadata_base) :: tzfield ALLOCATE(ZLES_BUDGET(NLES_K,NLES_TIMES,NMAX_ILES)) ! ZLES_BUDGET=XUNDEF -YSUBTITLE(:)=' ' +YFIELDNAMES(:)=' ' tzfield%ngrid = 0 !Not on the Arakawa grid tzfield%ntype = TYPEREAL @@ -131,7 +133,8 @@ gdonorm = Trim( cles_norm_type ) /= 'NONE' !* 1. total (resolved+subgrid) kinetic energy budget ! ------------------------------------ ! -YGROUP= 'BU_KE' +ygroup = 'BU_KE' +ygroupcomment = 'Total (resolved+subgrid) kinetic energy budget' ILES=0 ILES_STA=ILES ! @@ -139,16 +142,18 @@ ILES_STA=ILES ! -------- ! ILES=ILES+1 -YSUBTITLE(ILES) = 'SBG_TEND' +YFIELDNAMES(ILES) = 'SBG_TEND' +YFIELDCOMMENTS(ILES) = 'subgrid tendency' ! ZLES_BUDGET(:,:,ILES) = XLES_BU_SBG_TKE(:,:,NLES_TEND) ! ! -!* 1.2 production by mean wind gradient +!* 1.2 dynamic production by mean wind gradient ! --------------------------------- ! ILES=ILES+1 -YSUBTITLE(ILES) = 'SBG_DP_M' +YFIELDNAMES(ILES) = 'SBG_DP_M' +YFIELDCOMMENTS(ILES) = 'subgrid dynamic production by mean gradient' ! ZLES_BUDGET(:,:,ILES)= - XLES_SUBGRID_WU (:,:,1) * XLES_MEAN_DUDZ(:,:,1) & - XLES_SUBGRID_WV (:,:,1) * XLES_MEAN_DVDZ(:,:,1) & @@ -158,7 +163,8 @@ ZLES_BUDGET(:,:,ILES)= - XLES_SUBGRID_WU (:,:,1) * XLES_MEAN_DUDZ(:,:,1) & ! ------------------------------------------------ ! ILES=ILES+1 -YSUBTITLE(ILES) = 'SBG_DP_R' +YFIELDNAMES(ILES) = 'SBG_DP_R' +YFIELDCOMMENTS(ILES) = 'subgrid dynamic production by resolved fluctuations' ! ZLES_BUDGET(:,:,ILES) = XLES_BU_SBG_TKE(:,:,NLES_DP) - ZLES_BUDGET(:,:,2) ! @@ -169,7 +175,8 @@ ZLES_BUDGET(:,:,ILES) = XLES_BU_SBG_TKE(:,:,NLES_DP) - ZLES_BUDGET(:,:,2) ! IF ( ANY(XLES_BU_SBG_TKE(:,:,NLES_ADVM)/= 0.) ) THEN ILES=ILES+1 -YSUBTITLE(ILES) = 'SBG_ADVM' +YFIELDNAMES(ILES) = 'SBG_ADVM' +YFIELDCOMMENTS(ILES) = 'subgrid advection by mean flow' ! ZLES_BUDGET(:,:,ILES) = XLES_BU_SBG_TKE(:,:,NLES_ADVM) END IF @@ -180,7 +187,8 @@ END IF ! IF ( ANY(XLES_BU_SBG_TKE(:,:,NLES_FORC)/= 0.) ) THEN ILES=ILES+1 -YSUBTITLE(ILES) = 'SBG_FORC' +YFIELDNAMES(ILES) = 'SBG_FORC' +YFIELDCOMMENTS(ILES) = 'subgrid advection by large-scale W forcing' ! ZLES_BUDGET(:,:,ILES) = XLES_BU_SBG_TKE(:,:,NLES_FORC) END IF @@ -190,7 +198,8 @@ END IF ! ------------------- ! ILES=ILES+1 -YSUBTITLE(ILES) = 'SBG_TR' +YFIELDNAMES(ILES) = 'SBG_TR' +YFIELDCOMMENTS(ILES) = 'subgrid turbulent transport' ! ZLES_BUDGET(:,:,ILES) = XLES_BU_SBG_TKE(:,:,NLES_TR) ! @@ -199,7 +208,8 @@ ZLES_BUDGET(:,:,ILES) = XLES_BU_SBG_TKE(:,:,NLES_TR) ! ----------------------------- ! ILES=ILES+1 -YSUBTITLE(ILES) = 'SBG_ADVR' +YFIELDNAMES(ILES) = 'SBG_ADVR' +YFIELDCOMMENTS(ILES) = 'subgrid advection by resolved flow' ! ZLES_BUDGET(:,:,ILES) = XLES_BU_SBG_TKE(:,:,NLES_ADVR) ! @@ -209,7 +219,8 @@ ZLES_BUDGET(:,:,ILES) = XLES_BU_SBG_TKE(:,:,NLES_ADVR) ! IF ( ANY(XLES_BU_SBG_TKE(:,:,NLES_PRES)/= 0.) ) THEN ILES=ILES+1 -YSUBTITLE(ILES) = 'SBG_PRES' +YFIELDNAMES(ILES) = 'SBG_PRES' +YFIELDCOMMENTS(ILES) = 'subgrid pressure-correlation' ! ZLES_BUDGET(:,:,ILES) = XLES_BU_SBG_TKE(:,:,NLES_PRES) END IF @@ -219,7 +230,8 @@ END IF ! ------------------ ! ILES=ILES+1 -YSUBTITLE(ILES) = 'SBG_TP' +YFIELDNAMES(ILES) = 'SBG_TP' +YFIELDCOMMENTS(ILES) = 'subgrid thermal production' ! ZLES_BUDGET(:,:,ILES) = XLES_BU_SBG_TKE(:,:,NLES_TP) ! @@ -228,7 +240,8 @@ ZLES_BUDGET(:,:,ILES) = XLES_BU_SBG_TKE(:,:,NLES_TP) ! ----------- ! ILES=ILES+1 -YSUBTITLE(ILES) = 'SBG_DISS' +YFIELDNAMES(ILES) = 'SBG_DISS' +YFIELDCOMMENTS(ILES) = 'subgrid dissipation' ! ZLES_BUDGET(:,:,ILES) = XLES_BU_SBG_TKE(:,:,NLES_DISS) ! @@ -238,7 +251,8 @@ ZLES_BUDGET(:,:,ILES) = XLES_BU_SBG_TKE(:,:,NLES_DISS) ! IF ( ANY(XLES_BU_SBG_TKE(:,:,NLES_DIFF)/= 0.) ) THEN ILES=ILES+1 -YSUBTITLE(ILES) = 'SBG_NUMD' +YFIELDNAMES(ILES) = 'SBG_NUMD' +YFIELDCOMMENTS(ILES) = 'subgrid numerical diffusion' ! ZLES_BUDGET(:,:,ILES) = XLES_BU_SBG_TKE(:,:,NLES_DIFF) END IF @@ -248,7 +262,8 @@ END IF ! IF ( ANY(XLES_BU_SBG_TKE(:,:,NLES_RELA)/= 0.) ) THEN ILES=ILES+1 -YSUBTITLE(ILES) = 'SBG_RELA' +YFIELDNAMES(ILES) = 'SBG_RELA' +YFIELDCOMMENTS(ILES) = 'subgrid sponge layer relaxation' ! ZLES_BUDGET(:,:,ILES) = XLES_BU_SBG_TKE(:,:,NLES_RELA) END IF @@ -258,7 +273,8 @@ END IF ! IF ( ANY(XLES_BU_SBG_TKE(:,:,NLES_NEST)/= 0.) ) THEN ILES=ILES+1 -YSUBTITLE(ILES) = 'SBG_NEST' +YFIELDNAMES(ILES) = 'SBG_NEST' +YFIELDCOMMENTS(ILES) = 'subgrid average from smaller nested models' ! ZLES_BUDGET(:,:,ILES) = XLES_BU_SBG_TKE(:,:,NLES_NEST) END IF @@ -269,7 +285,8 @@ END IF ! IF ( ANY(XLES_BU_SBG_TKE(:,:,NLES_MISC)/= 0.) ) THEN ILES=ILES+1 -YSUBTITLE(ILES) = 'SBG_MISC' +YFIELDNAMES(ILES) = 'SBG_MISC' +YFIELDCOMMENTS(ILES) = 'subgrid: other effects' ! ZLES_BUDGET(:,:,ILES) = XLES_BU_SBG_TKE(:,:,NLES_MISC) END IF @@ -279,7 +296,8 @@ END IF ! -------------------------- ! ILES=ILES+1 -YSUBTITLE(ILES) = 'SBG_RESI' +YFIELDNAMES(ILES) = 'SBG_RESI' +YFIELDCOMMENTS(ILES) = 'residual of subgrid budget' ! ZLES_BUDGET(:,:,ILES) = 0. DO JLES=ILES_STA+1,ILES-1 @@ -292,7 +310,8 @@ ILES_STA=ILES ! -------- ! ILES=ILES+1 -YSUBTITLE(ILES) = 'RES_TEND' +YFIELDNAMES(ILES) = 'RES_TEND' +YFIELDCOMMENTS(ILES) = 'resolved tendency' ! ZLES_BUDGET(:,:,ILES) = XLES_BU_RES_KE(:,:,NLES_TEND) ! @@ -302,7 +321,8 @@ ZLES_BUDGET(:,:,ILES) = XLES_BU_RES_KE(:,:,NLES_TEND) ! IF ( ANY(XLES_BU_RES_KE(:,:,NLES_ADVM)/= 0.) ) THEN ILES=ILES+1 -YSUBTITLE(ILES) = 'RES_ADV' +YFIELDNAMES(ILES) = 'RES_ADV' +YFIELDCOMMENTS(ILES) = 'resolved advection by mean flow' ! ZLES_BUDGET(:,:,ILES) = XLES_BU_RES_Ke(:,:,NLES_ADVM) END IF @@ -313,17 +333,19 @@ END IF ! IF ( ANY(XLES_BU_RES_KE(:,:,NLES_FORC)/= 0.) ) THEN ILES=ILES+1 -YSUBTITLE(ILES) = 'RES_FORC' +YFIELDNAMES(ILES) = 'RES_FORC' +YFIELDCOMMENTS(ILES) = 'resolved advection by large-scale W forcing' ! ZLES_BUDGET(:,:,ILES) = XLES_BU_RES_Ke(:,:,NLES_FORC) END IF ! ! -!* 1.19 production by mean wind gradient +!* 1.19 dynamic production by mean wind gradient ! -------------------------------- ! ILES=ILES+1 -YSUBTITLE(ILES) = 'RES_DP' +YFIELDNAMES(ILES) = 'RES_DP' +YFIELDCOMMENTS(ILES) = 'resolved dynamic production by mean gradient' ! ZLES_BUDGET(:,:,ILES) = XLES_BU_RES_Ke(:,:,NLES_DP) ! @@ -332,7 +354,8 @@ ZLES_BUDGET(:,:,ILES) = XLES_BU_RES_Ke(:,:,NLES_DP) ! ------------------- ! ILES=ILES+1 -YSUBTITLE(ILES) = 'RES_TR' +YFIELDNAMES(ILES) = 'RES_TR' +YFIELDCOMMENTS(ILES) = 'turbulent transport of resolved flux by itself' ! ZLES_BUDGET(:,:,ILES) = XLES_BU_RES_KE(:,:,NLES_TR) ! @@ -342,7 +365,8 @@ ZLES_BUDGET(:,:,ILES) = XLES_BU_RES_KE(:,:,NLES_TR) ! ------------------- ! ILES=ILES+1 -YSUBTITLE(ILES) = 'RES_PRES' +YFIELDNAMES(ILES) = 'RES_PRES' +YFIELDCOMMENTS(ILES) = 'resolved pressure-correlation' ! ZLES_BUDGET(:,:,ILES) = XLES_BU_RES_KE(:,:,NLES_PRES) ! @@ -351,7 +375,8 @@ ZLES_BUDGET(:,:,ILES) = XLES_BU_RES_KE(:,:,NLES_PRES) ! ------------------ ! ILES=ILES+1 -YSUBTITLE(ILES) = 'RES_TP' +YFIELDNAMES(ILES) = 'RES_TP' +YFIELDCOMMENTS(ILES) = 'resolved thermal production' ! ZLES_BUDGET(:,:,ILES) = XLES_BU_RES_KE(:,:,NLES_GRAV) ! @@ -360,7 +385,8 @@ ZLES_BUDGET(:,:,ILES) = XLES_BU_RES_KE(:,:,NLES_GRAV) ! ---------------------------------------------------- ! ILES=ILES+1 -YSUBTITLE(ILES) = 'RES_SBGT' +YFIELDNAMES(ILES) = 'RES_SBGT' +YFIELDCOMMENTS(ILES) = 'resolved sink due to subgrid turbulence' ! ZLES_BUDGET(:,:,ILES) = XLES_BU_RES_KE(:,:,NLES_VTURB) + XLES_BU_RES_KE(:,:,NLES_HTURB) ! @@ -369,7 +395,8 @@ ZLES_BUDGET(:,:,ILES) = XLES_BU_RES_KE(:,:,NLES_VTURB) + XLES_BU_RES_KE(:,:,NLES ! IF ( ANY(XLES_BU_RES_KE(:,:,NLES_COR)/= 0.) ) THEN ILES=ILES+1 -YSUBTITLE(ILES) = 'RES_CORI' +YFIELDNAMES(ILES) = 'RES_CORI' +YFIELDCOMMENTS(ILES) = 'resolved Coriolis effect' ! ZLES_BUDGET(:,:,ILES) = XLES_BU_RES_KE(:,:,NLES_COR) END IF @@ -379,7 +406,8 @@ END IF ! IF ( ANY(XLES_BU_RES_KE(:,:,NLES_DIFF)/= 0.) ) THEN ILES=ILES+1 -YSUBTITLE(ILES) = 'RES_NUMD' +YFIELDNAMES(ILES) = 'RES_NUMD' +YFIELDCOMMENTS(ILES) = 'resolved numerical diffusion' ! ZLES_BUDGET(:,:,ILES) = XLES_BU_RES_KE(:,:,NLES_DIFF) END IF @@ -389,7 +417,8 @@ END IF ! IF ( ANY(XLES_BU_RES_KE(:,:,NLES_RELA)/= 0.) ) THEN ILES=ILES+1 -YSUBTITLE(ILES) = 'RES_RELA' +YFIELDNAMES(ILES) = 'RES_RELA' +YFIELDCOMMENTS(ILES) = 'resolved sponge layer relaxation' ! ZLES_BUDGET(:,:,ILES) = XLES_BU_RES_KE(:,:,NLES_RELA) END IF @@ -399,7 +428,8 @@ END IF ! IF ( ANY(XLES_BU_RES_KE(:,:,NLES_NEST)/= 0.) ) THEN ILES=ILES+1 -YSUBTITLE(ILES) = 'RES_NEST' +YFIELDNAMES(ILES) = 'RES_NEST' +YFIELDCOMMENTS(ILES) = 'resolved average from smaller nested models' ! ZLES_BUDGET(:,:,ILES) = XLES_BU_RES_KE(:,:,NLES_NEST) END IF @@ -411,7 +441,8 @@ END IF IF ( ANY( XLES_BU_RES_KE(:,:,NLES_MISC) & +XLES_BU_RES_KE(:,:,NLES_CURV) /= 0.) ) THEN ILES=ILES+1 -YSUBTITLE(ILES) = 'RES_MISC' +YFIELDNAMES(ILES) = 'RES_MISC' +YFIELDCOMMENTS(ILES) = 'resolved: other effects' ! ZLES_BUDGET(:,:,ILES) = XLES_BU_RES_KE(:,:,NLES_MISC) & + XLES_BU_RES_KE(:,:,NLES_CURV) @@ -421,7 +452,8 @@ END IF ! ------------------------------ ! ILES=ILES+1 -YSUBTITLE(ILES) = 'RES_RESI' +YFIELDNAMES(ILES) = 'RES_RESI' +YFIELDCOMMENTS(ILES) = 'residual of resolved budget' ! ZLES_BUDGET(:,:,ILES) = 0. DO JLES=ILES_STA+1,ILES-1 @@ -432,13 +464,14 @@ END DO ! ------- ! ! -tzfield%cmnhname = ygroup +tzfield%cmnhname = ygroup !cmnhname will be overwritten by yfieldnames(:) in Les_diachro tzfield%cstdname = '' -tzfield%clongname = ygroup -tzfield%ccomment = 'resolved KE budget' +tzfield%clongname = ygroup !clongname will be overwritten by yfieldnames(:) in Les_diachro +tzfield%ccomment = 'resolved KE budget' !ccomment will be completed with yfieldnames(:) in Les_diachro tzfield%cunits = 'm2 s-3' -call Les_diachro( tpdiafile, tzfield, gdoavg, gdonorm, zles_budget(:, :, :iles), hsuffixes = ysubtitle(:iles) ) +call Les_diachro( tpdiafile, tzfield, ygroup, ygroupcomment, gdoavg, gdonorm, zles_budget(:, :, :iles), & + hfieldnames = yfieldnames(:iles), hfieldcomments = yfieldcomments(:iles) ) !------------------------------------------------------------------------------- ! @@ -446,16 +479,18 @@ call Les_diachro( tpdiafile, tzfield, gdoavg, gdonorm, zles_budget(:, :, :iles), !* 2. temperature variance budget ! --------------------------- ! -YGROUP= 'BU_THL2' +ygroup = 'BU_THL2' +ygroupcomment = 'Temperature variance budget' ILES=0 ! ILES_STA=ILES ! -!* 2.1 production by mean gradients +!* 2.1 dynamic production by mean gradients ! ---------------------------- ! ILES=ILES+1 -YSUBTITLE(ILES) = 'SBG_DP_M' +YFIELDNAMES(ILES) = 'SBG_DP_M' +YFIELDCOMMENTS(ILES) = 'subgrid dynamic production by mean gradient' ILES_P1=ILES ! ZLES_BUDGET(:,:,ILES)= - 2. * XLES_SUBGRID_WThl(:,:,1) * XLES_MEAN_dThldz(:,:,1) @@ -466,7 +501,8 @@ ZLES_BUDGET(:,:,ILES)= - 2. * XLES_SUBGRID_WThl(:,:,1) * XLES_MEAN_dThldz(:,:,1) ! IF ( ANY(XLES_SUBGRID_WThl2(:,:,1)/= 0.) ) THEN ILES=ILES+1 -YSUBTITLE(ILES) = 'SBG_TR' +YFIELDNAMES(ILES) = 'SBG_TR' +YFIELDCOMMENTS(ILES) = 'subgrid turbulent transport' ! DO JK=2,NLES_K-1 ZLES_BUDGET(JK,:,ILES) = - ( XLES_SUBGRID_WThl2 (JK+1,:,1) & @@ -483,7 +519,8 @@ END IF ! -------------------------------- ! ILES=ILES+1 -YSUBTITLE(ILES) = 'SBG_DP_R' +YFIELDNAMES(ILES) = 'SBG_DP_R' +YFIELDCOMMENTS(ILES) = 'subgrid dynamic production by resolved fluctuations' ILES_P2=ILES ! ZLES_BUDGET(:,:,ILES)= - 2. * XLES_RES_ddxa_Thl_SBG_UaThl(:,:,1) & @@ -494,7 +531,8 @@ ZLES_BUDGET(:,:,ILES)= - 2. * XLES_RES_ddxa_Thl_SBG_UaThl(:,:,1) & ! ----------- ! ILES=ILES+1 -YSUBTITLE(ILES) = 'SBG_DISS' +YFIELDNAMES(ILES) = 'SBG_DISS' +YFIELDCOMMENTS(ILES) = 'subgrid dissipation' ! ZLES_BUDGET(:,:,ILES) = XLES_SUBGRID_DISS_Thl2(:,:,1) ! @@ -503,7 +541,8 @@ ZLES_BUDGET(:,:,ILES) = XLES_SUBGRID_DISS_Thl2(:,:,1) ! -------------------------- ! ILES=ILES+1 -YSUBTITLE(ILES) = 'SBG_RESI' +YFIELDNAMES(ILES) = 'SBG_RESI' +YFIELDCOMMENTS(ILES) = 'residual of subgrid budget' ! ZLES_BUDGET(:,:,ILES) = 0. DO JLES=ILES_STA+1,ILES-1 @@ -516,7 +555,8 @@ ILES_STA=ILES ! -------- ! ILES=ILES+1 -YSUBTITLE(ILES) = 'RES_TEND' +YFIELDNAMES(ILES) = 'RES_TEND' +YFIELDCOMMENTS(ILES) = 'resolved tendency' ! ZLES_BUDGET(:,:,ILES) = XLES_BU_RES_Thl2(:,:,NLES_TEND) ! @@ -526,7 +566,8 @@ ZLES_BUDGET(:,:,ILES) = XLES_BU_RES_Thl2(:,:,NLES_TEND) ! IF ( ANY(XLES_BU_RES_Thl2(:,:,NLES_ADVM)/= 0.) ) THEN ILES=ILES+1 -YSUBTITLE(ILES) = 'RES_ADV' +YFIELDNAMES(ILES) = 'RES_ADV' +YFIELDCOMMENTS(ILES) = 'resolved advection by mean flow' ! ZLES_BUDGET(:,:,ILES) = XLES_BU_RES_Thl2(:,:,NLES_ADVM) END IF @@ -537,7 +578,8 @@ END IF ! IF ( ANY(XLES_BU_RES_Thl2(:,:,NLES_FORC)/= 0.) ) THEN ILES=ILES+1 -YSUBTITLE(ILES) = 'RES_FORC' +YFIELDNAMES(ILES) = 'RES_FORC' +YFIELDCOMMENTS(ILES) = 'resolved advection by large-scale W forcing' ! ZLES_BUDGET(:,:,ILES) = XLES_BU_RES_Thl2(:,:,NLES_FORC) END IF @@ -547,7 +589,8 @@ END IF ! ---------- ! ILES=ILES+1 -YSUBTITLE(ILES) = 'RES_DP' +YFIELDNAMES(ILES) = 'RES_DP' +YFIELDCOMMENTS(ILES) = 'resolved dynamic production by mean gradient' ! ZLES_BUDGET(:,:,ILES) = XLES_BU_RES_Thl2(:,:,NLES_DP) @@ -556,7 +599,8 @@ ZLES_BUDGET(:,:,ILES) = XLES_BU_RES_Thl2(:,:,NLES_DP) ! ------------------- ! ILES=ILES+1 -YSUBTITLE(ILES) = 'RES_TR' +YFIELDNAMES(ILES) = 'RES_TR' +YFIELDCOMMENTS(ILES) = 'turbulent transport of resolved flux by itself' ! ZLES_BUDGET(:,:,ILES) = XLES_BU_RES_Thl2(:,:,NLES_TR) ! @@ -565,7 +609,8 @@ ZLES_BUDGET(:,:,ILES) = XLES_BU_RES_Thl2(:,:,NLES_TR) ! ---------------------------------------------------- ! ILES=ILES+1 -YSUBTITLE(ILES) = 'RES_SBGT' +YFIELDNAMES(ILES) = 'RES_SBGT' +YFIELDCOMMENTS(ILES) = 'resolved sink due to subgrid turbulence' ! ZLES_BUDGET(:,:,ILES) = XLES_BU_RES_Thl2(:,:,NLES_VTURB) + XLES_BU_RES_Thl2(:,:,NLES_HTURB) ! @@ -574,7 +619,8 @@ ZLES_BUDGET(:,:,ILES) = XLES_BU_RES_Thl2(:,:,NLES_VTURB) + XLES_BU_RES_Thl2(:,:, ! IF ( ANY(XLES_BU_RES_Thl2(:,:,NLES_DIFF)/= 0.) ) THEN ILES=ILES+1 -YSUBTITLE(ILES) = 'RES_NUMD' +YFIELDNAMES(ILES) = 'RES_NUMD' +YFIELDCOMMENTS(ILES) = 'resolved numerical diffusion' ! ZLES_BUDGET(:,:,ILES) = XLES_BU_RES_Thl2(:,:,NLES_DIFF) END IF @@ -584,7 +630,8 @@ END IF ! IF ( ANY(XLES_BU_RES_Thl2(:,:,NLES_RELA)/= 0.) ) THEN ILES=ILES+1 -YSUBTITLE(ILES) = 'RES_RELA' +YFIELDNAMES(ILES) = 'RES_RELA' +YFIELDCOMMENTS(ILES) = 'resolved sponge layer relaxation' ! ZLES_BUDGET(:,:,ILES) = XLES_BU_RES_Thl2(:,:,NLES_RELA) END IF @@ -594,7 +641,8 @@ END IF ! IF ( ANY(XLES_BU_RES_Thl2(:,:,NLES_NEST)/= 0.) ) THEN ILES=ILES+1 -YSUBTITLE(ILES) = 'RES_NEST' +YFIELDNAMES(ILES) = 'RES_NEST' +YFIELDCOMMENTS(ILES) = 'resolved average from smaller nested models' ! ZLES_BUDGET(:,:,ILES) = XLES_BU_RES_Thl2(:,:,NLES_NEST) END IF @@ -607,7 +655,8 @@ IF ( ANY( XLES_BU_RES_Thl2(:,:,NLES_MISC) & +XLES_BU_RES_Thl2(:,:,NLES_MICR) & + XLES_BU_RES_Thl2(:,:,NLES_PREF) /= 0.) ) THEN ILES=ILES+1 -YSUBTITLE(ILES) = 'RES_MISC' +YFIELDNAMES(ILES) = 'RES_MISC' +YFIELDCOMMENTS(ILES) = 'resolved: other effects' ! ZLES_BUDGET(:,:,ILES) = XLES_BU_RES_Thl2(:,:,NLES_MISC) & + XLES_BU_RES_Thl2(:,:,NLES_RAD ) & @@ -620,7 +669,8 @@ END IF ! --------------------------- ! ILES=ILES+1 -YSUBTITLE(ILES) = 'RES_RESI' +YFIELDNAMES(ILES) = 'RES_RESI' +YFIELDCOMMENTS(ILES) = 'residual of resolved budget' ! ZLES_BUDGET(:,:,ILES) = 0. DO JLES=ILES_STA+1,ILES-1 @@ -631,7 +681,8 @@ END DO ! ------------------------ ! ILES=ILES+1 -YSUBTITLE(ILES) = 'NSG_TEND' +YFIELDNAMES(ILES) = 'NSG_TEND' +YFIELDCOMMENTS(ILES) = 'neglected tendency' ! ZLES_BUDGET(:,:,ILES) = 0. IF (NLES_TIMES>2) THEN @@ -650,7 +701,8 @@ END IF ! ---------------------------------------------- ! ILES=ILES+1 -YSUBTITLE(ILES) = 'NSG_ADVM' +YFIELDNAMES(ILES) = 'NSG_ADVM' +YFIELDCOMMENTS(ILES) = 'neglected advection by mean flow' ! DO JK=2,NLES_K-1 ZLES_BUDGET(JK,:,ILES)= -XLES_MEAN_W(JK,:,1) & @@ -667,7 +719,8 @@ ZLES_BUDGET(NLES_K,:,ILES) = ZLES_BUDGET(NLES_K-1,:,ILES) ! ---------------------------------------------- ! ILES=ILES+1 -YSUBTITLE(ILES) = 'NSG_ADVR' +YFIELDNAMES(ILES) = 'NSG_ADVR' +YFIELDCOMMENTS(ILES) = 'neglected advection by resolved flow' ! DO JK=2,NLES_K-1 ZLES_BUDGET(JK,:,ILES)= - ( XLES_RES_W_SBG_Thl2 (JK+1,:,1) & @@ -684,29 +737,32 @@ ZLES_BUDGET(NLES_K,:,ILES) = ZLES_BUDGET(NLES_K-1,:,ILES) ! ------- ! ! -tzfield%cmnhname = ygroup +tzfield%cmnhname = ygroup !cmnhname will be overwritten by yfieldnames(:) in Les_diachro tzfield%cstdname = '' -tzfield%clongname = ygroup -tzfield%ccomment = 'thetal variance budget' +tzfield%clongname = ygroup !clongname will be overwritten by yfieldnames(:) in Les_diachro +tzfield%ccomment = 'thetal variance budget' !ccomment will be completed with yfieldnames(:) in Les_diachro tzfield%cunits = 'K2 s-1' -call Les_diachro( tpdiafile, tzfield, gdoavg, gdonorm, zles_budget(:, :, :iles), hsuffixes = ysubtitle(:iles) ) +call Les_diachro( tpdiafile, tzfield, ygroup, ygroupcomment, gdoavg, gdonorm, zles_budget(:, :, :iles), & + hfieldnames = yfieldnames(:iles), hfieldcomments = yfieldcomments(:iles) ) !------------------------------------------------------------------------------- ! !* 3. temperature flux budget ! --------------------- ! -YGROUP= 'BU_WTHL' +ygroup = 'BU_WTHL' +ygroupcomment = 'Temperature flux budget' ILES=0 ! ILES_STA=ILES ! -!* 3.1 production by mean gradients +!* 3.1 dynamic production by mean gradients ! ----------------------------- ! ILES=ILES+1 -YSUBTITLE(ILES) = 'SBG_DP_M' +YFIELDNAMES(ILES) = 'SBG_DP_M' +YFIELDCOMMENTS(ILES) = 'subgrid dynamic production by mean gradient' ILES_P1=ILES ! ZLES_BUDGET(:,:,ILES) = - XLES_SUBGRID_W2(:,:,1) * XLES_MEAN_dThldz(:,:,1) @@ -716,7 +772,8 @@ ZLES_BUDGET(:,:,ILES) = - XLES_SUBGRID_W2(:,:,1) * XLES_MEAN_dThldz(:,:,1) ! ------------------------------------------- ! ILES=ILES+1 -YSUBTITLE(ILES) = 'SBG_DP_R' +YFIELDNAMES(ILES) = 'SBG_DP_R' +YFIELDCOMMENTS(ILES) = 'subgrid dynamic production by resolved fluctuations' ! ZLES_BUDGET(:,:,ILES)=- XLES_RES_ddz_Thl_SBG_W2(:,:,1) & - ZLES_BUDGET(:,:,ILES_P1) @@ -727,7 +784,8 @@ ZLES_BUDGET(:,:,ILES)=- XLES_RES_ddz_Thl_SBG_W2(:,:,1) & ! IF ( ANY(XLES_SUBGRID_W2Thl(:,:,1)/= 0.) ) THEN ILES=ILES+1 -YSUBTITLE(ILES) = 'SBG_TR' +YFIELDNAMES(ILES) = 'SBG_TR' +YFIELDCOMMENTS(ILES) = 'subgrid turbulent transport' ! DO JK=2,NLES_K-1 ZLES_BUDGET(JK,:,ILES) = - ( XLES_SUBGRID_W2Thl (JK+1,:,1) & @@ -746,7 +804,8 @@ END IF ! IF ( ANY(XLES_SUBGRID_ThlPz(:,:,1)/= 0.) ) THEN ILES=ILES+1 -YSUBTITLE(ILES) = 'SBG_PRES' +YFIELDNAMES(ILES) = 'SBG_PRES' +YFIELDCOMMENTS(ILES) = 'subgrid pressure-correlation' ! ZLES_BUDGET(:,:,ILES) = XLES_SUBGRID_ThlPz(:,:,1) END IF @@ -756,7 +815,8 @@ END IF ! ------------------ ! ILES=ILES+1 -YSUBTITLE(ILES) = 'SBG_TP' +YFIELDNAMES(ILES) = 'SBG_TP' +YFIELDCOMMENTS(ILES) = 'subgrid thermal production' ! IF (LUSERV) THEN ZLES_BUDGET(:,:,ILEs) = XG * XLES_SUBGRID_ThlThv(:,:,1) & @@ -773,7 +833,8 @@ END IF ! -------------------------- ! ILES=ILES+1 -YSUBTITLE(ILES) = 'SBG_RESI' +YFIELDNAMES(ILES) = 'SBG_RESI' +YFIELDCOMMENTS(ILES) = 'residual of subgrid budget' ! ZLES_BUDGET(:,:,ILES) = 0. DO JLES=ILES_STA+1,ILES-1 @@ -786,7 +847,8 @@ ILES_STA=ILES ! -------- ! ILES=ILES+1 -YSUBTITLE(ILES) = 'RES_TEND' +YFIELDNAMES(ILES) = 'RES_TEND' +YFIELDCOMMENTS(ILES) = 'resolved tendency' ! ZLES_BUDGET(:,:,ILES) = XLES_BU_RES_WThl(:,:,NLES_TEND) ! @@ -795,7 +857,8 @@ ZLES_BUDGET(:,:,ILES) = XLES_BU_RES_WThl(:,:,NLES_TEND) ! IF ( ANY(XLES_BU_RES_WThl(:,:,NLES_ADVM)/= 0.) ) THEN ILES=ILES+1 -YSUBTITLE(ILES) = 'RES_ADV' +YFIELDNAMES(ILES) = 'RES_ADV' +YFIELDCOMMENTS(ILES) = 'resolved advection by mean flow' ! ZLES_BUDGET(:,:,ILES) = XLES_BU_RES_WThl(:,:,NLES_ADVM) END IF @@ -805,7 +868,8 @@ END IF ! IF ( ANY(XLES_BU_RES_WThl(:,:,NLES_FORC)/= 0.) ) THEN ILES=ILES+1 -YSUBTITLE(ILES) = 'RES_FORC' +YFIELDNAMES(ILES) = 'RES_FORC' +YFIELDCOMMENTS(ILES) = 'resolved advection by large-scale W forcing' ! ZLES_BUDGET(:,:,ILES) = XLES_BU_RES_WThl(:,:,NLES_FORC) END IF @@ -815,7 +879,8 @@ END IF ! ---------------------------------- ! ILES=ILES+1 -YSUBTITLE(ILES) = 'RES_DP' +YFIELDNAMES(ILES) = 'RES_DP' +YFIELDCOMMENTS(ILES) = 'resolved dynamic production by mean gradient' ! ZLES_BUDGET(:,:,ILES) = XLES_BU_RES_WThl(:,:,NLES_DP) ! @@ -823,7 +888,8 @@ ZLES_BUDGET(:,:,ILES) = XLES_BU_RES_WThl(:,:,NLES_DP) ! ------------------- ! ILES=ILES+1 -YSUBTITLE(ILES) = 'RES_TR' +YFIELDNAMES(ILES) = 'RES_TR' +YFIELDCOMMENTS(ILES) = 'turbulent transport of resolved flux by itself' ! ZLES_BUDGET(:,:,ILES) = XLES_BU_RES_WThl(:,:,NLES_TR) ! @@ -832,7 +898,8 @@ ZLES_BUDGET(:,:,ILES) = XLES_BU_RES_WThl(:,:,NLES_TR) ! ------------------- ! ILES=ILES+1 -YSUBTITLE(ILES) = 'RES_PRES' +YFIELDNAMES(ILES) = 'RES_PRES' +YFIELDCOMMENTS(ILES) = 'resolved pressure-correlation' ! ZLES_BUDGET(:,:,ILES) = XLES_BU_RES_WThl(:,:,NLES_PRES) ! @@ -841,7 +908,8 @@ ZLES_BUDGET(:,:,ILES) = XLES_BU_RES_WThl(:,:,NLES_PRES) ! ------------------ ! ILES=ILES+1 -YSUBTITLE(ILES) = 'RES_TP' +YFIELDNAMES(ILES) = 'RES_TP' +YFIELDCOMMENTS(ILES) = 'resolved thermal production' ! ZLES_BUDGET(:,:,ILES) = XLES_BU_RES_WThl(:,:,NLES_GRAV) ! @@ -850,7 +918,8 @@ ZLES_BUDGET(:,:,ILES) = XLES_BU_RES_WThl(:,:,NLES_GRAV) ! ---------------------------------------------------- ! ILES=ILES+1 -YSUBTITLE(ILES) = 'RES_SBGT' +YFIELDNAMES(ILES) = 'RES_SBGT' +YFIELDCOMMENTS(ILES) = 'resolved sink due to subgrid turbulence' ! ZLES_BUDGET(:,:,ILES) = XLES_BU_RES_WThl(:,:,NLES_VTURB) + XLES_BU_RES_WThl(:,:,NLES_HTURB) ! @@ -859,7 +928,8 @@ ZLES_BUDGET(:,:,ILES) = XLES_BU_RES_WThl(:,:,NLES_VTURB) + XLES_BU_RES_WThl(:,:, ! IF ( ANY(XLES_BU_RES_WThl(:,:,NLES_COR)/= 0.) ) THEN ILES=ILES+1 -YSUBTITLE(ILES) = 'RES_CORI' +YFIELDNAMES(ILES) = 'RES_CORI' +YFIELDCOMMENTS(ILES) = 'resolved Coriolis effect' ! ZLES_BUDGET(:,:,ILES) = XLES_BU_RES_WThl(:,:,NLES_COR) END IF @@ -869,7 +939,8 @@ END IF ! IF ( ANY(XLES_BU_RES_WThl(:,:,NLES_DIFF)/= 0.) ) THEN ILES=ILES+1 -YSUBTITLE(ILES) = 'RES_NUMD' +YFIELDNAMES(ILES) = 'RES_NUMD' +YFIELDCOMMENTS(ILES) = 'resolved numerical diffusion' ! ZLES_BUDGET(:,:,ILES) = XLES_BU_RES_WThl(:,:,NLES_DIFF) END IF @@ -879,7 +950,8 @@ END IF ! IF ( ANY(XLES_BU_RES_WThl(:,:,NLES_RELA)/= 0.) ) THEN ILES=ILES+1 -YSUBTITLE(ILES) = 'RES_RELA' +YFIELDNAMES(ILES) = 'RES_RELA' +YFIELDCOMMENTS(ILES) = 'resolved sponge layer relaxation' ! ZLES_BUDGET(:,:,ILES) = XLES_BU_RES_WThl(:,:,NLES_RELA) END IF @@ -889,7 +961,8 @@ END IF ! IF ( ANY(XLES_BU_RES_WThl(:,:,NLES_NEST)/= 0.) ) THEN ILES=ILES+1 -YSUBTITLE(ILES) = 'RES_NEST' +YFIELDNAMES(ILES) = 'RES_NEST' +YFIELDCOMMENTS(ILES) = 'resolved average from smaller nested models' ! ZLES_BUDGET(:,:,ILES) = XLES_BU_RES_WThl(:,:,NLES_NEST) END IF @@ -903,7 +976,8 @@ IF ( ANY( XLES_BU_RES_WThl(:,:,NLES_MISC) & +XLES_BU_RES_WThl(:,:,NLES_PREF) & +XLES_BU_RES_WThl(:,:,NLES_CURV) /= 0.) ) THEN ILES=ILES+1 -YSUBTITLE(ILES) = 'RES_MISC' +YFIELDNAMES(ILES) = 'RES_MISC' +YFIELDCOMMENTS(ILES) = 'resolved: other effects' ! ZLES_BUDGET(:,:,ILES) = XLES_BU_RES_WThl(:,:,NLES_MISC) & + XLES_BU_RES_WThl(:,:,NLES_RAD ) & @@ -917,7 +991,8 @@ END IF ! -------------------------------- ! ILES=ILES+1 -YSUBTITLE(ILES) = 'RES_RESI' +YFIELDNAMES(ILES) = 'RES_RESI' +YFIELDCOMMENTS(ILES) = 'residual of resolved budget' ! ZLES_BUDGET(:,:,ILES) = 0. DO JLES=ILES_STA+1,ILES-1 @@ -928,7 +1003,8 @@ END DO ! ------------------------ ! ILES=ILES+1 -YSUBTITLE(ILES) = 'NSG_TEND' +YFIELDNAMES(ILES) = 'NSG_TEND' +YFIELDCOMMENTS(ILES) = 'neglected tendency' ! ZLES_BUDGET(:,:,ILES) = 0. IF (NLES_TIMES>2) THEN @@ -949,7 +1025,8 @@ END IF ! ------------------------------------------------ ! ILES=ILES+1 -YSUBTITLE(ILES) = 'NSG_ADVM' +YFIELDNAMES(ILES) = 'NSG_ADVM' +YFIELDCOMMENTS(ILES) = 'neglected advection by mean flow' ! DO JK=2,NLES_K-1 ZLES_BUDGET(JK,:,ILES)= - XLES_MEAN_W(JK,:,1) & @@ -966,7 +1043,8 @@ ZLES_BUDGET(NLES_K,:,ILES) = ZLES_BUDGET(NLES_K-1,:,ILES) ! ------------------------------------------------ ! ILES=ILES+1 -YSUBTITLE(ILES) = 'NSG_ADVR' +YFIELDNAMES(ILES) = 'NSG_ADVR' +YFIELDCOMMENTS(ILES) = 'neglected advection by resolved flow' ! DO JK=2,NLES_K-1 ZLES_BUDGET(JK,:,ILES)= - ( XLES_RES_W_SBG_WThl(JK+1,:,1) & @@ -982,7 +1060,8 @@ ZLES_BUDGET(NLES_K,:,ILES) = ZLES_BUDGET(NLES_K-1,:,ILES) ! ---------------------------------------------------------------------------------- ! ILES=ILES+1 -YSUBTITLE(ILES) = 'NSG_DPGW' +YFIELDNAMES(ILES) = 'NSG_DPGW' +YFIELDCOMMENTS(ILES) = 'neglected production by gradient of vertical velocity for subgrid quantity' ! ZLES_BUDGET(:,:,ILES)=- XLES_RES_ddxa_W_SBG_UaThl(:,:,1) ! @@ -991,7 +1070,8 @@ ZLES_BUDGET(:,:,ILES)=- XLES_RES_ddxa_W_SBG_UaThl(:,:,1) ! ------------------------------------------------------------------------- ! ILES=ILES+1 -YSUBTITLE(ILES) = 'NSG_DPGT' +YFIELDNAMES(ILES) = 'NSG_DPGT' +YFIELDCOMMENTS(ILES) = 'neglected production by horizontal gradient of Thl for subgrid quantity' ! ZLES_BUDGET(:,:,ILES)=-XLES_RES_ddxa_Thl_SBG_UaW(:,:,1) & -ZLES_BUDGET(:,:,ILES_P1) -ZLES_BUDGET(:,:,ILES_P2) @@ -1002,13 +1082,14 @@ ZLES_BUDGET(:,:,ILES)=-XLES_RES_ddxa_Thl_SBG_UaW(:,:,1) & ! ------- ! ! -tzfield%cmnhname = ygroup +tzfield%cmnhname = ygroup !cmnhname will be overwritten by yfieldnames(:) in Les_diachro tzfield%cstdname = '' -tzfield%clongname = ygroup -tzfield%ccomment = 'thetal flux budget' +tzfield%clongname = ygroup !clongname will be overwritten by yfieldnames(:) in Les_diachro +tzfield%ccomment = 'thetal flux budget' !ccomment will be completed with yfieldnames(:) in Les_diachro tzfield%cunits = 'm K s-2' -call Les_diachro( tpdiafile, tzfield, gdoavg, gdonorm, zles_budget(:, :, :iles), hsuffixes = ysubtitle(:iles) ) +call Les_diachro( tpdiafile, tzfield, ygroup, ygroupcomment, gdoavg, gdonorm, zles_budget(:, :, :iles), & + hfieldnames = yfieldnames(:iles), hfieldcomments = yfieldcomments(:iles) ) !------------------------------------------------------------------------------- ! diff --git a/src/MNH/write_les_rt_budgetn.f90 b/src/MNH/write_les_rt_budgetn.f90 index e2cb0096113e8b44e841339a15fc495dd93453bd..114d39cda70bc47d713bcfbddc3f550c9a27d491 100644 --- a/src/MNH/write_les_rt_budgetn.f90 +++ b/src/MNH/write_les_rt_budgetn.f90 @@ -91,8 +91,10 @@ INTEGER :: ILES_P1, ILES_P2 INTEGER :: JK ! vertical loop counter INTEGER :: JT ! temporal loop counter ! -CHARACTER(len=9), DIMENSION(NMAX_ILES) :: YSUBTITLE -CHARACTER(len=8) :: YGROUP +CHARACTER(len=9), DIMENSION(NMAX_ILES) :: YFIELDNAMES +CHARACTER(len=100), DIMENSION(NMAX_ILES) :: YFIELDCOMMENTS +character(len=:), allocatable :: ygroup +character(len=:), allocatable :: ygroupcomment ! REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZLES_BUDGET ! @@ -125,16 +127,18 @@ gdonorm = Trim( cles_norm_type ) /= 'NONE' ! --------------------------- ! ! -YGROUP= 'BU_RT2' +ygroup = 'BU_RT2' +ygroupcomment = 'Total water variance budget' ILES=0 ILES_STA=ILES ! ! -!* 2.1 production by mean gradients +!* 2.1 dynamic production by mean gradients ! ---------------------------- ! ILES=ILES+1 -YSUBTITLE(ILES) = 'SBG_DP_M' +YFIELDNAMES(ILES) = 'SBG_DP_M' +YFIELDCOMMENTS(ILES) = 'subgrid dynamic production by mean gradient' ILES_P1=ILES ! ZLES_BUDGET(:,:,ILES)= - 2. * XLES_SUBGRID_WRt(:,:,1) * XLES_MEAN_dRtdz(:,:,1) @@ -144,7 +148,8 @@ ZLES_BUDGET(:,:,ILES)= - 2. * XLES_SUBGRID_WRt(:,:,1) * XLES_MEAN_dRtdz(:,:,1) ! -------------------------------- ! ILES=ILES+1 -YSUBTITLE(ILES) = 'SBG_DP_R' +YFIELDNAMES(ILES) = 'SBG_DP_R' +YFIELDCOMMENTS(ILES) = 'subgrid dynamic production by resolved fluctuations' ! ZLES_BUDGET(:,:,ILES)= - 2. * XLES_RES_ddxa_Rt_SBG_UaRt(:,:,1) & - ZLES_BUDGET(:,:,ILES_P1) @@ -155,7 +160,8 @@ ZLES_BUDGET(:,:,ILES)= - 2. * XLES_RES_ddxa_Rt_SBG_UaRt(:,:,1) & ! IF ( ANY(XLES_SUBGRID_WRt2(:,:,1)/= 0.) ) THEN ILES=ILES+1 -YSUBTITLE(ILES) = 'SBG_TR' +YFIELDNAMES(ILES) = 'SBG_TR' +YFIELDCOMMENTS(ILES) = 'subgrid turbulent transport' ! DO JK=2,NLES_K-1 ZLES_BUDGET(JK,:,ILES) = - ( XLES_SUBGRID_WRt2 (JK+1,:,1) & @@ -172,7 +178,8 @@ END IF ! ----------- ! ILES=ILES+1 -YSUBTITLE(ILES) = 'SBG_DISS' +YFIELDNAMES(ILES) = 'SBG_DISS' +YFIELDCOMMENTS(ILES) = 'subgrid dissipation' ! ZLES_BUDGET(:,:,ILES) = XLES_SUBGRID_DISS_Rt2(:,:,1) ! @@ -181,7 +188,8 @@ ZLES_BUDGET(:,:,ILES) = XLES_SUBGRID_DISS_Rt2(:,:,1) ! -------------------------- ! ILES=ILES+1 -YSUBTITLE(ILES) = 'SBG_RESI' +YFIELDNAMES(ILES) = 'SBG_RESI' +YFIELDCOMMENTS(ILES) = 'residual of subgrid budget' ! ZLES_BUDGET(:,:,ILES) = 0. DO JLES=ILES_STA+1,ILES-1 @@ -194,7 +202,8 @@ ILES_STA=ILES ! -------- ! ILES=ILES+1 -YSUBTITLE(ILES) = 'RES_TEND' +YFIELDNAMES(ILES) = 'RES_TEND' +YFIELDCOMMENTS(ILES) = 'resolved tendency' ! ZLES_BUDGET(:,:,ILES) = XLES_BU_RES_Rt2(:,:,NLES_TEND) ! @@ -204,7 +213,8 @@ ZLES_BUDGET(:,:,ILES) = XLES_BU_RES_Rt2(:,:,NLES_TEND) ! IF ( ANY(XLES_BU_RES_Rt2(:,:,NLES_ADVM)/= 0.) ) THEN ILES=ILES+1 -YSUBTITLE(ILES) = 'RES_ADV' +YFIELDNAMES(ILES) = 'RES_ADV' +YFIELDCOMMENTS(ILES) = 'resolved advection by mean flow' ! ZLES_BUDGET(:,:,ILES) = XLES_BU_RES_Rt2(:,:,NLES_ADVM) END IF @@ -214,7 +224,8 @@ END IF ! IF ( ANY(XLES_BU_RES_Rt2(:,:,NLES_FORC)/= 0.) ) THEN ILES=ILES+1 -YSUBTITLE(ILES) = 'RES_FORC' +YFIELDNAMES(ILES) = 'RES_FORC' +YFIELDCOMMENTS(ILES) = 'resolved advection by large-scale W forcing' ! ZLES_BUDGET(:,:,ILES) = XLES_BU_RES_Rt2(:,:,NLES_FORC) END IF @@ -224,7 +235,8 @@ END IF ! ---------- ! ILES=ILES+1 -YSUBTITLE(ILES) = 'RES_DP' +YFIELDNAMES(ILES) = 'RES_DP' +YFIELDCOMMENTS(ILES) = 'resolved dynamic production by mean gradient' ! ZLES_BUDGET(:,:,ILES) = XLES_BU_RES_Rt2(:,:,NLES_DP) @@ -233,7 +245,8 @@ ZLES_BUDGET(:,:,ILES) = XLES_BU_RES_Rt2(:,:,NLES_DP) ! ------------------- ! ILES=ILES+1 -YSUBTITLE(ILES) = 'RES_TR' +YFIELDNAMES(ILES) = 'RES_TR' +YFIELDCOMMENTS(ILES) = 'turbulent transport of resolved flux by itself' ! ZLES_BUDGET(:,:,ILES) = XLES_BU_RES_Rt2(:,:,NLES_TR) ! @@ -242,7 +255,8 @@ ZLES_BUDGET(:,:,ILES) = XLES_BU_RES_Rt2(:,:,NLES_TR) ! ---------------------------------------------------- ! ILES=ILES+1 -YSUBTITLE(ILES) = 'RES_SBGT' +YFIELDNAMES(ILES) = 'RES_SBGT' +YFIELDCOMMENTS(ILES) = 'resolved sink due to subgrid turbulence' ! ZLES_BUDGET(:,:,ILES) = XLES_BU_RES_Rt2(:,:,NLES_VTURB) + XLES_BU_RES_Rt2(:,:,NLES_HTURB) ! @@ -252,7 +266,8 @@ ZLES_BUDGET(:,:,ILES) = XLES_BU_RES_Rt2(:,:,NLES_VTURB) + XLES_BU_RES_Rt2(:,:,NL ! IF ( ANY(XLES_BU_RES_Rt2(:,:,NLES_DIFF)/= 0.) ) THEN ILES=ILES+1 -YSUBTITLE(ILES) = 'RES_NUMD' +YFIELDNAMES(ILES) = 'RES_NUMD' +YFIELDCOMMENTS(ILES) = 'resolved numerical diffusion' ! ZLES_BUDGET(:,:,ILES) = XLES_BU_RES_Rt2(:,:,NLES_DIFF) END IF @@ -262,7 +277,8 @@ END IF ! IF ( ANY(XLES_BU_RES_Rt2(:,:,NLES_RELA)/= 0.) ) THEN ILES=ILES+1 -YSUBTITLE(ILES) = 'RES_RELA' +YFIELDNAMES(ILES) = 'RES_RELA' +YFIELDCOMMENTS(ILES) = 'resolved sponge layer relaxation' ! ZLES_BUDGET(:,:,ILES) = XLES_BU_RES_Rt2(:,:,NLES_RELA) END IF @@ -272,7 +288,8 @@ END IF ! IF ( ANY(XLES_BU_RES_Rt2(:,:,NLES_NEST)/= 0.) ) THEN ILES=ILES+1 -YSUBTITLE(ILES) = 'RES_NEST' +YFIELDNAMES(ILES) = 'RES_NEST' +YFIELDCOMMENTS(ILES) = 'resolved average from smaller nested models' ! ZLES_BUDGET(:,:,ILES) = XLES_BU_RES_Rt2(:,:,NLES_NEST) END IF @@ -283,7 +300,8 @@ END IF IF ( ANY( XLES_BU_RES_Rt2(:,:,NLES_MISC) & +XLES_BU_RES_Rt2(:,:,NLES_MICR)/= 0.) ) THEN ILES=ILES+1 -YSUBTITLE(ILES) = 'RES_MISC' +YFIELDNAMES(ILES) = 'RES_MISC' +YFIELDCOMMENTS(ILES) = 'resolved: other effects' ! ZLES_BUDGET(:,:,ILES) = XLES_BU_RES_Rt2(:,:,NLES_MISC) & + XLES_BU_RES_Rt2(:,:,NLES_MICR) @@ -294,7 +312,8 @@ END IF ! --------------------------- ! ILES=ILES+1 -YSUBTITLE(ILES) = 'RES_RESI' +YFIELDNAMES(ILES) = 'RES_RESI' +YFIELDCOMMENTS(ILES) = 'residual of resolved budget' ! ZLES_BUDGET(:,:,ILES) = 0. DO JLES=ILES_STA+1,ILES-1 @@ -305,7 +324,8 @@ END DO ! ------------------------ ! ILES=ILES+1 -YSUBTITLE(ILES) = 'NSG_TEND' +YFIELDNAMES(ILES) = 'NSG_TEND' +YFIELDCOMMENTS(ILES) = 'neglected tendency' ! ZLES_BUDGET(:,:,ILES) = 0. IF (NLES_TIMES>2) THEN @@ -324,7 +344,8 @@ END IF ! ---------------------------------------------- ! ILES=ILES+1 -YSUBTITLE(ILES) = 'NSG_ADVM' +YFIELDNAMES(ILES) = 'NSG_ADVM' +YFIELDCOMMENTS(ILES) = 'neglected advection by mean flow' ! DO JK=2,NLES_K-1 ZLES_BUDGET(JK,:,ILES)= -XLES_MEAN_W(JK,:,1) & @@ -341,7 +362,8 @@ ZLES_BUDGET(NLES_K,:,ILES) = ZLES_BUDGET(NLES_K-1,:,ILES) ! ---------------------------------------------- ! ILES=ILES+1 -YSUBTITLE(ILES) = 'NSG_ADVR' +YFIELDNAMES(ILES) = 'NSG_ADVR' +YFIELDCOMMENTS(ILES) = 'neglected advection by resolved flow' ! DO JK=2,NLES_K-1 ZLES_BUDGET(JK,:,ILES)= - ( XLES_RES_W_SBG_Rt2 (JK+1,:,1) & @@ -357,13 +379,14 @@ ZLES_BUDGET(NLES_K,:,ILES) = ZLES_BUDGET(NLES_K-1,:,ILES) !* 2.16 writing ! ------- ! -tzfield%cmnhname = ygroup +tzfield%cmnhname = ygroup !cmnhname will be overwritten by yfieldnames(:) in Les_diachro tzfield%cstdname = '' -tzfield%clongname = ygroup -tzfield%ccomment = 'Rt variance budget' +tzfield%clongname = ygroup !clongname will be overwritten by yfieldnames(:) in Les_diachro +tzfield%ccomment = 'Rt variance budget' !ccomment will be completed with yfieldnames(:) in Les_diachro tzfield%cunits = 'kg2 kg-2 s-1' -call Les_diachro( tpdiafile, tzfield, gdoavg, gdonorm, zles_budget(:, :, :iles), hsuffixes = ysubtitle(:iles) ) +call Les_diachro( tpdiafile, tzfield, ygroup, ygroupcomment, gdoavg, gdonorm, zles_budget(:, :, :iles), & + hfieldnames = yfieldnames(:iles), hfieldcomments = yfieldcomments(:iles) ) !------------------------------------------------------------------------------- ! @@ -371,15 +394,17 @@ call Les_diachro( tpdiafile, tzfield, gdoavg, gdonorm, zles_budget(:, :, :iles), ! ----------------------- ! ! -YGROUP= 'BU_WRT' +ygroup = 'BU_WRT' +ygroupcomment = 'Total water flux budget' ILES=0 ILES_STA=ILES ! -!* 3.1 production by mean gradients +!* 3.1 dynamic production by mean gradients ! ----------------------------- ! ILES=ILES+1 -YSUBTITLE(ILES) = 'SBG_DP_M' +YFIELDNAMES(ILES) = 'SBG_DP_M' +YFIELDCOMMENTS(ILES) = 'subgrid dynamic production by mean gradient' ILES_P1=ILES ! ZLES_BUDGET(:,:,ILES) = - XLES_SUBGRID_W2(:,:,1) * XLES_MEAN_dRtdz(:,:,1) @@ -389,7 +414,8 @@ ZLES_BUDGET(:,:,ILES) = - XLES_SUBGRID_W2(:,:,1) * XLES_MEAN_dRtdz(:,:,1) ! ------------------------------------------- ! ILES=ILES+1 -YSUBTITLE(2) = 'SBG_DP_R' +YFIELDNAMES(ILES) = 'SBG_DP_R' +YFIELDCOMMENTS(ILES) = 'subgrid dynamic production by resolved fluctuations' ILES_P2=ILES ! ZLES_BUDGET(:,:,ILES)=- XLES_RES_ddz_Rt_SBG_W2(:,:,1) & @@ -402,7 +428,8 @@ ZLES_BUDGET(:,:,ILES)=- XLES_RES_ddz_Rt_SBG_W2(:,:,1) & ! IF ( ANY(XLES_SUBGRID_W2Rt(:,:,1)/= 0.) ) THEN ILES=ILES+1 -YSUBTITLE(ILES) = 'SBG_TR' +YFIELDNAMES(ILES) = 'SBG_TR' +YFIELDCOMMENTS(ILES) = 'subgrid turbulent transport' ! DO JK=2,NLES_K-1 ZLES_BUDGET(JK,:,ILES) = - ( XLES_SUBGRID_W2Rt (JK+1,:,1) & @@ -420,7 +447,8 @@ END IF ! ------------------- ! ILES=ILES+1 -YSUBTITLE(ILES) = 'SBG_PRES' +YFIELDNAMES(ILES) = 'SBG_PRES' +YFIELDCOMMENTS(ILES) = 'subgrid pressure-correlation' ! ZLES_BUDGET(:,:,ILES) = XLES_SUBGRID_RtPz(:,:,1) ! @@ -429,7 +457,8 @@ ZLES_BUDGET(:,:,ILES) = XLES_SUBGRID_RtPz(:,:,1) ! ------------------ ! ILES=ILES+1 -YSUBTITLE(ILES) = 'SBG_TP' +YFIELDNAMES(ILES) = 'SBG_TP' +YFIELDCOMMENTS(ILES) = 'subgrid thermal production' ! ZLES_BUDGET(:,:,ILES) = XG * XLES_SUBGRID_RtThv(:,:,1) & / XLES_MEAN_Thv (:,:,1) @@ -440,7 +469,8 @@ ZLES_BUDGET(:,:,ILES) = XG * XLES_SUBGRID_RtThv(:,:,1) & ! !PW: not in the documentation, but set to 0 anyway ILES=ILES+1 -YSUBTITLE(ILES) = 'SBG_DISS' +YFIELDNAMES(ILES) = 'SBG_DISS' +YFIELDCOMMENTS(ILES) = 'subgrid dissipation' ! ZLES_BUDGET(:,:,ILES) = 0. ! @@ -449,7 +479,8 @@ ZLES_BUDGET(:,:,ILES) = 0. ! -------------------------- ! ILES=ILES+1 -YSUBTITLE(ILES) = 'SBG_RESI' +YFIELDNAMES(ILES) = 'SBG_RESI' +YFIELDCOMMENTS(ILES) = 'residual of subgrid budget' ! ZLES_BUDGET(:,:,ILES) = 0. DO JLES=ILES_STA+1,ILES-1 @@ -462,7 +493,8 @@ ILES_STA=ILES ! -------- ! ILES=ILES+1 -YSUBTITLE(ILES) = 'RES_TEND' +YFIELDNAMES(ILES) = 'RES_TEND' +YFIELDCOMMENTS(ILES) = 'resolved tendency' ! ZLES_BUDGET(:,:,ILES) = XLES_BU_RES_WRt(:,:,NLES_TEND) ! @@ -471,7 +503,8 @@ ZLES_BUDGET(:,:,ILES) = XLES_BU_RES_WRt(:,:,NLES_TEND) ! IF ( ANY(XLES_BU_RES_WRt(:,:,NLES_ADVM)/= 0.) ) THEN ILES=ILES+1 -YSUBTITLE(ILES) = 'RES_ADV' +YFIELDNAMES(ILES) = 'RES_ADV' +YFIELDCOMMENTS(ILES) = 'resolved advection by mean flow' ! ZLES_BUDGET(:,:,ILES) = XLES_BU_RES_WRt(:,:,NLES_ADVM) END IF @@ -481,7 +514,8 @@ END IF ! IF ( ANY(XLES_BU_RES_WRt(:,:,NLES_FORC)/= 0.) ) THEN ILES=ILES+1 -YSUBTITLE(ILES) = 'RES_FORC' +YFIELDNAMES(ILES) = 'RES_FORC' +YFIELDCOMMENTS(ILES) = 'resolved advection by large-scale W forcing' ! ZLES_BUDGET(:,:,ILES) = XLES_BU_RES_WRt(:,:,NLES_FORC) END IF @@ -490,7 +524,8 @@ END IF ! ---------------------------------- ! ILES=ILES+1 -YSUBTITLE(ILES) = 'RES_DP' +YFIELDNAMES(ILES) = 'RES_DP' +YFIELDCOMMENTS(ILES) = 'resolved dynamic production by mean gradient' ! ZLES_BUDGET(:,:,ILES) = XLES_BU_RES_WRt(:,:,NLES_DP) ! @@ -498,7 +533,8 @@ ZLES_BUDGET(:,:,ILES) = XLES_BU_RES_WRt(:,:,NLES_DP) ! ------------------- ! ILES=ILES+1 -YSUBTITLE(ILES) = 'RES_TR' +YFIELDNAMES(ILES) = 'RES_TR' +YFIELDCOMMENTS(ILES) = 'turbulent transport of resolved flux by itself' ! ZLES_BUDGET(:,:,ILES) = XLES_BU_RES_WRt(:,:,NLES_TR) ! @@ -507,7 +543,8 @@ ZLES_BUDGET(:,:,ILES) = XLES_BU_RES_WRt(:,:,NLES_TR) ! ------------------- ! ILES=ILES+1 -YSUBTITLE(ILES) = 'RES_PRES' +YFIELDNAMES(ILES) = 'RES_PRES' +YFIELDCOMMENTS(ILES) = 'resolved pressure-correlation' ! ZLES_BUDGET(:,:,ILES) = XLES_BU_RES_WRt(:,:,NLES_PRES) ! @@ -516,7 +553,8 @@ ZLES_BUDGET(:,:,ILES) = XLES_BU_RES_WRt(:,:,NLES_PRES) ! ------------------ ! ILES=ILES+1 -YSUBTITLE(ILES) = 'RES_TP' +YFIELDNAMES(ILES) = 'RES_TP' +YFIELDCOMMENTS(ILES) = 'resolved thermal production' ! ZLES_BUDGET(:,:,ILES) = XLES_BU_RES_WRt(:,:,NLES_GRAV) ! @@ -525,7 +563,8 @@ ZLES_BUDGET(:,:,ILES) = XLES_BU_RES_WRt(:,:,NLES_GRAV) ! ---------------------------------------------------- ! ILES=ILES+1 -YSUBTITLE(ILES) = 'RES_SBGT' +YFIELDNAMES(ILES) = 'RES_SBGT' +YFIELDCOMMENTS(ILES) = 'resolved sink due to subgrid turbulence' ! ZLES_BUDGET(:,:,ILES) = XLES_BU_RES_WRt(:,:,NLES_VTURB) + XLES_BU_RES_WRt(:,:,NLES_HTURB) ! @@ -534,7 +573,8 @@ ZLES_BUDGET(:,:,ILES) = XLES_BU_RES_WRt(:,:,NLES_VTURB) + XLES_BU_RES_WRt(:,:,NL ! IF ( ANY(XLES_BU_RES_WRt(:,:,NLES_COR)/= 0.) ) THEN ILES=ILES+1 -YSUBTITLE(ILES) = 'RES_CORI' +YFIELDNAMES(ILES) = 'RES_CORI' +YFIELDCOMMENTS(ILES) = 'resolved Coriolis effect' ! ZLES_BUDGET(:,:,ILES) = XLES_BU_RES_WRt(:,:,NLES_COR) END IF @@ -544,7 +584,8 @@ END IF ! IF ( ANY(XLES_BU_RES_WRt(:,:,NLES_DIFF)/= 0.) ) THEN ILES=ILES+1 -YSUBTITLE(ILES) = 'RES_NUMD' +YFIELDNAMES(ILES) = 'RES_NUMD' +YFIELDCOMMENTS(ILES) = 'resolved numerical diffusion' ! ZLES_BUDGET(:,:,ILES) = XLES_BU_RES_WRt(:,:,NLES_DIFF) END IF @@ -554,7 +595,8 @@ END IF ! IF ( ANY(XLES_BU_RES_WRt(:,:,NLES_RELA)/= 0.) ) THEN ILES=ILES+1 -YSUBTITLE(ILES) = 'RES_RELA' +YFIELDNAMES(ILES) = 'RES_RELA' +YFIELDCOMMENTS(ILES) = 'resolved sponge layer relaxation' ! ZLES_BUDGET(:,:,ILES) = XLES_BU_RES_WRt(:,:,NLES_RELA) END IF @@ -564,7 +606,8 @@ END IF ! IF ( ANY(XLES_BU_RES_WRt(:,:,NLES_NEST)/= 0.) ) THEN ILES=ILES+1 -YSUBTITLE(ILES) = 'RES_NEST' +YFIELDNAMES(ILES) = 'RES_NEST' +YFIELDCOMMENTS(ILES) = 'resolved average from smaller nested models' ! ZLES_BUDGET(:,:,ILES) = XLES_BU_RES_WRt(:,:,NLES_NEST) END IF @@ -575,7 +618,8 @@ END IF IF ( ANY( XLES_BU_RES_WRt(:,:,NLES_MISC) & +XLES_BU_RES_WRt(:,:,NLES_MICR) /= 0.) ) THEN ILES=ILES+1 -YSUBTITLE(ILES) = 'RES_MISC' +YFIELDNAMES(ILES) = 'RES_MISC' +YFIELDCOMMENTS(ILES) = 'resolved: other effects' ! ZLES_BUDGET(:,:,ILES) = XLES_BU_RES_WRt(:,:,NLES_MISC) & + XLES_BU_RES_WRt(:,:,NLES_MICR) @@ -585,7 +629,8 @@ END IF ! -------------------------------- ! ILES=ILES+1 -YSUBTITLE(ILES) = 'RES_RESI' +YFIELDNAMES(ILES) = 'RES_RESI' +YFIELDCOMMENTS(ILES) = 'residual of resolved budget' ! ZLES_BUDGET(:,:,ILES) = 0. DO JLES=ILES_STA+1,ILES-1 @@ -596,7 +641,8 @@ END DO ! ------------------------ ! ILES=ILES+1 -YSUBTITLE(ILES) = 'SBG_TEND' +YFIELDNAMES(ILES) = 'NSG_TEND' +YFIELDCOMMENTS(ILES) = 'neglected tendency' ! ZLES_BUDGET(:,:,ILES) = 0. IF (NLES_TIMES>2) THEN @@ -617,7 +663,8 @@ END IF ! ------------------------------------------------ ! ILES=ILES+1 -YSUBTITLE(ILES) = 'NSG_ADVM' +YFIELDNAMES(ILES) = 'NSG_ADVM' +YFIELDCOMMENTS(ILES) = 'neglected advection by mean flow' ! DO JK=2,NLES_K-1 ZLES_BUDGET(JK,:,ILES)= - XLES_MEAN_W(JK,:,1) & @@ -634,7 +681,8 @@ ZLES_BUDGET(NLES_K,:,ILES) = ZLES_BUDGET(NLES_K-1,:,ILES) ! ------------------------------------------------ ! ILES=ILES+1 -YSUBTITLE(ILES) = 'NSG_ADVR' +YFIELDNAMES(ILES) = 'NSG_ADVR' +YFIELDCOMMENTS(ILES) = 'neglected advection by resolved flow' ! DO JK=2,NLES_K-1 ZLES_BUDGET(JK,:,ILES)= - ( XLES_RES_W_SBG_WRt(JK+1,:,1) & @@ -650,7 +698,8 @@ ZLES_BUDGET(NLES_K,:,ILES) = ZLES_BUDGET(NLES_K-1,:,ILES) ! ---------------------------------------------------------------------------------- ! ILES=ILES+1 -YSUBTITLE(ILES) = 'NSG_DPGW' +YFIELDNAMES(ILES) = 'NSG_DPGW' +YFIELDCOMMENTS(ILES) = 'neglected production by gradient of vertical velocity for subgrid quantity' ! ZLES_BUDGET(:,:,ILES)=- XLES_RES_ddxa_W_SBG_UaRt(:,:,1) ! @@ -659,7 +708,8 @@ ZLES_BUDGET(:,:,ILES)=- XLES_RES_ddxa_W_SBG_UaRt(:,:,1) ! ------------------------------------------------------------------------- ! ILES=ILES+1 -YSUBTITLE(ILES) = 'NSG_DPGT' +YFIELDNAMES(ILES) = 'NSG_DPGT' +YFIELDCOMMENTS(ILES) = 'neglected production by horizontal gradient of Thl for subgrid quantity' ! ZLES_BUDGET(:,:,ILES)=-XLES_RES_ddxa_Rt_SBG_UaW(:,:,1) & -ZLES_BUDGET(:,:,ILES_P1) -ZLES_BUDGET(:,:,ILES_P2) @@ -668,13 +718,14 @@ ZLES_BUDGET(:,:,ILES)=-XLES_RES_ddxa_Rt_SBG_UaW(:,:,1) & !* 3.22 writing ! ------- ! -tzfield%cmnhname = ygroup +tzfield%cmnhname = ygroup !cmnhname will be overwritten by yfieldnames(:) in Les_diachro tzfield%cstdname = '' -tzfield%clongname = ygroup -tzfield%ccomment = 'Rt flux budget' +tzfield%clongname = ygroup !clongname will be overwritten by yfieldnames(:) in Les_diachro +tzfield%ccomment = 'Rt flux budget' !ccomment will be completed with yfieldnames(:) in Les_diachro tzfield%cunits = 'm kg kg-1 s-2' -call Les_diachro( tpdiafile, tzfield, gdoavg, gdonorm, zles_budget(:, :, :iles), hsuffixes = ysubtitle(:iles) ) +call Les_diachro( tpdiafile, tzfield, ygroup, ygroupcomment, gdoavg, gdonorm, zles_budget(:, :, :iles), & + hfieldnames = yfieldnames(:iles), hfieldcomments = yfieldcomments(:iles) ) !------------------------------------------------------------------------------- ! @@ -682,16 +733,19 @@ call Les_diachro( tpdiafile, tzfield, gdoavg, gdonorm, zles_budget(:, :, :iles), ! ------------------------------------------------------------ ! ! +ygroup = 'BU_THLR' +ygroupcomment = 'Liquid potential temperature - total water covariance budget' YGROUP= 'BU_THLR' ILES=0 ILES_STA=ILES ! ! -!* 2.1 production by mean gradients +!* 2.1 dynamic production by mean gradients ! ---------------------------- ! ILES=ILES+1 -YSUBTITLE(ILES) = 'SBG_DP_M' +YFIELDNAMES(ILES) = 'SBG_DP_M' +YFIELDCOMMENTS(ILES) = 'subgrid dynamic production by mean gradient' ILES_P1=ILES ! ZLES_BUDGET(:,:,ILES)=-XLES_SUBGRID_WRt (:,:,1) * XLES_MEAN_dThldz(:,:,1) & @@ -702,7 +756,8 @@ ZLES_BUDGET(:,:,ILES)=-XLES_SUBGRID_WRt (:,:,1) * XLES_MEAN_dThldz(:,:,1) & ! -------------------------------- ! ILES=ILES+1 -YSUBTITLE(ILES) = 'SBG_DP_R' +YFIELDNAMES(ILES) = 'SBG_DP_R' +YFIELDCOMMENTS(ILES) = 'subgrid dynamic production by resolved fluctuations' ! ZLES_BUDGET(:,:,ILES)= - XLES_RES_ddxa_Rt_SBG_UaThl(:,:,1) & - XLES_RES_ddxa_Thl_SBG_UaRt(:,:,1) & @@ -714,7 +769,8 @@ ZLES_BUDGET(:,:,ILES)= - XLES_RES_ddxa_Rt_SBG_UaThl(:,:,1) & ! IF ( ANY(XLES_SUBGRID_WThlRt(:,:,1)/= 0.) ) THEN ILES=ILES+1 -YSUBTITLE(ILES) = 'SBG_TR' +YFIELDNAMES(ILES) = 'SBG_TR' +YFIELDCOMMENTS(ILES) = 'subgrid turbulent transport' ! DO JK=2,NLES_K-1 ZLES_BUDGET(JK,:,ILES) = - ( XLES_SUBGRID_WThlRt (JK+1,:,1) & @@ -731,7 +787,8 @@ END IF ! ----------- ! ILES=ILES+1 -YSUBTITLE(ILES) = 'SBG_DISS' +YFIELDNAMES(ILES) = 'SBG_DISS' +YFIELDCOMMENTS(ILES) = 'subgrid dissipation' ! ZLES_BUDGET(:,:,ILES) = XLES_SUBGRID_DISS_ThlRt(:,:,1) ! @@ -740,7 +797,8 @@ ZLES_BUDGET(:,:,ILES) = XLES_SUBGRID_DISS_ThlRt(:,:,1) ! -------------------------- ! ILES=ILES+1 -YSUBTITLE(ILES) = 'SBG_RESI' +YFIELDNAMES(ILES) = 'SBG_RESI' +YFIELDCOMMENTS(ILES) = 'residual of subgrid budget' ! ZLES_BUDGET(:,:,ILES) = 0. DO JLES=ILES_STA+1,ILES-1 @@ -753,7 +811,8 @@ ILES_STA=ILES ! -------- ! ILES=ILES+1 -YSUBTITLE(ILES) = 'RES_TEND' +YFIELDNAMES(ILES) = 'RES_TEND' +YFIELDCOMMENTS(ILES) = 'resolved tendency' ! ZLES_BUDGET(:,:,ILES) = XLES_BU_RES_ThlRt(:,:,NLES_TEND) ! @@ -763,7 +822,8 @@ ZLES_BUDGET(:,:,ILES) = XLES_BU_RES_ThlRt(:,:,NLES_TEND) ! IF ( ANY(XLES_BU_RES_ThlRt(:,:,NLES_ADVM)/= 0.) ) THEN ILES=ILES+1 -YSUBTITLE(7) = 'RES_ADV' +YFIELDNAMES(ILES) = 'RES_ADV' +YFIELDCOMMENTS(ILES) = 'resolved advection by mean flow' ! ZLES_BUDGET(:,:,ILES) = XLES_BU_RES_ThlRt(:,:,NLES_ADVM) END IF @@ -773,7 +833,8 @@ END IF ! IF ( ANY(XLES_BU_RES_ThlRt(:,:,NLES_FORC)/= 0.) ) THEN ILES=ILES+1 -YSUBTITLE(ILES) = 'RES_FORC' +YFIELDNAMES(ILES) = 'RES_FORC' +YFIELDCOMMENTS(ILES) = 'resolved advection by large-scale W forcing' ! ZLES_BUDGET(:,:,ILES) = XLES_BU_RES_ThlRt(:,:,NLES_FORC) END IF @@ -782,7 +843,8 @@ END IF ! ---------- ! ILES=ILES+1 -YSUBTITLE(ILES) = 'RES_DP' +YFIELDNAMES(ILES) = 'RES_DP' +YFIELDCOMMENTS(ILES) = 'resolved dynamic production by mean gradient' ! ZLES_BUDGET(:,:,ILES) = XLES_BU_RES_ThlRt(:,:,NLES_DP) ! @@ -790,7 +852,8 @@ ZLES_BUDGET(:,:,ILES) = XLES_BU_RES_ThlRt(:,:,NLES_DP) ! ------------------- ! ILES=ILES+1 -YSUBTITLE(ILES) = 'RES_TR' +YFIELDNAMES(ILES) = 'RES_TR' +YFIELDCOMMENTS(ILES) = 'turbulent transport of resolved flux by itself' ! ZLES_BUDGET(:,:,ILES) = XLES_BU_RES_ThlRt(:,:,NLES_TR) ! @@ -799,7 +862,8 @@ ZLES_BUDGET(:,:,ILES) = XLES_BU_RES_ThlRt(:,:,NLES_TR) ! ---------------------------------------------------- ! ILES=ILES+1 -YSUBTITLE(ILES) = 'RES_SBGT' +YFIELDNAMES(ILES) = 'RES_SBGT' +YFIELDCOMMENTS(ILES) = 'resolved sink due to subgrid turbulence' ! ZLES_BUDGET(:,:,ILES) = XLES_BU_RES_ThlRt(:,:,NLES_VTURB) + XLES_BU_RES_ThlRt(:,:,NLES_HTURB) ! @@ -809,7 +873,8 @@ ZLES_BUDGET(:,:,ILES) = XLES_BU_RES_ThlRt(:,:,NLES_VTURB) + XLES_BU_RES_ThlRt(:, ! IF ( ANY(XLES_BU_RES_ThlRt(:,:,NLES_DIFF)/= 0.) ) THEN ILES=ILES+1 -YSUBTITLE(ILES) = 'RES_NUMD' +YFIELDNAMES(ILES) = 'RES_NUMD' +YFIELDCOMMENTS(ILES) = 'resolved numerical diffusion' ! ZLES_BUDGET(:,:,ILES) = XLES_BU_RES_ThlRt(:,:,NLES_DIFF) END IF @@ -819,7 +884,8 @@ END IF ! IF ( ANY(XLES_BU_RES_ThlRt(:,:,NLES_RELA)/= 0.) ) THEN ILES=ILES+1 -YSUBTITLE(ILES) = 'RES_RELA' +YFIELDNAMES(ILES) = 'RES_RELA' +YFIELDCOMMENTS(ILES) = 'resolved sponge layer relaxation' ! ZLES_BUDGET(:,:,ILES) = XLES_BU_RES_ThlRt(:,:,NLES_RELA) END IF @@ -829,7 +895,8 @@ END IF ! IF ( ANY(XLES_BU_RES_ThlRt(:,:,NLES_NEST)/= 0.) ) THEN ILES=ILES+1 -YSUBTITLE(ILES) = 'RES_NEST' +YFIELDNAMES(ILES) = 'RES_NEST' +YFIELDCOMMENTS(ILES) = 'resolved average from smaller nested models' ! ZLES_BUDGET(:,:,ILES) = XLES_BU_RES_ThlRt(:,:,NLES_NEST) END IF @@ -842,7 +909,8 @@ IF ( ANY( XLES_BU_RES_ThlRt(:,:,NLES_MISC) & +XLES_BU_RES_ThlRt(:,:,NLES_RAD ) & +XLES_BU_RES_ThlRt(:,:,NLES_MICR) /= 0.) ) THEN ILES=ILES+1 -YSUBTITLE(ILES) = 'RES_MISC' +YFIELDNAMES(ILES) = 'RES_MISC' +YFIELDCOMMENTS(ILES) = 'resolved: other effects' ! ZLES_BUDGET(:,:,ILES) = XLES_BU_RES_ThlRt(:,:,NLES_MISC) & + XLES_BU_RES_ThlRt(:,:,NLES_PREF) & @@ -855,7 +923,8 @@ END IF ! --------------------------- ! ILES=ILES+1 -YSUBTITLE(ILES) = 'RES_RESI' +YFIELDNAMES(ILES) = 'RES_RESI' +YFIELDCOMMENTS(ILES) = 'residual of resolved budget' ! ZLES_BUDGET(:,:,ILES) = 0. DO JLES=ILES_STA+1,ILES-1 @@ -866,7 +935,8 @@ END DO ! ------------------------ ! ILES=ILES+1 -YSUBTITLE(ILES) = 'NSG_TEND' +YFIELDNAMES(ILES) = 'NSG_TEND' +YFIELDCOMMENTS(ILES) = 'neglected tendency' ! ZLES_BUDGET(:,:,ILES) = 0. IF (NLES_TIMES>2) THEN @@ -885,7 +955,8 @@ END IF ! ---------------------------------------------- ! ILES=ILES+1 -YSUBTITLE(ILES) = 'NSG_ADVM' +YFIELDNAMES(ILES) = 'NSG_ADVM' +YFIELDCOMMENTS(ILES) = 'neglected advection by mean flow' ! DO JK=2,NLES_K-1 ZLES_BUDGET(JK,:,ILES)= -XLES_MEAN_W(JK,:,1) & @@ -902,7 +973,8 @@ ZLES_BUDGET(NLES_K,:,ILES) = ZLES_BUDGET(NLES_K-1,:,ILES) ! ---------------------------------------------- ! ILES=ILES+1 -YSUBTITLE(ILES) = 'NSG_ADVR' +YFIELDNAMES(ILES) = 'NSG_ADVR' +YFIELDCOMMENTS(ILES) = 'neglected advection by resolved flow' ! DO JK=2,NLES_K-1 ZLES_BUDGET(JK,:,ILES)= - ( XLES_RES_W_SBG_ThlRt (JK+1,:,1) & @@ -918,13 +990,14 @@ ZLES_BUDGET(NLES_K,:,ILES) = ZLES_BUDGET(NLES_K-1,:,ILES) !* 2.16 writing ! ------- ! -tzfield%cmnhname = ygroup +tzfield%cmnhname = ygroup !cmnhname will be overwritten by yfieldnames(:) in Les_diachro tzfield%cstdname = '' -tzfield%clongname = ygroup -tzfield%ccomment = 'Thl-Rt covariance budget' +tzfield%clongname = ygroup !clongname will be overwritten by yfieldnames(:) in Les_diachro +tzfield%ccomment = 'Thl-Rt covariance budget' !ccomment will be completed with yfieldnames(:) in Les_diachro tzfield%cunits = 'K kg kg-1 s-1' -call Les_diachro( tpdiafile, tzfield, gdoavg, gdonorm, zles_budget(:, :, :iles), hsuffixes = ysubtitle(:iles) ) +call Les_diachro( tpdiafile, tzfield, ygroup, ygroupcomment, gdoavg, gdonorm, zles_budget(:, :, :iles), & + hfieldnames = yfieldnames(:iles), hfieldcomments = yfieldcomments(:iles) ) !------------------------------------------------------------------------------- ! diff --git a/src/MNH/write_les_sv_budgetn.f90 b/src/MNH/write_les_sv_budgetn.f90 index 4bed642c49d6f57d932b4a8e5771b2bf9045b0fe..6a3997964fff08e950d3de7c18fa1603f5e392ad 100644 --- a/src/MNH/write_les_sv_budgetn.f90 +++ b/src/MNH/write_les_sv_budgetn.f90 @@ -92,9 +92,10 @@ INTEGER :: JT ! temporal loop counter INTEGER :: JSV! scalar loop counter INTEGER :: JP ! process loop counter ! -CHARACTER(len=9), DIMENSION(NMAX_ILES) :: YSUBTITLE -CHARACTER(len=8) :: YGROUP -CHARACTER(len=20) :: YTITLE +CHARACTER(len=9), DIMENSION(NMAX_ILES) :: YFIELDNAMES +CHARACTER(len=100), DIMENSION(NMAX_ILES) :: YFIELDCOMMENTS +character(len=:), allocatable :: ygroup +character(len=:), allocatable :: ygroupcomment ! REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZLES_BUDGET ! @@ -115,16 +116,18 @@ ZLES_BUDGET(:,:,:,:) = XUNDEF ! ---------------------------- ! ! -YGROUP='BU_SV2' +ygroup = 'BU_SV2' +ygroupcomment = 'Total scalar variance budget' ! ILES=0 ILES_STA=ILES ! -!* 2.1 production by mean gradients +!* 2.1 dynamic production by mean gradients ! ---------------------------- ! ILES=ILES+1 -YSUBTITLE(ILES) = 'SBG_DP_M' +YFIELDNAMES(ILES) = 'SBG_DP_M' +YFIELDCOMMENTS(ILES) = 'subgrid dynamic production by mean gradient' ILES_P1=ILES ! DO JSV=1,NSV @@ -136,7 +139,8 @@ END DO ! -------------------------------- ! ILES=ILES+1 -YSUBTITLE(ILES) = 'SBG_DP_R' +YFIELDNAMES(ILES) = 'SBG_DP_R' +YFIELDCOMMENTS(ILES) = 'subgrid dynamic production by resolved fluctuations' ! DO JSV=1,NSV ZLES_BUDGET(:,:,ILES,JSV)= - 2. * XLES_RES_ddxa_Sv_SBG_UaSv(:,:,1,JSV) & @@ -149,7 +153,8 @@ END DO ! IF ( ANY(XLES_SUBGRID_WSv2(:,:,1,:)/= 0.) ) THEN ILES=ILES+1 -YSUBTITLE(ILES) = 'SBG_TR' +YFIELDNAMES(ILES) = 'SBG_TR' +YFIELDCOMMENTS(ILES) = 'subgrid turbulent transport' ! DO JSV=1,NSV DO JK=2,NLES_K-1 @@ -168,7 +173,8 @@ END IF ! ----------- ! ILES=ILES+1 -YSUBTITLE(ILES) = 'SBG_DISS' +YFIELDNAMES(ILES) = 'SBG_DISS' +YFIELDCOMMENTS(ILES) = 'subgrid dissipation' ! DO JSV=1,NSV ZLES_BUDGET(:,:,ILES,JSV) = XLES_SUBGRID_DISS_Sv2(:,:,1,JSV) @@ -179,7 +185,8 @@ END DO ! -------------------------- ! ILES=ILES+1 -YSUBTITLE(ILES) = 'SBG_RESI' +YFIELDNAMES(ILES) = 'SBG_RESI' +YFIELDCOMMENTS(ILES) = 'residual of subgrid budget' ! DO JSV=1,NSV ZLES_BUDGET(:,:,ILES,JSV) = 0. @@ -194,7 +201,8 @@ ILES_STA=ILES ! -------- ! ILES=ILES+1 -YSUBTITLE(ILES) = 'RES_TEND' +YFIELDNAMES(ILES) = 'RES_TEND' +YFIELDCOMMENTS(ILES) = 'resolved tendency' ! DO JSV=1,NSV ZLES_BUDGET(:,:,ILES,JSV) = XLES_BU_RES_Sv2(:,:,NLES_TEND,JSV) @@ -205,7 +213,8 @@ END DO ! IF ( ANY(XLES_BU_RES_Sv2(:,:,NLES_ADVM,:)/= 0.) ) THEN ILES=ILES+1 - YSUBTITLE(ILES) = 'RES_ADV' + YFIELDNAMES(ILES) = 'RES_ADV' + YFIELDCOMMENTS(ILES) = 'resolved advection by mean flow' ! DO JSV=1,NSV ZLES_BUDGET(:,:,ILES,JSV) = XLES_BU_RES_Sv2(:,:,NLES_ADVM,JSV) @@ -217,7 +226,8 @@ END IF ! IF ( ANY(XLES_BU_RES_Sv2(:,:,NLES_FORC,:)/= 0.) ) THEN ILES=ILES+1 - YSUBTITLE(ILES) = 'RES_FORC' + YFIELDNAMES(ILES) = 'RES_FORC' + YFIELDCOMMENTS(ILES) = 'resolved advection by large-scale W forcing' ! DO JSV=1,NSV ZLES_BUDGET(:,:,ILES,JSV) = XLES_BU_RES_Sv2(:,:,NLES_FORC,JSV) @@ -229,7 +239,8 @@ END IF ! ---------- ! ILES=ILES+1 -YSUBTITLE(ILES) = 'RES_DP' +YFIELDNAMES(ILES) = 'RES_DP' +YFIELDCOMMENTS(ILES) = 'resolved dynamic production by mean gradient' ! DO JSV=1,NSV ZLES_BUDGET(:,:,ILES,JSV) = XLES_BU_RES_Sv2(:,:,NLES_DP,JSV) @@ -239,7 +250,8 @@ END DO ! ------------------- ! ILES=ILES+1 -YSUBTITLE(ILES) = 'RES_TR' +YFIELDNAMES(ILES) = 'RES_TR' +YFIELDCOMMENTS(ILES) = 'turbulent transport of resolved flux by itself' ! DO JSV=1,NSV ZLES_BUDGET(:,:,ILES,JSV) = XLES_BU_RES_Sv2(:,:,NLES_TR,JSV) @@ -250,7 +262,8 @@ END DO ! ---------------------------------------------------- ! ILES=ILES+1 -YSUBTITLE(ILES) = 'RES_SBGT' +YFIELDNAMES(ILES) = 'RES_SBGT' +YFIELDCOMMENTS(ILES) = 'resolved sink due to subgrid turbulence' ! DO JSV=1,NSV ZLES_BUDGET(:,:,ILES,JSV) = XLES_BU_RES_Sv2(:,:,NLES_VTURB,JSV) & @@ -262,7 +275,8 @@ END DO ! IF ( ANY(XLES_BU_RES_Sv2(:,:,NLES_DIFF,:)/= 0.) ) THEN ILES=ILES+1 - YSUBTITLE(ILES) = 'RES_NUMD' + YFIELDNAMES(ILES) = 'RES_NUMD' + YFIELDCOMMENTS(ILES) = 'resolved numerical diffusion' ! DO JSV=1,NSV ZLES_BUDGET(:,:,ILES,JSV) = XLES_BU_RES_Sv2(:,:,NLES_DIFF,JSV) @@ -274,7 +288,8 @@ END IF ! IF ( ANY(XLES_BU_RES_Sv2(:,:,NLES_RELA,:)/= 0.) ) THEN ILES=ILES+1 - YSUBTITLE(ILES) = 'RES_RELA' + YFIELDNAMES(ILES) = 'RES_RELA' + YFIELDCOMMENTS(ILES) = 'resolved sponge layer relaxation' ! DO JSV=1,NSV ZLES_BUDGET(:,:,ILES,JSV) = XLES_BU_RES_Sv2(:,:,NLES_RELA,JSV) @@ -286,7 +301,8 @@ END IF ! IF ( ANY(XLES_BU_RES_Sv2(:,:,NLES_NEST,:)/= 0.) ) THEN ILES=ILES+1 - YSUBTITLE(ILES) = 'RES_NEST' + YFIELDNAMES(ILES) = 'RES_NEST' + YFIELDCOMMENTS(ILES) = 'resolved average from smaller nested models' ! DO JSV=1,NSV ZLES_BUDGET(:,:,ILES,JSV) = XLES_BU_RES_Sv2(:,:,NLES_NEST,JSV) @@ -298,7 +314,8 @@ END IF ! IF ( ANY(XLES_BU_RES_Sv2(:,:,NLES_MISC,:)/= 0.) ) THEN ILES=ILES+1 - YSUBTITLE(ILES) = 'RES_MISC' + YFIELDNAMES(ILES) = 'RES_MISC' + YFIELDCOMMENTS(ILES) = 'resolved: other effects' ! DO JSV=1,NSV ZLES_BUDGET(:,:,ILES,JSV) = XLES_BU_RES_Sv2(:,:,NLES_MISC,JSV) @@ -309,7 +326,8 @@ END IF ! --------------------------- ! ILES=ILES+1 -YSUBTITLE(ILES) = 'RES_RESI' +YFIELDNAMES(ILES) = 'RES_RESI' +YFIELDCOMMENTS(ILES) = 'residual of resolved budget' ! DO JSV=1,NSV ZLES_BUDGET(:,:,ILES,JSV) = 0. @@ -322,7 +340,8 @@ END DO ! ------------------------ ! ILES=ILES+1 -YSUBTITLE(ILES) = 'NSG_TEND' +YFIELDNAMES(ILES) = 'NSG_TEND' +YFIELDCOMMENTS(ILES) = 'neglected tendency' ! IF (NLES_TIMES>2) THEN DO JSV=1,NSV @@ -343,7 +362,8 @@ END IF ! ---------------------------------------------- ! ILES=ILES+1 -YSUBTITLE(ILES) = 'NSG_ADVM' +YFIELDNAMES(ILES) = 'NSG_ADVM' +YFIELDCOMMENTS(ILES) = 'neglected advection by mean flow' ! DO JSV=1,NSV DO JK=2,NLES_K-1 @@ -361,7 +381,8 @@ END DO ! ---------------------------------------------- ! ILES=ILES+1 -YSUBTITLE(ILES) = 'NSG_ADVR' +YFIELDNAMES(ILES) = 'NSG_ADVR' +YFIELDCOMMENTS(ILES) = 'neglected advection by resolved flow' ! DO JSV=1,NSV DO JK=2,NLES_K-1 @@ -378,15 +399,13 @@ END DO !* 2.16 writing ! ------- ! -YTITLE = "Sv variance budget " - tzfield%ngrid = 0 !Not on the Arakawa grid tzfield%ntype = TYPEREAL -tzfield%cmnhname = ygroup +tzfield%cmnhname = ygroup !cmnhname will be overwritten by yfieldnames(:) in Les_diachro tzfield%cstdname = '' -tzfield%clongname = ygroup -tzfield%ccomment = ytitle +tzfield%clongname = ygroup !clongname will be overwritten by yfieldnames(:) in Les_diachro +tzfield%ccomment = 'Sv variance budget' !ccomment will be completed with yfieldnames(:) in Les_diachro tzfield%cunits = 'kg2 kg-2 s-1' tzfield%ndims = 4 @@ -399,7 +418,8 @@ tzfield%ndimlist(5:) = NMNHDIM_UNUSED gdoavg = xles_temp_mean_start /= XUNDEF .and. xles_temp_mean_end /= XUNDEF gdonorm = trim(cles_norm_type) /= 'NONE' -call Les_diachro( tpdiafile, tzfield, gdoavg, gdonorm, zles_budget(:, :, :iles, :), hsuffixes = ysubtitle(:iles) ) +call Les_diachro( tpdiafile, tzfield, ygroup, ygroupcomment, gdoavg, gdonorm, zles_budget(:, :, :iles, :), & + hfieldnames = yfieldnames(:iles), hfieldcomments = yfieldcomments(:iles) ) !------------------------------------------------------------------------------- ! @@ -407,17 +427,19 @@ call Les_diachro( tpdiafile, tzfield, gdoavg, gdonorm, zles_budget(:, :, :iles, ! ----------------------- ! ! -YGROUP = 'BU_WSV' +ygroup = 'BU_WSV' +ygroupcomment = 'Total water flux budget' ! ! ILES=0 ILES_STA=ILES ! -!* 3.1 production by mean gradients +!* 3.1 dynamic production by mean gradients ! ----------------------------- ! ILES=ILES+1 -YSUBTITLE(ILES) = 'SBG_DP_M' +YFIELDNAMES(ILES) = 'SBG_DP_M' +YFIELDCOMMENTS(ILES) = 'subgrid dynamic production by mean gradient' ILES_P1=ILES ! DO JSV=1,NSV @@ -430,7 +452,8 @@ END DO ! ------------------------------------------- ! ILES=ILES+1 -YSUBTITLE(ILES) = 'SBG_DP_R' +YFIELDNAMES(ILES) = 'SBG_DP_R' +YFIELDCOMMENTS(ILES) = 'subgrid dynamic production by resolved fluctuations' ILES_P2=ILES ! DO JSV=1,NSV @@ -445,7 +468,8 @@ END DO ! IF ( ANY(XLES_SUBGRID_W2Sv(:,:,1,:)/= 0.) ) THEN ILES=ILES+1 -YSUBTITLE(ILES) = 'SBG_TR' +YFIELDNAMES(ILES) = 'SBG_TR' +YFIELDCOMMENTS(ILES) = 'subgrid turbulent transport' ! DO JSV=1,NSV DO JK=2,NLES_K-1 @@ -464,7 +488,8 @@ END IF ! ------------------- ! ILES=ILES+1 -YSUBTITLE(ILES) = 'SBG_PRES' +YFIELDNAMES(ILES) = 'SBG_PRES' +YFIELDCOMMENTS(ILES) = 'subgrid pressure-correlation' ! DO JSV=1,NSV ZLES_BUDGET(:,:,ILES,JSV) = XLES_SUBGRID_SvPz(:,:,1,JSV) @@ -475,7 +500,8 @@ END DO ! ------------------ ! ILES=ILES+1 -YSUBTITLE(ILES) = 'SBG_TP' +YFIELDNAMES(ILES) = 'SBG_TP' +YFIELDCOMMENTS(ILES) = 'subgrid thermal production' ! IF (LUSERV) THEN DO JSV=1,NSV @@ -494,7 +520,9 @@ END IF ! ----------- ! ILES=ILES+1 -YSUBTITLE(ILES) = 'SBG_DISS' +!PW: not in documentation. Always set to 0 +YFIELDNAMES(ILES) = 'SBG_DISS' +YFIELDCOMMENTS(ILES) = 'subgrid dissipation' ! DO JSV=1,NSV ZLES_BUDGET(:,:,ILES,JSV) = 0. @@ -505,7 +533,8 @@ END DO ! -------------------------- ! ILES=ILES+1 -YSUBTITLE(ILES) = 'SBG_RESI' +YFIELDNAMES(ILES) = 'SBG_RESI' +YFIELDCOMMENTS(ILES) = 'residual of subgrid budget' ! DO JSV=1,NSV ZLES_BUDGET(:,:,ILES,JSV) = 0. @@ -520,7 +549,8 @@ ILES_STA=ILES ! -------- ! ILES=ILES+1 -YSUBTITLE(ILES) = 'RES_TEND' +YFIELDNAMES(ILES) = 'RES_TEND' +YFIELDCOMMENTS(ILES) = 'resolved tendency' ! DO JSV=1,NSV ZLES_BUDGET(:,:,ILES,JSV) = XLES_BU_RES_WSv(:,:,NLES_TEND,JSV) @@ -531,7 +561,8 @@ END DO ! IF ( ANY(XLES_BU_RES_WSv(:,:,NLES_ADVM,:)/= 0.) ) THEN ILES=ILES+1 - YSUBTITLE(ILES) = 'RES_ADV' + YFIELDNAMES(ILES) = 'RES_ADV' + YFIELDCOMMENTS(ILES) = 'resolved advection by mean flow' ! DO JSV=1,NSV ZLES_BUDGET(:,:,ILES,JSV) = XLES_BU_RES_WSv(:,:,NLES_ADVM,JSV) @@ -543,7 +574,8 @@ END IF ! IF ( ANY(XLES_BU_RES_WSv(:,:,NLES_FORC,:)/= 0.) ) THEN ILES=ILES+1 - YSUBTITLE(ILES) = 'RES_FORC' + YFIELDNAMES(ILES) = 'RES_FORC' + YFIELDCOMMENTS(ILES) = 'resolved advection by large-scale W forcing' ! DO JSV=1,NSV ZLES_BUDGET(:,:,ILES,JSV) = XLES_BU_RES_WSv(:,:,NLES_FORC,JSV) @@ -554,7 +586,8 @@ END IF ! ---------------------------------- ! ILES=ILES+1 -YSUBTITLE(ILES) = 'RES_DP' +YFIELDNAMES(ILES) = 'RES_DP' +YFIELDCOMMENTS(ILES) = 'resolved dynamic production by mean gradient' ! DO JSV=1,NSV ZLES_BUDGET(:,:,ILES,JSV) = XLES_BU_RES_WSv(:,:,NLES_DP,JSV) @@ -564,7 +597,8 @@ END DO ! ------------------- ! ILES=ILES+1 -YSUBTITLE(ILES) = 'RES_TR' +YFIELDNAMES(ILES) = 'RES_TR' +YFIELDCOMMENTS(ILES) = 'turbulent transport of resolved flux by itself' ! DO JSV=1,NSV ZLES_BUDGET(:,:,ILES,JSV) = XLES_BU_RES_WSv(:,:,NLES_TR,JSV) @@ -575,7 +609,8 @@ END DO ! ------------------- ! ILES=ILES+1 -YSUBTITLE(ILES) = 'RES_PRES' +YFIELDNAMES(ILES) = 'RES_PRES' +YFIELDCOMMENTS(ILES) = 'resolved pressure-correlation' ! DO JSV=1,NSV ZLES_BUDGET(:,:,ILES,JSV) = XLES_BU_RES_WSv(:,:,NLES_PRES,JSV) @@ -586,7 +621,8 @@ END DO ! ------------------ ! ILES=ILES+1 -YSUBTITLE(ILES) = 'RES_TP' +YFIELDNAMES(ILES) = 'RES_TP' +YFIELDCOMMENTS(ILES) = 'resolved thermal production' ! DO JSV=1,NSV ZLES_BUDGET(:,:,ILES,JSV) = XLES_BU_RES_WSv(:,:,NLES_GRAV,JSV) @@ -597,7 +633,8 @@ END DO ! ---------------------------------------------------- ! ILES=ILES+1 -YSUBTITLE(ILES) = 'RES_SBGT' +YFIELDNAMES(ILES) = 'RES_SBGT' +YFIELDCOMMENTS(ILES) = 'resolved sink due to subgrid turbulence' ! DO JSV=1,NSV ZLES_BUDGET(:,:,ILES,JSV) = XLES_BU_RES_WSv(:,:,NLES_VTURB,JSV) + XLES_BU_RES_WSv(:,:,NLES_HTURB,JSV) @@ -608,7 +645,8 @@ END DO ! IF ( ANY(XLES_BU_RES_WSv(:,:,NLES_COR,:)/= 0.) ) THEN ILES=ILES+1 - YSUBTITLE(ILES) = 'RES_CORI' + YFIELDNAMES(ILES) = 'RES_CORI' + YFIELDCOMMENTS(ILES) = 'resolved Coriolis effect' ! DO JSV=1,NSV ZLES_BUDGET(:,:,ILES,JSV) = XLES_BU_RES_WSv(:,:,NLES_COR,JSV) @@ -620,7 +658,8 @@ END IF ! IF ( ANY(XLES_BU_RES_WSv(:,:,NLES_DIFF,:)/= 0.) ) THEN ILES=ILES+1 - YSUBTITLE(ILES) = 'RES_NUMD' + YFIELDNAMES(ILES) = 'RES_NUMD' + YFIELDCOMMENTS(ILES) = 'resolved numerical diffusion' ! DO JSV=1,NSV ZLES_BUDGET(:,:,ILES,JSV) = XLES_BU_RES_WSv(:,:,NLES_DIFF,JSV) @@ -632,7 +671,8 @@ END IF ! IF ( ANY(XLES_BU_RES_WSv(:,:,NLES_RELA,:)/= 0.) ) THEN ILES=ILES+1 - YSUBTITLE(ILES) = 'RES_RELA' + YFIELDNAMES(ILES) = 'RES_RELA' + YFIELDCOMMENTS(ILES) = 'resolved sponge layer relaxation' ! DO JSV=1,NSV ZLES_BUDGET(:,:,ILES,JSV) = XLES_BU_RES_WSv(:,:,NLES_RELA,JSV) @@ -644,7 +684,8 @@ END IF ! IF ( ANY(XLES_BU_RES_WSv(:,:,NLES_NEST,:)/= 0.) ) THEN ILES=ILES+1 - YSUBTITLE(ILES) = 'RES_NEST' + YFIELDNAMES(ILES) = 'RES_NEST' + YFIELDCOMMENTS(ILES) = 'resolved average from smaller nested models' ! DO JSV=1,NSV ZLES_BUDGET(:,:,ILES,JSV) = XLES_BU_RES_WSv(:,:,NLES_NEST,JSV) @@ -656,7 +697,8 @@ END IF ! IF ( ANY(XLES_BU_RES_WSv(:,:,NLES_MISC,:)/= 0.) ) THEN ILES=ILES+1 - YSUBTITLE(ILES) = 'RES_MISC' + YFIELDNAMES(ILES) = 'RES_MISC' + YFIELDCOMMENTS(ILES) = 'resolved: other effects' ! DO JSV=1,NSV ZLES_BUDGET(:,:,ILES,JSV) = XLES_BU_RES_WSv(:,:,NLES_MISC,JSV) @@ -667,7 +709,8 @@ END IF ! ------------------------------- ! ILES=ILES+1 -YSUBTITLE(ILES) = 'RES_RESI' +YFIELDNAMES(ILES) = 'RES_RESI' +YFIELDCOMMENTS(ILES) = 'residual of resolved budget' ! DO JSV=1,NSV ZLES_BUDGET(:,:,ILES,JSV) = 0. @@ -680,7 +723,8 @@ END DO ! ------------------------ ! ILES=ILES+1 -YSUBTITLE(ILES) = 'NSG_TEND' +YFIELDNAMES(ILES) = 'NSG_TEND' +YFIELDCOMMENTS(ILES) = 'neglected tendency' ! DO JSV=1,NSV ZLES_BUDGET(:,:,ILES,JSV) = 0. @@ -703,7 +747,8 @@ END DO ! ------------------------------------------------ ! ILES=ILES+1 -YSUBTITLE(ILES) = 'NSG_ADVM' +YFIELDNAMES(ILES) = 'NSG_ADVM' +YFIELDCOMMENTS(ILES) = 'neglected advection by mean flow' ! DO JSV=1,NSV DO JK=2,NLES_K-1 @@ -721,7 +766,8 @@ END DO ! ------------------------------------------------ ! ILES=ILES+1 -YSUBTITLE(ILES) = 'NSG_ADVR' +YFIELDNAMES(ILES) = 'NSG_ADVR' +YFIELDCOMMENTS(ILES) = 'neglected advection by resolved flow' ! DO JSV=1,NSV DO JK=2,NLES_K-1 @@ -738,7 +784,8 @@ END DO ! ---------------------------------------------------------------------------------- ! ILES=ILES+1 -YSUBTITLE(ILES) = 'NSG_DPGW' +YFIELDNAMES(ILES) = 'NSG_DPGW' +YFIELDCOMMENTS(ILES) = 'neglected production by gradient of vertical velocity for subgrid quantity' ! DO JSV=1,NSV ZLES_BUDGET(:,:,ILES,JSV)=- XLES_RES_ddxa_W_SBG_UaSv(:,:,1,JSV) @@ -749,7 +796,8 @@ END DO ! ------------------------------------------------------------------------- ! ILES=ILES+1 -YSUBTITLE(ILES) = 'NSG_DPGT' +YFIELDNAMES(ILES) = 'NSG_DPGT' +YFIELDCOMMENTS(ILES) = 'neglected production by horizontal gradient of Thl for subgrid quantity' ! DO JSV=1,NSV ZLES_BUDGET(:,:,ILES,JSV)=-XLES_RES_ddxa_Sv_SBG_UaW(:,:,1,JSV) & @@ -760,15 +808,13 @@ END DO !* 3.22 writing ! ------- ! -YTITLE = "Sv flux budget " - tzfield%ngrid = 0 !Not on the Arakawa grid tzfield%ntype = TYPEREAL -tzfield%cmnhname = ygroup +tzfield%cmnhname = ygroup !cmnhname will be overwritten by yfieldnames(:) in Les_diachro tzfield%cstdname = '' -tzfield%clongname = ygroup -tzfield%ccomment = ytitle +tzfield%clongname = ygroup !clongname will be overwritten by yfieldnames(:) in Les_diachro +tzfield%ccomment = 'Sv flux budget' !ccomment will be completed with yfieldnames(:) in Les_diachro tzfield%cunits = 'm kg kg-1 s-2' tzfield%ndims = 4 @@ -781,7 +827,8 @@ tzfield%ndimlist(5:) = NMNHDIM_UNUSED gdoavg = xles_temp_mean_start /= XUNDEF .and. xles_temp_mean_end /= XUNDEF gdonorm = trim(cles_norm_type) /= 'NONE' -call Les_diachro( tpdiafile, tzfield, gdoavg, gdonorm, zles_budget(:, :, :iles, :), hsuffixes = ysubtitle(:iles) ) +call Les_diachro( tpdiafile, tzfield, ygroup, ygroupcomment, gdoavg, gdonorm, zles_budget(:, :, :iles, :), & + hfieldnames = yfieldnames(:iles), hfieldcomments = yfieldcomments(:iles) ) !------------------------------------------------------------------------------- ! diff --git a/src/MNH/write_lesn.f90 b/src/MNH/write_lesn.f90 index e971d432cbfe94e4be5c582197476ede4ad2507a..1369cb378249bfbe9d38b9925d2d77117bde88a8 100644 --- a/src/MNH/write_lesn.f90 +++ b/src/MNH/write_lesn.f90 @@ -16,6 +16,9 @@ private public :: Write_les_n +character(len=:), allocatable :: cgroup +character(len=:), allocatable :: cgroupcomment + logical :: ldoavg ! Compute and store time average logical :: ldonorm ! Compute and store normalized field @@ -77,6 +80,7 @@ subroutine Write_les_n( tpdiafile ) use modd_conf_n, only: luserv, luserc, luserr, luseri, lusers, luserg, luserh use modd_io, only: tfiledata use modd_field, only: NMNHDIM_BUDGET_LES_TIME, NMNHDIM_BUDGET_LES_LEVEL, NMNHDIM_BUDGET_LES_SV, NMNHDIM_BUDGET_LES_MASK, & + NMNHDIM_BUDGET_LES_PDF, & NMNHDIM_SPECTRA_2PTS_NI, NMNHDIM_SPECTRA_2PTS_NJ, NMNHDIM_SPECTRA_LEVEL, NMNHDIM_UNUSED, & TYPEREAL use modd_grid_n, only: xdxhat, xdyhat @@ -283,6 +287,9 @@ tfield%ndimlist(4:) = NMNHDIM_UNUSED ldoavg = xles_temp_mean_start /= XUNDEF .and. xles_temp_mean_end /= XUNDEF ldonorm = .false. +cgroup = 'Miscellaneous' +cgroupcomment = 'Miscellaneous terms (geometry, various unclassified averaged terms...)' + call Les_diachro_write( tpdiafile, zavg_pts_ll, 'AVG_PTS', 'number of points used for averaging', '1', ymasks ) call Les_diachro_write( tpdiafile, zavg_pts_ll / zcart_pts_ll, 'AVG_PTSF', 'fraction of points used for averaging', '1', ymasks ) call Les_diachro_write( tpdiafile, zund_pts_ll, 'UND_PTS', 'number of points below orography', '1', ymasks ) @@ -294,6 +301,9 @@ DEALLOCATE(ZUND_PTS_ll) !* 2.1 mean quantities ! --------------- ! +cgroup = 'Mean' +cgroupcomment = 'Mean vertical profiles of the model variables' + tfield%ndims = 3 tfield%ndimlist(1) = NMNHDIM_BUDGET_LES_LEVEL tfield%ndimlist(2) = NMNHDIM_BUDGET_LES_TIME @@ -374,6 +384,16 @@ call Les_diachro_write( tpdiafile, XLES_MEAN_WIND, 'MEANWIND', 'Profile of call Les_diachro_write( tpdiafile, XLES_RESOLVED_MASSFX, 'MEANMSFX', 'Total updraft mass flux', 'kg m-2 s-1', ymasks ) if ( lles_pdf ) then + cgroup = 'PDF' + cgroupcomment = '' + + tfield%ndims = 4 + !tfield%ndimlist(1) = NMNHDIM_BUDGET_LES_LEVEL + !tfield%ndimlist(2) = NMNHDIM_BUDGET_LES_TIME + !tfield%ndimlist(3) = NMNHDIM_BUDGET_LES_MASK + tfield%ndimlist(4) = NMNHDIM_BUDGET_LES_PDF + tfield%ndimlist(5:) = NMNHDIM_UNUSED + call Les_diachro_write( tpdiafile, XLES_PDF_TH, 'PDF_TH', 'Pdf potential temperature Profiles', '1', ymasks ) call Les_diachro_write( tpdiafile, XLES_PDF_W, 'PDF_W', 'Pdf vertical velocity Profiles', '1', ymasks ) call Les_diachro_write( tpdiafile, XLES_PDF_THV, 'PDF_THV', 'Pdf virtual pot. temp. Profiles', '1', ymasks ) @@ -402,6 +422,9 @@ if ( lles_resolved ) then ldoavg = xles_temp_mean_start /= XUNDEF .and. xles_temp_mean_end /= XUNDEF ldonorm = trim(cles_norm_type) /= 'NONE' + cgroup = 'Resolved' + cgroupcomment = 'Mean vertical profiles of the resolved fluxes, variances and covariances' + tfield%ndims = 3 tfield%ndimlist(1) = NMNHDIM_BUDGET_LES_LEVEL tfield%ndimlist(2) = NMNHDIM_BUDGET_LES_TIME @@ -606,6 +629,9 @@ if ( lles_subgrid ) then ldoavg = xles_temp_mean_start /= XUNDEF .and. xles_temp_mean_end /= XUNDEF ldonorm = trim(cles_norm_type) /= 'NONE' + cgroup = 'Subgrid' + cgroupcomment = 'Mean vertical profiles of the subgrid fluxes, variances and covariances' + tfield%ndims = 3 tfield%ndimlist(1) = NMNHDIM_BUDGET_LES_LEVEL tfield%ndimlist(2) = NMNHDIM_BUDGET_LES_TIME @@ -724,6 +750,9 @@ ldonorm = trim(cles_norm_type) /= 'NONE' ! ------------------ ! if ( lles_updraft ) then + cgroup = 'Updraft' + cgroupcomment = 'Updraft vertical profiles of some resolved and subgrid fluxes, variances and covariances' + call Les_diachro_write( tpdiafile, XLES_UPDRAFT, 'UP_FRAC', 'Updraft fraction', '1' ) call Les_diachro_write( tpdiafile, XLES_UPDRAFT_W, 'UP_W', 'Updraft W mean value', 'm s-1' ) call Les_diachro_write( tpdiafile, XLES_UPDRAFT_Th, 'UP_TH', 'Updraft potential temperature mean value', 'K' ) @@ -831,6 +860,9 @@ end if ! -------------------- ! if ( lles_downdraft ) then + cgroup = 'Downdraft' + cgroupcomment = 'Downdraft vertical profiles of some resolved and subgrid fluxes, variances and covariances' + call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT, 'DW_FRAC', 'Downdraft fraction', '1' ) call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_W, 'DW_W', 'Downdraft W mean value', 'm s-1' ) call Les_diachro_write( tpdiafile, XLES_DOWNDRAFT_Th, 'DW_TH', 'Downdraft potential temperature mean value', 'K' ) @@ -946,7 +978,10 @@ end if !* 3. surface normalization parameters ! -------------------------------- ! -!Prepare metadate (used in Les_diachro_write calls) +cgroup = 'Miscellaneous' +cgroupcomment = 'Miscellaneous terms (geometry, various unclassified averaged terms...)' + +!Prepare metadata (used in Les_diachro_write calls) tfield%ndims = 2 tfield%ndimlist(1) = NMNHDIM_BUDGET_LES_LEVEL tfield%ndimlist(2) = NMNHDIM_BUDGET_LES_TIME @@ -965,6 +1000,9 @@ call Les_diachro_write( tpdiafile, XLES_DTHRADLW, 'DTHRADLW', 'LW radiative temp call Les_diachro_write( tpdiafile, XLES_RADEFF, 'RADEFF', 'Mean effective radius', 'micron' ) +cgroup = 'Surface' +cgroupcomment = 'Averaged surface fields' + ! !Prepare metadate (used in Les_diachro_write calls) tfield%ndims = 1 tfield%ndimlist(1) = NMNHDIM_BUDGET_LES_TIME @@ -1162,7 +1200,7 @@ tfield%clongname = hmnhname tfield%ccomment = hcomment tfield%cunits = hunits -call Les_diachro( tpdiafile, tfield, ldoavg, ldonorm, pdata ) +call Les_diachro( tpdiafile, tfield, cgroup, cgroupcomment, ldoavg, ldonorm, pdata ) end subroutine Les_diachro_write_1D @@ -1185,7 +1223,7 @@ tfield%clongname = hmnhname tfield%ccomment = hcomment tfield%cunits = hunits -call Les_diachro( tpdiafile, tfield, ldoavg, ldonorm, pdata ) +call Les_diachro( tpdiafile, tfield, cgroup, cgroupcomment, ldoavg, ldonorm, pdata ) end subroutine Les_diachro_write_2D @@ -1209,7 +1247,7 @@ tfield%clongname = hmnhname tfield%ccomment = hcomment tfield%cunits = hunits -call Les_diachro( tpdiafile, tfield, ldoavg, ldonorm, pdata, hmasks = hmasks ) +call Les_diachro( tpdiafile, tfield, cgroup, cgroupcomment, ldoavg, ldonorm, pdata, hmasks = hmasks ) end subroutine Les_diachro_write_3D @@ -1233,7 +1271,7 @@ tfield%clongname = hmnhname tfield%ccomment = hcomment tfield%cunits = hunits -call Les_diachro( tpdiafile, tfield, ldoavg, ldonorm, pdata, hmasks = hmasks ) +call Les_diachro( tpdiafile, tfield, cgroup, cgroupcomment, ldoavg, ldonorm, pdata, hmasks = hmasks ) end subroutine Les_diachro_write_4D diff --git a/src/MNH/write_lfifm1_for_diag_supp.f90 b/src/MNH/write_lfifm1_for_diag_supp.f90 index 72b614ae57b534f0399a0ad289fd92898c7eecad..1bb11e435afd44755eff957d81908fa904554cb6 100644 --- a/src/MNH/write_lfifm1_for_diag_supp.f90 +++ b/src/MNH/write_lfifm1_for_diag_supp.f90 @@ -850,21 +850,17 @@ IF (NRTTOVINFO(1,1) /= NUNDEF) THEN CALL CALL_RTTOV8(NDLON, NFLEV, NSTATM, XEMIS(:,:,1), XTSRAD, XSTATM, XTHT, XRT, & XPABST, XZZ, XMFCONV, XCLDFR, XUT(:,:,IKB), XVT(:,:,IKB), & LUSERI, NRTTOVINFO, TPFILE ) -#else -#ifdef MNH_RTTOV_11 +#elif MNH_RTTOV_11 CALL CALL_RTTOV11(NDLON, NFLEV, XEMIS(:,:,1), XTSRAD, XTHT, XRT, & XPABST, XZZ, XMFCONV, XCLDFR, XUT(:,:,IKB), XVT(:,:,IKB), & LUSERI, NRTTOVINFO, TPFILE ) -#else -#ifdef MNH_RTTOV_13 +#elif MNH_RTTOV_13 CALL CALL_RTTOV13(NDLON, NFLEV, XEMIS(:,:,1), XTSRAD, XTHT, XRT, & XPABST, XZZ, XMFCONV, XCLDFR, XUT(:,:,IKB), XVT(:,:,IKB), & LUSERI, NRTTOVINFO, TPFILE ) #else PRINT *, "RTTOV LIBRARY NOT AVAILABLE = ###CALL_RTTOV####" #endif -#endif -#endif END IF ! !------------------------------------------------------------------------------- diff --git a/src/MNH/write_profilern.f90 b/src/MNH/write_profilern.f90 index 1a0d6af59bef2dc344b131242e4cb13661f47c8b..486978e1c2accda7b8125d056c48166d2a5f201c 100644 --- a/src/MNH/write_profilern.f90 +++ b/src/MNH/write_profilern.f90 @@ -3,59 +3,10 @@ !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_PROFILER_n -! ########################### -! -INTERFACE -! - SUBROUTINE WRITE_PROFILER_n(TPDIAFILE) -! -USE MODD_IO, ONLY: TFILEDATA -! -TYPE(TFILEDATA), INTENT(IN) :: TPDIAFILE ! diachronic file to write -! -END SUBROUTINE WRITE_PROFILER_n -! -END INTERFACE -! -END MODULE MODI_WRITE_PROFILER_n -! -! ########################################## - SUBROUTINE WRITE_PROFILER_n(TPDIAFILE) -! ########################################## +! Author: +! P. Tulet 15/02/2002 ! -! -!!**** *WRITE_PROFILER* - 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 +! Modifications ! 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 @@ -64,39 +15,40 @@ END MODULE MODI_WRITE_PROFILER_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 11/03/2021: bugfix: correct name for NSV_LIMA_IMM_NUCL -! M.Taufour 07/2021: modify RARE for hydrometeors containing ice and add bright band calculation for RARE -! -------------------------------------------------------------------------- +! P. Wautelet 05/07/2021: reorganisation to store point values correctly (not in vertical profiles) +! M. Taufour 07/2021: modify RARE for hydrometeors containing ice and add bright band calculation for RARE +!----------------------------------------------------------------- +! ########################### +MODULE MODE_WRITE_PROFILER_n +! ########################### ! -!* 0. DECLARATIONS -! ------------ +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 + +REAL, DIMENSION(:,:,:,:,:,:), ALLOCATABLE :: XWORK6 ! contains temporal serie + +contains ! -USE MODD_CST -USE MODD_IO, ONLY: TFILEDATA -USE MODD_LUNIT -USE MODD_PARAMETERS +!##################################### +SUBROUTINE WRITE_PROFILER_n(TPDIAFILE) +!##################################### ! -USE MODD_TYPE_PROFILER -USE MODD_PROFILER_n -USE MODD_CH_M9_n, ONLY: CNAMES -USE MODD_CH_AEROSOL, ONLY: CAERONAMES, LORILAM, JPMODE -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, LSALT -USE MODD_NSV -USE MODD_RADIATIONS_n, ONLY:NAER -USE MODD_DIAG_IN_RUN -USE MODD_PARAM_n, ONLY: CRAD ! -USE MODE_AERO_PSD -USE MODE_DUST_PSD -use mode_write_diachro, only: Write_diachro +!**** *WRITE_PROFILER* - write the balloon and aircraft trajectories and records +! in the diachronic file ! -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 +!* 0. DECLARATIONS +! ------------ +! +USE MODD_IO, ONLY: TFILEDATA +use MODD_PROFILER_n, only: NUMBPROFILER ! IMPLICIT NONE ! @@ -109,61 +61,80 @@ TYPE(TFILEDATA), INTENT(IN) :: TPDIAFILE ! diachronic file to write ! ! 0.2 declaration of local variables ! -INTEGER :: II ! loop +INTEGER :: JI ! !---------------------------------------------------------------------------- ! -DO II=1,NUMBPROFILER - CALL PROFILER_DIACHRO_n(TPROFILER, II) +DO JI = 1, NUMBPROFILER + CALL PROFILER_DIACHRO_n( TPDIAFILE, JI ) ENDDO ! !---------------------------------------------------------------------------- +END SUBROUTINE WRITE_PROFILER_n !---------------------------------------------------------------------------- -! -CONTAINS -! -!---------------------------------------------------------------------------- -!---------------------------------------------------------------------------- -! -!---------------------------------------------------------------------------- -SUBROUTINE PROFILER_DIACHRO_n(TPROFILER,II) -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_PROFILER_TIME, NMNHDIM_PROFILER_PROC, NMNHDIM_UNUSED, & - tfield_metadata_base, TYPEREAL -TYPE(PROFILER), INTENT(IN) :: TPROFILER -INTEGER, INTENT(IN) :: II +!---------------------------------------------------------------------------- +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_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 +USE MODD_ICE_C1R3_DESCR, ONLY: C1R3NAMES +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 +USE MODD_RAIN_C2R2_DESCR, ONLY: C2R2NAMES +USE MODD_SALT, ONLY: CSALTNAMES, LSALT +USE MODD_TYPE_PROFILER ! -!* 0.2 declaration of local variables for diachro +USE MODE_AERO_PSD +USE MODE_DUST_PSD +use mode_write_diachro, only: Write_diachro ! -REAL, DIMENSION(:,:,:,:,:,:), ALLOCATABLE :: ZWORK6 ! contains temporal serie -REAL, DIMENSION(:,:,:,:,:,:), ALLOCATABLE :: ZW6 ! contains temporal serie to write -REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZSV, ZN0, ZSIG, ZRG -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRHO +TYPE(TFILEDATA), INTENT(IN) :: TPDIAFILE ! diachronic file to write +INTEGER, INTENT(IN) :: KI ! -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 +!* 0.2 declaration of local variables for diachro ! -INTEGER :: IPROC ! number of variables records -INTEGER :: JPROC ! loop counter -INTEGER :: JRR ! loop counter -INTEGER :: JSV ! loop counter -INTEGER :: IKU, IK ! loop counter -CHARACTER(LEN=2) :: INDICE +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 ! !---------------------------------------------------------------------------- ! -IF (TPROFILER%X(II)==XUNDEF) RETURN -IF (TPROFILER%Y(II)==XUNDEF) RETURN -IKU = SIZE(TPROFILER%W,2) !nbre de niveaux sur la verticale SIZE(TPROFILER%W,2) +IF (TPROFILER%X(KI)==XUNDEF) RETURN +IF (TPROFILER%Y(KI)==XUNDEF) RETURN +! +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 IPROC = 25 + SIZE(TPROFILER%R,4) + SIZE(TPROFILER%SV,4) IF (LDIAG_IN_RUN) IPROC = IPROC + 15 IF (LORILAM) IPROC = IPROC + JPMODE*3 @@ -171,493 +142,247 @@ 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 (ZWORK6(1,1,IKU,size(tprofiler%tpdates),1,IPROC)) -ALLOCATE (YCOMMENT(IPROC)) -ALLOCATE (YTITLE (IPROC)) -ALLOCATE (YUNIT (IPROC)) -ALLOCATE (IGRID (IPROC)) +ALLOCATE (XWORK6(1,1,IKU,size(tprofiler%tpdates),1,IPROC)) +ALLOCATE (CCOMMENT(IPROC)) +ALLOCATE (CTITLE (IPROC)) +ALLOCATE (CUNIT (IPROC)) ! -IGRID = 1 -YGROUP = TPROFILER%NAME(II) +YGROUP = TPROFILER%NAME(KI) ! !---------------------------------------------------------------------------- -DO IK=1, IKU -! -JPROC=0 -! -JPROC = JPROC + 1 -YTITLE (JPROC) = 'Th' -YUNIT (JPROC) = 'K' -YCOMMENT (JPROC) = 'Potential temperature' -ZWORK6 (1,1,IK,:,1,JPROC) = TPROFILER%TH(:,IK,II) -! -JPROC = JPROC + 1 -YTITLE (JPROC) = 'Thv' -YUNIT (JPROC) = 'K' -YCOMMENT (JPROC) = 'Virtual Potential temperature' -ZWORK6 (1,1,IK,:,1,JPROC) = TPROFILER%THV(:,IK,II) -! -JPROC = JPROC + 1 -YTITLE (JPROC) = 'VISI' -YUNIT (JPROC) = 'km' -YCOMMENT (JPROC) = 'Visibility' -ZWORK6 (1,1,IK,:,1,JPROC) = TPROFILER%VISI(:,IK,II) -! -JPROC = JPROC + 1 -YTITLE (JPROC) = 'VISIKUN' -YUNIT (JPROC) = 'km' -YCOMMENT (JPROC) = 'Visibility Kunkel' -ZWORK6 (1,1,IK,:,1,JPROC) = TPROFILER%VISIKUN(:,IK,II) -! -JPROC = JPROC + 1 -YTITLE (JPROC) = 'RARE' -YUNIT (JPROC) = 'dBZ' -YCOMMENT (JPROC) = 'Radar reflectivity' -ZWORK6 (1,1,IK,:,1,JPROC) = TPROFILER%CRARE(:,IK,II) -! -JPROC = JPROC + 1 -YTITLE (JPROC) = 'RAREatt' -YUNIT (JPROC) = 'dBZ' -YCOMMENT (JPROC) = 'Radar attenuated reflectivity' -ZWORK6 (1,1,IK,:,1,JPROC) = TPROFILER%CRARE_ATT(:,IK,II) -! -JPROC = JPROC + 1 -YTITLE (JPROC) = 'P' -YUNIT (JPROC) = 'Pascal' -YCOMMENT (JPROC) = 'Pressure' -ZWORK6 (1,1,IK,:,1,JPROC) = TPROFILER%P(:,IK,II) -! -JPROC = JPROC + 1 -YTITLE (JPROC) = 'ALT' -YUNIT (JPROC) = 'm' -YCOMMENT (JPROC) = 'Altitude' -ZWORK6 (1,1,IK,:,1,JPROC) = TPROFILER%ZZ(:,IK,II) -! -JPROC = JPROC + 1 -YTITLE (JPROC) = 'LON' -YUNIT (JPROC) = 'degree' -YCOMMENT (JPROC) = 'Longitude' -ZWORK6 (1,1,IK,:,1,JPROC) = TPROFILER%LON(II) -! -JPROC = JPROC + 1 -YTITLE (JPROC) = 'LAT' -YUNIT (JPROC) = 'degree' -YCOMMENT (JPROC) = 'Latitude' -ZWORK6 (1,1,IK,:,1,JPROC) = TPROFILER%LAT(II) -! -JPROC = JPROC + 1 -YTITLE (JPROC) = 'ZON_WIND' -YUNIT (JPROC) = 'm s-1' -YCOMMENT (JPROC) = 'Zonal wind' -ZWORK6 (1,1,IK,:,1,JPROC) = TPROFILER%ZON(:,IK,II) -! -JPROC = JPROC + 1 -YTITLE (JPROC) = 'MER_WIND' -YUNIT (JPROC) = 'm s-1' -YCOMMENT (JPROC) = 'Meridional wind' -ZWORK6 (1,1,IK,:,1,JPROC) = TPROFILER%MER(:,IK,II) -! -JPROC = JPROC + 1 -YTITLE (JPROC) = 'FF' -YUNIT (JPROC) = 'm s-1' -YCOMMENT (JPROC) = 'Wind intensity' -ZWORK6 (1,1,IK,:,1,JPROC) = TPROFILER%FF(:,IK,II) -! -JPROC = JPROC + 1 -YTITLE (JPROC) = 'DD' -YUNIT (JPROC) = 'degree' -YCOMMENT (JPROC) = 'Wind direction' -ZWORK6 (1,1,IK,:,1,JPROC) = TPROFILER%DD(:,IK,II) -! -JPROC = JPROC + 1 -YTITLE (JPROC) = 'W' -YUNIT (JPROC) = 'm s-1' -YCOMMENT (JPROC) = 'Air vertical speed' -ZWORK6 (1,1,IK,:,1,JPROC) = TPROFILER%W(:,IK,II) -! -IF (LDIAG_IN_RUN) THEN - ! - JPROC = JPROC + 1 - YTITLE (JPROC) = 'T2m' - YUNIT (JPROC) = 'K' - YCOMMENT (JPROC) = '2-m temperature' - ZWORK6 (1,1,IK,:,1,JPROC) = TPROFILER%T2M(:,II) - ! - JPROC = JPROC + 1 - YTITLE (JPROC) = 'Q2m' - YUNIT (JPROC) = 'kg kg-1' - YCOMMENT (JPROC) = '2-m humidity' - ZWORK6 (1,1,IK,:,1,JPROC) = TPROFILER%Q2M(:,II) - ! - JPROC = JPROC + 1 - YTITLE (JPROC) = 'HU2m' - YUNIT (JPROC) = 'percent' - YCOMMENT (JPROC) = '2-m relative humidity' - ZWORK6 (1,1,IK,:,1,JPROC) = TPROFILER%HU2M(:,II) - ! - JPROC = JPROC + 1 - YTITLE (JPROC) = 'zon10m' - YUNIT (JPROC) = 'm s-1' - YCOMMENT (JPROC) = '10-m zonal wind' - ZWORK6 (1,1,IK,:,1,JPROC) = TPROFILER%ZON10M(:,II) - ! - JPROC = JPROC + 1 - YTITLE (JPROC) = 'mer10m' - YUNIT (JPROC) = 'm s-1' - YCOMMENT (JPROC) = '10-m meridian wind' - ZWORK6 (1,1,IK,:,1,JPROC) = TPROFILER%MER10M(:,II) - ! - JPROC = JPROC + 1 - YTITLE (JPROC) = 'RN' - YUNIT (JPROC) = 'W m-2' - YCOMMENT (JPROC) = 'Net radiation' - ZWORK6 (1,1,IK,:,1,JPROC) = TPROFILER%RN(:,II) - ! - JPROC = JPROC + 1 - YTITLE (JPROC) = 'H' - YUNIT (JPROC) = 'W m-2' - YCOMMENT (JPROC) = 'Sensible heat flux' - ZWORK6 (1,1,IK,:,1,JPROC) = TPROFILER%H(:,II) - ! - JPROC = JPROC + 1 - YTITLE (JPROC) = 'LE' - YUNIT (JPROC) = 'W m-2' - YCOMMENT (JPROC) = 'Total Latent heat flux' - ZWORK6 (1,1,IK,:,1,JPROC) = TPROFILER%LE(:,II) - ! - JPROC = JPROC + 1 - YTITLE (JPROC) = 'G' - YUNIT (JPROC) = 'W m-2' - YCOMMENT (JPROC) = 'Storage heat flux' - ZWORK6 (1,1,IK,:,1,JPROC) = TPROFILER%GFLUX(:,II) - ! - IF (CRAD /= 'NONE') THEN - JPROC = JPROC + 1 - YTITLE (JPROC) = 'SWD' - YUNIT (JPROC) = 'W m-2' - YCOMMENT (JPROC) = 'Downward short-wave radiation' - ZWORK6 (1,1,IK,:,1,JPROC) = TPROFILER%SWD(:,II) - ! - JPROC = JPROC + 1 - YTITLE (JPROC) = 'SWU' - YUNIT (JPROC) = 'W m-2' - YCOMMENT (JPROC) = 'Upward short-wave radiation' - ZWORK6 (1,1,IK,:,1,JPROC) = TPROFILER%SWU(:,II) - ! - JPROC = JPROC + 1 - YTITLE (JPROC) = 'LWD' - YUNIT (JPROC) = 'W m-2' - YCOMMENT (JPROC) = 'Downward long-wave radiation' - ZWORK6 (1,1,IK,:,1,JPROC) = TPROFILER%LWD(:,II) - ! - JPROC = JPROC + 1 - YTITLE (JPROC) = 'LWU' - YUNIT (JPROC) = 'W m-2' - YCOMMENT (JPROC) = 'Upward long-wave radiation' - ZWORK6 (1,1,IK,:,1,JPROC) = TPROFILER%LWU(:,II) - ! - END IF - ! - JPROC = JPROC + 1 - YTITLE (JPROC) = 'TKE_DISS' - YUNIT (JPROC) = 'm2 s-2' - YCOMMENT (JPROC) = 'TKE dissipation rate' - ZWORK6 (1,1,IK,:,1,JPROC) = TPROFILER%TKE_DISS(:,IK,II) - ! - JPROC = JPROC + 1 - YTITLE (JPROC) = 'LEI' - YUNIT (JPROC) = 'W m-2' - YCOMMENT (JPROC) = 'Solid Latent heat flux' - ZWORK6 (1,1,IK,:,1,JPROC) = TPROFILER%LEI(:,II) -! -ENDIF -! -DO JRR=1,SIZE(TPROFILER%R,4) - JPROC = JPROC+1 - YUNIT (JPROC) = 'kg kg-1' - ZWORK6 (1,1,IK,:,1,JPROC) = TPROFILER%R(:,IK,II,JRR) - IF (JRR==1) THEN - YTITLE (JPROC) = 'Rv' - YCOMMENT (JPROC) = 'Water vapor mixing ratio' - ELSE IF (JRR==2) THEN - YTITLE (JPROC) = 'Rc' - YCOMMENT (JPROC) = 'Liquid cloud water mixing ratio' - ELSE IF (JRR==3) THEN - YTITLE (JPROC) = 'Rr' - YCOMMENT (JPROC) = 'Rain water mixing ratio' - ELSE IF (JRR==4) THEN - YTITLE (JPROC) = 'Ri' - YCOMMENT (JPROC) = 'Ice cloud water mixing ratio' - ELSE IF (JRR==5) THEN - YTITLE (JPROC) = 'Rs' - YCOMMENT (JPROC) = 'Snow mixing ratio' - ELSE IF (JRR==6) THEN - YTITLE (JPROC) = 'Rg' - YCOMMENT (JPROC) = 'Graupel mixing ratio' - ELSE IF (JRR==7) THEN - YTITLE (JPROC) = 'Rh' - YCOMMENT (JPROC) = 'Hail mixing ratio' - END IF -END DO - ! -JPROC = JPROC + 1 -YTITLE (JPROC) = 'Rhod' -YUNIT (JPROC) = 'kg m-3' -YCOMMENT (JPROC) = 'Density of dry air in moist' -ZWORK6 (1,1,IK,:,1,JPROC) = TPROFILER%RHOD(:,IK,II) -! -IF (SIZE(TPROFILER%TKE,1)>0) THEN - JPROC = JPROC+1 - YTITLE (JPROC) = 'Tke' - YUNIT (JPROC) = 'm2 s-2' - YCOMMENT (JPROC) = 'Turbulent kinetic energy' - ZWORK6 (1,1,IK,:,1,JPROC) = TPROFILER%TKE(:,IK,II) -END IF -! -IF (SIZE(TPROFILER%CIZ,1)>0) THEN - JPROC = JPROC + 1 - YTITLE (JPROC) = 'CIT' - YUNIT (JPROC) = 'kg-3' - YCOMMENT(JPROC) = 'Ice concentration' - ZWORK6 (1,1,IK,:,1,JPROC) = TPROFILER%CIZ(:,IK,II) -END IF -! -JPROC = JPROC + 1 -YTITLE (JPROC) = 'IWV' -YUNIT (JPROC) = 'kg m-2' -YCOMMENT (JPROC) = 'Integrated Water Vapour' -ZWORK6 (1,1,IK,:,1,JPROC) = TPROFILER%IWV(:,II) -! -JPROC = JPROC + 1 -YTITLE (JPROC) = 'ZTD' -YUNIT (JPROC) = 'm' -YCOMMENT (JPROC) = 'Zenith Tropospheric Delay' -ZWORK6 (1,1,IK,:,1,JPROC) = TPROFILER%ZTD(:,II) -! -JPROC = JPROC + 1 -YTITLE (JPROC) = 'ZWD' -YUNIT (JPROC) = 'm' -YCOMMENT (JPROC) = 'Zenith Wet Delay' -ZWORK6 (1,1,IK,:,1,JPROC) = TPROFILER%ZWD(:,II) -! -JPROC = JPROC + 1 -YTITLE (JPROC) = 'ZHD' -YUNIT (JPROC) = 'm' -YCOMMENT (JPROC) = 'Zenith Hydrostatic Delay' -ZWORK6 (1,1,IK,:,1,JPROC) = TPROFILER%ZHD(:,II) -! -IF (SIZE(TPROFILER%SV,4)>=1) THEN +!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( '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 ) + +if ( ldiag_in_run ) & + call Add_profile( 'TKE_DISS', 'TKE dissipation rate', 'm2 s-2', tprofiler% tke_diss ) + +if ( Size( tprofiler%ciz, 1 ) > 0 ) & + call Add_profile( 'CIT', 'Ice concentration', 'kg-3', tprofiler%ciz ) + +irr = Size( tprofiler%r ) +if ( irr >= 1 ) call Add_profile( 'Rv', 'Water vapor mixing ratio', 'kg kg-1', tprofiler%r(:,:,:,1) ) +if ( irr >= 2 ) call Add_profile( 'Rc', 'Liquid cloud water mixing ratio', 'kg kg-1', tprofiler%r(:,:,:,2) ) +if ( irr >= 3 ) call Add_profile( 'Rr', 'Rain water mixing ratio', 'kg kg-1', tprofiler%r(:,:,:,3) ) +if ( irr >= 4 ) call Add_profile( 'Ri', 'Ice cloud water mixing ratio', 'kg kg-1', tprofiler%r(:,:,:,4) ) +if ( irr >= 5 ) call Add_profile( 'Rs', 'Snow mixing ratio', 'kg kg-1', tprofiler%r(:,:,:,5) ) +if ( irr >= 6 ) call Add_profile( 'Rg', 'Graupel mixing ratio', 'kg kg-1', tprofiler%r(:,:,:,6) ) +if ( irr >= 7 ) call Add_profile( 'Rh', 'Hail mixing ratio', 'kg kg-1', tprofiler%r(:,:,:,7) ) + +call Add_profile( 'Rhod', 'Density of dry air in moist', 'kg m-3', tprofiler%rhod ) +if ( Size( tprofiler%tke, 1 ) > 0 ) & + call Add_profile( 'Tke', 'Turbulent kinetic energy', 'm2 s-2', tprofiler%tke ) + +if ( Size( tprofiler%sv, 4 ) > 0 ) then ! User scalar variables - DO JSV = 1,NSV_USER - JPROC = JPROC+1 - WRITE (YTITLE(JPROC),FMT='(A2,I3.3)') 'Sv',JSV - YUNIT (JPROC) = 'kg kg-1' - YCOMMENT (JPROC) = ' ' - ZWORK6 (1,1,IK,:,1,JPROC) = TPROFILER%SV(:,IK,II,JSV) - END DO + 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 - JPROC = JPROC+1 - WRITE (YTITLE(JPROC),FMT='(A2,I3.3)') 'Sv',JSV - YUNIT (JPROC) = '' - YCOMMENT (JPROC) = ' ' - ZWORK6 (1,1,IK,:,1,JPROC) = TPROFILER%SV(:,IK,II,JSV) - END DO + 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_C2R2BEG,NSV_C2R2END - JPROC = JPROC+1 - YTITLE(JPROC)= TRIM(C2R2NAMES(JSV-NSV_C2R2BEG+1)) - YUNIT (JPROC) = 'm-3' - YCOMMENT (JPROC) = ' ' - ZWORK6 (1,1,IK,:,1,JPROC) = TPROFILER%SV(:,IK,II,JSV) - END DO + 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 - JPROC = JPROC+1 - YTITLE(JPROC)= TRIM(C1R3NAMES(JSV-NSV_C1R3BEG+1)) - YUNIT (JPROC) = 'm-3' - YCOMMENT (JPROC) = ' ' - ZWORK6 (1,1,IK,:,1,JPROC) = TPROFILER%SV(:,IK,II,JSV) - END DO + 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 - 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) YTITLE(JPROC)=TRIM(CAERO_MASS(1))//'T' - 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' - - ZWORK6 (1,1,IK,:,1,JPROC) = TPROFILER%SV(:,IK,II,JSV) - END DO + 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) ) + 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,IK,:,1,JPROC) = TPROFILER%SV(:,IK,II,JSV) - END DO + 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 - 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,IK,:,1,JPROC) = TPROFILER%SV(:,IK,II,JSV) * 1.E9 - END DO - IF ((LORILAM).AND. .NOT.(ANY(TPROFILER%P(:,IK,II) == 0.))) THEN - ALLOCATE (ZSV(1,1,size(tprofiler%tpdates),NSV_AER)) - ALLOCATE (ZRHO(1,1,size(tprofiler%tpdates))) - ALLOCATE (ZN0(1,1,size(tprofiler%tpdates),JPMODE)) - ALLOCATE (ZRG(1,1,size(tprofiler%tpdates),JPMODE)) - ALLOCATE (ZSIG(1,1,size(tprofiler%tpdates),JPMODE)) - ZSV(1,1,:,1:NSV_AER) = TPROFILER%SV(:,IK,II,NSV_AERBEG:NSV_AEREND) + do jsv = nsv_chembeg, nsv_chemend + Write( ycomment, '( a5, a3, i3.3 )' ) 'T(s) ', 'SVT', jsv + call Add_profile( Trim( cnames(jsv - nsv_chembeg + 1) ), ycomment, 'ppb', tprofiler%sv(:,:,:,jsv) * 1.e9 ) + end do + IF ( LORILAM .AND. .NOT.(ANY(TPROFILER%P(:,:,KI) == 0.)) ) THEN + ALLOCATE (ZSV (1,iku,size(tprofiler%tpdates),NSV_AER)) + ALLOCATE (ZRHO(1,iku,size(tprofiler%tpdates))) + ALLOCATE (ZN0 (1,iku,size(tprofiler%tpdates),JPMODE)) + ALLOCATE (ZRG (1,iku,size(tprofiler%tpdates),JPMODE)) + ALLOCATE (ZSIG(1,iku,size(tprofiler%tpdates),JPMODE)) + do ji = 1, iku + ZSV(1,ji,:,1:NSV_AER) = TPROFILER%SV(:,ji,KI,NSV_AERBEG:NSV_AEREND) + end do IF (SIZE(TPROFILER%R,4) >0) THEN - ZRHO(1,1,:) = 0. - DO JRR=1,SIZE(TPROFILER%R,4) - ZRHO(1,1,:) = ZRHO(1,1,:) + TPROFILER%R(:,IK,II,JRR) - ENDDO - ZRHO(1,1,:) = TPROFILER%TH(:,IK,II) * ( 1. + XRV/XRD*TPROFILER%R(:,IK,II,1) ) & - / ( 1. + ZRHO(1,1,:) ) + 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) + ENDDO + ZRHO(1,ji,:) = TPROFILER%TH(:,ji,KI) * ( 1. + XRV/XRD*TPROFILER%R(:,ji,KI,1) ) & + / ( 1. + ZRHO(1,ji,:) ) + end do ELSE - ZRHO(1,1,:) = TPROFILER%TH(:,IK,II) + do ji = 1, iku + ZRHO(1,ji,:) = TPROFILER%TH(:,ji,KI) + end do ENDIF - ZRHO(1,1,:) = TPROFILER%P(:,IK,II) / & - (XRD *ZRHO(1,1,:) *((TPROFILER%P(:,IK,II)/XP00)**(XRD/XCPD)) ) + do ji = 1, iku + ZRHO(1,ji,:) = TPROFILER%P(:,ji,KI) / & + (XRD *ZRHO(1,ji,:) *((TPROFILER%P(:,ji,KI)/XP00)**(XRD/XCPD)) ) + end do CALL PPP2AERO(ZSV,ZRHO, PSIG3D=ZSIG, PRG3D=ZRG, PN3D=ZN0) 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,IK,:,1,JPROC) = ZRG(1,1,:,JSV) + WRITE(CTITLE(JPROC),'(A6,I1)')'AERRGA',JSV + CUNIT(JPROC) = 'um' + WRITE(CCOMMENT(JPROC),'(A18,I1)')'RG (nb) AERO MODE ',JSV + do ji = 1, iku + XWORK6(1,1,ji,:,1,JPROC) = ZRG(1,ji,:,JSV) + end do ! 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,IK,:,1,JPROC) = ZSIG(1,1,:,JSV) + WRITE(CTITLE(JPROC),'(A7,I1)')'AERSIGA',JSV + CUNIT(JPROC) = ' ' + WRITE(CCOMMENT(JPROC),'(A16,I1)')'SIGMA AERO MODE ',JSV + do ji = 1, iku + XWORK6(1,1,ji,:,1,JPROC) = ZSIG(1,ji,:,JSV) + end do ! 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,IK,:,1,JPROC) = ZN0(1,1,:,JSV) + WRITE(CTITLE(JPROC),'(A6,I1)')'AERN0A',JSV + CUNIT(JPROC) = 'm-3' + WRITE(CCOMMENT(JPROC),'(A13,I1)')'N0 AERO MODE ',JSV + do ji = 1, iku + XWORK6(1,1,ji,:,1,JPROC) = ZN0(1,ji,:,JSV) + end do 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,IK,:,1,JPROC) = TPROFILER%SV(:,IK,II,JSV) * 1.E9 - END DO - IF ((LDUST).AND. .NOT.(ANY(TPROFILER%P(:,IK,II) == 0.))) THEN - ALLOCATE (ZSV(1,1,size(tprofiler%tpdates),NSV_DST)) - ALLOCATE (ZRHO(1,1,size(tprofiler%tpdates))) - ALLOCATE (ZN0(1,1,size(tprofiler%tpdates),NMODE_DST)) - ALLOCATE (ZRG(1,1,size(tprofiler%tpdates),NMODE_DST)) - ALLOCATE (ZSIG(1,1,size(tprofiler%tpdates),NMODE_DST)) - ZSV(1,1,:,1:NSV_DST) = TPROFILER%SV(:,IK,II,NSV_DSTBEG:NSV_DSTEND) + do jsv = nsv_dstbeg, nsv_dstend + call Add_profile( Trim( cdustnames(jsv - nsv_dstbeg + 1) ), '', 'ppb', tprofiler%sv(:,:,:,jsv) * 1.e9 ) + end do + IF ((LDUST).AND. .NOT.(ANY(TPROFILER%P(:,:,KI) == 0.))) THEN + ALLOCATE (ZSV (1,iku,size(tprofiler%tpdates),NSV_DST)) + ALLOCATE (ZRHO(1,iku,size(tprofiler%tpdates))) + ALLOCATE (ZN0 (1,iku,size(tprofiler%tpdates),NMODE_DST)) + ALLOCATE (ZRG (1,iku,size(tprofiler%tpdates),NMODE_DST)) + ALLOCATE (ZSIG(1,iku,size(tprofiler%tpdates),NMODE_DST)) + do ji = 1, iku + ZSV(1,ji,:,1:NSV_DST) = TPROFILER%SV(:,ji,KI,NSV_DSTBEG:NSV_DSTEND) + end do IF (SIZE(TPROFILER%R,4) >0) THEN - ZRHO(1,1,:) = 0. - DO JRR=1,SIZE(TPROFILER%R,4) - ZRHO(1,1,:) = ZRHO(1,1,:) + TPROFILER%R(:,IK,II,JRR) - ENDDO - ZRHO(1,1,:) = TPROFILER%TH(:,IK,II) * ( 1. + XRV/XRD*TPROFILER%R(:,IK,II,1) ) & - / ( 1. + ZRHO(1,1,:) ) + 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) + ENDDO + ZRHO(1,ji,:) = TPROFILER%TH(:,ji,KI) * ( 1. + XRV/XRD*TPROFILER%R(:,ji,KI,1) ) & + / ( 1. + ZRHO(1,ji,:) ) + end do ELSE - ZRHO(1,1,:) = TPROFILER%TH(:,IK,II) + do ji = 1, iku + ZRHO(1,ji,:) = TPROFILER%TH(:,ji,KI) + end do ENDIF - ZRHO(1,1,:) = TPROFILER%P(:,IK,II) / & - (XRD *ZRHO(1,1,:) *((TPROFILER%P(:,IK,II)/XP00)**(XRD/XCPD)) ) + do ji = 1, iku + ZRHO(1,ji,:) = TPROFILER%P(:,ji,KI) / & + (XRD *ZRHO(1,ji,:) *((TPROFILER%P(:,ji,KI)/XP00)**(XRD/XCPD)) ) + end do 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,IK,:,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 + do ji = 1, iku + XWORK6 (1,1,ji,:,1,JPROC) = ZRG(1,ji,:,JSV) + end do ! 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,IK,:,1,JPROC) = ZSIG(1,1,:,JSV) + WRITE(CTITLE(JPROC),'(A7,I1)')'DSTSIGA',JSV + CUNIT(JPROC) = ' ' + WRITE(CCOMMENT(JPROC),'(A16,I1)')'SIGMA DUST MODE ',JSV + do ji = 1, iku + XWORK6 (1,1,ji,:,1,JPROC) = ZSIG(1,ji,:,JSV) + end do ! 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,IK,:,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 + do ji = 1, iku + XWORK6 (1,1,ji,:,1,JPROC) = ZN0(1,ji,:,JSV) + end do 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,IK,:,1,JPROC) = TPROFILER%SV(:,IK,II,JSV) * 1.E9 - END DO - IF (LDUST .OR. LORILAM .OR. LSALT) THEN - DO JSV = 1,NAER - JPROC = JPROC+1 - WRITE(YTITLE(JPROC),'(A6,I1)')'AEREXT',JSV - YUNIT (JPROC) = ' ' - YCOMMENT (JPROC) = 'Aerosol Extinction' - ZWORK6 (1,1,IK,:,1,JPROC) = TPROFILER%AER(:,IK,II,JSV) - END DO - ENDIF -ENDIF -! -END DO -! -!---------------------------------------------------------------------------- -! - -ALLOCATE (ZW6(1,1,IKU,size(tprofiler%tpdates),1,JPROC)) -ZW6 = ZWORK6(:,:,:,:,:,:JPROC) -DEALLOCATE(ZWORK6) + do jsv = nsv_sltbeg, nsv_sltend + call Add_profile( Trim( csaltnames(jsv - nsv_sltbeg + 1) ), '', 'ppb', tprofiler%sv(:,:,:,jsv) * 1.e9 ) + end do + if ( ldust .or. lorilam .or. lsalt ) then + do jsv = 1, naer + Write( yname, '( a, i1 )' ) 'AEREXT', jsv + call Add_profile( yname, 'Aerosol Extinction', '1', tprofiler%aer(:,:,:,jsv) ) + end do + end if +end if 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 = 3 @@ -678,11 +403,11 @@ tzbudiachro%ccomments(NLVL_SUBCATEGORY) = '' tzbudiachro%lleveluse(NLVL_GROUP) = .true. tzbudiachro%clevels (NLVL_GROUP) = ygroup -tzbudiachro%ccomments(NLVL_GROUP) = 'Vertical profiles at position of profiler ' // Trim( ygroup ) +tzbudiachro%ccomments(NLVL_GROUP) = 'Data at position of profiler ' // Trim( ygroup ) -tzbudiachro%lleveluse(NLVL_SHAPE) = .false. +tzbudiachro%lleveluse(NLVL_SHAPE) = .true. tzbudiachro%clevels (NLVL_SHAPE) = 'Vertical_profile' -tzbudiachro%ccomments(NLVL_SHAPE) = '' +tzbudiachro%ccomments(NLVL_SHAPE) = 'Vertical profiles at position of profiler ' // Trim( ygroup ) tzbudiachro%lleveluse(NLVL_TIMEAVG) = .false. tzbudiachro%clevels (NLVL_TIMEAVG) = 'Not_time_averaged' @@ -718,18 +443,206 @@ tzbudiachro%njh = 1 tzbudiachro%nkl = 1 tzbudiachro%nkh = iku -call Write_diachro( tpdiafile, tzbudiachro, tzfields, tprofiler%tpdates, zw6 ) +call Write_diachro( tpdiafile, tzbudiachro, tzfields, tprofiler%tpdates, xwork6(:,:,:,:,:,:jproc) ) -deallocate( tzfields ) +Deallocate( tzfields ) +Deallocate( xwork6 ) -DEALLOCATE (ZW6 ) -DEALLOCATE (YCOMMENT) -DEALLOCATE (YTITLE ) -DEALLOCATE (YUNIT ) -DEALLOCATE (IGRID ) -!---------------------------------------------------------------------------- -END SUBROUTINE PROFILER_DIACHRO_n !---------------------------------------------------------------------------- +!Treat point values + +ALLOCATE (XWORK6(1,1,1,size(tprofiler%tpdates),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 ) + 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 ) + end if + call Add_point( 'LEI', 'Solid Latent heat flux', 'W m-2', tprofiler%lei ) +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 ) + +Allocate( tzfields( jproc ) ) + +tzfields(:)%cmnhname = ctitle(1 : jproc) +tzfields(:)%cstdname = '' +tzfields(:)%clongname = ctitle(1 : jproc) +tzfields(:)%cunits = cunit(1 : jproc) +tzfields(:)%ccomment = ccomment(1 : jproc) +tzfields(:)%ngrid = 0 +tzfields(:)%ntype = TYPEREAL +tzfields(:)%ndims = 2 +tzfields(:)%ndimlist(1) = NMNHDIM_UNUSED +tzfields(:)%ndimlist(2) = NMNHDIM_UNUSED +tzfields(:)%ndimlist(3) = NMNHDIM_UNUSED +tzfields(:)%ndimlist(4) = NMNHDIM_PROFILER_TIME +tzfields(:)%ndimlist(5) = NMNHDIM_UNUSED +tzfields(:)%ndimlist(6) = NMNHDIM_PROFILER_PROC + +tzbudiachro%lleveluse(NLVL_CATEGORY) = .true. +tzbudiachro%clevels (NLVL_CATEGORY) = 'Profilers' +tzbudiachro%ccomments(NLVL_CATEGORY) = 'Level for the different vertical profilers' + +tzbudiachro%lleveluse(NLVL_SUBCATEGORY) = .false. +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%lleveluse(NLVL_SHAPE) = .true. +tzbudiachro%clevels (NLVL_SHAPE) = 'Point' +tzbudiachro%ccomments(NLVL_SHAPE) = 'Values at position of profiler ' // Trim( ygroup ) + +tzbudiachro%lleveluse(NLVL_TIMEAVG) = .false. +tzbudiachro%clevels (NLVL_TIMEAVG) = 'Not_time_averaged' +tzbudiachro%ccomments(NLVL_TIMEAVG) = 'Values are not time averaged' + +tzbudiachro%lleveluse(NLVL_NORM) = .false. +tzbudiachro%clevels (NLVL_NORM) = 'Not_normalized' +tzbudiachro%ccomments(NLVL_NORM) = 'Values are not normalized' + +tzbudiachro%lleveluse(NLVL_MASK) = .false. +tzbudiachro%clevels (NLVL_MASK) = '' +tzbudiachro%ccomments(NLVL_MASK) = '' + +tzbudiachro%lmobile = .false. +!Compression does not make sense here +!Keep these values for backward compatibility of LFI files +tzbudiachro%licompress = .true. +tzbudiachro%ljcompress = .true. +tzbudiachro%lkcompress = .false. +tzbudiachro%ltcompress = .false. +tzbudiachro%lnorm = .false. +!Horizontal boundaries in physical domain does not make sense here (but flyer position does) +!These values are not written in the netCDF files +!These values are written in the LFI files. They are kept for backward compatibility (and not set to default values) +tzbudiachro%nil = 1 +tzbudiachro%nih = 1 +tzbudiachro%njl = 1 +tzbudiachro%njh = 1 +tzbudiachro%nkl = 1 +tzbudiachro%nkh = 1 + +call Write_diachro( tpdiafile, tzbudiachro, tzfields, tprofiler%tpdates, xwork6(:,:,:,:,:,:jproc) ) + +Deallocate( tzfields ) + + !---------------------------------------------------------------------------- -! -END SUBROUTINE WRITE_PROFILER_n +!Treat position + +jproc = 0 + +JPROC = JPROC + 1 +CTITLE (JPROC) = 'LON' +CUNIT (JPROC) = 'degree' +CCOMMENT (JPROC) = 'Longitude' +XWORK6 (1,1,1,:,1,JPROC) = TPROFILER%LON(KI) + +JPROC = JPROC + 1 +CTITLE (JPROC) = 'LAT' +CUNIT (JPROC) = 'degree' +CCOMMENT (JPROC) = 'Latitude' +XWORK6 (1,1,1,:,1,JPROC) = TPROFILER%LAT(KI) + +Allocate( tzfields( jproc ) ) + +tzfields(:)%cmnhname = ctitle(1 : jproc) +tzfields(:)%cstdname = '' +tzfields(:)%clongname = ctitle(1 : jproc) +tzfields(:)%cunits = cunit(1 : jproc) +tzfields(:)%ccomment = ccomment(1 : jproc) +tzfields(:)%ngrid = 0 +tzfields(:)%ntype = TYPEREAL +tzfields(:)%ndims = 1 +tzfields(:)%ndimlist(1) = NMNHDIM_UNUSED +tzfields(:)%ndimlist(2) = NMNHDIM_UNUSED +tzfields(:)%ndimlist(3) = NMNHDIM_UNUSED +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) ) + + +!Necessary because global variables (private inside module) +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 > iproc ) call Print_msg( NVERB_FATAL, 'IO', 'Add_profile', 'more profiles 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) +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_profile', 'more profiles than expected' ) + +ctitle(jproc) = Trim( htitle) +ccomment(jproc) = Trim( hcomment ) +cunit(jproc) = Trim( hunits ) + +xwork6(1, 1, 1, :, 1, jproc) = pfield(:, ki) + +end subroutine Add_point + +END SUBROUTINE PROFILER_DIACHRO_n + +END MODULE MODE_WRITE_PROFILER_n diff --git a/src/MNH/write_seriesn.f90 b/src/MNH/write_seriesn.f90 index a1e425f39842f5fb842e9b524db845929f6549e2..54ed6c7c8cc5667860dc1c0bc285787c09f76772 100644 --- a/src/MNH/write_seriesn.f90 +++ b/src/MNH/write_seriesn.f90 @@ -119,6 +119,7 @@ REAL :: ZSIZEHB CHARACTER(LEN=100) :: YMSG type(tbudiachrometadata) :: tzbudiachro type(tfield_metadata_base), dimension(:), allocatable :: tzfields +type(tfiledata) :: tzfile !---------------------------------------------------------------------------- ! !* 1. INITIALIZATION @@ -303,15 +304,28 @@ tzbudiachro%njh = njboxh tzbudiachro%nkl = 1 tzbudiachro%nkh = ikmax -! Loop on the different masks -! Do not provide all tzfields once because they can be stored in different HDF groups (based on masks) -do jp = 1 , nstemp_serie1 - tzbudiachro%clevels(NLVL_MASK) = Trim( csmask1(jp) ) - tzbudiachro%ccomments(NLVL_MASK) = '' +tzfile = tpdiafile +if ( Trim( tpdiafile%cformat ) == 'LFI' .or. Trim( tpdiafile%cformat ) == 'LFICDF4' ) then + !For LFI files, it is necessary to write all the 'processes' (source terms) of the different masks in one pass + !to ensure that they are grouped together and not overwritten + tzfile%cformat = 'LFI' - call Write_diachro( tpdiafile, tzbudiachro, [ tzfields(jp) ], tpsdates(1:nsnbstept), & - xsseries1(1:1,1:1,1:1,1:nsnbstept,1:1,jp:jp) ) -end do + call Write_diachro( tzfile, tzbudiachro, tzfields, tpsdates(1:nsnbstept), & + xsseries1(1:1,1:1,1:1,1:nsnbstept,1:1,:) ) +end if + +if ( Trim( tpdiafile%cformat ) /= 'LFI' ) then! Loop on the different masks + tzfile%cformat = 'NETCDF4' + + ! Do not provide all tzfields once because they can be stored in different HDF groups (based on masks) + do jp = 1 , nstemp_serie1 + tzbudiachro%clevels(NLVL_MASK) = Trim( csmask1(jp) ) + tzbudiachro%ccomments(NLVL_MASK) = '' + + call Write_diachro( tzfile, tzbudiachro, [ tzfields(jp) ], tpsdates(1:nsnbstept), & + xsseries1(1:1,1:1,1:1,1:nsnbstept,1:1,jp:jp) ) + end do +end if deallocate( tzfields ) ! @@ -431,15 +445,27 @@ tzbudiachro%njh = njboxh tzbudiachro%nkl = 1 tzbudiachro%nkh = ikmax -! Loop on the different masks -! Do not provide all tzfields once because they can be stored in different HDF groups (based on masks) -do jp = 1 , nstemp_serie2 - tzbudiachro%clevels(NLVL_MASK) = csmask2(jp) - tzbudiachro%ccomments(NLVL_MASK) = '' +if ( Trim( tpdiafile%cformat ) == 'LFI' .or. Trim( tpdiafile%cformat ) == 'LFICDF4' ) then + !For LFI files, it is necessary to write all the 'processes' (source terms) of the different masks in one pass + !to ensure that they are grouped together and not overwritten + tzfile%cformat = 'LFI' - call Write_diachro( tpdiafile, tzbudiachro, [ tzfields(jp) ], tpsdates(1:nsnbstept), & - xsseries2(1:1,1:1,1:ikmax,1:nsnbstept,1:1,jp:jp) ) -end do + call Write_diachro( tzfile, tzbudiachro, tzfields, tpsdates(1:nsnbstept), & + xsseries2(1:1,1:1,1:ikmax,1:nsnbstept,1:1,:) ) +end if + +if ( Trim( tpdiafile%cformat ) /= 'LFI' ) then! Loop on the different masks + tzfile%cformat = 'NETCDF4' + + ! Do not provide all tzfields once because they can be stored in different HDF groups (based on masks) + do jp = 1 , nstemp_serie2 + tzbudiachro%clevels(NLVL_MASK) = csmask2(jp) + tzbudiachro%ccomments(NLVL_MASK) = '' + + call Write_diachro( tzfile, tzbudiachro, [ tzfields(jp) ], tpsdates(1:nsnbstept), & + xsseries2(1:1,1:1,1:ikmax,1:nsnbstept,1:1,jp:jp) ) + end do +end if deallocate( tzfields ) ! diff --git a/src/MNH/zoom_pgd.f90 b/src/MNH/zoom_pgd.f90 index 90103c5141e3712d2c40af6ca916c184b0856162..4f0961d8e48419a0a966933dcf1ac64215208bb7 100644 --- a/src/MNH/zoom_pgd.f90 +++ b/src/MNH/zoom_pgd.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2005-2019 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. @@ -42,14 +42,14 @@ !! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O ! 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 06/07/2021: use FINALIZE_MNH !---------------------------------------------------------------------------- ! !* 0. DECLARATION ! ----------- ! USE MODD_CONF, ONLY : CPROGRAM, L1D, L2D, LPACK -USE MODD_IO, ONLY: NIO_VERB,NVERB_DEBUG,TFILE_OUTPUTLISTING,TFILEDATA +USE MODD_IO, only: TFILE_OUTPUTLISTING, TFILEDATA USE MODD_LUNIT, ONLY : TLUOUT0, TOUTDATAFILE USE MODD_PARAMETERS, ONLY : XUNDEF, NUNDEF, JPVEXT, JPHEXT, JPMODELMAX USE MODD_PARAM_n, ONLY : CSURF @@ -57,12 +57,13 @@ USE MODD_DIM_n, ONLY : NIMAX, NJMAX USE MODD_CONF_n, ONLY : CSTORAGE_TYPE use modd_precision, only: LFIINT ! +USE MODE_FINALIZE_MNH, only: FINALIZE_MNH USE MODE_POS USE MODE_IO, only: IO_Config_set, IO_Init USE MODE_IO_FIELD_READ, only: IO_Field_read USE MODE_IO_FIELD_WRITE, only: IO_Field_write, IO_Header_write USE MODE_IO_FILE, only: IO_File_close, IO_File_open -USE MODE_IO_MANAGE_STRUCT, only: IO_File_add2list, IO_Filelist_print +USE MODE_IO_MANAGE_STRUCT, only: IO_File_add2list USE MODE_ll USE MODE_MSG USE MODE_MODELN_HANDLER @@ -258,18 +259,12 @@ CPGDFILE = YZOOMFILE ! CALL IO_File_close(TZPGDFILE) ! -IF(NIO_VERB>=NVERB_DEBUG) CALL IO_Filelist_print() -! WRITE(ILUOUT0,*) WRITE(ILUOUT0,*) '***************************' WRITE(ILUOUT0,*) '* ZOOM_PGD ends correctly *' WRITE(ILUOUT0,*) '***************************' ! -CALL IO_File_close(TLUOUT0) -! -CALL END_PARA_ll(IINFO_ll) - -IF (CSURF=='EXTE') CALL SURFEX_DEALLO_LIST +CALL FINALIZE_MNH() ! !------------------------------------------------------------------------------- !